C++ 函数指针复习
2013-02-05 17:36
225 查看
原文地址:C与C++函数指针作者:天涯子
e.g
void (*pf) ( char,int );
这个语句将pf声明指向函数的指针,它所指向的函数带有一个char类型,一个int类型,返回类型为void
我们可以这样理解:我们怎么定义普通的指针呢,如我们定义一个int型的指针,
int *p;
是在变量声明前面加*,即p前面加上*号。而我们定义函数指针要在函数声明前加*, 函数声明为
void pf( char,int );
函数声明前加*后变成
void *pf(char,int);
我们把*pf用小括号括起来,变成
void (*pf) ( char,int ); 这就是函数指针的声明方法
测试代码如下:
#include"stdio.h"
void (*pf)(char, int);
void fun(char ,int); //声明一个函数,形参为一个char类型,一个int类型,返回类型为void
int main()
{
pf=fun; //给函数指针pf赋值为fun函数的地址(函数名代表函数的地址)
(*pf)('c',90); //调用pf指向的函数
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
函数运行后的结果是
The argumeng is c and 90
typedef void (*FCN) (char,int);
记忆方法:在函数指针声明 void (*FCN)(char,int)前加上typedef关键字就是函数指针类型的声明。
该定义表示FCN是一种函数指针类型。该函数指针类型表示这样一类函数指针:
指向返回void类型并带有一个char类型,一个int类型的函数指针。
测试代码如下:
#include"stdio.h"
typedef void (*FCN)(char, int); //声明一个函数指针类型
void fun(char ,int); //声明一个函数,形参为一个char类型,一个int类型,返回类型为void
int main()
{
FCN pf;
pf=fun; //给函数指针pf赋值为fun函数的地址(函数名代表函数的地址)
(*pf)('c',90); //调用pf指向的函数
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
typedef void (*FCN)(char, int); //声明一个函数类型
该声明定义了一个函数类型,FCN表示这样一类函数,带有两个形参,一个是int ,一个是char,返回值是void型。一般用于函数声明和函数的形参。
一般我们在调用函数时,应该先声明要调用函数,如我们调用fun函数,则应在调用的前面声明void fun(char ,int);
如果我们定义了函数类型typedef void FCN(char , int);我们就可以这样声明函数原形,
FCN fun;
大大简化了函数原型的声明,函数类型用于形参的情况我们在下面讲解。
#include"stdio.h"
typedef void FCN(char , int);
int main()
{ FCN fun;
fun('c',90);
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
void (*pf)(char, int);
pf=fun;
两种调用方法
(*pf)('c',90); // 显式调用
pf(‘c’,90); // 隐式调用
测试代码如下:
#include"stdio.h"
void (*pf)(char, int); //声明一个函数指针,它所指向的函数形参带有一个char类型,一个int类型,返回类型为void
void fun(char ,int); //声明一个函数,形参为一个char类型,一个int类型,返回类型为void
int main()
{
pf=fun; //给函数指针pf赋值为fun函数的地址(函数名代表函数的地址)
(*pf)('c',90); //调用pf指向的函数
Pf(‘a’,80);
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
int (*ff(int))(int*,int);
要理解函数指针声明的最佳方法是从声明的名字开始由里而外理解。要理解该声明的含义,首先观察:
ff(int)
将ff声明为一个函数,它带领有一个int 型的形参。该函数返回
int (*)(int*,int);
它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是int *型和int型的形参。
使用typedef可使该定义更简明易懂:
typedef int (*PF)(int *,int);
PF ff(int);
允许将形参定义为函数类型,但函数的返回类型则必须是指向函数的指针,而不能是函数。
具有函数类型的形参所对应的将被自动转换为指向相应函数类型的指针。但是,当返回的是函数时,同样的转换操作则无法实现,
//func is a function type,not a pointer to function!
typedef int func(int*,int)
void f1(func); //ok: f1 has a parameter of function type
func f2(int) ;//error: f2 has a return type of function type
func * f3(int);//ok: f3 return a pointer to function type
1、函数指针
定义:函数指针是指指向函数的指针。像其他指针一样,函数指针也指向特定的类型。函数类型由其返回值以及形参表确定,而与函数名无关。e.g
void (*pf) ( char,int );
这个语句将pf声明指向函数的指针,它所指向的函数带有一个char类型,一个int类型,返回类型为void
我们可以这样理解:我们怎么定义普通的指针呢,如我们定义一个int型的指针,
int *p;
是在变量声明前面加*,即p前面加上*号。而我们定义函数指针要在函数声明前加*, 函数声明为
void pf( char,int );
函数声明前加*后变成
void *pf(char,int);
我们把*pf用小括号括起来,变成
void (*pf) ( char,int ); 这就是函数指针的声明方法
测试代码如下:
#include"stdio.h"
void (*pf)(char, int);
void fun(char ,int); //声明一个函数,形参为一个char类型,一个int类型,返回类型为void
int main()
{
pf=fun; //给函数指针pf赋值为fun函数的地址(函数名代表函数的地址)
(*pf)('c',90); //调用pf指向的函数
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
函数运行后的结果是
The argumeng is c and 90
2、函数指针类型
函数指针类型相当地冗长。使用typedef为指针类型定义同义词,可将函数指针的使用大大简化typedef void (*FCN) (char,int);
记忆方法:在函数指针声明 void (*FCN)(char,int)前加上typedef关键字就是函数指针类型的声明。
该定义表示FCN是一种函数指针类型。该函数指针类型表示这样一类函数指针:
指向返回void类型并带有一个char类型,一个int类型的函数指针。
测试代码如下:
#include"stdio.h"
typedef void (*FCN)(char, int); //声明一个函数指针类型
void fun(char ,int); //声明一个函数,形参为一个char类型,一个int类型,返回类型为void
int main()
{
FCN pf;
pf=fun; //给函数指针pf赋值为fun函数的地址(函数名代表函数的地址)
(*pf)('c',90); //调用pf指向的函数
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
3、函数类型
函数类型的定义:typedef void (*FCN)(char, int); //声明一个函数类型
该声明定义了一个函数类型,FCN表示这样一类函数,带有两个形参,一个是int ,一个是char,返回值是void型。一般用于函数声明和函数的形参。
一般我们在调用函数时,应该先声明要调用函数,如我们调用fun函数,则应在调用的前面声明void fun(char ,int);
如果我们定义了函数类型typedef void FCN(char , int);我们就可以这样声明函数原形,
FCN fun;
大大简化了函数原型的声明,函数类型用于形参的情况我们在下面讲解。
#include"stdio.h"
typedef void FCN(char , int);
int main()
{ FCN fun;
fun('c',90);
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
4、通过指针调用函数
指向函数的指针可用于调用它所指向的函数。可以不需要使用解引用操作符,直接通过指针调用此函数。void (*pf)(char, int);
pf=fun;
两种调用方法
(*pf)('c',90); // 显式调用
pf(‘c’,90); // 隐式调用
测试代码如下:
#include"stdio.h"
void (*pf)(char, int); //声明一个函数指针,它所指向的函数形参带有一个char类型,一个int类型,返回类型为void
void fun(char ,int); //声明一个函数,形参为一个char类型,一个int类型,返回类型为void
int main()
{
pf=fun; //给函数指针pf赋值为fun函数的地址(函数名代表函数的地址)
(*pf)('c',90); //调用pf指向的函数
Pf(‘a’,80);
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
5、返回指向函数的指针
函数可以返回指向函数的指针,但是,正确写出这种返回类型相当不容易:int (*ff(int))(int*,int);
要理解函数指针声明的最佳方法是从声明的名字开始由里而外理解。要理解该声明的含义,首先观察:
ff(int)
将ff声明为一个函数,它带领有一个int 型的形参。该函数返回
int (*)(int*,int);
它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是int *型和int型的形参。
使用typedef可使该定义更简明易懂:
typedef int (*PF)(int *,int);
PF ff(int);
允许将形参定义为函数类型,但函数的返回类型则必须是指向函数的指针,而不能是函数。
具有函数类型的形参所对应的将被自动转换为指向相应函数类型的指针。但是,当返回的是函数时,同样的转换操作则无法实现,
//func is a function type,not a pointer to function!
typedef int func(int*,int)
void f1(func); //ok: f1 has a parameter of function type
func f2(int) ;//error: f2 has a return type of function type
func * f3(int);//ok: f3 return a pointer to function type
相关文章推荐
- c++ 指针、引用、内存管理、函数(引用、重载、内敛)——c++复习(一)
- C++基础复习---1(函数指针,指针函数)
- c/c++ 复习基础要点01-const指针、指针函数 函数指针、new/delete与malloc/free区别与联系
- 关于C++中函数指针的使用
- [C++] C++中const修饰指针,变量, 函数参数和函数返回值的用法总结
- C++---从函数返回指针
- 引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针
- c++之指针作为函数参数传递的问题
- 如何使用c++的成员函数指针
- 实例解析C++中类的成员函数指针
- C/C++沉思-----指针函数和函数指针
- 定义函数的指针,C++和C不同是因为函数重载
- 【c++】函数指针
- C++中函数参数传递(值传递、指针传递,引用传递)
- C++指针【数组、字符串作为函数的参数】
- C++之函数指针
- C++中的函数指针
- C++中的成员函数调用原理及this指针的传递方式
- C++中传送函数指针
- 理解复杂的C/C++声明 const, typedef , 函数指针