文档章节

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

秋风醉了
 秋风醉了
发布于 2014/06/01 14:10
字数 883
阅读 54
收藏 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======

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 239
博文 572
码字总数 416654
作品 0
朝阳
程序员
私信 提问
深入理解指针函数

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

长平狐
2012/10/08
61
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
理解 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针

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

qq_38646470
2017/11/21
0
0
指针数组,数组指针、指针函数,函数指针

听到这几个名词不知道大家什么感受,反正我是一脸懵逼,不过我还是比较好学的,在老师的指导下,自己下去也钻研了一下,有一些自己的见解,我想在学习过程中也有童鞋遇到了相同的问题,希望我...

捕风的xiao_k
2017/03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Elasticsearch节点角色类型node.master和node.data说明s

一般地,ElasticSearch集群中每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务。这些功能是由两个属性控制的(node.master和node.data)。默认情况下这两个属性的值都是tru...

傲娇字符
10分钟前
2
0
jdbcTemplate 分页 com.github.pagehelper.Page

由于项目中用了mybatis分页插件 com.github.pagehelper.Page 有时候复杂的查询分页想用jdbcTemplate。又想用分页。 分页对象 public class PageBean<T> implements Serializable { priv...

xiaomin0322
11分钟前
0
0
rem的使用

(function (doc, win) { var docEl = doc.documentElement var resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize' var recalc = function () { var cl......

Js_Mei
18分钟前
0
0
idea 删除代码的注释

搜索栏使用 正则表达式搜索 (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/|[ \t]*//.*) 会搜索出来所有注释的代码 用空格replace替换掉就可以了。 或者搜索 (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\...

时刻在奔跑
20分钟前
2
0
eclipse maven 项目运行mvn clean 后无法运行

错误: 错误:找不到或无法加载主类com.yyy.test.Main 解决方法: “project” --"Clean" 参考链接:https://jingyan.baidu.com/article/cbcede07107d9802f40b4dff.html...

qimh
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部