- 数组:按照一定规律排列的具有相同数据类型的变量的集合
- 数组名:对于数组中的若干变量,可以用同一名称来命名
- 下标:各变量在数组中的位置,可以用数组来表示
- 数组元素(下标变量):有了数组名和下标,就可以唯一的表示数组中的某个变量
- 确定性:数组一旦定义,其长度就确定下来,所包含的元素不可更改
- 同质性:数组中的元素可以是任意数据类型,但数组中的所有元素只能是同一种数据类型,不能出现混合类型
- 有序性:数组中的各元素是有先后顺序的,元素的下标即表示它在数组中的位置,且数组中的所有元素在内存中按照这个先后顺序连续存放在一起
当需要多个数据而不想定义过多变量时,可以使用数组来解决问题;通过数组名和下标引用一系列的变量
二、一维数组一维数组是最简单的一种类型,数组在使用前必须先进行定义
1、一维数组的定义-
一维数组的定义方式: 类型说明符 数组名[常量表达式];
-
类型说明符 可以是任一一种数据类型,表示该数组的所有元素的都是该类型;
-
数组名 是用户自定义的数组标识符,其命名规则和定义变量名一样,应符合标识的命名规则;
-
常量表达式 表示数组的长度,即该数组包含元素的个数。例如:
int num[500];
-
-
注意:
- 数组名不能与现有的变量名重复
- 方括号中的常量表达式表示数组元素的个数
- 常量表达式中不能包含变量、其值必须是大于0的正整数
- 若数组初始化,则常量表达式可以省略
除了赋值语句依次对各元素进行赋值以外,为了提高程序的运行效率,可以在定义数组的同时给数组元素赋初值,即数组的初始化
-
初始化的一般形式 :类型说明符 数组名[常量表达式]={值1 ,值2, …, 值n};
- 其中:花括号的数值是依次赋给数组中的每一个元素,各数值用逗号隔开
- 可分为完全初始化和不完全初始化
- 完全初始化:int arr[10]= { 1,2,3,4,5,6,7,8,9,10 }
- 不完全初始化:int arr[10]= { 1,2,3,4,5} 余下的以0填入。
-
注意:
- 花括号里的值的个数不应该超过数组的长度
- 在定义数组的同时使用上述初始化方法方可
- 对数组中的部分元素赋初值:当值的个数小于数组元素的个数,这些值将依次赋给数组中的前若干个元素,剩下的元素赋值为0
数组本质上是一组变量的集合,在使用数组时不能将数组作为一个整体来进行引用,只能对数组中的任意元素进行引用
- 引用数组元素的一般形式:数组名[下标];
- 数组名必须是已经定义过的数组;
- 下标可以是常量、变量或表达式,但其值必须是整型,且下标的范围是0~n-1(n为已定义数组的长度)。例如:
int num[500]; int total; …… total=num[100]+num[200];
其中,num[500]表示num数组包含500个元素;而num[100]和num[200]分别表示数组num中的第101和第201个元素(起始下标为0),并且都为一个整数值。
4、一维数组的一些-
计算数组的大小:数组的大小可以通过计算得到。例如:
int sz = sizeof(arr)/sizeof(arr[0]);
-
一维数组在内存中的存储
-
可知:
- 一维数组在内存中是连续存放的;
- 随着数组下标的增长,地址是由低向高变化的。
-
数组名是什么?
- 数组名是数组首元素的地址。
- 但是又两个例外: - sizeof(数组名) -- 数组名表示整个数组 -- 计算的是整个数组的大小,单位是字节 - &数组名 -- 数组名表示整个数组 -- 取出的是整个数组的地址三、二维数组 1、二维数组的定义
如果一个数组的每个元素也是数组类型,那么这个数组就是多维数组。
当数组元素为一维数组时,该数组即二维数组。
-
二维数组的一般形式:类型说明符 数组名[常量表达式1][常量表达式2];
- 常量表达式1和常量表达式2分别用来表示数组的第一维和第二维的长度
-
为了更好的理解二维数组,可以把一个二维数组a[m][n]看作一个m行n列的矩阵,即将二维数组写成行列组合的形式
例如:
数组:a[3][3]可以看作一个3*3的矩阵: a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2]2、二维数组元素的引用
使用二维数组时不能将其作为一个整体进行引用,只能对数组中的任意元素进行引用;
- 引用二维数组的一般形式:数组名[下标1][下标2];
引用二维数组元素和定义数组的形式相似,但其表达的含义不同。
3、二维数组的初始化- 初始化的一般格式:
类型说明符 数组名[常量表达式1][常量表达式2] = {{值 0 0, …, 值0 n-1},{值1 0, …, 值1 n-1}, …, {值m-1 0, …, 值m-1 n-1}};
例如:
注意:
- 内层花括号的个数对应数组第一维的长度即行数,内层花括号的值的个数对应数组第二维的长度即列数,二者都不能超过上限
- 如果初始化时给出了所有数组元素的值,则可以省略内层的花括号
- 二维数组初始化后,可以省略行,但不能省略列:arr[][4] = {{ 1,2 },{ 3,4 }};
- 对数组中的部分元素赋初值:
- 值的个数小于数组元素的个数,这些值将依次赋给数组中的前若干元素,对于剩余元素,将赋值为0
- 二维数组在内存中的存储
-
可知:
- 二维数组在内存中是连续存放的——每一行内部是连续的,换行也是连续的(这也是为什么列不能省略)
用来专门存放字符的数组称为字符数组
1、字符数组的定义- 字符数组的定义: char 数组名[常量表达式];
- char表示:该数组的所有元素都是字符类型
- 数组名是用户自定义的数组标识符
- 常量表达式用来表示数组的长度
与一维数组元素的引用类似
3、字符数组的赋值形式与一维数组类似
- 注意:
- 空格’ '也是一个字符
- 当花括号中字符的个数超出数组长度,系统显示内存溢出
- 花括号中字符的个数小于数组长度,这些字符依次赋给数组中的前若干个元素,对于剩余元素,系统自动赋为空字符(‘ ’)
- 二维字符数组的赋值方法和数值型数组类似
在C语言中,没有专门的字符串变量,但可以将字符串作为字符数组来处理,即用一个字符数组来存放一个字符串。例如:
char a[10]={"hello"};
char a[10]="hello";
以上两种写法完全等价;此外用字符串进行赋值时也可以不指定字符数组的长度。例如:char a[]="hello"
注意:
- 采用字符串赋值得到的数组a比采用单个字符逐个赋值得到的数组a的长度多1个字节,最后会添加一个空字符(‘ ’)来 作为结束标志
- char a[10]="Hello !";会丢失’!',需要特别注意
单个字符的输入输出通过格式符 “%c”,字符串的输入输出通过格式符 “%s”;
***例五:***输入一个字符串并原样输出
#includevoid main() { char c[15]; printf("请输入一个长度不超过15的字符串:n"); scanf("%sn", c); printf("输入的字符串是:%sn", c); }
对于上述注意事项:
- 对于一个字符数组,如果不做初始化赋值,则必须在定义时指明数组的长度
- scanf()函数的各输入项前必须有地址符”&“,C语言规定,字符数组名即代表了该数组的首元素的地址,因此在字符数组名c前面不能加地址符”&“
- 当用scanf()函数输入字符串时,由于scanf()函数将空格解释为多个输入变量的分隔符,所以字符串中不能含有空格,否则将以空格作为字符串的结束符
在指针章节详解



