如何将数组传递给这样的函数:void fooboo(char array [i]);

时间:2017-04-21 04:59:12

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

我试图准确理解这段代码试图完成的内容。给出了函数中位数,但是我通过将一些东西传递给函数来添加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];
}

2 个答案:

答案 0 :(得分:5)

给出函数签名

pix_t median(pix_t window[N])

这样的电话
median(window[N]);

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

故事的士气::每当困惑时,检查数据类型

应该使用数组调用该函数,例如

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,章节§6.7.6.3

  

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

注意:

  

我真正需要知道的是究竟是什么传递给了这个函数?一个]索引数组

“至少N个元素”的含义是指保证阵列有足够的存储空间来容纳N元素到位N,而不是指数N-1NN+1N+2有效/可寻址。

您可以将其读作:“我保证 ...个存储空间单元格,以便我可以存储在大多数 {{1 N有效位置中的元素。“

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

答案 1 :(得分:5)

使用N单个元素传递给该函数。索引为N-1的元素。哪个,取决于window[N]的值可能超出范围。

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

N