答案:4/8
32位机器打印结果:
T3.
1. 2. char arr[] = "abcdef"; 3. 1. printf("%d\n", sizeof(arr)); 4. 2. printf("%d\n", sizeof(arr+0)); 5. 3. printf("%d\n", sizeof(*arr)); 6. 4. printf("%d\n", sizeof(arr[1])); 7. 5. printf("%d\n", sizeof(&arr)); 8. 6. printf("%d\n", sizeof(&arr+1)); 9. 7. printf("%d\n", sizeof(&arr[0]+1));
注意:这个数组里存的是一个字符串,所以数组里的元素是这样的:
Q1:
只有单独一个数组名,所以计算的是整个数组的大小;
答案:7
Q2:
arr+0 表示数组首元素的地址;
答案:4/8
Q3:
*arr 表示数组首元素,类型为 char ;
答案:1
Q4:
arr[1] 表示数组下标为1的元素,类型为 char
答案:1
Q5,Q6,Q7 :
都表示的是地址,所以:
答案:4/8
32位机器打印结果:
T4.
1. 2. 3. char *p = "abcdef"; 4. 1. printf("%d\n", sizeof(p)); 5. 2. printf("%d\n", sizeof(p+1)); 6. 3. printf("%d\n", sizeof(*p)); 7. 4. printf("%d\n", sizeof(p[0])); 8. 5. printf("%d\n", sizeof(&p)); 9. 6. printf("%d\n", sizeof(&p+1)); 10. 7. printf("%d\n", sizeof(&p[0]+1));
这题是把常量字符串的首元素地址赋给了指针变量 p ,所以p也有一个地址 :
Q1:
p 是字符串首元素的地址,是地址 那么计算结果为4或8;
答案:4/8
Q2:
仍为地址;
答案:4/8
Q3,Q4:
*p和怕 p[0] 表示 字符串首元素,类型为 char
答案:1
补充:
Q5,Q6,Q7:
都表示的是地址,所以答案毋庸置疑,为4或是8;
&p :p 的地址;
&p+1 : 跳过 p 的地址的大小,以32位机器为例,跳过 4 个字节;
&p[0]+1:字符串中 元素 ’ b ' 的地址, 也可以写成 &p[1] ,二者相等;
答案:4/8
32位机器打印结果:
T5.
1. 2. //二维数组 3. int a[3][4] = {0}; 4. 1. printf("%d\n",sizeof(a)); 5. 2. printf("%d\n",sizeof(a[0][0])); 6. 3. printf("%d\n",sizeof(a[0])); 7. 4. printf("%d\n",sizeof(a[0]+1)); 8. 5. printf("%d\n",sizeof(*(a[0]+1))); 9. 6. printf("%d\n",sizeof(a+1)); 10. 7. printf("%d\n",sizeof(*(a+1))); 11. 8. printf("%d\n",sizeof(&a[0]+1)); 12. 9. printf("%d\n",sizeof(*(&a[0]+1))); 13. 10. printf("%d\n",sizeof(*a)); 14. 11. printf("%d\n",sizeof(a[3]));
Q1:
单独的数组名在 sizeof 内部,计算整个数组的大小,该数组有12个元素,每个元素的类型是 int ,所以 4 x 12=48;
答案:48
Q2:
a[0][0] :即数组第一个元素,类型为 int ;
答案:4
Q3:
由上图可知,在二维数组 arr[3][4] 中,arr[0],arr[1],arr[2],都可以看成是数组名,单独的数组名在sizeof 内部,计算的是整个数组的大小,arr[0] 数组由4个元素,每个元素类型为 int ,所以
4 x 4=16;
答案:16
Q4:
arr[0] 是第1行数组的首元素地址,+1,表示 arr[0][1] 的地址,所以计算结果为4或8;
答案:4/8
Q5
* (a[0]+1) 得到 a[0][1],元素类型为 int ;
答案:4
Q6:
数组名 a 即二维数组的首元素地址,二维数组首元素地址为第一行的地址,a+1 即二维数组第二行的地址,因为是地址,所以结果为4或8;
答案:4/8
Q7:
a+1=a[1] ,*(a+1) 相当于对数组a[1]的地址解引用,即计算的是一维数组 a[1] 或是二维数组第二行的大小 ,所以是 16;
答案:16
Q8:
取出二维数组第1行的地址加1即第2行的地址,还是个地址;
答案:4/8
Q9:
对第2行的数组解引用,计算 一维数组 a[1] 的 整个大小;
答案:16
Q10:
此时数组名是数组首元素的地址,解引用找到第一行 的所有元素;
答案:16
Q11:
一眼看过去,a[3] 数组不是越界了吗,所以这是条错误的语句?
其实不是,这题是可以正常运行的,前面讲过,表达式有两种属性,一个是值属性,一个是类属性,而sizeof 计算的是表达式的类属性,所以它不会计算 a[3] ,只会计算 a[3] 类型所占的字节数,通过上文,我们很清楚,这个类型的字节数是 16;
答案:16
32位机器打印结果:
🐼关于 sizeof 的题目讲到这里了,如有错误或是建议,欢迎小伙伴们提出,关于 strlen 函数的题目 将在下一篇文章中出现。🐰
😽 如果想要了解更多的话,希望能三连支持支持博主啊,你们的支持对我很重要。😸😸
🦖🦄 谢谢你的阅读。🐋🦝