周立功手把手教你学嵌入式编程:函数指针与指针函数的应用
一特性,将pf定义为一个void *类型指针,那么任何指针都可以赋值给void *类型指针变量。其调用方式如下:
void * pf = add;
printf("addition result:%d\n", ((int (*)(int, int)) pf)(5, 8));
在函数指针的使用过程中,指针的值表示程序将要跳转的地址,指针的类型表示程序的调用方式。在使用函数指针调用函数时,务必保证调用的函数类型与指向的函数类型完全相同,所以必须将void *类型转换为((int (*)(int, int)) pf)来使用,其类型为"int (*)(int, int)"。
>>> 2.1.2 指针函数
实际上,指针变量的用途非常广泛,指针不仅可以作为函数的参数,而且指针还可以作为函数的返回值。当函数的返回值是指针时,则这个函数就是指针函数。当给定指向两个整数的指针时,如程序清单 2.2所示的函数返回指向两个整数中较大数的指针。当调用max时,用指向两个int类型变量的指针作为参数,且将结果存储在一个指针变量中,其中,max函数返回的指针是作为实参传入的两个指针的一个。
程序清单 2.2 求最大值函数(指针作为函数的返回值)
1 #include
2 int *max(int *p1, int *p2)
3 {
4 if(*p1 > *p2)
5 return p1;
6 else
7 return p2;
8 }
9
10 int main(int argc, char *argv[])
11 {
12 int *p, a, b;
13 a = 1; b = 2;
14 p = max(&a, &b);
15 printf("%d\n", *p);
16 return 0;
17 }
当然,函数也可以返回字符串,它返回的实际是字符串的地址,但一定要注意如何返回合法的地址。既可以返回是静态的字符串地址,也可以在堆上分配字符串的内存,然后返回其地址。注意,不要返回局部字符串的地址,因为内存有可能被别的栈帧覆写。
下面我们再来看一看,指针函数与函数指针变量有什么区别?如果有以下定义:
int *pf(int *, int); // int *(int *, int)类型
int (*pf)(int, int); // int (*)(int, int)类型
虽然两者之间只差一个括号,但表示的意义却截然不同。函数指针变量的本质是一个指针变量,其指向的是一个函数;指针函数的本质是一个函数,即将pf声明为一个函数,它接受2个参数,其中一个是int *,另一个是int,其返回值是一个int类型的指针。
在指针函数中,还有一类这样的函数,其返回值是指向函数的指针。对于初学者,别说写出这样的函数声明,就是看到这样的写法也是一头雾水。比如,下面这样的语句:
int (* ff (int))(int, int); // ff是一个函数
int (* ff (int))(int, int); // ff是一个指针函数,其返回值是指针
int (* ff (int))(int, int);
函数指针 指针函数 数据结构 ametal 程序设计 相关文章:
- 周立功教你学C语言编程与程序设计:这样写函数指针数组最好用(07-31)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功《程序设计与数据结构》:字符串函数(08-05)
- 嵌入式如何进一步成长,该学习哪些书呢?(08-13)
- 不完全类型和抽象数据类型的定义(08-14)
- 怎么像整数一样计算字符?(08-14)