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

How do you pass an array to a function like this: void fooboo(char array[i]);

我试图准确理解这段代码试图完成的任务。给出了函数 median,但我添加了 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];
}

给定函数签名

pix_t median(pix_t window[N])

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

错了。该函数需要一个包含至少 N 个元素的 pix_t 数组 Note,而您只传递了一个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

A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation. [....]


注:

What I really need to know is what is exactly being passed to the function? An array of N index?

"at least N elements"的意思是指保证数组有足够的存储空间space来容纳N个元素到位置N-1,而不是索引N, N+1, N+2, ... 是 valid/addressable.

你可以读作:"I have a guarantee of at least N cells of storage space so that I can store at most N elements in N-1 valid positions."

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

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

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

median(window);