通过值传递数组

时间:2013-10-12 12:34:49

标签: c

通过传递值来调用函数时遇到问题,这里是测试代码

#include <stdio.h>

void sample(int b[3][2])
{
  int t;
  for(t=0;t<3;t++)
  {
    printf("value is =%d\n",b[t][0]);
  }
}

int main()
{

  int d[3][2]={(2,3),(4,2),(5,2)};

  sample(d[3][2]);
}

我收到一个错误,说引用类型应该是(*)[2]而不是'int'。什么是正确的方法?

5 个答案:

答案 0 :(得分:3)

您无法在C中按值传递数组:数组按地址传递。如果要按值传递数组,请将其包装在struct

struct with_array {
    int b[3][2];
};
void sample(struct with_array s) {
    ...
}
int main() {
    struct with_array arg = {.b = {{2,3},{4,2} ,{5,2}}};
    sample(arg);
}

P.S。如果您不需要传递值,您的方法也可以修复。您需要在初始化时遵循正确的语法,并将整个数组传递给sample,而不是访问其中一个元素(这也超出了数组的范围)。

答案 1 :(得分:1)

使用:

sample(d);

而不是:

sample(d[3][2]);

d[3][2]只是数组元素的值,而这不是你想要传递的。

此外:

int d[3][2]={(2,3),(4,2),(5,2)};

这不是初始化数组的方式。

int d[3][2]={{2, 3}, {4,2}, {5, 2}};

是正确的方法。

答案 2 :(得分:1)

您可以在struct中包装数组,也可以使用指向数组的指针。

#include <stdio.h>

void sample(int (*b)[3][2])
{
  for (int t = 0; t < 3; t++)
  {
    for (int i = 0; i < 2; i++)
    {
        printf("%d\n", (*b)[t][i]);
    }
  }
}

int main(void)
{

  int d[3][2]={{1,2}, {3,4}, {5,6} };

  sample(&d);
}

顺便说一下,你的代码有bug int d[3][2]={(2,3),(4,2),(5,2)};这里(2,3)是一个逗号表达式,它产生3 - 这不是一个数组。

答案 3 :(得分:0)

d[3][2]指向数组d中不存在的元素。使用:

sample(d);

答案 4 :(得分:0)

编译器解释

void sample(int b[3][2])  

as

void sample(int (*b)[2]) 

((这背后的原因是数组衰减成指针一次,它不会递归发生。数组数组会衰变成指向数组的指针。)

d类型的int (*)[2]通行证。

sample(d);  

而不是传递类型为d[3][2]的{​​{1}},而且此数组元素也不在数组范围内。