支架[]操作符只能一次使用吗?

Wus*_*uhn 4 c arrays pointers

我最初认为它对指针和数组有不同的用途.在前一种情况下,它将括号中的任何内容添加到指针,然后取消引用总和; 在后一种情况下,它只会产生数组的第i个元素.

然后我意识到数组变量返回指向第一个元素的指针,因此操作符在每种情况下都做同样的事情:偏移和取消引用.

支架[]操作符确实只在C中有一次使用吗?

Yu *_*Hao 12

[]被称为数组下标运算符,但在语法上它用于指针.数组转换为指向此用法中的第一个元素的指针(以及许多其他元素).所以,是的,[]对于数组和指针来说是一样的.

C11§6.5.2.1数组下标

约束

其中一个表达式应具有类型''指向完整对象类型'的指针,另一个表达式应具有整数类型,结果具有类型''type''.

语义

后缀表达式后跟方括号中的表达式[]是数组对象元素的下标名称.下标操作符的定义[]E1[E2]相同(*((E1)+(E2))).由于适用于二元+运算符的转换规则,if E1是一个数组对象(等效地,指向数组对象的初始元素的指针)并且E2是一个整数,因此E1[E2]指定E2-th元素E1(从零开始计数).

  • +1这是正确的.为了解决OP的核心问题,`[]`总是对指针和整数(以任何顺序,顺便说一下)进行操作.从不涉及数组,因为在评估`[]`运算符时,数组名的任何实例都已经"衰减"到指针. (3认同)
  • 有趣的是,`array [offset] == offset [array]`是真的. (2认同)

Ray*_*oal 5

它是否"一件事"取决于你认为"一件事"的含义.

在C中,运算符定义如此

e1[e2]   means   *(e1+e2)
Run Code Online (Sandbox Code Playgroud)

而已.一件事.或者是吗?假设a是一个数组并且i是一个整数.我们可以写:

a[3]
a[i]
3[a]
i[a]
Run Code Online (Sandbox Code Playgroud)

并且假设p是指针并且i是整数.我们可以写

p[3]
p[i]
3[p]
i[p]
Run Code Online (Sandbox Code Playgroud)

数组或指针.两件事情?并不是的.你知道当我们使用plus运算符时,其中两个操作数之一是"数组",你实际上是在做指针运算.

你的问题的第二部分 - 它可以用于指针运算以外的东西 - 在C中基本上没有,但在C++中是的,因为在C++中我们可以重载这个运算符.但是有时您会[]在类型表达式中看到,但这可能不是您所要求的,因为在这种情况下,我们并没有真正将它用作运算符(我们将它用作类型运算符,这是不同的).