C语言高级程序设计——函数指针

函数指针指向代码区,普通指针指向数据区。函数指针定义如下:

返回类型 (*函数指针变量)(参数表)

例如,void (*pf)()指向形如void f()这样的函数。

使用函数指针的例子:

void open();//对几个函数声明
void print();
void exit();
void (*pfs[])()={open,print,exit};//函数指针数组
int main(){
	int i;
	void (*pf)();
	pf=open;
	(*pf)();//////调用open()
	for(i=0;i<3;i++)////依次调用open()、print()、exit()函数
		(*pfs[i])();
}
void open(){
	printf("open\n");
}
void print(){
	printf("print\n");
}
void exit(){
	printf("exit\n");
}

从这个例子可以看出,函数名本身就是函数代码区的地址。

还有几个容易混淆的定义,考虑下面几个定义:

void (*getInterrupt(int no))();
void setInterrupt(int no,void (*pf));
LRESULT (*lpfnWndProc)(HWND,UNIT,WPARM,LPARAM);

第一个声明表示getInterrupt的原型声明,它有一个int类型的参数,返回值是指向类似void f()函数的指针。

第二个声明表示函数setInterrupt的原型声明,返回值是void,它有两个参数,类型分别是int和指向void f()函数的指针。

第三个声明定义了一个指针变量lpfnWndProc,指向形如LRESULT wndproc(HWND,UNIT,WPARM,LPARAM)的函数。

时间: 2024-10-07 14:55:20

C语言高级程序设计——函数指针的相关文章

函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)

记得刚开始工作时,一位高手告诉我说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后来明白那不单是跳来跳去那样简单,而是一种高级的异常处理机制,在某些情况下确实很有用. 事实上,longjmp和 setjmp玩得熟不熟与是不是C语言高手,不是因果关系.但是,如果可以套用那位高手的话,我倒想说如果函数指针玩得不熟,就不要自称为C语言高手.为什么这么说呢,函数指针有那么复杂吗?当然不是

0709 C语言常见误区----------函数指针问题

1.函数指针的定义 对于函数 void test(int a, int b){ // } 其函数指针类型是void (* ) (int , int), 注意这里第一个括号不能少, 定义一个函数指针,void (* pfunc)(int , int) ,其中pfunc就是函数指针类型, 它指向的函数类型必须是返回值为void, 参数为两个int的. 2.函数指针赋值 函数指针可以直接用函数名赋值,pfunc = test, 或者 pfunc = &test: 3.调用函数指针 pfunc(3, 4

1、C语言中的函数指针

一 通常的函数调用 1 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); 2 3 int main(int argc, char* argv[]) 4 { 5 MyFun(10); //这里是调用MyFun(10);函数 6 7 return 0; 8 } 9 10 void MyFun(int x) //这里定义一个MyFun函数 11 { 12 printf("%d\n",x); 13 } 这个MyFun函数是一个无返回值的函数,它

C语言学习019:函数指针

在C语言中,函数名也是指针变量,比如创建了一个add(int n,int m)的函数的同时也创建了一个名为add的指针变量,因此我们可以把函数指针当作一种类型为它赋值.当作参数传递等操作 C语言创建函数指针的公式: 返回类型 (*指针变量)(参数类型) 1 #include <stdio.h> 2 3 int add(int n,int m){ 4 return n+m; 5 } 6 7 int sub(int n,int m){ 8 return n-m; 9 } 10 11 int mai

策略设计模式与c语言中的函数指针

在C语言中有一个非常重要的概念-函数指针,其最重要的功能是实现回调函数(指函数先在某处注册,而它将在稍后某个需要的时候被调用)在java语言中没有指针的概念,但是可以利用接口和指针实现类似的功能,具体而言,应先定义一个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,从而实现回调函数(这里接口就像是注册的地方,实现类就是“注册人”,当实现类作为形参时,就是在需要的时候) package strateryDemo; import java.util.Ar

C语言:通过函数指针来完成两个数的加减乘除(函数指针当做参数使用)

// //  main.c //  Function_pointer // //  Created by mac on 15/8/2. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:将函数指针做参数来求两个整数的和.差.积.商. //知识点:函数指针就是一个指向函数的指针,通过指针指向要调用的函数来完成操作.其实,这个指针就是指向函数的入口地址. //切记:要被调用的函数必须和函数指针的声明的一样(包括:返回值类型.参数个数

【C语言】用函数指针变量完成:输入两个整数,让用户选择函数,选择1输出较大的数,选择2输出较小的数

<pre name="code" class="cpp">//用函数指针变量完成:输入两个整数,让用户选择函数,选择1输出较大的数,选择2输出较小的数 #include <stdio.h> int max(int x,int y) { return (x>y)?x:y; } int min(int x,int y) { return (x>y)?y:x; } int main() { int (*p)(int,int); int

C语言中的函数指针

1. 函数指针的定义 顾名思义,函数指针就是函数的指针.它是一个指针,指向一个函数. 2.函数指针的使用 我们定义了一个函数指针,但如何来使用它呢?先看如下例: #include <stdio.h> #include <string.h> char * fun(char * p1, char * p2) { int i = 0; i = strcmp( p1, p2 ); if (0 == i) { return p1 ; } else { return p2 ; } } int

C语言:通过函数指针来完成两个数的加减乘除

// //  main.c //  Function_pointer // //  Created by mac on 15/8/2. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:通过函数指针求两个整数的和.差.积.商. //知识点:函数指针就是一个指向函数的指针,通过指针指向要调用的函数来完成操作. //切记:要被调用的函数必须和函数指针的声明的一样(包括:返回值类型.参数个数和类型) #include <stdio.h