16
A
回答
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。也就是說,這不是真的,但是由於轉換,您可以在多數情況下使用它。
6
數組名稱不是一個常量指針 - 但它在許多上下文中都表現得像一個(它幾乎可以轉換爲一個),這對於大多數情況而言都是如此。
從6.3.2.1/3「的其他操作數/左值,數組和功能標示符」:
除了當它是
sizeof
操作者或一元&
操作者的操作數,或是一個字符串文字用於初始化數組,具有類型「數組類型」的表達式將轉換爲類型爲「指向類型的指針」的表達式,該表達式指向數組對象的初始元素,並且不是左值。
+3
我想說明的是,這是C標準的一個引用。在C++中,數組不會衰減。它考慮了上下文,例如:'int a [10]; int(&r)[10] = a;/*沒有衰變* /;'。 – 2010-02-28 16:35:59
相關問題
- 1. C++ - 數組是一個指針嗎?
- 2. 是一個常量字符指針,指向一個常量字符或指向字符的常量指針嗎?
- 3. 指針數組和指針指向一個數組在C++
- 4. 函數返回指向常量2-d數組的指針(C++)
- 5. 獲取C++中指針指向的變量的名稱
- 6. C++ - 指向向量的指針數組?
- 7. C函數名稱或函數指針?
- 8. 如何將一個常量數組文字傳遞給一個不帶變量C/C++的指針的函數?
- 9. 正常指針和常量指針在c中的區別
- 10. 將字符數組和常量字符指針組合成一個單一的常量字符*在C
- 11. 一個指針數組的指針
- 12. 我可以在C中創建一個Char指針數組嗎?
- 13. C指針指針數組
- 14. C++指向類名稱的指針
- 15. C++排序數組是指向一個類的指針
- 16. 指向數組第一個元素的常量指針的指針是如何工作的?
- 17. C++是「類名*」類指針嗎?
- 18. 常量指針vs常量值指針
- 19. 指針常量用C
- 20. C++ - 指向數組的指針 - 指針
- 21. 常量指針修復一個變量
- 22. C++中的數組指針
- 23. C++中的數組指針
- 24. C++中數組指針指針
- 25. C++在constexpr類中的常量指針
- 26. 帶指針和常規指針的二維數組? (C語言)
- 27. 爲什麼說一個2維數組是一個「指向指針的指針?」
- 28. 的C指針:數組變量
- 29. 數組指針的向量C++
- 30. 更改常量變量的指針C++
真的很有見識!謝謝 ! – lovespring 2014-08-17 17:56:39
* a會打印數組中第一個元素的值,因此應該指向數組中第一個元素的內存地址。那麼爲什麼sizeof運算符會給出數組a的所有元素的大小,而不是僅僅存儲數組第一個元素的內存地址的大小呢? – user1825567 2017-01-11 06:38:38
@ 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