我正在閱讀斯蒂芬普拉塔的一本好書。不幸的是我不明白。它關於數組和指針。所以有數組選項卡。 他寫道,該選項卡是陣列的第一個元素的地址 - >沒關係, 但&選項卡是整個陣列的地址< - 我不明白這一點。 這是什麼意思? &選項卡顯示數組的所有地址(當然不是),數組中所有元素的中間地址,最後一個?內存和指針的C++地址
0
A
回答
0
標籤是地址陣列
的第一要素,這是正確的,對於char arr[1];
你可以寫char* p = arr;
,這裏我們說ARR衰減到指針的第一個元素。
&標籤是地址爲整個陣列
這意味着其類型是一個指針數組,即。 char(*)[1]
。它們的指針值(arr和& arr)相同,但類型不同。所以下面將編譯:
char (*pp)[1] = &arr; // pointer to array
char (&rp)[1] = arr; // reference to array
但這不會編譯:
char* pp = &arr; // error, types differ
您可以使用以下技巧來找到什麼類型的定表達式/變量確實是。編譯器會告訴你一個錯誤,從中可以讀出實際類型:
template <typename T>
struct TD;
int main()
{
char arr[1];
//char* pp = &arr; // error, types differ
TD<decltype(arr)> dd; // is char[1], no decay to char* here
TD<decltype(&arr[0])> dd; // is char*
//TD<arr> dd; // char(*)[1]
}
1
在C和C++有兩個方面的指針:
- 它指向
- 類型的內存地址它指向的是什麼
tab
和&tab
表示相同的地址,但它們有不同的類型。它們表示不同的對象:&tab
是一個大數組,並且tab
(又名&tab[0]
)是該數組的一個子對象。
這是這種情況沒有什麼不同:
struct S
{
int x;
int y;
};
S s;
S *p1 = &s;
int *p2 = &s.x;
在這種情況下p1
和p2
都指向同一個地址,但它們有不同的類型,並指向佔據同一空間不同的對象。
相關問題
- 1. 指針內存地址
- 2. 學習C - 指針和內存尋址
- 3. C指針和地址
- 4. C++地址和指針
- 5. 存儲指針地址在malloced內存
- 6. 在C中,如何更改指針指向的內存地址?
- 7. C:採用指針與++ /更新的內存地址的內容 -
- 8. 指針和地址
- 9. C++中的指針地址
- 10. C - 指針和內存
- 11. 使用無效的指針/內存地址:C++(windows)
- 12. 如何將二維數組的指針指向C/C++中的內存地址
- 13. C++指針地址解釋
- 14. Objective-C指針地址
- 15. 函數指針地址(C++)
- 16. C++:指針值地址
- 17. 存儲指針地址和std :: adressof
- 18. C指針和更改地址
- 19. 指針和地址,該指針導致
- 20. 關於指針和內存地址的困惑
- 21. 用指針+偏移量C++讀取內存地址
- 22. 指針運算和地址
- 23. ds1820地址,指針和I2C
- 24. 指針和參考地址
- 25. 獲取由ctypes指針指向的內存地址
- 26. 如何釋放指向保存地址的指針的指針
- 27. 如何使用Base地址和指針讀取進程內存
- 28. 用指針指向某個地址c#
- 29. 未指定C指針地址更改
- 30. C中的內存分配和指針
&tab返回數組的第一個地址 – KostasRim
'tab' **是一個數組,但是**會衰減**到指向數組的第一個元素的指針。 –
我認爲,但我做了比較它的程序,還有另外兩個地址。 – diego9403