回顾C语言(五):数组1
一、什么是数组?
数组是存放相同类型元素的集合。其意义在于集合化存储和引用同类型的数据,比如说:班里有60名学生,我们需要统计这60名学生的数学成绩,按照此前所学的内容,我们需要定义60个int 类型的变量(假设成绩不保留小数),要使用数组的话我们只需要定义一个长度为60的数组就行。
二、数组的特点
- 存放相同类型的若干个元素
- 元素的地址空间是连续的
- 数组名就是一个地址,它是数组首元素的地址(此时以数组元素为单位来描述),也是数组的地址(此时把数组看作一个整体要加上取地址符‘ & ’)
三、数组的分类
四、数组的定义
1、一维数组的定义
(1)定义方式: 数据类型 数组名[长度]; // 数组名和普通变量名一样命名要符合规范,
类型含义:int arr[10];
变量名:arr
数组的类型: int [10]
数组元素的类型:int
例如:int a[5]; // 定义了一个名为a 长度为5个int大小的数组,由于该数组是int类型,int类型的占4个字节,因此数组里的每个元素占4个字节,整个数组占20个字节。
其中
char 、int、double、float、结构体、指针
命名要符合变量名规范
-
[长度];
数组的长度:必须常量或者常量表达式,必须得是确定得 整型或字符型、常量符,不能是变量、浮点型。
例:
int a[10]; 对
int a[2.5]; 错!
int a[‘c’]; 对
int i = 4; int a[i]; 错!
int a[1+2]; 对
#define N 10
int a[N]; 对
(2)一维数组的初始化
数组一定要进行初始化,不然里面元素值会是随机值,容易引起bug;
char a[5] = {‘a’,‘x’,‘c’,‘f’,‘g’}; // 是完全赋值;我们自己给数组中的每个元素都赋了值。
char a[5] = {‘a’,‘x’}; //是部分赋值; 元素a[0] = ‘a’ , a[1] = ‘x’ , 至于数组的其他元素操作系统自动赋值为NULL(ascii值零)
注意1: 数组定义时赋值必须是连续赋值,不能间隔赋值,如:错误示范:int arr[5] = {1,3,4,5}; 正确示范:int arr[5] = {1,3,3,4,5}; 或 int arr[5] = {1,3};
注意2: 定义时赋值,相邻元素要用逗号隔开,第一个元素之前和最后一个元素之后不要加逗号。字符型赋值要加单引号 ‘ ’ ,整型和浮点型则不用加。
不声明数组长度直接定义后赋值
int a[] = {2,3,4,5}; // 在整型和浮点型情况下元素的个数即为数组长度,所以int a[] = {2,3,4,5}; 等同于int a[4] = {2,3,4,5};
字符数组则有所不同
方式一:
char str[] = {‘a’,‘b’,‘c’}; // 这种情况下字符数组的长度就是字符元素个数,所以此时char str[] = {‘a’,‘b’,‘c’}; 等同于 char str[3] = {‘a’,‘b’,‘c’};
方式二:
char str[] = “abcdefg”; 和 char str[] = {“abcdefg”}; // 字符型数组这两种赋值(字符串赋值)形式功能完全相同,这种情况下数组的长度是字符数加 1,因为操作系统会在该字符串末尾多加一个字符 ‘\0’ ,也就是说: char str[] = “abcdefg”; char str[] = {“abcdefg”}; char[8] = {‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,’\0’}; 这三 种形式是一个含义。
注意3: 字符数组进行字符串赋值时,其数组长度是字符数加1,因为操作系统在字符串末尾多加了一个字符 ‘\0’
注意4: 数组在定义时必须要有确定的长度,这个长度可以在定义时由我们自己声明(如:int[3];),或者定义时赋值由操作系统声明(如:int[]={3,2,3};),其实就是确定了操作系统要给数组分配的内存空间的大小。
-
定义后赋值
数组定义后只能进行单元素赋值,例如:
int a[4]; //定一个一个长度为4的int数组
a[4] = {1,2,3,4}; 错误! // 这里有两点错误:一,数组在定义后不能进行多元素赋值。二、数组定义后数组名加下标表示数组内的一个元素,又因为数组的下标从零开始因此该数组的四个元素分别为: a[0] , a[1] , a[2] , a[3] 所以就是按单元素赋值它也是错的。PS: 数组的长度为n,则其下标范围是 0 ~ n-1 ;
2、一维数组元素的引用
- 数组必须先定义后使用
- 只能一个元素一个元素的引用,不能一次引用整个数组。
- 在使用时 数组名[ 下标] : 下标 可以是整型/字符型 常量/ 变量,它们的值是整数
- 数组下标的含义是:距离首元素的偏移量
- 数组下标范围是 0 ~ n-1 ; n代表数组的长度
例:int arr[5] = {3,2,4,53,9};
还可以通过循环对数组元素进行引用:
用sizeof计算数组的长度:
数组的长度 = 数组的类型大小/元素的类型大小
sizeof(arr) 的参数是数组名,则计算的是整个数组的长度,如果参数是元素则计算的事元素的类型
存中…(img-c89bhAk8-1637495918512)]
用sizeof计算数组的长度:
数组的长度 = 数组的类型大小/元素的类型大小
sizeof(arr) 的参数是数组名,则计算的是整个数组的长度,如果参数是元素则计算的事元素的类型
数组的长度 = sizeof(arr)/sizeof(arr[0]);
2、二维数组
1、定义
定义一般形式: 数据类型 数组名[行数][列数]
二维数组的元素数 = 行数*列数
参照一维数组,二维数组的行数和列数,必须是常量或者常量表达式,必须得是确定得 整型或字符型、常量符,不能是变量、浮点型。
其逻辑结构相当于一个矩阵的形式如图所示:
2、二维数组初始化
二维数组具有一维数组所有的特点,定义时初始化(完全赋值、部分赋值),定义后初始化;
定义时初始化
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; // 完全初始化
int a[3][4] = { {0,1,2,3},{4,5,6,7},{8,9,10,11} }; // 完全初始化,我们一般使用这种方式,便于区分元素的位置,这种定义方式和上一行的作用完全相同。
int a[3][4] = {0,1,2,3,4,5,6,7,8,9}; // 部分初始化 等同于 int a[3][4] = { {0,1,2,3},{4,5,6,7},8,9};
int a[3][4] = { {0,1,2,3},{4,5,6,7} }; // 部分初始化
3、二维数组的引用
形式: 数组名[行标][列标]
例如:int a[3][3]={
{1,2,3},
{4,5,6},
{7,8,9}
};
1 == a[0][0] , 9 == a[2][2]
最方便的是用双重for循环:
关于对二维数组的理解
如下图所示,我们可以把二维数组里的每一行作为一个整体当做一个元素来理解,在这样的理解方式下二维数组的元素是一维数组,此时a[0]、a[1]、a[2]是每个一维数组的首元素地址,我把它称为伪元素,此时元素的大小为int[4],有三个元素,它的特点完全等同于一维数组。实际上二维数组的真实元素是 int,有3*4(行数*列数)个元素。