C语言复习PPT.ppt

上传人:豆**** 文档编号:87081202 上传时间:2023-04-16 格式:PPT 页数:105 大小:1.26MB
返回 下载 相关 举报
C语言复习PPT.ppt_第1页
第1页 / 共105页
C语言复习PPT.ppt_第2页
第2页 / 共105页
点击查看更多>>
资源描述

《C语言复习PPT.ppt》由会员分享,可在线阅读,更多相关《C语言复习PPT.ppt(105页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C语言复习PPT标识符注意事项标识符注意事项标识符用来命名变量、函数或类型;由英文字母、数字和下划线组成组成,大小写敏感;大小写敏感;不可以不可以是数字开头;命名原则命名原则1 1直观,见名知意,便于记忆和阅读最好使用英文单词或其组合切忌使用汉语拼音命名原则命名原则2 2可用下划线或大小写来增强可读性variablenamevariable_nameVariableName,variableName不允许使用关键字关键字作为标识符的名字int,float,for,while,if等某些功能的变量采用习惯命名如:for语句所采用的循环变量习惯用i,j,k二、自增、自减运算符(、-)+i,-i(先

2、加/减1,然后取i的值)i+,i-(先取i的值,然后加/减1)b=2 ,a=2b=2 ,a=3作用:使变量的值增或减,如:例如:inta=1,b;b=+a;b=a+;先使用i的值,再执行i=i+1先执行i=i+1,再使用i的值+ii+说明:1.+、只能用于变量,不能用于常量或表达式。例如:10,(x+y)+,+a,b+中合法的为:2.自增、自减运算符为右结合性。例如:a+b+(a+)3.常用于循环变量自动加 1 4.表达式中运算符的组合,尽可能左结合 如:I+J(I+)+J5.表达式中使用自加或自减运算时,需注意 如:I=3K=(I+)+(I+)+(I+)结果:k=9,I=6如:I=3I=(I

3、+)+(+I)+(I+)结果:I=14若a=2,b=3,x=3.5,y=2.5,则表达式(float)(ab)/2(int)x%(int)y的值是3.5表达式1/4+2.75的值是2.75三、赋值运算符和赋值表达式1.赋值运算符为“=”形式:变量名=常量或表达式作用:将一个数据赋给一个变量右结合性例如:a=3;b=c+d;C规定:任何表达式在末尾加上分号就构成语句。如:A=B+C表达式A=B+C;语句“=”号两端数据类型不同时进行转换转换是系统自动进行的,右边转换为左边类型。规则如下:(1)整型=实型舍去小数部分(2)实型=整型值不变,以浮点形式存放(3)整型=字符型值放入低8位,高8位为0(

4、4)字符型=整型仅将整型低8位存入六、关系运算符和关系表达式语言中的关系运算符有种。(左结合性)、!2.算术运算符(高)关系运算符赋值运算符(低)优先次序:1.前种同级,高于后种(后种同级)例如:x!=y、s-db+c、a=bc关系运算符运算出的结果为0或10,表示假,即该关系不成立1,表示真,即该关系成立在所有涉及到真假判断的地方,0表示假,非0表示真优先级:!高于&高于|混合运算中:!高算术运算关系运算&、|低赋值运算注:如何判断一个逻辑表达式为“真、假”?用“非”代表“真”,用“”代表“假”。如:b&0值为:“0”逻辑表达式:1.运算结果为逻辑值2.编译系统以非0、0判定逻辑值真、假3.

5、逻辑表达式中作为参加逻辑运算的运算对象可以是0或非0数值。但要区分运算对象。例:53&2|8b?a:b将条件表达式的值赋给变量max说明:例:设a,b,c,d的值为1、2、3、4求下述表达式的值max=ab?a:cd?c:d等价于max=ab?a:(cd?c:d)结果为:4优先级:!高于&高于|混合运算中:!高算术运算关系运算&、|低赋值运算表达式:2-2的值是 1设x、y和z是int类型变量,且x=3;y=4;z=5;则下面表达式中的值为0的是 。Ax&y Bx=y Cx|y+z&y-z D!(x=A&x=a&x=zwhilewhile(表达式)语句块1;语句块2;只要表达式的值为非0,就重

6、复执行语句块1,直到表达式值为0时止,开始执行语句块2表达式表达式表达式表达式!=0?!=0?Y YN N语句块语句块语句块语句块1 1语句块语句块语句块语句块2 2forfor(表达式1;表达式2;表达式3)语句块;首先执行表达式1。如果表达式2的值为非0,就重复执行语句块和表达式3,直到表达式2的值为0时止相当于:表达式1;while(表达式2)语句块;表达式3;for的所有表达式均可省略表达式表达式表达式表达式2!=0?2!=0?Y YN N语句块语句块语句块语句块表达式表达式表达式表达式3 3表达式表达式表达式表达式1 1注意在for和while语句之后一般没有分号有分号表示循环体就是

7、分号之前的内容,即循环体不存在while(i 100);i+;for(i=0;i 100;i+);printf(%d,i);for通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量循环do-whiledo语句块1;while(表达式);语句块2;首先执行语句,然后判断表达式的值。如果表达式为0,继续向下执行,否则,再次执行语句,再次判断表达式的值语句块1会被执行至少一次表达式表达式表达式表达式!=0?!=0?Y YN N语句块语句块语句块语句块1 1语句块语句块语句块语句块2 2break和continue对for、while、do-while循环进行内部手术break,退出循环退出

8、循环continue,中断此次循环的执行,开始下一次中断此次循环的执行,开始下一次break和continue少用为妙它们增加了循环执行的分支,break更增加了循环的出口它们可以用来处理程序异常,而尽量不要用来处理正常流程若intx=4,y=6,z=0;有循环while(x=y)z+;y-;则循环语句执行完后,z值为。6判断题:1.标准C中,并不区分英文字符的大小写。2.表达式“ELSE”是合法的C语言标识符。错对若一自然数全部正整数因子(该因子不包括其本身)之和仍为该自然数,则该自然数称为完全数。如:6=1+2+3,则6是完全数。求2,1000以内的所有完全数。main()intx,n,m

9、;for(n=2;n=1000;n+);for(m=1;my?x:y);函数可根据需要出现个return语句(1)如果函数值类型与return语句表达式值的类型不一致,以函数类型为准(数值型会自动进行类型转换)(2)声明为void型的函数中不能包括带值的return语句;主函数体内不能出现return语句。注意注意:注意注意:(3)当函数没有return语句时,以结束函数的大括号作为返回点。但这时并不表明函数没有返回值,这时的返回值是系统给的不确定值。(4)除了空值函数以外的所有函数都返回一个值,那么我们是不是非得去使用这个返回值呢?答案是否定的。如果没有用它赋值,那它就被丢弃了。(5)在同一

10、函数内,可用根据需要在多处出现return语句,但函数第一次遇到return时就立即停止执行,并返回到主调函数函数的调用形式参数:在定义定义函数时函数名后面括弧中的变量名,简称形参实际参数:在调用函数时函数名后面括弧中的表达式,简称实参调用格式:函数名函数名(实参实参表列表列)说明:实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放函数参数及其传递方式值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保

11、留并维持原值,形参作域只限函数内特点:形参与实参占用不同的内存单元单向传递参数传递方式方式:函数调用时,将数据的存储地址作为参数传递给形参特点:形参与实参占用同样的存储单元“双向”传递实参和形参必须是地址常量或变量函数的地址传递递归调用函数在它的函数体内调用自己,以实现层次数据结构的查询和访问使用递归的条件:1一个问题可以逐步解决,并且每一步的解决方法一样,只是问题的参数有规律的变化2有一个明确的结束递归的条件优点:优点:递归的使用可以使代码更简洁清晰,可读性更好缺点:缺点:由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多,而且,如果递归深度太大,可能系统资源会不够用方便了程序员难为了

12、机器所有的递归函数都可以转换为迭代函数所有的递归函数都可以转换为迭代函数,反之亦然,反之亦然概述变量是对程序中数据的存储空间的抽象内存.main()inta;a=10;printf(“%dn”,a);printf(“%dn”,&a)编译或函数调用时为其分配内存单元1020002001程序中使用变量名对内存操作6.6变量的存储属性6.6.1变量的作用域与生存期变量的作用域与生存期C语言中变量必须先定义后使用,变量的数据类型决定了计算机为变量预留多少存储空间以及该变量上应具有的一组运算。C语言中,除了对变量进行数据类型说明,还可以说明变量的存储类型。不同的存储类型可以确定一个变量的作用域和生存期。

13、变量的存储类型变量的存储类型1.1.变量的作用域变量的作用域 变量的作用域是指变量的作用范围,在C语言中分为在全局有效、局部有效和复合语句内有效三种。语言中所有的变量都有自己的作用域。变量说明的位置不同,其作用域也不同,据此可将语言中的变量分为局部变量(内部变量)和全局变量(外部变量)。2.生存期生存期变量的生存期是指变量作用时间的长短,在C语言中分为程序期、函数期和复合期三种。变量的属性数据类型:变量所持有的数据的性质(操作属性)存储属性存储器类型:寄存器、静态存储区、动态存储区生存期:变量在某一时刻存在-静态变量与动态变量作用域:变量在某区域内有效-局部变量与全局变量变量的存储类型auto

14、-自动型register-寄存器型static-静态型extern-外部型变量定义格式:存储类型数据类型变量表;数据类型存储类型变量表;staticintx,y;局部变量定义:在函数内定义,只在本函数内有效说明:main中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量可定义在复合语句中有效的变量局部变量可用存储类型:autoregisterstatic(默认为auto)#includemain()intTest_Var=1;intTest_Var=2;intTest_Var=3;printf(“%dn”,Test_Var);/*?*printf(“%dn”,Te

15、st_Var);/*?*printf(“%dn”,Test_Var);/*1*1.自动变量在函数内部或复合语句内部定义的变量,如果没有写明存储类,或使用了auto说明符,系统就认为所定义的变量具有自动变量类别,有时也称(动态)局部变量。形参属于被调用函数的局部变量。注意:形参缺省的关键字是auto,但不能将auto直接加在形参之前。自动变量的初始化是:每一次调用,形参都以实参为初值,非形参的自动变量在函数体内部或复合语句内部都重新赋初值。所以,未赋初值的自动变量,“无定义”,其值不定。3.静态局部变量静态局部变量在函数体(或复合语句)内部,用以下定义格式定义的变量称为静态局部变量:static

16、数据类型变量表;例如:staticinta=8;静态局部变量的初始化只在编译时进行一次,每次调用它们所在的函数时,不再重新赋初值,只是保留上次调用结束时的值。若定义但不初始化,则自动赋以(数值型)或0(字符型)。例例6.18求下列程序的输出结果#includemain()intf(void);/*函数声明*/intj;for(j=0;j3;j+)printf(%dn,f();intf(void)/*无参函数*/staticintx=1;x+;returnx;程序运行结果:程序运行结果:234例例:分析执行结果f(inta)intb=0;staticintc=3;b+;c+;printf(“%5

17、d%5d%5d”,a,b,c);return(a+b+c);main()inta=2,k;for(k=0;k3;k+)printf(“%5dn”,f(a);静态变量只初始化一次结果:214(a,b,c)7(f(a)215821692.静态全局变量静态全局变量当用static说明符说明全局变量时,此变量就称为静态全局变量或静态外部变量。此时static的作用不是把全局变量改为静态存储,因为它本身就是静态存储类,而是限制了它的作用域只能在本文件内,不能用extern说明符使其作用域扩展到程序的其它文件中。静态外部变量允许程序的一部分对其它部分充分隐蔽,这有利于管理大型复杂程序,程序员不必担心因全局

18、变量重名而引起混乱。静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件u局部变量默认为auto型uregister型变量个数受限,且不能为long,double,float型u局部static变量具有全局寿命和局部可见性u局部static变量具有可继承性uextern不是变量定义,可扩展外部变量作用域register局部staticauto外部static外部存储类别变量存储类型找出2个错误用递归语句编函数计算10!long

19、f(intm)longa;if(m0)printf(“dataerror!”);elsea=f(m1)*m;main()intn;n=10;printf(“%d!=%ld”,n,f(n);if(m=0)a=1;return(a);用递归语句编函数计算6!longf(intm)longa;if(m0)printf(“dataerror!”);elsea=f(m-1)*m;main()intn=6;printf(“%d!=%ld”,n,f(n);if(m=0)a=1;return(a);#includeinti=0;main()intk=1;i+;k+;printf(“goodi=%d,k=%dn

20、”,i,k);sub();sub();staticinty=0;sub()intk=0;staticintx=1;y+;k+;x+;printf(“badi=%d,k=%d,x=%d,y=%dn”,i,k,x,y);goodi=1,k=2badi=1,k=1,x=2,y=1badi=1,k=1,x=3,y=2一维数组的定义v定义方式:数据类型 数组名常量表达式;合法标识符表示元素个数下标从0开始:数组运算符单目运算符优先级(1)左结合不能用()例 inta6;a00145a1a2a3a4a523a编译时分配连续内存内存字节数=数组维数*sizeof(元素数据类型)数组名表示内存首地址,是地址常

21、量 一维数组一维数组 .4的高位字节4的低位字节2的高位字节2的低位字节20002002200420062008a0a1a2a3a4数组在内存数组在内存中的首地址中的首地址即即a=2000int a5=2,4,23,6,78;二维数组的定义v定义方式:数据类型数组名常量表达式常量表达式;v数组元素的存放顺序l原因:内存是一维的l二维数组:按行序优先l多维数组:最右下标变化最快例inta34;floatb25;intc234;inta3,4;()行数列数元素个数=行数*列数inta32a01a10a11a20a21014523a00a00a01a10a11a20a21intc2340123456

22、7.20212223c000c001c002c003c010c011c012c013c020c021c022c023c100c101c102c103c110c111c112c113c120c121c122c123二维数组及多维数组二维数组及多维数组v引用例aij(i:0N-1,j:0M-1)v初始化例 inta23=1,2,3,4,5,6;a00 a01 a02 a10 a11 a12123456分行全部赋初值例 inta23=1,2,3,4,5,6;a00 a01 a02 a10 a11 a12123456全部元素赋初值例inta3=1,2,3,4,5;a00 a01 a02 a10 a11

23、 a12123450全部元素赋初值第一维可省例inta23=1,2,4;a00 a01 a02 a10 a11 a12124000部分元素赋初值例 inta3=1,4,5;a00a01a02a10a11a12100450赋初值时指定维数第一维可以省略例 inta23=1,2,4;a00 a01 a02 a10 a11 a12120400分行部分赋值字符数组v 定义:v初始化l逐个字符赋给数组中的元素;l利用字符串常量.例charc10,ch34;例 charch6=Hello;charch6=Hello;charch=Hello;字符串常量初始化ch0Helloch1ch2ch3ch40ch5

24、例例charch5=Boy;ch0Boy00字符串常量初始化ch1ch2ch3ch4 例例charch5=B,o,y;ch0Boy00逐个字符初始化ch1ch2ch3ch4 例例charch5=H,e,l,l,o;ch0Hello逐个字符初始化ch1ch2ch3ch4例例chardiamond5=.,.,*,.,*,.,*,*,.,.,.,*,.,*,.,*,.,.,*;二维数组初始化.*00.*.*0*.*.*.*0.*00diamond0diamond1diamond2diamond3diamond4例例charfruit7=Apple,Orange,Grape,Pear,Peach;二维

25、数组初始化fruit0fruit1fruit2fruit3fruit4Apple00Orange0Grape00Pear000Peach00v 字符串:l没有字符串变量,字符串用字符数组来处理;l一个字符串用0作结束标志。(或空字符)例“hello”有5个字符,存储在6个字符的字符数组中。chara=“hello”h e l l o 0l输入输出字符串字符的输入/输出:%c字符串的输入/输出:%s例使用%cmain()charstr5;inti;for(i=0;i5;i+)scanf(“%c”,&stri);for(i=0;i5;i+)printf(“%c”,stri);例使用%smain()

26、charstr5;scanf(“%s”,str);printf(“%s”,str);使用数组名,不需使用地址运算符&输入字符串的长度 数组的长度用空格或换行结束输入自动添加结束符0使用数组名用0标志字符串的结束v字符串处理函数uputs(字符数组名)stdio.hputs 输出字符串,可以包含转义字符;字符数组必须具有字符串结束标记0ugets(字符数组名)stdio.hgets 输入一个字符串到字符数组,换行表示输入字符串结束;自动在输入字符串后加入结束标志0;字符串长=数组长度函数的返回值是数组的首地址,一般不关心。只输入一个字符串。例#includemain()charstring80;

27、printf(Inputastring:);gets(string);puts(string);input:Howareyou?output:Howareyou?ustrcat(字符数组名1,字符数组名2)string.h将字符数组2连接到字符数组1的后面,连接时自动取消字符数组1后面的结束标志;结果存放到字符数组1中,函数返回值是字符数组1的首地址;字符数组1要有足够的空间存放结果;ustrcpy(字符数组1,字符串2)string.h将字符串2复制到字符数组1,包括0;字符数组1必须有足够的空间存放结果;字符串2可以是数组名。可以将字符串2前面的若干个字符赋值到字符数组1中去。不能用赋值语

28、句将一个字符串赋值给字符数组例charstr120,str220;str1=Hello!;()str2=str1;()例:strcpy和strcat#include#includemain()chardestination25;charblank=,c=C+,turbo=Turbo;strcpy(destination,turbo);strcat(destination,blank);strcat(destination,c);printf(%sn,destination);TurboC+TrboC+0123456789u024.Trbo0123456789u024.Trbo001234567

29、89u24.ustrcmp(字符串1,字符串2)string.h用字符的ASCII值逐个对应比较字符串1与字符串2字符的大小(left-to-right);if字符串1字符串2,返回字符串2,返回0;不能用=去直接比较两个字符串的大小.ustrlen(字符数组)string.h返回字符串的长度;函数的值是字符串的实际长度,不包括0.例strlen(s)的结果:(1)chars10=A,0,B,C,0,D;结果:1已知矩阵已知矩阵a=,求该矩阵对角线元素之和。,求该矩阵对角线元素之和。main()inti;inta33=1,2,3,4,5,6,7,8,9;for(i=1;i=3;i+)sum=s

30、um+ii;printf(“sum=%d”,sum);intsum=0;for(i=0;i3;i+)已知质数的定义是:若某一正整数只有1和它本身两个因子,则这个正整数称为质数。例如13只有1和13两个因子,则13为质数。数学上规定1不是质数。若整数A是整数B的因子,且整数A是质数,则称A是B的质因子。例如整数36的质因子为2,3。编写程序求整数12903的最大质因子。f(intx)inti;for(;ix;i+)if(x%i=0)k=2;break;return(k);main()intn=12903,b,a;for(a=2;an;a+)if(f(a)=1)&(n%a=0)printf(“th

31、eansweris%dn”,b);int k=1i=2b=a;指针变量定义指针变量定义定义指针变量的一般形式为基类型*指针变量名指针变量与普通变量类似,在程序中若要使用指针变量,必须先进行定义后使用。例如:int*p1,i;(定义p1为指向整型变量的指针变量)char*p2,c;(定义p2为指向字符型变量的指针变量)float*p3,f;(定义p3为指向实型变量的指针变量)int、char、float分别称为指针变量p1、p2、p3的“基类型”,.2000200420062005整型变量i10变量i_pointer200120022003指针与指针变量的区别?v指针:一个变量的地址v指针变量:

32、专门存放变量地址的变量叫2000指针指针变量变量的内容变量的地址指针变量变量变量地址(指针)变量值指向地址存入指针变量&与*运算符含义含义:取变量的地址单目运算符结合性:自右向左含义:取指针所指向变量的内容单目运算符结合性:自右向左v两者关系:互为逆运算v理解.2000200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-指针变量,它的内容是地址量*i_pointer-指针的目标变量,它的内容是数据&i_pointer-指针变量占用内存的地址200010i_pointer*i_pointer&i_pointerii_pointe

33、r&i&(*i_pointer)i*i_pointer*(&i)i_pointer=&i=&(*i_pointer)i=*i_pointer=*(&i)直接访问与间接访问直接访问:按变量地址存取变量值间接访问:通过存放变量地址的变量去访问变量例i=3;-直接访问指针变量.2000200420062005整型变量i10变量i_pointer20012002200320003例*i_pointer=20;-间接访问20指针变量.2000200420062005整型变量i10变量i_pointer2001200220032000整型变量k例k=i;-直接访问k=*i_pointer;-间接访问10例

34、k=i;k=*i_pointer;指针变量赋值(初始化)指针变量赋值(初始化)1通过取地址运算符(&)获得地址值如下定义和赋值:inta=5,*p,*q;p=&a;它建立了如图所示的逻辑关系pa&a5因此当有语句:p=&a;时,scanf(%d,&a);和scanf(%d,p)是等价的 2通过指针变量获得地址值通过指针变量获得地址值可以通过赋值运算,把一个指针变量中的地址值赋给另一个指针变量,从而使这两个指针变量指向同一地址q=p;使指针变量q中也存放了变量a的地址,也就是说指针变量p和q都指向了整型变量a赋值号两边指针变量的基类型必须相同paq&a5&a 3给指针变量赋给指针变量赋“空空”值

35、值p=NULL;p=0;NULL的代码值为0,应当注意:1.指针变量只能存放地址,不能把一个整型量赋给指针变量p=5;应该通过取地址运算符“&”把一个地址赋给指针变量。2.应避免使用没有赋值的指针变量,没有赋值的指针变量虽不会导致编译出错,但可能导致无法预料的灾难性后果注意:)指针变量数据类型必须与所赋值的变量类型一致,例如以下语句是非法的。floaty;int*p;p=&y;因为为整型指针变量,y为实型变量,类型不一致,故为p=&y;是非法语句。)不允许把一个数(常量)赋予指针变量,故下面的赋值是错误的。int*p;p=1000;)被赋值的指针变量前不能再加“*”说明符,如写为*p=&a也是

36、错误的。但对于在定义指针的同时赋值是允许的,如:int*p=&a;其实质可分解为两句,即:int*p;p=&a;)可以将指针变量初始化为空值NULL。如:p=NULL;为进一步明确运算符为进一步明确运算符“&”和和“*”的含义和作用,思考下面几个的含义和作用,思考下面几个问题:问题:)如果已经执行了p=&a;语句,则&*p的含义是什么?假设已经执行了假设已经执行了p=&a;语句,则语句,则(*p)+相当于相当于a+,即将指针变,即将指针变量量p所指示的变量的值加所指示的变量的值加1。而。而*p+等价于等价于*(p+),这时先将),这时先将p的值加的值加1,p不再指向不再指向a了,而是指向了,而

37、是指向a所占用存储区域的后续所占用存储区域的后续位置,再取其内存值。位置,再取其内存值。)如inti=5,*p;再执行*i运算可不可以?由于运算符由于运算符“”和和“*”的优先级相同,按自右而左的方向结合,的优先级相同,按自右而左的方向结合,因些进行因些进行*p的运算,即得到变量的运算,即得到变量a的值,再执行运算。因此,的值,再执行运算。因此,*p与与a、p是等价的。即可以说是等价的。即可以说“”与与“*”是互为反运算。是互为反运算。这是不允许的,因为这是不允许的,因为i只是一个整型变量,而不是指针变量,故根只是一个整型变量,而不是指针变量,故根据自右而左的运算据自右而左的运算*i是错误的,

38、是错误的,*运算符只能是对指针变量进行运运算符只能是对指针变量进行运算。算。3)(*p)+和*p+的区别是什么?数组元素表示方法a0a1a2a3a9.aa+9a+1a+2地址元素下标法a0a1a2a9a0a1a2a3a9.pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)变址运算符ai*(a+i)aipi*(p+i)*(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p9数组名作函数参数v数组名作函数参数,是地址传递v数组名作函数参数,实参与形参的对应关系实参形参数组名指针变量数组名指针变量数组名数组名指针变量指针变量字符串与数组关系字符串用一维字符数组存放

39、字符数组具有一维数组的所有特点数组名是指向数组首地址的地址常量数组元素的引用方法可用指针法和下标法数组名作函数参数是地址传递等区别存储格式:字符串结束标志赋值方式与初始化输入输出方式:%s%ccharstr=Hello!;()charstr=Hello!;()charstr=H,e,l,l,o,!;()char*cp=Hello;()inta=1,2,3,4,5;()int*p=1,2,3,4,5;()charstr10,*cp;inta10,*p;str=Hello;()cp=Hello!;()a=1,2,3,4,5;()p=1,2,3,4,5;()scanf(“%s”,str);print

40、f(“%s”,str);gets(str);puts(str);二维数组和指针变量二维数组和指针变量指向数组元素的指针变量定义一个二维数组:inta23=1,2,3,4,5,6;二维数组元素在内存中是按行存放的,对于上面的定义我们可以认为a是数组名,数组包括2行即2个元素a0,a1。每个元素又是一维数组,包含3个元素aa0a1123456a02*(a0+2)*(*(a+0)+2)指向指针的指针指向指针的指针定义:指向指针的指针一级指针:指针变量中存放目标变量的地址p1&p2&i3P2(指针变量)i(整型变量)例int*p1;int*p2;inti=3;p2=&i;p1=&p2;*p1=5;v二

41、级指针:指针变量中存放一级指针变量的地址例int*p;inti=3;p=&i;*p=5;&i3P(指针变量)i(整型变量)一级指针单级间接寻址二级指针一级指针目标变量二级间接寻址定义形式:存储类型数据类型*指针名;如char*p;例inti,*p;p=&i;()/p是二级指针,不能用变量地址为其赋值指针本身的存储类型最终目标变量的数据类型*p是p间接指向对象的地址*p是p间接指向对象的值例inti=3;int*p1;int*p2;p1=&i;p2=&p1;*p=5;ip1p23&i&p1*p2,*p1*p2v多级指针例三级指针int*p;四级指针char*p;例用二级指针处理字符串void m

42、ain()char*p;char*name=Follow me,BASIC,Great Wall,FORTAN;int i;for(i=0;i4;i+)p=name+i;printf(%x%sn,*p,*p);name0name1name2name3name4char*name5GreatWallFORTAN0FollowmeBASICnamep指向函数的指针函数指针:函数在编译时被分配的入口地址,用函数名表示max.指令1指令2v函数指针变量赋值:如p=max;函数返回值的数据类型专门存放函数入口地址可指向返回值类型相同的不同函数指向函数的指针变量v定义形式:数据类型(*指针变量名)();如

43、int(*p)();函数指针变量指向的函数必须有函数说明v函数调用形式:c=max(a,b);c=(*p)(a,b);c=p(a,b);v对函数指针变量pn,p+,p-无意义()不能省int(*p)()与int*p()不同下列定义的含义(1)int*p3;(2)int(*p)3;(3)int*p(int);(4)int(*p)(int);(5)int*(*p)(int);(6)int(*p3)(int);(7)int*(*p3)(int);函数指针数组,函数返回int型指针指向函数的指针,函数返回int型变量指向函数的指针,函数返回int型指针函数指针数组,函数返回int型变量指针数组指向一维

44、数组的指针返回指针的函数1.若有若有说说明:明:int*p,m=5,n;以下正确的程序段是;以下正确的程序段是:Ap=&n;scanf(“%d”,&p);Bp=&n;scanf(“%d”,*p);Cscanf(“%d”,&n);*p=n;Dp=&n;*p=m;2.已知已知变变量定量定义义和函数和函数调调用用语语句:句:int a=25;print_value(&a);下面函数正确;下面函数正确输输出出结结果是果是:voidprint_value(int*x)printf(“%dn”,+*x);A23B24C25D26选择选择DD以下对a5元素的非法表示是:inta10,*p=a;A*(a+5)

45、Bp+5C*(p+5)Dp5B若已有定义:inta10;int*p;p=a;试说明*(p+)与*(+p)有什么区别?*(p+)是先取*p的值,后使p加1,对本例即先得到a0的值,然后p指针指向a1;*(+p)使先使p加1,后取*p的值,对本例即p指针指向a1,再得到a1的值。简答题简答题main()intx23=4,7,2,5,6,1;char*str=thank,right,good;char*p;inti,j;printf(%d,%dn,*x0,*(x1+2)/3);for(i=0;i2;i+)for(j=0;j3;j+)printf(%d,*(xi+j);p=str;printf(%c,%sn,*(*p+1),*(p+2);4,04,7,2,5,6,1 h,good求程序运行输出结果求程序运行输出结果#includemain()inta34=1,2,3,4,5,6,7,8,9,10,11,12;int(*p)4,i=2,j=1;p=a;printf(“%d,%d,”,*(*(p+i)+j),*(*(a+i)+j);printf(“%d,%dn”,*p,*(p+i);10,10,1,9求程序运行输出结果求程序运行输出结果此此课件下件下载可自行可自行编辑修改,修改,仅供参考!供参考!感感谢您的支持,我您的支持,我们努力做得更好!努力做得更好!谢谢!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 考试试题 > 语文专题

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁