考验大家指针功底的时候到了:请问如何理解 (int*)1 + 1 ?

 来,猜猜看,这里的执行结果是什么?

这是今天课上的一道理解题,给大家一点点思考时间。

(心里有答案了再往下滑哦) 

5

4

3

2

1

.

答案是报warning!因为%d不是用来输出指针的哈哈哈 

不过如果忽略warning呢?

那么最终答案是:5 

为什么是 5?

1 + 1 = 5?

哈哈别急,让我们来进行一些简单的实验。

#include<stdio.h>
int main()
{
    printf("%dn", (int *)1 + 1); // 输出5

  //接下来把%d改为%p,输出地址
    printf("%pn", (int *)1 + 1); // 输出0x5

    printf("%pn", (int *)1 + 2); // 输出0x9

    printf("%pn", (int *)2 + 1); // 输出0x6
     
    printf("%pn", (int *)2 + 2); // 输出0xa

    printf("%pn", (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("%dn", (int *)1 + 1); //int 占4字节,输出5
 
    printf("%dn", (short *)1 + 1); //short 占2字节,输出3

    printf("%dn", (long long i*)1 + 1); //long long 占8字节,输出9

    return 0 ;
} 

以上是我的个人理解,欢迎大佬们前来赐教~

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>