C语言--指针函数和函数指针
指针函数和函数指针
指针函数其实是一个简称,是指带指针的函数,它本质上是一个函数,只是返回的是某种类型的指针。其定义的格式为:
- 类型标识符 *函数名(参数表)
函数指针,从本质上说是一个指针,只是它指向的不是一般的变量,而是一个函数。因为每个函数都有一个入口地址,函数指针指向的就是函数的入口地址。其定义的格式为:
- 类型标识符 (*指针变量名)(形参列表)
接下来,通过分析下面的代码加深读者对指针函数和函数指针的理解。代码的功能为在输入字符串中查找指定的字符,如果查找成功,则打印出所查找字符后面的字符串,如果查找失败,则给出提示信息。
#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 ;
}
运行结果:
- 请输入字符串:Never forget to say thanks!
- 请输入要搜索的字符串:say
- 直接调用函数serch_str()
- 所搜索字符串之后的字符为: thanks!
- 请输入字符串:Keep on going never give up!
- 请输入要搜索的字符串:going
- 使用函数指针fun调用函数serch_str()
- 所搜索字符串之后的字符为:never give up!
分析上面的代码,其中定义函数指针的形式为“char* (*fun)(char *str,char *substr);”,其所指向函数的返回类型为字符指针,所带参数是两个字符指针。在代码的实现中有些需要注意的地方,如在strlen()函数中通过一个结束符来判断字符串的长度,这是因为在输入字符串后面会自动添加一个结束符。由运行结果可知,采用了两种方式来实现函数的调用,一种是直接调用,即通过serch_str()函数来实现;另外一种是使用函数指针的方式来调用,即通过函数指针fun来实现,在调用之前,先使函数指针fun指向serch_str函数的入口地址,之后才能按照调用serch_str()函数的方式来使用。在使用函数指针的时候,需要注意函数指针要与它所指向的函数具有相同的类型,在用函数指针指向函数的时候是用“函数指针名=函数名”的方式来引用函数的。函数serch_str()是一个指针函数,返回的是一个字符指针。
C语言--指针函数和函数指针相关推荐
- 【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )
文章目录 一.判定指针合法性 二.数组越界 三.不断修改指针变量值 四.函数中将栈内存数组返回 五.函数间接赋值形参操作 六.指针取值与自增操作 一.判定指针合法性 判定指针合法性时 , 必须进行如下 ...
- 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
- c语言回调函数_C语言学习第26篇---函数与指针分析 回调函数
函数类型的概念 1.C语言函数也是有类型的 2.函数类型由函数返回值,参数类型,参数个数共同决定 int add(int i,int j) 的类型是 int(int , int) 3.C语言中通过ty ...
- C语言enum(枚举)、指针、函数指针
C enum(枚举) 枚举是c语言中的一种数据类型,定义格式为 enum 枚举名{枚举元素1,枚举元素2,......}; 用#define定义一星期七天,就要为每个整数定义一个别名 #define ...
- C语言的指针函数与函数指针
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992050 指 ...
- C语言程序设计 | 指针(二):常量指针和指针常量、数组参数和指针参数、函数指针数组
指针的进阶(二)目录: 常量指针和指针常量 数组参数和指针参数 函数指针数组 常量指针和指针常量 在我们日常中,经常会用到一个关键字const const是一个C语言(ANSI C)的关键字,具有着举 ...
- c语言指针自定义函数,c语言函数指针定义,指针函数和函数指针的区别
往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面就由小编详细为大家介绍C语言中函数指针,指针函数和函数指针之间的区别. c语言指针函数定义: 函数指针是指向函数的指针变量. 因此&qu ...
- 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数
回调函数是非常重要的概念 文章目录 1 函数的类型 2 函数指针 2.1 函数指针的使用 2.2 使用函数指针实现回调函数 3 总结 1 函数的类型 跟以前学数组的时候是一样的,C语言中的数组是有自己 ...
- typedef函数指针_C语言函数指针之回调函数
1 什么是回调函数? 首先什么是"回调"呢? 我的理解是:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调. 如果代码立即被执行就称为同 ...
最新文章
- INPUT type=password 元素 | input type=password 对象
- JQuery 匿名函数初识(转载)
- Bootstrap的datatable控件
- git怎样用idea拉代码_一款强大的 IDEA 代码生成器,学会用,真香!
- ecshop的几个小瑕疵
- hdu 5464(简单dp)
- 1、Tensorflow 之 saver与checkpoint
- 大佬终于把鸿蒙OS讲明白了,收藏了!
- Ubuntu下安装SSH服务
- java中的holder类_java – HashMap中Holder类的用途是什么?
- (10)魔兽文件打包器里的传奇哈希表
- 对俄罗斯应用“一刀切”,乌克兰知名开发商推出 Mac 专用反间谍软件
- 公交导航准确度大PK:高德地图百度地图谁更精确
- 2021年高考成绩查询徐水,2021年4月河北保定徐水区自考成绩5月18日公布
- Linux命令学习:Linux中more和less命令以及查找用法
- 蓝桥杯真题:k倍区间
- 网站服务器变更ip后更新域名,服务器变更后域名需要重新备案吗
- matlab 将路径靠左,latex 图片位置靠左
- hdu 6438 - 贪心
- 计算机窗口关闭不了怎么办,电脑上一直出现这个窗口关都关不掉怎么处理