是否可以为数组名称分配新值?

时间:2013-09-14 20:14:16

标签: c arrays function pointers arguments

我读到了;
虽然数组名称可以用作指针(在衰减到指针之后),但无法为其指定新值。试图让它指向别处是一个错误:

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
上面两个陈述(粗体)似乎是矛盾的。我很迷惑。

2 个答案:

答案 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)
  

将类似数组的声明符转换为指针   仅在函数形式参数声明中,不在其他地方。如果   转换困扰你,你没有强迫使用   它;许多程序员已经得出结论认为它引起的混乱   超过声明“看起来像”的小优势   呼叫或功能中的使用。