【问题标题】:Does individual array elements decay to pointer?单个数组元素是否衰减为指针?
【发布时间】:2016-10-25 10:40:59
【问题描述】:

我知道数组会衰减为指针。结果,因为它的行为类似于指针,所以它本质上可以传递给带有需要内存地址的参数的函数,而无需使用与号。例如:

char name[10];
scanf("%s", name);

是正确的。

但是,假设我只想填写'name'数组的第一个元素,为什么不能写成

scanf("%c", name[0]);

但必须在 'name[0]' 前面加上 & 号?这是否意味着单个数组元素不会衰减为指针并且不保存它们的单个内存地址,而不是它们的整个数组对应物?

【问题讨论】:

  • name[0]如果返回数组的第一个元素的值,怎么能衰减为指针????...
  • 啊,我从来没有想过数组元素返回值而不是内存地址,因此不是指针作为解释。谢谢!
  • @TruthOrDare 也许你应该看看Array of Pointers

标签: c arrays pointers addressof


【解决方案1】:

数组在作为函数参数而不是数组元素传递时衰减为指向第一个元素的指针。

引用 C11,第 §6.3.2.1/p3 章,左值、数组和函数指示符,(强调我的

除非它是sizeof 运算符、_Alignof 运算符或 一元 & 运算符,或者是用于初始化数组的字符串文字,具有的表达式 type ''array of type'' 被转换为一个类型为 ''pointer to type'' 的表达式,它指向 到数组对象的初始元素并且不是左值。

数组元素不是数组类型,数组变量是。换句话说,数组名称毕竟与 (ny) 数组元素不同。

因此,单个数组元素不会衰减为 pointer-to-anything-at-all,即使作为函数参数传递也是如此。

【讨论】:

  • 我只是好奇,Array 是衰减到指向其第一个元素的指针还是 Array name 衰减到指针?
【解决方案2】:

问题在于char name[10] 可以表现为char* name,这对于scanf 来说是可以的,它期望第二个参数是一个指针(内存中的地址)。但是当你写 name[0] 时,你得到的是值而不是指针。

例如,如果name"Hello world",那么name[0] == 'H'。但是scanf 想要一个指针。所以为了得到name[0]的地址,你需要写scanf("%c", &name[0])

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 2020-10-02
    • 2021-12-01
    相关资源
    最近更新 更多