函数指针是函数指针变量的简称,其实质是一个变量,就像 int a;
中的a一样,指针即地址,所以函数指针可以理解为“存放函数入口地址的变量”。举个栗子:
int sum(int a, int b)
(相关资料图)
{
return (a+b);
}
void main()
{
int (*p)(int, int);
//定义了一个函数指针P
int a = 0;
p = sum;
a = (*p)(10,20);
printf(”%d\\n”,a);
}
代码中,语句int (*p)(int, int);
定义了一个函数指针变量p,它指向的函数返回值类型为int,函数的参数为两个int型。换句话说,变量p可以存返回值为int,形参为两个int型的函数的地址,上例中就是把函数sum的地址(即函数名)赋给了p;
我们知道C语言中的变量都有其对应的数据类型,比如:int a = 0
; char b;
其中变量a的数据类型为int,变量b的数据类型为char,那么int (*p)(int, int);
中变量p的数据类型是什么?这里p 的数据类型就是int (*)(int, int)
,是的,就是把p去掉,剩下的就是数据类型。
现在再来理解typedef函数指针。
比如,typedef int (*abc)(int, int);
这里是定义数据类型int (*)(int, int)
为别名abc
,即可以用abc
表示数据类型int (*)(int, int)
了。如何使用?再举个栗子:
typedef int (*alias)(int, int);
int sum(int a, int b)
{
return (a+ b);
}
void main()
{
alias p = sum;
int a = 0;
a = (*p)(10,20);
printf(”%d\\n”,a);
}
代码第一行重新定义了函数指针数据类型int (*)(int, int)
为alias
,然后在main函数中用该类型别名alias
定义了函数指针p,运行结果和上个例子中一样。
举一反一,typedef数组指针也类似。
标签:
03-18 14:53:54
03-18 14:51:07
03-18 14:47:48
03-18 14:44:44
03-18 14:40:44
12-04 14:30:57