c语言基础知识.docx
《c语言基础知识.docx》由会员分享,可在线阅读,更多相关《c语言基础知识.docx(23页珍藏版)》请在冰豆网上搜索。
c语言基础知识
C语言期末复习之基础知识篇
---杨士帅
一C语言概述
Ø程序:
一组计算机能够识别和执行的指令。
指令的有序的集合。
Ø计算机语言:
人和计算机交流信息,计算机和人都能识别的语言
ØC语言的注释:
//单行注释
/*……*/多行注释。
ØC语言的结构:
1.由一个或多个源程序文件组成。
2.函数是C程序的基本单位。
3.一个C程序至少含有一个main函数,也可以由一个main函数和若干个其他函数组成。
4.C的这些特点容易实现程序的模块化。
5.C程序总是从main函数开始执行,而且不论main函数的位置如何。
Ø每个语句和数据的定义后面必须有一个括号。
ØC语言本身没有输入输出函数,输入输出操作是库函数scanf和printf提供的。
二数据的类型和运算
(一)常量:
在程序运行的过程中,其值不能被改变。
1.整型常量:
1000.
2.实型常量:
0.34,12.34e3.
3.字符常量:
’a’,’\n’.
4.字符串常量:
“boy”。
5.符号常量:
#definePI3.1416
(二)变量:
在程序运行期间,变量的值是可以改变的。
1.变量必须先定义后使用。
2.刚定义尚未赋值的变量具有随机值。
3.定义变量要同时定义名字和类型。
4.变量名和变量值是两个不同的概念。
i.变量名实际是以这个名字代表一个内存地址。
ii.变量值就是该内存单元当前存储的值。
(三)标识符:
一个对象的名字。
1.只能由字母,数字和下划线三种字符组成,而且第一个字符必需为字母或下划线。
2.标识符的长度无限制,但不能以关键字作为标识符。
3.不合法的标识符:
M.D.John,#33,3D64,Include。
(四)数据类型:
就是对数据分配储存单元的安排,包括储存单元的长度以及数据的存储形式。
数据类型
宽度
Char
1B
Shortint
2B
Int
4B
Longint
4B
Float
4B
Double
8B
Longdouble
80B
整数的默认时signed,各整数类型均可加修饰符unsigned表示无符号整数类型,unsignedint可以简写成unsigned.
1.整型:
Ø一个十进制数是0到9的序列。
Ø十六进制应该加前缀0x。
如:
0xfa,0xAE03
Ø八进制应该加前缀0.如:
030.
Ø使用科学记数法,e/E的后面绝对不能在跟小数,且E/e的前面必须有值。
2.字符型:
Ø用单引号括起来的单个字符。
如:
’a’,’0’.实际上存储的是该数据的ASCII码。
所以也可以把他们看成是整型量,C语言容许对整型变量赋以字符型,也允许对字符变量赋以整形值。
3.转义字符:
转义字符
含义
\b
Backspace
\t
Tab
\n
换行
\r
回车
\”
双引号
\’
单引号
\\
反斜杠
4.字符串:
ØC语言中并没有字符串类型,用字符数组来处理字符串。
Ø字符串是由一对双引号括起来的字符数列。
Ø字符串常量和字符常量的区别:
Ø字符常量由单引号括起来,字符串常量由双引号括起来。
Ø字符常量只能是单个字符,字符串常量则可以是一个或多个字符。
Ø字符常量占一个字节的内存空间,字符串所占的内存空间常量等于字符串中的字符数加一。
增加的一个字节中存放字符‘\0’.
ØASCII为0,这是字符串结束的标志。
ØEx:
Ø‘a’在内存中占一个字节,“a”在内存中占2个字节。
5.符号常量:
Ø在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。
符号常量在使用之前必须先定义:
#define标识符常量名常量值
Ø#define是一条预处理命令,称为宏定义命令,其功能是把该标识符定义为其后的常量值。
习惯上常量的标识符用大写字母,而变量名用小写字母。
(五)运算符:
1.算术运算符:
Ø整数除法:
两个整数相除的结果为整数。
Ex:
5/3=1,舍去小数部分。
-5/3=-1,向零取整。
Ø浮点除法:
保证除数和被除数中至少有一个是浮点数。
Ex:
5/4.0=1.25.
Ø%模运算要求运算元为整数,结果也是整数。
Ex:
5%3=2.
ØC语言没有乘方运算,但pow函数可以实现乘方运算。
pow(x,y)x的y次方。
#include.
算数运算符的优先级与结合性:
先乘除后加减,从左至右。
Ø不同类型数据的混合运算:
类型的自动转换,编译系统会自动把各操作系统操纵数转化为操作数中最长的类型。
EX:
若int型与float或double型数据进行运算时,系统会自动把int与float型数据转化为double型,然后在进行运算,结果时double型。
2.自加自减运算符:
Øi++,i--:
在使用i之后将i的值加/减1.
Ø++I,--i:
在使用i之前,先将i的值加/减1.
3.强制类型转换:
(double)a将a转化为double类型。
短类型->长类型安全
长类型->短类型有可能会丢失数据。
4.运算符的优先级:
1,()、{}、[]、.、(结构体成员运算符)、->(指向结构体成员运算符)
2,单目运算符!
(非)、--(自减)、++(自加)、~(按位取反)、正号(+)、负号(-)
3,算术运算符*、%、/,+、-
4,关系运算符<、>、>=、<=,==、!
=
5,逻辑运算符&&和||
6,赋值运算符=
7,逗号运算符(表达式1),(表达式2),(表达式3)...
还有就是左右运算顺序
a+b+为双目运算符,(a>b)?
a:
b中?
:
为3目运算符.!
a为单目运算符.
单目,三目运算符都为自右向左结合,双目运算符除赋值运算符都为自左向右结合.
5.关系运算符:
>,<,>=,<=,==,!
=.用来比较两个操作数之间的关系,运算结果为1或0.
6.逻辑运算符:
!
,&&,||。
用来实现逻辑运算和逻辑判断。
用非0表示逻辑值的true,用0表示逻辑值的false。
7.条件运算符:
三目运算符:
表达式a?
表达式b:
表达式c
若表达式的值非0,则返回表达式b的值;若表达式的a的值为0,则返回表达式c的值。
8.逗号运算符:
用来将若干独立的表达式分隔并连接构成一个逗号表达式。
9.赋值运算符:
变量=表达式。
右结合性。
三输入输出函数
(一)控制台I/O:
程序与外界交流。
(二)C语言中所有的I/O都是由库函数完成的,要用#include将相关头文件包含在源文件当中。
使用标准输入输出函数时要用到stdio.h文件。
(三)格式输出函数:
printf(“格式控制字符串”,表达式列表)。
格式字符
意义
d,i
以带符号的十进制输出整数
o
以八进制形式输出无符号整数(不带前缀0)
X,x
以十六进制的无符号数输出整数(不带前缀0x)
u
以无符号的十进制形式输出整数
f
以小数的形式输出单,双精度实数,隐含6位小数
E,e
以指数的形式输出单,双精度实数
G,g
以%f或%e中较短的输出宽度输出单、双精度实数
c
输出单个字符
s
输出字符串
格式修饰符:
¡%-m.nlf,%-mld
字符
说明
l
用于输出长整形数据以及double型数据
m
数据显示的最小宽度
n
对实数,表示输出n位小数。
对字符串,表示截取的字符个数。
-
输出的数字或字符在显示宽度区域内左对齐。
Ø未指定输出宽度m,则按实际位数输出。
Ø未指定小数位数,默认6位。
Ø宽度计算中小数点要占一位。
Ø若数据实际宽度比制定宽度要小,默认右对齐,即左补空格。
有修饰符-,则左对齐,即右补空格。
Ø若数据的实际宽度比指定宽度大,则按实际宽度输出。
<4>格式输入函数:
用户用指定的格式从盘上把数据输入到指定的变量中。
scanf(“格式控制字符”,变量地址列表);
Ø在scanf语句的格式字符串中,如果没有非格式字符在“%d%d%d”之间做输入时的间隔,在输入时要用一个或一个以上的空格或回车或TAB键作为输入数据之间的间隔。
Øscanf函数中的格式控制后面应当是变量地址,而不是变量名。
Ø不能用格式控制来规定输入数据的精度。
¡:
scanf("%7.2f",&a);×
scanf("%f",&a);√
Ø如果输入在格式控制字符串中除了格式字符还有其它字符,那么在输入时这些字符将被作为间隔符,要输入相同的字符。
Øscanf(“a=%d,b=%d",&a,&b)a=12,b=34
在输入数据时遇到以下情况,则认为是一个数据输入的结束:
遇到空格键,回车键,tab键。
满足域宽,如%4d,输入4位结束。
遇到非法字符。
Ø在输入字符型数据时,若格式控制字符中没有非格式字符,则认为所有输入的字符均为有效字符。
¡如:
scanf("%c%c%c",&a,&b,&c);
●只有当输入为:
def时(即:
不能有间隔),才能把‘d’赋于a,‘e’赋予b,'f'赋予c。
四流程控制
(一)顺序:
Ø按语句的先后顺序依次执行。
Ø复合语句:
可用{}括起来的多个语句,构成一个复合语句。
在C语言中复合语句被认为是一条语句。
(二)分支:
if语句:
实现两个分支的选择结构。
最常用的3种if语句的形式:
1.if(表达式)语句1(没有else子句)
2.if(表达式)语句1
else语句2(有else子句)
3.if(表达式1)语句1
elseif(表达式2)语句2
elseif(表达式3)语句3
┆
elseif(表达式m)语句m
else语句m+1
IF嵌套:
在if语句中又包含一个或多个if语句称为if语句的嵌套。
else总是与它上面最近的为配对的if配对。
if()
if()语句1
else语句2
else
if()语句3
else语句4
Switch语句:
实现多分支的选择结构。
根据表达式的值,使流程跳转到不同的语句。
switch语句的一般格式:
switch(表达式)
{case常量1:
语句1
case常量2:
语句2
┇┇┇
case常量n:
语句n
default:
语句n+1
}
switch语句中表达式和常量可以是整形以及字符型。
任何两个case后面的常量不可有相同的值。
先计算表达式的值,在根据表达式的值转向不同的分支。
每个case分支的语句无需用{}括起来。
每个case分支都是入口点。
break语句时转移语句,即跳出switch,无break语句,将执行入口点之后的所有语句。
(三)循环:
ØWhile(表达式)语句
先判断循环条件表达式的值,若为真,则执行循环体;若为假则不执行循环体语句。
Ødo
循环体语句
whilie(表达式)
先无条件执行一次循环体,然后在判断循环条件是否成立。
ØFor(表达式1;表达式2;表达式3)
循环体语句。
表达式1:
为循环变量设置初始值。
表达式2:
判断是否继续循环。
表达式3:
修改循环变量的值。
循环嵌套:
一个循环体内又包含另一个完整的循环结构,称之为循环嵌套。
内层循环中还可以嵌套循环,这就是多层循环。
3种循环可以互相嵌套。
三种循环的比较:
Ø一般情况下,三种循环可以互相代替。
Ø循环中应包含使循环趋于结束的语句。
Ø用while和do…while循环变量操作应在while和do…while之前完成。
而for语句可以在表达式1中实现循环变量的初始化。
ØBreak:
从循环体中强行退出,结束整个循环。
ØContinue:
停止本次循环,直接开始下次循环。
五函数
使用角度来看函数包括库函数和用户自定义函数。
库函数:
由C系统提供,用户无须定义,也不必在程序中作类型说明,只需在程序中包含有该函数的头文件即可在程序中直接调用。
用户自定义函数:
用户按照需要自己编写的函数。
从函数形式来看:
函数分为无参数函数和有参数函数。
无参数函数:
无参数函数一般用来执行一组操作。
无参数函数可以带回或不带回函数值。
有参数函数:
在调用函数时,主调函数要通过参数向被调函数传递数据。
函数可以带回或者不带回函数值。
一般情况下,被调函数会返回一个函数值,供主函数使用。
一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。
对较大的程序,一般不希望将所有的内容都放在一个文件中,而是将它们分别放在若干个源文件当中,由若干个源文件组成一个C程序。
一个源程序文件由一个或多个函数及其他相关语句组成。
一个源程序文件是一个编译的单位,在程序进行编译是以源程序文件为单位进行编译的,而不死以函数为单位进行编译的。
C程序的执行是从main函数开始的,如果在main函数的执行过程中调用其他函数,调用函数结束后流程返回到main函数,main函数结束时整个程序运行结束。
所有函数都是平行和平等的,即在定义函数时是分别进行的,互相独立的,一个函数并不从属于另一个函数,即函数不能嵌套定义。
函数间可以互相调用,但不能调用main函数,main函数是被操作系统所调用。
定义函数:
C语言要求在程序中遇到的所有函数,必须先定义后使用。
函数的定义指明了函数名,函数返回值类型,函数实现的功能以及参数的个数与类型,将这些信息通知给编译系统。
函数定义格式:
类型名函数名(形式参数表列)
{
函数体
}
类型说明了函数返回值的类型,它可以是任何有效类型,如果省略,默认为int。
参数列表使用逗号分割变量表,各变量表由类型和变量名组成,参数列表可以为空,表示无参,但此括号不能省略,不管定义还是声明时,每个函数参数必须同时含有类型和参数名。
空函数:
{}中类容为空,调用函数,什么也不做,目的时方便以后对功能的扩充,而不会影响程序的结构。
函数的返回:
return表达式。
用途:
使得本函数立即退出,返回到调用语句的地方,返回一个值。
函数可以用两种方法停止运行并返回到调用它的地方:
执行到函数最后一个语句。
遇到return语句,函数的返回值是靠return
语句获得的。
如果不希望函数有返回值,将函数类型声明为void。
除了类型为void函数外,其他函数均有返回值,该值由return语句决定,如果没有return语句函数将返回一个不确定的值。
如果函数没有指明函数返回值的类型,默认为int。
当函数的返回值不是整型时,应该:
明确说明函数的类型。
函数声明位于第一次调用之前。
参数传递:
C语言中的函数调用传递参数是按值传送。
如果实参的修改通过形参带回主调函数,用指针。
用数组作为函数参数时,就把数组的地址传给了参数。
函数的作用域:
每个函数都是一个独立的代码块,一个函数的代码属于该函数专有。
一个代码块中定义的变量成为局部变量,局部变量随代码块的产生而产生,随代码块的退出而消亡。
函数的形参也是局部变量。
在任何一个函数之外定义的变量成为全局变量,可以被任何一个函数访问,修改。
在函数内部用存储类型符static说明变量不随函数的运行,退出而产生,消亡。
但仍然只能在函数内部访问它。
如果全局变量和局部变量同名,局部变量屏蔽全局变量。
函数的嵌套调用:
C语言容许在一个在一个函数的定义中出现对另一个函数的调用。
这样就出现了函数的嵌套调用。
即在被调函数中又调用其他函数。
六数组
数组是一组有序数据的集合,下标代表了数据在数组中的序号。
用数组名和下标唯一确定数组中的元素。
数组中每一个元素都必须属于同一个数据类型。
一维数组的定义:
类型数组名[常量表达式]
数组名的命名规则与变量命名规则相同,数组也必须先定义后使用。
数组类型实际上是数组元素的取值类型。
对于同一数组,其所有元素的数据类型都是相同的。
数组民是用户定义的标识符,不能与其他变量名相同。
定义数组时,方括号必须是一个常量表达式,表示数据的元素个数,也称为数组长度。
可以是符号常量或常量表达式,但不能时变量。
一维数组的使用:
使用数组就是使用他的元素。
数组的元素和普通变量一样,只不过是名字有些特殊。
数组元素的一般表示形式:
数组名[下标序号]
使用数组时,数组下标可以是常量,变量和表达式,从0开始。
一维数组的初始化:
Inta[10]={0,1,2,3,4,5,6,7,8,9};
可以只给部分元素赋值,当{}中元素少于元素个数时,系统自动给前面元素赋值,其余元素自动赋0。
Inta[10]={1,2,3,4,5};
只能给逐个元素赋值,而不能给数组整体赋值。
¡给十个元素全部赋3,只能写为:
inta[10]={3,3,3,3,3,3,3,3,3,3};
¡而不能写为:
inta[10]=3;
在定义数组时,若要给全部元素赋值,可以省略数组元素的长度。
¡如:
inta[5]={1,2,3,4,5};
¡可写为:
inta[]={1,2,3,4,5};
二维数组的定义:
类型变量名[常量表达式1][常量表达式2]
二位数组的使用:
数组名[下标1][下标2]
数组中元素顺序:
C语言中,二维数组是按行储存的。
●inta[3][4]
a[0][0]a[0][1]a[0][2]a[0][3]
a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]
二维数组的初始化:
Inta[5][3]=]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
如对全部元素赋值,行下表可以省略,但列下表不能省略。
inta[3][3]={1,2,3,4,5,6,7,8,9};
可以写为:
inta[][3]={1,2,3,4,5,6,7,8,9};
字符数组:
charc[10];
字符数组的初始化:
如果初始值小于数组长度,则将这些字符赋给数组中前面的那些元素,其余元素自动定位空字符。
字符’\0‘作为字符串的结束标志。
字符串处理函数:
输入字符串到字符数组。
scanf(”%s”,字符数组名);
gets(字符数组名);
●charst[20];gets(st);scanf(“%s”,st);
把字符数组中存放的字符串输出:
¡printf(“%s”,字符数组名)
¡puts(字符数组名)
●charst[20]=”China”;puts(st);printf(“%s”,st);
#include
stract(字符串1,字符串2)
把字符串2链接到字符串1后面。
Strcpy(字符串1,字符串2)
把字符串2的内容拷贝的字符串1(覆盖)
strcmp(字符串1,字符串2)
按照ASCII码顺序比较两个字符串,返回比较结果。
字符串1=字符串2,返回值=0;
字符串1>字符串2,返回值>0;
字符串1<字符串2,返回值<0;
Strlen(字符串)
返回字符串中包含的字符个数(不包括结束标志‘\0’)
Strlwr(字符串)将大写字母转化成小写字母。
strupr(字符串)将小写字母转换成大写字母。
‘A’~’Z’:
41H-50H
‘a’~’z’:
61H-70H
七结构体
定义结构体的类型:
struct结构体名
{
成员列表=类型名+变量名;
};
结构体可以嵌套引用,即一个结构体的定义中可以引用其他结构体类型。
structDate
{intmonth;intday;intyear;};
structStu
{intnum;charname[20];
charsex;intage;
structDatebirthday;
charaddr[30];
};
结构体类型与结构体变量是不同的概念,相当于变量类型和变量。
只能对变量赋值,存取或运算,而不能对一个类型赋值,存取或运算。
在编译时,对类型是不分配空间的,只对变量分配空间。
定义结构体类型的变量:
1.先声明结构体类型,再定义该类型变量
structstudent
{
intnum;charname[20];
charsex;intage;
floatscore;charaddr[30];
};
structstudentstu1,stu2;
2.在声明类型的同时定义变量
structStudent
{intnum;
charname[20];
charsex;
intage;
floatscore;
charaddr[30];
}student1,student2;
3.不指定类型名而直接定义结构体类型变量
●其格式为:
struct
{
成员表列
}变量名表列;
结构体变量的初始化:
Structdate
{
Intmonth;
Intday;
Intyear;
};
Structdatebirthday={10,22,83};
使用结构体变量:
只能通过成员运算符引用结构体变量的各个成员,一般不能对结构体变量整体使用。
¡结构体变量名.成员名
¡如:
stu1.numbirthday.year
如果成员本身又是一个结构体类型,则要用若干个成员运算符,一级一级找到最低一级的成员。
¡如:
stu2.birthday.day
对结构体变量的成员可以像普通变量一样进行各种运算。
stu1.num++;
类型定义在前,不分配内存,变量定义后,给变量分配一段连续的内存单元。
结构体成员名可与程序中的其他变量同名,二者占不同的内存单元互不干扰。
结构体数组:
就是数组中的每一个元素都是一个结构体类型的变量。
structPerson
{
charname[20];
intnum;
}teacher[3]={“Li”,1,“Zhang”,2,“Sun”,3};
指向结构体变量的指针:
指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。
指向结构图变量的指针,其类型必须与结构体变量类型相同。
structStudent*p;
为了使用方便和直观,C语言允许把(*p).num用p->num来代替。
结构体变量做函数参数:
用结构体变量的成员作参数:
例如,用stu[1].num或stu[2].name作函数实参,将实参值传给形参
用结构体变量做参数:
用结构体变量做实参时,将结构体变量所占的内存单元的内容全部按顺序传给形参,形参也必须是同类型的结构体变量。
用指向结构体变量:
指针做实参,将结构体变量的地址传给形参。
八指针
内存单元的地址称之为指针。
变量A中存放变量B的地址,称A是B的指针,即A指向B.
定义指针变量:
Type*name