鱼C论坛

 找回密码
 立即注册
查看: 3643|回复: 5

指针数组名加1和数组的数组的数组名加1的区别?

[复制链接]
发表于 2017-11-4 14:24:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小蒙 于 2017-11-4 19:11 编辑
  1. char *p[2] = {"hh", "xx"};
  2. printf("p is %p\n", p);
  3. printf("p + 1 is %p\n", p + 1);
  4. printf("p[0]          = %p\n", p[0]);
  5. printf("addr of "hh" is %p\n", "hh");
  6. printf("p[0] + 1 = %p\n", p[0] + 1);

  7. 结果
  8. p is 0x7fff5a02daa0
  9. p + 1 is 0x7fff5a02daa8
  10. p[0]          = 0x105bd2f10
  11. addr of "hh" is 0x105bd2f10
  12. p[0] + 1 =      0x105bd2f11
复制代码

注意,p和p+1的值差了8,p和p[0]的地址不同。
以下为个人浅见,p是一个指针数组,按照之前学数组的知识, p作为数组名,值是指针数组首元素的地址,但是不能认为这个首元素是"wm",因为,指针数组,指针数组,所以里面的元素都是指针,所以首元素也应该是个指针,所以,首元素的地址就是指针的地址,即指针自身的地址,和指针指向的元素("hh")无关,对比p和p+1发现,确实地址增加了8,正好是一个指针的大小;事实也证明p的值,即指针的地址不同于"hh"的地址;再看p[0],p[0]是二维数组的第一个元素,相当于一维数组数组名,所以它的值是一维数组数组第一个字符的地址,对比p[0]和p[0]+1发现,二者相差1,正好是一个char的大小,指针数组分析完毕,下面来看数组的数组。

  1. char b[][10] = {"hh", "xx"};
  2. printf("%p\n", b);
  3. printf("%p\n", b + 1);
  4. printf("%p\n", &b);
  5. printf("%p\n", &b + 1);
  6. 结果
  7. 0x7fff50f19a70
  8. 0x7fff50f19a7a
  9. 0x7fff50f19a70
  10. 0x7fff50f19a84
复制代码

经过上面的分析,我已经不敢说b到底代表什么了,抛开定义方式导致的静态内存和动态内存的区别,指针数组和数组的数组代表的值字面上是一样的,二者写法上是“互换的”,所以用指针数组的那一套分析方法放在这个数组上发现跟结果对不上,b会代表指向"hh"指针的地址么???事实证明b和b+1相差10,正好是单个元素的宽度,所以,b应该代表的是"hh"作为一个一维数组的首地址(即一维数组的首地址)(看到结果确实好理解。。。),所以加一地址才会增加宽度个大小,至于&b和&b+1差了20是因为&b代表二维数组的首地址,&b加一,地址会增加2个宽度为10的大小。 难道不同的定义方法,看到数组名的时候在思考上也是不同的么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-4 17:10:50 | 显示全部楼层
何必纠结这么多呢,我觉得关于数组名和指针的关系,只要记住两点就行了:
1 数组名是一个常量,所以不能做自增自减等类似操作
2 数组形式始终只是一种语法糖,都可以用指针进行直接转换,除了上面说的1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2017-11-4 18:28:34 | 显示全部楼层
没有明白你想表达的意思...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-4 19:10:34 | 显示全部楼层
我自己的问题,把指针数组char *p[2]当成了二维的了,结帖。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-4 19:12:05 | 显示全部楼层
橙C 发表于 2017-11-4 18:28
没有明白你想表达的意思...

刚才混乱了,把指针数组看成二维的了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-12 22:01:51 | 显示全部楼层
本帖最后由 小蒙 于 2017-11-12 22:06 编辑
橙C 发表于 2017-11-4 18:28
没有明白你想表达的意思...


刚才看了一下帖子,发现之前的理解是错的。我之前真正的疑问是下面定义方式产生的结果不同。
  1. char *p[2] = {"hh", "xx"};
  2. 打印p和p+1的值,相差8,即指针的宽度
  3. char b[][10] = {"hh", "xx"};
  4. 打印b和b+1的值,相差10,即一个元素的宽度。
复制代码

刚才想明白了,p是指针数组,花括号中的字符串实际上是存在于静态存储区,指针数组p只是存储了两个指针,分别指向静态存储区的两个字符串而已,这样的定义使p存储的实际是两个指针,并且分别指向"hh"和"xx"对应的静态存储区,感觉p还是应该看成一个二维数组,数组名p代表首元素的地址,两个元素都是指针所以,所以p代表的是指针的自身的地址,所以p+1是下一个指针的地址,所以相差8;b是按数组形式定义的二维数组,所以{"hh", "xx"}实际上有两个,一个存在静态存储区,另一个是b复制的,b指向的实际上是复制的那个,所以首元素是字符串,而不是指针,所以b代表的是"hh"作为二维数组一个元素的首地址,所以b+1和b相差元素个宽度,所以相差10。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 16:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表