本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net
- #include <stdio.h>
-
#include <stdlib.h>
-
-
-
int main() {
-
int a[2][3];
-
-
printf("&a[0][0] address is 0x%X\n", &a[0][0]);
-
printf("&a[0]0]+1 address is 0x%X\n", &a[0][0]+1);
-
printf("size of pointer step is 0x%X\n", sizeof(*(&a[0][0])));
-
printf("\n");
-
-
printf("&a[0] address is 0x%X\n", &a[0]);
-
printf("&a[0]+1 address is 0x%X\n", &a[0]+1);
-
printf("size of pointer step is 0x%X\n", sizeof(*(&a[0])));
-
printf("\n");
-
-
printf("a address is 0x%X\n", a);
-
printf("a+1 address is 0x%X\n", a+1);
-
printf("size of pointer step is 0x%X\n", sizeof(*a));
-
printf("\n");
-
-
printf("&a address is 0x%X\n", &a);
-
printf("&a+1 address is 0x%X\n", &a+1);
-
printf("size of pointer step is 0x%X\n", sizeof(*(&a)));
-
printf("\n");
-
-
return 0;
-
}
现在大家可以先想想输出是什么?
- [root@Lnx99 test]#./a.out
-
&a[0][0] address is 0xBFF676F8
-
&a[0]0]+1 address is 0xBFF676FC
-
size of pointer step is 0x4
-
-
&a[0] address is 0xBFF676F8
-
&a[0]+1 address is 0xBFF67704
-
size of pointer step is 0xC
-
-
a address is 0xBFF676F8
-
a+1 address is 0xBFF67704
-
size of pointer step is 0xC
-
-
&a address is 0xBFF676F8
-
&a+1 address is 0xBFF67710
-
size of pointer step is 0x18
从上面的输出,可以发现首地址都一样,但是让首地址的指针步进1次以后的地址却不一样。造成这样的结果是因为首地址指针的类型不同。
&a[0][0]的指针类型为int *p,所以步长为4;
&a[0]的指针类型为int (*p) [3],所以步长为12;
a的指针类型为int (*p) [3],所以步长仍然为12;
&a的指针类型为int (*p) [2][3],所以步长为24;
所以对于数组来说,无论是&a[0][0], &a[0], a还是&a,它们的地址都相同,但是由于其类型不同,所以并不是任何时候都可以互换的。
当使用数组的首地址时,一定要理解所使用首地址的类型,从而避免Bug。
阅读(5546) | 评论(2) | 转发(8) |