首先我们需要了解sizeof操作符,数组名的规则:
sizeof是啥?
sizeof是操作符,用来计算变量所占内存空间大小的,单位是字节;
如果操作符是类型的话,计算的是使用类型创建的变量所占内存空间的大小。
数组名的规则:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小;
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址;
3.除此之外所有的数组名都表示首元素的地址。
例一:
int main() { int a[] = { 1,2,3,4 }; printf("%zu\n", sizeof(a)); printf("%zu\n", sizeof(a + 0)); printf("%zu\n", sizeof(*a)); printf("%zu\n", sizeof(a + 1)); printf("%zu\n", sizeof(a[1])); printf("%zu\n", sizeof(&a)); printf("%zu\n", sizeof(*&a)); printf("%zu\n", sizeof(&a + 1)); printf("%zu\n", sizeof(&a[0])); printf("%zu\n", sizeof(&a[0] + 1)); return 0; }代码运行结果:
解说:
int main() { int a[] = { 1,2,3,4 };//数组总大小:4*4 = 16 printf("%zu\n", sizeof(a));//16 printf("%zu\n", sizeof(a + 0));//4/8,a+0是首元素地址 printf("%zu\n", sizeof(*a));//4,*a == a[0]; printf("%zu\n", sizeof(a + 1));//4/8 printf("%zu\n", sizeof(a[1]));//4 printf("%zu\n", sizeof(&a));//4/8,&a是整个数组的地址,依然是地址 printf("%zu\n", sizeof(*&a));//16 //&a == int (*)[]; //*&a == a //sizeof(*&a) == sizeof(a); printf("%zu\n", sizeof(&a + 1));//4/8 &a + 1还是地址 printf("%zu\n", sizeof(&a[0]));//4/8 printf("%zu\n", sizeof(&a[0] + 1));//4/8 return 0; }