我读到了;
虽然数组名称可以用作指针(在衰减到指针之后),但无法为其指定新值。试图让它指向别处是一个错误:
while (*a != 0) // a is of (int *) type
a++; //wrong
另一方面,当传递给函数时,数组名称始终被视为指针。函数调用
largest = largest_num(b, n) // b is an array of int
用于功能
int find_largest(int a[], int n)
{
....
....
}
将指向b
的第一个元素的指针分配给a
。
上面两个陈述(粗体)似乎是矛盾的。我很迷惑。
答案 0 :(得分:3)
在函数声明中,数组被视为你声明了一个指针,所以
int find_largest(int a[], int n) {
被处理为好像是
int find_largest(int *a, int n) {
所以a
是指针,而不是数组,并且没有矛盾。
因为它是一个指针,你可以重新分配a
,例如
a++;
是允许的。
答案 1 :(得分:2)
那里没有矛盾 - 你仍在使用指针(int
),并且仅为了方便而允许使用int a[]
符号。引用the comp.lang.c FAQ:
由于数组会立即衰减为指针,因此数组永远不会 实际上传递给了一个函数。你可以假装一个功能 接收一个数组作为参数,并通过声明来说明它 相应的参数作为数组:
void f(char a[])
从字面上解释,这个声明没有用,所以 编译器转过身来假装你写了一个指针 声明,因为这是函数实际上会收到的内容:
void f(char *a)
将类似数组的声明符转换为指针 仅在函数形式参数声明中,不在其他地方。如果 转换困扰你,你没有强迫使用 它;许多程序员已经得出结论认为它引起的混乱 超过声明“看起来像”的小优势 呼叫或功能中的使用。