【发布时间】:2014-01-03 12:17:56
【问题描述】:
如果不是,那么通过指针执行此操作的正确方法是什么? 例如,我给函数一个二维数组,然后我以线性方式融合它们。
【问题讨论】:
-
Hundreds..数千个重复..见右边的相关问题。
如果不是,那么通过指针执行此操作的正确方法是什么? 例如,我给函数一个二维数组,然后我以线性方式融合它们。
【问题讨论】:
在 C 中,数组不能是函数参数或函数返回类型。
当您需要数组参数时,您通常会传递一个指向某个数组元素的指针以及有关从该点可用的元素数量的附加信息(或者,很少是指向数组本身的指针);因此,该函数可以访问原始数组元素。 (C 中的声明语法为此提供了可视化指南;当您将函数参数声明为具有 T[] 类型时,这意味着它具有 T * 类型。)
返回比较困难,因为您需要决定是创建一个新数组还是就地修改现有数组。由于创建新数组会产生非本地所有权责任,因此最好由函数不创建此责任,而是要求调用者已经通过可变指针提供输出数组。 p>
这是一个例子;添加两个数组的函数:
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 with %m 格式:产生新的数组(解析的输入数据),调用者继承责任。
【讨论】:
是的,您可以在 C 中返回数组。但是,语法与其他基于 C 的语言不同。 在 C 中你不能这样写:
int[] foo();
您要做的是了解数组变量是指向数组第一项的指针。因此,您的函数将如下所示:
int* foo();
二维数组是数组的数组。你可以这样写:
int** foo();
我希望这是有道理的。
【讨论】:
char ar[21]; int x = sizeof(ar) 中,x 的值为 21。如果数组变量 ar 是指针,则 x 的值将类似于 4 或 8 等。
这就是指针的用途:)
void myfunction(int * ptr)
{
ptr[0] = 5;
ptr[1] = 6;
etc...
}
然后在您的代码中:
int array[10];
myfunction(array);
now array[0] contain 5
【讨论】: