Lei宝啊 :个人主页
愿所有美好不期而遇
前言:
数组名在寻常情况下表示首元素地址,但有两种情况例外:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
3.sizeof是操作符,不是函数,并且sizeof不计算括号里的表达式,他会在编译阶段检查括号里的表达式的类型属性,计算出大小。(任何表达式都有两种属性,值属性和类型属性,
int a = 3; short b = 2; b = a + b;这个表达式的值属性就是5,类型属性就是short)
前言很重要,记住哦~
笔试题(一维数组)
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a+0));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a+1));
printf("%d\n", sizeof(a[1]));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(*&a));
printf("%d\n", sizeof(&a+1));
printf("%d\n", sizeof(&a[0]));
printf("%d\n", sizeof(&a[0]+1));
先自己做再看答案和解析哦~
答案
16
8
4
8
4
8
16
8
8
8
(博主用的是64位机器,所以地址占的空间大小为8字节)
解析
int main() { int a[] = { 1,2,3,4 }; printf("%d\n", sizeof(a)); //sizeof里只有数组名,计算的是整个数组的大小,16个字节 printf("%d\n", sizeof(a+0)); //这里并不是单独的数组名,也许你看着加0之后还是a,但此时的 //数组名意义已经变成了首元素地址,所以为4/8,(看机器位数) printf("%d\n", sizeof(*a)); //首元素为int类型,4个字节 printf("%d\n", sizeof(a+1)); //这个和a+0是一个道理,指向第二个元素,是地址,4/8 printf("%d\n", sizeof(a[1])); //第二个元素,int类型,4个字节 printf("%d\n", sizeof(&a)); //&a,指针类型int (*) [4],但还是指针,4/8 printf("%d\n", sizeof(*&a)); //这个有两种理解方式: //1.&a后再解引用还是a,也就是说还是只有a,所以计算整个数组大小 //2.&a的指针类型是int (*) [4],是数组指针,解引用访问的是 // int [4],是整个数组,16个字节,这就类似于int* 解引用后访问的是 // int类型的数据,4个字节,char* 解引用后访问一个字节的数据。 printf("%d\n", sizeof(&a+1)); //数组指针加1,和我们的数组其实已经没有关系了,这里加1的是这个指针 //,所以4/8 printf("%d\n", sizeof(&a[0])); //首元素的地址,4/8 printf("%d\n", sizeof(&a[0]+1)); //第二个元素的地址,4/8 return 0; }