C语言基础问题

Mr.杨. 2016-12-18 09:57:51
int i;
scanf("%p", &i);
为这么这里必须加取地址符?

char arr[10] = "hello";
scanf("%p", arr);
scanf("%p", &arr);
而这里加或不加取地址符都可以?

1.变量是内存中特定空间的别名
2.变量i所代表的的内存空间中保存的是整数,只有获取变量i所代表的内存空间地址才能往该内存空间存入数据

那么问题来了 :
1.scanf("%p", arr);
arr保存的是堆存中字符串"hello"的首地址,
不加&获取的是变量arr所代表的内存区域的中的数据,即字符串"hello"的首地址
因而可以往"hello"所在的内存中存入数据
2.scanf("%p", &arr);
加&获取的是变量arr所代表的内存的地址
既然获取的变量arr所代表的内存地址,
那么为什么可以吧数据存入字符串所在的内存区域呢?
...全文
275 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2018-11-10
  • 打赏
  • 举报
回复
scanf中, 第二个参数起, 都要求是指针类型, 所以对于基本数据类型的变量, 都需要加&符号, 才能得到其指针.

但数组是个特例, 对于 int arr[10]来说 arr本身,传入其它函数时, 就会退化为指针, 加一个&也是取这个arr变量的地址. 这个一个编译器的操作, 你不用知道为什么, 只要知道原理, 就是要得到地址就行了.
beglage 2018-11-10
  • 打赏
  • 举报
回复
字符串的输入可加可不加,scanf(“%p”,&n);
你要获得的是地址
辶井 2018-11-08
  • 打赏
  • 举报
回复
数组名就代表着数组首元素的地址,在scanf中,要修改数组元素,要先取地址,所以直接用数组名即可;同理int也需要取地址,但int类型的变量名不是地址,所以需要用取地址符号“&”取得int变量的地址,再做修改。
lin5161678 2018-11-08
  • 打赏
  • 举报
回复
引用 5 楼 qq_37120945 的回复:
char arr[10] = "hello";
scanf("%p", arr);
scanf("%p", &arr);
arr表示数组的首地址 &arr表示arr[0]的首地址
地址是同一个地址 但是第一个输入的arr 必须是个地址作为数组的首地址 第二个意思是给arr[0]赋值
第一次回复 我是这么理解的 不对的话还望交流
反了
这里的arr 表示的是 指向arr[0]的指针
&arr 表示的是指向 arr的指针
Mr.杨. 2018-11-08
  • 打赏
  • 举报
回复
好久没看回复, 感谢各位
du56du 2016-12-21
  • 打赏
  • 举报
回复
qq_37120945 2016-12-21
  • 打赏
  • 举报
回复
char arr[10] = "hello";
scanf("%p", arr);
scanf("%p", &arr);
arr表示数组的首地址 &arr表示arr[0]的首地址
地址是同一个地址 但是第一个输入的arr 必须是个地址作为数组的首地址 第二个意思是给arr[0]赋值
第一次回复 我是这么理解的 不对的话还望交流
小灸舞 版主 2016-12-19
  • 打赏
  • 举报
回复
arr和&arr代表的数值是一样的,但含义是不同的
参考:http://blog.csdn.net/draw5230/article/details/6699431
赵4老师 2016-12-19
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
paschen 2016-12-18
  • 打赏
  • 举报
回复
引用
char arr[10] = "hello"; scanf("%p", arr); scanf("%p", &arr); 而这里加或不加取地址符都可以?
因为数组名arr作为参数的时候会退化成指针,是数组首元素的地址 所以正确的写法应该是:scanf("%p", arr); scanf("%p", &arr);之所以可以,是因为数组的地址刚好与指向数组首元素的地址是相同的 但这两种指针的类型是不同的
paschen 2016-12-18
  • 打赏
  • 举报
回复
引用
int i; scanf("%p", &i); 为这么这里必须加取地址符?
因为scanf需要的是要修改的地址

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧