2015-12-05 173 views
0

我正在閱讀斯蒂芬普拉塔的一本好書。不幸的是我不明白。它關於數組和指針。所以有數組選項卡。 他寫道,該選項卡是陣列的第一個元素的地址 - >沒關係, 但&選項卡是整個陣列的地址< - 我不明白這一點。 這是什麼意思? &選項卡顯示數組的所有地址(當然不是),數組中所有元素的中間地址,最後一個?內存和指針的C++地址

+0

&tab返回數組的第一個地址 – KostasRim

+0

'tab' **是一個數組,但是**會衰減**到指向數組的第一個元素的指針。 –

+0

我認爲,但我做了比較它的程序,還有另外兩個地址。 – diego9403

回答

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; 

在這種情況下p1p2都指向同一個地址,但它們有不同的類型,並指向佔據同一空間不同的對象。