先看一段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| int main() { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("a的地址 : %p\n", a); printf("&a[0]的地址 : %p\n", &a[0]); printf("&a的地址 : %p\n", &a);
printf("\n"); printf("a+1的地址 : %p\n", a + 1); printf("&a[0]+1的地址 : %p\n", &a[0]+1); printf("&a+1的地址 : %p\n", &a+1); return 0; }
|
运行结果如下图:
分析
a,&a[0],&a输出的结果为同一个地址,但步长不同。
a,&a[0]都表示数组首元素地址,+1表示为第二个元素的地址,本质一样,步长为一个int类型4个字节。
&a表示为整个数组的地址,步长为整个数组10*sizeof(int)个字节。
整个数组所占内存大小为sizeof(a);
应该特别注意:
数组名仅仅"相当于"指针,并非真正的指针,是一个值为数组首地址的常量,因此不能济宁++或--运算。
例题
1 2 3 4 5 6 7 8
| int main() { int a[5] = { 1,2,3,4,5 }; int *ptr = (int*)(&a + 1);
printf("%d, %d", *(a + 1), *(ptr - 1)); return 0; }
|
运行结果为:2, 5