指针函数回调函数把我整懵了

第一段 int(*getNextValue)(void)和getNextValue(); 这两个是怎么回事

然后 第二段 返回   return rand(); 这个rand() 又是哪里来的,是返回一个rand()函数吗?

把我整懵了 具体是怎么运转的呢。。。

萌新落泪

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

// 回调函数
void populate_array(int *array, int arraySize, int(*getNextValue)(void))
{
    int i;
    for (i = 0; i < arraySize; i++)

{
        *(array + i) = getNextValue();
    }
}

// 获取随机值
int getNextRandomValue(void)
{
    return rand();
}

int main(void)
{
    int myarray[10];
    int i;
    populate_array(myarray, 10, getNextRandomValue);
    for (i = 0; i < 10; i++)

{
        printf("%d ", myarray[i]);
    }
    printf("\n");


    return 0;
}

 

最后结果41 18467 6334 26500 19169 15724 11478 29358 26962 24464

从主函数开始:

首先定义一个int数组,名字为myarray,大小为10;

然后调用函数populate_array,这里先看此函数的定义

第一个形参为int类型的指针,对应主函数的myarray,(数组名字就是一个地址)

第二个形参为int整数,主要是为了循环次数用的,

第三个形参是返回类型为int类型的函数指针,函数指针定义如下:

函数类型    (*指针变量名) (形参类型表),这里的形参类型表对应了你的指针指向的函数的形参列表,这里的指针变量指向了函数getNextRandomValue,函数名可以表示函数的入口,即函数名也是一个地址,所以你的形参可以指向这个函数。具体的请题主自行百度“函数指针”

在函数的for循环中, *(array+i)表示实参myarray的第(i+1)个元素,当i = 0时,*(array+0)就相当于array[0]即myarray[0],以此类推。

因为前面你的形参函数指针指向了getNextRandomValue,所以此时getNextValue()相当于getNextRandomValue()。

再来看getNextRandomValue()函数,返回值类型为int整型,里面只有一个语句return rand():

这里的rand()函数是stdlib.h头文件中的一个函数,这个函数会返回一个整数随机值,即return rand() = return 随机整数。

其他的题主应该可以理解了

 

 

关于函数指针的应用,第一段 int(*getNextValue)(void):是定义的populate_array函数的参数,意思是把getNextValue函数的int类型返回值传入populate_array中

下面的getNextRandomValue()是真正定义的函数,populate_array(myarray, 10, getNextRandomValue);即将定义的getNextRandomValue()函数返回值传入populate_array中

return rand();应该是已定义的C语言的内置函数

具体运行,先走main程序入口, 在   populate_array(myarray, 10, getNextRandomValue);一句中调用getNextRandomValue函数,将myarray, 10, getNextRandomValue函数返回值传入函数中