2014-10-09 57 views
-6
#include<iostream> 
using namespace std; 
int main() 
{ 
     int a[]={10,20,30,40,50}; 

     int *b,**c,*d; 

     cout<<a<<endl; ..............(1) 

     cout<<b;   ..............(2) 

     return 1; 
} 

如果我只運行包含該程序(1)標記的語句輸出是同一個指針在用另一個指針打印時會給出不同的地址嗎?

0x22fecc

但如果我運行程序與兩個語句,即(1)和(2) 則輸出是

0x22fec8 0x401d2e

Q1:爲什麼2例的印刷爲一個不同的值

Q2:如果我做b = a然後打印b和a?

Q3:爲什麼b和a在Q2中給自己同一個地址?他們現在是否一樣,即他們共享相同的位置? b是現在的別名嗎?

Q4:如果我做b = a + 1然後cout < < b爲什麼它給出了一個地址?它應該給出一個+ 1的地址?

Is cout<<a is equivalent to cout<<&a ? 

我在Win7 32bit上使用代碼塊13.12。

+4

這是未定義的行爲來打印未初始化的'b'。另外,每次運行程序時地址都不應該相同。 – juanchopanza 2014-10-09 15:28:36

回答

0

如果你想獲得的兩個輸出相同的值,然後insert語句

b = a; 

在表達式中數組隱式轉換爲指針,以他們的第一要素。因此,在語句aboth中,表達式a被轉換爲指向其第一個元素的指針,並被分配給b。

在此語句

cout<<a<<endl; 

一個也被轉換爲一個指向它的第一個元素。作爲結果分配後至b

cout<<a<<endl; 

cout<<b; 

將輸出相同的值。

此語句

b = a+1 

B就指向第二元件(具有索引1)陣列的後。

編輯:哦,我理解你的問題。看來,當變量b在函數中沒有被使用時,編譯器只是將它從生成的目標代碼中移除。當使用變量b時,編譯器爲它在堆棧上分配內存。所以a的地址根據變量b是否被使用而改變。

+0

我不想要b = a我想知道的是,爲什麼a打印方式不同,僅當(1)被包含時被打印爲0x22fecc,並且當我包含(1)和(2)時,則a被打印爲0x22fec8我不在乎什麼是印刷? – user3528260 2014-10-09 15:33:57

+1

因爲這是您第二次運行該程序,並且地址沒有必要與第一次相同。 – RockOnRockOut 2014-10-09 15:37:16

+0

@ user3528260查看我更新的帖子。 – 2014-10-09 15:49:03

1
Q1 : why different value printed for a in 2 cases 

編譯器可能正在優化b out。嘗試在編譯器上將優化設置爲none。

Q2 : what if i do b = a and then print b and a ? 

試試吧,讓我們知道如何去:)

Q3 : why b and a give same address of themselves in Q2 ? Are they same now i.e they share same location ? does b is an alias of a now ? 

他們是不同的,但都指向同一個位置。就像兩張紙上都有你的家庭住址。

Q4 : if i do b = a+1 and then cout<< b why it gives address of a ? it should have given the address of a+1 ? 

它確實給出了+ 1的地址。