通过传递值来调用函数时遇到问题,这里是测试代码
#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'。什么是正确的方法?
答案 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}},而且此数组元素也不在数组范围内。