c - 我无法弄清楚数组名称的意义

标签 c arrays implicit-conversion rvalue unary-operator

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

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

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

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

所以我理解数组名是这样返回的

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

但如果它是正确的,它不是一个l-value,因为返回的值是一个地址值吗?

我还是误会了吗?

最佳答案

I was told that the array name is converted into the address of the first element of the array.

这适用于出现数组标识符的表达式求值的一部分,并且有少数异常(exception)。

So I understand that the array name is returned like this.

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

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

But if it is right, isn't it an l-value because the returned value is an address value?

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

关于c - 我无法弄清楚数组名称的意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57311489/

相关文章:

C程序打印不规则星形图案

c++ - 省略号函数参数的字节大小

javascript - "Aw, Snap!"和 ASR : No room in socket buffer errors in Chrome

c - unsigned char 的大小是 8 位,但为什么我可以将它(向左或向右)移动 31 位或最多 31 位?

c - 运行 lex 和 yacc 时出现语法错误

C 预期输出失败

c++ - 以随机可再现顺序生成非重复字节的快速方法

arrays - 在 CUDA 内核中搜索有序数组

c# - 无法将 Type<Food> 隐式转换为 My Type<IFood>

scala - 使用 scala 提取器将 String 转换为 Int