昨天遇到了一个很迷的问题,话不多说看代码。
int *b ,*c;
int a[100] = { 0,1,2,3,4};
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a[10]));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(&a[0]));
printf("\n");
printf("a=%d\n", a);
printf("a[3]=%d\n", a[3]);
printf("&a=%d\n", &a);
printf("&a[0]=%d\n", &a[0]);
b = &a;
c = &b;
printf("\n");
printf("*a=%d\n", *a);
printf("*(&a)=%d\n", *(&a));
printf("**(&a)=%d\n", **(&a));
printf("*b=%d\n", *b);
printf("*c=%d\n", *c);
printf("*&a[0]=%d\n", *&a[0]);
看到a和&a,&a[0]打印出来是一样的。理所当然就认为他们一样,其实不然,以至于在我指向a,&a,&a[0]的时候,结果是不同的,a和&a[0]都是a[0]的值0,&a却是数组首地址。
指向&a的结果才是0,即**&a=0。
在此说下我的理解,之后用几行代码证明我的理解。
a是数组的首地址,即a[0]的地址。&a是整个数组的首地址,
&a同时也是指向数组指针a的指针。我画了张图,只不过地址f和地址g在一位数组下恰好相同。所以*&a就是a,**&a就是a[0]的值。
以下证明我的理解
之前a是数组,这次将定义为int型指针,
此时看a和&a打印出来是不一样的,a是存放i的地址,&a是存放a的地址,
下图对代码解析图
为了更加深刻理解数组中a和&a到地有啥区别,输出结果是2,4
int as[5] = { 1,2,3,4,5 };
int ptr = (int)(&as + 1);
printf("(as + 1)=%d,(ptr - 2)=%d\n", *(as + 1), *(ptr - 2));
as+1代表数组内a[1]
&as+1代表下一个连续数组整个数组首地址。也可以理解为a数组最后一个元素的下个地址。