函数指针 和 指针函数

来源:互联网 发布:淘宝代运营如何收费 编辑:程序博客网 时间:2024/06/06 07:45
在C语言中有太多让大家容易混淆的概念,如果仅仅只是走马观花的看一遍文档 或者书籍,那么只能短暂的分清楚他们之间的区别,真正要掌握,需要不断的联系和理解。记得曾经上单片机原理时,老师上一堂课程讲解的内容,大家都能理解,并对答如流,但是到第二堂课程再问及上堂课的内容时,大家都面面相觑。老师就问为什么会这样呢?大家都说忘记了。老师说:1+1等于几?结果哄堂大笑。老师说只有你们真正的深刻的理解了,才能算是自己的,才不至于忘记。
言归正传,今天要分析的函数指针和指针函数。


一、指针函数:
  大家肯定理解空函数、整形函数。空函数,就是没有任何返回的函数。而整形函数就是返回一个整数的函数。C语言中有一些基本的数据类型,如字符型,浮点型,整形等,那么除了基本的数据类型外,还有一些复杂的数据类型,如结构体,联合体,枚举,指针等。从前面的空函数和整形函数的理解来看,指针函数就是返回指针的函数。

如C语言库函数中的strncat,它的实现就是:

char*strncat(char *dest, const char *src, size_t len){char* tmp = dest;while ( *tmp++ != '\0');for ( size_t i = 0; i < len;src++,i++ ) {*tmp++ = *src;}return tmp;}

这就是一个指针函数,它返回的指针,该指针指向src连接到dest后的一个字符串。

注意:不要和形参中的指针搞混淆了。可以作为形参的数据类型很多,比如一个整型数据,浮点数,字符串,结构体,指针,枚举型变量,甚至一个函数名,一个类对象(C++中常用到,以后会详解)。不过大家需要注意到,计算机存取任何东西都是通过指针或者叫地址来操作的,就不难理解了。


二、函数指针:

大家都知道,在计算机的世界里存、取数据都是通过地址来操作的。假如把计算机世界比喻为一个酒店,把存取数据比喻为进出自己预定的房间。那么计算机世界的地址就是和酒店的房间号是对应的。那我们就成了“数据”了。比如整形数据,浮点型数据,字符串,常量等都是按照一定的地址存放的。等到程序需要的时候,就按照之前安排好的地址去取。从某种意义上来说,程序是由数据和一定的逻辑关系组成的。难道我们的代码不是在操作一个一个的变量吗?既然如此,数据或者叫变量我们知道是按照地址来存放的,或者访问的。那么函数的作为一个数据和数据逻辑关系的集合,同样也应该按照地址来访问,这个地址在C语言中一般称为指针,那么指向该函数的指针,就称为函数指针。

想来,大家现在应该明白什么是函数指针,什么又是指针函数了。

常用调用方式如下:

#include "stdio.h"#include "conio.h"int max(int x,int y);int main(char argc,char** argv){int a = 10;int b = 20;int (*p_fun)(int,int);//定义函数指针p_fun = max;//将max的地址传递给p_funprintf("the max value = %d\n",p_fun(a,b));getch();return 0;}int max(int x,int y){int z = 0;return z = x > y ? x : y; }

注意:在传递函数的地址时,除了按照上面那样外,还可以像这样:p_fun = &max; 。在定义函数指针的时候,要注意形参的类型、个数以及返回值的类型要和被指向函数的形参的类型、个数以及返回值的类型要一致。至于为什么,我在这里抛砖引玉了。


三、函数指针的定义:

如第二部分介绍的: int (*p_fun)(int,int);这是一种简单的定义形式。

另一种常见的定义形式为:typedef  int  (*p_fun)(int,int);

这种方式定义了一个新的类型,那就是p_fun,以后可以像使用int,char,float等数据类型一样使用p_fun了。





原创粉丝点击