1.定义一个int arr[10]; arr是首元素的地址,&arr是数组单独的地址,但是&arr起始地址也是首元素的地址。
#include <stdio.h>
int main(){
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%p\n",arr);//输出地址是0000004b61bffab0
printf("%p\n",&arr);//输出地址是0000004b61bffab0
//为什么一样,是因为arr是首元素的地址,&arr是数组单独的地址,但是&arr起始地址也是首元素的地址。
printf("%p\n",arr+1);//arr是首元素地址,首元素地址+1是跳过一个int的地址
printf("%p\n",&arr+1);//&arr是整个数组地址,整个数组地址+1是跳过一个数组的地址
//所以&arr+1和arr相差的值是40
return 0;
}
2.指针也是如此
#include <stdio.h>
int main(){
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int *p1 = arr;
int (*p2)[10] = &arr;
printf("%p\n",p1); //输出 00D5F6BC
printf("%p\n",p1+1); //输出 00D5F6C0
printf("%p\n",p2); //输出 00D5F6BC
printf("%p\n",p2+1); //输出 00D5F6E4 //会跳过整个数组的大小。
//因为p是指向数组,p1是存放数组的地址
return 0;
}
3.数组名虽然是数组首元素的地址,但是用sizeof计算arr和&arr就可以很明显的看出区别。
#include <stdio.h>
int main(){
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n",sizeof(arr));//计算的首元素地址的大小
printf("%d\n",sizeof(&arr));//计算的整个数组的大小
return 0;
}