本文参考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. HW4.38

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  2. HW3.4

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  3. 高效Linux用户需要了解的命令行技能

    最近在Quora上看到一个问答题目,关于在高效率Linux用户节省时间Tips. 将该题目的回答进行学习总结,加上自己的一些经验,记录如下,方便自己和大家参考. 下面介绍的都是一些命令行工具,这些工具 ...

  4. C# WinForm修改Panel边框颜色

    private void panel1_Paint(object sender, PaintEventArgs e) { ControlPaint.DrawBorder(e.Graphics, thi ...

  5. 解决org.apache.subversion.javahl.ClientException: svn: E200007: Runner for 'org.tmatesoft.svn.core.wc2.SvnMerge' command have not been found

    最近使用svn的merge功能合并代码,一直出现一个错误: org.apache.subversion.javahl.ClientException: svn: E200007: Runner for ...

  6. 《Effect Java》学习笔记1———创建和销毁对象

    第二章 创建和销毁对象 1.考虑用静态工厂方法代替构造器 四大优势: i. 有名称 ii. 不必在每次调用它们的时候都创建一个新的对象:   iii. 可以返回原返回类型的任何子类型的对象: JDBC ...

  7. C++库研究笔记——生成一组随机数

    当试图用 srand(time(0)) rand() 生成一组随机数时发现,生成的数字很多都是「一样」的 经过测试:srand(seed); rand() 生成随机数,当seed一样时,生成的随机数相 ...

  8. time_t和struct tm之间的转换

    time_t到struct tm的转换: #include <time.h> struct tm *localtime(const time_t *timep); struct tm到ti ...

  9. 机器人api(图灵机器人)

    图灵机器人,是基于自然语言解析的智能机器人,已经免费开放了机器人api接口,有需求的同学能够去试试. 图灵机器人官网:http://www.tuling123.com 图灵机器人体验:http://w ...

  10. VersionCode和VersionName

    关于apk更新版本的问题   先上结论: Google为APK定义了两个关于版本属性:VersionCode和VersionName,他们有不同的用途. VersionCode:对消费者不可见,仅用于 ...