【函数指针】
<1>什么是函数指针
int a,b,c;
int max(int,int);
int (*p)(int,int); //定义指针函数,指针变量活取函数地址
p=max;
c=(*p)(a,b)
函数指针就是函数的起始地址,我们可以使用一个指向函数的指针变量来存储这个地址,当前的指针变量就指向这个函数。
在第二行声明一个函数,第三行声明一个指向int类型的指针变量,而且这个指针变量后面[有对圆括号],这个就是指向函数的指针变量,我们想下,如果是int *p(int,int)会是怎样?由于(的优先级高,所以就是先声明了一个p(int,int)函数,这个函数返回的是指向整型变量的指针。
第三句只是定义了一个指向函数的指针变量,并没有说明是什么函数,到了第四局把max函数首地址赋给指针变量才算是指定了函数。但此刻函数并没有运行,直到第5句利用函数指针变量调用函数的时候才执行了相应的内容。
<2>函数指针作函数参数
在Main函数中把函数入口地址传递给处理函数的形参(函数指针变量),把函数要处理的数据传递给对应的形参,在处理函数是根据要处理的函数地址(函数指针变量)和接收到的数据进行输出。粗浅的理解为低耦合。
#include <stdio.h> void main(){ int max(int,int); int min(int,int); int add(int,int); void fun(int x,int y,int(*p)(int,int)); int a=2,b=3,c; printf("输入1/2/3\n"); scanf("%d",&c); if(c==1){ fun(a,b,max); } else if(c==2){ fun(a,b,min); } else if(c==3){ fun(a,b,add); } } void fun(int x,int y,int(*p)(int,int)){ int result; result=(*p)(x,y); printf("%d\n",result); } int max(int x,int y){ int z; if(x>y)z=x; else z=y; printf("Max is"); return z; } int min(int x,int y){ int z; if(x>y)z=y; else z=x; printf("Min is"); return z; } int add(int x,int y){ int z; z=x+y; printf("Sum is"); return z; }
【返回指针的函数】
如:int *a(int x,int y); //定义函数a,返回一个指向整形数据的指针
【指针数组】
如:int *a[5]; //定义指针数组,数组中的每一个元素都是指针变量
由于[]的优先级比较高,先计算a[5]说明它是数组形式,前面加上×表示它是指针数组。
注:int *a[5]和int (*a)[5]的区别
后面这中形式表示指向一维数组(这个数组最大编号为5)的指针变量。
指针数组的应用:大多用来指向若干个字符串,如:
char *name[]={"Fello me","Basic","Frotran","Computer class"};
其中数组中存放的是各个字符串的首字符的地址,这么做的好处是节省空间,而且指针可以改变。如果用二维数组存储这些字符串,那么第一点数组的长度必须超过最长字符串的长度,这就造成了空间浪费;第二,数组移动字符串要比改变指针变量地址麻烦的多。
【指向指针数据的指针】
如:char **p; char c=‘a‘;
*p=&c; //
在定义时,char **P是二级指针,而在使用的时候,**p是指二级指针,存放的是一级指针变量的地址,*p是一级指针,存放的是变量的地址,p是‘a‘即变量的值;