【C/C++】函数指针
首先必须要清楚如下:
【1】函数指针即函数的地址,也就是存储其机器语言代码的首地址。该地址用函数名表示。
【2】用具体的函数名给函数指针变量赋值时必须满足两者的类型(即函数返回值类型)和特征标(即函数参数表的个数及对应数据类型)相同。
然后,相关语法如下:
(1)函数指针变量pf的声明格式:返回类型 (*pf)(形参表);
(2)函数指针赋值格式:pf=函数名;//赋值运算符两边的指针和函数应满足【2】
(3)通过函数指针调用其指向的函数的格式:pf(实参表);
[NOTE]:关于(3)的调用格式语法也可写成:(*pf)(实参表);//虽然与(3)的写法在逻辑上似乎是矛盾的,但是C++是允许的。就像《C++ Primer Plus》里
//讲这个矛盾时的一句话说的:容忍逻辑上无法自圆其说的观点正是人类思维的特点。
//我个人比较喜欢用(3)的写法,因为这样用与“函数名本身表示函数的地址”这一点是对应的。
如:
int max(int*,int);
int (*pf)(int*,int);
pf=max;
max(arr,10);//用函数名调用函数
pf(arr,10);//用函数指针调用函数
//[NOTE] arr是int数组名。
完整示例函数:
#include<iostream>
using namespace std; int main()
{
int max(int*,int);
int min(int*,int);
void callfun(int (*pf)(int*,int),int*);//函数指针作为函数形参
int p[]={,,,,,,,};
int (*pf)(int*,int);//声明函数指针
pf=max;
cout<<"max: "<<pf(p,)<<endl;//通过函数指针pf调用函数max
pf=min;
cout<<"min: "<<pf(p,)<<endl; callfun(max,p);//函数名max为实参
callfun(min,p); return ;
}
//---------------------
void callfun(int (*pf)(int*,int),int *p)
{
cout<<pf(p,)<<endl;
}
int max(int *pa,int n)
{
int m;
m=pa[];
for(int i=;i<n;i++)
if(pa[i]>m)
m=pa[i];
return m;
} int min(int *pa,int n)
{
int m;
m=pa[];
for(int i=;i<n;i++)
if(pa[i]<m)
m=pa[i];
return m;
}
【C/C++】函数指针的更多相关文章
- C++虚函数和函数指针一起使用
C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...
- 为什么 C++ 中成员函数指针是 16 字节?
当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小.例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录: Pushes a ...
- C++函数指针总结
学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了.本博文详细介绍一下常见的各种坑爹的函数指针. 至于指针的详细学习,推荐这篇博文C++指针详解 与数据一样,函 ...
- C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...
- 结构体内嵌函数指针实现C语言面向对象
结构体内嵌函数指针 #include<stdio.h> void say(int age) { printf("我%d岁了\n",age); } struct stud ...
- 用typedef定义函数指针的问题
在学习windows API的时候,遇到下面这段代码 以前见过的typedef的用法都是给一个数据类型取一个别名 typedef oldTypeName newTypeName 这种给数据类型 ...
- 你必须知道的指针基础-7.void指针与函数指针
一.不能动的“地址”—void指针 1.1 void指针初探 void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据.和用int表示指针异曲同工,只是更明确是“指针” ...
- objective-c中的@selector()和 c /c++的函数指针
先看tomcat里用到的代码: //然后开始动画 //把图片放到animationImages,接受数组参数 self.tom.animationImages = arrayImage; //设置时间 ...
- C++基础——函数指针 函数指针数组
==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...
- QT中使用函数指针
想仿命令行,所以定义了一个类,让一个String 对应一个 function,将两者输入list容器. 类中定义了 QString commandStr; void (MainWindow::*com ...
随机推荐
- TIdHTTPServer制作REST中间件
TIdHTTPServer制作REST中间件 使用DELPHI7+INDY9开发 // 陈新光 2017-2-21// LIS数据同步服务器// 浏览器输入:http://127.0.0.1:8000 ...
- java高级编程-使用反射强制给private字段赋值
转自:http://blog.csdn.net/yaerfeng/article/details/7103397 今天项目中遇到了一个问题,要调用一个类,并获取这个类的属性进行赋值然后将这个类传递到方 ...
- 百科知识 ass文件如何打开
直接拖入视频即可播放 鼠标右键 用记事本打开 也有一些软件支持比如POPSUB(也比较方便调整时间轴) 如果你是说如何加载字幕的话 用VOBSUB是最好的... ASS是视频的字幕,和视频放在同一文件 ...
- C++零基础到入门
(1)C语言概述 (2)编写.运行一个简单的C语言程序 (3)数据类型 (4)运算符和表达式 如果你对C语言一窍不通,那你就好好看这篇文章,我会力争让你真正的做到从零基础到入门,同时这篇文章会让你基本 ...
- linux find prune排除某目录或文件
http://blog.csdn.net/ysdaniel/article/details/7995681 查找cache目录下不是html的文件 find ./cache ! -name '*.ht ...
- Hadoop 50090端口的页面, Replication的数字是真实的文件备份数吗? (不是)
红色方框的部分,代表Hadoop系统,人工设定的文件备份数,但不是实际的备份数.文件备份数 不会大于集群机器的总数目(因为备份文件不会同时存在一台机器上,这样就没有意义),所以如果总集群数目是2,即使 ...
- vim 插件: ctrlp.vim
vim-scripts 里可以搜到这个插件. 安装好了之后,在 vim 的 normal 模式之下按 Ctrl+P 组合键即可弹出搜索窗口. * <f5> 更新目录缓存. * <c- ...
- PHP魔术方法之__call与__callStatic方法
<?php class human{ private function t(){ } //魔术方法__call /* $method 获得方法名 $arg 获得方法的参数集合 */ public ...
- 流迭代器 + 算法灵活控制IO流
前言 标准算法配合迭代器使用太美妙了,使我们对容器(数据)的处理更加得心应手.那么,能不能对IO流也使用标准算法呢?有人认为不能,他们说因为IO流不是容器,没有迭代器,故无法使用标准算法.他们错了,错 ...
- android检测当前网络是否可用
在android程序中运行第一步就是检测当前有无可用网络 如果没有网络可用就退出程序 if (isConnect(this)==false) { ...