函数指针及其应用 函数指针的应用
推荐
http://aoqingy.spaces.live.com/blog/cns!153c2d72af27eb1c!295.entry
C语言专题(二):函数指针及其应用
函数指针:函数的入口地址
C程序变量驻留在程序内存空间的某个地址,它所在的地方取决于变量类型(自动变量、静态变量或全局变量等)。我们可以很容易打印变量的地址,如下所示:
#i nclude <stdio.h>
int main(void)
{
int i = 3;
printf("i resides at %pn", &i); //i resides at 0xbfef6c44
return 0;
}
在程序中,操作符&作用于变量i,要求生成i的地址,而格式化标识符%p指定输出内存地址。上述程序的可能输出如下:
i resides at 0xbfef6c44
同变量一样,我们也可以打印函数的地址。下面这段代码说明了这一点:
#i nclude <stdio.h>
void func(void);
int main(void)
{
int i = 3;
printf("i resides at %pn", &i); // i resides at 0xbfe2f6f4
printf("func() resides at %pn", &func); // func() resides at 0x80483fa
// printf("func() resides at %pn", func); // func() resides at 0x80483fa
printf("main() resides at %pn", &main); // main() resides at 0x8048368
// printf("main() resides at %pn", main); // main() resides at 0x8048368
return 0;
}
void func(void)
{
printf("Hello, worldn");
}
对应的输出如下:
i resides at 0xbfe2f6f4
func() resides at 0x80483fa
main() resides at 0x8048368
实际上,函数也驻留在程序的内存空间中。地址操作符&也可以作用于函数,从而生成函数所在的地址。
如何声明函数指针
在C语言中,所有变量都需要声明和定义,函数指针也不例外。
变量和指针的声明及定义如下:
int i;
int *int_ptr = &i;
很自然会联想到:
int f(int arg);
int *func_ptr(int arg) = &f;
实际上,由于根据运算符优先级规则,括号的优先级要比指针高,因此这种形式定义了一个指针函数,也就是一个返回指向整型数的指针的函数。
函数指针的正确定义为:
int f(int arg);
int (*func_ptr)(int arg) = &f;
需要强调的是,函数指针和它所指向的函数应该是兼容的。下例给出了一些对函数及函数指针的错误赋值:
int func(int arg)
{
return 0;
}
int *func_ptr1(int arg);
int (*func_ptr2)(int arg);
int (*func_ptr3)(void);
double (*func_ptr4)(int arg);
int main(void)
{
// func_ptr1 = &func; //error: invalid lvalue in assignment
func_ptr2 = &func; //pass
// func_ptr3 = &func; //warning: assignment from incompatible pointer type
// func_ptr4 = &func; //warning: assignment from incompatible pointer type
}
其中,只有第二个赋值是正确的。在示例一中,func_ptr1并不是函数指针,而是一个指向指针的函数。在示例三中,func_ptr3只能指向没有参数的函数,而函数func带有一个整型参数。而示例四中,func_ptr4只能指向返回double类型的函数,而函数func返回的是int类型。
如何获得函数的地址
有两种方式获取函数的地址。假设funcptr是一个函数指针。如果我们将它指向一个兼容函数func()。
第一种方法使用隐式指针转换(implicit conversion to pointer):
funcptr = func;
第二种方法使用显式指针转换(explicit conversion to pointer):
funcptr = &func;
这两种方法都是可行的。实际上,如果在程序中有第一种形式的语句,编译器会把它自动转换为第二种方式。
使用函数指针调用函数
象获取函数的地址一样,通过函数指针调用函数的方法也有两种:
第一种是使用显式指针(explicit dereference of the pointer),如下:
extern void func(int x, int y);
void (*func_ptr)(int x, int y) = func;
(*funcptr)(3, 2);
第二种称为隐式指针(implicit dereference of the pointer)。
extern void func(int x, int y):
void (* func_ptr)(int x, int y) = func;
funcptr(3, 2);
函数指针的应用
在Linux内核实现中大量使用了函数指针。待补充…
更多阅读
二维数组与数组指针的用法 二维数组指针传递
二维数组与数组指针的用法 严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其它数据结构
C ++ 中对象或其对象指针的赋值 c语言指针赋值
C++中对象或其对象指针的赋值C++中成员函数的动态绑定:C++中要实现函数的动态绑定,必须在其基类中将函数声明为virtual且在子类中对函数加以实现。然后用一个基类指针指向某一个子类对象,这样才会在函数调用时实现动态绑定。在C++中,只
C指针的声明、赋值和基础操作 函数指针赋值
指针赋值:指针的初始化、赋值是同类型实体(即实体变量)的地址int i=10;int* ip=&i (&表示实体的地址)int* ipt=&10是不可以的,10是实体,而不认可具有空间地址(所以说是实体变量地址才有效,也就是说将某一个const的变量赋值给指
李德仁:智慧城市及其应用 2013年11月04日 82 来源:国脉物联网 东国税通字2013 82
李德仁:智慧城市及其应用2013年11月04日TAG:李德仁智慧城市中科院院士李德仁教授发言下午的会议首先邀请中国科学院院士、中国工程院院士、武汉大学教授李德仁先生,李院士是摄影测量与遥感学方面的专家,他首创的选权迭代法被国际测量学
理解指向指针的引用 指向函数的指针
在做项目时,用到第三方的API:RequestService( string *reqst, string *&Rsp)怎么来调用这个API呢?由于对指针的使用不熟悉,分别作了如下尝试:(1)想当然,把2个参数都当作普通的指针:string input="Help Me";string output;RequestService(