版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计函数的参数不仅可以是一般数据类型的数据(如整型、浮点型、字符型等数据),还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。【例8-11】编写swap函数实现两个变量值的交换。【问题分析】在第8章的例8-6中编写过swap函数,但是没能实现互换主函数中两个变量的值。原因是:C语言规定,实参对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回给实参。因此,如果希望将交换后的值带回到主函数中,可以利用指针作为函数参数,它将一个变量的地址传递到被调函数中。由于指针指向的单元和变量对应的单元相同,因此,可以在被调函数中通过指针运算符“*”实现对主调函数中变量值的修改。
8.4指针与函数8.4.1
指针变量作为函数参数【参考代码】#include<stdio.h>voidswap(int*p1,int*p2) /*swap函数用于交换两数的值*/{ intt; /*定义整型变量t*/ t=*p1; /*实现两数交换*/ *p1=*p2; *p2=t;}intmain(){ inti=2,j=3; /*定义整型变量i和j并初始化*/ printf("BeforeSwap:i=%d,j=%d\n",i,j);/*输出调用swap函数前i和j的值*/ swap(&i,&j); /*调用swap函数,参数为i和j的地址*/ printf("AfterSwap:i=%d,j=%d\n",i,j); /*输出调用swap函数后i和j的值*/ return0;}
8.4指针与函数8.4.1
指针变量作为函数参数【运行结果】程序运行结果如图所示。
8.4指针与函数8.4.1
指针变量作为函数参数【程序说明】该程序中,swap函数的形参为指向整型的指针,调用swap函数的实参为整型变量的地址。调用swap函数后,指针变量p1中存入变量i的地址,指针变量p2中存入变量j的地址,即指针变量p1指向变量i,指针变量p2指向变量j。调用swap函数,首先执行语句“t=*p1;”,将指针p1所指的内容存入临时变量t中;然后执行语句“*p1=*p2;”,将指针p2所指的内容存入指针p1所指的变量中;最后执行语句“*p2=t;”,将临时变量t暂存的数据送入指针p2所指的变量中;从而完成交换两个变量值的操作。swap函数的执行过程和各个变量值的变化可用图描述。
8.4指针与函数8.4.1
指针变量作为函数参数【例8-12】将例8-11的程序改写成以下程序,试分析输出结果。#include<stdio.h>voidswap(int*p1,int*p2){ int*t; t=p1; p1=p2; p2=t;}intmain(){ inti=2,j=3; printf("BeforeSwap:i=%d,j=%d\n",i,j); swap(&i,&j); printf("AfterSwap:i=%d,j=%d\n",i,j); return0;}
8.4指针与函数8.4.1
指针变量作为函数参数【运行结果】程序运行结果如图所示。
8.4指针与函数8.4.1
指针变量作为函数参数【程序说明】同样是使用指针作为形参,但是却没有实现交换变量i和j的值。原因是:在本例中语句“p1=p2;”的含义与例8-11中语句“*p1=*p2;”是不同的,它的含义是“将指针变量p2的值赋给指针变量p1”,即实现指针变量之间的相互赋值。swap函数的执行过程和各个变量值的变化可用图描述。
8.4指针与函数8.4.1
指针变量作为函数参数
高手点拨虽然C语言的函数参数都是值传递,但是可以通过地址间接地把被调函数的某些数值传送给主调函数。指针参数传递中应注意:形参和实参共用同一存储单元,要从被调函数中获得多个值,可用多个指针变量作为函数参数,通过修改指针所指变量的值来返回多个值。前面介绍了如何定义和使用指向数组的指针变量,这里介绍了指向数组的指针变量作函数参数的方法。
8.4指针与函数8.4.1
指针变量作为函数参数【例8-13】编写程序,实现输入一个字符串,调用自定义函数length()计算字符串的长度并输出。【问题分析】定义函数length(),用来计算字符串的长度,在主函数中调用此函数,函数的形参和实参可以用字符指针变量。
8.4指针与函数8.4.1
指针变量作为函数参数【参考代码】#include<stdio.h>intlength(char*s) /*s为指向字符串的指针*/{ intlen=0; /*定义变量len用于存储字符串的长度*/ while(*s!='\0') /*当“*s!='\0'”成立时循环,计算字符串长度*/ { len++; s++; }
8.4指针与函数8.4.1
指针变量作为函数参数 returnlen; /*返回len的值*/}intmain(){ chara[30],*string=a; /*定义字符数组a,定义指针变量string指向a*/ printf("Pleaseinputastring:"); gets(string); /*输入字符串*/ printf("String=%s,length=%d\n",string,length(string)); /*输出字符串及字符串长度*/ return0;}
8.4指针与函数8.4.1
指针变量作为函数参数【运行结果】程序运行结果如图所示。【程序说明】main函数中的string是字符指针变量,指向字符数组a的首地址。length函数的形参s是字符指针变量,在调用length函数时,将数组a的首地址传给s,即s指向字符串的第一个字符a[0]。在while循环中,先检查s当前所指向的字符是否为'\0',如果不是就让长度加1,s指向下一个元素,如此循环,直到s指向字符'\0'为止,返回的len值即为字符串长度。
8.4指针与函数8.4.1
指针变量作为函数参数一个函数可以返回一个基本类型的值,也可以返回一个指针类型的数据,即地址。当将地址作为函数返回值时,该函数被称为指针函数。其定义形式为:数据类型*函数名(形参表){ 函数体;}其中,函数名前面的“*”表示该函数为指针型函数,即返回值类型为指针,数据类型表明指针指向的类型。因此,函数的返回值是一个指向该数据类型的指针。【例8-14】使用指针函数求两个变量的最大值。【例8-15】使用指针函数实现求两个变量的最大值,返回指向较大值的指针变量,输出指针变量指向的变量的值。【问题分析】
8.4指针与函数8.4.2
指针作为函数的返回值【参考代码】#include<stdio.h>int*max(int*x,int*y) /*函数max的返回值为指向整型的指针*/{ int*p; p=*x>*y?x:y; /*p为指向最大值的指针*/ return(p); /*返回指针p*/}intmain(){ inta,b,*pmax; /*指针pmax指向最大值变量*/ printf("pleaseinputaandb:"); scanf("%d,%d",&a,&b); pmax=max(&a,&b); /*调用max时实参为变量a和b的地址*/ printf("max=%d\n",*pmax); /*输出较大值*/ return0;}
8.4指针与函数8.4.2
指针作为函数的返回值【运行结果】程序运行结果如图所示。
8.4指针与函数8.4.2
指针作为函数的返回值如果程序中定义了一个函数,在编译时,编译系统会为该函数分配一段存储空间,这段存储空间的起始地址又称为入口地址。当调用该函数时,系统会从这个入口地址开始执行该函数。存放函数入口地址的指针就是一个指向函数的指针,简称函数的指针。其定义方式为:类型标识符(*指针变量名)(函数参数表列);如“int(*p)(int);”,这里的类型标识符为函数返回值的类型。
提示在C语言中,括号的优先级比*高,因此,“*指针变量名”外部必须用括号,否则指针变量名首先与后面的括号结合,就是前面介绍的“指针函数”。例如:int(*pf)();/*定义一个指向函数的指针,该函数的返回值为整型数据*/int*f()/*定义一个返回值为指针的函数,该指针指向一个整型数据*/
8.4指针与函数8.4.3
函数的指针和变量的指针一样,函数的指针也必须赋初值,才能指向具体的函数。由于函数名代表了该函数的入口地址,因此,可以直接用函数名为函数指针赋值,即:函数指针名=函数名;例如:doublefun(inta); /*函数说明*/double(*p)(int); /*函数指针说明*/p=fun; /*f指向fun函数*/函数型指针经定义和初始化之后,在程序中可以引用该指针,目的是调用被指针所指的函数。用函数指针变量调用函数时,只须将“(*p)”代替函数名即可(p为指针变量名),在“(*p)”之后的括号中可根据需要写上实参。例如:b=(*p)(a); /*调用由p指向的函数,实参为a,得到的函数值赋给b*/
8.4指针与函数8.4.3
函数的指针
名师点睛定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数,它只能指向在定义时指定的类型的函数。如“int(*p)(int);”表示指针变量p只能指向函数返回值为整型且有一个整型参数的函数。在一个程序中,一个指针变量可以先后指向同类型的不同函数。另外,对指向函数的指针变量不能进行算术运算,如p+n、p++、p--等运算是无意义的。【例8-15】【例8-15】用函数的指针实现从两个数中输出较大者。【问题分析】定义一个函数max,用于求较大数,在主函数中定义指向函数的指针变量,使其指向max函数,最后用函数指针变量调用函数。
8.4指针与函数8.4.3
函数的指针【参考代码】#include<stdio.h>intmain(){ intmax(int,int); /*函数声明*/ int(*pf)(int,int); /*函数指针定义*/ inta,b,c; pf=max; /*将函数的入口地址赋给指针*/ printf("pleaseinputaandb:");
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026甘肃倚核人力资源有限公司招聘笔试参考题库及答案解析
- 2026广东省公共卫生医学中心泗安院区招聘编外临床工作人员3人笔试备考题库及答案解析
- 2026年四川职业技术学院单招职业倾向性考试题库附答案
- 2026陕西省面向北京航空航天大学招录选调生考试参考题库附答案
- 2026年徽商职业学院单招职业倾向性考试模拟测试卷附答案
- 2026福建福州经济技术开发区粮食收储有限公司招聘2人笔试备考题库及答案解析
- 2026浙江宁波舜瑞产业控股集团有限公司招聘1人补充笔试参考题库及答案解析
- 江投国华信丰发电有限责任公司公开招聘劳务派遣制工作人员笔试备考试题及答案解析
- 2025河南商丘工学院教师招聘备考题库附答案
- 2026青海西宁国有企业招聘4人笔试参考题库及答案解析
- 【MOOC】通信原理-北京交通大学 中国大学慕课MOOC答案
- 正规装卸合同范本
- 科研设计及研究生论文撰写智慧树知到期末考试答案章节答案2024年浙江中医药大学
- 2024年江苏省普通高中学业水平测试小高考生物、地理、历史、政治试卷及答案(综合版)
- 土力学与地基基础(课件)
- 精神分裂症等精神病性障碍临床路径表单
- 提捞采油安全操作规程
- 管道安全检查表
- DB3211-T 1048-2022 婴幼儿日间照料托育机构服务规范
- 电缆井砌筑工序报验单检验批
- SB/T 11137-2015代驾经营服务规范
评论
0/150
提交评论