【问题标题】:how to pass array as function arguments in C?如何在C中将数组作为函数参数传递?
【发布时间】:2013-06-02 17:45:56
【问题描述】:

如何在 C 中将数组作为参数传递?

int a,b,c[10];
void Name1(int x, int y, int *z)
{
    a = x;
    b = y;
    c = z;
}

我尝试将它作为参数传递,但它没有构建,如何修复它?

void Name1(int x, int y, int *z); 的声明是否与void Name1(int x, int y, int z[]) 相同? void Name1(int x, int y, int z[]) 是否会被编译器视为void Name1(int x, int y, int *z);

【问题讨论】:

  • 你在看哪本书?
  • 数组不能作为参数传递、作为函数结果返回或赋值。阅读comp.lang.c FAQ 的第 6 节。

标签: c arrays arguments


【解决方案1】:

当您将数组作为参数传递给函数时,它会衰减为指向其第一个元素的指针。

所以,

void Name1(int x, int y, int *z)

会起作用的。
但是数组是不可分配的:

c = z;

不起作用,您需要将每个数组元素从源显式复制到目标。

【讨论】:

  • “将每个数组元素从源显式复制到目标”是什么意思?
  • "但是数组不可赋值...": true,除非你想存储指向数组的指针而不是复制。
  • @user2131316:假设您的示例中的c 将保存z 的元素的副本。在这种情况下,您必须在循环中手动将每个元素从z 复制到c。否则,只需将c 声明为int *,您就可以像上面那样将其设置为z。但请记住,对c 元素的任何更改都将反映在z 中。
  • @LogicalKnight ok,但是为​​什么如果 c 是数组,那么 z 不能分配给 c?
  • @user2131316 您可能想阅读 C 中的指针和数组。以下是一些可以开始的链接:12。我还忘了提到您的代码无效:您不能将 z 分配给 c(有关详细信息,请参阅第二个链接)。
【解决方案2】:

c = z;,你分配给一个非左值,这是不允许的。这就像在做&c[0] = &z[0];

【讨论】:

    【解决方案3】:

    这里有几个答案,但我认为其中任何一个都不够,所以...

    基本上,您可以复制数组或使用指针,但无论哪种方式,您都需要跟踪长度。

    int a,b, *c, len;
    
    void Name1(int x, int y, int *z, int z_len)
    {
        a = x;
        b = y;
        c = z;
        len = z_len;
    }
    
    //usage: 
    int arr[5];
    
    Name1(1,2,arr /* or &arr[0] ,*/, sizeof(arr )/ sizeof (int));
    

    如果您从不需要添加项目,这就足够了...如果您这样做会变得更加复杂...

    保持长度很重要,这样您就知道有多少元素,即使您要复制它们。

    【讨论】:

      【解决方案4】:
      c=z; is invalid
      

      c 指针没有内存来保存 z 地址。

      你可以说:

      int a,b,*c;    
      c=(int *)calloc(10,sizeof(int) );
      void Name1(int x, int y, int *z)
      {
        a = x;
        b = y;
        c = z;
      }
      

      【讨论】:

        猜你喜欢
        • 2010-10-01
        • 2016-06-12
        • 1970-01-01
        • 2015-09-26
        • 2020-02-10
        • 2016-10-27
        相关资源
        最近更新 更多