c语言函数指针论文 函数指针 C语言

C语言中的函数指针

函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名网站空间、营销软件、网站建设、东丽网站维护、网站推广。

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是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。

指针函数是指返回值是指针的函数,即本质是一个函数。我们知道函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。

其定义格式如下所示:

返回类型标识符*返回名称(形式参数表)

{ 函数体}

返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。

其实还是指针,只是指向的内容和声明方法不同而已

C语言函数指针

供参考:

//:

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;

}

c语言的函数指针举个例子

函数指针告诉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;

}

c语言基础-复杂的函数指针

分析方法:右左法,遇到括号返方向

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


当前文章:c语言函数指针论文 函数指针 C语言
网站URL:http://bzwzjz.com/article/hisecg.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 成都网站建设公司 专业网站设计 成都做网站建设公司 外贸营销网站建设 教育网站设计方案 成都网站设计 网站制作 成都网站建设 成都网站建设 网站建设公司 重庆网站设计 成都响应式网站建设公司 四川成都网站制作 成都网站制作 成都网站设计 移动手机网站制作 企业网站设计 定制网站设计 温江网站设计 温江网站设计 成都品牌网站建设 网站设计制作