单个数组元素是否会衰减到指针?

时间:2016-06-23 08:15:01

标签: c arrays pointers addressof

我知道数组会衰减到指针。因此,因为它的行为类似于指针,它实际上可以传递给具有需要内存地址的参数的函数,而无需使用符号。例如:

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

是对的。

但是,让我们说如果我只想填写'name'数组的第一个元素,为什么我不能把它写成

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

但是必须用'name [0]'前面的&符编写它?这是否意味着单个数组元素不会衰减到指针并且不保存它们各自的内存地址而不是它们的整个数组对应物?

2 个答案:

答案 0 :(得分:1)

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

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

  

除非它是sizeof运算符,_Alignof运算符或者&运算符的操作数。   一元SELECT Stock.id, Stock.Name, Stock.size, (Stock.Qty - Sale.Qty) AS Qty FROM Stock INNER JOIN Sale ON Sale.id = Stock.id 运算符,或者是用于初始化数组的字符串文字,具有的表达式   type ''类型'' 的数组转换为类型''指向类型''指针的表达式   到数组对象的初始元素,而不是左值。

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

因此,即使作为函数参数传递,单个数组元素也不会衰减到指向任何东西的指针

答案 1 :(得分:1)

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

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