导图社区 C语言备考指南
C语言-备考指南:每个源程序只有一个main函数,且位置任意.程序总是从主函数开始执行,其他函数最终必将被这个主函数调用。
编辑于2022-11-10 16:27:55C语言-备考指南
文件操作
链表
定义
链表是一种常见的数据存储结构,由一系列节点组成,节点可以在运行时动态生成
每个节点包含两个部分:
存储数据元素的数据域
存储下一个节点地址的指针域(在节点中用来存放下一个节点的首地址,这用来存放地址的成员被叫做指针域)
注意点
存放第一个节点的地址叫头指针,即head指针,head指针没有数据,只是一个指针变量
最后一个节点因为没有后继节点,所以其指针被置为'\0',即null
链表中的每个节点都是同一种结构类型
单向链表中节点的输出
操作方法
只需使用一个工作指针p,从头到尾依次指向链表中的每个节点
当指针指向某个节点时,就输出该节点中的内容,直到链表结束标志为止
如果是空链表,就只输出有关信息并返回调用函数
单向链表中删除节点
操作方法
想要删除单向链表中的某个节点,需要先找到要删除节点的前驱节点
然后将前驱节点的指针域指向待删节点的后续节点即可
最后释放待删除节点所占存储空间
例子
p,q是连续节点,现在要删除节点q,只需令p - >next=q - > next;free(q);
单向链表中插入节点
操作方法
需要先确定插入的位置
例如
在连续节点p,q之间插入新节点r,只需令r - >next = p - > next;p - > next= r;
结构体
用typedef说明一个新类型
一般形式
typedef 类型名 标识符
其中,类型名一定是在此语句之前已经有定义的类型标识符
标识符是一个用户定义标识符,用来标识新的类型名
typedef语句作用
用标识符来代表已存在的类型名并没有产生新的数据类型,因此原有的类型名依然有效
声明一个新的类型名的步骤
先按定义变量的方法写出定义的主体(如float a;)
将变量名换成新类型名(如将a换成FLOAT)
在最左边加上关键字typedef(如typedef float FLOAT;)
然后在可以用新类型名去定义其他的变量(如FLOAT b;)
声明的例子
typedef unsigned int ui
int main(void)
{ ui a=10;
return 0 }
结构体数据类型
定义结构体类型
一般形式
struct 结构体名
{ 类型名 1 结构体成员表1;
类型名 2 结构体成员表2;
};
注意点
struct是关键字,是结构体类型的标志
结构体名和结构体成员名表都是用户定义的标识符,但不能对结构体名进行初始化
结尾分号不能少
例子
struct stu{
char * name;
int num;
float score;
int rank;
};
定义结构体变量
如果已经定义了一个结构体类型,那么就可以用其来定义变量
例子
struct stu stu1 stu2;
定义两个stu类型的变量stu1,stu2,它们各由4个成员组成
说明
在定义结构体类型的同时也可以定义结构体变量
形式
struct 结构体名 { 结构体成员表列}变量名表列;
其中,可以省略结构体名,单数省略后没法定义新的变量
结构体类型变量的引用
结构体变量的引用的注意点
结构体变量不能作为一个整体而对其进行任何操作,只能对结构体变量中的各个成员分别进行输入和输出等操作
结构体变量中的成员用以下方式引用
结构体变量名.成员名
例子: stu1.name;
如果结构体的某个成员本身又是一个结构体类型,则可以用若干个成员运算符"."一级一级地找到最低一级成员
只能对最低一级的成员进行赋值或存储及运算
结构体变量的初始化,是逐个对结构体变量的各个成员进行初始化的过程
例子
stu1.name="张三"; stu1.rank=3;
除了对成员逐一赋值外,还可以在定义变量时整体赋值
例子
struct stu {
char * name;
int num;
float score;
int rank;
};
stu1={"张三",15,767,2};
注意
整体赋值仅限于定义结构体变量时,在使用过程中只能对成员进行逐一赋值
指向结构体类型数据的指针
指向结构体变量的指针
"- >"称为指向运算符
三种等价形式
“结构体变量.成员名”
例如:stu.name;
“(*结构体指针变量名).成员名”
例如:(*pstu).name;
“结构体指针变量名 - >成员名”
例如:pstu - >name;
指向结构体数组的指针
结构体数组及其元素也可以用指针变量来指向
在使用指针变量指向结构体数组时,只要把该结构体数组中的每个元素当做普通的结构体变量使用即可
用结构体变量和指向结构体的指针作为函数参数
将一个结构体变量的值传递给另一个函数的方法
用结构体变量的成员作为实参传递给主调函数
可以用结构体变量作为一个整体实参
在C语言中,允许将结构体变量的地址作为实参传递
这时对应的形参应该是一个基类型(C语言本身提供的数据类型)相同的结构体类型的指针
宏定义
宏定义的来由
宏定义是C语言提供的三种预处理功能的其中一种,又称为宏代换、宏替换
三种预处理功能
宏定义、文件包含、条件编译
不带参数的宏定义
定义形式
#define 宏名 替换文本
#define 宏名
说明
在define中宏名和宏替换文本之间空格不能少
同一个宏名不能重复定义
可以用#define 命令终止宏定义的作用域
在进行宏定义时,可以引用已定义的宏名
带参数的宏定义
定义形式
#define 宏名(参数表)字符串
例如
#define sum(x,y) (x+y)
a=sum(1,2) //宏调用
注意点
带参数的宏定义一般会加(),防止运算符优先级出错
宏定义不仅仅可以进行字符串替换,还可以进行参数互换
宏定义不需要指明数据类型,但宏调用需要
建议给每个参数都加上()
例如
#dfine total(x) (x)*(x)
a=total(a+b)
解析
宏展开后为(a+b)*(a+b)
如果不加()运算过程就会完全不同
指针
什么是指针?
计算机所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如int占4个字节,char占1个字节
为了正确访问这些数据,就需要给每个字节都编上号码,这些编号就是地址或指针
地址与指针变量的概念
地址与指针
指针
在C语言里,将地址形象的称为指针,一个变量的地址称为变量的指针
指针变量
一个用来存放另一个变量的地址的变量
指针变量的定义
一般形式
类型名*指针变量名1,*指针变量名2,......
其中类型名称为基类型,它规定了后面的指针变量中存放的数据类型,*表明后面的指针变量1,指针变量2是指针变量
*在定义的时候不能省略
例子
int * p,*t;
char * p;(p是指向char类型变量的指针变量)
指针变量的引用
指针变量只能存放地址,与指针相关的两个运算符是&(取地址运算)和*(指针运算符)
例子
int * p,a=1;p=&a;
p是指向int类型变量的指针,用来存放int类型变量a的地址
p和&a表示变量a的地址,*p和a表示变量a的值
注意点
(*p)++和*p++的区别
(*p)++表示对p指针所指向的值取++运算
*p++表示先对p指针指向的变量的地址取++运算,然后再取值
*p++和*(p++)代表同一个意思
因为*和++的运算优先级相同,而它们是按照从右到左的顺序进行运算
指针变量作为函数参数
指针类型数据可以作为函数参数来进行传递
形参指针变量的值的改变不能使实参指针变量的值发生改变
作用
将一个变量的地址传到另一个函数中,参与该函数的运算
数组与指针
指向数组元素的指针
C语言规定数组名代表数组的首地址,也就是数组中第0号元素的地址
定义指向数组元素的指针变量的方法,与定义指向变量的指针变量相同
例子
int a[5] ;int *p=a;
定义数组a,定义指针变量p指向数组a的首地址,即存放a[0]的地址
通过指针引用数组元素
如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素
例子
int a[5],*p,i;
定义数组a,其中有5个整型数据,定义指针变量p和整型变量i
如果指针变量p的初始值为&a[0],则p+i,a+i指向a[i]的地址
而*(p+i),*(a+i)是p+i,a+i所指向的数组元素a[i]
此处a是数组名,不可进行非法运算,但P的地址可以改变,例如p++,p=a,p+&[i]是合法的表达式
指针的运算
两个指针相减,会得到一个步长(偏移量)
在讲数组赋值给指针变量时,不需要取地址操作,本身就是地址
指针计算不是简单的整数相加减
例如如果是yigeint *,+1的结果是增加一个int的大小
用数据名作为函数参数
当数组名作为参数被传递时,若形参数组中各元素发生了变化,则原实参数个元素的值也随之发生改变
如果用数组元素作为实参,情况就与用变量作为实参时一样,是值传递方式
指向多维数组的指针和指针变量
多维数组可以看作一堆数组的延续,多维数组的内存单元也是连续的内存单元
字符串与指针
字符串的表现形式
用字符数组存放一个字符串,然后输出该字符串
用字符指针指向一个字符串,用字符指针指向字符串中的字符
字符串指针作函数参数
将一个字符串从一个函数传递导另一个函数,可以用地址传递的办法,
即用字符数组名作为参数或用指向字符串的指针变量作为参数,进行传递
字符指针变量和字符数组的区别
赋值方式不同
字符指针变量可以在定义时进行赋初值,也可以在赋值语句中完成
字符数组在定义时对其整体赋初值,但在赋值语句中不能完成整体赋值
编译时不同
在程序中字符指针变量的值可以改变
但数组名虽然代表了地址,但它的值是一个固定的值,不能改变
函数
函数的定义
函数定义的一般形式
返回值类型名 函数名(类型名 形式参数1 ,类型名 形式参数2,......){函数体(含代码体和返回值)}
注意点
定义中缺省返回值类型,系统默认函数返回值为int类型
如果没有函数值返回,则需把函数定义为void类型
函数参数和返回值
形式参数和实际参数
形式参数
在定义函数时,函数名后面括号中的变量称为“形式变量”(简称形参)
注意点
形参不调用时不占空间
形参不能被赋值,形参无具体指,用来接受函数调用时传来的实际参数
实际参数
在主调函数中,函数名后面括号中的参数(可以是一个表达式)称为“实际参数”(简称实参)
实参有具体的值
注意点
实参可以传给形参,但形参不能传给实参,实参有固定地址
在执行一个被调用函数时,形参的值如果发生变化,并不会改变主调函数中实参的值
在地址传递时,形参可以改变实参的值
实参和形参分别占据不同的存储单元,实参向形参单向传递数值
函数的返回值
函数的返回值就是通过函数调用使主调函数能得到一个确定的值,通常用return语句来实现
表现形式
return 表达式;
return(表达式);
return;
注意点
return语句的表达式值必须和函数首部说明的值一致,如果不一致,则以函数值的类型为准,由系统自动进行强制转换
当函数没有返回值或返回语句时,函数返回一个不确定的值,为了避免,课使用void定义无类型函数
函数的调用形式
函数调用的一般形式
函数名(实际参数表);
实际参数表中的参数可以是常数、变量或构造类型数据,各实参之间用逗号分隔
函数的调用可分为无参函数和有参函数两种
无参函数的调用
对无参函数调用时无实际参数表,但括号不能省略
有参函数的调用
若实际参数中有多个实参,各参数间用逗号隔开
实参与形参要求类型一致
函数的说明
定义的函数要遵循先定义后使用的规则
一般形式
类型名 函数名(参数类型1,参数类型2....)
类型名 函数名(参数类型1 参数名1,参数类型2 参数名2......)
函数的嵌套使用
函数定义相互独立,不允许嵌套定义函数,即一个函数内不能定义另一个函数
但可以潜逃函数,即在调用一个函数的过程中,又调用另一个函数
函数的递归调用
释义
在调用一个函数的过程中又直接或间接地调用该函数本身
使用递归调用需符合的条件
对所处理的对象有规律的递增或递减
可以利用递归调用使问题得到解决
需要有一个有一个明确的结束递归的条件(要有出口)
注意点
递归函数在栈区内存中占有内存比较多
数组名作为函数参数
数组元素可以作为函数的实参,与用变量作为实参一样,按照单向值传递的方法进行传递
数组名作为函数参数,此时实参与形参都应用数组名,此时数组名是整个数组的首地址
局部变量和全局变量
局部变量
定义
在函数内部定义的变量,只能在本函数内使用
注意点
不同函数可以使用相同的局部变量名,他们将代表不同的对象,互不干扰
一个函数的形参也为局部变量
在函数内部,复合语句也可以定义变量,这些变量也是局部变量,只在此复合语句里有效
全局变量
定义
在函数外定义的变量,可以在本文件中被其他函数所共用,有效范围从定义变量开始导本文件结束
注意
在同一个源文件里,外部变量和局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,不起作用(就近原则)
变量的存储类别
auto变量
自动存储变量
如果在函数内部或复合语句内定义变量时,如果没有指定存储类类型,或使用了auto说明符,系统就认定所定义的变量具有自动类别
register变量
自动类变量
与auto变量的区别
用register说明变量是建议编译程序将变量的值保留在CPU的寄存器中,而不是像一般的变量那样占用存储单元
static变量
静态局部变量
与register和auto的本质区别
在整个程序运行期间,静态局部变量在内存中的静态存储区中占据着永久性的存储单元
即使退出函数后,下次进入该函数时,静态局部变量仍可以使用原来的存储单元
由于不释放这些存储单元,这些存储单元的值得以保留,因而可以继续使用存储单元中的原来的值
静态局部变量的初值是在编译时赋予的,在程序执行期间不再赋予初值
对未赋值的局部变量,C语言编译程序自动给它赋值为0
基础概述
C语言构成
概念
源程序
C语言上结构化语言,源程序是由main()函数(又叫主函数)和若干个其他子函数结合而成的,或者只由一个main()函数构成,每个函数完成独立的功能
函数体
在函数后面用{}括起来的部分,函数体前半部分是定义部分,后半部分是执行部分
注释
/* */,其中/和*中间没空格
//单行注释
预处理命令
以#开头的语句
注意部分
每个源程序只有一个main函数,且位置任意.程序总是从主函数开始执行,其他函数最终必将被这个主函数调用
每个执行语句以分号结束,但预处理命令和函数头不能加分号
main后圆括号中可以为空,但圆括号不能省
区分大小写
注释不可以嵌套
C语言程序生成过程
C程序是先由源程序经过编译生成目标文件,然后经过链接生成可执行文件
源程序的扩展名为.c,目标程序的扩展名为.obj,可执行文件的扩展名为.exe
数据类型和其运算
标识符
命名规则
只能由字母(大小写)、数字、和下划线组成
第一个字符必须是字母或者下划线,不能是数字
字母要区分大小写
分类
关键字
C语言自带,不可更改
预定义标识符
预先定义并具有特定含义的标识符
用户标识符
由用户根据需要定义的标识符,需要做到见名知意,不能与关键字相同
常量、变量及数据结构
常量
整型常量
十进制整型常量
由数字0-9构成,不加前缀
八进制整型常量
以0开头,其他数字0-7构成
十六进制整型常量
由数字0和字母X(或小写),即0x(0X)开头,其他数字取值为0-15,其中10-15表示为A-F(a-f)
需注意:只有十进制可以是负值
实型常量
表现形式
小数形式
小数点两边必须有数字
指数形式
e前必须有数字,e后必须为整数
例子
1.23e5表示12.3*10^5
字符常量
一个字符常量代表ascII码字符集里的一个字符,即占一个字节,在程序中用单撇号扣起来
区分大小写
例子
'a'、'\n'
特殊的字符常量:转义字符
其中\是转义的意思
常用转义字符表
注意点
在C语言中,单引号标识字符,双引号标识字符串
字符串常量
需注意部分:c编译程序自动会在字符串的结尾加一个转义字符'\0'作为字符串结束的标志
符号常量
符号常量是预处理命令“define"定义的常量,在C程序中可用标识符代表一个常量
例如
#define pi 3.14
定义符号名为pi的常量为3.14
变量
变量使用规则
变量的名字必须符合标识符的命名规则
变量必须先定义后使用
定义变量同时要说明其类型,不同的变量其存储大小不同
声明变量和定义变量不同
声明变量不分配空间只说明变量的类型
定义变量不仅说明变量类型,还能给变量分配存储空间,对变量进行初始化
变量的分类
整型变量
分类
基本型、短整型、长整型、无符号型
实型变量
分类
单精度类型(float)
双精度(double)
所占字节
float型在内存里占4个字节(32位),单精度实数提供7位有效数字
double型在字符里占有8个字节(64位),双精度实数提供15-16位有效数字
注意点
实型常量不分单精度还是双精度,都可,但一定要根据自身类型截取常量里对应的有效数字
字符变量
作用
存放字符常量
定义
用关键字char定义,每个字符变量中只能放一个字符
定义形式
char,crl,cr2
赋值
crl='m'
cr2='n'
存储方法
存储字符对应的ASCII码到内存单元中
注意点
字符型数据和整型数据之间可以通用,一个字符能用字符的形式输出,也能用整数的形式输出
字符数据进行算术运算,相当于对它们的ASCII码进行运算
运算符
作用
主要用于构成表达式,同一符号在不同表达式里,其作业不一致
常用运算符
运算符的结合性
所有的单目运算符、条件运算符、赋值运算符和其扩展运算符,结合方向都是从右到左
其余的都是从左到右
运算符的优先性
初等运算符>单目运算符>算术运算符(先乘除后加减)>关系运算符>逻辑运算符(不包括‘!’)>条件运算符>赋值运算符>逗号运算符
强制类型转换表达式
格式
(类型名)(表达式)
算术运算符和算术表达式
基本分类
+
正值、加法
-
负值、减法
*
乘法
/
除法
%
求余
符号两边必须是整数
注意点
双目运算符两边的数值类型必须一致才能进行运算,如果不一致,就需要进行一致性转换
一致性转换规则
char——short——int——unsigned——long——float——double
所有实数的运算都是双精度方式进行的,若是单精度数值,则需要在尾数后面补0转换为双精度数
算术表达式和运算符的优先级和结合性
定义
用算术运算符和括号将运算量结合起来的、符合C语言语法规则的表达式
运算对象
函数、常量、变量
运算规则
可用多层圆括号,运算时由内向外运算
不同优先级的按运算符优先级进行运算,否则按结合方向进行运算
自加自减运算符(属于是单目运算符)
++i和i++(--i和i--的区别)
++i,--i
在使用i之前先使i的值加减1
i++,i--
在使用i之后,使i的值加减1
--
使运算变量的值减1
++
使运算变量的值加1
位运算符
与
&
若两个相应的二进制都为1,则该位结果为1,否则为0
或
|
两个对应的二进制位中只要有一个为1,则该位的结果为1,否则为0
异或
^
若两个二进制位相同,则结果为0,否则为1
取反(单目运算符)
~
按位取反,即0变1,1变0
左移
将一个数的二进制位全部左移1位
右移
>>
将一个数的二进制位全部右移1位
赋值运算符和赋值表达式
赋值运算符
=
赋值表达式
由赋值运算符组成的表达式
形式
变量名=表达式(把后面的值给到前面)
注意点
赋值运算符左边只能是变量,不能是常量和表达式
赋值表达式的右侧还可以是一个赋值表达式
如果变量被多次赋值,就取最后一次被赋值的表达式的值
复合的赋值表达式
例如
+=,-=,*=,/=,%=
两个符号之间不能有空格,符合的赋值表达式与赋值表达式的优先级一致
如果赋值表达式两侧的类型不一致,也没有进行强制类型转换,系统将自动将右侧求得的数值按赋值号左边的变量的类型进行转换
顺序结构
表达式语句
表达式语句
在表达式后面添加分号;构成表达式语句
执行完表达式语句后,表达式的值就会被抛弃,因此,如果不去修改操作数的值,表达式语句就无实际意义
复合语句
把多个语句用话括号{}括起来所构成一个语句组
一个复合语句在语句上被视为一条语句
空语句
只有一个分号构成的语句
例如
main(){ ; }
其中分号是一个口语句,在程序执行时不产生任何动作
字符的输入和输出
字符输出函数putchar()
putchar(),其作用是向终端输出一个字符
字符输入函数getcahr()
从终端输入一个字符
注意点
getchar()函数没有参数,函数值就是从输入设备得到的字符
格式化输入/输出函数
输出函数printf()
格式:printf(格式控制,输出表列)
格式控制:用双引号括起来的字符串
格式转换说明,由%和格式字符组成
需要原样输出的字符也可以写在格式控制内
输出表列
需要输出的一些数据,可以是常量、变量、表达式,输出表列中的各输出项用逗号隔开
数值控制(控制数据宽度与保留位数)
printf("%5.2f",a)表示输出数据的宽度为5,保留2位小数,令a=101,输出为101.00
若宽度不能达到要求的位数,前面就会补相应的空格
常用格式转换
%d:以十进制形式输出
%1d:以长整型形式输出
%f:以浮点数形式输出
%o:以八进制形式输出
%x:以十六进制形式输出
%u:以十进制输出unsigned型数据
%c:用来输出一个字符
%s:用来输出一个字符串
%f:用来输出实数,以小数形式输出
%e:以指数形式输出实数
%g:根据大小自动选f格式或e格式
%%:输出百分号
注意:
格式说明与输出项在类型与个数上要保持一致
输入函数scanf()
格式:scanf(格式控制,地址表列)
格式控制:同printf
地址表列:
由若干个变量地址组成,既可以是变量的地址,也可以是字符串的首地址
说明
对unsigned型变量的数据,可以用%d,%o,%x格式输入
在scanf()函数的格式字符前可以用一个整数指定输入数据所占宽度,但对于实型数则不能指定其小数位的宽度
注意:
scanf()函数的输入项只能是地址表达式
如在格式控制字符中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符
在使用%c格式输入字符时,空格字符和转义字符都可作为有效字符输入
输入少于输出项个数会等待,输入多与输出项个数多余部分将留在缓冲区备用,为下一次输入数据的数据
输入数据时,遇到空格、回车、跳格时将认为输入结束,这些字符被称为间隔符
选择结构程序设计
关系运算符和关系表达式
关系运算符
六种关系运算符
小于、小于等于、大于等于、大于、等于(==)、不等于(!=)
结合性
自左往右
优先性
小于、小于等于、大于等于、大于这四种优先性相同
等于和不等于的优先性相同
小于、小于等于、大于等于、大于的优先性高于等于和不等于
关系运算符的优先性低于算术运算符,高于赋值运算符
关系表达式
由关系运算符构成的表达式称为关系表达式,关系运算符两边的运算对象可以是C语言中任意合法的表达式
例子
(a>b)!=c,a>=b,(a==1)<(b==2)都是合法的关系表达式
注意点
关系运算符的值称为逻辑值,只能是0或者1
关系运算符两边的值类型不一致时,系统将进行自动转换
逻辑运算符和逻辑表达式
逻辑运算符
三大逻辑运算符
逻辑与(&&),逻辑或(||),逻辑非(!)
其中逻辑与(&&)、逻辑或(||)是双目运算符
逻辑非是单目运算符
结合性
自左往右
优先级
!>&&>||
! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
逻辑表达式
逻辑表达式由逻辑运算符和运算对象组成
参与逻辑运算的可以是一个具体的值,也可以是C语言中任意合法的表达式
逻辑运算符的运算结果只能是1(真)或者0(假)
&&运算中同真为真
||运算同假为假
注意点
关系运算符不能连用,例如1<x<5不可用
if语句及其构成的选择结构
if(表达式) 语句
if(表达式) 语句 else 语句
if(表达式) 语句 else if(表达式) 语句 else if(表达式) 语句
注意点
()不可少
始终加上{ },如果没加{},else与其最近的if结合
如果if中的值是0,将会被停止运行
条件运算符构成的选择结构
条件运算符:?:(唯一的三元运算符)
条件表达式的一般形式
表达式1?表达式2:表达式3
求解过程
先求表达式1的值,当表达式1的值非0时,以表达式2的值作为整个条件表达式的值,当表达式1的值是0时,以表达式3的值作为整个条件表达式的值
优先过程
switch语句
switch语句和break语句组成的选择结构
循环结构程序设计
while和do...while循环结构
for循环结构
循环结构的嵌套
continue和break语句
数组
一维数组的定义和引用
一维数组的定义
定义
一维数组是指数组中的每个元素只带有一个下标的数组
定义方法
类型说明符 数组名[常量表达式];
例子
int a[3]
定义整型数组a,a数组中有三个整型元素,a[0],a[1],a[2]
注意
每个数组的第一个元素下标为0
注意点
一个数组元素实质上是一个变量名,代表内存中的一个存储单元,一个数组占据的是一连串连续的存储单元
引用数组元素的时候,数组的下标可以是整型常量,也可以是整型表达式
数组必须先定义后使用(C语言不支持动态数组,数组必须在编译时定义长度)
只能逐个引用数组元素,而不能引用整个数组
一维数组的引用
数组名 [下标表达式]
一维数组的初始化
数组定义后,系统会自动开辟不确定的值进去,因此,可以在定义数组的时候就给所包含的数组元素分别赋值
例子
int a[3] = {1,2,3}
注意点
所赋值放花括号里,数值类型必须与所说明类型一致,并用逗号隔开
不能跳过前面的元素给后面的元素赋初值,但允许前面元素赋值为0
赋值个数少于定义个数,系统自动赋值0
可以通过付初值来定义数组大小,定义数组时可以不指定数组大小
例子
int a[] ={1,2,3,4}
二维数组的定义和使用
定义
当数组中每个元素带有两个下标时就叫二维数组,逻辑上可看出具有行列的表或者矩阵,按行依次存储,以第0行开始
一般形式
类型说明符 数组名 [常量表达式(行)][常量表达式2(列)];
引用
数组名 [下标表达式1][下标表达式2]
注意点
数组的下标可以说是整型表达式,数组元素可以出现在表达式里
数组初始化
可以边定义边赋值
二维数组的初始化与一维数组基本相同
字符数组
初始化
字符数组就是数组中的每个元素都是字符,定义方法与普通数组的定义方法相同
引用形式
数组名 [下标]
例子
char a[5] ={ 'g','o','o','d'};其中,a[4]='\0'
注意点
赋的初值个数大于数组长度,编译时会按语法错误处理
如果初值个数小于数组长度,则将这些字符赋给数组中前面那些元素,其余的元素定义为空字符'\0'
字符数组的元素只能一一赋值
数组的整体赋值只有在初始化的时候可以使用
例子
char str[]; str="thank you"是错误的
char str[ ]="thank you ";就是正确的
字符串和字符串结束标志
C语言里将字符串作为字符数组来处理,为了测定字符串的实际长度,C语言规定以字符'\0'来代表字符串结束的标志
在遇到'\0'时,表示字符串结束,由它前面的字符组成字符串
有'\0'时,字符串与字符数组相同,否则二者有差别
切记,字符'\0'也占一个字符
字符数组的输入输出
字符数组的输入输出方式
用“%c”格式符将字符逐个输入输出
用“%s”格式符将整个字符串一次输入或输出
字符串处理函数
在调用以下函数之前需要子程序前面的命令行包含标准头文件“string.h”
gets();
字符输入函数
调用形式
gets(字符数组)
作用
从终端输入一个字符串到字符数组中,并且得到一个函数值
puts();
字符串输出函数
调用形式
puts(字符数组)
作用
将一个字符串(以'\0'结尾)输出到终端去
strcmp();
字符串比较函数
调用形式
strcmp(字符数组1,字符数组2)
作用
该函数按照ASCII码顺序比较字符数组1和字符数组2所指字符串的大小
若字符数组1>字符数组2,函数值大于0(正数)
若字符数组1=字符数组2,函数值等于0
若字符数组1<字符数组2,函数值小于0(负数)
strlen();
统计字符串长度
调用形式
strlen(字符数组)
作用
计算出以字符数组为起始地址的字符串的长度,并作为函数值返回
strcat();
字符串连接函数
调用形式
strcat(字符数组1,字符数组2)
作用
将字符数组2所指字符串的内容连接到字符数组1所指字符串的后面,并自动覆盖字符数组1串末尾的'\0'
该函数返回字符数组1的地址值
strcpy();
字符串复制函数
调用形式
strcpy(字符数组1,字符数组2)
作用
把字符数组2的所指字符串的内容复制到字符数组1所指存储空间中
函数返回字符数组1的值,即目标串的首地址