int a[] = {1, 2 ,3};
我知道数组名称会转换为指针。经常使用的术语是它们衰减到指针。
但是对我来说,apointer
是一个内存区域,它将地址保存到另一个内存区域,因此:
int *p = a;
可以这样绘制:
----- -----
p ---------> a[0]. .....
----- -----
0x1 0x9
但是a
它本身并不指向内存的另一个区域,而是内存本身的区域。因此,当编译器将其转换为指针时,是否将其保存(如p
)在内存中的某个位置,或者是隐式转换?
“但是
a
它本身并不指向存储器的另一个区域,而是存储器本身的区域。“因此,当编译器将其转换为指针时,它是否将其保存(例如
p
)在内存中的某个位置,或者是隐式转换?”
这是一个隐式转换。编译器未实现在内存中创建单独的指针对象(您可以用任何方式为其分配不同的内存地址)以保存第一个元素的地址。
标准状态(强调我的):
“除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为“ array of type”的表达式将转换为类型为“ pointer to type”的表达式“它指向数组对象的初始元素,而不是左值。如果数组对象具有寄存器存储类,则行为未定义。”
资料来源:ISO / IEC 9899:2018(C18),6.3.2.1/4
该数组将转换为指针类型的表达式,而不是lvalue
。
编译器只是计算a
至&a[0]
(指针a[0]
)。
“我知道数组名称会转换为指针。”
数组并不总是转换为指向其第一个元素的指针。请看上面报价的第一部分。Fe用作时&a
,a
不会衰减为其第一个元素的指针。而是获得指向整个数组的指针int (*)[3]
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句