一般情况下,数组名表示首元素地址,以下2种除外:
①、sizeof(数组名) 表示整个数组 ※只有数组名的情况
sizeof(数组名+i) 就不能表示整个数组
②、&数组名 表示整个数组,取的是整个数组的地址
int main()
{
int arr[] = { 1,2,3,4,5 };
int n = sizeof(arr);//整个数组
int m = sizeof(arr + 1);//首元素地址+1,下一个元素地址,仅一个元素
printf("%d\n", n);
printf("%d\n\n", m);
printf("%p\n", arr);//首元素地址
printf("%p\n", arr + 1);//首元素往后一位的地址
printf("%p\n", &arr[0]);//首元素地址
printf("%p\n", &arr[0]+1);//首元素往后一位地址
printf("%p\n", &arr);//全部元素的地址,只是只打印了首元素的
printf("%p\n", &arr+1);//跳过整个数组后的第一个元素的地址
return 0;
}
结果是:
20
4
00AFFE58
00AFFE5C
00AFFE58
00AFFE5C
00AFFE58
00AFFE6C
sizeof是计算()占了多少字节(byte)
可以看出,&arr 取的是整个数组的地址,怎么存放这么多地址呢?
用 数组指针 呀~
int (*p)[5]=&arr;
p和*先结合,表示p是指针,然后再结合[5]和int 表示是int[5]类型的
指针配合数组
打印结果是多少呢?
解释如下 👇
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));
//16,整个数组的大小
printf("%d\n", sizeof(a+0));
//4或8 首元素地址
printf("%d\n", sizeof(*a));
//4 a是首元素地址,解引用找到首元素
printf("%d\n", sizeof(a+1));
//4或8 第二个元素的地址
printf("%d\n", sizeof(a[1]));
//4 第二个元素
printf("%d\n", sizeof(&a));
//【4或8】 &a是整个数组的地址,也是个地址
//可以理解为,数组指针是4或8,它俩大小一样
printf("%d\n", sizeof(*&a));
//16 整个数组 &a是整个数组的地址,解引用后,是整个数组
//printf("%d\n", sizeof(&a+1));
//【4或8】 也是个地址,跳过整个数组
printf("%d\n", sizeof(&a[0]));
//4或8 首元素地址
printf("%d\n", sizeof(&a[0]+1));
//4或8 第二个元素地址
return 0;
}
🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗