本文参考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++函数指针和指针函数的更多相关文章

  1. C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用

    类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...

  2. cocos2dx 3.x(获得父类的node型指针调用父类函数this->getParent())

    void CenterLayer::zhanzheng(CCObject* pSender){ ((GameScene*)this->getParent())->showLayer(Gam ...

  3. 对线程等待函数pthread_join二级指针参数分析

    分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地 ...

  4. C语言指针变量作为函数参数

    0x01 指针变量作为函数参数的作用是:将一个变量的地址传送到另一个函数中. 0x02 简单的例子:虽然都能实现功能,但意义不同. 正确的写法: #include <stdio.h> vo ...

  5. 函数指针与指针函数以及typedef

    c难于理解的是指针,其魅力之处也是指针,函数方法结构,化繁为简可以理解为:返回值 函数名(形参表),具体来说: 返回值:1.可以为空void 2.基本数据类型char short int long f ...

  6. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  7. C++ 必知必会:条款16 指向成员函数的指针并非指针

    这一点与指向成员的指针类似,其实现可能更加复杂,因为成员函数同时还存在虚拟函数,需要动态绑定执行动作.当然这种属性是属于函数本身的,此处表达的是指针不涉及函数的属性问题. 1: class shape ...

  8. C:函数指针、回调函数

    函数指针 是一个指针,指向函数的指针,指针存放的都是地址,所以函数指针存放的是函数的地址.数组名就是数组的首地址,函数名就是函数的首地址.与数组类似. 代码demo int (*p) (int ,in ...

  9. C++函数的传入参数是指针的指针(**)的详解

    要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用.如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&.但是如果变量 ...

  10. C++数组(指针)作为函数参数

    本文的学习内容参考:http://blog.csdn.net/wwdlk/article/details/6322843 1.当用数组名作为函数参数时,函数的实参和形参都应为数组名(或者指针): Ex ...

随机推荐

  1. jsp网站与discuz论坛用户同步

    需求分析: 要想实现A(jsp网站)和B(discuz论坛)的同步,这里说的同步指的是 在AB网站任意一方注册之后在另一方都可以直接登录 AB两网站之间的用户登陆状态是同步的,在任意一方登录后,另一方 ...

  2. 获取所有组合算法、获取全排列算法(java)

    转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5574516.html 受到ACM1015的影响,个人感觉,有必要对统计学上的 全组合和全排列 进行一个简单的总结 ...

  3. HDOJ-ACM1008(JAVA)

    这道题很简单,主要是要搞清楚题目的意思 以下是JAVA语言实现: import java.util.*; import java.io.*; public class Main{ public sta ...

  4. UVa1449 - Dominating Patterns(AC自动机)

    题目大意 给定n个由小写字母组成的字符串和一个文本串T,你的任务是找出那些字符串在文本中出现的次数最多 题解 一个文本串,多个模式串,这刚好是AC自动机处理的问题 代码: #include <i ...

  5. httpclient在抓取网页时出现速度慢的情况分析

    问题: 最近在使用httpclient3.0 来做项目,在一台机器部署系统后,发现此机器比其它机器在抓取页面的速度上慢了大概4s,左右. 项目是部署在局域内网,所以代码中都是直接写的IP地址 .在使用 ...

  6. poj3177--Redundant Paths(边的双连通)

    有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任何两个牧场之间至少有两条独立的路.两条独立的路是指:没有公共边的路,但可以 ...

  7. A Tour of Go Short variable declarations

    Inside a function, the := short assignment statement can be used in place of a var declaration with ...

  8. NSDictionary或NSArray与JSON字符串相互转换

    在iOS 5 中,苹果引入了一个解析JSON串的NSJSONSerialization类.通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化. 以前,我记得我用的是 ...

  9. 分布式存储Ceph的几种安装方法,源码,apt-get,deploy工具,Ubuntu CentOS

    最近搞了下分布式PB级别的存储CEPH  尝试了几种不同的安装,使用 期间遇到很多问题,和大家一起分享. 一.源码安装 说明:源码安装可以了解到系统各个组件, 但是安装过程也是很费劲的,主要是依赖包太 ...

  10. vc关于文件拷贝

    单个文件的拷贝 system  针对单个文件 CopyFile  针对单个文件 /** @file_extension egg: .txt .png **/ void CopyFileToDir(CS ...