我正在读斯蒂芬·普拉塔的一本好书。不幸的是,我不明白什么。它是关于数组和指针的。所以有数组选项卡。他写道,该选项卡是数组->的第一个元素的地址,这是可以的,但是&tab是整个数组的地址<-我不明白。这意味着什么&选项卡显示数组的所有地址(当然不是),数组所有元素的中间地址,最后一个?
在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
都指向相同的地址,但它们具有不同的类型,并且指向占用相同空间的不同对象。
tab是阵列的第一个元素的地址
这是正确的,对于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]
}