//数组名的理解:
//数组名是数组首元素的地址
//但是有2个例外:
//1. sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
//2. &数组名,数组名表示整个数组,取出的是数组的地址
int main()
{
int a[] = { 1,2,3,4 };
printf("%zd\n", sizeof(a));//16
printf("%zd\n", sizeof(a + 0));//数组名a并没有单独放在sizeof内部,也没有&,
//所以a就是数组首元素的地址,是地址大小就是 4/8个字节
//a+0 ===== &a[0]
printf("%zd\n", sizeof(*a));//a就是数组首元素的地址,a==&a[0]
//*a 其实就是第一个元素,也就是a[0],大小就是4个字节
printf("%zd\n", sizeof(a + 1));//a就是数组首元素的地址(&a[0] --int*), a+1--> &a[1]
//a+1就是第二个元素的地址
printf("%zd\n", sizeof(a[1]));//计算第2个元素的大小,单位是字节 - 4
printf("%zd\n", sizeof(&a));//
//&a - 取出的是数组的地址,但是数组的地址也是地址,是地址大小就是4 / 8 个字节
//
printf("%zd\n", sizeof(*&a));//16
//printf("%zd\n", sizeof(a));//16
//&a - int (*p)[4] = &a;
//*p 访问一个数组的大小
//p+1 跳过一个数组的大小
printf("%zd\n", sizeof(&a + 1));//&a+1是跳过整个数组后的地址,是地址大小就是4/8个字节
printf("%zd\n", sizeof(&a[0]));//首元素的地址,4/8
printf("%zd\n", sizeof(&a[0] + 1));//第二个元素的地址
return 0;
}
数组名的两个例外
最新推荐文章于 2024-05-21 20:56:54 发布