搜档网
当前位置:搜档网 › 于C语言中使用指针作为函数参数的问题

于C语言中使用指针作为函数参数的问题

于C语言中使用指针作为函数参数的问题
于C语言中使用指针作为函数参数的问题

SOFTWAREDEVELOPMENTANDDESIGN软件开发与设计

关于C语言中使用指针作为函数参数的问题

徐辉。王安民

(第二炮兵装备研究院第三研究所,北京100085)

摘要:通过实例针对C语言指针作为函数参数的用法进行讨论,尤其对未初始化指针作为函数参数的情况进行

了详细讨论出相关的实例。

关键词:C语言;指针;函数参数

TheProblemaboutthePointerUsedastheParameterofFunctioninCLanguage

XUHui.WANGAmIlin

(No3Institute,TheSecondArtilleryEquipmentAcademy,Beijing10085)

Abstract:ThediscussiononClanguage’Spointertobeusedasaparameterinfunctionsisconducted.Thesituationwhich

uninitializedpointerstobepassedasparametersisthroughlyanalyzedandrelatedsamplesaresiven.

Keywords:CLanguage;Pointer;Functionparameter

1引言

正确地理解和使用指针是成功地进行C语言程序设计的关键。指针不仅提供了函数修改调用变元的方法,还支持动态分配内存,因此可以改善某些例程的效率。但同时,指针也是C语言最强也是最危险的特征之一,未初始化的指针(包含无效值的指针)可以使系统崩溃。因此在很多C语言的参考书中,都要求初始化的指针作为函数形参,即形参指向一个特定数据类型的变量。文中针对未初始化的指针作为函数形参的使用问题进行了探讨。

2初始化指针作为函数参数

指针是包含了内存地址的变量,这个地址是内存中某一个特定数据类型变量的位置,即地址。将指针作为函数的形参,是将指针指向的这个变量的位置传递给函数,供函数内部模块的调用,而作为实参的指针并没有参与函数的调用。

voidiyfunc(char4str_buf,int掌j)

,,显示一个整型变量的值的子函数

sprintf(str_buf,“Data%dkn”,1);

胪是取指针指向的内存单元中的内容

return;

,,主函数

char*str=(char+)malloc(30);//9,内存中分配出30个,,连续的字符类型存储单元,将存储单元的首地址赋给s仃。

int4ip,i=lO;

ip=&i;删每整型变量i的地址赋给ip

Myfunc(str,ip);

free(str);

程序运行后会显示:

Data10

本文收稿日期:2009—7-6

Myfunc函数调用前和调用时的各变量在内存中的分配如图l所示。

■一舯c调用靛

调用耐

图I子函数调用时各变量在内存中的位置

从图l中可以看出传递给MyfllIlc子函数的是实参指针sh和IP的内容,即SⅡ指向的字符串首地址,IP指向的整型变量低字节的地址。在子函数调用过程中Sir和IP的内容并不会发生改变,但子函数会改写str指向的字符串单元中的内容。

3未初始化指针作为函数形参

在有些情况下,只是在主函数中定义一个指针变量,但不对其初始化,即该指针指向无效位置的内存单元,将其作为子函数的一个形参,希望在子函数中将该指针指向有效位置的内存单元。在这种情况下子函数必须获的该指针的地址,将其强制转换成~个指针,通过修改该指针指向的指针所包含的地址,实现上述功能。

voidMyfunc(char+str_buf,int勺)(下转到30页)

一13一艮M昏

管=:一

群羔:一

万方数据

电脑编程技巧与维护

结语

在用VB6.0开发的特种设备GIS远程监控系统中,利用MapX控件显示地图,实现了在地图上添加和显示设备的标记,随时可调出该单位重要承压类设备的详细信息,便于进行远程实时监控。

参考文献

【1】刘红军.自动部署和备份sQLServer数据库的实现【J】.

潍坊学院学报,2008,(04).

【2】张锦明,付永恒.基于GPS/GPRS的位置信息服务系统的

设计与实现叨.测绘通报,2007,(11).

【3】吴贞东,陈麟.基于GPRS和GIS的路灯监控系统【J】.

微计算机信息,2007,(28).

作者简介

孙丽红,女(1973-),助教,研究方向:面向对象的软件开发。

(上垮第13页)狮fI擒c一增奠脚‰一用詹{内存馘。

…_一存-艟一一…1。…w

char‘buf=(char+)malloc(30);

char‘cp=(char+)&buf;

锵字符指针变量buf的地址赋给指针cp,这里需要将其强

删转换成字符指针的类型,便于对str_buf逐个字节赋值。

inti;

sprintf(buf,“Data%d\n”,巧);

for(i=0;i<sizeof

CouO;i*)

,,sizeof(buO是取得字符指针变量占用的字节数,由于操作

,,系统不同,不同数据类型的变量占用的字节数也不相同。

str_buf【i】=cp【i】;

Ilstr_buf【i】中存放的是指针s廿所包含的内存地址,cp[i】,,中存放的是字符串的首地址

//str_buf=buf;

,,此处不可用这条语句,因为这条语句只是将buf包含的字,,符串地址赋给了str_buf,str_buf将指向字符串首地址,,,不再指向sll",实参s廿仍是空指针,当函数返回后,程序

惰可能崩溃。

return;

l,,主函数

char‘slr=-NULL;

im4ip.i=lO;

ip:&i;

Myfunc((char+)&slx,ip);

锵sir的地址作为形参传递给子函数,则在子函数中字腑指针str_buf指向实参s廿

free(str);

,,虽然在主函数中未对Str分配内存,但是Sir已经指向了

垢自态分配的内存单元,因此在程序退出时需要释放这部

//分内存单元。程序运行后会显示:

Data10

Myfunc函数调用前后的各变量在内存中的分配如图2所示。从图2中可以看出在iyfu_nc调用前Str是空指针,Mv—func在调用时,得到的是指针S仃的地址,因此可以通过sk【i】

(i=l,2,…)的方式对S打中的内容进行访问和修改,在

Myhmc调用后s仃被指向了Mflunc子函数中动态分配的内存单元,因此能够正常显示出字符串的内容。

结语

通过对上述实例的比较可以看出:未初始化的指针变量

一30一

獬m

图2子函数调用前后各变量在内存中的位置

作为形参的使用比初始化的指针变量作为形参的使用要复杂。虽然例l和例2显示的内容是相同的,但完成的工作是不相

同的。首先,通过形参传递的对象是不同的,一个指向的特定位置的内存单元,一个则指向指针变量;其次,在第一段代码子函数中的语句只完成了对相应内存单元内容的刷新,而例第二段代码子函数中的语句不仅仅完成了相应内存单元内容的刷新,还通过修改主函数中指针变量所指向的内存位置,完成了字符串地址的传递;最后,第一段代码中动态内存的分配和释放都是在一个函数体内,而第二段代码中动态内存的分配和释放在不同的函数体内,因此更需要特别注意,要避免使用动态分配内存后,未及时释放的情况发生。

参考文献

【1】谭浩强.C语言设计.北京:清华大学出版社,2001.【2】钱能.C++程序设计教程.北京:清华大学出版社,2001.【3】徐金吾,杨德斌,徐科.TURBOC实用大全.北京:机械

工业出版社,1996.

作者简介

徐辉,男(1982一),助理工程师,研究方向:弹道仿真。王安民,高级工程师。

万方数据

关于C语言中使用指针作为函数参数的问题

作者:徐辉, 王安民

作者单位:第二炮兵装备研究院第三研究所,北京,100085

刊名:

电脑编程技巧与维护

英文刊名:COMPUTER PROGRAMMING SKILLS & MAINTENANCE

年,卷(期):2009,(18)

引用次数:0次

参考文献(3条)

1.谭浩强.C语言设计.北京:清华大学出版社,2001.

2.钱能.C++程序设计教程.北京:清华大学出版社,2001.

3.徐金吾,杨德斌,徐科.TURBO C实用大全.北京:机械工业出版社,1996.

相似文献(10条)

1.期刊论文王恒滨.闫东升关于C语言指针定义的讨论-辽宁财专学报2004,6(2)

在教学和实践中发现,C语言指针定义的信息量不足,难于解释指针使用的许多方面.本文大胆地剖析了已有的定义,从中找出问题所在,并试图加以改进.还结合实例给出了"拟构"概念,较好地说明了相关知识尤其是指针与数组的关系.

2.期刊论文李忠武.Li Zhong-wu C语言指针探讨-保山师专学报2005,24(2)

结合实例从五个方面对C语言指针进行分析和探讨:阐述C语言指针的概念和正确使用指针变量,区分指针变量和指针的指向变量的含义和用法;通过判断变量与运算符*、[]和()的结合顺序来确定变量的数据类型及指向变量或成员变量的类型;指出指针与数组的关系,通过指针来访问数组元素和采用下标法数组元素的等价关系;作为函数参数的指针变量,可以改变所指向的主调函数变量的值;指针可以实现动态存储分配,用来实现对链表的创建、插入和删除等操作.

3.期刊论文陈建辉C语言指针探讨-莆田高等专科学校学报2001,8(4)

结合实例从五个方面对C语言指针进行分析和探讨:阐述C语言指针的概念和正确使用指针变量,区分指针变量和指针的指向变量的含义和用法;通过判断变量与运算符*,[]和()的结合顺序来确定变量的数据类型及指向变量或成员变量的类型;指出指针与数组的关系,通过指针来访问教组元素和采用下标法数组元素的等价关系;作为函数参数的指针变量,可以改变所指向的主调函数变量的值;指针可以实现动态存储分配,用来实现对链表的创建、插入和删除等操作.

4.期刊论文深入理解C语言指针-内江科技2005(6)

指针是C语言的精华和核心部分,充分体现了C语言的灵活性,增强了C语言的功能.本文从指针的定义、指针的功能及由于指针的使用带来的安全性等方面深入地分析了C语言的指针.

5.期刊论文吴斌.WU Bin C语言指针的教学-安徽职业技术学院学报2004,3(3)

指针是C语言的低级语言特性.使用指针程序员可以按地址操作计算机内存,灵活实现一些特定功能;使用指针可以方便地表达复杂的数据结构,使程序简洁、高效、紧凑,指针是整个C语言课程的重点以及后续课程的重要基础.指针是C语言教学难点,在教学中采取适当的策略和方法完全可以取得较为满意的效果.

6.期刊论文刘丽梅复习C语言应注意的几个方面(之四)--针对CCT C语言指针部分-承德职业学院学报2005,10(3) 本文主要针对CCT中的C语言部分,在复习时应该注意的几个方面,以讲、例结合的方式作了详细的论述.

7.期刊论文王丕景C语言“指针”教学经验谈-太原理工大学学报(社会科学版)2001,19(2)

在C语言的教学中,指针概念的教学一直就是C语言的教学重点和难点,指针已成为学习和掌握C语言的一大障碍.从硬件角度、图示方法及举例选题三个方面介绍了C语言指针教学中的体会.

8.期刊论文杨莉C语言指针的研究与运用-中小企业管理与科技2008(23)

指针是C语言的精髓部分,也是C语言的重要特色.本文从指针的基本概念出发,结合具体实例对指针的类型进行了分析,并对指针在实际应用中常出现的问题进行了归类总结,希望对初学者理解"指针"这一重要概念有所帮助.

9.期刊论文李霞C语言指针的应用-科技创新导报2009(4)

指针是C语言的一个重要概念,也是C语言的一个重要特色.但是指针概念比较抽象.使用又相对比较灵活,正确应用指针变成了程序设计的一个难点,本文就指针的应用从各方面作一介绍.帮助学习者加深理解.

10.期刊论文李振涛.赵鹏.杨树元.Li Zhen-tao.ZHAO Peng.YANG Shu-yuan C语言多维数组与指针的探讨-长春师范学院学报(自然科学版)2003,22(2)

在C语言的学习中,数组与指针的应用是重点和难点,尤其多维数组和指针应用已成为学习和掌握C语言的一大障碍.利用消维法和图示法,通过二维、三维数组与指针的关系,延伸到多维数组的探讨,让学习C语言的人轻松的理解和接受利用指针法对多维数组元素取值的方式.

本文链接:https://www.sodocs.net/doc/2f15706245.html,/Periodical_dnbcjqywh200918006.aspx

下载时间:2009年12月25日

指针变量作为函数参数

用名作为其他变量名地别名. ; 等价于; ()声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名地一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元.故:对引用求地址,就是对目标变量求地址.与相等. ()不能建立数组地引用.因为数组是一个由若干个元素所组成地集合,所以无法建立一个数组地别名. 引用应用 、引用作为参数 引用地一个重要作用就是作为函数地参数.以前地语言中函数参数传递是值传递,如果有大块数据作为参数传递地时候,采用地方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序地效率.但是现在(中)又增加了一种同样有效率地选择(在某些特殊情况下又是必须地选择),就是引用. 【例】: ( , ) 此处函数地形参, 都是引用 { ; ; ; ; } 为在程序中调用该函数,则相应地主调函数地调用点处,直接以变量作为实参进行调用即可,而不需要实参变量有任何地特殊要求.如:对应上面定义地函数,相应地主调函数可写为: ( ) { ; >>>>; 输入两变量地值 (); 直接以变量和作为实参调用函数 <<<< ' ' <<; 输出结果 }

上述程序运行时,如果输入数据并回车后,则输出结果为. 由【例】可看出: ()传递引用给函数与传递指针地效果是一样地.这时,被调函数地形参就成为原来主调函数中地实参变量或对象地一个别名来使用,所以在被调函数中对形参变量地操作就是对其相应地目标对象(在主调函数中)地操作. ()使用引用传递函数地参数,在内存中并没有产生实参地副本,它是直接对实参操作;而使用一般变量传递函数地参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量地副本;如果传递地是对象,还将调用拷贝构造函数.因此,当参数传递地数据较大时,用引用比用一般变量传递参数地效率和所占空间都好. ()使用指针作为函数地参数虽然也能达到与使用引用地效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"地形式进行运算,这很容易产生错误且程序地阅读性较差;另一方面,在主调函数地调用点处,必须用变量地地址作为实参.而引用更容易使用,更清晰. 如果既要利用引用提高程序地效率,又要保护传递给函数地数据不在函数中被改变,就应使用常引用. 、常引用 常引用声明方式:类型标识符引用名目标变量名; 用这种方式声明地引用,不能通过引用对目标变量地值进行修改,从而使引用地目标成为,达到了引用地安全性. 【例】: ; ; ; 错误 ; 正确 这不光是让代码更健壮,也有些其它方面地需要. 【例】:假设有如下函数声明:

指针函数与函数指针的区别

指针函数与函数指针的区别 一、 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。 表示: float *fun(); float *p; p = fun(a); 注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。来讲详细一些吧!请看下面 指针函数: 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。 格式: 类型说明符* 函数名(参数) 当然了,由于返回的是一个地址,所以类型说明符一般都是int。 例如:int *GetDate(); int * aaa(int,int); 函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。 int * GetDate(int wk,int dy); main() { int wk,dy; do { printf(Enter week(1-5)day(1-7)\n); scanf(%d%d,&wk,&dy); } while(wk<1||wk>5||dy<1||dy>7); printf(%d\n,*GetDate(wk,dy));

函数参数返回值总结

函数的参数、返回值总结 (一)参数 ◆函数分: 有参函数:函数名(实参列表) 无参函数:函数名() ◆有参函数调用语句中的实参应与被调函数中的形参在个数、类型、顺序上一致。 ◆参数传递时,实参向形参一一对应进行单向的值传递。值:可是数值(变量或数 组元素)或数值的地址值(指针或数组名)。 (二)返回值 函数的返回值即为函数调用后的结果,可有如下返回结果的方法: (1)通过return语句返回一个值; (2)利用地址做参数返回一个或多个值; (3)利用全局变量返回一个或多个值。 (三)例 1、170页实验内容(1):打印由正三角和倒三角组成的图形。 有一个参数,无返回值。实参向形参传递一个数值。 #include /* 有一个参数,无返回值的函数,打印正三角 */ void f1(int n) /* 形参只能是变量,用来接收实参传来的数值 */ { int i,j,k; for(k=1;k<=n;k++) {for(i=1;i<=10-k;i++) printf(" "); for(j=1;j<=k;j++) printf(" *"); printf("\n");} } /* 有一个参数,无返回值的函数,打印倒三角*/ void f2(int n) {int i,j,k; for(k=n;k>=1;k--) {for(i=1;i<=10-k;i++) printf(" "); for(j=1;j<=k;j++) printf(" *"); /*双引号内应为“空格加半角星号”*/ printf("\n");} } main() { int n; scanf("%d",&n);

函数指针和指针函数的理解

我知道函数指针是指向函数的指针,指针函数还是指一个函数的返回值是一个指针,但下面的几道题还是感觉很迷惑。各位能否讲的详细点呢? (1)float(**def)[10]def是什么? (2)double*(*gh)[10]gh是什么? (3)double(*f[10])()f是什么? (4)int*((*b)[10])b是什么? 这样老感觉有点乱,有什么窍门可以记得并理解的清楚一点么? (1)def是一个指针,指向的对象也是一个指针,指向的指针最终指向的是10个float构成的数组. (2)gh是指针,指向的是10个元素构成的数组,数组的元素是double*类型的指针. (3)f是10个元素构成的数组,每个元素是指针,指针指向的是函数,函数类型为无参数且返回值为double.下面要讲的窍门的例子跟这个很类似. (4)b是指针,指向的是10个元素构成的数组,数组元素为int*类型的指针. 窍门如下: 如果我们碰到复杂的类型声明,该如何解析它?例如: char(*a[3])(int); a到底被声明为什么东东?指针?数组?还是函数? 分析时,从a最接近(按运算符优先级)处开始。我们看到a最接近符号是[]——注意:*比[]的优先级低。a后既然有[],那么a是数组,而且是包含3个元素的数组。 那这个数组的每个元素是什么类型呢?虽然数组a只含有a[0]、a[1]、a[2]三个元素,a[3]实际上已经越界,但在分析数组a的元素的类型时,我们正好需要形式上的元素a[3]。知道了a[3]的类型,就知道了a的元素的类型。a[3]是什么类型?是指针,因为它的前面有*.由此可知,数组a的元素是指针。 光说是指针还不够。对于指针,必须说出它指向的东东是什么类型。它指向的东东是什么,就看*a[3]是什么(a[3]是指针,它指向的东东当然是*a[3])了。继续按优先级观察,我们看到*a[3]后面有小括号,所以可以肯定*a[3]是函数。即数组a的元素是指向函数的指针。 指向的是什么类型的函数?这很明显,是入参为int、返回值为char的类型的函数。 至此解析完毕。

将0转型为“指向返回值为void的函数的指针” (void (x)())0

(void (*)())0 的含义 (void (*)())0 的含义: 1. fp是一个指针{有*},她指向返回值为void{有(void)}类型的函数{有()}:void (*fp)(); 调用方式简写为:(*fp)(); 2. 制作其对应的类型强制转换符:void (*)() 3. 存储位置为0 的强制转换为一个指向返回值为void类型的函数的指针:(void (*)())0 4. 用上式代替fp,从而实现调用存储位置为0的子例程:(*(void(*)())0)(); 5. 利用typedef简化:typedef void (*funcptr)(); (*(funcptr)0)(); (void (*)())0 的含义:实际上就是将地址0强制转换为一个指向返回值为void类型的函数的指针。 下面将相关基础知识进行介绍,其中参考了网上一些文章,名单不再列出,谢谢各位大虾的贡献: 1、c语言的声明 2、类型转换符的制作 3、signal函数分析 4、typedef用法 5、const用法 6、typedef的好处 1 C语言的声明 声明由两部分组成:类型以及声明符: float f,g; float ((f));//对其求值时,((f))的类型为浮点型,可以推知,f也是浮点型 float *g(),(*h)();//g是函数,该函数的返回类型为指向浮点数的指针 //h是个指针,且是一个函数指针,该指针指向函数返回值,该返回值是一个float型 (*fp)()简写为fp()//函数调用方式,其中fp为函数指针 *((*fp)())简写为*fp()//函数返回值为某个类型的指针 、2 类型转换符制作 类型转换符制作: 1、去掉声明中的变量名、分号; 2、将剩余部分用括号"封装"起来 float (*h)(); --> (float (*)())//指向返回值为float型的函数指针的类型转换符(*0)();//返回值为void类型的函数指针 如果fp是一个指向返回值为void类型的函数的指针,那么(*fp)()的值为 void,fp的声明如下:void (*fp)(); 因此可以用下式完成调用存储位置为0的子例程:void (*fp)(); (*fp)(); 这种写法的代价是多声明了一个哑变量,我们常将0转型为“指向返回值为void的函数的指针”:(void (*)())0 用上式代替fp,从而得到:(*(void(*)())0)(); typedef void (*funcptr)(); 将0转型为“指向返回值为void的函数的指针”-----(void (*)())0 (*(funcptr)0)(); 3 signal函数

指向函数的指针变量

1.一般定义形式: 返回值的数据类型(*指针变量名)(); for example: int function(int a, int b){...;} int (*pointer_of_function)(); pointer_of_function = function; //相关联的语句就是这么简单。 2.函数的调用可以通过函数名调用,也可以通过函数指针调用(即用指向函数的指针变量调用)。 3.(*p)() 表示定义一个指向函数的指针变量,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的。在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。在一个程序中,一个指针变量可以先后指向返回类型相同的不同的函数。 4.在给函数指针变量赋值时,只需给出函数名而不必给出参数,如:pointer_of_function = function ,因为是将函数入口地址赋给pointer_of_function, 而不牵涉到实参与形参结合的问题。不能写成pointer_of_function = function(a,b)。 5.用函数指针变量调用函数时,只需将(*P)代替函数名即可,在(*p)之后的括弧中根据需要写上实参。 6.对指向函数的指针变量,像p++ 等类似运算是没有意义的。 7.区别int (*p)() 与int *p():由于()的优先级高于*,它就成了声明一个函数了,这个函数的返回值是指向整形变量的指针。 1 定义和调用 程序在编译后,每个函数都有一个首地址(也就是函数第一条指令的地址),这个地址称为函数的指针。可以定义指向函数的指针变量,使用指针变量间接调用函数。下面通过一个简单的例子来说明: float max(float x,float y) { return x>y?x:y; } float min(float x,float y) { return x

函数指针和指针函数

在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。 1.函数指针定义 函数类型(*指针变量名)(形参列表); “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。 例如: int (*f)(int x); double (*ptr)(double x); 在定义函数指针时请注意: 函数指针和它指向的函数的参数个数和类型都应该是—致的; 函数指针的类型和函数的返回值类型也必须是一致的。 2.函数指针的赋值 函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。 例如, int func(int x); /* 声明一个函数*/ int (*f) (int x); /* 声明一个函数指针*/ f=func; /* 将func函数的首地址赋给指针f */ 赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,

因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

3.通过函数指针调用函数 函数指针是通过函数名及有关参数进行调用的。 与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf 就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f 就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。 由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步: 首先,要说明函数指针变量。 例如:int (*f)(int x); 其次,要对函数指针变量赋值。 例如:f=func; (func(x)必须先要有定义) 最后,要用(*指针变量)(参数表);调用函数。 例如:(*f)(x);(x必须先赋值) 【例】任意输入n个数,找出其中最大数,并且输出最大数值。 main() { int f(); int i,a,b; int (*p)(); /* 定义函数指针*/ scanf('%d',&a);

指向函数的指针

1 定义和调用 程序在编译后,每个函数都有一个首地址(也就是函数第一条指令的地址),这个地址称为函数的指针。可以定义指向函数的指针变量,使用指针变量间接调用函数。下面通过一个简单的例子来说明: float max(float x,float y) { return x>y?x:y; } float min(float x,float y) { return x

指针作为返回值

指针作为函数的返回值 1 指针作为函数的返回值 指针值也可以作为函数的返回值。这种情况下函数的返回值类型需要定义成指针变量类型。返回指针值的函数的一般定义格式为: 数据类型*函数名称(形式参数列表) 例如: float *Func(float x, float y); 该函数的形式参数是两个float型的变量,返回一个float型变量的指针。下面是一个返回指针值的函数的例子: long score[10]={1,2,3,4,5,6,7,8,9,10}; long *GetMax(); main() { long *p; p=GetMax(); printf("Max value in array is %d", *p); } long *GetMax() { long temp; int i, pos=0; temp=score[0]; for(i=0;i<10;i++) if(score[i]>temp) { temp=score[i]; pos=i; } return &score[pos]; } 程序运行的结果为: Max value in array is 10 上面的例子中,GetMax函数没有任何形式参数,该函数返回一个指针值。注意long型数组score是一个全局变量,它有10个已经初始化过的元素。 GetMax函数中,我们用临时变量temp比较记录全局数组score里最大的元素,同时用pos 记录最大的元素的数组下标号。循环结束后,返回的是数组中值最大的元素的地址值,即该元素的指针值。注意因为数组是全局变量,GetMax函数调用结束后,数组元素在内存中仍然存在,因此GetMax函数返回的指针值是有效的。 main函数中定义了一个指针变量p,调用了GetMax函数,将返回的指针值赋给了指针变量p,现在p指向了数组score里最大的元素,*p对应了score里最大的元素的值。后续的printf打印了*p值。

详细理解C指针-指针函数与函数指针和回调函数

1、函数指针: 指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。其定义格式如下所示: 返回类型标识符*返回名称(形式参数表) { 函数体} 返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。例如下面一个返回指针函数的例子:float *find(float(*pionter)[4],int n)/*定义指针函数*/ { float *pt; pt=*(pionter+n); return(pt); } main() { static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}}; float *p; int i,m; printf("Enter the number to be found:"); scanf("%d",&m); printf("the score of NO.%d are:\n",m); p=find(score,m); for(i=0;i<4;i++) printf("%5.2f\t",*(p+i)); } 学生学号从0号算起,函数find()被定义为指针函数,起形参pointer是指针指向包含4个元素的一维数组的指针变量。pointer+1指向score的第一行。*(pointer+1)指向第一行的第0个元素。pt是一个指针变量,它指向浮点型变量。main()函数中调用find()函数,将score 数组的首地址传给pointer.

函数指针的用法.doc

函数指针的用法 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址来调用数组数据,也可以使用指针变量指向函数代码的首地址来调用函数,指向函数代码首地址的指针变量就称为函数指针。 1.函数指针定义 函数类型(*指针变量名)(形参列表); “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。 例如: int (*f)(int x); double (*ptr)(double x); 在定义函数指针时请注意: 函数指针和它指向的函数的参数个数和类型都应该是—致的; 函数指针的类型和函数的返回值类型也必须是一致的。 2.函数指针的赋值 函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。 例如, int func(int x); /* 声明一个函数*/ int (*f) (int x); /* 声明一个函数指针*/ 把函数的地址赋值给函数指针,可以采用下面两种形式: f=&func; /* 将func函数的首地址赋给指针f */ f=func; 赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。 3、下面给出一个示例程序: #include void(*fp)();//函数指针: 指向函数的指针包含了函数的地址,可以通 过它来调用函数 void(*fp_para)(char*);//带参数的函数指针 void func_para(char*s); void func(); int main(void) { fp_para=&func_para;//或者:fp_para=func_para; (*fp_para)("This is the parameter of the funtion!"); fp=&func;//或者:fp=&func; (*fp)(); return 0; } void func_para(char*s) {

相关主题