数组在函数中衰减为指针。数组名为non-modifable lvalue。意思是,你可以这样做:
代码语言:javascript运行复制int x=10,y=20;
int *p = &x; // <---- p Now points to x
p = &y; // <---- p Now points to y但是并没有这个:
代码语言:javascript运行复制int arr[10], x=10;
arr = &x; // <----- Error - Array name is a non-modifiable lvalue.由于数组会立即衰减为指针,因此数组永远不会实际传递给函数。为了方便起见,任何“类似”数组的参数声明,例如,
代码语言:javascript运行复制f(a)
char a[];编译器将它们视为指针,因为如果传递数组,则该函数将收到:
代码语言:javascript运行复制f(a)
char *a;这种转换只适用于函数形式的参数声明,而不是其他任何地方。如果这种转换困扰您,请避免它;许多人的结论是,它所造成的混淆超过了声明“看起来像”调用和/或函数中的用途这一小优势。
参考资料: K&R I Sec。5.3第95页,证券交易委员会。A10.1第205页;K&R II Sec。5.3第100页,证券交易委员会。A8.6.3第218页,证券交易委员会。A10.1,第226页;