今天给各位分享函数指针的函数函数知识,其中也会对函数指针有什么用进行解释,指针指针如果能碰巧解决你现在面临的有什用问题,别忘了关注本站,函数函数现在开始吧!指针指针
函数指针的定义是什么
函数指针的定义是什么
顾名思义,函数指针就是函数函数函数的指针。它是指针指针一个指针,指向一个函数。有什用看例子:
A),函数函数char * (*fun1)(char * p1,指针指针char * p2);
B),char * *fun2(char * p1,有什用char * p2);
C),char * fun3(char * p1,函数函数char * p2);
数组参数等效的指针参数
数组的数组:char a[3][4] 数组的指针:char (*p)[10]
指针数组: char *a[5] 指针的指针:char **p
看看上面三个表达式分别是什么意思?
C):这很容易,fun3 是指针指针函数名,p1,有什用p2 是参数,其类型为char *型,函数的`返回值为char *类型。
B):也很简单,与C)表达式相比,唯一不同的就是函数的返回值类型为char**,是个二级指针。
A):fun1 是函数名吗?回忆一下前面讲解数组指针时的情形。我们说数组指针这么定义或许更清晰:
int (*)[10] p;
再看看A)表达式与这里何其相似!明白了吧。这里fun1 不是什么函数名,而是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。
同样,我们把这个表达式改写一下:char * (*)(char * p1,char * p2) fun1; 这样子是不是好看一些呢?只可惜编译器不这么想
;
函数指针如何定义?
关于函数指针数组的定义方法,有两种:一种是标准的方法;一种是蒙骗法。
第一种,标准方法:
分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。
根据分析:首先说明是一个数组:数组名[]
其次,要说明其元素的数据类型指针:*数组名[].
再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 (*数组名[])().请注意,这里为什么要把“*数组名[]”用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名[]() 说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组的每一个元素是指针。
第二种,蒙骗法:
尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数方法是:用不带有括号和参数的函数名得到。
函数名相当于一个指向其函数入口指针常量。 那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。
那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。
(一) 用函数指针变量调用函数
可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例:
1 #include stdio.h
2 #include stdlib.h
3
4 int main()
5 {
6 int max(int,int);
7 int (*p)(int,int);
8 int a,b,c;
9 p = max;
10 scanf("%d,%d",a,b);
11 c = (*p)(a,b);
12 printf("a=%d,b=%d,max=%d\n",a,b,c);
13 return 0;
14 }
15
16 int max(int x,int y)
17 {
18 int z;
19 if(xy) z = x;
20 else z = y;
21 return(z);
22 }
什么是函数指针?
函数指针,顾名思义,就是指向一个函数的指针。
例:
#include
void
say_hello(const
char
*str)
{
printf("Hello
%s\n",
str);
}
int
main(void)
{
void
(*f)(const
char
*)
=
say_hello;
f("Guys");
return
0;
}
f为指向函数say_hello函数的指针;
其中f("Guys");
可换为:(*f)("Guys");
函数指针的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于函数指针有什么用、函数指针的信息别忘了在本站进行查找喔。