是否可以将指针和数组作为函数参数传递?

时间:2012-08-29 01:25:11

标签: c arrays function pointers parameters

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

首先我考虑将这些数组作为参数传递给函数,因为我没有找到在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

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

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

3 个答案:

答案 0 :(得分: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]实际上是*(first[N]),因此无法轻松完成。数组访问实际上是指针算术的外观,*(first + sizeof first[0] * N);但是,这里有一个不完整的元素类型 - 你需要指定数组的大小,否则sizeof first[0]是未知的。

答案 1 :(得分:1)

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

void do_stuff(int first[], int second[], int elements) {}
像你一样,或

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

答案 2 :(得分:0)

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

我的建议是这样的:

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

函数调用应该是:

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

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