专升本C语言知识点
2022-01-12 16:03:58 0 举报
C语言知识点
作者其他创作
大纲/内容
计算机语言
什么是计算机语言
计算机语言,也称为计算机编程语言,是人类按照一定的语法规则,通过编写一系列的语句以达到控制和管理计算机进行工作的一种编程工具
计算机语言类型
低级语言
机器语言
特点:用0,1表示,计算机能直接识别和执行
缺点:难学、写、记等,编程效率低
优点:执行速度最快(执行效率最快)
汇编语言
特点:用符号或数学表达式代替机器指令是一种符号化语言。计算机不能直接识别与执行,需要进过汇编和链接才能形成执行文件
高级语言
分类
面向过程的语言 如C语言、Pascal语言等
面向对象的语言 如vc、java、c#、vb等
高级语言特点:接近于人们的自然语言和数学语言,编程效率高,执行效率低
C语言简介
C语言程序结构
1个C语言程序通常有若干个函数构成
main函数是整个程序开始执行的入口,所以一个C程序有且只有一个main函数
C语言函数由函数头和函数体两部分组成
main()也称为函数首部
{变量说明:
语句:}
main()也称为函数首部
{变量说明:
语句:}
函数体包括变量定义和语句部分
由“/*”与“/*”之间的内容是程序的注释
语句必须以分号(;)做结束标志
{和}是每一个函数体的开始与结束标志
初学者编程的一般步骤
#include “stdio.sh”
main()
{变量说明(不需要省略)
数据初始化 (提供运算所需的数据)
数据处理(根据需要做必要的数据运算)
输出结果(实现目的)}
main()
{变量说明(不需要省略)
数据初始化 (提供运算所需的数据)
数据处理(根据需要做必要的数据运算)
输出结果(实现目的)}
语言特点
语言功能强大
简介、明快
结构化语言
执行效率高
本身是高级语言,但又能够直接访问机器硬件,具有某些低级语言的特征,所以又被称为过渡性语言或中间语言
在高级语言中,C语言的执行效率最高
编译预处理命令
宏
定义
计算机科学里的宏是根据一系列预定义的规则替换一段文本的模式
宏定义的一般格式为:#include 标识符 字符串
宏的作用是把标识符定义为字符串(宏体)。
在编程时,凡是需要编写字符串的地方,都可以直接写上宏;在编译预处理时,编译系统会把程序
中出现的标识符,先用字符串去替换,然后在对处理后的源程序进行编译
中出现的标识符,先用字符串去替换,然后在对处理后的源程序进行编译
把宏名置换为宏体的过程,叫做宏展开
宏的分类
无参宏
直接用宏名(不带参数)来代替一个字符串
例如#define PF printf
#define PI 3.1415926
#define PI 3.1415926
注意:无参宏也被称为符号常量。如果程序中有语句:x=2*PI*10;经过预处理后,该语句被展开成:x=2*3.1415926*10;然后系统在对其进行编译
带参宏
定义时带有参数,在对宏名替换时,还要对参数进行替换
定义格式为:#define 宏名(参数表) 字符串
例如#define F(a,b) a+b 这里的a和b就是参数
如有语句:x=y*F(2,10);则经过预处理后,该语句被展开成:x=y*2+10;然后在编译
文件包含命令
在C语言中,允许编程者吧原先已有的源程序文件,通过“文件包含”的命令方式,
把它引入带本程序中,这样再以后的编程过程中,可以直接引用该源程序文件中已经定义的对象,以后实现代码重用,提高编程效率。是一种非常重要的编程手段
把它引入带本程序中,这样再以后的编程过程中,可以直接引用该源程序文件中已经定义的对象,以后实现代码重用,提高编程效率。是一种非常重要的编程手段
格式:#include “文件名” 或 #include <文件名> 或 #include “stdio.h”
数据类型
概念
在任何计算机语言中,都要引入数据类型的概念,对某一门计算机语言而言,
所具有的数据类型越丰富,表明改语言描述数据的能力越强
所具有的数据类型越丰富,表明改语言描述数据的能力越强
数据类型
基本类型
整型
实型(浮点型)
单精度实型
双精度实型
字符型
枚举型
构造类型
数组类型
结构体类型
共用体类型
指针类型
空类型
数据类型的意义
规定数据存储器中占用几个单元的存储空间存储
规定数据能进行何种运算
运算量
常量
值常量
整形常量
十进制整数:即生活中常用的正数的表示形式
八进制整数:在整数前面加一个0来表示八进制数,但只能用0~7来计数
十六进制整数:在整数前面加0x或0X加以表示。
实型常量
实型常量就是实数,也称浮点数,他只用十进制表示
小数形式:即日常表示形式。
指数形式:如-317000000000,用指数形式表示可表示成-3.17e11
字符常量
字符常量就是用一对单引号引起的单个字符。如'a','A'等,都是字符常量,但“a”不是字符常量,而是一个字符串
字符常量以ASCII码的形式存储,占用一个字节单元
转义字符
用反斜杠\开头,后面跟一个或若干个特定的字符。
转义字符只是一个特定的表现形式,它在存储的普通字符一样。都占一个字节存储,存储的当然也是该字符的ASCII码
分类
\a 报警响铃
\b 回退符backspace
\t 水平制表tab
\n 回车换行
\v 垂直制表
\f 走纸换页
\r 回车
\' 单引号字符
\" 双引号字符
\\ 反斜杠字符
\ddd 1~3位八进制数所表示的字符
\xhh 1~2位十六进制所表示的字符
文件路径通常以“C:\tc\file1.c”形式表示,但在C语言中,由于\专门用于表示转义字符,所以规定用\\来表示\字符
注意:在c中。字符常量和其他对应的ASCII码通用
符号常量
符号常量就是用一个符号来代替一个值常量。符号常量非常类似于生活中用π这个符号来表示圆周率,物理中用g来表示重力加速度
在使用符号常量之前,务必先进行定义
定义符号常量。和定义无参宏的形式一样,只是在定义符号常量是,该符号用来代替一个常量
格式#define PI 3.14 或#define PF printf
变量
变量就是指在程序执行过程中,其值可以发生改变的量。
变量是编程中最常使用的运算量,在使用之前,必须先定义,然后在使用。
格式:类型名 变量名1,变量名2,... ,变量名n;
每一个变量都必须有唯一的名字,变量名称是与系统为之分配的存储空间向对应的一个符号名称,是用户直接访问(使用)内存的一种手段,用户正是通过变量名实现对内存的访问
变量命名要求
变量中只允许出现字母、数字及下划线3种字符
首字符只能是字母字符或者是下划线符号
变量名不能与保留字完全相同
尽量在前8个字符内能够相互区分
尽量按照“知名见意”的方式命名
说明:保留字是C语言系统中已经定义了的,具有专门的作用和特定功能的符号,是C系统中内定的术语,类似于生活中的专有名词,这些专有名词只能在特定场合使用,不能随便使用
注意:在同一程序块中,每个变量都有唯一的名字,不能被重复定义。先定义,后使用
变量的类型
整型变量
整型变量,就是用来存放正数的变量。
在使用变量时,一定要注意的是否溢出。所谓溢出,就是数据范围太大,
超过了变量所能存储的数据范围。一旦溢出,程序结果就出错
超过了变量所能存储的数据范围。一旦溢出,程序结果就出错
unsigned为“无符号化”的意思,系统总是把这种类型变量的值,
认可为是大于等于0的整数,即认为是无符号整数
认可为是大于等于0的整数,即认为是无符号整数
整型变量的类型
short 2B 范围[-2^15,2^15-1]
int 2B 范围[-2^15,2^15-1]
long 2B 范围[-2^31,2^31-1]
unsigned short 2B 范围[0,2^16-1]
unsigned int 2B 范围[0,2^16-1]
unsigned long 2B 范围[0,2^16-1]
实型变量
实型变量就是用来存放实数的变量
类型
float 单精度实型 4B 6~7位 6位 [10^-38,10^38]
double 双精度实型 4B 16~16位 6位 [10^-308,10^308]
字符型变量
字符型变量用来存放字符常量,一个字符常量变量只能存放一个字符常量,占1个字节
定义形式
char ch1,ch2;
ch1='A';ch2='\101'; 这两条语句都能讲字符'A'赋值给ch1和ch2
注意:字符串和字符常量是截然不同的两种类型的数据,不能混用。
不能把字符串赋值给字符常量
不能把字符串赋值给字符常量
变量定义时初始化
在定义变量时同时给该变量赋初始值,称为定义变量时初始化
例如:int m=3,n=5;等价于:int m,n;m=3;n=5
函数
和数学一样,在C语言中,返回值的函数也可以作为运算量参与表达式的运算。
比如函数sqrt(x)用来求x的平方根,函数fabs(x)用来求x的绝对值,函数exp(x)用来求e的x次方等,
这些函数都可以作为表达式中的一个运算量参与运算
这些函数都可以作为表达式中的一个运算量参与运算
注意:使用这些函数之前,需要写上#include “math.h”的文件包含命令
运算符
定义
在做加、减、乘、除运算时,都需要两个运算量(操作数)参与运算,这样的运算符叫做二元运算符,也叫双目运算符,
如果在一个表达式中,只有一个运算量参与运算,把这种只需要一个运算量参加运算的运算符称为单目运算符
如果在一个表达式中,只有一个运算量参与运算,把这种只需要一个运算量参加运算的运算符称为单目运算符
分类
算术运算符
基本的算术运算符
+:算术加运算,如x+1
-:包括双目减和单目减,如x-2,-x
*:乘法运算符,注意5*x不能写成5x或5点x
/:除法运算符,如5/2,x/y等
%:求余运算和求模运算符
运算符的结合性
当几个运算符的优先级平级,根据运算符优先级的高低已不能确定表达式的运算次序,这时需要根据运算符的结合性来决定运算的先后次序。运算的结合性是指同级运算符运算时的结合方向
C语言中只有少数运算符的结合性是右结合性。在学习这些运算符时都会特别强调;而大多数运算符的结合性都是左结合性,这和日常的运算习惯没什么区别,所以在学习的时候,往往省略不提
自增自减运算符
自增(++)和自减(--)运算符的结合性,就是右结合性,他们是特殊的算术运算符
这两个运算符因使用便捷,在编程中经常用到,所以是非常重要的运算符
这两种运算符只能与整形(含long、short和char)变量结合组成表达式
说明
自增自减运算只能对变量进行,但不能对表达式左这种运算。
自增自减运算符都是单目运算符,其优先级为第二级,结合性为右结合性
所有的单目运算符优先级和结合性都与自增自减匀运算符相同。该类运算符的优先级比乘、除和求余高,但低于括弧优先级
C语言函数参数的求值顺序是从右往左进行的。当函数的多个参数之间存在联系时,这点务必要注意
C语言程序的执行有时非常出乎意料,需根据需要执行环境的不同加以区分对待
关系运算符
关系运算符用来实现同类型的两个运算量间的比较操作。用关系运算符连接起来的式子称为关系表达式,其值为逻辑值,即逻辑真或逻辑假
C语言中没有逻辑类型,而是用1表示逻辑真,用0表示逻辑假
关系运算符共有6个,分别是:>,>=,<,<= 它们的优先级均为第6级:==,!= 它们的优先级均为第7级
逻辑运算符
逻辑运算符包括逻辑与(&&),逻辑或(||)和逻辑非(!)共三种运算符。其中逻辑非!是单目运算符,优先级第2 级,他求一个表达式逻辑值的相反值
在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符
赋值运算符
赋值表达式
格式:变量=表达式
求值规则:将“=”右边的表达式的值赋给左边的变量
赋值表达式的值:就是左边被赋值变量所获得的值
结合性:从左至右
复合赋值运算符
符号:*=, /=, %=, +=, -=, <<=, >>=, &=, ^=
复合运算符时一个运算符,但功能上,是两个运算符功能的组合
逗号运算符
形式:表达式1,表达式2,...,表达式n
规则:从左至右依次计算各表达式的值
优先级:最低
结合性:左结合性
逗号表达式的值,就是最后一个表达式的值
求字节数运算符
形式:sizeof 变量名 或 sizeof(类型名)
功能:求得变量或某种数据类型所需的字节数
运算结果:整型数
优先级:单目运算符 第2级
位运算符
“按位与” 运算符&
“按位或” 运算符|
“按位异或” 运算符^
“按位取反” 运算符~
左移运算符
功能:将数据对应的二进制数每左移一位,就相当于扩大两倍
右移运算符
功能:将数据对应的二进制数每右移一位,就相当于整除2,将其缩小2倍
复合位运算符
位运算符与赋值运算符可以组成复合赋值运算符,如&=,|=,>>=等
条件运算符
指针运算符
其他运算符
数据类型转换
赋值转换
整型变量 |字符变量 =实型值 只取整数部分,去掉小数部分
整型变量 |字符变量 =长整型值 根据左侧变量的长度从长整型值得低端截取
实型变量 = 整型值 | 字符 整数值后面加小数点,变为实数
长整型变量 = 整型值 | 字符 在整数值前面加0,补足位数
系统自动转换
float转换为double
short/char转换为int
int转换为unsigned int 在转为long 再转为double
总趋势:存储长度较短转换为存储长度较长
强制转换
当数据无法通过系统自动转换为而又必须以另一种数据类型参加运算时,这时必须由
用户强制类型转化的方式,将一个数据临时的由一种类型转换成另外一个所需要的类型,
这种方式在其他计算机语言中也广泛使用
用户强制类型转化的方式,将一个数据临时的由一种类型转换成另外一个所需要的类型,
这种方式在其他计算机语言中也广泛使用
形式:(类型名)表达式
注意:强制类型转换,只是将表达式的值由一种类型,临时的转变为左边需要的
类型,原表达式及其中变量的类型和值都保持不变
类型,原表达式及其中变量的类型和值都保持不变
算法
算法的概念
为了解决某一具体问题而采取的明确的,有限的操作步骤
算法的特性
确定性:每一个步骤都必须语义明确,不能模棱两可,含糊不清
有穷性:任务复杂,步骤可以很多,但不能无限执行下去
可行性:每一步对C语言来说,都是他能做到的
输入:一个算法可以有0或n个输入
输出:一个算法至少有1个结果输出
算法的描述工具
伪代码表示法
传统流程图表示法
N-S结构化表示法
结构化思想
程序由顺序结构,选择结构和循环结构有机组合而成
C语句的种类
表达式语句
空语句
函数调用语句
控制性语句
复核语句
字符输入输出函数
介绍
在编程过程中,经常需要输入或输出个中字符。C语言提供了多个用来实现字符输入或输出的函数,这些函数的定义均包含在“stdio.h”文件里,在使用这些函数前,需要在程序的开始,写上该头文件的包含命令
字符输入函数getchar()
getchar():从标准输入设备(键盘)读入一个字符,返回该字符的
ASCII码值,并且将敲入的字符“回显”到屏幕上
ASCII码值,并且将敲入的字符“回显”到屏幕上
注意:字符输入后必须敲回车键才能有效
如果想获得该函数的字符,可将该函数的值赋值给一个字符变量或一个int型变量
系统执行到该函数时,会自动停下,等待用户输入字符。在程序中也可以
利用这一点,来控制程序执行的节奏
利用这一点,来控制程序执行的节奏
此外,还有一个常用的字符输入函数getch(),也用来输入一个字符,
但输入结束后无需输入回车
但输入结束后无需输入回车
字符输出函数putchar()
字符输出函数用来通过标准输出设备(显示器或打印机)输出一个字符,并返回输出字符的的ASCII码值。
函数在执行时,需要在 函数的括弧里面写上一个字符表达式,通常是一个字符或ASCII码,当然也可以是一个转义字符
此外,系统还有一个常用的输出函数putch(),也用来输出一个字符
不足
输入输出的数据类型收到限制,只能是字符型
输入输出时无法指定指定格式,往往难以满足要求较高场合的需求
格式输入输出函数
格式输出函数
函数调用的一般形式:printf(“格式控制字符串”,输出项列表)
普通字符:按原样输出,用于输出提示信息
转义字符:以“\”打头,指明特定的操作,如“\n”控制光标回车换行
格式字符:有%和格式字符组成,起到规定其对应输出项的输出格式和起到占位符的作用,
即规定其对应输出项的输出位置
即规定其对应输出项的输出位置
分类
%d:将数据以带符号的十进制整数形式输出,适用于int类型
%o:将数据以八进制整数形式输出
%x:将数据以十六进制整数形式输出
%u:将数据以无符号整数形式输出
%ld:将数据以长整型数据的输出,适用于long类型
%f:将数据以单精度实数形式输出,适用于float和double类型
%lf:将数据以双精度实数形式输出,只适用于double类型
%c:将数据以字符形式输出,适用于char和int类型
%s:将数据以字符串形式输出,只适用于字符串
格式输入函数
函数的一般形式:scanf(“格式控制字符串”,地址列表)
功能:通过键盘按照规定格式输入数据,并依次将这些数据存放至“地址列表”所指定的内存单元里存放
格式空值字符的字符组成与printf的格式字符串规定基本相同,但在实际使用时一般不写入转义字符,也不鼓励过多的写入普通字符,因为如果写入,则要求在输入数据时,需“原样打印”的输入这些普通字符,即便出现一点错,结果都会出错
选择结构程序设计
单分支if语句
语句格式
if(表达式)
语句1
语句1
语句执行过程
若表达式的条件满足(为真)或其值不等于0,则执行语句1,然后继续往下执行其他语句
若表达式的条件不满足(为假)或其值等于0,则放弃执行语句1,直接进入下面代码的执行
说明
if后面的圆括号必须要有
语句1本身可以是1句,也可以是多句,当然是多条语句时,必须将这些语句写在一对花括号里,组成一条复核语句。否则会逻辑出错
右侧圆括号的后面不能随意加分号,否则会将该语句分割成两条语句,发生逻辑错误
多分支if语句
语句格式
if(表达式) 语句1
else 语句2
else 语句2
语句执行过程
若该表达式的条件满足(为真)或其值不等于0,则执行语句1,然后继续往下执行其他语句
若该表达式的条件不满足(为假)或其值等于0,则执行语句2,然后继续往下执行其他语句
说明
if后面的圆括号必须要有
语句1本身可以是1句,也可以是多句,当然是多条语句时,必须将这些语句写在一对花括号里,组成一条复核语句。否则会逻辑出错
右侧圆括号的后面不能随意加分号,否则会将该语句分割成两条语句,发生逻辑错误
条件运算符
条件运算符由?:组成,他可以一次连接3个表达式,是C语言中唯一的一个三目运算符
条件表达式形式:表达式1 ? 表达式2 : 表达式3
条件表达式的值:先求解表达式1,若表达式1的值为逻辑真,则继续求解表达式2,并把表达式2的值作为整个逗号表达式的值,表达式执行结束;若表达式1的值为逻辑假,则求解表达式3,并把表达式3的值作为整个逗号表达式的值,表达式执行结束
优先级:13级 逻辑>条件>赋值
结合性:自右至左
判断表达式的值:a = b++ ? ++a : ++b
--a == b++ ? --a : ++b
--a == b++ ? --a : ++b
if语句的嵌套
if语句的嵌套的概念
if(表达式) 语句1
if(表达式) 语句1
else 语句2
else 语句2
对于if语句的上述两种格式来说,其中的语句1和语句2并没有规定必须是什么语句,实际上是任何语句都可以。如果这些语句本身又都是if语句也是可以的,这样的结构称为if语句的嵌套结构。
if语句的嵌套层数越多,其逻辑关系也越复杂,人们理解其来也就越困难。
if语句常用的的嵌套形式
表达式:if(表达式) 语句1
else if(表达式2) 语句2
……
else if(表达式n) 语句n
else 语句n+1
else if(表达式2) 语句2
……
else if(表达式n) 语句n
else 语句n+1
注意:在上述格式中,总是在else子句中进行嵌套,这样做确实更容易理解一些,但并不是必须在else子句中嵌套,也可以在if子句中进行嵌套
说明
当if语句中出现多个if与else的时候,要特别注意他们之间的匹配关系,否则就可能导致程序逻辑错误
else与if的匹配原则是就近一致原则,即else总是与它前面最近的尚未有其他else与之相匹配的那个if是一层关系
switch语句
概念:switch语句,又称多路开关语句,常用来解决具有多种可能的复杂判断问题
语句格式:switch(表达式)
{case 常量1:语句1;
case 常量2:语句2;
case 常量3:语句3;
.........
case 常量n:语句n;
default;语句n+1}
{case 常量1:语句1;
case 常量2:语句2;
case 常量3:语句3;
.........
case 常量n:语句n;
default;语句n+1}
注意:常量表达式的值必须互不相同,否则执行时将出现矛盾,即同一个开关值,将对应多种执行方案。default是默认的意思,改句子是可缺省语句
循环结构程序设计
while语句
语句格式
while(表达式)
语句1
语句1
语句执行过程
求解表达式,当表达式的值为真或不等于0是,反复执行语句1,直到表达式的值为假货等于0为止
语句1也也称为循环体语句
说明
语句1本身可以是1句,也可以是多句,当是多条语句时,必须将这些语句写在一对花括号里,组成一条复合语句
右侧圆括号的后面不能随意加分号,否则会将该语句分割成两条语句,发生逻辑错误
while语句常称为“当型”循环,其特点是“先判断,后执行”
和单分支if语句的区别
if后面的表达式只能判断一次,语句1至多执行一次;二本语句的表达式只要为真,其循环体语句会一直执行下去
do-while语句
语句格式
do{
循环体语句
}while(表达式)
循环体语句
}while(表达式)
语句执行过程
先执行1次循环体语句;然后判断表达式的值,若其为假或为0,则循环结束;否则继续反复执行循环体,直到某次表达式的值为假或为0为止。称为“直到型”循环
说明
表达式条件如何,循环体至少执行一次
表达式后面的分号不能缺少
for语句
语句格式
for(表达式1;表达式2;表达式3)
循环体;
循环体;
语句执行过程
先执行表达式1,通常该部分用来对相关变量赋初始值
然后在判断表达式2的值,若其值假或为0,则整个语句执行结束;若其值为真或非0,则执行一次循环体,然后在执行表达式3,接着继续重复步骤2,直到表达式2的值为假或为0为止。
本循环常被称为“计数型”循环
说明
圆括号中有两个分号,至关总要
3个表达式和循环体部分在不需要的情况下都可以省略
goto语句
语句格式
goto 语句标号;
功能
goto语句称为无条件转向语句,控制程序流无条件的转移至“语句标号”所指定的语句哪里,开始执行
语句标号就是写在语句开始前面的用来表示语句位置的一个符号,只要符合标识命名符要求即可。该语句与if语句联合使用同样也能构造循环结构
break语句
语句格式
break;
功能
结束紧包含他的循环语句的执行,或者是结束当前循环,跳出break所在的循环
注意
语句也可以用于switch语句中,用来结束紧包含他的switch语句
通常总是和if语句一起使用
continue语句
语句格式
continue;
功能
只用于循环体中,一旦执行该语句,则结束循环体的本次执行,不是结束循环语句的执行,循环是否结束与该语句无关
注意
通常也总是和if语句一起使用
循环的嵌套
在一个循环的循环体中又完整的包含有另一个循环结构的形式,称为循环的嵌套
如果内循环体中又有嵌套的循环机构,则构成多重循环
C语言循环的嵌套层数没有明确的限制,但当嵌套层数很多时,逻辑关系很难理清,所以要避免嵌套层数过多
for、while和do-while他们之间,既可以相互嵌套,也可以自我嵌套
注意:在编写循环嵌套时,一定要确保被嵌套的循环结构完整的包含在外层循环的结构体中,否则程序出错
数组
概念
数组是程序设计中经常用到的另一种非常重要的数据结构,在程序设计过程中,有时需要定义一组变量来存放具有相同性质的一组数据,当这些数据个数较多时,再用之前定义变量的方式,就显得力不从心。这时候,就需要定义数组来解决问题
一个数组,往往由许多元素组成,他们的类型相同,具有相同的数组名称,但通过下标的不同以示区别,表示不同的变量。使用数组编程,既能够有效的提高编程效率,也能够提高程序的执行效率
数组的分类
一维数组
定义形式
[存储类型] 类型说明符 数组名 [常量表达式]
例如:auto int a[10];
其中int表示数组类型,a是数组名称,10表示数组所含元素个数,a数组包含a[1],a[2],...,a[9]共10个元素,每个元素都是一个整型变量,占有两个字节的存储空间
其中int表示数组类型,a是数组名称,10表示数组所含元素个数,a数组包含a[1],a[2],...,a[9]共10个元素,每个元素都是一个整型变量,占有两个字节的存储空间
数组空间的分配
程序执行时,系统会为数组分配一片连续的存储空间,该空间的大小由数组的类型和所含元素的个数共同决定
L = 元素个数*sizeof(类型名)
如:a数组分配到的内存单元素为:10*2B,共20个字节
数组定义时初始化
例:int a[5]={10,1,20,13,4};
float b[5]={1.4,7.2};
int a[]={1,2,3};
static int a[5];与int a[5];
int a[5]={0};
float b[5]={1.4,7.2};
int a[]={1,2,3};
static int a[5];与int a[5];
int a[5]={0};
数组元素的引用
数组名[下标]:下标可是一个表达式,结果为整型,但必须在规定范围内
数组元素的使用可以和同类型的变量比照使用
二维数组
定义形式
[存储类型] 类型说明符 数组名 [常量表达式1][常量表达式2]
例:int a[3][4]
3是定义数组的行数,4是定义数组的列数,整数数组共用12个元素。系统为a数组共分配12*2B个字节单位的存储空间
3是定义数组的行数,4是定义数组的列数,整数数组共用12个元素。系统为a数组共分配12*2B个字节单位的存储空间
二维数组在需要时可以看做特殊的一维数组
C语言中二维数组在内存排列顺序为按行为序排列
多为数组定义亦类似于二维数组
初始化
分行初始化。
如:int [3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
如:int [3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
按数组排列的顺序将所有数据写在一个花括号内。
如:int [3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
如:int [3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
如果对全部元素都赋初始值,则定义数组是可以不指定第一维的长度。如:int [][4]={1,2,3,4,5,6,7,8,9,10,11,12};
可以只对部分元素初始化。
如:int [3][4]={{5,1},{2,6,3},{12}};
如:int [3][4]={{5,1},{2,6,3},{12}};
字符数组
字符数组的定义
char 数组名[常量表达式]; 例:char a[10]
定义a数组为一维字符数组,含有10个元素,具体有a[0],a[1],...,a[9]共10个元素,每一个元素都是一个字符变量,占有一个字节的存储空间,用来存放一个字符常量
字符数组初始化
逐个元素初始化。如;char c[10]={'h','a','p','p','y'};
用字符串来初始化字符数组。例如:char a[11]={"I am a boy"};
等价于:char a[11]="I am a boy"
等价于:char a[11]="I am a boy"
如果初始值个数>数组长度,则做语法错误处理
如果初始值个数<数组长度,则只将这些字符赋给数组中前面哪些元素,其余元素自动定为串结束符(即"\n")
字符数组的输入输出
假设有定义 char a[20];
用格式符"%c"逐个字符输入输出:
scanf("%c",&a[0])
printf("%c",a[0])
用格式符"%c"逐个字符输入输出:
scanf("%c",&a[0])
printf("%c",a[0])
假设有定义 char a[20];
用格式符"%s"整个字符串输入输出:
scanf("%s",a);
printf("%s",a);
用格式符"%s"整个字符串输入输出:
scanf("%s",a);
printf("%s",a);
用语句scanf("%s",a)输入字符串时,遇空格键或回车键时结束输入。但所读入的字符串中不包含空格键或回车键,而是在字符串末尾添加'\n'
用一个scanf函数输入多个字符串,输入时应以空格键或回车键作为字符串间隔的分隔
字符串处理函数
使用是应在程序头文件处添加声明:#include"string.h"
字符串拷贝函数strcpy(dst,src)
如有定义:char str1[20],str2=[20];
则语句:str1="china" 或 str2[20]="china" 均是错误的
应当使用串拷贝函数:strcpy(str1,"china");
strcpy(str2,str1);
如有定义:char str1[20],str2=[20];
则语句:str1="china" 或 str2[20]="china" 均是错误的
应当使用串拷贝函数:strcpy(str1,"china");
strcpy(str2,str1);
计算字符串长度的函数:strlen(串处理或串变量)
该函数返回字符串或字符数组中实际字符个数(不包括"\0"),结果为整型
例如:strlen(“BOY”) 串长度为:3
该函数返回字符串或字符数组中实际字符个数(不包括"\0"),结果为整型
例如:strlen(“BOY”) 串长度为:3
串连接函数:strcat(s1,s2)
作用:将s2串连接到s1串的尾部,构成一个长串
例:char s1[20]="china",s2[]="boy";
则:函数strcat(s1,s2)执行后,s1串的内容为:“China boy”;而s2串内容不变
作用:将s2串连接到s1串的尾部,构成一个长串
例:char s1[20]="china",s2[]="boy";
则:函数strcat(s1,s2)执行后,s1串的内容为:“China boy”;而s2串内容不变
字符比较函数:strcmp(s1,s2)
函数原型:int strcmp(const char*s1,const char*s2);
函数功能:从左到右逐个比较两个字符串s1,s2中各个字符
(用字符的ASCII码比较),直到出现不同字符或遇到结束标记为止
例如:strcmp("d","abc") 结果为正整数
strcmp("dog","door") 结果为负整数
函数原型:int strcmp(const char*s1,const char*s2);
函数功能:从左到右逐个比较两个字符串s1,s2中各个字符
(用字符的ASCII码比较),直到出现不同字符或遇到结束标记为止
例如:strcmp("d","abc") 结果为正整数
strcmp("dog","door") 结果为负整数
函数值
0 当串1=串2
负整数 当串1<串2
正整数 当串1>串2
函数
C程序结构
一个C程序可以由多个C程序文件构成
每一个C程序文件又可由多个函数构成
注意:在组成C程序的多个文件中,只能有一个文件包含有main()函数
函数的定义
分类
是否由用户定义
标准库函数
用户自定义函数
是否返回值
返回值得函数
不返回值的函数
是否有参
有参函数
无参函数
是否在文件内部
内部函数
外部函数
定义
方式一:
函数返回值类型名 函数名(参数列表)
参数类型说明
{ 变量说明;
语句序列:
}
函数返回值类型名 函数名(参数列表)
参数类型说明
{ 变量说明;
语句序列:
}
方式二:
函数返回值类型名 函数名(类型说明及参数列表)
参数类型说明
{ 变量说明;
语句序列:
}
函数返回值类型名 函数名(类型说明及参数列表)
参数类型说明
{ 变量说明;
语句序列:
}
函数的嵌套与递归调用
函数的嵌套调用
C语言不允许在一个函数的函数体中去定义另外一个函数,但允许在调用一个函数的过程中,再去调用另外一个函数,将这种调用称为函数的嵌套调用
函数的递归调用
分类
(1)直接递归
void a( )
{......
a( );
......}
void a( )
{......
a( );
......}
(2)间接递归
void a( )
{......
b( );
......}
void b( )
{......
a( );
......}
void a( )
{......
b( );
......}
void b( )
{......
a( );
......}
回推和递推
回推是指从问题的未知解按照一定的规律倒推到问题已知解的过程
递推则只从已知解按照一定的规律记过逐步推导得到问题最终解的过程
函数的使用
函数的调用形式
语句调用
对于不返回值的函数,全部使用语句调用的形式。此时需把函数调用作为一个语句对待。如:swap(x,y);clrscr()等,这类函数只负责完成某项功能,没有值需要返回
对于返回值的函数,一般不使用语句调用,但对于少数返回值的函数,他除了具有数值处理功能外,还具有输入,输出等其他功能,在无需要获取其返回值的情况下,也可以使用语句调用。如:putchar(65)
表达式调用
表达式调用仅限于调用带值返回的函数,可以把函数作为表达式中的一部分参加计算,而不是单独作为一条语句。如:aver(float)sum(x)/x
带参宏与函数的区别
函数调用时,先求出实参表达式的值,然后传递给形参。而使用带参数的宏只是进行直接的字符替换
函数调用是在程序运行过程中进行的,而宏展开则是在程序运行前、在编译阶段进行的
函数执行到的时候,系统会为其形参变量分配内存空间,而宏的参数在展开过程中,系统并不为之分配内存空间
函数的参数必须有确定的类型,且要求实参与形参类型相一致,而宏的参数仅仅是个符号,他没有类型属性
函数的变量
分类
静态存储变量:生存期为程序执行的整个过程,在该过程中占有固定的存储空间
动态存储变量:只生存在某一段时间内
例如:函数的形参变量,只有当程序进入该函数时才分配存储空间,函数执行完后,变量的存储空间又被释放
例如:函数的形参变量,只有当程序进入该函数时才分配存储空间,函数执行完后,变量的存储空间又被释放
变量属性
完整的变量定义:存储特性 数据类型 变量名[=初始值]
变量的存储属性
自动型 auto型
静态型 static型
寄存器型 register型
外部型 extern型
变量的作用域
指变量允许使用的范围
分为全局变量和局部变量
指针
指针的概念
C语言中把指针定义为地址,指针是地址的另外一种描述,是等同的概念,指针即地址,地址即指针
指针与变量
变量的指针
一个变量通常占用若干个连续的内存单元,把这若干个单元的起始单元的地址称之为变量的地址
内存单元的地址本身是一串很长的0,1序列串,记忆和编写都非常困难,在C语言中,则用“&变量名”的形式来表示变量的地址
指向变量的指针变量(1)
指针变量:专门用来存放地址的变量
指向变量的指针变量:专门用来存放其他变量地址的指针变量,即该指针变量指向的对象是一个变量
定义形式:数据类型名 *变量名1[,*变量名2,...,*变量名n];
例如:int x=5
int *p1 p1是变量名,*是定义符,向系统说明p1是指针变量,
int说明p1只能保存int类型的某个变量的地址
int *p1 p1是变量名,*是定义符,向系统说明p1是指针变量,
int说明p1只能保存int类型的某个变量的地址
p1=&x;&x就是一个整型变量的地址,将其赋值给p1保存,非常恰当。由于p1保存有x的地址,根据p1的值就能找到x变量,就像p1用手指向x一样 ,此时我们常说:x是p1所指的变量,p1是指向x变量的指针变量
指向变量的指针变量(2)
指针运算符*又称简介访问运算符,类似与汇编语言中内存的简介寻址,所以也叫间址运算符,用“*”表示,也是单目运算符,第2级先级,右结合性
指针表达式的形式为:*地址表达式
该表达式的执行过程是:先计算地址表达式的值,然后在根据该表达式的值(地址)及类型,去访问内存中相应的对象。这里的“访问”有两种形式,一种是从内存中读出数据,另一种是往内存里写入数据,具体是读还是写,则与该表达式的使用环境有关。在访问内存的时候,先根据地址找到待访问对象的起始位置,然后在根据地址的类型确定要访问的内存空间的大小
既然指针运算符后面必须是地址表达式,则写这样的表达式“&x”也是可以的。由于*和&使右结合性,所以该表达式应理解成*(&x),即根据x的地址去访问内存,访问的对象当然是x变量本身。由此可以看出,*&连用,其作用相当于抵消了,这是一个非常重要的结论,即对于任意给定的变量x,都有:*(&x)==x
指针与数组
一维数组与指针
一维数组的指针
例:int w[5] i;
在C语言中,把[]定义为下标运算符,其优先级与()相同,且系统在执行程序期间,总是把w[i]转换成*(w+i)然后在执行
w+i<=>&w[i]:表示第i个元素的地址
w<=>&w[0]:当i为0时的情形,均表示数组的首地址或第0个元素的地址。
*(w+i)<=>w[i]:均表示第i个元素
指向数组元素的指针变量
int w[5], i *p;
由于可以做:p=&i;当然也可以做:p=&w[i];p=w+i;
当i=0时,有:p=w;此时p指向w[0]
由于可以做:p=&i;当然也可以做:p=&w[i];p=w+i;
当i=0时,有:p=w;此时p指向w[0]
二维数组与指针
如有定义:int i,j,w[3][4]
w+i:表示第i行的地址行
当i+0时,w表示第0行的地址
w+i:表示第i行的地址行
当i+0时,w表示第0行的地址
*(w+i):与[i]相同,均表示第i行的一维数组的名称,也是w[i][0]的元素地址
*(w+i)+j:表示&w[i][j],即第i行第j列元素的地址
*(w+i)+j:表示&w[i][j],即第i行第j列元素的地址
指针与函数
指针数组作为函数参数
假设该程序文件名为output.c,则编译连接后生成output.exe文件。按如下方式运行:
C:\TC\>output my book name
则n变量得到的值为4,输出的内容为:
n=4
my
book
name
C:\TC\>output my book name
则n变量得到的值为4,输出的内容为:
n=4
my
book
name
指针函数
函数也可以带返回地址。返回地址的函数,称为指针函数
指针函数的定义形式:
类型标识符* 函数名(参数表)
类型标识符* 函数名(参数表)
库函数中常用的指针函数:
char *(char *s);
void * malloc(unsigned long n);
char *(char *s);
void * malloc(unsigned long n);
指针函数的指针变量
概念:一个指针变量专门用来保存函数的地址,即称为指向函数的指针变量
定义:int(*f)(int,int);参数类型不带也可以
float(*p)();
float(*fun)();
float(*p)();
float(*fun)();
结构体
结构体与变量
结构体类型的定义
定义:struct 结构体类型名
{类型标识符 成员名1;
类型标识符 成员名2;
......
类型标识符 成员名n;};
{类型标识符 成员名1;
类型标识符 成员名2;
......
类型标识符 成员名n;};
struct:定义结构体类型的关键字
域名或成员名:命名规则和变量相同,同一结构体的同层成员不可同名
结构体类型的定义位置可以在函数外部,也可以在函数内部。如果在某个函数内部定义,该结构体类型则只能在定义他的函数内部使用,其他函数不能使用;若在函数外部定义,则各个函数都可以使用
结构体变量
先定义结构体类型,在定义变量名形式
把定义结构体类型和定义变量两步合并为一步进行
若结构体类型名只用一次,则定义时可以省去
结构体变量所占用的内存空间等于各个数据成员所需空间之和
结构体类型的嵌套
定义:结构体成员可以是结构体类型,但不能在一个结构体里嵌套定义另一个结构体
用typedef定义类型
C语言中,提供了typedef的类型定义功能,它能把一种数据类型名定义成与之等价的另外一种类型名
typedef int INTEGER;
INTEGER x,y
则系统将INTEGER定义为整型类型名称,与int等价使用,所以x和y 是整型变量
INTEGER x,y
则系统将INTEGER定义为整型类型名称,与int等价使用,所以x和y 是整型变量
dypedef int INT P:
INT P x1 ×2
相当于 int *x1 *×2
INT P x1 ×2
相当于 int *x1 *×2
利用typedef可以将structstudent 定义成一个较为简单的类型名,从而为编程带来便利。如:typedef struct student STU;则STU被定义成与struct sdudent等价的结构体类型名,以后可以用它来代替struct sdudent,去定义变量或数组
STU st1; 相当于定义
struct studentst1
struct studentst1
结构体变量定义时初始化
结构体变量是一种聚合类型的数据,它由多个不同类型的数据成员组成。在C语言中,没有哪种格式字符能够控制这种数据整体性的输入输出。所以,对结构体变量的输入输出,只能对其各个成员分别进行
结构体成员分量的表达形式为:结构体变量名.成员名
如:st1.xh表示st1变量中的xh成员这里的“.”是成员(分量)运算符,它具有最高优先级。注意;同类型的结构体变量之间,可以整体相互赋值
结构体与数组
定义结构体数组与定义结构体变量类似
其他类型的数组在定义时可以初始化,对于结构体数组也可以
结构体与指针
指向结构体变量的指针变量
指向结构体变量的指针变量如果一个指针变量保存某个结构体变量的地址,则称该变量为指向结构体变量的指针变量。其定义格式和普通的结构体变量定义格式类似,只要在普通结构体变量名称前加上*”即可。
如:
struct student
( long xh;
char xm[7]
char xb;
int nl:
float fs;
]st,*p
p=&st;
struct student
( long xh;
char xm[7]
char xb;
int nl:
float fs;
]st,*p
p=&st;
如果想使st的xh成员的值为2008101,
可作如下的赋值:st.xh=2008101;
也可借助p来实现:(*p)xh=2008101;
可作如下的赋值:st.xh=2008101;
也可借助p来实现:(*p)xh=2008101;
对与表达式 fp)xh需要注意以下2点:
1.这里的小括号不能随意去掉。由于成员运算符,比指针运算符*的优先级高,所以一旦去掉,系统就会将其理解成*(p.xh),意思即发生了转变。
2.(*p)xh表达式书写和理解都比较困难,为此C语言提供了指向运算符->,其优先级为第一级,左结合性。其表达式格式为:
指针变量->成员分量名称
表示指针变量所指的结构体变量的某个成员分量即:p->xh =(*p).xh 等价。
1.这里的小括号不能随意去掉。由于成员运算符,比指针运算符*的优先级高,所以一旦去掉,系统就会将其理解成*(p.xh),意思即发生了转变。
2.(*p)xh表达式书写和理解都比较困难,为此C语言提供了指向运算符->,其优先级为第一级,左结合性。其表达式格式为:
指针变量->成员分量名称
表示指针变量所指的结构体变量的某个成员分量即:p->xh =(*p).xh 等价。
枚举类型
“枚举”是一种简单的数据类型,它把所有的所有取值——列举出来,形成该类型的取值范围。枚举型变量只能从这个值集中取值,其所取的值称为枚举元素或枚举常量
说明:枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型
枚举类型的定义形式:
enum枚举名{枚举值表}
enum枚举名{枚举值表}
规定
枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值
枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2,.….如在weekday中,sun值为D,mon值为1, sat值为6。当然序号值也可自行设定。
enum weekday ( sun,mou tue=5 wedthu=10frisat )
则wed的序号值自动变为6,的序值变为11.sat的值为12.
则wed的序号值自动变为6,的序值变为11.sat的值为12.
只能把枚举值赋予枚举变量,不能把元素的序号数值直接赋予枚举变量
输出枚举值的格式字符是d输出是该枚举值对应的序号即整数
文件
文件的基本概念
文件(flle)是以文件名为标识,保存在某种外部存储介质上的一组意义相关的数据集合。每个文件都必须有一个文件名来进行标识,操作系统就是根据文件名实现对文件进行“按名存取”。用户可以自主地建立文件,用不同的名字和后缀(扩展名),来表示文件的意义和类型。由文件的定义还可以看出,文件操作会涉及到外部存储介质的存取操作,访问的对象是外存,通常是硬磁盘、U盘等
除了磁盘文件外,为了便于管理,操作系统也把一些标准设备被看作是文件,这样的文件称为设备文件。每个设备都有唯一的一个设备文件名。C系统定义了5个标准设备文件,它们是:
设备 标准设备文件的文件指针
键盘(标准输入) stain
显示器(标准输出) istdou
显示器(标准错误) stderr
串行口(标准辅助) stdux
打印机(标准打印) stdprn
设备 标准设备文件的文件指针
键盘(标准输入) stain
显示器(标准输出) istdou
显示器(标准错误) stderr
串行口(标准辅助) stdux
打印机(标准打印) stdprn
文件的简单分类
文本文件
文本文件是指由字符组成的文件,每个字符用其相应的ASCII码存储,占用一个字节的存储空间。用文本文件的形式存储数据,一个字节存储一个字符,便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间
二进制文件
二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。用二进制形式存储数据,可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接以字符形式输出。需转换后才可以字符形式输出。
例如:整数32767在文本文件和二进制文件中的不同存储形式
文本文件 00110011 00110010 00110111 00110110 00110111共5个字节
二进制文件 0111111111111111共站用2个字节
文本文件 00110011 00110010 00110111 00110110 00110111共5个字节
二进制文件 0111111111111111共站用2个字节
文件的基本操作
定义文件指针
C语言对文件的操作是通过文件指针进行的。C语言系统提供一个名为FILE(注意:必须是大写)的结构体类型,该结构体类型由系统定义,存放在<stdio.h×头文件中。
在使用文件前,首先要包含头文件stdic.h,其次要定义FILE型的文件指针交量
文件类型指针变量的定义格式为:FILE *fp
文件的打开
FILE *fp
fp=fopen(文件名,打开方式)
fp=fopen(文件名,打开方式)
文件的操作
文件的操作视问题的需要而定,主要涉及到对文件的读、写操作。C语言系统提供了些专门的函数来完成这些操作,这些函数将在以后讨论
文件的操作步骤:
1.定义文件指针变量
2.打开文件
3.操作文件
4.关闭文件
1.定义文件指针变量
2.打开文件
3.操作文件
4.关闭文件
文件的关闭(fclose函数)
文件操作以后,为了确保数据保存的完整性,一定要关闭文件。文件关闭以后,该文件对应的FILE结构区便被释放,从而使被关闭的文件得到保护。此后,文件指针变量与文件脱离指向关系以后不能再入 通过该指针对其相连的文件进行读写操作
关闭文件的使用格式为
fclose(文件指针)
fclose(文件指针)
文件的应用举例
在C盘根目录下新建一个名为“test.txt”的文件,用来保存由键盘随机输入的一些字符,直到按回车键为止
字符输出函数 (fputc函数)
fputc函数的使用格式如下:
fputc(cf,fp)
fputc函数的使用格式如下:
fputc(cf,fp)
fputc函数将cn的值输出到fp所指的文件中,并返回该字符,如果输出失效则返回EOP
0 条评论
下一页