2010-02-28 125 views

回答

27

C++標準定義了數組是什麼以及它的行爲。看看索引。它不是一個指針,const或其他的,它不是別的,它是一個數組。

看到一個區別:

int a[10]; 
int *const b = a; 

std::cout << sizeof(a); // prints "40" on my machine. 
std::cout << sizeof(b); // prints "4" on my machine. 

顯然A和B是不一樣的類型,因爲它們有不同的尺寸。

在大多數情況下,數組名稱「decay」指向它自己的第一個元素。您可以將其視爲自動轉換。結果是一個右值,這意味着它只是一個指針值,並且不能分配給它,類似於函數名稱衰減到函數指針時。這並不意味着它是「常量」,但它是不可分配的。

所以一個數組「is」是一個非常像函數「指針」的指針,或者是一個長整數「is」的int。也就是說,這不是真的,但是由於轉換,您可以在多數情況下使用它。

+0

真的很有見識!謝謝 ! – lovespring 2014-08-17 17:56:39

+0

* a會打印數組中第一個元素的值,因此應該指向數組中第一個元素的內存地址。那麼爲什麼sizeof運算符會給出數組a的所有元素的大小,而不是僅僅存儲數組第一個元素的內存地址的大小呢? – user1825567 2017-01-11 06:38:38

+1

@ user1825567:因爲表達式'* a'在其中有一個隱式轉換(稱爲「衰減」),從數組類型到指針類型。你可以把它看作'* pointer_to_first_element_of(a)'的簡寫。那麼爲什麼'sizeof(a)'不需要和'sizeof(pointer_to_first_element_of(a))'相同,這應該是相當明顯的。 'a'不是一個指針。任何告訴你的人都不瞭解C或不尊重你,認爲你理解C. – 2017-01-12 15:09:39

6

數組名稱不是一個常量指針 - 但它在許多上下文中都表現得像一個(它幾乎可以轉換爲一個),這對於大多數情況而言都是如此。

從6.3.2.1/3「的其他操作數/左值,數組和功能標示符」:

除了當它是sizeof操作者或一元&操作者的操作數,或是一個字符串文字用於初始化數組,具有類型「數組類型」的表達式將轉換爲類型爲「指向類型的指針」的表達式,該表達式指向數組對象的初始元素,並且不是左值。

+3

我想說明的是,這是C標準的一個引用。在C++中,數組不會衰減。它考慮了上下文,例如:'int a [10]; int(&r)[10] = a;/*沒有衰變* /;'。 – 2010-02-28 16:35:59