什么时候数组变量被认为是指针,什么时候它被认为是C中的简单数组?例如,有时 sizeof(array_variable) 运算符返回地址大小,有时返回数组的大小。
4 回答
C 2011 (N1570) 6.3.2.1 3:
除非它是sizeof运算符、_Alignof 运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为 ''array of type '' 的表达式将转换为具有type ''pointer to type '' 指向数组对象的初始元素并且不是左值。如果数组对象具有寄存器存储类,则行为未定义。
C 2011 (N1570) 6.7.6.3 7:
将参数声明为 ''array of type '' 应调整为 ''qualified pointer to type '',其中类型限定符(如果有)是在数组类型派生的[和]中指定的那些。
在函数参数中,数组 ( []
) 或[...]
) 等价于指针 ( *
)。对于和也是sizeof(myarg) == sizeof(void*)
如此。void f(char *myarg);
void f(char myarg[]);
void f(char myarg[42]);
在全局变量和局部变量中,数组不同于指针。sizeof(...)
反映了这种差异。
数组总是可以自动转换为指针(但不能反过来),并且使用第一个元素的地址,即ary
转换为&ary[0]
.
始终将其视为指针。当你使用不带索引的数组名时,它会给出数组的基地址。当您使用带有 index 的数组名称时,它将被视为 *(array name + index) 。它给出了基地址的第 index 个元素。*array 表示第一个元素。
数组变量的名称始终是一个指针。sizeof()
如果应用于数组变量,它会返回数组的大小。