来,猜猜看,这里的执行结果是什么?
这是今天课上的一道理解题,给大家一点点思考时间。
(心里有答案了再往下滑哦)
5
4
3
2
1
.
答案是,报warning!因为%d不是用来输出指针的哈哈哈
不过如果忽略warning呢?
那么最终答案是:5
为什么是 5?
1 + 1 = 5?
哈哈别急,让我们来进行一些简单的实验。
#include<stdio.h>
int main()
{
printf("%d\n", (int *)1 + 1); // 输出5
//接下来把%d改为%p,输出地址
printf("%p\n", (int *)1 + 1); // 输出0x5
printf("%p\n", (int *)1 + 2); // 输出0x9
printf("%p\n", (int *)2 + 1); // 输出0x6
printf("%p\n", (int *)2 + 2); // 输出0xa
printf("%p\n", (int *) (1 + 1) ); // 输出0x2
return 0 ;
}
多实验几次就会明显发现,
第一个数每+1地址增加1,
第二个数每+1地址就增加4,
而(int*)(1+1) 也就是(int*)2,指向的就是地址2,
所以,系统应该是先执行(int*)1,将指针指向地址1,然后再执行+1,使指针指向当前地址的下一个位置,因为int占4个字节所以指针每次跳4个,所以最终指向1+4,也就是地址5的位置。
(如果将int改为其他类型也是同样:)
#include<stdio.h>
int main()
{
printf("%d\n", (int *)1 + 1); //int 占4字节,输出5
printf("%d\n", (short *)1 + 1); //short 占2字节,输出3
printf("%d\n", (long long i*)1 + 1); //long long 占8字节,输出9
return 0 ;
}
以上是我的个人理解,欢迎大佬们前来赐教~