c++ - 是指针数组吗?

标签 c++ c arrays pointers

这是我难以理解的代码:

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/

相关文章:

php - 多选字段 - 多次使用选定的 ="selected"

javascript - 带 ng-repeat 的字符数组

C++ MFC : Separating common controls into a group

c++ - vector 迭代器在C++中不兼容

c++ - 我可以引用 va_start() 吗?

c - ANSI C - 计算字符串指针的大小

c - 指向值不变

c++ - 删除运算符如何在我的代码中工作?

c - C语言中如何为指针引用的变量分配内存?

c++ - 将二维数组传递给函数而不指定第二维时出现编译器错误