2014-12-19 76 views
1

我正在閱讀有關C++中的數組。我嘗試以下的代碼:int數組的類型是什麼?

int main() 
{ 
    int a[10]; 
    int *p; 
    p = &a; 
} 

我得到編譯器錯誤:

pointers.cpp:10:6: error: cannot convert ‘int (*)[10]’ to ‘int*’ in assignment 
p = &a; 

爲了理解該陣列類型,以便能夠分配給指針我嘗試這樣做的代碼:

int main() 
{ 
    int a[10]; 
    int *r[10]; 
    r = a; 
} 

編譯錯誤:

: error: incompatible types in assignment of ‘int [10]’ to ‘int* [10]’ 
    r = a; 

然後我嘗試這樣的:

int main() 
{ 
    int a[10]; 
    int *r[10]; 
    r = &a; 
} 

編譯錯誤:

error: incompatible types in assignment of ‘int (*)[10]’ to ‘int* [10]’ 
    r = &a; 

什麼類型int (*)[10]

+0

@ dandan78問題是關於C++,而不是關於C.數組在兩種語言中工作不完全相同。 – rightfold

+0

只要不嘗試用C++,如果你不知道你在做什麼。你的房子可能會倒塌。 – nbro

回答

3

int (*)[10]是指向數組10 int s的指針。它指向整個陣列。在您的第一個代碼中,當您執行&a時,您將獲取具有此類型的整個數組的地址。如果你想存儲,你必須寫:

int (*r)[10] = &a; 

在你嘗試了代碼,int *r[10]是不是一個指針數組(而不是一個指向數組的指針)。

另一方面,一個int*點在一個單一的int。例如,您可以獲取陣列元素的一個地址&a[0],它將是一個int*

int *p = &a[0]; 

事實上,一個陣列的名稱經常經歷了一個稱爲陣列到指針轉換的隱式轉換在其成爲一個指針陣列中的第一個元素。我們通常說,數組衰減爲指向其第一個元素的指針。

int *p = a; // Here, a is decaying 
2

去對此正確的方法是通過第一個元素的地址:

int a[10]; 
int *p; 
p = &a[0]; 

其他人可以通過增加p訪問:

p++; 
+0

或只是'p = a' – nbro

0

由於錯誤說,它的int (*)[10],所以你應該使用int (*r)[10]而不是int *r[10]。額外的()是指向一個10個整數的指針和一個10個指向整數的指針的數組之間的區別。

2

What is the type of an int array?

每種尺寸都有不同的類型。例如,十個數組的類型是int[10]。還有一個不完整的類型int[],表示未知大小的數組。

What is the type int (*)[10] ?

這是一個指向大小爲10

陣列在你的第一個片段,&a是一個指向數組的指針,你不能分配給一個指向單一int,因爲intint[10]是不兼容的類型。在其他示例中,r是一個指針數組,您不能將任何內容分配給數組。

你可以使用任一這些:

int *p = a;  // implicit array-to-pointer conversion 
int *p = &a[0]; // explicitly take address of element 

的指針分配給數組的第一個元素。或者,如果你想要一個指向數組(perserving在其類型的大小),這是

int (*p)[10] = &a; 

額外()表明,這是一個指針數組,而不是指針數組。

1

你只需要做

int a[10]; 
int *p; 
p = a; 

分配P排列的一個的ADRESS;它的第一個元素的i-e地址。

相關問題