網域名稱俱樂部

網域名稱俱樂部 (https://www.domainclub.org/index.php)
-   一般軟體與網路使用討論 (https://www.domainclub.org/forumdisplay.php?f=43)
-   -   指標的位址? (https://www.domainclub.org/showthread.php?t=36741)

哈啦 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

引用:

作者: yumi (文章 192588)
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

引用:

作者: yumi (文章 192592)
%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

引用:

作者: yumi (文章 192603)

后面的两个程式,在我的机器上,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

引用:

作者: yumi (文章 192610)
晕,我这边,不论是放在一个程式里还是放在二个程式里,得到的数字,都是:左边的与左边的相同、右边的与右边的相同,只有中间的不同。

為何會如此呢?
我操作結果還是如下:
#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++编译,两个数字相同
换个编译器,就不同了


所有時間均為 +8。現在的時間是 01:37 PM

Powered by vBulletin® 版本 3.8.4
版權所有 ©2000 - 2024,Jelsoft Enterprises Ltd.