这是当时面试时遇到的一道题,我觉得要是都能答对了,那么对C语言的掌握程度已经可以达到工作的水平了。
1.先看题
已知数组A(基于32位MCU)的地址为0x80000000,数组为A[100]。
求:
- sizeof(A)
- sizeof(A[0])
- sizeof(&A)
- sizeof(&A[0])
- &A+1
- &A[0]+1
其实不想写结果的,但是一方面内容太少,第二方面就是还想自己留着看,那还得写
2.解析
- 考察数组的大小
- 考察数组中一个元素的大小
- 考察指针的大小,你知道&A是个指针吗?
- 与3同理
- 考察数组地址的偏移
- 考察数组中元素地址的偏移
3.程序(64位)
#include <stdio.h>
#include <string.h>
int main()
{
int a[100];
printf("sizeof(a)=%ld\n",sizeof(a));
printf("sizeof(a[0])=%ld\n",sizeof(a[0]));
printf("sizeof(&a)=%ld\n",sizeof(&a));
printf("sizeof(&a[0]=%ld\n",sizeof(&a[0]));
printf("&a=%p\n",&a);
printf("&a+1=%p\n",&a+1);
printf("&a[0]+1=%p\n",&a[0]+1);
return 0;
}
结果:
sizeof(a)=400
sizeof(a[0])=4
sizeof(&a)=8
sizeof(&a[0]=8
&a=0x7fffeb0041e0
&a+1=0x7fffeb004370
&a[0]+1=0x7fffeb0041e4
4.实际结果
- 400
- 4
- 4
- 4
- 0x80000190 //偏移400位 转换成16进制
- 0x80000004