关闭

关闭

关闭

封号提示

内容

首页 C语言复习(下).ppt

C语言复习(下).ppt

C语言复习(下).ppt

上传者: 773051289 2012-07-24 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《C语言复习(下)ppt》,可适用于考试题库领域,主题内容包含第章数组第章数组北京科技大学计算机系C语言程序设计第章数组第章数组一个人N门课的成绩怎样存储和处理?一个班N门课的成绩怎样存储和处理?这些数据的特点符等。

第章数组第章数组北京科技大学计算机系C语言程序设计第章数组第章数组一个人N门课的成绩怎样存储和处理?一个班N门课的成绩怎样存储和处理?这些数据的特点:具有相同的数据类型。为了方便地使用这些数据C语言提供了一种构造数据类型:数组。例如:存储学生成绩用实型数组score其中:score是数组名。该数组可以存放个成绩分别用下标变量表示:score,score,…score。下标变量也称为数组元素。一维数组一维数组例如:intafloatscore“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“常量表达式”:表示数组中有多少个元素即数组的长度。它可以是整型常量、整型常量表达式或符号常量。一维数组的定义数据类型数组名常量表达式数组在内存的存放数组在内存的存放数组下标从开始。一维数组的数组元素在内存里按顺序存放。数组名代表数组的首地址即score的值与score的地址值相同。score数组数组元素的引用数组元素的引用格式:例如:输入学生成绩for(i=i<i)scanf("f",scorei)例如:fibn=fibnfibn下标表达式的值必须是整型表达式。数组名下标表达式一维数组的初始化一维数组的初始化初始化:在定义数组时给数组元素赋初值。.在定义数组时对全部数组元素赋初值例如:inta={,,,,}此时可以省略数组长度例如:inta={,,,,}.在定义数组时对部分数组元素赋初值例如:inta={,,}系统为其余元素赋。.当初值的个数多于数组元素的个数时编译出错例如:inta={,,,,,}二维数组二维数组数据类型数组名[常量表达式][常量表达式]例如:floatx二维数组的定义inta,,b(,),c,d()()地址值数组元素二维数组元素在内存中的排列顺序:按行存放x是数组名是元素x的地址x是数组名是元素x的地址二维数组可看作是一种特殊的一维数组xx,x,xxx,x,x例如可以把x数组看作是包含二个元素的一维数组每个元素又是一个含有三个元素一维数组。二维数组元素的引用二维数组元素的引用a=*下标越界*a,=*应写成a=*例:intaa=a=a数组名[行下标表达式][列下标表达式]数组元素的表示形式:二维数组的初始化二维数组的初始化例:inta={,,,,,}.按行赋初值例:inta={{,,},{,,}}初始化后结果:.按数组元素在内存中排列的顺序对各元素赋初值.给部分元素赋初值例:inta={{},{}}初始化后结果:二维数组的初始化(续)二维数组的初始化(续).数组初始化时行长度可省列长度不能省例如:inta={,,,,,,}intb={{},{,}}初始化结果:a结果:a:a:a:b结果:b:b:字符数组与字符串字符数组与字符串字符数组:可以存放若干个字符,也可以存放字符串。基本概念字符串:字符串的末尾必须有’’字符它的ASCII码值为。不是字符串是字符串字符数组的定义字符数组的定义例如:charss数组是一维字符数组它可以存放个字符或一个长度不大于的字符串。再例如:charaa数组是一个二维的字符数组可以存放个字符或个长度不大于的字符串。注意:字符串只能存放在字符数组中。字符数组的初始化字符数组的初始化.用字符常量赋初值例如:charc={'C','h','i','n','a'}再例如:charc={'C','h','i','n','a',''}是字符串不是字符串字符数组的初始化(续)字符数组的初始化(续)再例如:chara={"basic","pascal","c"}.用字符串常量赋初值例如:charstr={"astring"}或charstr="astring"是字符串吗?字符数组的初始化(续)字符数组的初始化(续)例如:chars={'s','t','r','i','n','g'}.初始化时长度的省略例如:chars="Goodmorning!"bb例如:chars={'s','t','r','i','n','g'}思考:哪个数组存放的是字符串?字符数组的引用字符数组的引用.对字符数组元素的引用可以为数组元素赋值也可以输入输出元素的值。.对字符数组的整体引用.对字符数组的整体引用输出字符串例如:charc="China"printf("s",c)输出结果为:ChinaC是数组首地址输出时遇''为止再例如:charc="pascalbasic"printf("s",c)输出结果为:pascal.对字符数组的整体引用(续).对字符数组的整体引用(续)输入字符串例如:charcscanf("s",c)输入:beijing三个字符串用空格隔开分别赋给str、str、str三个数组。再例如:charstr,str,strscanf("sss",str,str,str)输入:pascalbasicc注意:不可以为数组整体赋值例如:charcc="beijing"因为c是数组首地址是常量!字符串处理函数字符串处理函数说明:程序中如果调用下面介绍的个字符串处理函数在程序的开始应该写:#include"stdioh"或#include"stringh"预处理命令但在TurboC中可以省略。在字符串处理函数中凡是用数组名或字符串首地址作参数的地方都可以用指针变量作参数。指针变量的概念在第章介绍。.字符串输出函数puts().字符串输出函数puts()调用格式:puts(str)功能:输出一个字符串输出后自动换行。说明:str可以是字符数组名或字符串常量。例如:charstr="China"charstr="Beijing"puts(str)puts(str)输出结果:ChinaBeijing.字符串输入函数gets().字符串输入函数gets()调用格式:gets(str)功能:从键盘读入一个字符串存入str数组中并且得到一个函数值该函数值是str数组的首地址。说明:str是数组名。程序运行情况如下:HowareyouFinethankyouHowareyouFinethankyou例如:main(){charc,cgets(c)gets(c)puts(c)puts(c)}.字符串连接函数strcat().字符串连接函数strcat()调用格式:strcat(str,str)功能:把str中的字符串连接到str字符串的后面结果放在str数组中函数值是str的值。必须足够大输出结果:beijingandshanghai例如:charstr="beijingand"charstr="shanghai"printf("s",strcat(str,str)).字符串复制函数strcpy().字符串复制函数strcpy()调用格式:strcpy(str,str)功能:将str中的字符串复制到str数组中。s必须足够大思考:这样赋值s="Beijing"或s=s可以吗?为什么?s的结果例如:chars,s="Beijing"strcpy(s,s)或:strcpy(s,"Beijing").字符串比较函数strcmp().字符串比较函数strcmp()调用格式:strcmp(str,str)strstrstrstrstrstrstrcmp(str,str)==strcmp(str,str)>strcmp(str,str)<.求字符串长度函数strlen().求字符串长度函数strlen()调用格式:strlen(str)功能:测试字符串长度。函数值就是str中字符的个数。思考:字符串"China"和str数组在内存中各占几个字节?输出结果:例如:charstr="China"printf("d",strlen(str))或printf("d",strlen("China")).大写字母转换成小写字母函数strlwr().大写字母转换成小写字母函数strlwr()调用格式:strlwr(str)功能:将str字符串中的大写字母转换成小写字母。输出结果:microsoftword输出结果:abcd例如:charstr="MICROSOFTWORD"strlwr(str)puts(str)例如:printf("s",strlwr("AbCd")).小写字母转换成大写字母函数strupr().小写字母转换成大写字母函数strupr()调用格式:strupr(str)功能:将str字符串中的小写字母转换成大写字母。输出结果:PASCAL例如:charch="pascal"printf("s",strupr(ch))概述概述程序结构清晰可读性好。减少重复编码的工作量。可多人共同编制一个大程序缩短程序设计周期提高程序设计和调试的效率。使用函数的好处一个C源程序可以由一个或多个源程序文件组成。C编译系统在对C源程序进行编译时是以文件为单位进行的。一个C源程序文件可以由一个或多个函数组成。所有函数都是独立的。主函数可以调用其它函数其它函数可以相互调用。在一个C程序中有且仅有一个主函数main。C程序的执行总是从main函数开始调用其它函数后最终回到main函数在main函数中结束整个程序的运行。说明函数的种类函数的种类从函数定义形式分:有参函数:在主调(用)函数和被调(用)函数之间通过参数进行数据传递如:intcube(intx){…}无参函数:如:getchar()在调用无参函数时主调函数不需要将数据传递给无参函数。从使用的角度看:标准函数(库函数)库函数是由系统提供的。如:getchar()、sin(x)等。在程序中可以直接调用它们。附录A列出了C的部分库函数。用户自定义函数。如:例中的cube函数。函数的定义函数的定义函数定义的一般形式函数类型函数名(类型名形式参数…){说明语句执行语句}例如:求两个数的最大值。intmax(intx,inty){intzz=x>yx:yreturn(z)}类型省略时默认为int类型intmax(x,y)intx,y{intzz=x>yx:yreturn(z)}intmax(x,y){intx,y……}或intmax(intx,y){……}或intmax(x,y)intx,y,z{z=x>yx:yreturn(z)}花括号中也可以为空这种函数叫空函数。不能在函数体内定义其他函数即函数不能嵌套定义。形参也可以这样定义函数名(实参表列)在C语言中把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用。例如:welcome()if(iabs(a)>max)max=iabs(a)m=max(c,max(a,b))函数的调用函数调用的一般形式:函数参数与函数的返回值函数参数与函数的返回值voidswap(intx,inty){intzz=xx=yy=zprintf("nx=d,y=d",x,y)}main(){inta=,b=swap(a,b)printf("na=d,b=dn",a,b)}.函数的形式参数与实际参数程序输出结果:x=,y=a=,b=形式参数(形参)实际参数(实参)【例】编一程序将主函数中的两个变量的值传递给swap函数中的两个形参交换两个形参的值。单向值传递有关形参和实参的说明:有关形参和实参的说明:当函数被调用时才给形参分配内存单元。调用结束所占内存被释放。实参可以是常量、变量或表达式但要求它们有确定的值。实参与形参类型要一致字符型与整型可以兼容。实参与形参的个数必须相等。在函数调用时实参的值赋给与之相对应的形参。“单向值传递”。注意:在TC中实参的求值顺序是从右到左。函数的类型与函数的返回值函数的类型与函数的返回值max(intx,inty){intzz=x>yx:yreturn(z)*返回z的值*}main(){inta,b,cscanf("d,d",a,b)c=max(a,b)printf("maxisdn",c)}说明:函数的类型决定了函数返回值的类型。若省略函数的类型系统默认其为int型。无返回值的函数应将其类型定义为void(空)类型。函数的类型【例】输出两个数中的大数。函数的返回值是通过return语句带回到主调函数的函数的返回值是通过return语句带回到主调函数的功能:终止函数的运行返回主调函数若有返回值将返回值带回主调函数。说明:若函数没有返回值return语句可以省略。return语句中的表达式类型一般应和函数的类型一致如果不一致系统自动将表达式类型转换为函数类型。函数的返回值return语句格式:return(表达式)或return表达式或return对被调函数的声明和函数原型变量要先定义后使用函数也如此。即被调函数的定义要出现在主调函数的定义之前。如swap函数:允许整型函数(且参数也是整型)的定义出现在主调函数之后。如max函数:如果非整型函数在主调函数之后定义则应在主调函数中或主调函数之前对被调函数进行声明。voidswap(intx,inty){…}main(){…swap(a,b)}main(){…c=max(a,b)}max(intx,inty){…}对被调函数进行声明的一般形式对被调函数进行声明的一般形式函数类型函数名(参数类型参数名…)或函数类型函数名(参数类型参数类型…)思考:以下哪种情况需要在主调函数中对被调函数声明被调函数定义在前主调函数定义在后。主调函数定义在前被调函数定义在后且被调函数的类型不是整型的。被调函数定义在后但被调函数的类型是整型。第二种形式省略了参数名此种形式也称为函数的原型。函数的嵌套调用和递归调用函数的嵌套调用和递归调用函数的嵌套调用main函数{……调用函数A……}函数A{……调用函数B……}函数B{………………}函数的递归调用函数的递归调用直接调用sub函数本身.递归的基本概念递归调用:一个函数直接或间接地调用了它本身就称为函数的递归调用。递归函数:在函数体内调用该函数本身。intsub(intx){inty,z……if(……)z=sub(y)else{……}return}例如:局部变量和全局变量及其作用域局部变量和全局变量及其作用域变量的作用域局部变量及其作用域变量的作用域:变量在程序中可以被使用的范围。根据变量的作用域可以将变量分为局部变量和全局变量。局部变量(内部变量):在函数内或复合语句内定义的变量以及形参。作用域:函数内或复合语句内。【例】分析下面程序的运行结果及变量的作用域。问题:一个变量在程序的哪个函数中都能使用吗?全局变量及其作用域全局变量及其作用域全局变量(外部变量):在函数外部定义的变量。作用域:从定义变量的位置开始到本源文件结束。如在其作用域内的函数或分程序中定义了同名局部变量则在局部变量的作用域内同名全局变量暂时不起作用。【例】全局变量和局部变量的作用域。变量的存储类别及变量的生存期变量的存储类别及变量的生存期变量的生存期与变量的存储分类变量的生存期:变量在内存中占据存储空间的时间。思考:何时为变量分配内存单元?将变量分配在内存的什么区域?变量占据内存的时间(生存期)?动态存储变量静态存储变量变量的存储类别变量的存储类别变量的属性数据类型:决定为变量分配内存单元的长度数据的存放形式数的范围。存储类别:决定了变量的生存期给它分配在哪个存储区。变量定义语句的一般形式变量定义语句的一般形式存储类别数据类型变量名,…,变量名nauto(自动的)register(寄存器的)static(静态的)extern(外部的).自动变量(auto类别)局部变量可以定义为自动变量。内存分配调用函数或执行分程序时在动态存储区为其分配存储单元函数或分程序执行结束所占内存空间即刻释放。变量的初值定义变量时若没赋初值变量的初值不确定如果赋初值则每次函数被调用时执行一次赋值操作。生存期在函数或分程序执行期间。作用域自动变量所在的函数内或分程序内。自动变量.静态变量(static类别).静态变量(static类别)除形参外局部变量和全局变量都可以定义为静态变量。内存分配编译时将其分配在内存的静态存储区中程序运行结束释放该单元。静态变量的初值若定义时未赋初值在编译时系统自动赋初值为若定义时赋初值则仅在编译时赋初值一次程序运行后不再给变量赋初值。生存期整个程序的执行期间。作用域局部静态变量的作用域是它所在的函数或分程序。全局静态变量的作用域是从定义处开始到本源文件结束。静态变量外部变量(extern类别)外部变量(extern类别)在函数外定义的变量若没有用static说明则是外部变量。外部变量只能隐式定义为extern类别不能显式定义。intcstaticintamain(){floatx,y…}charsf(){staticintb=……}内存分配编译时将其分配在静态存储区程序运行结束释放该单元。变量的初值若定义变量时未赋初值在编译时系统自动赋初值为。生存期整个程序的执行期间。作用域从定义处开始到本源文件结束。此外还可以用extern进行声明以使其作用域扩大到该程序的其它文件中。外部变量问题:全局静态变量的作用域可以扩展到本程序的其它文件吗?外部变量声明的一般格式外部变量声明的一般格式extern数据类型变量名…变量名n或extern变量名…变量名n注意:外部变量声明用关键字extern而外部变量的定义不能用extern只能隐式定义。定义外部变量时系统要给变量分配存储空间而对外部变量声明时系统不分配存储空间只是让编译系统知道该变量是一个已经定义过的外部变量与函数声明的作用类似。寄存器变量(register类别)寄存器变量(register类别)只有函数内定义的变量或形参可以定义为寄存器变量。寄存器变量的值保存在CPU的寄存器中。受寄存器长度的限制寄存器变量只能是char、int和指针类型的变量。【例】寄存器变量的使用。main(){longintsum=registerintifor(i=i<=i)sum=iprintf("sum=ldn",sum)}程序输出结果:sum=归纳变量的分类归纳变量的分类.按照变量的作用域对变量分类局部变量全局变量.按照变量的生存期对变量分类静态存储变量包括:局部静态变量和全局静态变量动态存储变量包括:自动变量编译预处理包括:宏定义文件包含条件编译源文件*c运行文件*exe编译编译编译目标文件*obj连接编译连接连接编译预处理编译预处理(续)编译预处理(续)#define宏名字符串宏定义的功能:在进行编译前用字符串原样替换程序中的宏名。这个替换过程称为“宏替换”或“宏展开”字符串也称为替换文本。命令的一般格式:不带参数的宏定义编译预处理(续)编译预处理(续)为了增加程序的可读性建议宏名用大写字母其他的标识符用小写字母。双引号中有与宏名相同的字符串不进行替换。已经定义的宏名可以被后定义的宏名引用。在预处理时将层层进行替换。说明:宏定义的作用域是从定义处开始到源文件结束但根据需要可用undef命令终止其作用域。形式为:#undef宏名编译预处理(续)编译预处理(续)命令的一般形式带参数的宏定义#define宏名(形参表)字符串功能:在编译预处理时把源程序中所有带参数的宏名用宏定义中的字符串替换并且用宏名后圆括号中的实参替换字符串中的形参。例如:#defineMAX(X,Y)((X)>(Y)(X):(Y))编译预处理(续)编译预处理(续)1.命令的一般形式格式:#include<文件名>格式:#include"文件名"文件包含  文件包含是将指定的某个源文件的内容全部包含到当前文件中。用include命令实现。 用格式预处理程序仅在TCINCLUDE目录下查找指定文件。 用格式预处理程序首先在当前目录中查找指定文件若找不到再到TCINCLUDE目录中查找。编译预处理(续)编译预处理(续)例如:调用sin(x)函数时要在程序的开头使用如下命令:#include<mathh>在预处理时用mathh文件内容替换#include<mathh>命令行。.功能  在预处理时将include命令后指定文件的内容替换该命令行。指针和指针变量指针和指针变量main(){floatxinty…}指针和指针变量的概念变量的两个物理意义变量的内容变量的地址指针和指针变量指针和指针变量main(){inta,b,ca=b=c=ab…}指针和指针变量的概念abc利用变量名存取数据的方式称为“直接存取”方式。指针和指针变量指针和指针变量C语言还提供了对内存单元的“间接存取”方式a和b相加的结果(*p=ab)存放到变量p所指向的内存单元中去。此时c称为指针变量p的目标变量。p=cmain(){inta=,b=,c,*pp=c*p=ab…}指针和指针变量的概念变量的地址称为变量的指针存放地址的变量称为指针变量指针和指针变量指针和指针变量main(){inta,*p=afloatx,*q=x…}指针变量的定义指针变量初始化指针和指针变量指针和指针变量main(){inta,*p=afloatx,*q=x*p=printf("a=dn",*p)…}间接存取运算指针的基本运算*p=a指针和指针变量指针和指针变量指针的加减运算指针的基本运算main(){inta={,,,,},*p,*pp=p=aprintf(″p=u,*p=dn″,p,*p)p=printf(″p=u,*p=dn″,p,*p)}P=,*p=指针加减运算要点:只有当指针变量指向数组时指针的加减运算才有意义。指针变量可加减一个整型表达式。如:p、p、p、p。指针的加减运算是以基类型为单位(即sizeof(类型))的。两个指针变量不能作加法运算只有当两个指针变量指向同一数组时进行指针变量相减才有实际意义。如:pp。指针和指针变量指针和指针变量指针的关系运算指针的基本运算指向同一数组的两个指针可以进行关系运算表明它们所指向元素的相互位置关系。如:p>p、p==p。指针与一个整型数据进行比较是没有意义的。不同类型指针变量之间比较是非法的。可以与任何类型指针进行==、!=的关系运算用于判断指针是否为空指针。指针与数组指针与数组数组名是该数组的指针a是数组的首地址(即a的地址)是一个指针常量。a=a,a=a,…,a=a数组元素的下标表示法:a,a,…,ai,…,a数组元素的指针表示法:*(a),*(a),…,*(ai),…,*(a)指向数组的指针一维数组的指针例如:inta,*p指针与数组指针与数组当p指向a时用p表示数组元素下标法:p,p,…,pi,…,p指针法:*(p),*(p),…,*(pi),…,*(p)指向数组的指针一维数组的指针指向一维数组元素的指针变量由于数组元素也是一个内存变量所以此类指针变量的定义和使用与指向变量的指针变量相同。例如:inta,*pp=a(或p=a)a指针与数组指针与数组数组名是地址指向数组的指针变量存放的也是地址。通过指针变量也可以引用数组元素。p=a等效于p=a。数组名和指向数组的指针变量的区别:指针变量p是变量可以赋值,数组名a是地址常量不能赋值。指向数组的指针用指针变量引用数组元素必须关注其当前值。例如:p=p*(p)、p等价于a指针与数组指针与数组二维数组的地址例如:inta二维数组名a是数组的首地址。二维数组a包含三个行元素:a、a、a。三个行元素的地址分别是:a、a、a。而a、a、a也是地址量是一维数组名即*(a)、*(a)、*(a)是一维数组首个元素地址。指向数组的指针二维数组的指针指针与数组指针与数组二维数组元素的地址a、a、a是一维数组名所以aij是数组元素的地址。数组元素aij的地址可以表示为下列形式:aij、aij、*(ai)j指向数组的指针二维数组的指针指针与数组指针与数组二维数组元素的表示法数组元素可用下列形式表示:aij、*(aij)、*(*(ai)j)指向数组的指针二维数组的指针a是二维数组根据C的地址计算方法a经过两次*操作才能访问到数组元素。所以*a是a**a才是a。a是a的地址,*a是a。指针与数组指针与数组指向二维数组元素的指针变量指向数组的指针二维数组的指针【例】用指向数组元素的指针变量输出数组元素。main(){inta={{,,,},{,,,},{,,,}},i,j,*pfor(p=a,i=i<i){for(j=j<j)printf("d",*(pi*j))*元素的相对位置为i*j*printf("n")}}这种指针变量的定义及使用与指向一维数组元素的指针变量是相同的用它存放二维数组元素的地址。指针与数组指针与数组指向一维数组的指针变量指向一维数组指针变量的定义形式:数据类型标识符(*变量名)元素个数指向数组的指针二维数组的指针“*”表示其后的变量名为指针类型[元素个数]表示目标变量是一维数组并说明一维数组元素的个数。由于“*”比“[]”的运算级别低“*变量名”作为一个说明部分两边必须加括号。“数据类型标识符”是定义一维数组元素的类型。指针与数组指针与数组【例】通过初始化使指针指向一个字符串。main(){charstr="Goodmorning!"char*str="Goodnight!"printf("sn",str)printf("sn",str)}指向字符串的指针变量指向字符串的指针变量的定义及初始化字符串的两种表示方式:字符数组表示方式字符串存放在一维数组中引用时用数组名。字符指针变量表示方式字符指针变量存放字符串的首地址引用时用指针变量名。Goodmorning!Goodnight!指针与数组指针与数组【例】通过赋值运算使字符指针变量指向一个字符串。#include<stringh>main(){charc,*strstrcpy(c,"Howareyou")str="Fine,thanks"printf("snsn",c,str)}指向字符串的指针变量字符串的赋值运算将一个字符串赋给一个字符数组只能使用strcpy函数将字符串常量的首地址赋给指针变量可使用赋值运算符“=”HowareyouFine,thanks指针与数组指针与数组【例】利用指针变量输入输出字符串。#include<stdioh>main(){charc,*strstr=cgets(str)puts(str)}指向字符串的指针变量字符串的输入输出使用字符串输入输出函数gets和puts在scanf和printf函数中使用s格式实现。输入字符串时函数参数:数组名、存有数组名的指针变量输出字符串时函数参数:数组名、存有字符串首地址的指针变量。IloveChina!IloveChina!指针与数组指针与数组指针数组定义的一般形式:数据类型标识符*数组名[元素个数]在这个定义中由于“[]”比“*”的优先级高所以数组名先与“[元素个数]”结合形成数组的定义形式“*”表示数组中每个元素是指针类型“数据类型标识符”说明指针的目标变量的数据类型。例如:int*ipchar*cp指针数组指针数组的定义指针数组就是数组中的每个元素均为指针类型指针与数组指针与数组例如:charc={"Fortran","COBOL","BASIC","Pascal"}char*cp={c,c,c,c}char*str={"int","long","char","float","double"}intaint*p={a,a}指针数组指针数组初始化例如:charc={"Fortran","COBOL","BASIC","Pascal"}char*cp={c,c,c,c}char*str={"int","long","char","float","double"}intaint*p={a,a}指针与数组指针与数组二级指针变量定义的一般形式:数据类型标识符**指针变量名其中“**指针变量名”相当于*(*指针变量名)在括号中定义了一个指针变量括号外的“*”说明指针变量(即二级指针)的目标变量是一个指针类型数据“数据类型标识符”是目标变量(即一级指针)所指向的数据的类型也就是最终目标变量的类型。例如:inta,*p,**pp多级指针二级指针变量的定义如果一个指针的目标变量是一个指针类型变量则此指针为指向指针的指针变量也称为多级指针变量。指针与数组指针与数组例如:inta,*p=a,**pp=p多级指针二级指针变量初始化、*p、**pp、*pp指针与函数指针与函数【例】输入个整数按从小到大顺序输出。voidswap(int*x,int*x){inttt=*x*x=*x*x=treturn}voidmain(){inta,b,cscanf("ddd",a,b,c)if(a>b)swap(a,b)if(a>c)swap(a,c)if(b>c)swap(b,c)printf("d,d,dn",a,b,c)}指针变量作函数参数变量的指针作函数参数,,主调函数与被调函数之间数据传递的方法:实参与形参之间的数据传递被调函数通过return语句把函数值返回到主调函数通过全局变量交换数据利用指针型参数在主调函数和被调函数之间传递数据。形参x和x得到main函数中a和b的地址这样x和x的目标变量就是main函数的变量a和b。在swap函数中交换*x和*x的内容就是交换a和b的内容所以当函数调用结束后尽管x和x已经释放但操作结果仍保留在main函数的变量a和b中这就是通过指针形参指向域扩展到主调函数的方法达到主调函数与被调函数间交换多个数据的目的。指针与函数指针与函数一维数组的指针作函数参数例如被调函数abc的定义形式有以下三种:voidabc(intb){……}voidabc(intb){……}voidabc(int*b){……}在主调函数有如下定义:inta,*p=a则调用abc函数时可用abc(a)或abc(p)指针变量作函数参数数组的指针作函数参数当函数之间需要传递数组时可以通过传递数组的首地址(即通过指针参数指向域的扩展)完成存取主调函数中数组元素的操作。指针与函数指针与函数main(intargc,char*argv){……}带参数的主函数带参数的主函数的定义main函数只能有两个形参并且这两个形参的类型也是固定的。第一个形参必须是整型变量第二个形参可以定义为字符型指针数组也可以定义为二级字符指针变量因此也可以写成main(intargc,char**argv)指针与函数指针与函数带参数的主函数调用形式:可执行文件名参数参数……参数n在DOS系统提示符下键入的这一行字符称为命令行。可执行文件名称为命令名其后的参数称为命令行参数命令名与各参数之间用空格进行分隔。带参数的主函数带参数的主函数的调用要调用带参数的主函数必须在操作系统环境下进行。假设C语言源程序文件filec经过编译、连接生成一个可执行文件fileexe。在DOS系统提示符后键入可执行文件名file即可执行该程序。指针与函数指针与函数argc称作参数计数器它的值是包括命令名在内的参数个数。argv指针数组的作用是存放命令行中命令名和每个参数字符串的首地址。C:>fileonetwothree带参数的主函数主函数参数的作用指针与函数指针与函数指针型函数定义的一般形式:数据类型标识符*函数名(形式参数表){……}其中函数名前的“*”表示函数的返回值是一个指针类型“数据类型标识符”是指针所指向的目标变量的类型。指针型函数指针型函数的定义如果一个函数的返回值是指针则称此函数为指针型函数。指针与函数指针与函数函数指针变量定义的一般形式:数据类型标识符(*函数指针变量名)()其中“*函数指针变量名”必须用圆括号括起来否则就成为声明一个指针型函数了。在定义中“(*函数指针变量名)”右侧的括号“()”表示指针变量所指向的目标是一个函数“数据类型标识符”是定义指针变量所指向的函数的类型。例如:int(*p)()*p是一个指向整型函数的指针变量*float(*q)()*q是一个指向单精度实型函数的指针变量*指向函数的指针函数指针变量的定义在C语言中函数名具有与数组名类似的特性数组名代表数组的首地址函数名代表函数的起始地址(即该函数的程序代码段在内存中所占用的存储空间的首地址也称函数入口)。因此也可以把函数名赋给一个函数指针变量使其成为指向该函数的指针变量。函数名则可以看成是函数指针常量。指针与函数指针与函数用函数指针变量调用函数的一般形式:(*函数指针变量名)(实参表)由于优先级不同“*函数指针变量名”必须用圆括号括起来表示间接调用指针变量所指向的函数右侧括号中为传递到被调函数的实参。指向函数的指针用函数指针变量调用函数函数指针与变量指针的共同之处是都可以做间接访问。变量指针指向内存的数据存储区通过间接存取运算访问目标变量函数指针指向内存的程序代码存储区通过间接存取运算使程序流程转移到指针所指向的函数入口取出函数的机器指令并执行函数完成函数的调用。结构体结构体一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。如何描述这些类型不同的相关数据?结构体与结构体类型的定义信息管理结构体一种构造类型数据结构体由若干不同类型的数据项组成构成结构体的各个数据项称为结构体成员。结构体结构体struct结构体名{数据类型成员名数据类型成员名……数据类型n成员名n}结构体与结构体类型的定义结构体类型定义的一般形式:struct为关键字结构体名是用户定义的类型标识。{}中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。结构体结构体利用已定义的结构体类型名定义变量struct结构体名变量名表例如:structbookcardbookstructstudents,t,t结构体变量的定义与初始化结构体类型变量的定义按照结构体类型的组成系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存中占用连续存储区域结构体变量所占内存大小为结构体中每个成员所占用内存的长度之和。结构体结构体类型与变量是不同的概念。应先定义一个结构体类型而后再定义结构体变量。系统对类型不分配空间仅对变量分配空间。只能对变量赋值、存取或运算而不能对一个类型赋值、存取或运算。结构体类型与变量的说明成员也可以是结构变量。对结构中的成员可以单独使用它的作用与地位相当于普通变量。成员名可与程序中的变量名相同时也可与不同结构体类型的成员名相同二者代表不同的对象。structdate{intyear,month,day}structstudent{charnumcharnamecharsexstructdatebirthday*成员为结构体类型*charaddrintscore}结构体结构体在定义结构体类型的同时定义变量结构体变量的定义与初始化结构体类型变量的定义例如:structstudent{charnum,name,sexintagefloatscore}ststruct结构体名{成员定义表}变量名表结构体结构体直接定义结构体类型变量结构体变量的定义与初始化结构体类型变量的定义例如:struct{

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/143
2下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部