函数的指针

定义

函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型(特定的函数类型)。函数类型由其返回类型以及形参表确定,而与函数名无关。如下声明了一个函数指针:

bool (*pFunc)(int, double);

这个语句将pFunc声明为指向函数的指针,它所指向的函数带有两个类型分别为int和double的形参及一个 bool 类型的返回值。

说明:*pFunc 两侧的圆括号是必需的,否则它就变成了函数的声明,如:bool *pFunc(int, double);表示pFunc是一个带有两个参数(int和double)和一个bool指针类型返回值的函数。

总结,函数指针声明的一搬形式:

   T (*pFunc)(T args);

pFunc为函数指针,T为数据类型,参数(T args)可以有多个,也可以没有。

【例1】:

bool IsAdult(int age, double weight)
{
	if (age > 18 || weight > 40.0)
	{
		return true;
	}
	return false;
}

void TestFuncPointer()
{
	bool (*pFunc)(int, double);
	pFunc = IsAdult;
	cout << pFunc(12, 23) << endl;
}

结果:

0

用typedef简化声明

我们知道typedef可以给类型定义一个别名,函数指针本身就是一种类型,所以也可以给其定义一个别名简化基声明。如下:

typedef bool (*FuncPointer)(int, double);

该定义表示 FuncPointer是一种函数指针类型的名字。该指针类型为“指向返回 bool 类型并带有两个(int和double)引用形参的函数的指针”。则【例1】中的使用简化为如下:

【例2】:

bool IsAdult(int age, double weight)
{
	if (age > 18 || weight > 40.0)
	{
		return true;
	}
	return false;
}

typedef bool (*FuncPointer)(int, double);

void TestFuncPointer()
{
	FuncPointer pFunc = IsAdult;
	cout << pFunc(12, 23) << endl;
}

这样,如果有多个地方使用同种类型的函数指针的话,定义指向函数的指针就会简单很多。

初始化和赋值

在【例1】和【例2】中已经提到了函数指针的使用。在给函数指针赋值时,直接引用函数名等效于在函数名上应用取地址操作符,都是把函数的地址赋给函数指针变量。

bool IsAdult(int age, double weight)
{
	if (age > 18 || weight > 40.0)
	{
		return true;
	}
	return false;
}

bool isIntBiger(int val1, double val2)
{
	return val1 > val2;
}

int GetMax(int val1, int val2)
{
	return val1 > val2 ? val1 : val2;
}

typedef bool (*FuncPointer)(int, double);

void TestFuncPointer()
{
	FuncPointer pf1 = 0;			// 初始化为0(即空指针),表示该指针不指向任何函数
	FuncPointer pf2 = IsAdult;		// 用函数名初始化函数指针
	FuncPointer pf3 = isIntBiger;	// IsAdult和isIntBiger参数和返回类型都相同,所以属于相同类型的函数
	pf1 = IsAdult;					// 用函数名赋值
	pf1 = pf3;						// 用函数指针赋值
	cout << pf1(13, 15) << endl;
	cout << pf2(13, 56) << endl;
	cout << pf3(18, 15) << endl;

	//FuncPointer pf4 = GetMax;		// error,GetMax不是属于FuncPointer类型的函数,因为参数类型和返回值的类型都不同
}

结果:

0

1

1

函数指针作为函数参数

函数指针还可以作为别一个函数的形参。这种形参可以用以下三种形式中的任何一种编写:

void printBiger(int, int, int (int, int)); //等价于void printBiger(int, int, int func(int, int));

void printBiger(int, int, int(*func)(int, int)); //等价于void printBiger(int, int, int(*func)(int, int));

void printBiger(int, int, FuncPointerMax); //还可以用简化的形式

【例3】:

int GetMax(int val1, int val2)
{
	return val1 > val2 ? val1 : val2;
}

typedef int (*FuncPointerMax)(int, int);

void printBiger(int val1, int val2, int func(int, int))
{
	cout << func(val1, val2) << endl;
}

void TestFuncPointer()
{
	FuncPointerMax pFuc = GetMax;
	printBiger(5, 10, pFuc);
}

函数指针作为函数的返回值

函数指针还可以作为函数的返回值类型,其写法比较复杂,例如:

int (*func(int))(int*, int);

要理解这个函数指针的声明,最佳的方法是从声明的名字开始由里而外理解。func(int) 将func声明为一个函数,它带有一个int型的形参,该函数返回一个函数指针,函数指针的类型为:

int (*)(int*, int);

是不很难理解?那有没有易于理解的写法呢?答案是肯定的,我们同样可以用typedef 进行简化,如下:

typedef int (*FuncPointer)(int*, int);

FuncPointer func(int);

?

时间: 2024-10-11 03:38:43

函数的指针的相关文章

类的成员函数的指针

前面一篇文章<函数的指针 >介绍了全局函数的指针,现在我们再来介绍一下成员函数的指针. 成员函数指针的定义: 一般形式 Return_Type (Class_Name::* pointer_name) (Argument_List); 用typedef简化的形式 Typedef Return_Type (Class_Name::* FuncPtr_Type) (Argument_List); FuncPtr_Type pFunc = NULL; //pFunc为成员函数指针的指针变量 成员函数

【C++】函数和指针

最近在看C++ primer plus,感觉函数与指针这一章难点比较多,记写笔记,加强理解. From C++ Primer Plus: Chapter 7 Function:C++ Programming Modules 1. 如何声明函数指针? 和函数原型类似: 需要声明指针指向函数的返回值和参数列表 double pam(int); //参数为int 类型,返回值为double 类型的函数 double (*pf);(int) //指向参数为int类型,返回值为double 类型的指针 p

成员函数指针和指向静态成员函数的指针

#include <iostream> using namespace std; class Student{ public:     Student(const string& name):m_name(name){}     void who(void){         cout << m_name << endl;     }     string m_name;     static int s_add(int a,int b){         re

类成员函数的指针与多态性

1 类成员函数的指针 2 类成员函数的指针数组 3 指向类成员函数的指针的指针 1 类成员函数的指针 auto func1 = &com::jia;//C++函数指针 int (com::*p)(int, int) = &com::jia;//C函数指针 1 #include <iostream> 2 3 class com 4 { 5 private: 6 int a; 7 int b; 8 public: 9 com(int x, int y) :a(x), b(y) 10

指针实现两数交换和指向函数的指针

指针就是地址,而指针变量就是存储地址的变量. 1.指针与函数 利用指针解决: C语言中函数的参数采用"单向传递",故第一个程序中改变形参不会改变实参,而在第二个程序中,使用指针变量作为参数,改变指针变量所指向的值,函数调用结束后,变量值被保留下来. 2.指向函数的指针的应用

函数和指针 C++

一.用函数指针变量调用函数. 指针变量也可以指向一个函数,一个函数在编译时被分配给一个入口地址.这个函数入口地址就称为函数的指针.可以用一个指针变量指向函数,然后通过该指针变量调用此函数. 定义指向函数的方法,格式是: int (*p)(int,int);     函数名代表函数入口地址,而max(a,b)则是函数调用. 二.返回指针值的函数 一个函数可以带回一个整数值.字符值.实型值等,也可以带回指针型的数据,即地址.其概念和以前类似,只是带回的值是指针类型而已.返回指针值的函数简称为指针函数

c++: 指向类成员函数的指针

指向函数的指针有和指向类成员函数的指针的有什么不同? int f(char a, float b);如果它是普通函数,则它的类型是 int (*)(char, float);如果它是非静态成员函数,则它的类型是 int(ClassName::*)(char, float);如果它是静态成员函数,则它的类型是和普通函数一样. 如何把一个类的成员函数传递给event handler, 线程启动函数等? 类的成员函数必须和一个类的实例结合起来才有意义.可以写一个函数来包装类的成员函数. class X

iOS指向函数的指针和block

  一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是block得标志  好比*:是指针的标志 特点:1:保存一段代码: 2:可以有参数和返回值: 3:可以作为函数的参数传递: 与代码块的区别,代码块里的代码会自动执行,block中代码要手动调用: 二:普通数据类型.指向函数的指针.block的定义的类比 1:基本数据类型: 例如:int a = 10; 格式:数据类型  变量名 = 值: 2:指向函数的指针:可以仿照上边基本数据类型的定义 例如:voi

c 函数及指针学习 10

标准库函数 1算数运算stdlib.h 2随机数stdlib.h 3字符串转化stdlib.h 4数学函数 math.h 5日期和时间 time.h 6信号 signal.h 7打印可变参数列表stdarg.h 8断言 assert.h 抽象数据类型在数据结构中比较仔细 运行时环境没看 来自为知笔记(Wiz)c 函数及指针学习 10,码迷,mamicode.com

数组、函数和指针

一.数组和指针 数组名同时也是该数组首元素的地址.例如:flizny == &flizny[0] , flizny 和 &flizny[0]都代表首元素的内存地址,两者都是常量: 指针+1的结果就是对该指针增加一个存储单元,对于数组而言,地址会增加到下一元素的地址,而不是下一个字节. 可以用以下等式表示: dates + 2 == &date[2] // 相同的地址 *(dates + 2) == dates[2] //相同的值 二.函数和指针 由于数组名就是数组首元素的地址,所以