查看完整版本 : 指標的位址?
以下是書上的習題,要求變數x,以及指向數x的指標*p,以及指向指標*p的另一指標**mp的位址。
書上的解答是:
#include <stdio.h>
int main(void)
{
int *p,**mp,x;
p=&x;
mp=&p;
**mp=10;
printf("%p,%p,%p",&x,p,mp);
return 0;
}
結果程式跑出來後,其實&x和p的值是一樣的。
但我的疑問是,既然是三者的「位址」,不是應該寫成printf("%p,%p,%p",&x,&p,&mp);嗎?
thanks
剛操作時發現, printf("%p %p", p,&p) 這二者的值是一樣的? 所以對於指標變數,有沒有加&,印出來的%p都一樣,所以未必要加&嗎?
printf("%p %p", p,&p)
p,&p一样吗?我这边是不一样的哦
printf("%p %p", p,&p)
p,&p一样吗?我这边是不一样的哦
呵,我剛才也算了一次,確實不一樣。~embarass: 還沒來得及改就被你發現了。~embarass:
說實話,我反覆把玩,頭都暈了。
例如我想知道在指標p中儲存的值,也就是說變數x的位址,我能用 %d來求p嗎?以 printf("%d", p); 為例?
我自己操作了一下,變了一些方式,卻得到不同的答案,所以我猜這是錯的?不能用%d來直接求出p裡儲存的值。是這樣嗎?
%p和%d打印出来的数值是相等的,前者打印的是16进制,后者是10进制
%p和%d打印出来的数值是相等的,前者打印的是16进制,后者是10进制
thanks。
但我剛才去換算網站作了換算,換算過來並不符合?
http://tool.httpcn.com/Tool/JinZhiZhuanHuan.html
000000000023FE54 2358868 這是我這個程式得的答案,拿這去換算,結果不符合?
但我操作了一些方式,如下:
#include <Stdio.h>
int main(void)
{
int x,*p;
p=&x;
x=10;
printf("%p %p %d",&x,p,p);
return 0;
}
000000000023FE54 000000000023FE54 2358868
#include <Stdio.h>
int main(void)
{
int x,*p;
p=&x;
x=10;
printf("%p %p %d",&x,&p,p);
return 0;
}
000000000023FE5C 000000000023FE50 2358876
為何我只是中間一個求的是p的%p,另一個求&p的%p,結果二者最後跑出來的三個位址就都不同了?
難道是因為我二次求的內容不太一樣,系統配置記憶體的位址就不太一樣了嗎?而如果我又改回原來的方程式,求得的答案又和以前相同,這表示記憶體配置又回到從前。所以就算這個程式裡並未增減任何變數,只因求的內容有不同,記憶體就會有不同位址的配置?
那个转换网页,2358868转换成16进制显示23fe54,而小写的23fe54转换成10进制也是2358868,是符合的。但是大写的000000000023FE54却转换成别的数字了,这个应该是网页有点问题。(64进制区分大小写,16进制不区分大小写,23FE54就是23fe54即2358868)
后面的两个程式,在我的机器上,dev-c++,打印的数字只有中间的不同,左右两个都是相同的。
#include <Stdio.h>
int main(void)
{
int x,*p;
p=&x;
x=10;
printf("%p %p %d\n",&x,&p,p);
printf("%p %p %d\n",&x,p,p);
return 0;
}
0022FF74 0022FF70 2293620
0022FF74 0022FF74 2293620
后面的两个程式,在我的机器上,dev-c++,打印的数字只有中间的不同,左右两个都是相同的。
#include <Stdio.h>
int main(void)
{
int x,*p;
p=&x;
x=10;
printf("%p %p %d\n",&x,&p,p);
printf("%p %p %d\n",&x,p,p);
return 0;
}
0022FF74 0022FF70 2293620
0022FF74 0022FF74 2293620
thanks.
但如果您將二者分在二個程式中執行,似乎%d p的值會不同喔?二者在同一程式中執行確實是一樣的。?:teeth
晕,我这边,不论是放在一个程式里还是放在二个程式里,得到的数字,都是:左边的与左边的相同、右边的与右边的相同,只有中间的不同。
晕,我这边,不论是放在一个程式里还是放在二个程式里,得到的数字,都是:左边的与左边的相同、右边的与右边的相同,只有中间的不同。
為何會如此呢?
我操作結果還是如下:
#include <Stdio.h>
int main(void)
{
int x,*p;
p=&x;
x=10;
printf("%p %p %d",&x,p,p);
return 0;
}
000000000023FE54 000000000023FE54 2358868
000000000022FE54 000000000022FE54 2293332
#include <Stdio.h>
int main(void)
{
int x,*p;
p=&x;
x=10;
printf("%p %p %d",&x,&p,p);
return 0;
}
000000000023FE5C 000000000023FE50 2358876
000000000022FE5C 000000000022FE50 2293340
只因紅字之處不同,而結果都不同?綠色的是我在桌機上的結果,藍色的是我在筆電上執行的結果。
我到 http://codepad.org/ 去貼上這二個程式碼,跑出來的結果也是兩兩不同?
用dev-c++编译,两个数字相同
换个编译器,就不同了
用dev-c++编译,两个数字相同
换个编译器,就不同了
我也是用 dev-c++ 5.4.2 版本。
您看看這程式碼是否有什麼邏輯上的問題嗎?
拿去codepad.org 試也是一樣嗎?
在codepad.org跑的话,即使同一个程式,跑两次三次,结果也都是不同的,更不要说两个程式了。
在我的机器上,dev-c++ 4.9.9.2 跑这两程式,左右俩数相同,中间不同。
换别的编译器跑这俩程式,左右俩数也是不同。
这俩程式,逻辑上没有什么问题。
在codepad.org跑的话,即使同一个程式,跑两次三次,结果也都是不同的,更不要说两个程式了。
在我的机器上,dev-c++ 4.9.9.2 跑这两程式,左右俩数相同,中间不同。
换别的编译器跑这俩程式,左右俩数也是不同。
这俩程式,逻辑上没有什么问题。
所以是否可以假設,因為程式的內容有些許不同,就會影響了它對記憶體內存的位址安排?這是我自己猜的。~embarass:
位址应该是运行时由操作系统分配的,而不是程式编译时分配的。
打印出来的地址只是逻辑地址,并非物理地址。
位址应该是运行时由操作系统分配的,而不是程式编译时分配的。
打印出来的地址只是逻辑地址,并非物理地址。
什麼叫邏輯地址?
它們會變化的原因到底是什麼呢?:whoknows
thanks
再回到這邊來,愈搞愈糊塗。:XD:?:teeth
先簡單的問好了,printf("%p %p",x,&x);
求變數x的位址時,一定要&x嗎?那printf("%p",x)時,是得到什麼的值?
例如下面的寫法:
#include <stdio.h>
int main(void)
{
int x=10;
printf("%p\n",&x);
printf("%p",x);
return 0;
}
得到的結果是:
&x==>000000000022FE5C
x==>000000000000000A
雖然%p是求位址,但只寫x它也給出答案值,這表示?
:whoknows
&x==>000000000022FE5C 这个当然是位址
x==>000000000000000A 这个就是x的值(10),写成16进制:A
&x==>000000000022FE5C 这个当然是位址
x==>000000000000000A 这个就是x的值(10),写成16进制:A
~yes 十分感謝,總算讓我心中的疑惑獲得澄清,只是常常會重覆忘記。~embarass:
vBulletin® v3.8.4,版權所有 ©2000-2026,Jelsoft Enterprises Ltd.