A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© WANGJIAO 中级黑马   /  2014-10-17 15:52  /  1347 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这里在输出的时候为什么要用&name2[1]?(黄色部分标记)&不是代表地址吗?输出地址占位符不是应该是%p吗?数组名不是代表数组地址吗?这里能直接用nanme2[1]吗?

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 IOS小菜鸟 于 2014-10-17 20:10 编辑

printf("%s",地址)这种形式就是你指定的字节地址开始输出,当遇见字节里为‘\0’就停止输出,数组名代表数组地址是对的,你的name2[1]只是是数组里面的元素,不是整个数组的名字。数组名name表示整个数组在内存中第一个字节的地址,&name2[1]是数组第2个元素所占内存的第一个字节的地址。

点评

嗯嗯。。最近看oc看多了。。  发表于 2014-10-17 20:11
数组里面的成员变量名,,,这应该叫数组里面的元素吧,,纯交流无其他意思,成员变量名,这是OC类里面的术语  发表于 2014-10-17 20:07
回复 使用道具 举报
本帖最后由 IOS小菜鸟 于 2014-10-17 20:12 编辑

如果是int类型数组,name + 1,意思是指向下一个数组变量内存的第一个字节相当于地址数值+4,&name[1] + 1只是单纯的地址数值+1.有错误请指正谢谢。。
回复 使用道具 举报
1. printf("%s\n", &name2[1]); 是表示输出char name2[ ] = {'o', 'k'};中地址为1的字符串, 把它当作是字符串输出的,直到遇到\0结束。从'k'开始输出。
2. 而你说的,“&不是代表地址吗?输出地址占位符不是应该是%p吗?”
你是想说为什么不把%s换成%p,
因为printf("%p\n", &name2[1]);是表示输出name2[1]的地址值。而不是输出字符串。两者表达的意思不一样。
3.上面的printf("%s\n", name2);这里可以直接写成数组名name2,因为数组名代表数组地址,它和name2[1]表示的含义不一样,name2[1]表示name2中地址为1的元素。
4. 若要直接写成printf("%s\n", name2[1]);就会报错,意思是输出char name2[] = {'o', 'k'};中第地址为1的'k'字符,而不是输出字符串,%s表示输出字符串。所以不能直接用name2[1]。

这是我的理解,就是说的太啰嗦了,只希望楼主能看明白。
回复 使用道具 举报
彭恒 发表于 2014-10-17 18:43
1. printf("%s\n", &name2[1]); 是表示输出char name2[ ] = {'o', 'k'};中地址为1的字符串, 把它当作是字 ...

说得非常好,愚钝如我都看明白了,万分感激,不确定的地方都得到了解答,谢谢~
回复 使用道具 举报
[size=13.63636302948px]

[size=13.63636302948px]
  1. printf(%s\n,&name2[1]);
复制代码
[size=13.63636302948px]1、这里在输出的时候为什么要用&name2[1]
用的是%s,所以要给一个字符串的起始地址,或者是地址,然后一直打印字符串,直到遇到\0为止,所以这里要用&
[size=13.63636302948px]

[size=13.63636302948px]2、&不是代表地址吗?
&代表的是取出对应变量的地址,而非地址。

[size=13.63636302948px]3、输出地址占位符不是应该是%p吗?
[size=13.63636302948px]你想打印变量的地址,就用%p,但是看你这题,明显是想打印字符或者字符串,而非打印内存地址。
[size=13.63636302948px]

[size=13.63636302948px]4、数组名不是代表数组地址吗?
[size=13.63636302948px]数组名是代表数组的起始地址
[size=13.63636302948px]5、这里能直接用nanme2[1]吗?


[size=13.63636302948px]同问题1。
[size=13.63636302948px]解答完毕
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马