[英]Does individual array elements decay to pointer?
我知道数组会衰减到指针。 结果,由于它的行为就像一个指针,因此实际上可以将其传递给带有需要内存地址的参数的函数,而无需使用“&”号。 例如:
char name[10];
scanf("%s", name);
是正确的。
但是,假设我只想填写“名称”数组的第一个元素,为什么不能将其写为
scanf("%c", name[0]);
但必须在“名称[0]”前面加上“&”号吗? 这是否意味着单个数组元素不会衰减到指针,并且不保存其单独的内存地址,而不是整个数组副本?
作为函数参数传递时, 数组会衰减到指向第一个元素的指针,而不是数组元素 。
引用C11
,第§6.3.2.1/ p3章,左值,数组和函数指示符,( 重点是我的 )
除非它是
sizeof
运算符,_Alignof
运算符或一元&
运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为“ array of type”的表达式转换为带有键入“指向类型的指针” ,它指向数组对象的初始元素,而不是左值。
数组元素不是数组类型 ,数组变量是。 换句话说,毕竟数组名与a(ny)数组元素不同。
因此,即使作为函数参数传递,单个数组元素也不会衰减到所有对象的指针 。
问题在于char name[10]
可以充当char* name
,这对于scanf
是可以的,它期望第二个参数是一个指针 (内存中的地址)。 但是,当您写入name[0]
您得到的是值而不是指针。
例如,如果name
是"Hello world"
则name[0] == 'H'
。 但是scanf
一个指针。 因此,为了获取name[0]
的地址,您需要编写scanf("%c", &name[0])
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.