Ezio_八两神仙醋
2017-06-14 11:38
采纳率: 100%
浏览 840
已采纳

关于printf隐式与显式打印的区别

代码如下:

printf("*(int)ba+1 = %x\n",(int *)((int)ba+1));//?
int *ptr2=(int *)((int)ba+1);//表示a的存储单元的地址增加一个字节
printf("*ptr2 = %x\n",*ptr2);//

打印的效果完全不一样,有点不懂,有没有大神可以解释下。
打印为
*(int)ba+1 = 2129676341
*ptr2 = 2000000

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • 战在春秋 2017-06-14 12:31
    已采纳
      //打印的是 (int *)((int)ba+1)  这个指针本身的值
     printf("*(int)ba+1 = %x\n",(int *)((int)ba+1)); 
    

    而:

    //打印的是 ptr2  这个指针所指地址里面的内容
    printf("*ptr2 = %x\n",*ptr2);   
    

    所以结果完全不一样。

    用心回答每个问题,如果对您有帮助,请采纳答案好吗,谢谢!

    已采纳该答案
    打赏 评论
  • Ezio_八两神仙醋 2017-06-15 01:34

    我想做的是不使用指针而取出指针指向地址内的值。而我的理解是:既然ptr2这个指针是存放前面((int)ba+1)的地址,那么使用(int *)((int)ba+1))应该就是其地址内的值,但是不凑巧的是我好像使用了指针的定义来操作常量,那么我打印的仍然是地址?

    打赏 评论
  • Ezio_八两神仙醋 2017-06-15 07:27

    具体是这样的:
    int ba[4]={1,2,3,4};
    int *ptr2=(int *)((int)ba+1);
    printf("*ptr2 = %x\n",*ptr2);

    打印为:
    *ptr2 = 2000000
    我的操作系统为小端序。请问下这个*ptr2为什么是2000000

    打赏 评论
  • Ezio_八两神仙醋 2017-06-15 07:28

    其实就是测试一下地址内存放的值是什么

    打赏 评论

相关推荐 更多相似问题