0

可能重复:
C 中的函数指针如何工作?

在stackoverflow上冲浪我发现了这个例子:

/* Validation functions start */
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}

int getNextRandomValue(void)
{
    return rand();
}

int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    ...
}

我想知道,想象 getNextRandomValue 有一个参数 getNextRandomValue(int i),我将如何包含它并使函数接受输入?

非常感谢

4

3 回答 3

3

通常的做法是将指向“数据”的指针与函数一起传递。当函数被调用时,将该“数据”指针传递给函数并假设函数本身知道如何处理该数据。实际上,数据通常是指向结构的指针。所以代码看起来像这样:

struct func1_data {
    int a;
    int b;
};

struct func2_data {
    char x[10];
};

int function1(void *data) {
    struct func1_data *my_data = (typeof(my_data)) data;
    /* do something with my_data->a and my_data->b */
    return result;
}

int function2(void *data) {
    struct func2_data *my_data = (typeof(my_data)) data;
    /* do something with my_data->x */
    return result;
}

并假设我们有

int caller(int (*callback), void *data) {
    return callback(data);
}

然后你这样称呼这一切:

struct func1_data data1 = { 5, 7 };
struct func2_data data2 = { "hello!" };
caller(function1, (void *) &data1);
caller(function2, (void *) &data2);
于 2013-01-11T06:22:55.377 回答
1

那么你的代码应该是这样的......

void populate_array(int *array, size_t arraySize, int (*getNextValue)(unsigned int))
{
    unsigned int seedvalue = 100;

    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue(seedvalue);
}

int getNextRandomValue(unsigned int seed)
{
    srand(seed);
    return rand();
}

int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    ...
}
于 2013-01-11T05:59:09.230 回答
1

熟悉函数指针语法可能是个好主意。您需要将参数更改为int (*getNextValue)(int).

于 2013-01-11T02:45:58.833 回答