第四讲函数和指针_第1页
第四讲函数和指针_第2页
第四讲函数和指针_第3页
第四讲函数和指针_第4页
第四讲函数和指针_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四讲函数和指针第一页,共三十九页,2022年,8月28日函数考点考核几率分值函数的定义与返回值80%1~3库函数60%1~2函数调用及形参与实参之间的数据传递(难点)100%2~4函数的声明60%0~1第二页,共三十九页,2022年,8月28日一、函数的定义1、函数定义功能单一且独立的程序模块,用于完成特定的任务并根据需要返回一个确定的值。2、函数定义的格式

返回值类型

函数名(类型1 形参名1,类型2形参名2,…){

说明部分

语句部分}首部+函数体第三页,共三十九页,2022年,8月28日3、注意事项(1)函数返回值类型名缺省时,返回值类型默认为int,无返回值时类型是void。(2)函数名和形参名是用户标识符。主函数的函数名必须为main。(3)函数名后面的括号“()”不能省。形参用于数据传递,可以缺省。(4)一对花括号中的内容为函数体,包含两部分:说明部分和语句部分。(5)函数不能嵌套定义。第四页,共三十九页,2022年,8月28日二、函数返回值return语句格式为:return(表达式);注意:(1)表达式可以不加括号。(2)表达式的值就是函数的返回值,类型应和函数定义返回值的类型一致,否则系统强制转换。(3)如果有多个return语句,则只有第一个起作用,因为一旦遇到return语句就会结束当前函数的运行。第五页,共三十九页,2022年,8月28日doublearea(doublea,doubleb){doubles;s=a*b;returns;}第六页,共三十九页,2022年,8月28日intmax(inta,intb){intc;if(a>b)c=a;else c=b;returnc;}第七页,共三十九页,2022年,8月28日例1intisprime(inta){inti;for(i=2;i<=a/2;i++)if(a%i==0);

;}第八页,共三十九页,2022年,8月28日三、库函数C语言自己提供的函数称为库函数。在使用某一类库函数的时候,需要在程序的开头使用include命令包含头文件。如,使用printf和scanf函数时,开头要加上#include<stdio.h>

使用数学函数类里的函数时开头要加上#include“math.h”“”可以换成<>附录五P190

第九页,共三十九页,2022年,8月28日四、函数调用1、函数调用的形式函数名(实参);说明:(1)不写返回值类型和实参类型。(2)实参可以是常量、变量、表达式、函数调用。(3)参数传递方向:实参→形参(单向)。(4)若函数返回值类型是void,则函数调用不能出现在表达式中,不能赋值给变量。(5)函数可以直接或间接的调用自己,称为递归调用。第十页,共三十九页,2022年,8月28日函数数据的传递注意:(1)数据只能从实参单向传到形参,无论形参值如何改变,都不会影响到对应实参的值;(2)函数最多只能返回一个函数值。

形参在函数被调用时临时分配存储空间,一旦函数使用完毕,这些空间马上被释放。第十一页,共三十九页,2022年,8月28日voidswap(intx,inty){ intt; t=x;x=y;y=t; printf("%d %d",x,y);}main(){ inta=3,b=4; swap(a,b); printf("%d %d",a,b);}第十二页,共三十九页,2022年,8月28日2008年4月(12)以下程序的输出结果是:

#include<stdio.h>voidfun(intx){if(x/2>0)fun(x/2);printf(“%d”,x);}main(){fun(3);printf(“\n”);}第十三页,共三十九页,2022年,8月28日五、函数的声明1、函数声明的形式返回值类型

函数名(类型1形参1,类型2 形参2,…);即在函数的首部加上分号。2、函数声明的注意事项(1)可省略形参名,不可省略形参的类型。

如,doublearea(double,double);第十四页,共三十九页,2022年,8月28日(2)声明时的参数名可与定义时的形参名相同,也可不同。

如,doublearea(doublex,doubley);(3)声明的位置:在函数的内部,该函数属于私有函数;如果在所有函数的外部,则属于公有函数。3、函数的两种使用方式(1)先定义,后调用。(2)先声明,后调用,最后定义。第十五页,共三十九页,2022年,8月28日voidswap(intx,inty){intt; t=x;x=y;y=t; printf("%d%d",x,y);}main(){ inta=3,b=4; swap(a,b); printf("%d%d",a,b);}main(){inta=3,b=4;voidswap(int,int); swap(a,b); printf("%d%d",a,b);}voidswap(intx,inty){ intt; t=x;x=y;y=t; printf("%d%d",x,y);}第十六页,共三十九页,2022年,8月28日2008年4月(34)有以下程序

#include<stdio.h>intf(intx){inty;if(x==0||x==1)return(3);y=x*x-f(x-2);returny;}main(){intz;z=f(3);printf(“%d\n”,z);}程序的运行结果是:A)0B)9C)6D)8第十七页,共三十九页,2022年,8月28日2007年9月试题分析(25)若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是 A)函数的实参和其对应的形参共占同一存储单元 B)形参只是形式上的存在,不占用具体存储单元 C)同名的实参和形参占同一存储单元 D)函数的形参和实参分别占用不同的存储单元第十八页,共三十九页,2022年,8月28日(8)以下程序的运行结果是

int

k=0;

voidfun(int

m)

{

m+=k;k+=m;printf(“m=%d\nk=%d

”,m,k++);}

main()

{inti=4;

fun(i++);printf(“i=%d

k=%d\n”,i,k);

}第十九页,共三十九页,2022年,8月28日指针考点考核几率分值变量的地址和指针(难点)60%2~4指针变量的定义、赋值和运算等操作(难点)100%4~8函数之间地址值的传递(难点)70%2~5第二十页,共三十九页,2022年,8月28日一、指针变量的定义1.引言(1)变量的存储过程:①在程序中定义一个变量;编译时,系统根据变量的类型,为变量分配一定的存储空间;②内存中每个字节都有唯一的一个编号,这个编号就叫做这个字节的地址;相当于旅馆的房间号;③每个变量在内存中的第一个字节的编号就是该变量的地址;④

该空间中存放着变量的值,相当于是旅客;第二十一页,共三十九页,2022年,8月28日eg:inta=5;则其内存结构图为:变量a的地址为2001,对应于“总统套房的”房间号是“401”;变量a的值为5,对应于“总统套房”里的“值”是旅客;变量a的存储空间数为4个字节,对应于“总统套房”有四个单间;a20012002200320045总统套房401402403404旅客第二十二页,共三十九页,2022年,8月28日(2)对内存单元的访问:1)直接访问:已知变量a的地址,根据此地址直接对变量a的存储空间进行操作;2)间接访问:事先不知道a的地址,知道a的地址放在存储单元b中,而且已知存储单元b的地址:①访问存储单元b,得到存储单元a的地址;②由得到的地址,访问存储单元a,对a的值进行操作;52001a直接访问52001a20012008b间接访问第二十三页,共三十九页,2022年,8月28日一个例子:我们要打开抽屉A有两种方法:①.拿出A抽屉的钥匙,直接打开抽屉A,拿出所需东西;②.拿出抽屉B的钥匙,打开抽屉B,取出抽屉A的钥匙;用抽屉A的钥匙,打开抽屉A,取出所需东西;keyAA直接访问keyAAKeyAkeyBB间接访问第二十四页,共三十九页,2022年,8月28日2.指针变量的定义指针:用来存放地址的变量称为指针变量。

指针就是地址。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。格式:类型名*变量名;说明:*表示这是一个指针变量,变量名即为定义的指针变量名,类型名表示本指针变量只能用于存储该数据类型的变量。eg:int*p,*q;char*ch;第二十五页,共三十九页,2022年,8月28日二级指针变量:类型名 **指针变量名;eg:int**p,*q;3.指针变量的赋值通过“&”运算符给指针变量赋初值,“&”用于求变量的地址;inta=3,*p;p=&a;/*将变量a的地址赋给p,也说p指向变量a*/注:单目运算符“&”只能和变量结合,不能放在表达式或常量的前面。3a2001P2001第二十六页,共三十九页,2022年,8月28日通过其他指针变量获得地址值int*p,*q,a;p=&a;q=p;/*指针变量p和q都指向了a*/给指针变量赋空值

表示该指针变量不指向任何变量。p=NULL;

使用NULL时,应在程序前面先预定义:#include<stdio.h>注:不能通过空指针访问一个存储单元。

第二十七页,共三十九页,2022年,8月28日(真题)以下叙述中错误的是 A)改变函数形参的值,不会改变对应实参的值 B)函数可以返回地址值 C)可以给指针变量赋一个整数作为地址值

D)当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULL第二十八页,共三十九页,2022年,8月28日4.引用存储单元间接访问运算符:*含义:*p表示访问p所指向变量的值。inta=3,*p;p=&a;*p=a;注意:第一行中的*p和第三行中的*p的区别*(&a)=*p=*&a.*与&优先级相同,自右向左等价关系:

a,*p,*(&a)相等价;&a,p,&(*p)相等价;第二十九页,共三十九页,2022年,8月28日例1main(){inta=7,b=8,*p,*q,*r;p=&a;q=&b;r=p;p=q;q=r;printf(“%d,%d,%d\n”,*p,*q,a,b);}第三十页,共三十九页,2022年,8月28日5.指针的移动移动指针就是通过赋值运算,使指针变量加上或减去一个整数,使指针变量指向相邻的存储单元。eg:int*p;p=p+1;p

P+1……10001001100210031004100510061007第三十一页,共三十九页,2022年,8月28日5.指针的比较p>q:p所指单元在q之后;p<q:p所指单元在q之前。

pq

……a[0]a[1]a[2]a[3]a[4]……第三十二页,共三十九页,2022年,8月28日二、函数之间地址值的传递1、传值调用与传址调用(1)传值:前面学习的普通变量作实参的函数调用便是传值调用。形参改变时实参不变。(2)传址:当函数的形参为指针变量时,则调用该函数时,对应的实参也必须是与形参基类型相同的地址值或指针变量,这种函数调用即传址调用。形参变化时,实参也会改变。第三十三页,共三十九页,2022年,8月28日voidswap(intx,inty){ intt; t=x;x=y;y=t; printf("%d %d",x,y);}main(){ inta=3,b=4; swap(a,b); printf("%d %d",a,b);}第三十四页,共三十九页,2022年,8月28日voidswap(int*a,int*b){ intt; t=*a;*a=*b;*b=t;}

main(){

inta=3,b=4; printf("(1)a=%d b=%d\n",a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论