如何正确地将指针传递给指针数组?

时间:2018-01-27 17:02:46

标签: c function pointers

在我的代码中,我需要将一个指针数组的指针作为函数参数传递。代码段:

struct foo * foos[] = {NULL, NULL, NULL};
some_function(&foos);

static void some_function(struct foo ** foos) {
    foos[0] = get_a_foo();
    /* some more code here */
}

这可以按预期工作(在some_function()返回后,foos[]包含我在那里设置的指针),但是我收到编译器警告,要求调用some_function()

  

注意:预期'struct foo **'但参数类型为'struct foo *(*)[3]'

实现我想要的正确方法是什么(即传递指向函数指针数组的指针,以便函数可以更改数组中的指针)?

4 个答案:

答案 0 :(得分:1)

将其传递为some_function(foos)

答案 1 :(得分:0)

struct foo **是指向struct foo的(单个)指针的指针,而不是指向指针数组的指针,因此编译器警告。

使编译器警告静音的一种简单方法是按如下方式调用函数:

some_function(&foos[0]);

这将传递指向第一个成员的指针,即struct foo **,而不是整个数组;两种情况下的地址相同。

答案 2 :(得分:0)

如果我理解你要做的事情(通过调用函数填充你的指针数组),那么你对如何实现它的理解有点不清楚。您声明foos,它本身就是一个数组。 (一系列什么?指针)。

你可以像处理一个char数组一样处理它(从你可以简单地将数组本身作为参数传递给函数并在函数内操作数组的角度来看)你可以这样做并拥有调用者中可见的更改,因为尽管数组地址本身是函数中的副本,但它保存的值(单个指针地址)保持不变。

例如:

#include <stdio.h>

char *labels[] = { "my", "dog", "has", "fleas" };

void fillfoos (char **f, int n)
{
    int i;

    for (i = 0; i < n; i++)
        f[i] = labels[i];
}


int main (void) {

    char *foos[] = { NULL, NULL, NULL };
    int i, n = sizeof foos / sizeof *foos;

    fillfoos (foos, n);

    for (i = 0; i < n; i++)
        printf ("foos[%d] : %s\n", i, foos[i]);

    return 0;
}

以上foos被简单地视为传递给函数fillfoos的数组,该数组然后遍历foos内的每个指针,并将地址填充到标签中包含的相应字符串文字。 foos的内容随后可在main中找到,例如

示例使用/输出

$ ./bin/fillptp
foos[0] : my
foos[1] : dog
foos[2] : has

如果我误解了你的问题,请告诉我,我很乐意进一步提供帮助。

答案 3 :(得分:0)

警告中明确提到您需要pointer to an array。 下面是一个解释相同的最小代码示例。

#include<stdio.h>

typedef struct foo{

}FOO;

static void some_function(FOO* (*foos)[]) {
// foos above is a pointer to an array of pointers.
// Refer the link to start with a simple example.
// Access it like foos[0][0] which is the same as (*foos)[0]
    /* some more code here */
}

int main(int argc, char **argv) {
    FOO* foos[]={0,0,0}; // Here you have an array of pointers
    some_function(&foos);
}