数组的基本操作
- 数组的概念
- 一维数组
- 二维数组
数组的概念
在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式集合在一起,这些按序排列的同类数据元素的集合称为数组。
在C语言中,数组属于构造数据类型,一个数组可以分解为多个数组数组元素,这些数组的元素可以是基本数据类型或构造数据类型。因此按数组元素的类型不同,数组可分为数值数组、字符数组、指针数组、结构数组
等各种类别。
注:
1)数组中的元素的内存地址是连续的
2)同一个数组所有的成员都是相同的数据类型
一维数组
1) 语法:
数据类型 数组名[常量表达式]
- 数组名的命名规范必须满足“标识符的命名规范”
- 方括号中的常量表达式就是数组的长度,也就是数组中存储元素的个数
例如:
int a[10]
:说明数组是整型数组,有10个元素。
float b[10],c[20]
:说明数组是实型数组,数组b,有10个元素;数组c,有20个元素。
char ch[20]
:说明数组是字符数数组,包含20个元素。
2) 一维数组的初始化
定义一个数组时,需要进行初始化的操作,如果不进行初始化,则数组的内容为随机值。给数组的赋值除了用赋值语句对数组元素逐个赋值外,还可以采用初始化赋值和动态赋值(这里涉及到指针,后面会进行讲解)的方法。
- 逐个赋值法代码如下:
int main(){
// 定义一个数组,不进行初始化
int a[5];
a[0] = 1;
a[1] = 2;
a[3] = 3;
a[4] = 4;
return 0;
}
- 初始化赋值法代码如下:
int main() {
// 定义一个数组,同时初始化所有成员变量
int a[6] = {1, 2, 3, 4, 5, 6};
// 初始化前三个成员,后面的所有元素都设置为0
int b[6] = {1, 2, 3};
// 所有的成员设置为0
int c[6] = {0};
// []中不定义元素个数,定义时必须初始化
int d[] = {1, 2, 3, 4, 5};
// 如果数组定义元素个数,如果不进行初始化,内容为随机值
int e[3];
// 输出为 0 0
// 并没有进行初始化
printf("%d %d",e[1],e[2]);
return 0;
}
3) 使用下标访问数组中的元素
- 下标的值必须为整型常量/变量
- 下标的值从0开始到【数组长度(定义的数组常量)-1】结束
注: 如果使用的下标值大于或者等于数组长度,程序仍然可以编译通过,但是运行的结果时未知的。
代码如下:
int main(){
// 定义一个数组,不进行初始化
int a[5] = {1,2,3,4,5};
// 对数组中的元素
for(int i = 0;i<5;i++){
printf("%d",a[i]);
}
// 最后一个元素的下标为4
// 此时我们取出超过数组长度的值
printf("%d",a[5]); // 输出 32758
return 0;
}
下面我们来看以下这张图就知道为什么我们会输出这个值:
由此图可以看出我们内存是由高地址到地址进行排列,并且在内存中每个位置都有可能存储着相应的值,这是未知的。所以当我们取的值超出了数组范围,此时会调用我们内存中的未知值,所以输出了32758。
二维数组
1)语法 :
数组类型 数组名[常量表达式1][常量表达式2]
- 我们可以将二维数组当作一个有行有列的二维矩阵
- 常量表达式1代表矩阵的行数
- 常量表达式2代表矩阵的列数
- 二维数组可以理解为由”常量表达式1“个一维数组组成的
例如:
int a[3][4]
:可以表示为一个3行4列的二维数组,数组中的元素类型为int类型。
2)二维数组的初始化
二维数组的初始化跟一维数组的初始化相差不大,并且他的存储方式跟一维数组的存储方式是一样的,他的赋值方法也有逐个赋值和初始化赋值。
- 逐个赋值代码如下:
int main(){
// 定义一个二维数组,不进行初始化
int a[2][2];
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;
return 0;
}
- 初始化赋值代码如下:
int main(){
// 定义一个二维数组,进行分段赋值
int a[2][2] = {{1,2},{3,4}};
// 连续赋值,这里根据数组定义的行列进行自动分配
int b[2][2] = {1,2,3,4};
// 部分赋值,只给部分
// 行列不够,用0来凑
int c[3][3] = {1,2,3};
// 输出第3行3列的元素
printf("Output position 3 hang 3 lie: %d",c[2][2]);
// 0值初始化
int d[2][2] = {0};
// 不指定行数
// 此时会根据数组的列数进行自动计算行
int e[][2] = {1,2,3,4};
// 需要注意的是不能不指定列数
// 如果不指定列数,那么数组就不能确定到底是有多少列
// 他的情况就有很多种
// 不指定将无法进行初始化,程序会报错
// int f[3][] = {1,3,3,43,4,};
return 0;
}
3)使用下标进行数组元素的访问
- 行列下标的值必须为整型常量/变量
- 列下标的值从0开始到【数组长度(定义的数组常量)-1】结束
- 行下标的值从0开始到【数组长度(定义的数组常量)-1】结束
注: 如果使用的下标值大于或者等于数组长度,程序仍然可以编译通过,但是运行的结果时未知的。
代码如下:
int main() {
// 定义一个2行2列的二维数组
int a[2][2] = {{1, 2},{3, 4}};
// 访问第3行第1个元素
printf("%d",a[2][0]); // 98564384
return 0;
}
他的取值方式跟一维数组的操作方式实际上是差不多的,也是超出了数组的长度,程序不会报错,但是返回的值是未知的。