这是我难以理解的代码:
char* myPtr = "example";
myPtr[1] = 'x';
如何允许我使用 myPtr[1]
?为什么我可以选择数组上的 do 位置? myPtr
甚至不是数组。
观察。我知道查找表、文字池和字符串文字,我关心的是这甚至是如何编译的。我不太使用指针。
有人能帮忙吗?
最佳答案
显然,您假设 []
运算符对某物的适用性必然意味着“某物”是一个数组。这不是真的。内置的 []
运算符与数组没有直接关系。 []
只是 *
和 +
运算符组合的简写:根据定义 a[b]
意思是*(a + b)
,其中一个操作数要求是一个指针,另一个要求是一个整数。
此外,当您将 []
运算符应用于实际数组时,该数组首先被隐式转换为指针类型,然后所得指针才能充当 的操作数[]
运算符。这实际上意味着与您最初假定的相反:operator []
never 对数组起作用。当我们到达 []
时,数组已经衰减为指针。
作为相关的旁注,后一个细节体现在第一个 C 语言标准的一个模糊特性中。在 C89/90 中,右值数组不允许数组到指针的转换,这也阻止了 []
运算符处理此类数组
struct S { int a[10]; };
struct S foo(void) { struct S s = { 0 }; return s; }
int main()
{
foo().a[5];
/* ERROR: cannot convert array to pointer, and therefore cannot use [] */
return 0;
}
C99 扩展了该转换的适用性,从而使上述代码有效。
关于c++ - 是指针数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757924/