今天在网上看到一个面试题,题目描述如下:
#include <stdio.h>
int
main()
{
int a[5] = {1, 2, 3, 4, 5};
int *ptr = (int *)(&a + 1);
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
请问输出结果是什么。
刚开始没有看清楚
int *ptr = (int *)(&a + 1);
这一句,理解为ptr是a[1]的地址,*(ptr-1)就是a[0]。
运行完发现这是错误的理解。随后对程序做了debug
#include <stdio.h>
int
main()
{
int a[5] = {1, 2, 3, 4, 5};
int *ptr = (int *)(&a + 1);
printf("a0 = %p\n", &a[0]);
printf("a1 = %p\n", &a[1]);
printf("a2 = %p\n", &a[2]);
printf("a3 = %p\n", &a[3]);
printf("a4 = %p\n", &a[4]);
printf("-----------------\n");
printf("%p\n", &a + 1);
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
运行结果如下:
a0 = 0xbff83220
a1 = 0xbff83224
a2 = 0xbff83228
a3 = 0xbff8322c
a4 = 0xbff83230
-----------------
0xbff83234
2 5
可以看出,每个元素占用4个字节,&a+1比a[0]的地址偏移了14,这里是16进制。因此转换为10进制就是20.
因为每个元素占用4个字节,因此便宜了4*5=20.也就是偏移了整个数组。
大概画了个图如下:
记录一下,非常感谢乙醇同学的支持,希望对大家能有所帮助,谢谢。