0

我读到了;
尽管数组名可以用作指针(衰减为指针后),但无法为其分配新值。试图让它指向其他地方是一个错误:

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)
{

   ....
   ....

}

导致指向要分配给的第一个元素的指针ba
以上两个陈述(粗体)在我看来是矛盾的。我很困惑。

4

2 回答 2

3

在函数声明中,数组被视为你声明了一个指针,所以

int find_largest(int a[], int n) {

被处理就好像它是

int find_largest(int *a, int n) {

指针也是如此a,而不是数组,并且没有矛盾。

由于它是一个指针,您可以重新分配a,例如

a++;

被允许。

于 2013-09-14T20:19:55.557 回答
2

那里没有矛盾 - 您仍在使用指针 (to int),并且int a[]仅为了方便起见才允许使用符号。引用comp.lang.c 常见问题解答

由于数组立即衰减为指针,因此数组从未真正传递给函数。您可以假设一个函数接收一个数组作为参数,并通过将相应的参数声明为数组来说明它:

void f(char a[])

从字面上解释,这个声明没有用,所以编译器转过身来假装你写了一个指针声明,因为这是函数实际上会收到的:

void f(char *a)

这种将类似数组的声明符转换为指针的方法仅适用于函数形式参数声明,其他任何地方都没有。如果转换困扰您,您不会被迫使用它;许多程序员得出的结论是,它造成的混乱超过了声明“看起来像”函数内的调用或使用的小优势。

于 2013-09-14T20:16:31.580 回答