0

我在运行时创建了两个整数数组(大小取决于程序输入)。在某些时候,我需要用另一个做一些计算的内容来更新一个数组的内容。

首先,我考虑将这些数组作为参数传递给函数,因为我没有找到在 C 中返回函数的方法(不认为这是可能的)。在意识到这是一个坏主意后,因为参数在被复制到堆栈时无法真正修改,所以我改用数组指针。

虽然该函数仍然是空的,但这是我拥有的代码:

第一次拍摄(代码编译,没有错误):

// Elements is just to be able to iterate through their contents (same for both):
void do_stuff(int first[], int second[], int elements) {}

// Call to the function:
do_stuff(first, second, elements);

第二次,尝试转换为能够修改数组的指针:

void do_stuff(int *first[], int *second[], int elements) {}

// Call to the function:
do_stuff(&first, &second, elements);

这段代码导致了一些正当的编译时错误,因为显然我认为指向数组的指针是指针数组。

第三次,我认为这是正确的语法:

void do_stuff(int (*first)[], int (*second)[], int elements) {}

// Call to the function:
do_stuff(&first, &second, elements);

当尝试访问数组的元素(例如*first[0])时,此代码仍然会产生编译时错误:

error: invalid use of array with unspecified bounds

所以我的问题是关于使用数组指针作为函数参数的可能性,这可能吗?如果是这样,怎么可能做到?

无论如何,如果您在执行涉及第二个内容的计算后想到更新第一个数组的更好方法,请对此发表评论。

4

3 回答 3

2

数组衰减为指向为数组分配的数据的指针。数组在传递给函数时不会复制到堆栈中。因此,您不需要将指针传递给数组。所以,下面应该可以正常工作。

// Elements is just to be able to iterate through their contents (same for both):
void do_stuff(int first[], int second[], int elements) {}

// Call to the function:
do_stuff(first, second, elements);

您第二次尝试时出错的原因是因为int *first[](以及其他喜欢它的人)实际上是指向 int 的指针数组类型。

你的第三个错误的原因是因为*first[N]is 实际上*(first[N]),这不能轻易完成。数组访问实际上是指针算术的门面,*(first + sizeof first[0] * N); 但是,这里的元素类型不完整——需要指定数组的大小,否则sizeof first[0]未知。

于 2012-08-29T01:27:42.357 回答
1

你的第一次尝试是正确的。在 C 中将数组作为参数传递时,实际上传递的是指向第一个元素的指针,而不是数组的副本。所以你可以写

void do_stuff(int first[], int second[], int elements) {}

像你一样,或者

void do_stuff(int *first, int *second, int elements) {}
于 2012-08-29T01:28:35.400 回答
0

在 C 中,数组会自动衰减为指向数据的指针,因此,您只需传递数组及其长度即可获得所需的结果。

我的建议是这样的:

void dostuff(int *first, int firstlen, int *second, int secondlen, int elements)

函数调用应该是:

 do_stuff(first, firstlen, second, secondlen, elements);

我不是很清楚你的问题,为什么你需要elements. 但是,您必须传递数组长度,因为数组在传递给函数时会自动衰减为指针,但是,在被调用的函数中,无法确定它们的大小。

于 2012-08-29T01:31:08.567 回答