文档章节

指向函数的指针和返回指针的函数

秋风醉了
 秋风醉了
发布于 2014/06/01 14:10
字数 883
阅读 44
收藏 1

指向函数的指针和返回指针的函数

返回指针的函数

返回值为指针型数据的函数,定义一般的形式为:

类型名* 函数名(参数表)

例如:int*  func(int x, int y);

解释:表示func的返回值为指向int型数据的指针。

 注意点:

  • 函数名前的*只表示返回值为指针型数据

  • *func两侧没有括号。


指向函数的指针

指向函数的指针:函数作为一段程序,在内存中也要占据一片存储区域,它就会有一个起始地址,即函数的入口地址,这个地址我们就叫它函数的指针。

指向函数的指针的作用:我们可以定义一个指针变量指向函数,然后通过指针调用函数。将函数作为参数在函数间传递。

函数的出口:出口就看return,有多少个return就有多少个出口

指向函数的指针变量定义:类型名 (* 指针变量名) ();

指向函数的指针的更深入一层去理解:因为编译器会把函数翻译出所对于的机器代码,那么这个机器代码的第一个字节的地址就是函数的首地址,也就是指向函数的指针。

间接调用与直接调用:通过函数指针来调用函数叫间接调用,通过函数名来调用叫直接调用。

例子:

int (*p)();

表示:p是一个指向函数的指针变量,此函数的返回值为int型。

代码说明:

#include <stdlib.h>
#include <stdio.h>

int max(int x,int y){
    return x>y?x:y;
}

/*
该函数有三个参数,第一个参数和第二个参数是整数类型,
第三个参数是接收一个指向有两个参数的函数的指针
*/
int MAX(int x,int y,int (* p)(int,int)){
    return (* p)(x,y);
}

int main(){
    int (* p)();//定义p是指向函数的指针变量
    int a,b;
    printf("输入两个整形数据:\n");
    scanf("%d%d" ,&a ,&b);
    p= max;//将函数max的入口地址赋给指针变量p
    printf("函数的间接调用======\n");
    printf("a = %d , b = %d , max = %d\n" , a , b , (* p)(a , b));
    printf("函数的直接调用======\n");
    printf("a = %d , b = %d , max = %d\n" , a , b , max(a , b));


    printf("将函数作为参数在函数之间传递\n");
    int (* fun)(); //定义fun是指向函数的指针变量
    int c,d;
    scanf("%d%d" ,&c ,&d);
    fun = max;//将函数max的入口地址赋给指针变量p
    printf("c = %d , d = %d , max = %d\n" , c , d , MAX(c,d,fun)); //直接调用函数MAX求最大值

    //数据类型的转换
    int m;
    int (* function)(int) = NULL;
    function = (int (*)(int))max;//其中int (*)(int)是一个数据类型,表示一个单参函数的指针,作用是把1个双参函数的地址强制说成是1个单参函数的地址。
    m = ((int (*)(int, int))function)(2, 9);//如果不转换为双参的函数指针,编译器(GCC)会报错要再进行数据类型转换
    printf("the max element is %d",m);
    return 0;
}

运行结果:

输入两个整形数据:
12
123
函数的间接调用======
a = 12 , b = 123 , max = 123
函数的直接调用======
a = 12 , b = 123 , max = 123
将函数作为参数在函数之间传递
213
123
c = 213 , d = 123 , max = 213
the max element is 9
Process returned 0 (0x0)   execution time : 9.608 s
Press any key to continue.

======END======

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 236
博文 577
码字总数 418437
作品 0
朝阳
程序员
理解 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针

一、指针数组与数组指针先看两行代码,猜猜哪个是数组,哪个是指针 int *p[5]; int (*p)[5]; 有没有很简单,但是有很多初学者很是分不清楚;第一个是指针数组,第二个是数组指针。且看小僧给...

qq_38646470
2017/11/21
0
0
深入理解指针函数

在写《windows核心编程系列》谈谈修改导入段拦截API中,遇到了函数指针,由于以前接触甚少,花了很久才弄明白。见到一篇文章,对函数指针介绍的比较好。便转载至此。 转自:http://blog.sin...

长平狐
2012/10/08
56
0
C++笔记——指针函数/函数指针

两者主要区别,一个是函数(指针函数),一个是指针变量(函数指针)。 指针函数 (1)定义 指针函数:顾名思义就是带有指针的函数,即其本质是一个函数,只不过这种函数返回的是一个对应类型...

yushupan
01/02
0
0
【C++】指向函数的指针,指向重载函数的指针,指向类成员的指针

指向函数的指针 函数的类型由它的返回值和参数列表决定, 但函数不能返回一个函数类型。 int fce( const char*, ... );int fc( const char* ); // point to fcetypedef int (PFCE)( const ch...

拙峰
2013/04/27
0
0
C++学习笔记(5):指针函数与函数指针

1)指针函数是指带指针的函数,本质上还是一个函数,函数返回类型是某一类型的指针。 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过它的返回值是个地址。函数返回值必...

Rocky_Sky
2012/09/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arts-week10

Algorithm 905. Sort Array By Parity - LeetCode Review Who’s Afraid of the Big Bad Preloader? 一文读懂前端缓存 一个网络请求3个步骤:请求,处理,响应,而前端缓存主要在请求处响应这两步...

yysue
今天
4
0
00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
5
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
170
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部