第一段 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函数返回值传入函数中