2015-01-04 67 views
0

我有一些問題與指針二維數組宣言,經與指針麻煩2D陣列聲明

我寫下面的一些代碼:

typedef int ptr2di[3][3]; 
void main() 
{ 
int a[3][3] = { { 1, 2, 3 }, { 4, 5, 6 } }; 

ptr2di *ptr=&a; 
//ptr2di *ptr=a; 

cout << a << endl << &a; 
} 

輸出:

0029F940 

0029F940 

由此得出結論: a = & a =陣列的基地址。 後來我改變一點點在ptr2di聲明:

//ptr2di *ptr=&a; 
ptr2di *ptr=a; 

它有一個錯誤C2440: '初始化':從粗野, 'INT [3] [3]' 轉換爲 'ptr2di(*)'。

所以,這是我的問題,我不明白a&a之間的區別是什麼? 大家可以幫我解釋一下嗎?

回答

0

我猜a值實際上是0029F940(因爲它是一個數組),cout只是看着這個值,但編譯器將數組看作是數組int [3] [3]而不會允許將其分配給ptr2di *,這是期望指向int [3] [3]的指針。因此,a和& a的值是相同的,但類型不同,編譯器正在檢查合法賦值的類型。

類似的例子:

int a = 1; 
// Valid: Assigning the address of a (which is an int) to a pointer to an int 
int *ptr = &a; 

// Invalid: Assigning an the int a to a pointer to an int 
int *ptr = a; 

會發生什麼事,如果你做到這一點? cout < < a [0] [0] < < endl < <&a;