2

在 Nick Parlante 的文档中,它说,数组名称是常量,即数组基地址的行为类似于 const 指针。

例如

{
    int array[100], i;
    array = NULL; //cannot change base address
    array = &i; // not possible
}

但同时为什么这是有效的:

void foo(int arrayparm[]){

    arrayparm = NULL; // says it changes the local pointer
}
4

4 回答 4

3

函数参数声明不同于正式声明是 C,在函数声明中:

void foo(int arrayparm[])
             ^^^^^^^^^ is pointer not array 

arrayparm是指针而不是数组,它的类型是int*. 这相当于:

void foo(int *arrayparm)

在功能foo中您可以修改arrayparm.

而在正式声明中(在侧函数中),例如

int array[100];

array不是指针,但它是一个常量,它是类型char[100],它是不可修改的左值。

于 2013-10-18T04:52:18.167 回答
2

数组衰减为函数中的指针。数组名称是non-modifable lvalue. 这意味着,您可以这样做:

int x=10,y=20;
int *p = &x;  // <---- p Now points to x
p = &y; // <---- p Now points to y

不是这个:

int arr[10], x=10;
arr = &x; // <-----  Error - Array name is a non-modifiable lvalue.

由于数组立即衰减为指针,因此数组从未真正传递给函数。为方便起见,任何“看起来像”数组的参数声明,例如

f(a)
char a[];

编译器将它们视为指针,因为这是传递数组时函数将接收的内容:

f(a)
char *a;

这种转换只在函数形式参数声明中有效,在其他任何地方都没有。如果这种转换困扰您,请避免它;许多人得出的结论是,它引起的混乱超过了声明“看起来像”调用和/或函数内的使用的小优势。

参考文献:K&R I Sec. 5.3 页。95,秒。A10.1 页。205; K&R II 秒。5.3 页。100,秒。A8.6.3 页。218,秒。A10.1 页。226;

于 2013-10-18T04:52:10.383 回答
1

当数组名称作为函数参数传递时,它“衰减”为指针。所以你可以把它当作一个普通的指针。

参考:C 常见问题解答 C中的“指针和数组等价”是什么意思?

于 2013-10-18T04:52:54.247 回答
0

数组类型在 C 中是不可分配的。这只是一个设计决定。(可以使数组类型的分配将一个数组复制到另一个数组上,就像分配结构一样。他们只是选择不这样做。)

C99 标准,6.5.16 第 2 段:

赋值运算符应具有可修改的左值作为其左操作数。

C99 标准,6.3.2.1 第 1 段:

...可修改的左值是没有数组类型的左值,...

另外,即使数组类型是可分配的,NULL也不是 type 的值int[100]

于 2013-10-19T03:58:15.737 回答