$ cat try1.c
#include<stdio.h>
void main()
{
int arr[]={1,2,3,4};
printf("%lu--%lu--%lu--%lu\n", arr, arr+1, &arr, &arr+1);
}
$ gcc try1.c -o try1
$ ./try1
140736912750144--140736912750148--140736912750144--140736912750160
$ ./try1
140735606483504--140735606483508--140735606483504--140735606483520
$
&amp; arr给出数组的基址,即第0个元素地址。 但为什么&amp; arr + 1增加数组的大小而不是1 sizeof(int),即4B。
答案 0 :(得分:1)
在arr + 1
中,arr
是一个衰减为指针的数组。指向int
的指针。因此arr + 1
是arr[1]
的地址。
在&arr + 1
中,您获取arr
的地址,该地址是指向长度为4的int
数组的指针。然后您递增该指针。并且因为该指针是指向长度为4的int
数组的指针,&arr + 1
是恰好超过arr
结尾的地址。
答案 1 :(得分:1)
&amp; arr给出数组的基址,即第0个元素地址
&arr
为您提供与&arr[0]
相同的地址,但这并不意味着指针类型相同。
arr
隐式转换为int *
,其中&arr
的类型为int(*)[4]
。根据指针算法+ 1在第一种情况下为您提供基地址+sizeof(int)
,在第二种情况下为您提供+sizeof(int[4])
。