一维数组名和取地址

先看一段代码:

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

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×