指针函数和函数指针

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

  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语言指针函数与函数指针

    例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...

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

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

  3. C语言---指针变量作为函数参数

    在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着 ...

  4. C语言的抽象与函数指针--思想(转)

    一.何为抽象? 从小到大,我们接触到的抽象,最熟悉的莫过于数学了.为什么这样说呢? 比如说,在小学的时候,老师总是拿了几个苹果来引诱我们:同学们,这里有几个苹果啊?于是我们流着口水一个个地数,一个苹果 ...

  5. C语言 命令行参数 函数指针 gdb调试

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

  6. C语言 函数指针一(函数指针的定义)

    //函数指针 #include<stdio.h> #include<stdlib.h> #include<string.h> //函数指针类型跟数组类型非常相似 / ...

  7. 深入浅出剖析C语言函数指针与回调函数(一)【转】

    本文转载自:http://blog.csdn.net/morixinguan/article/details/65494239 关于静态库和动态库的使用和制作方法. http://blog.csdn. ...

  8. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  9. C语言随笔5:函数、函数指针

    函数 C语言中函数参数传递时,将实参的值拷贝到函数参数的存储区中.这种传递参数的方式称为按值传递. 函数不会访问实参本身,访问的是函数存储在栈区的副本,不会改变实参.函数凋用结束,函数在栈区的内容释放 ...

  10. C语言回顾-内存管理和指针函数

    1.fgets()函数 该函数是一个文件操作相关的函数 暂时使用这个函数可以从键盘上接收一个字符串,保存到数组中 char str[50]; 1)scanf("%s",str);/ ...

随机推荐

  1. [Noi2016]网格

    来自FallDream的博客,未经允许,请勿转载,谢谢.   跳蚤国王和蛐蛐国王在玩一个游戏. 他们在一个 n 行 m 列的网格上排兵布阵.其中的 c 个格子中 (0≤c≤nm),每个格子有一只蛐蛐, ...

  2. [bzoj2648/2716]SJY摆棋子

    平面上有n个点,要求支持插入一个点和查询一个点的最近点距离 n,m<=500000 用kdtree实现,但是复杂度貌似没法保证.....(莫名加了替罪羊重建更慢了...) #include< ...

  3. 勤拂拭软件系列教程 - java web开发

    勤拂拭软件工作室持续推出Java Web开发系列教程与案例,供广大朋友分享交流技术经验,帮助喜欢java的朋友们学习进步: 1. 勤拂拭软件 java web 开发教程(1) - 开发环境搭建 勤拂拭 ...

  4. Postgres中postmaster代码解析(中)

    今天我们对postmaster的以下细节进行讨论: backend的启动和client的连接请求的认证 客户端取消查询时的处理 接受pg_ctl的shutdown请求进行shutdown处理 2.与前 ...

  5. 开发者说 | 使用Visual Studio Code编译、调试Apollo项目

    转载地址:https://mp.weixin.qq.com/s?__biz=MzI1NjkxOTMyNQ==&mid=2247484266&idx=1&sn=d6bcd4842 ...

  6. Windows下免安装版mysql5.7的初始密码

    MySQL5.7之后,初始密码不在默认为空,而是随机生成的密码. 在mysql/data目录下,生成了一个.err文件(等同linux下的log日志文件,此文件会被mysql服务占用). 使用记事本可 ...

  7. 查询优化--ORDER BY查询优化

    Mysql 系列文章主页 =============== ORDER BY 子句,尽量使用 Index 查询,避免使用 FileSort 排序 尽可能在索引列上完成排序操作,遵照索引的最佳左前缀原则 ...

  8. 【图文详解】Hadoop集群搭建(CentOs6.3)

    本文主要详细地描述了hadoop集群的搭建以及一些配置文件的说明,用于自己复习以及供新人学习,若有错误之处还请指出. 前期准备 先给出我的集群架构: 到hadoop官网下载好hadoop安装包http ...

  9. CodeForces - 766B Mahmoud and a Triangle

    [题意概述] 给定一串数,从中挑三个,判断能否组成一个有正面积的三角形,如果能就输出YES,否则就输出NO [题目分析] 将 n 个数从大到小进行排列,三个三个往下去判断,只要后两个的和比第一个大的时 ...

  10. ACM Self Number

    In 1949 the Indian mathematician D.R. Kaprekar discovered a class of numbers called self-numbers. Fo ...