数组名是C++中的常量指针吗?

sky*_*oor 16 c++

我有关于数组名称的问题a

int a[10]
Run Code Online (Sandbox Code Playgroud)

如何在C++中定义数组名称?常量指针?它是这样定义的还是我们可以这样看?可以对名称应用哪些操作?

Ste*_*sop 28

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.
Run Code Online (Sandbox Code Playgroud)

显然a和b的类型不同,因为它们具有不同的尺寸.

在大多数情况下,数组名称"衰减"到指向其自己的第一个元素的指针.您可以将其视为自动转换.结果是一个rvalue,意味着它只是一个指针值,并且无法分配,类似于函数名称衰减到函数指针时.这并不意味着它是"const",但它不是可分配的.

所以一个数组"是"一个指针很像一个函数"是"一个函数指针,或一个长"是"一个int.也就是说,它不是真的,但是由于转换,你可以在大多数情况下将它用作一个.


Mic*_*urr 6

一个数组名称不是一个常量指针 - 但是它在很多情况下就像在很多情况下一样(它在很多情况下转换为一个),就像它一样.

从6.3.2.1/3"其他操作数/左值,数组和函数指示符":

除非它是运算sizeof符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则将类型为"数组类型"的表达式转换为类型为"指向类型的指针"的表达式,该表达式指向数组对象的初始元素,而不是左值.

  • 我想指出,这是C标准的引用.在C++中,无论如何都不会衰减数组.它考虑了上下文,例如:`int a [10]; int(&r)[10] = a;/*没有腐烂*/;`. (3认同)