函数指针的理解

题目写的是关于函数指针,但其实我知道的只是其中一小部分,而且不是很全。下面我结合例子说明:
首先明确一点:函数名是指向函数的指针,即当我创建了一个如下函数:

int find(char*)
{}

其中find就是函数指针变量。也就是说如果我想在一个函数中调用另一个函数,可以将函数指针类型的参数传递给函数就可以了。
下面我们看一下函数指针的形式参数如何写
基本格式如下:
返回类型 (*指针变量)(参数)

下面结合具体例子来看:

先写一个字符串查找函数match(),保存在match.c文件中

//代码完成在字符串中查找是否含有指定的字符串
#include<string.h>
#include"declare.h"//其中写函数申明
#include<stdio.h>
void match(char* list)
{
 FILE* file_out=fopen("file_out.txt","a");
 FILE* file_out_not_find=fopen("file_out_not_find.txt","a");
    if(strstr(list,"wuguannan"))
        {
         fprintf(file_out,"the whole list %s has the list_child wuguannan\n",list);
        }
    else
        fprintf(file_out_not_find,"the whole list %s dont't have the list_child wuguannan\n",list);
 fclose(file_out);
 fclose(file_out_not_find);
}
//如果找到就把字符串保存在file_out文件中,如果没有就保存在file_out_not_find文件中

然后由于给定的是字符串数组,所以写一个遍历字符串数组的函数find(),保存在find.c文件中,其中调用match()函数

#include"declare.h"
void find(void (*match)(char*))
//注意上面的参数格式,就是之前说过的函数指针形参
{ 
  int i;
  for(i=0;i<4;i++)
     {
       match(shu_zu[i]);
     }
}

再写函数申明,保存在declare.h头文件中

#ifndef DECLARE_H
#define DECLARE_H
extern char* shu_zu[];//这里是变量声明,在头文件中加前缀extern表明是全局变量
void match(char* list);
void find(void(*match)(char*));

#endif

最后写main函数,保存在c_learning.c文件中

#include<stdio.h>
#include"declare.h"

char* shu_zu[]={
                "wodemingzijiaozuowuguannan",
                 "wujunyishiwofuqing",
                 "liuhongjushiwomuqing",
                 "woxihuanwozijiwuguannan"
        };
int main()
{

 find(match);
 return 0;
}

最后编译时为

gcc c_learning.c match.c find.c -o c_learning

最后运行就可以了。

最后说一点心得,首先感谢CSDN的问答平台,自己上午问的问题,一会就有三个人回复,而且解决了我的问题,很感谢大家,感谢这个平台。
自己一开始把定义的字符串数组写在了main()函数的里面,所以再调用find()函数的时候,会编译报错,说未定义变量(即使自己在头文件之中写了extern char* list[];的申明),我想原因是main函数里面只是保存在栈里面的局部变量,所以在头文件中申明的全局变量并不其作用吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值