李奉典 2023-03-03 11:23 采纳率: 96.3%
浏览 39
已结题

%p输出 指针p和&p,为什么不同?

二刷指针概念时候遇到了理解上的困难,,需要大家指点迷津了,万分感激

对指针地址和指针值的疑惑如下:


int main(void){
//定义指针变量存储变量地址
int i= 10;
int* p = &i;
  printf("    i(10)=%d\n",i);

printf("    p(16)=%x\n",p);

printf(" &i(地址)=%p\n",&i);
printf(" p(地址) =%p\n",p);
printf(" &p(地址)=%p\n",&p);
 
return 0;
}

结果如下:

i(10进制)=10
p(16进制)=61fe1c //问1:这里用16进制输出为什么得不到存在p中的,i的地址?
           答:其實地址已經得到,只是位數不一樣而已、我著相了。詳細信息見大家評論。

&i(地址)=000000000061FE1C
p(地址) =000000000061FE1C
&p(地址)=000000000061FE10

img

问题1在代码注释

  1. 问2:p指针自身的地址,在我的理解中是用%p输出(&p)的结果,但是运行结果表明:

p的地址是p的”值“(也就是i的地址)。。
我目前认为:(”%p“,p),(“%p”,&p)两者都是p的地址, 输出p应该和输出&p的结果一样 。
所以p的地址 ,&p的地址 为什么不同?
答:想要得到一個變量的16位完整地址,就必須使用&符 加 變量名!(指針地址為&p)

  指針的值:是別人的"地址",既然是地址,就必須要用%p來得到他的 「16位地址真實本相」; %x也有效果,但是得到的是內存地址高位沒有自补0,的部分值。(這個%x的輸出值只有有效數字)
  1. 问3、printf("%p",p)这样输出,结果为什么不是 p无指向时的地址?
    答:想要得到地址,就要使用『取地址符』&,這句其實輸出了p的值,而不是地址! 因為p的值就是地址格式的,所以優先用%p來輸出值。
  1. 问4:我设i=10.p指向i。用%x,输出p的值,结果居然不是我想像的p的“值”(i的地址),为什么会这样?
    答:你其實得到了地址,只是這個地址的格式不是完整的16位數。格式不便於理解,但是他的有效位數和地址一樣喔。

    你得到的是舍弃地址高位0後的 有效位數,(單純的16進制數)。初學接觸到的地址高位都是0,

(指针的值是被指物的地址,这个概念是正确的吗?)
答:正確,
结果为什么不是?
答:你需要用地址格式%p,来输出指針所代表的地址值。這就是指針的值,

  • 写回答

6条回答 默认 最新

  • 於黾 2023-03-03 11:27
    关注

    int a=10;
    int *p=&a;
    那么p的值是a的地址
    而&p是p的地址
    能明白吗
    比如a的地址是0,p的地址是1
    那么地址0里面存的是10,是a的值
    而地址1里面存的是0,是a的地址
    而&p的值是1,不是0也不是10
    -=-=-=
    如果你声明的是个数组,数组指针的值就是它自身的地址,那么p和&p就相等了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月12日
  • 已采纳回答 3月4日
  • 修改了问题 3月3日
  • 创建了问题 3月3日

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址