C++函数指针和指针函数
本文参考http://www.prglab.com/cms/pages/c-tutorial/advanced-data/pointers.php
http://blog.csdn.net/ameyume/article/details/8220832
1.函数指针
函数指针是一个指针,其指向的是一个函数,而不是普通的数据类型或者类对象。其定义如下:
int (*func)(int a, int b); // 声明函数指针
函数指针的最大作用是将一个函数作为参数传递给另一个函数。函数指针的声明与声明一个普通的函数原型差不多,除了函数指针的函数名需要被括在括号内,并在函数名前添加星号asterisk(*)。这就说明函数指针的函数名是一个指针,上面的函数指针func定义为一个指向一个返回值为整型,有两个参数并且两个参数都是整型的函数。
下面是求两个数的和和差的函数指针用法:
// pointer to functions
#include <iostream.h>
using namespace std;
//求两个数的和
int addition (int a, int b) {
return (a+b);
} //求两个数的差
int subtraction (int a, int b) {
return (a-b);
}
int (*minus)(int,int) = subtraction;
int operation (int x, int y, int (*functocall)(int,int)) {
int g;
g = (*functocall)(x,y);
return (g);
} int (*func)(int,int); //声明函数指针
int main () {
int m,n;
/*以函数指针的形式来调用
func=addition;
int res=(*func)(7,5);
func=subtraction;
int res1=(*func)(20,res); */
m = operation (, , addition); //调用求和函数
n = operation (, m, minus); //调用求差函数
cout <<n;
system("pause");
return ;
}
2.指针函数
指针函数是带指针的函数,其本质是一个函数,只是返回类型是某一类型的指针;
其定义如下:
类型说明符 (*)函数名 (参数列表);
int * func (int x,int y);
由上面的定义可以看出,指针函数是一个返回值为地址类型的函数。需要注意的是:函数的返回值必须由同类型的指针变量来接受(也就是说,指针函数一定具有返回值)。其返回值的用法如下:
char *fun(); //声明一个返回类型为char类型的指针函数
char *p; //定义一个char类型的指针变量,用来接收fun()的返回值
p=fun();
指针函数的使用实例:
#include<iostream>
using namespace std; int * GetDate(int week,int day); //声明指针函数 int main()
{
int week,day;
do{
cout<<"please enter week(1--5) day(1--7)"<<endl;
cin>>week>>day;
}while(week<||week>||day<||day>)
cout<<*GetDate(week,day); //去引用获得该地址下的元素值
cout<<endl;
system("pause");
return ;
} int * GetDate(int week,int day)
{
static int calendar[][]=
{
{,,,,,,},
{,,,,,,},
{,,,,,,},
{,,,,,,},
{,,,-}
};
return &calendar[week-][day-]; //返回指向calendar某个元素的地址
}
以下例子参考http://blog.csdn.net/ameyume/article/details/8220832,以说明指针函数的使用过程中内存地址的转化
#include<iostream>
using namespace std;
int *f(int a, int b); // 声明指针函数
int main()
{
cout << "------------------------------Start\n";
int *p1 = NULL;
cout << "The memeory address of p1 = 0x" << p1 << endl;
p1 = f(, );
cout << "The memeory address of p1 = 0x" << p1 << endl;
cout << "*p1 = " << *p1 << endl;
cout << "------------------------------End\n";
system("pause");
return ;
}
/*
* 指针函数的定义
* 返回值是指针类型int *
*/
int *f(int a, int b) {
int *p = (int *)malloc(sizeof(int));
cout << "The memeory address of p = 0x"<<p << endl;
memset(p, , sizeof(int));
*p = a + b;
cout << "*p = " << *p << endl;
return p;
}
运行结果如下:

C++函数指针和指针函数的更多相关文章
- C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...
- cocos2dx 3.x(获得父类的node型指针调用父类函数this->getParent())
void CenterLayer::zhanzheng(CCObject* pSender){ ((GameScene*)this->getParent())->showLayer(Gam ...
- 对线程等待函数pthread_join二级指针参数分析
分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地 ...
- C语言指针变量作为函数参数
0x01 指针变量作为函数参数的作用是:将一个变量的地址传送到另一个函数中. 0x02 简单的例子:虽然都能实现功能,但意义不同. 正确的写法: #include <stdio.h> vo ...
- 函数指针与指针函数以及typedef
c难于理解的是指针,其魅力之处也是指针,函数方法结构,化繁为简可以理解为:返回值 函数名(形参表),具体来说: 返回值:1.可以为空void 2.基本数据类型char short int long f ...
- [Reprint]C++普通函数指针与成员函数指针实例解析
这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下 C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...
- C++ 必知必会:条款16 指向成员函数的指针并非指针
这一点与指向成员的指针类似,其实现可能更加复杂,因为成员函数同时还存在虚拟函数,需要动态绑定执行动作.当然这种属性是属于函数本身的,此处表达的是指针不涉及函数的属性问题. 1: class shape ...
- C:函数指针、回调函数
函数指针 是一个指针,指向函数的指针,指针存放的都是地址,所以函数指针存放的是函数的地址.数组名就是数组的首地址,函数名就是函数的首地址.与数组类似. 代码demo int (*p) (int ,in ...
- C++函数的传入参数是指针的指针(**)的详解
要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用.如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&.但是如果变量 ...
- C++数组(指针)作为函数参数
本文的学习内容参考:http://blog.csdn.net/wwdlk/article/details/6322843 1.当用数组名作为函数参数时,函数的实参和形参都应为数组名(或者指针): Ex ...
随机推荐
- MultiTouch camera controls source code
http://www.jpct.net/wiki/index.php/MultiTouch_camera_controls MultiTouch camera controls This code w ...
- php5.5 yum源
PHP官网在下载页面中只有源代码下载,当然使用编译安装也是可以的,但是使用二进制包安装会非常快速.虽然PHP官网没有提供二进制安装包,但是它推荐了两个第三方的YUM源(CentOS中默认的YUM安装的 ...
- 校友信息管理系统&SNS互动平台之用户需求及概要设计
前言.提纲及说明: 请移步:<校友信息管理&SNS互动平台之前言.目录及说明>(博客园地址:http://www.cnblogs.com/s6cn/p/3516876.html) ...
- 解决libcrypto.so.0.9.8: cannot open shared object file
文章解决的问题:安装nginx中需要libmysql.so.16包的支持,下面介绍如何安装,并建立lib的连接. 问题展示:error while loading shared libraries: ...
- 深入浅出Android动态载入jar包技术
在实际项目中.因为某些业务频繁变更而导致频繁升级client的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路.将核心的易于变更的业务封装在jar包里然后通过网络下载下来 ...
- careercup-递归和动态规划 9.5
9.5 编写一个方法,确定某字符串的所有排列组合. 类似leetcode:Permutations 解法: 跟许多递归问题一样,简单构造法非常管用.假设有个字符串S,以字符序列a1a2a...an表示 ...
- JNI 学习笔记系列(二)
c中没有Boolean类型的值,一般是使用1表示true,0表示false,c中也没有String类型的数据,c中的字符串要通过char数组来表示.c中没有byte类型,一般用char表示byte类型 ...
- Java基础知识强化之集合框架笔记73:如何选择使用哪种集合
1. 到底使用那种集合. 看需求 是否是键值对象形式: 是:Map 键是否需要排序: 是:TreeMap 否:HashMap 不知道,就使用HashMap. 否:Collection 元素是否唯 ...
- iOS之定位与地图
概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用 和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一 ...
- [置顶] html学习笔记,锚点,超链接,table布局,表头,h,sub,blockquote,ul,li,ol.dl,加入收藏,打印,弹出窗口
<a name="shouye"></a> <strong>strong加粗</strong> <br> 没有加粗 &l ...