AnT*_*AnT 10
显然你假设[]运算符对某事物的适用性必然意味着"某事"是一个数组.这不是真的.内置[]运算符与数组没有直接关系.的[]仅仅是组合的简写*和+操作符:定义a[b]装置*(a + b),其中需要一个操作数是一个指针和另一个要求是整数.
此外,当您将[]运算符应用于实际数组时,该数组首先被隐式转换为指针类型,然后结果指针才能充当运算[]符的操作数.这实际上意味着与您最初假定的相反:运算符[] 从不使用数组.到我们到达时,[]数组已经衰减为指针.
作为一个相关的附注,后一个细节表现在第一个C语言标准的一个模糊的特点.在C89/90中,rvalue数组不允许进行数组到指针的转换,这也阻止了[]运算符使用这样的数组
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;
}
Run Code Online (Sandbox Code Playgroud)
C99扩展了该转换的适用性,从而使上述代码有效.