【问题标题】:How do you pass an array to a function like this: void fooboo(char array[i]);如何将数组传递给这样的函数: void fooboo(char array[i]);
【发布时间】:2017-09-17 23:00:00
【问题描述】:

我试图准确理解这段代码想要完成的任务。给出了函数中位数,但我添加了 main 函数和 typedef/prototypes 以努力理解它的作用,方法是将一些东西传递给函数。但是,我可以弄清楚将什么或如何传递给它。我知道该功能是某种形式。我真正需要知道的是传递给函数的究竟是什么? N索引的数组?

感谢您的指导!

#include <stdio.h>
#include <stdlib.h>

typedef unsigned char pix_t;
pix_t median(pix_t window[N]);

int main() {

    pix_t window[] = { 4, 3, 2, 1 };
    pix_t output;
    output = median(window[N]);

}

pix_t median(pix_t window[N])
{
    pix_t t[N], z[N];
    int ii, k, stage;

    // copy locally
    for (ii = 0; ii<N; ii++) z[ii] = window[ii];

    for (stage = 1; stage <= N; stage++) {
        k = (stage % 2 == 1) ? 0 : 1;
        for (ii = k; ii<N - 1; ii++) {
            t[ii] = MIN(z[ii], z[ii + 1]);
            t[ii + 1] = MAX(z[ii], z[ii + 1]);
            z[ii] = t[ii];
            z[ii + 1] = t[ii + 1];
        }
    }

    return z[N / 2];
}

【问题讨论】:

  • 不确定我是否只是想念它,但N 是在哪里定义的?似乎它甚至都无法编译。
  • 另外,median 函数需要一个 pix_t 数组,但您发送的是单个标量值。

标签: c arrays function parameter-passing function-calls


【解决方案1】:

给定函数签名

pix_t median(pix_t window[N])

类似的电话

median(window[N]);

错了。该函数需要一个 pix_t 数组,其中至少包含 N 元素注意,而您只传递了一个 pix_t 类型的变量。

故事的士气:: 遇到混乱时,检查数据类型

函数应该用数组调用,比如

#define N 10                                    //any number

int main(void) {                               //note the change

    pix_t window[N] = { 4, 3, 2, 1 };
    pix_t output;
    output = median(window);                   //passing the array
}

应该这样做。


注意点:尽管函数签名中使用了数组表示法

 pix_t median(pix_t window[N]) { //....

在函数内部,window 不是一个数组。引用C11,第 §6.7.6.3 章

将参数声明为‘‘数组类型’’应调整为‘‘限定指针 type'',其中类型限定符(如果有)是在 [] 的 数组类型推导。 [....]


注意:

我真正需要知道的是传递给函数的究竟是什么? N 索引的数组?

“至少N个元素”的意思是指保证数组有足够的存储空间来容纳N元素直到位置N-1,而不是索引NN+1、@987654337 @、... 有效/可寻址。

您可以将其解读为:“我保证有至少 N 个单元格的存储空间,以便我可以将 大多数 N 元素存储在N-1 有效职位。”

但是,程序员有责任手动跟踪这些详细信息,以避免索引到无效位置并导致分段错误;环境不会自动为您执行此操作。

【讨论】:

  • “该函数需要一个至少包含 N 个元素的 pix_t 数组”。这看起来不正确。 最多N-1元素; “至少”则意味着您可以索引NN+1 等,这只是段错误。
  • @ray 我不确定。我读起来就像“保证指针至少允许N-1 有效索引”,尽管这是由程序员强制执行的,而不是标准。
  • 我想我明白你的意思,但你至少可以澄清一下“至少”是作为可索引空间的保证,而不是像“至少X-1”那样,所以可以安全地索引到 XX+1 等"
  • @ray 当然,感激不尽!
  • 感谢您提供详细的 cmets。我是 C 编程新手,我觉得这篇文章对我有很大帮助。保重:)
【解决方案2】:

使用window[N],您将单个元素 传递给函数。索引为N 的元素。其中,取决于 N 的值可能超出范围。

数组自然会衰减为指向其第一个元素的指针,而声明为将数组作为参数的函数实际上需要一个指针。这意味着您可以只使用数组名称并且它会起作用:

median(window);

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2012-10-23
    • 2016-03-27
    • 2014-04-03
    相关资源
    最近更新 更多