#include<stdio.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16个字节
//a作为数组名单独放在sizeof内部,计算的是数组的总大小,单位是字节
printf("%d\n", sizeof(a + 0));//4个字节/8个字节
//a并非单独放在sizeof内部,也没有&,所以a+0就是数组首元素地址,是地址就是4/8个字节
printf("%d\n", sizeof(*a));//4个字节
//a是首元素地址,*a就是首元素,sizeof(*a)就算的是首元素的大小
printf("%d\n", sizeof(a + 1));//4个字节/8个字节
//a是首元素地址,a+1就是整型指针+1,也就是跳过一个整型,所以a+1是第二个元素的地址
//所以sizeof(a+1)就是计算指针的大小
printf("%d\n", sizeof(a[1]));//4个字节
//a[1]是数组的第二个元素,sizeof(a[1])的大小 - 4个字节
printf("%d\n", sizeof(&a));//4个字节/8个字节
//&a取出的是数组的地址,整个数组的地址也是地址,sizeof(&a)就是4/8个字节
//区别: a - int*
// &a - int (*)[4]
printf("%d\n", sizeof(*&a));//16个字节
//指针类型不仅影响+1-1的步长,也影响指针解引用时访问得到的结果,对数组指针解引用访问数组。
//&a是数组的地址,是数组指针类型,*&a是对于数组指针解引用,访问一个数组
printf("%d\n", sizeof(&a + 1));//4个字节/8个字节
//&a+1跳过一个数组,还是地址,是4/8个字节
printf("%d\n", sizeof(&a[0]));//4/8个字节
//&a[0]是第一个元素的地址
printf("%d\n", sizeof(&a[0] + 1));
//&a[0]+1是第一个元素的地址,&a[0]+1就是第二个元素的地址
//&a[0]+1 -- int* &a[0]+1 == &a[1]
return 0;
}
关于数组名:
数组名是数组首元素地址
但是有两个类外:
1.sizeof(数组名) -- 数组名也表示整个数组,数组单独放在(),计算的是整个数组的大小,单位是字节
2.&数组名, -- 数组名也表示整个数组,取出的是整个数组的地址
//除了这2个类外,见到的所有数组名都是首元素地址