扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名、网站空间、营销软件、网站建设、东丽网站维护、网站推广。
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
注2:函数括号中的形参可有可无,视情况而定。
下面的程序说明了函数指针调用函数的方法:
例一、
#includestdio.h
int max(int x,int y){ return(xy?x:y); }
void main()
{
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d%d",a,b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。
指针函数是指返回值是指针的函数,即本质是一个函数。我们知道函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
其定义格式如下所示:
返回类型标识符*返回名称(形式参数表)
{ 函数体}
返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。
其实还是指针,只是指向的内容和声明方法不同而已
供参考:
//:
strcpyDemo.c
//author:
Problue
#include
stdio.h
#include
assert.h
/**
*
该函数将从src指向的数组中复制最多count个字符(不复制空字符后面的)到dest指向的数组中。
*
如果复制发生在两个重叠的对象中,则行为未定义。
*
如果src指向的数组是一个长度比count短的字符串,则在dest指向的数组
*
后面添加空字符.直到写入了count个字符。
*@param
dest
目标数组
*@param
src
源数组
*@return
dest
*
*/
char*
strcopy(char*
dest,
const
char*
src,
int
count)
{
char*
sc
=
dest;
assert
((dest
!=
NULL)
(src
!=
NULL));
while
(
count
*src
!=
'\0')//
复制字符
[max
count]
src
到
dest
[count]
{
*sc++
=
*src++;
--count;
}
for
(;
count;
--count)
//
写入空字符到dest
{
*sc
=
'\0';
}
return
dest;
}
typedef
char*
(*STR_FUNC)(char*,
const
char*,
int);
int
main()
{
STR_FUNC
func
=
strcopy;
const
int
A_LENGTH
=
30;
char
a[A_LENGTH
+
1];//
=
"abc";
char*
b
=
"defg";
func(a,
b,
A_LENGTH);
puts(a);
puts(b);
getchar();
return
0;
}
函数指针告诉CPU下一步需要执行哪里的代码的指针, 一数组十分相像.
#include stdio.h
void function(int i, double d) //一个函数的声明
{
printf("函数运行, %d, %lf\n", i, d);
}
void AnotherFunction(int i, double d) //另外一个函数声明
{
printf("又一个函数运行, %d, %lf\n", i, d);
}
int main()
{
void (*pFun)(int, double); //定义了一个函数指针
int (*p)(int , double); //用于调试的函数指针
pFun = function; //让这个函数指针指向第一个函数
pFun(10, 10.101); //通过这个函数指针来调用第一个函数
pFun = AnotherFunction; //让这个函数指针指向第二个函数
pFun(20, 20.202); //通过这个函数指针来调用第二个函数
//若将以下代码取消注释, 就会产生错误
/*
p = function;
p = AnotherFunction;
//原因很简单, 因为p是必须指向一个返回值为int, 第一个参数为int, 第二个参数为double的函数, 但是在此代码中定义的函数返回值是void
*/
//这个实验中, 直接用函数名来赋值了, 是因为函数名其实就是这个函数的指针
//而在平常调用函数时, 都要加上(), 如:printf("");
//这里, "()"就相当于'*'(就是取值运算符), printf是函数指针, 就相当于是数组名, 即数组的首地址
return 0;
}
分析方法:右左法,遇到括号返方向
int (* func)(int * p);
分析: func - 右) - 左 * - func是一个指针,更新当前类型为指针 - 左( - 跳出括号 - 右( - 查表得指针指向函数,func是一个函数指针,()里的为函数参数,更新当前类型为函数 - 左int - 查表得函数返回值类型为int
结论: func是一个函数指针,指向的函数有一个类型为int * 的参数且返回值类型为int.
int (* func)(int * p, int (* f)(int* ));
分析: func - 右) - 左 * - func是指针,更新当前类型为指针 - 左( - 跳出括号 - 右( - func是函数指针,更新当前类型为函数 - 左int - 指向的函数的返回值类型为int
结论: func是一个函数指针,指向的函数返回值类型为int,有2个参数,一个类型为int * ,另一个类型为函数指针,指向的函数返回值类型为int且有一个int * 类型的参数.
int (* func[5])(int * p);
分析: func - 右[ - func为数组,有5个元素,更新当前类型为数组 - 右) - 左* - 数组元素为指针,更新当前类型为指针 - 左( - 跳出括号 - 右( - 数组元素为函数指针,更新当前类型为函数 - 左int - 指向的函数返回值类型为int
结论略~
下面的例子省略方向提示,更新当前类型提示,遇括号转向,跳出括号以及结论(手懒,剁
int (* (* func)[5])(int * p);
分析: func - * - func是指针 - [ - 指向有5个元素的数组 - * - 数组元素是指针 - ( - 数组元素是函数指针 - int - 指向的函数返回值类型为int
int (* (* func)(int * p))[5];
分析: func - * - func是指针 - ( - func是函数指针 - * - 指向的函数返回值类型为指针 - [ - 返回的指针指向有5个元素的数组 - int - 数组元素类型为int
int func(void) [5];
分析: func - ( - func是函数 - int - 返回值类型为int - [ - 返回值类型为有5个int元素的数组
int func 5 ;
分析: func - [ - func是数组 - ( - 数组元素是函数 - int - 函数返回值类型为int
int (* (* func)[5][6])[7][8];
分析: func - * - func是指针 - [ - func指向有5个元素的数组 - [ - 5元素数组里的每个元素是有6个元素的数组 - * - 6元素数组的每个元素为指针 - [ - 指针指向7元素数组 - [ - 7元素数组的每个元素为8元素数组 - int - 8元素数组元素为int
int (* (* (* func)(int * ))[5])(int * );
分析: func - * - func是指针 - ( - func是函数指针 - * - 函数返回值为指针 - [ - 返回值指向5元素数组 - * - 5元素数组元素为指针 - ( - 指针为函数指针 - int - 函数返回值为int
int (* (* func[7][8][9])(int* ))[5];
分析: func - [ - func是7元素数组 - [ - 7元素数组元素为8元素数组 - [ - 8元素数组元素为9元素数组 - * - 9元素数组元素为指针 - ( - 为函数指针 - * - 函数返回值为指针 - [ - 指针指向5元素数组 - int - 数组元素为int
int (* (* func)(int * p))[5];
分析: func - * - func是指针 - ( - 是函数指针 - * - 函数返回值为指针 - [ - 指针指向5元素数组 - int - 数组元素为int
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流