指针函数和函数指针

指针函数其实是一个简称,是指带指针的函数,它本质上是一个函数,只是返回的是某种类型的指针。其定义的格式为:

  1. 类型标识符 *函数名(参数表) 

函数指针,从本质上说是一个指针,只是它指向的不是一般的变量,而是一个函数。因为每个函数都有一个入口地址,函数指针指向的就是函数的入口地址。其定义的格式为:

  1. 类型标识符 (*指针变量名)(形参列表) 

接下来,通过分析下面的代码加深读者对指针函数和函数指针的理解。代码的功能为在输入字符串中查找指定的字符,如果查找成功,则打印出所查找字符后面的字符串,如果查找失败,则给出提示信息。

#include <stdio.h> char* (*fun)(char *str,char *substr);  void input(char *str,char *substr)
{  printf("请输入字符串:");  gets(str);  printf("请输入要搜索的字符串:");  gets(substr);
}  int strlen(char *str)
{  int i=0;  while(str[i]!='\0')  i++;  return i;
}  char* serch_str(char *str,char *serch_str)
{  int i,j,k;  k = strlen(str) - strlen(serch_str);  if ( k > 0 && NULL!=str && NULL!=serch_str)  {  for ( i = 0; i <= k; i++ )  for ( j = i; str[j] == serch_str[j-i]; j++ )  if ( serch_str[j-i+1] == '\0' )  return str+i+strlen(serch_str);  }  return NULL;
}  void print(char* ret_str)
{  if ( ret_str !=NULL )  printf("所搜索字符串之后的字符为:%s\n",ret_str);  else  printf("没有找到所要搜索的字符串\n");
}  void main()
{  char str1[50],str2[50];  char serch_str1[50],serch_str2[50];  char* ret_str1,* ret_str2;  input(str1,serch_str1);  ret_str1 = serch_str(str1,serch_str1);  printf("直接调用函数serch_str()\n");  print(ret_str1);  input(str2,serch_str2);  fun = serch_str;  ret_str2 = fun(str2,serch_str2);  printf("使用函数指针fun调用函数serch_str()\n");  print(ret_str2);  return ;
} 

运行结果:

  1. 请输入字符串:Never forget to say thanks!  
  2. 请输入要搜索的字符串:say  
  3. 直接调用函数serch_str()  
  4. 所搜索字符串之后的字符为: thanks!  
  5.  
  6. 请输入字符串:Keep on going never give up!  
  7. 请输入要搜索的字符串:going  
  8. 使用函数指针fun调用函数serch_str()  
  9. 所搜索字符串之后的字符为:never give up! 

分析上面的代码,其中定义函数指针的形式为“char* (*fun)(char *str,char *substr);”,其所指向函数的返回类型为字符指针,所带参数是两个字符指针。在代码的实现中有些需要注意的地方,如在strlen()函数中通过一个结束符来判断字符串的长度,这是因为在输入字符串后面会自动添加一个结束符。由运行结果可知,采用了两种方式来实现函数的调用,一种是直接调用,即通过serch_str()函数来实现;另外一种是使用函数指针的方式来调用,即通过函数指针fun来实现,在调用之前,先使函数指针fun指向serch_str函数的入口地址,之后才能按照调用serch_str()函数的方式来使用。在使用函数指针的时候,需要注意函数指针要与它所指向的函数具有相同的类型,在用函数指针指向函数的时候是用“函数指针名=函数名”的方式来引用函数的。函数serch_str()是一个指针函数,返回的是一个字符指针。

C语言--指针函数和函数指针相关推荐

  1. 【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )

    文章目录 一.判定指针合法性 二.数组越界 三.不断修改指针变量值 四.函数中将栈内存数组返回 五.函数间接赋值形参操作 六.指针取值与自增操作 一.判定指针合法性 判定指针合法性时 , 必须进行如下 ...

  2. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  3. 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...

  4. c语言回调函数_C语言学习第26篇---函数与指针分析 回调函数

    函数类型的概念 1.C语言函数也是有类型的 2.函数类型由函数返回值,参数类型,参数个数共同决定 int add(int i,int j) 的类型是 int(int , int) 3.C语言中通过ty ...

  5. C语言enum(枚举)、指针、函数指针

    C enum(枚举) 枚举是c语言中的一种数据类型,定义格式为 enum 枚举名{枚举元素1,枚举元素2,......}; 用#define定义一星期七天,就要为每个整数定义一个别名 #define ...

  6. C语言的指针函数与函数指针

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992050 指 ...

  7. C语言程序设计 | 指针(二):常量指针和指针常量、数组参数和指针参数、函数指针数组

    指针的进阶(二)目录: 常量指针和指针常量 数组参数和指针参数 函数指针数组 常量指针和指针常量 在我们日常中,经常会用到一个关键字const const是一个C语言(ANSI C)的关键字,具有着举 ...

  8. c语言指针自定义函数,c语言函数指针定义,指针函数和函数指针的区别

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面就由小编详细为大家介绍C语言中函数指针,指针函数和函数指针之间的区别. c语言指针函数定义: 函数指针是指向函数的指针变量. 因此&qu ...

  9. 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数

    回调函数是非常重要的概念 文章目录 1 函数的类型 2 函数指针 2.1 函数指针的使用 2.2 使用函数指针实现回调函数 3 总结 1 函数的类型 跟以前学数组的时候是一样的,C语言中的数组是有自己 ...

  10. typedef函数指针_C语言函数指针之回调函数

    1 什么是回调函数? 首先什么是"回调"呢? 我的理解是:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调. 如果代码立即被执行就称为同 ...

最新文章

  1. INPUT type=password 元素 | input type=password 对象
  2. JQuery 匿名函数初识(转载)
  3. Bootstrap的datatable控件
  4. git怎样用idea拉代码_一款强大的 IDEA 代码生成器,学会用,真香!
  5. ecshop的几个小瑕疵
  6. hdu 5464(简单dp)
  7. 1、Tensorflow 之 saver与checkpoint
  8. 大佬终于把鸿蒙OS讲明白了,收藏了!
  9. Ubuntu下安装SSH服务
  10. java中的holder类_java – HashMap中Holder类的用途是什么?
  11. (10)魔兽文件打包器里的传奇哈希表
  12. 对俄罗斯应用“一刀切”,乌克兰知名开发商推出 Mac 专用反间谍软件
  13. 公交导航准确度大PK:高德地图百度地图谁更精确
  14. 2021年高考成绩查询徐水,2021年4月河北保定徐水区自考成绩5月18日公布
  15. Linux命令学习:Linux中more和less命令以及查找用法
  16. 蓝桥杯真题:k倍区间
  17. 网站服务器变更ip后更新域名,服务器变更后域名需要重新备案吗
  18. matlab 将路径靠左,latex 图片位置靠左
  19. hdu 6438 - 贪心
  20. 计算机窗口关闭不了怎么办,电脑上一直出现这个窗口关都关不掉怎么处理

热门文章

  1. 演讲:创新思维框架(2016/北京/国家会议中心)
  2. windows charles response 乱码解决办法
  3. 利用XtraBackup做mysql不停机重做主从复制
  4. Java 动态绑定 静态绑定
  5. Qt Designer信号和槽
  6. (NO.00003)iOS游戏简单的机器人投射游戏成形记(十二)
  7. apimonitor 神器啊 。。
  8. Centos升级php mysql
  9. C# ToString()用法汇总
  10. 网站故障排查常用命令