【问题标题】:Is it possible to pass a pointer to and array as a function parameter?是否可以将指针和数组作为函数参数传递?
【发布时间】:2012-08-29 01:25:10
【问题描述】:

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

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

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

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

【问题讨论】:

  • 当您将数组作为函数参数传递时,实际上您传递的是指向第一个元素的指针,因此您可以使用该指针从函数中修改数组。

标签: c arrays function pointers parameters


【解决方案1】:

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

// 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] 是未知的。

【讨论】:

    【解决方案2】:

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

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

    像你一样,或者

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

    【讨论】:

      【解决方案3】:

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

      我的建议是这样的:

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

      函数调用应该是:

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

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

      【讨论】:

      • elements 指定了数组长度,我意识到length 更清晰;谢谢。
      猜你喜欢
      • 2020-11-08
      • 1970-01-01
      • 2012-01-24
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      相关资源
      最近更新 更多