如果没有,通过指针做到这一点的正确方法是什么? 例如,我给函数一个二维数组,然后我以线性方式融合它们。
答案 0 :(得分:3)
在C中,数组不能是函数参数或函数返回类型。
当您需要数组参数时,通常会将指针传递给某个数组元素以及有关该点可用元素数量的附加信息(或者很少是指向数组本身的指针);因此,该函数可以访问原始数组元素。 (C中的声明语法为此提供了可视指南;当您将函数参数声明为类型T[]
时,这意味着它具有类型T *
。)
返回更难,因为您需要决定是创建新数组还是就地修改现有数组。由于创建新数组会产生非本地所有权责任,因此最好使用函数而不是来创建此责任,而是要求调用者通过可变指针提供输出数组。
这是一个例子;一个添加两个数组的函数:
int * add(int const * a, int const * b, size_t len, int * out)
{
for (size_t i = 0; i != len; ++i)
out[i] = a[i] + b[i];
return out; // returning the destination is traditional more than useful
}
最后,如果将它们包装在结构中,则可以按值传递数组:
struct Foo { int data[10]; }
struct Foo add(struct Foo a, struct Foo b)
{
struct Foo result;
for (size_t i = 0; i != 10; ++i)
result.data[i] = a.data[i] + b.data[i];
return result;
}
以下是一些流行平台和关于如何处理数组的标准库的示例:
strcpy
,memcpy
:将一个数组复制到另一个数组中;来电者提供目的地
strdup
:复制数组,分配新数组,调用者继承责任。
strtok
:返回给定数组的子数组;就地修改给定的数组。
scanf
格式的 %m
:生成新数组(已解析的输入数据),调用者继承责任。
答案 1 :(得分:0)
这就是指针的用途:)
void myfunction(int * ptr)
{
ptr[0] = 5;
ptr[1] = 6;
etc...
}
然后在你的代码中:
int array[10];
myfunction(array);
now array[0] contain 5
答案 2 :(得分:0)
是的,您可以在C中返回数组。但是,语法与其他基于C的语言不同。 在C中你不能写这样的东西:
int[] foo();
您需要做的是理解数组变量是指向数组第一项的指针。所以,你的功能看起来像这样:
int* foo();
2D数组是一个数组数组。你会这样写:
int** foo();
我希望这是有道理的。