数组 |
1.数组的作用
a) 为了解决大量同类型数据的存储和使用,如要统计全校同学的成绩
b) 为了模拟现实问题(有点类似汇编的寻址...),如一个班级根据多少排多少列找到某一同学:a[i][j]
2.数组的缺陷
a) 长度固定,为便利
b) 编程语言对原始数组提供的操作支持太少,像排序、倒置、查找需要自己编写代码
一维数组 |
1.一维数组所具备的特征:
a) 数组中的变量是连续分配内存空间的
b) 所有变量数据类型相同
c) 所有变量所占的字节相同(内存空间大小相同)
2.定义一个含有5个整型元素的数组:
int a [5];
此数组中的5个元素分别是a[0]、a[1]、a[2]、a[3]、a[4],数组中的元素其实就相当于名为a[i]的变量,那么也可以通过scanf()来给元素赋值,scanf(“%d”, %a[i]);或者直接给元素赋值,a[i] = 100;
3.数组的初始化
a) 完全初始化:int a[5] = {1, 2, 3, 4, 5}
b) 不完全初始化:int a[5] = {1, 2, 3} 未初始化的元素自动置0
c) 不初始化:int a[5] 所有元素均为垃圾值
d) 清零:int a[5] = {0}
4.常见错误
a) int a[5];
a[5] = {1, 2, 3, 4, 5};
只有在定义数组时,才能给数组连续整体赋值,在数组定义时a[5]中的5代表的是数组长度,在其它地方代表都是下标即表示数组的第几个元素
b) int a[5] = {1, 2, 3, 4, 5};
a[5] = 100;
a数组最大元素为a[4],超出数组范围
c) int a[5] = {1, 2, 3, 4, 5}
int b[5];
b = a;
把数组a复制给b这么写是错误的,数组名代表的是数组第一个元素的地址
正确写法:
for (int i = 0; i<5; ++i)
{
b[i] = a[i];
}
二维数组 |
1.定义:int a[i][j]; 如 int a[3][4];
这里表示总共有12个元素,可以当成3行4列来看待
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
a[i][j]表示第i+1行,j+1列的元素,因为是从a[0][0]开始计数的
int a[m][n]; 最后一个元素是a[m-1][n-1],即右下面排列右下角位置
2.初始化
a) int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
b) int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
}
3.二维数组的输出
# include <stdio.h>
int main(void)
{
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
};
for (int i=0; i<3; ++i)
{
for (int j=0; j<4; ++j)
{
printf("a[%d][%d] = %-5d", i, j, a[i][j]);
//%-5d表示输出5个光标位,达到排列整齐的目的
}
printf("\n");
}
getchar();
return 0;
}
多维数组 |
实际上,所谓的多维数组并不存在,因为内在是一维线性结构,二维数组、三维数组这些都是逻辑上的说法;
多维数组实际上是一个个小一维数组嵌套形成的新的大一维数组
n维数组是每个元素是n-1维数组的一维数组
如二维数组a[4][3],可以理解成含3个元素的一维数组,每个元素又是一个含有4个元素的小一维数组。