C/C++函数指针,指针函数的用法,用处

2024-03-17 15:38

本文主要是介绍C/C++函数指针,指针函数的用法,用处,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先看函数指针
int func2(int x);    /* 声明一个函数 */
int (*q2) (int x);   /* 声明一个函数指针 */
q2=func2;        /* 将func函数的首地址赋给指针f */
int c=(*q2)(3);   //3可以为任意实参
上面4句基本说明了函数指针的用法:
函数指针是指向函数的指针,确切的说,是指向特定类型函数的指针(函数与函数指针 类型要匹配)
函数指针用来保存函数首地址,即可以通过该指针访问函数。函数指针 相当于取别名
函数指针可以指向一类函数,而不是一个函数,即 可以重新赋值。(见例2)
函数指针不难,只要记住上面黑体字就差不多了,附上两个简单的例子
例1:

#include<stdio.h>
int max(int x,int y){ return(x>y?x:y); }
void main()
{int (*ptr)(int, int);  //定义一个指针int a,b,c;ptr=max;scanf("%d%d",&a,&b);c=(*ptr)(a,b);printf("a=%d,b=%d,max=%d",a,b,c);
}

例2:
#include<stdio.h>
void FileFunc()
{printf("FileFunc\n");
}
void EditFunc()
{printf("EditFunc\n");
}
void main()
{typedef void (*funcp)();funcp pfun= FileFunc;pfun();pfun = EditFunc;pfun();
}

再看指针函数:
int *func(int x);/* 声明一个指针函数 */
int *q; /* 声明一个指针 */
q=func(3);//3可以为任意实参
上面三句基本说明了指针函数:
指针函数是返回值为指针的函数,所以我们在main()中调用它时可以用一个同类型的指针来接收。
指针函数可以用来解决众多问题,如返回多个值的问题。(见"函数返回多个值的方法"那篇文章)
指针函数比经常更经常用到,一定要学会用
指针函数逻辑简单,结构清新,功能强大,质量好,效率高,堪比极品中的凤姐,胜过。。。(求下联),反正不学会真是损失。
例3也是百度来的,个人觉得很经典,涉及到了指针,数组指针,指针函数,二维数组的赋值,函数返回多个值,数组指针的自增与指针自增的区别。。。众多知识。看懂这个基本指针这一块差不多了。
例3:
其实跟函数指针无关,考虑
float (*p)[4]; // pointer to an array of 4 floats
float *p[4];   // an array with 4 pointers pointed to float

#include<iostream>
using namespace std;
int main()
{float *find(float (*p)[4],int m);//查询序号为m的学生的四门课程的成绩float score[][4]={{50,51,52,55},{70,70,40,80},{77,99,88,67}};//定义成绩数组,第一维可以为变量float *pf=NULL;//定义一个指针时一定要初始化int i,m;//cout<<"请输入您想查询的学生的序号:";cin>>m;pf=find(score,m);//返回为一维数组指针,指向一个学生成绩for(i=0;i<4;i++)cout<<*(pf+i)<<" ";cout<<endl;return 0;
}
float *find(float (*p)[4],int m)
{float *pf=NULL;pf=*(p+m);//p是指向二维数组的指针,加*取一维数组的指针return pf;
}
例4:
对象可以调用自己的析构函数:
也可以调用自己的构造函数:
再演示一下指向成员变量的指针:
#include <iostream>
#include <string>
#include <stack>
using namespace std;
class A {
public:int x;char y;int z;char p;
};
class Base {
public:virtual void f() { cout << "Base::f" << endl; }virtual void g() { cout << "Base::g" << endl; }virtual void h() { cout << "Base::h" << endl; }void f1() {printf("f1\n");}void f2() {printf("f2\n");}char c;
};
int max(int x,int y){ return(x>y?x:y); } 
int main()
{A a;int res = (reinterpret_cast<int>(&a.p) - reinterpret_cast<int>(&a)) / sizeof(a.p); Base b;int x = sizeof(b);//cout << "虚函数表地址:" << (int*)(&b) << endl;//cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;//pFun = (Fun)*((int*)*(int*)(&b));//pFun();typedef void(Base::*Fun)(void);void (Base::*Fun2)(void);Fun pFun = NULL;Fun2 = &Base::f1;Fun p1 = &Base::f1;Fun p2 = &Base::f2;printf("%#p\n",p1);   //使用cout << p1 << endl;只输出1,cout函数的问题。。。。b.~Base();b.f1();b.Base::Base();return 0;
}




来自于:
http://www.cnblogs.com/anwcq/p/C_zhizhenhanshu.html







这篇关于C/C++函数指针,指针函数的用法,用处的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/819378

相关文章

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五