文档章节

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

秋风醉了
 秋风醉了
发布于 2014/06/01 14:10
字数 883
阅读 41
收藏 1
点赞 0
评论 0

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

返回指针的函数

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

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

例如: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======

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 223
博文 581
码字总数 411013
作品 0
东城
程序员
深入理解指针函数

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

长平狐 ⋅ 2012/10/08 ⋅ 0

指针函数与函数指针的区别

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

liangtee ⋅ 2013/02/18 ⋅ 0

理解 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针

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

qq_38646470 ⋅ 2017/11/21 ⋅ 0

【C++】指向函数的指针,指向重载函数的指针,指向类成员的指针

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

拙峰 ⋅ 2013/04/27 ⋅ 0

C++笔记——指针函数/函数指针

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

yushupan ⋅ 01/02 ⋅ 0

通过FFMPEG代码学习函数指针和指针函数

函数指针和指针函数介绍 函数指针和指针函数一直在工作中会用到,现在mark下。部分内容是参考其他人的总结。 1. 函数指针是指向函数的指针变量,即本质是一个指针变量。  int (f) (int x); ...

andrew810810 ⋅ 2016/12/23 ⋅ 0

复杂声明 | C语言

今天看了《C专家编程》里的'分析C语言的声明'一章,终于懂了C语言的复杂声明是怎么解析的。虽然在平时写代码的时候用到复杂声明的情况几乎没有,这里还是做一个记录,也是加深对C语言声明的理...

好好编程 ⋅ 01/16 ⋅ 0

C++学习笔记(5):指针函数与函数指针

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

Rocky_Sky ⋅ 2012/09/27 ⋅ 0

指针数组,数组指针、指针函数,函数指针

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

捕风的xiao_k ⋅ 2017/03/26 ⋅ 0

C++学习笔记 -- 函数指针与指针函数

函数指针:指向函数的指针,首先它是指针变量(同指向一个整形变量、字符、数组一样),其次它指向一个函数(地址)。 声明:函数类型 (* 指针变量名)(形参列表) 函数类型,指明函数的返回类型...

meteoric ⋅ 2013/05/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

开启Swarm集群以及可视化管理

在搭建的两台coreos服务器上开启swarm集群 前置条件: docker均开启2375端口 同一个局域网内 主服务器上安装Portainer容器 安装Portainer容器执行: docker run -d -p 9000:9000 --restart=a...

ykbj ⋅ 16分钟前 ⋅ 0

单例设计模式

1、单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 2、饿汉式单例类 在这个类被加载时,静态变量instance会被初始化,此时类的私有构造子会被调用 饿汉式是典型...

职业搬砖20年 ⋅ 22分钟前 ⋅ 0

前端基础(四):前端国际规范收集

字数:1142 阅读时间:5分钟 前言 由于前端技术的灵活性和杂乱性,导致网上的许多解决方案不够全面甚至是完全错误,容易起到误导作用。所以,我对搜索到的解决方案往往是存疑态度。那么,如何...

老司机带你撸代码 ⋅ 24分钟前 ⋅ 0

Failed to open/create Network-VirtualBox Host-Only

虚拟机版本 : Oracle Vm VirtualBox 5.2.12 报错时机:开网卡二,重启虚拟机报错 "Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Ada......

p至尊宝 ⋅ 27分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

阿里云云栖社区 ⋅ 30分钟前 ⋅ 0

springMVC接收表单时 Bean对象有Double Int Char类型的处理

前台ajax提交表单price为double类型 后台controller就介绍不到 400错误 前台 实体类: public class ReleaseMapIconConfig{ private String id; private long maxValue; private long minVal......

废柴 ⋅ 32分钟前 ⋅ 0

ZOOKEEPER安装

工作需要在ubuntu上配置了一个zookeeper集群,有些问题记录下来。 1. zookeeper以来java,所以首先要安装java。但是ubuntu系统有自带的jdk,需要通过命令切换java版本: $ sudo update-alter...

恰东 ⋅ 35分钟前 ⋅ 0

linux 进程地址空间的一步步探究

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。 那虚拟内存空间...

HelloRookie ⋅ 36分钟前 ⋅ 0

myatis #{}与${}区别及原理

https://blog.csdn.net/wo541075754/article/details/54292751

李道福 ⋅ 39分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

猫耳m ⋅ 40分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部