【问题标题】:I can't figure out the point about the array name我无法弄清楚数组名称的意义
【发布时间】:2019-08-01 14:38:39
【问题描述】:

我最近在这里发布了一些关于数组名称的问题。

感谢很多人,现在我知道数组名不是指针,也知道数组名是不可修改的l-value

我还有一个关于数组的问题。

  1. 有人告诉我,数组名被转换成数组第一个元素的地址。

所以我知道数组名称是这样返回的。

int arr[10];
arr == &arr[0];

但是如果是对的,那不就是一个l-value,因为返回的值是一个地址值吗?

我还是误会了吗?

【问题讨论】:

  • 左值是一个可能指定的值,即别名一个对象。指针不是它指向的对象的左值,您必须跟随指针,即取消引用它
  • arr 是一个左值。在许多情况下,它会衰减为指向它的第一个元素的指针,但它是一个左值。
  • 您不能更改&arr[0](即arr = NULL; 是非法的)。可以更改地址&arr[0]的内容(即*(&arr[0]) = 42;(同arr[0] = 42;*arr = 42;

标签: c arrays implicit-conversion rvalue unary-operator


【解决方案1】:

有人告诉我,数组名被转换成数组第一个元素的地址。

这适用于对出现数组标识符的表达式求值的一部分,并且有一些例外。

所以我知道数组名称是这样返回的。

int arr[10];
arr == &arr[0];

自动转换为指针 -- 当它发生时 -- 类似于您的表达式 &arr[0](实际上首先取决于该转换),但它是不正确的将其视为在声明数组时立即永久执行的转换。数组的标识符标识数组,而不仅仅是它的地址或它的第一个元素。特别是,此处自动转换为指针因子的例外情况,尤其是如果arr 是数组的标识符,则sizeof(arr) 计算为该数组的大小,而不是指针的大小。

但如果是对的,那不是因为返回值是地址值,而是左值吗?

这是正确的。数组的标识符是左值的原因是它指定了数组。

【讨论】:

    【解决方案2】:

    根据 C 标准(6.3.2 其他操作数)

    1. ... 可修改的左值是没有数组类型的左值,不 有一个不完整的类型,没有一个 constqualified 类型,如果是结构体或联合体,则没有 任何成员(包括,递归地,所有的任何成员或元素 包含聚合或联合)具有 const 限定类型。

    3 除非它是 sizeof 运算符的操作数或一元 & 运算符,或者是用于初始化数组的字符串文字, 具有“类型数组”类型的表达式被转换为 类型为“pointer to type”的表达式,指向初始 数组对象的元素并且不是左值。如果数组对象 有注册存储类,行为未定义。

    因此这个表达式语句

    arr == &arr[0];
    

    看起来像

    &arr[0] == &arr[0];
    

    并根据此引用(6.5.3.2 地址和间接运算符)

    3 一元 & 运算符产生其操作数的地址....和 ​​ 结果不是左值

    就是在这个表达式语句中

    arr == &arr[0];
    

    int[10] 类型的不可修改左值被隐式转换为指向其第一个元素(即int * 类型)的指针,从而获得一个右值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 2011-09-15
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      相关资源
      最近更新 更多