C++函数指针与指针函数有哪些关系和区别

目录
  • 1. 函数指针
    • 1.1 概念定义
    • 1.2 声明方法
    • 1.3 调用方法
    • 1.4 函数指针作为函数参数
    • 1.5 函数指针数组
  • 2. 指针函数
    • 2.1 概念定义
    • 2.2 调用方法
  • 3. 总结

1. 函数指针

1.1 概念定义

函数指针是指向函数的指针变量。 因此函数指针本质上是一个指针变量,只不过该指针变量指向函数。指针变量也可以指向整型变量、字符型、数组,也可以指向函数。

C语言中,每一个函数都有一个入口地址,函数指针就指向函数的入口地址,可以通过函数指针来调用函数。

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

另外定义一个常用函数为 void func( ),那么fun=func; fun这时就是 func( )这个函数的入口地址了。

1.2 声明方法

函数指针的声明方法为:

返回值类型 ( * 指针变量名) ([形参列表])

“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

int func(int x);  	//声明一个函数
int (*fun)(int x,int y);  //声明一个函数指针
fun = func;  			// 将func函数的首地址赋给指针fun

或者将函数地址赋给函数指针:

fun = &func;

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针fun就指向函数func(x)的首地址。

1.3 调用方法

下面的实例说明了函数指针调用函数的方法:

#include <stdio.h>
//返回两个数中较大的一个
int max(int a, int b){
    return a>b ? a : b;
}
int main(){
    int x, y, maxval1,maxval2;
    int (*pmax)(int, int); //定义函数指针
    pmax = max;
    printf("Input two numbers:");
    scanf("%d %d", &x, &y);
    maxval1 = (*pmax)(x,y);
    printf("Max value 1: %d\n", maxval1);
    maxval2 = pmax(x,y);
    printf("Max value 2: %d\n", maxval2);
    return 0;
} 

运行结果:

Input two numbers:5 8
Max value 1: 8
Max value 2: 8

maxval1 = (pmax)(x,y)对函数进行了调用。pmax 是一个函数指针,在前面加 * 就表示对它指向的函数进行调用。注意( )的优先级高于,第一个括号不能省略。

maxval2 = pmax(x,y),pmax就是函数max的入口地址,pmax(x,y)等同于max(x,y)。

注意这里pmax是一个指针变量,它可以指向任何函数,也就是说这里指向了函数max(),但它也可以再指向其他函数。如果我们直接调用函数名称,比如max,那么它是不可变的。

1.4 函数指针作为函数参数

#include <stdio.h>
//返回两个数中较大的一个
int max(int a, int b){
    return a>b ? a : b;
}
int fun(int (*pfun)(int, int), int a, int b){
    pfun(a,b);
}
int main(){
    int x, y, maxval;
    printf("Input two numbers:");
    scanf("%d %d", &x, &y);
    maxval = fun(max,x,y);
    printf("Max value: %d\n", maxval);
    return 0;
}

运行结果:

Input two numbers:5 8
Max value: 8

maxval = fun(max,x,y)将函数max的入口地址传给了fun的形参pfun,调用pfun实际就调用了函数max。

1.5 函数指针数组

函数指针数组是一个元素均为函数指针的数组。

#include <stdio.h>
//返回两个数中较大的一个
int max(int a, int b){
    return a>b ? a : b;
}
//返回两个数中较小的一个
int min(int a, int b){
    return a<b ? a : b;
}
int main(){
    int x, y, maxval, minval;
    int(*arr[2])(int x, int y) = { max, min};
    printf("Input two numbers:");
    scanf("%d %d", &x, &y);
    maxval = arr[0](x,y);
    printf("Max value: %d\n", maxval);
    minval = arr[1](x,y);
    printf("Min value: %d\n", minval);
    return 0;
}

运行结果:

Input two numbers:5 8
Max value: 8
Min value: 5

int(*arr[2])(int x, int y) = { max, min}定义的是一个指针函数数组,数组两个元素分别为函数max和函数min的地址,调用数组arr元素实际就调用了对应函数,这一点始终没变。

2. 指针函数

2.1 概念定义

指针函数是非常常见的,它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有“函数返回值”,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。

例如: int *fun(x,y); 其结构为 类型标识符 函数名(参数)

fun是一个函数,只是返回值是一个int型的指针,如果不加,它依然是一个函数,只是返回值是一个int整型数。

2.2 调用方法

#include <stdio.h>
//返回两个数中较大的一个
int *max(int *a, int *b){
    int *ptr;
    ptr = *a>*b ? a : b;
    return ptr;
}
int main(){
    int x, y, *maxval;
    printf("Input two numbers:");
    scanf("%d %d", &x, &y);
    maxval = max(&x,&y);
    printf("Max value: %d\n", *maxval);
    return 0;
}

运行结果:

Input two numbers:5 8
Max value: 8

int *max(int *a, int *b)为指针函数,它与普通整型函数或字符型函数并没很大区别,只是函数返回为指针ptr。

3. 总结

指针函数本质是一个函数,其返回值为指针。

函数指针本质是一个指针,其指向一个函数。

指针函数:int* fun(int x,int y);

函数指针:int (*fun)(int x,int y);

*与函数名在括号内,表明指针作用于函数本身,*与函数名不在括号内,表明指针作用于函数返回值。

到此这篇关于C++函数指针与指针函数有哪些关系和区别的文章就介绍到这了,更多相关C++函数指针内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 一起来学习C++的函数指针和函数对象

    目录 函数指针 函数对象 总结 函数指针 以下是<cstdlib>库中的一个排序数组的方法qsort()的函数原型. void qsort (void* base, size_t num, size_t size, int (*compar)(const void*, const void*)); base -- 指向要排序的数组的第一个元素的指针. num -- 由 base 指向的数组中元素的个数. size -- 数组中每个元素的大小,以字节为单位. compar -- 用来比较两个元素

  • C++函数指针详解

    函数指针基础: 1. 获取函数的地址 2. 声明一个函数指针 3.使用函数指针来调用函数 获取函数指针: 函数的地址就是函数名,要将函数作为参数进行传递,必须传递函数名. 声明函数指针 声明指针时,必须指定指针指向的数据类型,同样,声明指向函数的指针时,必须指定指针指向的函数类型,这意味着声明应当指定函数的返回类型以及函数的参数列表. 例如: double cal(int); // prototype double (*pf)(int); // 指针pf指向的函数, 输入参数为int,返回值为d

  • c++函数名指针和函数指针

    目录 前言 例 1 例 2 例 3 前言 我们先来看一下函数指针式如何定义的,假如我们有一个函数int fun(int){…};那么他对应的函数指针写法就应该是int (*p)(int);然后再对他进行赋值,即p=fun;之后你就可以在接下来的地方按p作为函数名来调用它用起来完全和fun一样.(注意这里的p指针并不是只能接受fun这个函数名,任何返回值是int,参数只有一个int的函数都可以把函数名赋给p) 首先说一下C/C++在创建一个变量的时候比如int a;相应的在内存就会分配一个4个字节

  • C++中函数指针详解及代码分享

    函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,如同数组的名字就是数组的起始地址. 1.函数指针的定义方式:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,-); c++函数指针的定义形式:返回类型 (类名

  • C++函数指针的用法详解

    目录 C++函数指针详细理解 函数指针初识 函数指针作为形参使用 函数指针作为返回值 练习 总结 C++函数指针详细理解 函数指针初识 函数指针是指向函数的指针,并不等于函数,它能够执行函数的操作,可以跟指针变量一起来理解,其基本声明格式为: type (*ptrname)(形参列表); 例子,声明一个比较两个字符串大小的函数指针 bool (*cp)(const string s1, const string s2); 需要注意的是,不要去掉括号!!!如果去掉括号,含义就变成了返回一个bool

  • C++ 函数指针详细总结

    目录 1.函数指针 1.1 获取函数地址 1.2 声明函数指针 1.3 函数指针传参 1.4 调用函数 2.函数指针进阶 1.函数指针 函数指针顾名思义,就是指向函数的指针. 和数据类似,C++当中函数也有地址,函数的地址是存储函数机器语言代码的内存地址.我们可以将另外一个函数的地址作为参数传入函数,从而实现函数的灵活调用. 1.1 获取函数地址 获取函数地址的方法非常简单,只要使用函数名(后面不跟参数和括号)即可.比如我们有一个函数叫做think,那么think()是调用函数拿到结果,而thi

  • C++的函数与指针

    目录 函数与指针 指针作函数的参数-实现地址传递 返回指针的函数 指向函数的指针变量 总结 函数与指针 一个函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针.在C++中, 函数名代表函数的入口地址. 指针作函数的参数-实现地址传递 返回指针的函数 利用指向函数的指针调用函数 指针作函数的参数-实现地址传递 指针作函数的参数,具有以下用途: 指针作函数参数,这时形参接受的是实参的地址.函数中通过对指针的间接访问实现参数的按"引用传递"功能 设置多个指针参数可从函数中带回多个结

  • C++中指针函数与函数指针的使用

    指针函数 指针函数是一个函数,只不过指针函数返回的类型是某一类型的指针. 格式: 类型名* 函数名(函数参数列表) 使用: /* * 指针函数,返回int* 指针变量 */ int* add(int a, int b) { int *p; int c = a + b; p = &c; return p; } int main() { int* p; p = add(1, 4); printf("%d\n", *p); getchar(); return 1; } 函数指针 函数

  • c++ 函数指针相关总结

    下面随笔说明函数指针用法. 函数指针的定义: 定义形式: 存储类型 数据类型 (*函数指针名)() 含义: 函数指针指向的是程序代码存储区 函数指针的典型用途-----实现函数回调 通过函数指针调用的函数 例如将函数的指针作为参数传递给一个函数,使得在处理相似事件的时候可以灵活的使用不同的方法. 调用者不关心谁是调用者 需知道存在一个具有特定原型和限制条件的被调用函数. 获取函数指针: 函数的地址就是函数名,要将函数作为参数进行传递,必须传递函数名. 声明函数指针 声明指针时,必须指定指针指向的

  • c++函数指针和回调函数示例

    1.函数指针 函数指针是一个指针,只是这个指针它不像普通的指针指向是是一个变量,此时它指向的是一个函数,也就是它存储的是一个函数的地址,如果我们改变它的值,让它所指向的地址由指向funA转变为指向funB,那么这个函数指针的作用就改变了. 2.回调函数 什么是回调函数呢?回调函数其实就是一个通过函数指针调用的函数!假如你把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,这就是回调机制.B函数就是回调函数. 3.函数指针的使用 3.1函数指针声明 typedef

  • linux kernel 打印函数指针对应的函数名方法

    内核中函数指针用的很多,在debug 的时候能直接打印出一个函数指针对应的函数就会很方便. 打印裸指针(raw pointer)用 %p,%p除了可以用来打印指针外还可以打印其它的信息 %pF可打印函数指针的函数名和偏移地址,%pf只打印函数指针的函数名,不打印偏移地址. 如       printk("%pf %pF\n", ptr, ptr) will print: module_start module_start+0x0/0x62 [hello] 但是为了支持这个功能你需要开启

  • C语言 指针变量作为函数参数详解

    在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁. 像数组.字符串.动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合. 有的时候,对于整数.小数.字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值. 有些初学者可能会使用

  • 函数指针与指针函数的学习总结

    函数指针是指向函数的指针,指针函数是指一个函数的返回值是一个指针,但下面的几道题还是感觉很迷惑.各位能否讲的详细点呢? (1) float(**def)[10]   def是什么?(2) double*(*gh)[10]   gh是什么?(3) double(*f[10])()   f是什么?(4) int*((*b)[10])    b是什么?这样老感觉有点乱,有什么窍门可以记得并理解的清楚一点么? ======================解答:   (1) def是一个指针, 指向的对象

  • C++普通函数指针与成员函数指针实例解析

    C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生.本文即对C++普通函数指针与成员函数指针进行实例解析. 一.普通函数指针 通常我们所说的函数指针指的是指向一般普通函数的指针.和其他指针一样,函数指针指向某种特定类型,所有被同一指针运用的函数必须具有相同的形参类型和返回类型. int (*pf)(int, int); // 声明函数指针 这里,pf指向的函数类型是int (

  • C语言 函数指针(指向函数的指针)详解

    一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数.这种指针就是函数指针. 函数指针的定义形式为: returnType (*pointerName)(param list); returnType 为函数返回值类型,pointerNmae 为指针名称,param list 为函数参数列表.参数列表中

  • C++函数指针和回调函数使用解析

    函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型变.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数.返回值的函数指针变量 实例 以下实例声明了函数指针变量 p,指向函数 max: #include <stdio.h> int max(int x, int y){ return x > y ? x

  • c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind

    一.符号修饰与函数签名 1.符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名.GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 名字空间(或类)的名字前加上N 名字前还有一个数字,是名字的字符数.比如1C,1是C的长度. 3)函数名 与名字空间一样,函数名前也有数字,比如4func,4是func的字符数. 4)参数 参数以E开头 例子 N::C::func(int) 的函数签名经过修饰为_ZN1N1C4funcEi 2.函

  • C++静态成员函数和this指针详解

    目录 静态成员 1.静态成员变量 2.静态成员函数 成员变量和成员函数分开存储 this 指针 空指针访问成员函数 总结 静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员 静态成员分为: 1.静态成员变量 所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外初始化 示例: #include<iostream> using namespace std; class Person { public: static int m; // 所有对象共享同一份数据 }

  • C++函数指针+对象指针+this指针+指向类静态和非静态成员的指针

    目录 1.指向函数的指针 2.对象指针 3.this指针 4.指向类的非静态成员的指针 5.指向类的静态成员的指针 1.指向函数的指针 函数的代码在内存中的首地址,是由函数名表示的,也就是说函数名等价于函数代码首地址.因此,可以定义一个指向函数的指针,即函数指针.函数指针定义和赋值的语法如下,其中数据类型代表指向函数的返回类型,形参表为指向函数的形参表:赋值时必须保证指向的函数名和函数指针的返回类型和形参完全相同: 数据类型 (*函数指针名)(形参表);函数指针名 = 函数名; 下面的例子定义了

随机推荐