PDA

查看完整版本 : 指標的位址?


哈啦
2014-06-15, 06:22 PM
以下是書上的習題,要求變數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都一樣,所以未必要加&嗎?

yumi
2014-06-15, 07:20 PM
printf("%p %p", p,&p)
p,&p一样吗?我这边是不一样的哦

哈啦
2014-06-15, 07:22 PM
printf("%p %p", p,&p)
p,&p一样吗?我这边是不一样的哦

呵,我剛才也算了一次,確實不一樣。~embarass: 還沒來得及改就被你發現了。~embarass:

說實話,我反覆把玩,頭都暈了。

例如我想知道在指標p中儲存的值,也就是說變數x的位址,我能用 %d來求p嗎?以 printf("%d", p); 為例?

我自己操作了一下,變了一些方式,卻得到不同的答案,所以我猜這是錯的?不能用%d來直接求出p裡儲存的值。是這樣嗎?

yumi
2014-06-15, 08:28 PM
%p和%d打印出来的数值是相等的,前者打印的是16进制,后者是10进制

哈啦
2014-06-15, 08:48 PM
%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,結果二者最後跑出來的三個位址就都不同了?

難道是因為我二次求的內容不太一樣,系統配置記憶體的位址就不太一樣了嗎?而如果我又改回原來的方程式,求得的答案又和以前相同,這表示記憶體配置又回到從前。所以就算這個程式裡並未增減任何變數,只因求的內容有不同,記憶體就會有不同位址的配置?

yumi
2014-06-16, 08:26 AM
那个转换网页,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

哈啦
2014-06-16, 04:01 PM
后面的两个程式,在我的机器上,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

yumi
2014-06-16, 09:10 PM
晕,我这边,不论是放在一个程式里还是放在二个程式里,得到的数字,都是:左边的与左边的相同、右边的与右边的相同,只有中间的不同。

哈啦
2014-06-16, 09:40 PM
晕,我这边,不论是放在一个程式里还是放在二个程式里,得到的数字,都是:左边的与左边的相同、右边的与右边的相同,只有中间的不同。

為何會如此呢?
我操作結果還是如下:
#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/ 去貼上這二個程式碼,跑出來的結果也是兩兩不同?

yumi
2014-06-16, 11:15 PM
用dev-c++编译,两个数字相同
换个编译器,就不同了

哈啦
2014-06-16, 11:17 PM
用dev-c++编译,两个数字相同
换个编译器,就不同了

我也是用 dev-c++ 5.4.2 版本。

您看看這程式碼是否有什麼邏輯上的問題嗎?
拿去codepad.org 試也是一樣嗎?

yumi
2014-06-17, 10:58 PM
在codepad.org跑的话,即使同一个程式,跑两次三次,结果也都是不同的,更不要说两个程式了。
在我的机器上,dev-c++ 4.9.9.2 跑这两程式,左右俩数相同,中间不同。
换别的编译器跑这俩程式,左右俩数也是不同。
这俩程式,逻辑上没有什么问题。

哈啦
2014-06-17, 11:24 PM
在codepad.org跑的话,即使同一个程式,跑两次三次,结果也都是不同的,更不要说两个程式了。
在我的机器上,dev-c++ 4.9.9.2 跑这两程式,左右俩数相同,中间不同。
换别的编译器跑这俩程式,左右俩数也是不同。
这俩程式,逻辑上没有什么问题。

所以是否可以假設,因為程式的內容有些許不同,就會影響了它對記憶體內存的位址安排?這是我自己猜的。~embarass:

yumi
2014-06-18, 12:53 AM
位址应该是运行时由操作系统分配的,而不是程式编译时分配的。
打印出来的地址只是逻辑地址,并非物理地址。

哈啦
2014-06-18, 12:58 AM
位址应该是运行时由操作系统分配的,而不是程式编译时分配的。
打印出来的地址只是逻辑地址,并非物理地址。

什麼叫邏輯地址?
它們會變化的原因到底是什麼呢?:whoknows

thanks

哈啦
2014-06-25, 06:17 PM
再回到這邊來,愈搞愈糊塗。: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

yumi
2014-06-25, 09:58 PM
&x==>000000000022FE5C 这个当然是位址
x==>000000000000000A 这个就是x的值(10),写成16进制:A

哈啦
2014-06-25, 10:33 PM
&x==>000000000022FE5C 这个当然是位址
x==>000000000000000A 这个就是x的值(10),写成16进制:A

~yes 十分感謝,總算讓我心中的疑惑獲得澄清,只是常常會重覆忘記。~embarass: