马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 小蒙 于 2017-11-4 19:11 编辑 char *p[2] = {"hh", "xx"};
printf("p is %p\n", p);
printf("p + 1 is %p\n", p + 1);
printf("p[0] = %p\n", p[0]);
printf("addr of "hh" is %p\n", "hh");
printf("p[0] + 1 = %p\n", p[0] + 1);
结果
p is 0x7fff5a02daa0
p + 1 is 0x7fff5a02daa8
p[0] = 0x105bd2f10
addr of "hh" is 0x105bd2f10
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的大小,指针数组分析完毕,下面来看数组的数组。
char b[][10] = {"hh", "xx"};
printf("%p\n", b);
printf("%p\n", b + 1);
printf("%p\n", &b);
printf("%p\n", &b + 1);
结果
0x7fff50f19a70
0x7fff50f19a7a
0x7fff50f19a70
0x7fff50f19a84
经过上面的分析,我已经不敢说b到底代表什么了,抛开定义方式导致的静态内存和动态内存的区别,指针数组和数组的数组代表的值字面上是一样的,二者写法上是“互换的”,所以用指针数组的那一套分析方法放在这个数组上发现跟结果对不上,b会代表指向"hh"指针的地址么???事实证明b和b+1相差10,正好是单个元素的宽度,所以,b应该代表的是"hh"作为一个一维数组的首地址(即一维数组的首地址)(看到结果确实好理解。。。),所以加一地址才会增加宽度个大小,至于&b和&b+1差了20是因为&b代表二维数组的首地址,&b加一,地址会增加2个宽度为10的大小。 难道不同的定义方法,看到数组名的时候在思考上也是不同的么? |