2011-11-30 88 views
4

我知道int (*p)[5]是指一個指向5個整數的指針。 所以我的代碼下面這個方案:爲什麼使用int(* p)[5]`的結果如此混亂?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a[5]={0,1,2,3,4}; 
    int (*q)[5]=&a; 
    cout<<a<<endl;   
    cout<<q<<endl; 
    cout<<*q<<endl;   
    cout<<**q<<endl; 
    return 0; 
} 

在我的機器,結果是:

0xbfad3608 
0xbfad3608  //?__? 
0xbfad3608 
0 

我可以理解,*q意味着a[0]**q地址指的a[0]價值,但爲什麼qa*q具有相同的值?我頭腦不好,應該是他們的地址!我完全困惑。有人請幫助我。請!

回答

8

看看這樣說:

q == &a 
    *q == a 
    **q == *a 

你沒嘗試打印&a。如果你這樣做,你會發現它具有與a相同的值。由於&a == a,q == &a*q == a,通過傳遞性q == *q

如果你想知道爲什麼&a == a,檢查出Why is address of an array variable the same as itself?

+0

這是否意味着'&a == a ==&a [0]'? – zyc

+0

@zyc,不,但他們都開始在同一個地址。 – avakar

+0

是的,'&a == a ==&a [0]'。 –

1

,由於array被自動轉換爲pointer,剛剛有array的地址的值。因此,當您嘗試打印使用<<a<<*q打印array時,您實際上正在打印其地址。

+0

是的,但我只是想打印它的地址。 – zyc

2

q&a是指向該陣列的指針。

*qa是「數組」。但是你不能真正將一個數組傳遞給一個函數(並且std::ostream::operator<<是一個函數);你確實傳遞了一個指向隱式創建的第一個元素的指針(稱爲指針衰減)。因此*qa成爲指向數組的第一個元素的指針。

該數組的開頭位於內存中與該數組相同的位置。由於所涉及的指針都不是指向char的指針(這些指針專門處理以便字符串文字將按預期工作),因此地址只是打印出來。