火龙果C语言重难点精选_第1页
火龙果C语言重难点精选_第2页
火龙果C语言重难点精选_第3页
火龙果C语言重难点精选_第4页
火龙果C语言重难点精选_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

C语言精华作者:刘丽英print函数1.格式字符(1)u格式%u为unsigned型数据以十进制整形输出(2)d格式%d为整形输出%md.其中m为指定的字段的宽度,如果数据的位数小于m,则左端补以空格,如果数据的位数大于m则按实际输出eg:printf("%4d,%4d",a,b);若a=123,b=12345,则输出结果为_123,12345同理有%mld,%mo(八进制输出),%mx(十六进制输出),%mc(3)s格式%s用来输出一个字符串

%ms%-ms如果字符串小于m,则在m列范围内,字符串向左靠,右补空格

%m.ns输出占有m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格%-m.ns输出占有m列,但只取字符串中左端n个字符。这n个字符输出在m列的左侧,右补空格。若n>m则m自动取n值,即保证n个字符正常输出(4)f格式%m.nf一共占m列,其中有n为小数。如果数值长度小于m则左端补空格。%-m.nf基本同上,只是输出数值向左端靠齐,右端补空格(5)e格式以指数形式输出实数%e数字部分的小数位为6位,指数部分占5位(如e+002),数值按规范化指数形式输出(即小数点前必须有而且只有1位非零数字)。例如:printf("%e",123.456);输出结果为1.234560e+002所输出实数共占13列(不同系统的规定略有不同)%m.ne与%-m.ne中的m,n,"-"与前面的相同。此时的n指的是拟输出的数据的小数部分(又称尾数)的小数位数若f=123.456,则printf("%e--%10e--%10.2e--%.2e--%-10.2e",f,f,f,f,f);输出结果如下1.234560e+002--1.234560e+002---1.23e+002--1.23e+002--1.23e+002-

13列13列10列9列10列条件表达式条件表达式,C中唯一的一个三目表达式

表达式1?表达式2:表达式3例1if(a>b)优先级别比关系运算符和算术运算符都低max=a;a>b?a:b+1;<==>a>b?a:(b+1);<=\=>(a>b?a:b)+1;else<===>max=(a>b)?a:b;<===>max=a>b?a:b;max=b;结合方向自右至左表达式2和3不仅可以是数值表达式,还可以是赋值表达式或函数表达式;表达式1,2,3的类型可以都不同。eg2:a>b?(a=100):(b=123);a>b?printf("%d",a):printf("%d",b);x?'a':'b';x>y?1:1.5;数据类型浮点小数1.指数形式:包含整数部分、字母E或e和阶数。如2.48E23。注意尾数部分不能省、阶码必须是整数2.十进制小数:包含整数部分、小数点和小数部分。其中小数点不能省。文字数据的表示1.单个字符:单个字符的表现形式是由单引号括起来的一个字符,如'A'。其中单引号、双引号、反斜杠的表现形式比较特殊,分别是'\'','\"','\\'。数据类型转换1.强制类型转换(类型)表达式强制类型装换最主要的用途一是满足一些运算对类型的要求,例如求余运“%”要求运算符两侧的数据类型为整型,(int)2.5%3二是防止丢失整数除法中的小数部分。break语句的的作用:1.用于switch语句中,从中推出switch语句。2.用于循环语句中,从循环体内直接退出循环。注意:对于嵌套的循环语句和switch语句,break语句的执行只能退出直接包含break的那层结构函数C语言的函数可以分为三类:主函数main()、库函数(如,printf()scanf())、和用户自定义函数自定义的函数类型

函数类型与return语句的返回值类型相同,当函数类型缺省时默认为整形,如果函数无返回值用void。函数体可以为空。return(表达式);表达式可为一个变量、常量、表达式,函数类型决定返回值类型函数的调用

实参与形参之间是“单向的值传递”实参可以是常量、变量表达式或函数。函数递归调用直接或间接地调用函数自身为函数递归调用。

递归调用必须可以满足一定条件时结束调用,否则无限的递归调用将导致程序无法结束。数组一、一维数组1.一维数组的定义数组类型的所有元素都是同一种类型按顺序存放在一个连续的存储空间中,下表从0开始顺序编号。数组元素的个数是一个固定值,可以是整型常量、符号常量或者整型常量表达式。定义数组时,系统将按照数组类型和个数数组元素,分配一段连续的存储空间存储,绝对不能使用变量或者变量表达式来表示元素的个数,大多数情况下不要省略元素的个数(形参和数组初始化时除外)。2。一位数组的引用C语言规定只能逐个引用数组元素,而不能一次引用整个数组.C语言不检查边界,所以当超越边界是系统将不会提示错误,但运行时可能导致其他变量甚至程序被破坏。数组元素的使用方法与同类型的变量使用方法相同,可以参加各种运算,常用于循环语句来处理二、多维数组1.多(以二维为例)维数组的定义类型标示符数组名[元素个数1][元素个数2]...[元素个数N];二维数组中元素的存放顺序是按行存放的;多维数组的存储顺序为:最左边的下标变化最慢,越往右边变化越快。三、数组作为函数参数数组中的元素和数组名都可以作函数参数,但效果不一样。2.一维数组元素作为函数参数一维数组中元素作为函数实参,与同类型的简单变量作为实参一样是单向的值传递,即数组元素的值传给形参,形参的改变不影响作为数组元素的实参,3数组名作为函数参数

此时形参和实参都是数组名(或者是表示地址的指针变量,见第十讲),传递的是整个数组(数组的起始地址),即形参数组和实参数组完全等同,是存放在同一空间的同一个数组。这样形参数组修改时是参数组也同时被改变了。形参中的数组要定义,并且要求与实参数组类型一致,但是形参数组的大小(即元素个数)可以小于等于实参数组的个数,甚至可以省略,而有一个专门的形参传递元素个数。

变量类别与编译预处理一、全局变量与局部变量C语言根据变量的作用域不同,将变量分为局部变量和全局变量局部变量:在函数内部定义的变量,它只在定义它的函数内部有效。全局变量:在所有函数的外部定义的变量,作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享。全局变量主要用于函数之间数据的传递。具体应用在两方面:一是函数可以将结果保存在全局变量中,这样函数得到多个执行结果,而不局限于一个返回值;二是由于函数可以直接使用全局变量的数据,从而减少了函数调用时的参数。

用extern、static声明的全局变量:

如果组成这一个程序的几个文件需要用到同一个全局变量,只要在其他引用该全局变量的源程序文件中说明该全局变量为extern即可。反之,如果希望一个源程序文件中的全局变量仅限于该文件使用,只要在该全局变量定义时的类型说明前加一个static。二、自动变量、静态变量和寄存器变量C语言根据变量的存储空间的不同,可以分为寄存器变量、静态变量、和自动变量。自动变量:动态变量的存储空间为内存中的动态数据区。自动变量的类型修饰符auto放在变量的类型说明之前。但auto一般不写的。在函数体内或者复合语句内定义的局部变量只要不专门说明是static存储类型都属于自动变量,采用动态存储方式。特点是当程序和执行到自动变量的作用域时,才为自动变量分配存储空间,并且定义自动变量的函数执行结束后,程序将释放自动变量的空间,留给其他自动变量使用。静态变量:静态变量的存储空间为内存的静态数据区,该区域中的数据在整个程序的运行期间一直占用这些存储空间,知道整个程序运行结束。所有的全局变量都是静态变量,而局部变量只有加上类型修饰符static,才为局部静态变量。

静态变量的特点是在程序的整个执行过程中始终存在,但在它作用域之外不能使用,即静态变量的生存期就是整个运行期。在选择使用静态变量还是动态变量时,可以考虑以下两点:一是如果需要在两次函数调用之间保持上一次函数调用结果,可以使用局部静态变量;二是如果在每次掉用函数时都必须对局部变量初始化,选择自动变量。但是实际上局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部变量。寄存器变量:为提高运算速度,C语言允许将一些频繁使用的局部变量定义为寄存器变量,这样程序尽可能地为它分配寄存器存放,而不用内存。三、宏定义

C语言提供的预处理命令主要有:宏定义、文件包含和条件编译。其中宏定义分为带参数的宏定义和不带参数的宏定义。1.不带参数的宏定义

#define标识符字符串

它的作用是在编译预处理时,将源程序中所有的标识符替换成字符串

注意:(1)宏名一般用大写字母,以便与变量名区分

(2)宏名的有效范围是从定义为止到文件结束,如果需要终止宏定义的作用域,可以用#undef命令

(3)宏定义时可以引用已经定义的宏名(4)对程序中用双引号括起来的字符串内的字符,不进行宏的替换操作。2.带参数的宏定义

#define标识符(参数表)字符串

它的作用是在编译预处理时,将源程序中所有标识符替换成字符串,并且将字符串中的参数用实际参数替换。注意:(1)在宏定义时,宏名和参数之间不能有空格(2)一般在宏定义时,字符串中的形式参数外面加一个小括号。指针(一)10.1地址和指针计算机内存是以字节为单位的存储空间。内存的每一个字节都有一个唯一的编码,这个编码就称为地址。凡是放在内存中的程序和数据都有一个地址。当C程序中定义一个变量时,系统就分配一个带有唯一地址的存储单元来存储这个变量。例如,若有下面的变量定义:chara='A';intb=88;longc=89;系统经根据变量的类型分别为a、b、c分配1个、2个、4个字节的存储单元,此时变量所占存储单元的第一个字节的地址就是变量的地址。程序对变量的读取操作(即变量的引用),实际上是对变量所在空间写入或取出数据。通过变量名直接引用变量,成为“直接引用”方式,这种引用方式是由系统自动完成变量名与其存储地址之间的转换。此外,C语言中还有另一种称为“间接引用”的方式。他首先将变量的地址存放在一个变量(存放地址的变量称为指针)中,然后通过三、指针变量作为函数参数

在C语言中,函数参数可以是指针类型。当指针变量作函数参数,其作用是将一个变量的地址传送到另一个函数中。此时形参从实参获得了变量的地址,即形参和实参指向同一个变量,当形参指向的变量发生变化时,实参所知的变量也随之变化。10.3指针与一维数组一、指向数组元素的指针变量1.定义与赋值这种定义方式与指向变量的指针的定义相同。例如:inta[5],*p;/*指针变量可以p可以指向任意的整型变量p=&a[0];因此也可以指向数组a的任意元素*/表示p指向数组的第一个元素a[0]。因为数组名代表数组的地址,也是第一个数组的地址。因此上面的赋值语句p=&a[0];<=>p=a;指向数组元素的值也可以在定义时赋初值。2.引用如有以下的定义和赋值:inta[5],*p;p=&a[1];即指针变量p指向数组元素a[1],则可以通过指针运算符“*”来对数组元素进行引用。例如:*p=10;表示对p所指向的数组元素a[1]赋值,上式等价于a[1]=10;引用一个数组元素可以有两种方法:(1)下标法,如a[i]。(2)指针法,如*(p+i)。二、数组名作函数参数存放变量地址的指针变量来引用变量。一个变量的地址称为该变量的指针。用来存放一个变量地址的变量称为指针变量。当指针变量p的值为某变量的地址时,可以说指针变量p指向该变量10.2指向变量的指针变量一、指针变量和其他变量一样要先定义在使用,定义形式为:类型名*指针变量名;例如:int*p;float*q;char*t;类型名表示指针变量所指向的变量的类型,而且只能指向这种类型的变量。指针变量也允许在定义是进行初始化。二、指针变量的引用指针变量的两个运算符:(1)&取地址运算符(2)*指针运算符例如:&a表示变量a的地址,*p表示指针变量p指向的变量。关于指针的引用有两点需要注意:(1)指针变量是用来存放地址的,不要给指针变量赋常数值。(2)指针变量没有指向确定地址前,不要对他所指的对象赋值。

在函数调用时,是把实参数组的首地址传递给形参数组,这样形参数组的元素发生变化时实参数组的元素也发生了变化。如果我们令一个指针变量指向数组的第一个元素,或者等于数组名,此时数组名和指针变量的含义相同,都表示数组的首地址。所以实参和形参使用数组名时可以用指针变量替换。

以下列出实参和形参使用数组名或指针变量的四种情况:

实参:数组名数组名指针变量指针变量形参:数组名指针变量数组名指针变量三、指向数组元素的指针变量作函数参数虽然数组名与指向数组首地址的指针变量都可以作为函数参数,但是由于指针变量不仅可以指向数组的首地址,也可以指向数组中任意一个元素,所以指向数组元素的指针变量作函数参数的作用范围远远大于数组名作函数参数。10.4指针与字符串一、指向字符串的指针变量C语言中,字符串是通过一维字符数组来存储的。因此,可以使用指向字符数组的指针变量来实现字符串操作。由于字符串是按照字符数组的形式存储的,所以对字符串中字符的引用也可以用下标法或指针法。二、字符串作函数参数将字符串作函数参数传递,可以使用字符数组名或指向字符串的指针变量做参数。与上一节数组名作函数参数类似,实参和形参的对应情况也有四种。实参:数组名数组名指针变量指针变量形参:数组名指针变量数组名指针变量指针(二)11.1返回指针的函数定义的一般形式为:

类型名*函数名(参数表);11.2指向函数的指针一、定义的一般形式为:

类型名(*指针变量)();二、指向函数的指针的引用C语言规定函数名就是函数的入口地址。所以当指向函数的指针等于函数名时,表示该指针变量指向函数。此时可以通过指向函数的指针变量调用该函数。即一般调用函数的形式是

函数名(实参表)改为指向函数的指针变量调用函数时,调用形式变为

(*指针变量名)(实参表)

指向函数的指针变量在使用时要注意:由于这类指针变量等于一个函数的入口地址,所以它们做加减运算是没有意义的。11.3指针数组指针数组的定义的一般形式:

类型名*数组名[常量表达式];指针数组的主要用于管理同种类型的指针,其中最常用于处理若干个字符串(如二维字符串)的操作。11.4指针与多维数组

不带任何下标的二维数组名表示二维数组的起始地址,对其进行加法操作时则表示作为其元素的一个一维数组(即二维数组一行)的起始地址。只带一维下标的二维数组名表示作为其元素的的一个一维数组(即二维数组一行)的起始地址,对其进行加法操作时表示该一维数组(即二维数组一行)的一个元素的地址。一、指向二维数组元素的指针变量在C语言中指针即是地址,如果指针变量等于只带一维下标的二维数组名,他的定义、赋值、引用与指向一维数组元素的指针变量形式相同,例如inta[2][3],*p;p=a[0];此时p指向一维数组a[0]的起始地址,即p,a[0],&a[0][0]相同对其进行加法操作时p+1等同于a[0]+1,都指向数组元素a[0][1]。所以*(p+1)等于元素a[0][1]的值。指向二维数组中一维数组的指针变量C语言规定一种指针变量,如果该指针指向不带任何下标的二维数组名,指针变量指向作为二维数组元素的一个一维数组(即二维数组的一行),这样对指针变量进行加减操作则指针将在二维数组的行上移动。这种指针变量的定义形式如下:类型符(*指针变量名)[指向的一维数组元素的个数]那么对于一个2行3列组成的二维数组a[2][3],如果指针变量p指向这个二维数组中包含3个元素的一行一维数组则指针变量p的定义形式和赋值形式如下:inta[2][3],(*p)[3];p=a;此时p指向二维数组a的起始地址。对其进行加法操作p+1等同于a+1,指向包含3个元素的一维数组a[1]。所以*(p+1)等于一维数组名a[1]+1,所以*(*(p+1)+1)等于a[1][1]。指向数组的指针变量在使用时,要注意与元素是指针类型的指针数组的区别。例如:int(*q)[3],*p[3];q是指向一个包含3个整形元素的一维数组的指针变量,p是一个由p[0],p[1],p[2]共3个指向整形数据的指针组成的一维数组。结构体、共用体和枚举类型结构体类型12.1一、结构体的定义形式:struct结构体{类型名1成员名1;类型名2成员名2;......类型名n成员名n;};其中struct是关键字,是结构体类型的标志。定义结构体类型的变量有三种方法:1.先定义结构体类型在定义变量。2.定义类型的同时定义变量。3.直接定义结构体类型变量,省略类型名。二、结构体变量初始化将结构体变量个成员的初值顺序地放在一对大括号中,并用逗号分隔,对结构体类型变量赋初值时,按每一个成员在结构体中的顺序一一对应赋值。三、结构体变量引用对结构体变量的引用可以分为对结构体变量中成员的引用和对整个结构体的引用。一般对结构的变量的操作是以成员为单位进行的。(1)对结构体变量中成员的引用引用的一般形式为:结构体变量.成员名“.”是成员运算符,他在所有运算符中优先级最高。(2)对整个结构体变量的引用相同类型的结构体变量之间可以进行整体赋值。注意:结构体变量只允许整体赋值其它操作如输入、输出等必须通过引用结构体变量的成员进行相应的操作。

12.2结构体数组一、结构体数组定义定义结构体数组的方法和定义结构变量的方法一样,只是必须说明其为数组。定义结构体变量的三种方法都可以用来定义结构体数组。二、结构体数组的初始化和一般数组一样结构体数组也可以进行初始化。数组每个元素的初值都放在一对大括号中,括号中依次排列元素个成员的初始值。三、结构体数组的引用对结构体数组的引用一般是对数组元素的成员进行引用。引用只要遵循对数组元素的引用规则和对结构体变量成员的引用规则即可。#include<stdio.h>#include<string.h>structperson{ charname[20]; intcount;}leader[3]={"li",0,"zhang",0,"wang",0};voidmain(){ inti,j; charname[20]; for(j=0;j<=5;j++) { scanf("%s\n",name[j]); for(i=0;i<3;i++) {

if(strcmp(name,leader[i].name)==0) { leader[i].count++; } } }

for(i=0;i<3;i++) printf("%s:%d\n",leader[i].name,leader[i].count);}指向结构体数组的指针#include<stdio.h>structstudent{ intnum; charname[20]; charsex; intage;};structstudentxinke[3]={01,"吴衡",'M',19,02,"邱利鹤",'M',18,03,"曹晓",'M',19};voidmain(){ structstudent*p; p=xinke; inti; printf("NUMNAMESEXAGE\n"); for(i=0;i<3;i++) { printf("%-8d%-5s%9c%9d\n",p->num,p->name,p->sex,p->age); p++; }}结构体变量和指向结构体变量的指针作函数参数#include<stdio.h>#include<string.h>#defineFORMAT"%d\n%s\n%f\n%f\n%f\n"structstudent{ intnum; charname[20]; floatscore[3];};voidmain(){ voidprint(structstudentstu); structstudentxinke; xinke.num=04;

strcpy(,"fuguoqing");不能用[20]="fuguoqing";

xinke.score[0]=88; xinke.score[1]=89;不能用xinke[3]={88,89,95}; xinke.score[2]=95; print(xinke);}voidprint(structstudentstu){ printf(FORMAT,stu.num,,stu.score[0],stu.score[1],stu.score[2]);}#include<stdio.h>#include<string.h>#defineFORMAT"%d\n%s\n%f\n%f\n%f\n"structstudent{ intnum; charname[20]; floatscore[3];}xinke={04,"fuguoqing",88,89,95};voidmain(){ voidprint(structstudent*stu);

structstudent*p; p=&xinke; print(p);或则直接为print(&xinke);}voidprint(structstudent*stu){ printf(FORMAT,(*stu).num,(*stu).name,(*stu).score[0],(*stu).score[1],(*stu).score[2]);}共用体12.3一、共用体类型及其变量的定义

union共用体名{类型名1成员名1;类型名2成员名2;......类型名n成员名n;};其中,union是关键字,是共用体的类型标志。共用体类型变量的定义也有三种方法:1.先定义共用体类型,在定义变量。2.定义类型的同时定义变量。

3.直接定义共用体类型变量。二、共用体变量的引用共用体类型变量也必须先定义在使用。不能直接引用结构体变量本身,只能引用结构体变量成员。引用的一般形式为:共用体变量名.成员名共用体变量的每一个成员也可以像普通变量一样进行其类型允许的各种操作。但要注意:由于共用体类型采用的是覆盖技术,因此共用体变量中起作用的总是最后一次存放的成员变量的值。共用体变量可以作为结构体变量的成员,结构体变量也可以作为共用体变量的成员,并且共用体类型也可以定义数组。注意:不能对共用体变量进行初始化。不能将共用体变量作为函数参数和返回值枚举类型12.5一、枚举类型及其变量的定义enmu枚举名{枚举元素1,枚举元素2,......};其中,enum是关键字,是枚举类型的标志。例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};枚举类型变量的定义有两种方法:1.先定义枚举类型,在定义变量。enumweekdayworkday,week-end;2.直接定义枚举变量。enumweekday{sun,mon,tue,wed,thu,fri,sat}workday,week-end;workday和week-end被定义为枚举变量,它们的值只能是sun到sat之一。

说明:(1)在C编程中,将枚举元素作为常量处理,所以称为枚举常量。因此不能对他们赋值。例如:sun=0;mon=1;是错误的(2)枚举元素是被处理成一个整型常量的,他的值取决于定义时各枚举元素排列的先后顺序。第一个枚举元素的值为0,第二个为1,,依次顺序加1。如果有赋值语句:workday=mon;workday的值为1.这个整数的值是可以输出的。例如:printf("%d",wokeday);将输出1.二、枚举变量的基本操作1.枚举变量赋值只能给枚举变量赋枚举常量。不能直接给枚举变量赋整型值,但可以通过将整型值强制转换成枚举形赋值。workday=(enumweekday)2;它相当于吧顺序号为2的枚举元素赋值给workday,相当于wokday=tue;2.枚举元素的判断比较枚举元素可以用来做判断比较。例如:

if(workday==mon)...if(workdau>sun)...3.枚举变量只能通过赋值语句得到值,不能通过输入语句直接输入数据。也不能使用输出语句直接输出枚举元素,可以通过switch语句将枚举元素以字符串形式输出应用举例:口袋中有红,黄,蓝,白,黑5种颜色的球若干个,以此从口袋

温馨提示

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

评论

0/150

提交评论