【问题标题】:Does the bracket [] operator only have a single use?方括号 [] 运算符是否只有一次使用?
【发布时间】:2013-11-05 04:52:48
【问题描述】:

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

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

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

【问题讨论】:

  • 这就像在说“+ 运算符只有 一个 用途吗?它所做的只是 添加 东西”。
  • 我问的原因有两个:1)我不确定我的观察是否准确(声称它对指针和数组具有相同的功能)和 2)也许它用于其他我不知道的事情(例如 *)。

标签: c arrays pointers


【解决方案1】:

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

C11 §6.5.2.1 数组下标

约束

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

语义

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

【讨论】:

  • +1 这是正确的。为了解决 OP 的核心问题,[] 总是对指针和整数进行操作(按任意顺序,顺便说一句)。永远不会涉及数组,因为在计算 [] 运算符时,数组名称的任何实例都已经“衰减”为指针。
  • 有趣的事实,array[offset] == offset[array] 是真的。
  • 但是,当 ptr 是指向数组元素零的指针并且 j 是某个偏移索引值时,使用 *(ptr+j) = somevalue 是否正确且正确?似乎工作得很好,但它是正确的吗?
  • @paullanken 只要元素在数组范围内,就是正确的。
  • @WuschelbeutelKartoffelhuhn 没错,如果ptrint * 类型,那么ptr + 1ptr 之后指向4 个字节,假设int 是4 个字节。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-10-16
    • 2022-01-16
    • 2020-04-28
    • 2012-05-08
    • 1970-01-01
    • 2017-08-15
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多