二刷指针概念时候遇到了理解上的困难,,需要大家指点迷津了,万分感激
对指针地址和指针值的疑惑如下:
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
问题1在代码注释
- 问2:p指针自身的地址,在我的理解中是用%p输出(&p)的结果,但是运行结果表明:
p的地址是p的”值“(也就是i的地址)。。
我目前认为:(”%p“,p),(“%p”,&p)两者都是p的地址, 输出p应该和输出&p的结果一样 。
所以p的地址 ,&p的地址 为什么不同?
答:想要得到一個變量的16位完整地址,就必須使用&符 加 變量名!(指針地址為&p)
指針的值:是別人的"地址",既然是地址,就必須要用%p來得到他的 「16位地址真實本相」; %x也有效果,但是得到的是內存地址高位沒有自补0,的部分值。(這個%x的輸出值只有有效數字)
- 问3、printf("%p",p)这样输出,结果为什么不是 p无指向时的地址?
答:想要得到地址,就要使用『取地址符』&,這句其實輸出了p的值,而不是地址! 因為p的值就是地址格式的,所以優先用%p來輸出值。
问4:我设i=10.p指向i。用%x,输出p的值,结果居然不是我想像的p的“值”(i的地址),为什么会这样?
答:你其實得到了地址,只是這個地址的格式不是完整的16位數。格式不便於理解,但是他的有效位數和地址一樣喔。你得到的是舍弃地址高位0後的 有效位數,(單純的16進制數)。初學接觸到的地址高位都是0,
(指针的值是被指物的地址,这个概念是正确的吗?)
答:正確,
结果为什么不是?
答:你需要用地址格式%p,来输出指針所代表的地址值。這就是指針的值,