什么时候数组名、常量或指针?

什么时候数组名、常量或指针?

数组在函数中衰减为指针。数组名为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页;

相关推荐