我最初认为它对指针和数组有不同的用途。在前一种情况下,它将括号中的内容添加到指针中,然后取消引用总和;在后一种情况下,它只会产生数组的第 i 个元素。
然后我意识到数组变量返回指向第一个元素的指针,所以运算符在每种情况下都做同样的事情:偏移和取消引用。
方括号 [] 运算符在 C 中确实只有一次使用吗?
[]
称为数组下标运算符,但在语法上它用于指针。在这种用法(以及许多其他用法)中,数组被转换为指向第一个元素的指针。所以,是[]
的,数组和指针是一样的。
C11 §6.5.2.1 数组下标
约束
其中一个表达式应具有类型“指向完整对象类型的指针”,另一个表达式应具有整数类型,并且结果具有类型“类型”。
语义
后缀表达式后跟方括号
[]
中的表达式是数组对象元素的下标指定。下标运算符的定义[]
与E1[E2]
相同(*((E1)+(E2)))
。由于适用于二元+
运算符的转换规则,ifE1
是一个数组对象(相当于,一个指向数组对象的初始元素的指针)并且E2
是一个整数,E1[E2]
指定E2
第一个元素E1
(从零开始计数)。
它是否做“一件事”取决于你认为“一件事”是什么意思。
在 C 中,运算符的定义如下
e1[e2] means *(e1+e2)
而已。一样东西。或者是吗?假设a
是一个数组并且i
是一个整数。我们可以写:
a[3]
a[i]
3[a]
i[a]
并且假设p
是一个指针并且i
是一个整数。我们可以写
p[3]
p[i]
3[p]
i[p]
数组或指针。两件事情?并不真地。您知道,当我们使用两个操作数之一是“数组”的加号运算符时,您实际上是在进行指针运算。
你问题的第二部分——它可以用于指针算术以外的事情——在 C 中基本上没有,但在 C++ 中是的,因为在 C++ 中我们可以重载这个运算符。但是有时您会[]
在类型表达式中看到,但这可能不是您要问的,因为在这种情况下,我们并没有真正将它用作运算符(我们将它用作类型运算符,这是不同的)。