C语言中的函数指针
首先搞一个循环输出字符串数组的功能
代码如下:
/* filename: funcp.c */
#include <stdio.h>
/* compile : gcc funcp.c -o funcp
run : ./funcp */
/**/
int
main (int argc, char *argv[])
{
char *buff[5] = { "Jim", "Pike", "Tala", "Nor", "Alan" };
for (int i = 0; i < 5; i++)
printf ("Name %d : [%s]\n", i + 1, buff[i]);
return 0;
}
/* --(:O\^/O:)-- */
编译运行,结果如下:
songvm@ubuntu:~/works/xdn$ gcc funcp.c -o funcp
songvm@ubuntu:~/works/xdn$ ./funcp
Name 1 : [Jim]
Name 2 : [Pike]
Name 3 : [Tala]
Name 4 : [Nor]
Name 5 : [Alan]
将上面的三行代码拆分成三个函数
- 以上结果是在意料之中的,现在将这三行主要代码拆分成三个函数:test_foreach, string_foreach, out_iname,让main函数的内容更简单!!!
- test_foreach,无参数,在此函数中定义字符串数组,由main函数直接调用。
- string_foreach,三个参数,数组指针,数组长度,函数指针(相对复杂)。
- out_iname,两个参数,一个整数,一个字符串指针,out_iname对应string_foreach函数的第三个参数,调用string_foreach函数时直接将out_iname函数名做为参数传给string_foreach。
形参: void (*fp) (int idx, char *name)
实参: void out_iname (int i, char *str)
可见函数指针其实就是将一个函数做为参数传递给另一个函数。
代码如下:
/* filename: funcp.c */
#include <stdio.h>
/* compile : gcc funcp.c -o funcp
run : ./funcp */
/**/
void
out_iname (int i, char *str)
{
printf ("Name %d : [%s]\n", i, str);
}
/**/
void
string_foreach (char **names, int len, void (*fp) (int idx, char *name))
{
for (int i = 0; i < len; i++)
fp (i + 1, names[i]);
}
/**/
void
test_foreach (void)
{
char *buff[5] = { "Jim", "Pike", "Tala", "Nor", "Alan" };
string_foreach (buff, 5, out_iname);
}
/**/
int
main (int argc, char *argv[])
{
test_foreach ();
return 0;
}
/* --(:O\^/O:)-- */
编译运行,结果如下:
songvm@ubuntu:~/works/xdn$ gcc funcp.c -o funcp
songvm@ubuntu:~/works/xdn$ ./funcp
Name 1 : [Jim]
Name 2 : [Pike]
Name 3 : [Tala]
Name 4 : [Nor]
Name 5 : [Alan]
自定义函数指针数据类型,把string_foreach函数参数搞得更简洁
自定义函数指针数据类型FP
typedef void (*FP) (int idx, char *name);
对应函数out_iname
void
out_iname (int i, char *str)
{
......
}
将代码更改,加入自定义函数指针数据类型FP,将string foreach函数的参数简化,代码如下:
/* define a function pointer datatype */
typedef void (*FP) (int idx, char *name);
......
//string_foreach (char **names, int len, void (*fp) (int idx, char *name))
string_foreach (char **names, int len, FP fp)
......
更改后编译运行,与原来的效果是一样的。
函数指针数据类型的变量定义、赋值和调用
- 更改后编译运行,结果是一样的,同样函数指针数据类型的变量也可以定义、赋值和调用。
- 定义两个简单的函数hi和hello,在test_function_pointer函数中定义两个函数指针变量,再赋值调用。
代码如下:
/* filename: fp.c */
#include <stdio.h>
/* compile : gcc fp.c -o fp
run : ./fp */
/**/
void hi (void)
{
printf ("Hi, morning!\n");
}
/**/
void hello (char *name)
{
printf ("Hello %s!\n", name);
}
/**/
typedef void (*MyFunc) (char *str); //define data type
/**/
void
test_function_pointer (void)
{
void (*fp) (void); //define variable fp
MyFunc myfunc; //define variable myfunc
fp = hi; //assignment
fp (); //call it
myfunc = hello; //assignment
myfunc ("Tommy"); //call it
}
/**/
int
main (int argc, char *argv[])
{
test_function_pointer ();
return 0;
}
/* --(:O/^\O:)-- */
编译运行,结果如下:
songvm@ubuntu:~/works/xdn$ gcc fp.c -o fp
songvm@ubuntu:~/works/xdn$ ./fp
Hi, morning!
Hello Tommy!
以上操作,基本就会用函数指针了,下一步研究一下函数的递归调用!
标签:fp,funcp,int,void,C语言,char,foreach,函数指针 From: https://blog.csdn.net/gwsong52/article/details/142515433