【问题标题】:Is it possible to assign a new value to an array name?是否可以为数组名称分配新值?
【发布时间】:2013-09-19 07:17:13
【问题描述】:

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

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
以上两个陈述(粗体)在我看来是矛盾的。我很迷惑。

【问题讨论】:

  • a 是指针而不是数组 @find_largest(int a[], int n)
  • @GrijeshChauhan; a[] 不是 find_largest() 的局部变量吗?
  • 当你将函数参数声明为数组类型时,编译器基本上只会说“去你的,这是一个指针”。它作为一个数组的身份完全丢失了。在我看来,语言上有很大的缺陷。
  • @hacks 是的,'局部变量。
  • @hacks:无。我从不这样做。即使对于main,有些人出于某种原因更喜欢这个签名:int main(int argc, char *argv[])——我不知道为什么。应该是int main(int argc, char** argv)

标签: c arrays function pointers arguments


【解决方案1】:

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

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

按原样处理

int find_largest(int *a, int n) {

所以a是一个指针,不是一个数组,没有矛盾。

由于是指针,可以重新赋值a,例如

a++;

是允许的。

【讨论】:

  • 表示声明int a[]后内存中没有分配空间?
  • 这正是它被这样对待的原因。
  • 是的,空间是为指针分配的,但不是为数组分配的。它只是接收一个指向调用者数组的指针。
  • 不,它在函数内部用作指针。它被完全视为您已将其声明为指针,而不是数组。
  • 实际上恰恰相反。 a[i] 是一个指针表达式,它等价于*(a+i)。您可以写b[i],因为数组b 在此上下文中衰减为指针。这实质上意味着您可以将[] 与数组和指针一起使用。
【解决方案2】:

这里没有矛盾 - 您仍在使用指针(指向int),并且int a[] 表示法只是为了方便而允许使用。引用the comp.lang.c FAQ:

由于数组立即衰减为指针,因此数组永远不会 实际上传递给一个函数。你可以假装一个函数 接收一个数组作为参数,并通过声明 对应的参数为数组:

void f(char a[])

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

void f(char *a)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多