【问题标题】:Why can I assign a value to an array in one case, but not in another?为什么我可以在一种情况下为数组赋值,而在另一种情况下不能?
【发布时间】:2021-12-30 16:44:07
【问题描述】:
#include<stdio.h>

void func(int a[10]);

int main(void) {
    int arr[10];
    func(arr);
    return 0;
}

void func(int a[10]) {
    int b[10], x=5;
    a =&x;
    b =&x; //error: assignment to expression with array type
}

在此处提到的此 C 代码中,b=&amp;x 存在错误,因为分配给具有数组类型的表达式 但为什么不使用a=&amp;x 毕竟afunc 的数组?

【问题讨论】:

  • 数组衰减为从数组头地址开始的指针。尽管您可以像数组一样对其进行迭代,但由于实际内存地址仍然保存数据,因此类型已经衰减,因此会遇到打字问题。

标签: arrays c function


【解决方案1】:

因为a 不是一个数组(尽管表面上类似的声明),它是一个指针。您不能在 C 中将函数的参数声明为数组,如果这样做,编译器会默默地将它们更改为您的指针。

【讨论】:

    【解决方案2】:

    在函数原型中

    void func ( int a[10] )
    

    数组 a decays 指向一个指针,因为在 C 中,您不能将数组作为函数参数传递。因此它等价于:

    void func( int *a )
    

    打电话时

    func(arr);
    

    在函数main中,数组arr将衰减为指向数组第一个元素的指针,即指向&amp;arr[0]

    因此,这条线

    a =&x;
    

    是有效的,因为a 不是数组,而只是一个指针,并且允许为指针分配新地址。

    但是,行

    b =&x;
    

    无效,因为b 是一个真正的数组,你不能为整个数组赋值(你只能为它的单个元素赋值)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2019-11-02
      相关资源
      最近更新 更多