一般情况下,数组名表示首元素地址,以下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;
}
🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗