我最初认为它对指针和数组有不同的用途。在前一种情况下,它将括号中的任何内容添加到指针,然后取消引用总和;在后一种情况下,它只会产生数组的第i个元素。
然后我意识到数组变量返回指向第一个元素的指针,因此操作符在每种情况下都做同样的事情:偏移和解除引用。
支架[]操作符确实只能在C中使用一次吗?
答案 0 :(得分:10)
[]
被称为数组下标运算符,但在语法上它用于指针。数组将转换为指向此用法中的第一个元素的指针(以及许多其他元素)。所以,是的,[]
对于数组和指针是相同的。
C11§6.5.2.1数组下标
<强>约束强>
其中一个表达式的类型''指向完整的对象类型'',另一个 expression应具有整数类型,结果类型为''type''。
<强>语义强>
后缀表达式后跟方括号
[]
中的表达式是下标 指定数组对象的元素。下标运算符[]
的定义 是E1[E2]
与(*((E1)+(E2)))
相同。由于转换规则 应用于二进制+
运算符,如果E1
是数组对象(等效地,指向数组对象的初始元素的指针)并且E2
是整数,E1[E2]
指定E2
的{{1}}个元素(从零开始计数)。
答案 1 :(得分:5)
它是否“一件事”取决于你认为“一件事”的含义。
在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]
数组或指针。两件事情?并不是的。你知道当我们使用plus运算符时,其中两个操作数之一是“数组”,你实际上是在做指针运算。
你的问题的第二部分 - 它可以用于除指针算术以外的东西 - 在C中基本上没有,但是在C ++中是的,因为在C ++中我们可以重载这个运算符。但是有时您会在类型表达式中看到[]
,但这可能不是您所要求的,因为在这种情况下,我们并没有真正将它用作运算符(我们将它用作类型运算符,这是不同的。)