2012-04-01 49 views
4

我想將這些c代碼轉換爲C++代碼。它是關於指針的printf指針格式cout

int n = 44; 
//printf("n = %d \t &n = %x\n", n, &n); 
cout<<"n ="<<n<< "\t" <<"&n ="<<hex<<int(&n)<<endl; 

當我運行printf的輸出是這樣的:

n=44 &n=22ff1c 

但是當我運行COUT輸出是這樣的:

n=44 &n=22ff0c 

爲什麼做兩個版本爲n的地址輸出不同的值?

+1

十六進制數字是變量的內存地址。每次運行程序時可以有不同的值。 – Topo 2012-04-01 08:06:21

+0

每次運行printf時,都會給出相同的答案(&n = 22ff1c)。以相同的方式cout程序給出相同的結果(&n = 22ff0c) – cadyT 2012-04-01 08:12:19

+0

重新編輯:2C是44的十六進制。 – 2012-04-01 09:32:23

回答

11

編譯器恰好將堆棧分配的變量放在不同版本的程序中的不同位置。

嘗試在同一個程序中同時包含printf和cout版本,以便它們使用完全相同的指針。然後你會看到這兩個版本的行爲是一樣的。

int n = 44; 
printf("n = %d \t &n = %x\n", n, &n); 
cout<<"n ="<<n<< "\t" <<"&n ="<<hex<<int(&n)<<endl; 

作爲李斯特先生正確地指出,你應該在printf的打印指針時使用%p格式字符串。

+3

但是,您不應該如何使用'%x'來打印指針嗎?你們讓我失望。 – 2012-04-01 08:12:08

+0

@李斯特爾公平點,集中在這個問題的主要觀點。 – 2012-04-01 08:13:46

0

假設你不是指空白的差異。在程序的每次運行中,n在堆棧上分配的地址是不同的。否則,這一切對我來說都不錯!

1

您無法控制n在內存中的位置。編譯器可能會根據其他看起來不相關的東西來改變事物的定位方式。不要緊。你無權說n應該去哪裏;別的東西可能已經是你想要放的地方了。