数组
1. 数组的基本概念
1. 数组
数组是具有相同的数据类型且按照一定次序排列的一组变量的集合体,构成一个数组的这些变量称为数组元素。数组有一个同一的名字为数组名。可以用一个数字符号(下标)来表示某个元素在数组中的位置。数组在计算机内存中是连续存储的
2. 数组元素
数组中的每一个数据称为数组的一个元素。数组有两个基本要素,即数据和数据的位置。其中,数据可以是基本数据类型,也可以是构造数据类型。数组的位置就是数据在数组中的相对位置,称之为下标,下标从0开始
3. 数组的分类
按数组元素间的逻辑关系分为:
- 一维数组
- 二维数组
- 多维数组
按数组元素间的数据类型分为:
- 整型数组
- 实型数组
- 字符数组
- 指针数组
4. 数组的维数
数组的维数就是数组元素"下标"的个数
一维数组:数组如果用一个下标就可以确定数组元素的位置,这样的数组就是一维数组,即有一个下标的数组元素,构成一维数组
二维数组:如果数组中的元素能够按行、列排成一个矩阵,也就要说必须使用两个下标(一个表示"行"一个表示"列")来确定元素的位置,这样的数组称为二维数组
2. 一维数组
1. 一维数组的定义
一维数组是由一个下标的数组元素组成的数组,数组名后只有一对方括号,在C语言中,数组必须"先定义,后使用"
说明:
- "类型标识符"说明数组中元素的类型,可以是基本数据类型,也可以是构造数类型,由"它"告诉编译器数组中的每个元素占用多少个字节的存储空间
- "数组名"是数组的名称,数组名的命名规则和变量名相同,遵循标识符命名规则
- "[]“是下标运算符,不能使用圆括号。”[]"中的个数代表了数组的维数,所以,一维数组只用一个下标运算符
- "常量表达式"可以是整型常量,也可以是符号型常量,不允许是变量,因为此表达式的值是在编译时计算出来的,而编译时系统并不确定变量的取值。其值就是数组元素的个数,即数组的长度。数组元素的个数必须大于或等于1,元素的下标是从0开始编号的
2. 一维数组的存储形式
一维数组在内存中存储时,按下标递增的次序依次连续存放。数组名是数组在内存中存储区域的首地址,即数组第一个元素存放的地址为&数组名[0]
。因此,数组名是一个地址常量,不是变量,不能对其进行赋值和&
运算
3. 一维数组的初始化
在定义数组时,为数组元素赋初值,称为数组的初始化
说明:
- "{}"中的值是初值,用逗号分开
- 如果"{}"中值的个数少于数组元素的个数,则多余的数组元素的初值为0(字符型数组元素为’\0’)
- 在数组的定义中,可缺省方括号"[]“中的元素个数,而用”{}"中初值的个数来决定数组元素的个数
- 初值的个数不能大于数组长度
4. 一维数组的引用
任何一个数组都应先定义,后引用。在C语言中不能对数组整体进行操作,只能对数组元素进行操作
说明:
- "数组名"与一般变量名的定义规则相同,都必须是一个合法的标示符名
- "下标"可以是任意非负整型数据,取值范围时0~(数组长度-1)(保证数组下标不越界)。一个数组元素就是一个普通的变量
注:
- 运行C语言程序时,系统不做下标越界检测。因此,在编写有关数组的程序时,一定要注意数组下标不能越界
- 数组不能整体引用,如果需要逐个输入或输出元素时,可以使用循环语句实现
- 数组元素的使用,可以使用数组下标和指针两种形式实现,其中使用最常见的方法是使用数组下标
- 数组的遍历,长使用循环语句实现,此时要注意数组的上下界
3. 二维数组
当数组中的每个元素都带有两个下标时,称这样的数组为二维数组
1. 二维数组的定义
说明:
- "类型标识符"说明数组中元素的类型,可以是基本数据类型,也可以是构造数据类型,由"它"告诉编译器数组中每个元素蝉蛹多少字节的存储空间(每种数据类型都占用固定大小的内存)
- "数组名"是数组的名称,数组名的命名会泽和变量名相同,遵循标识符命名规则
- "[]“是下标运算符,”[]"中的个数代表了数组的维数,所以,二维数组有两个下标运算符
- 常量表达式使用"[]"括起来的整型常量或符号型常量,其数值的乘积就是该二维数组所拥有的元素个数
2. 二维数组的存储形式
二维数组在计算机中的存储形式有两种:
- 按行排列。即存完一行之后顺次存入第二行
- 按列排列。即存完一列之后顺次存入第二列
注:在C语言中,二维数组按行排列
3. 二维数组的初始化
在定义二维数组的同时可对数组进行初始化,有以下方式:
- 按行全部初始化。二维数组可以看作由若干一维数组组成的一个一维数组,可以在"{}“中嵌套”{}",内嵌的"{}"包含每一行元素的初始化数据
- 按数组在内存中的存储顺序初始化。不分行,将所有数据依次列在一个"{}"内
- 按行对部分元素初始化
4. 二维数组的引用
注:
- 二维数组元素的引用多使用数组下标来实现,常用于矩阵的运算
- 二维数组的遍历,尝试用嵌套循环语句实现,此时要注意内外两层循环分别表示的意义
4. 字符数组
在C语言中没有字符串类型的变量,必须使用字符数组来保存字符串。字符数组时字符型数组的简称。字符数组是一个存储元素都是字符的数组,即字符数组是用来存放字符的数组,每一个字符数组元素就是一个字符
1. 字符数组的定义
字符型数组时数据类型为char的数组。因此,存储方式和数组的存储方式是一样的。
数组名和下标表达式的意义与一维数组的也是一样的
字符型数组用于存放字符或字符串,每一个数组元素存放一个字符,它在内存中占用一个字节
常用的字符数组存放字符串,由于C语言中所有的处理都约定字符串以’\0’结尾,在用字符数组存放字符串时,也要在字符串的末尾用’\0’结尾。因此,在定义用来存放字符串的字符数组时,其数组元素个数要比字符的个数多1,以便存放字符’\0’
2. 字符数组的初始化
关于字符数组的初始化有两种方式:
- 用字符常量初始化数组
注意:
- 如果"{}"中提供的初值个数(即字符个数)大于数组长度,则按语法错误处理
- 如果初值个数小于数组长度,则只将这些字符赋给数组中前面的那些元素,其他字符自动定为空字符(即’\0’)
- 如果提供的初值个数与数组长度相等,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度
- 用字符串常量初始化数组
注意:
- 数组长度必须比字符串的长度(即字符个数)多1,用于存放字符串结束标志"\0"
- 用字符串初始化字符数组时,可以缺省数组长度的定义
- 数组名是地址常量,不能将字符串直接赋给数组名
- 字符串到第一个"\0"结束
3. 字符数组的引用
字符数组元素的引用与数值数组元素类似,即将字符数组的每个元素当成普通的变量来使用
4. 字符数组的输入输出
C语言提供了字符数组输入输出的两种方法:
- 逐个字符输入输出
- 整个字符串依次输入输出
其中:
- 格式符"%c"用来逐个输入和输出字符,输入时需要在最后加"\0",输出时以"\0"作为结束标志。
- 格式符"%s"用来进行字符数组的整体输入输出。
- 输入使用字符输入函数getchar()或格式化输入函数scanf()
- 字符数组的输出使用字符输出函数putchar()或格式化输出函数printf()
1. 逐个字符输入输出
- 通过初始化使字符数组各元素得到初值
- 利用格式符"%c"实现单个字符的输入和输出
2. 字符串整体输入与输出
在scanf()函数和printf()函数中用格式符"%s"实现字符串整体的输入和输出
说明:
- 字符数组名是要输入输出的字符串的首地址,不能是数组元素
- 当使用scanf()函数时,输入的字符会依次存放在以字符串首地址为起点的存储单元中,并且自动在末尾加"\0"
- 当使用printf()函数时,将从字符串首地址开始把字符依次输出到屏幕上,当遇到"\0"时停止输出
5. 常用的字符串处理函数
字符串处理函数对应的头文件为"string.h"
1. 字符串输入函数gets()
使用方法:
get(str);
函数功能:从标准输入设备上读入一个字符串(可以包含空格),并顺序存入以str为首地址的内存单元中,最后写入字符串结束标志"\0"
2. 字符串输出函数puts()
使用方法:
puts(str);
函数功能:把字符数组中所存放的字符串从首地址str开始在标准输出设备中输出,直到遇到"\0"为止,并将"\0"转换成"\n",即输出完字符串后换行
3. 字符串连接函数strcat()
使用方法:
strcat(str1, str2);
函数功能:从地址str2起到"\0"为止的若干字符(包含"\0")连接到字符串str1后。str1一般为字符数组且必须定义得足够大,使其能存放连接后的字符串,返回值为str1
4. 字符串赋值函数strcpy()
使用方法:
strcpy(str1, str2);
函数功能:从地址str2起到"\0"为止的额若干字符(包括"\0"),复制到从地址str1其的内存单元内,返回值为str1
注:C语言不允许将字符串用赋值形式赋值给数组名
5. 字符串比较函数strcmp()
使用方法:
strcmp(str1, str2);
函数功能:将str1和str2对应位置上的字符,依次按ASCII码的大小进行比较,直到出现不同的字符或遇到字符串结束标志"\0".如果两个字符串所有字符都相同,则认为两个字符串相等,函数的返回值为0;如果出现不同的字符,则第一个不同字符的ASCII码差值为函数的返回值
6. 求字符串长度函数strlen()
使用方法:
strlen(str);
函数功能:计算出以字符数组为起始地址的字符串的长度,即所含字符的个数(不包含"\0"),并作为函数值返回
6. 二维字符数组
一维字符数组可存放一个字符串,二维字符数组可用来存放若干个字符串