5

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

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

方括号 [] 运算符在 C 中确实只有一次使用吗?

4

2 回答 2

15

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

C11 §6.5.2.1 数组下标

约束

其中一个表达式应具有类型“指向完整对象类型的指针”,另一个表达式应具有整数类型,并且结果具有类型“类型”。

语义

后缀表达式后跟方括号[]中的表达式是数组对象元素的下标指定。下标运算符的定义[]E1[E2]相同(*((E1)+(E2)))。由于适用于二元+运算符的转换规则,ifE1是一个数组对象(相当于,一个指向数组对象的初始元素的指针)并且E2是一个整数,E1[E2]指定E2第一个元素E1(从零开始计数)。

于 2013-11-05T05:00:20.323 回答
7

它是否做“一件事”取决于你认为“一件事”是什么意思。

在 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++ 中我们可以重载这个运算符。但是有时您会[]在类型表达式中看到,但这可能不是您要问的,因为在这种情况下,我们并没有真正将它用作运算符(我们将它用作类型运算符,这是不同的)。

于 2013-11-05T05:05:03.797 回答