指向函数的指针

【数据结构基础】指向函数的指针 指向函数的指针这一部分内容在学习数据结构的过程是有些必要的,因为在严蔚敏老师的《数据结构(C语言版)》一书中多次出现了这部分的内容。想要看懂具体的算法,这部分内容是不可或缺的。... 阅读详情

(一) 用函数指针变量调用函数

        可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例:

#include <stdio.h>
#include <stdlib.h>
int max1(int x,int y)
{
    int z;
    if(x>y) z = x;
    else z = y;
    return(z);
}
int main()
{
    int max1(int,int);
    int (*p)(int,int);
    int a,b,c,d;
    p = max1;//p=&max1,max1既是函数名又是函数名指针(入口地址)!!!
    scanf("%d%d",&a,&b);
    c = (*p)(a,b); //c= p(a,b)
    d = (*max1)(a,b);//c=max1(a,b)
   
    printf("a=%d,b=%d,max=%d %d\n",a,b,c,d);
    return 0;
}



        main函数中的" c = max(a,b); " 包括了一次函数的调用。每一个函数都占用一段内存单元。因此,可以用一个指针变量指向一个函数,通过指针变量来访问它指向的函数。

  int (*p)( int,int );  用来定义 p 是一个指向函数的指针变量,该函数有两个整形参数,函数值为整形。注意 *p 两侧的括号不可省略,表示 p 先与 * 结合,是指针变量,然后再与后面的 ( ) 结合,表示此指针变量指向函数,这个函数值 (即函数的返回值) 是整形的。如果写成 int *p ( int,int ) ,由于( )的优先级高于 *,它就成了声明一个函数P( 这个函数的返回值是指向整形变量的指针)。


  赋值语句 p = max ; 作用是将函数 max 的入口地址赋给指针变量p。和数组名代表数组首元素地址类似,函数名代表该函数的入口地址。这时 p 就是指向函数 max 的指针变量,此时 p 和 max都指向函数开头,调用 *p 就是调用 max 函数。但是p作为指向函数的指针变量,它只能指向函数入口处而不可能指向函数中间的某一处指令处,因此不能用 *(p + 1)来表示指向下一条指令。


  注意:


  (1) 指向函数的指针变量的一般定义形式为:


  数据类型 (*指针变量名)(函数参数列表)


  这里数据类型就是函数返回值的类型


  (2) int (* p) ( int,int ); 它只是定义一个指向函数的指针变量 p, 它不是固定指向哪一个函数的,而只是表示定义这样一个类型的变量,它是专门用来存放函数的入口地址的。在程序中把哪一函数(该函数的值应该是整形的,且有两个整形参数)的地址赋给它,他就指向哪一个函数。在一个函数中,一个函数指针变量可以先后指向同类型的不同函数。


  (3) p = max; 在给函数指针变量赋值时,只需给出函数名而不必给出函数参数,因为是将函数的入口地址赋给 p ,而不涉及 实参和形参的结合问题,不能写成 p = max(a,b);


  (4) c = (*p)(a,b) 在函数调用时,只需将( *p ) 代替函数名即可,后面实参依旧。


  (5) 对于指向函数的指针变量,像 p++ ,p+n.....是无意义的。


  (二) 用指向函数的指针作为函数参数


  函数指针变量通常的用途之一就是把指针作为参数传递到其他函数。


  函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量,也可以是指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。


  void  sub ( int ( *x1) (int), int (*x2) (int,int) )


    {


      int a,b,i,j;


      a = (*x1)(i);      /* 调用 f1 函数 */


      b = (*x2)(i)(j);    /* 调用 f2 函数 */


    }


  如果实参为两个 函数名 f1 和 f2. 在函数首部定义x1、x2为函数指针变量,x1指向的函数有一个整形形参,x2指向的函数有两个形参。i 和 j 是函数f1 和 f2所要的参数。函数sub的形参 x1、x2(指针变量)在函数 sub 未被调用时并不占用内存单元,也不指向任何函数。在sub被调用时,把实参函数 f1 和 f2的入口地址传给形式指针变量 x1 和 x2.


  既然在 sub 函数中要调用 f1 和 f2 函数,为什么不直接调用f1 和 f2而要用函数指针变量呢? 确实,如果只是用到f1 和 f2 函数,完全可以在sub函数中直接调用f1 和 f2,而不必设指针变量 x1 和 x2。 但是,如果在每次调用sub时,调用的函数不是固定的,下次是f3 和 f4,再是f5 和 f6...这时用指针变量就比较方便了。

『返回指针的函数』和『指向函数的指针』即指针函数和函数指针的区别 先说结论: 1、指针函数(返回指针的函数)本质是一个函数,其返回值为指针。 2、函数指针(指向函数的指针)本质是一个指针,其指向一个函数。 指针函数: 返回指针的函数的一般形式为:类型名 * 函数名(参数列表) 和普通函数的区别不过就是其返回了一个指针(即地址值)而已。 int *fun(int x,int y); int * fun(int x,int y); int* fun(int x,int y); 例1: #include<iostream> using namespace std; 阅读详情

相关推荐

深入解析LCD DRM驱动框架中的KMS与GEM机制

本文深入解析了Linux内核中DRM(Direct Rendering Manager)驱动框架的核心机制,重点剖析了KMS(内核模式设置)与GEM(图形执行管理器)的工作原理。KMS作为显示系统的总指挥,负责原子化地控制CRTC、Encoder、Plane等硬件资源,确保画面同步更新,避免撕裂;GEM则作为显存大管家,通过DUMB和PRIME机制高效管理图形缓冲区的分配、共享与同步。文章结合RK3568平台实战,阐述了如何利用这些机制优化显示性能,并提供了调试技巧与常见问题解决方案。

weixin_29188997的博客 387

C++:函数指针

程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(也称“入口地址”)。我们可以将函数的入口地址赋给一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为“函数指针”。

丁泽方的技术博客 730

一文掌握python图形界面开发PyQt6--(一)基本操作、控件、信号与槽、常用控件、布局管理、事件处理、文件对话框

一文掌握python图形界面开发PyQt6--(一)基本操作、控件、信号与槽、常用控件、布局管理、事件处理、文件对话框

qq_38120851的博客 4046

C语言入门之指针(3)

什么是函数指针 可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。例如: int (*p)(int,int); 定义p是指向函数的指针变量,它可以指向类型为整型且有两个整型参数的函数。p的类型用int (*)(int,int)表示 怎样定义和使用指向函数的指针变量 定义指向函数的指针变量的一般形式为 数据类型 (*...

mygod2008ok的专栏 985

手把手教你用HiNet实现图像隐藏:可逆神经网络实战指南(附代码)

本文提供了一份基于HiNet框架实现图像隐藏的实战指南。通过详细解析可逆神经网络原理,手把手指导环境搭建、模型构建、损失函数设计及训练流程,并附有完整代码。该方法利用单个可逆网络统一隐藏与恢复过程,结合小波变换提升隐蔽性,为信息隐藏应用提供了高效解决方案。

rgv234567的博客 433

解决 python2.7中 ImportError: No module named Crypto.Signature

我的解决办法,先查看有没有安装 pip,直接执行pip 回车 没有出现null什么的就安装了,如果没有安装去其他博客哪里看一下,正常情况是默认就有的,然后使用。发现我自己也不会啊,就百度看看,想着网上的解决方法一大片,但是都是废话,能用的没有几个,而且能安装的没有几个。这个里面的python2、3就是系统里面的python版本,直接跟我这样就可以了除非版本不一样,也就是没有这个版本。就可以使用了,第一个应该是卸载之前的,然后重新安装,我的就是这样解决的。就比如我的,我现在使用的 python2.7。

记录一下 1610

函数指针详解

一、函数指针定义 如:char (*p) (int) 定义了一个指向函数的指针变量 p,指向返回值类型为 char,参数类型为 int 的函数。 函数指针形式:函数返回值类型 (* 指针变量名) (函数参数列表) 【注意】: (1)指向函数的指针变量没有 ++ 和 - - 运算。 (2)函数指针执行间接访问之前必须把它初始化为指向某个函数。 二、简单函数指针的运用 char (*pFu...

devilzcl的博客 523

告别图像畸变:手把手教你用HALCON的`gen_image_to_world_plane_map`做高精度视觉测量

本文详细解析了HALCON的`gen_image_to_world_plane_map`算子在工业视觉测量中的应用,通过精确的几何变换消除透视畸变,提升测量精度。文章涵盖相机标定、世界坐标系建立、实战应用及性能优化,适用于液晶屏质检、金属板检测等场景,帮助工程师实现高精度视觉测量。

weixin_28718487的博客 424

怎样定义指针变量

存放地址的变量称为指针变量,它用来指向另一个对象(如变量,数组,函数等) 定义指针变量的一般形式为:类型名 *指针变量 如:int *pointer_1,*pointer_2; 其中,int为定义指针式必须指定的“基类型”,指针变量的基类型用来指定此指针变量可以指向的变量的类型。 float *pointer_3 ; //指向float型变量的指针变量,简称float指针 char...

weixin_44935446的博客 1万+

数控系统(CNC)系列:Fanuc 31i-B_(16).CNC系统的网络连接与数据传输

硬件连接:包括网络接口的类型、连接方式等。网络协议:常用的网络协议包括Ethernet、Modbus TCP、Profinet等。网络配置:如何在CNC系统中配置网络参数,使其能够正确接入网络。在网络化的现代工业生产环境中,CNC系统的网络连接和数据传输能力变得越来越重要。通过以太网、Modbus TCP和Profinet等网络协议,可以实现CNC系统与上位机、其他CNC系统以及各种工业设备之间的高效通信。

2401_87715305的博客 2435

Spring AI Alibaba 项目源码学习(九)-其他继承BaseAgent

本文分析了Spring AI Alibaba Agent Framework中的A2aRemoteAgent实现,主要特点包括: 实现了Agent间的远程调用能力,支持分布式部署 核心组件包括AgentCard封装元数据、A2aNodeActionWithConfig处理调用逻辑、AgentCardProvider提供卡片管理 支持流式调用和状态共享机制 采用Builder模式构建Agent实例 通过指令传递实现Agent间通信 关键流程包括状态提取、请求构建、远程调用和状态更新四个步骤,形成Agent

820

8.5 指向函数的指针

在程序中定义一个函数时,编译器会将该函数的源代码转换为可执行代码,并分配一段存储空间。这段内存空间有一个起始地址,也称为函数的入口地址。每次调用函数时,都从该地址入口开始执行这段函数代码。函数名代表函数的起始地址,调用函数时,从函数名得到函数的起始地址,并执行函数代码。因此,函数名就是函数的指针,它代表函数的起始地址。我们可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。定义p是一个指向函数的指针变量,它可以指向函数类型为整型且有两个整型参数的函数。

tang7mj的博客 993

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

1. 指针函数:返回值数据类型为指针的函数2. 格式 :类型说明符 * 函数名(参数列表)eg:3.用途:一般用于动态内存分配和数据传输(二)指向函数的指针1.指向函数的指针:顾名思义,一个指向函数的指针2.格式:类型说明符 (*指针变量名)(参数列表)p=add;

XLKFEMS_的博客 467

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

指向成员函数的指针和this指针

1.指向类的成员函数的指针 (1)定义的一般形式:数据类型 (类名:: * 指针变量名)(参数表列) (2)使成员函数指针指向类的共用成员函数的一般形式:函数指针名=&类名::函数名 (3)利用函数指针调用类的成员函数一般形式:(对象名 . 函数指针名)() #include using namespace std; class Time { public: Time(int h, in...

weixin_43597743的博客 2810

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

掌握指针进阶:一篇带你玩转函数指针、函数指针数组及指向函数指针数组的指针!!

数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组//数组的每个元素是int*那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?答案是:parr1parr1先和[]结合,说明parr1是数组,数组的内容是什么呢?是int (*)()类型的函数指针。转移表总之,函数指针数组实际上是一个数组,其元素都是指向函数的指针。这使得我们可以将不同的函数存储在数组中,并通过索引来调用特定的函数。

深入解析C/C++编程技巧,带你探索高效开发之路 1410

什么是指针的指针和指向函数的指针?

指针是一个变量,其值是另一个变量的内存地址。它允许我们间接地访问内存中的数据。指针在C语言中用于各种任务,包括动态内存分配、数组操作和函数参数传递。int x = 10;// 声明一个整型指针ptr,将x的地址赋给它printf("x的值:%d\n", *ptr);// 通过指针间接访问x的值return 0;在上面的示例中,ptr是一个指向整数的指针,它存储了变量x的内存地址,并且通过*ptr可以访问x的值。现在,我们来谈谈指针的指针。指针的指针是指一个指针变量,它存储另一个指针变量的地址。

weixin_68551689的博客 587

指向函数的指针的使用

谈到这个话题,初学者可能在这方面较难看懂。不过对c/c++较熟悉的人来说,大家谈到指向函数的指针就会想到在排序中,那个以函数作为参数传递到排序函数中就是一个最典型的应用。1.指向函数的指针的类型指向函数的指针应该怎样声明?拿两个字符串的比较函数来说:int  strCompare(const string & s1, const string & s2) ;如果两个字符串相等就返回0,否则

Dremi的专栏 1万+

指向函数的指针与指向指针的指针

1、指向函数的指针 可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数中的入口地址就称为函数的指针。 例:比较a和b的大小,求大值。 #include<stdio.h> #include "StdAfx.h" int max(int x,int y) { int z; if(x...

qq_44137560的博客 357

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

前言 接下来我只讲指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针     一、返回指针的函数  指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。 返回指针的函数的一般形式为:类型名 * 函数名(参数列表) eg: char * upper(参数){} 返回指向char型的指针变量  比如下面这个函数,返回一个指向char

yinjing8435的博客 1097

指向函数的指针数组

void Input(ST *);void Output(ST *);void Bubble(ST *);void Find(ST *);void Failure(ST *);/*函数声明:这五个函数都是以一个指向ST型(事先定义过)结构的指针变量作为参数,无返回值。*/void (*process[5])(ST *)={Input,Output,Bubble,Find,Failure};/*pr

flydeveloper的专栏 1662

C语言指针操作(六)指向函数的指针

指向函数的指针详解,以及如何使用指向函数的指针变量做函数参数。指向函数的指针作为函数参数,是 C 语言实际应用中的一个比较深入的部分。

伯努利 9689

指向函数的指针及应用

指向函数的指针详解以及在快速排序库函数中的应用

记录C++/Linux/操作系统的学习 1236

指向数组的指针 指向字符串的指针 指向函数的指针 返回值为指针的函数 指针数组 指向指针的指针

指向数组的指针 、指向字符串的指针、指向函数的指针、返回值为指针的函数、指针数组、指向指针的指针

weixin_45710245的博客 561

C语言中关于返回指针的函数和指向函数的指针

初学c语言中的返回指针的函数和指向函数的指针时,往往容易分不清楚,下面我就来梳理一下: 一、返回指针的函数 也叫指针函数。 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。 格式: 类型说明符 * 函数名(参数) 当然了,由于返回的是一个地址,所以类型说明符一般都是int。 例如: int *GetDate(

iOS开发的学习笔记 1956
上一篇: lua中pairs 和 ipairs区别
下一篇: This qt version uses an unsupported makefile generator object reference not set to an instance of an
上流下流
博客等级 码龄14年 12粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值