数组的定义
数组用于表示一组数值,例如:
char arr[5];
其中,arr称为"数组变量",简称"数组"。它表示5个char型数据,我们把每一个数据称为一个"元素"。
数组的定义中包含以下几个要求:
- 元素类型:上例中元素类型为char
- 元素的个数:中括号内指定个数,例如上面的数组长度为5
- 数组的名称:上例中数组的名称为arr
数组的意义是把N个同类型的变量排列在一起,比如对于char arr[5]就是说把5个char排名在一起
定义基本类型的数组,例如:
#include <stdio.h>
int main() {
char alpha[10]; // 10个char类型元素
short years[20]; // 20个short类型元素
int numbers[30]; // 30个int类型元素
float scores[3]; // 3个float类型元素
double values[12]; // 12个double类型元素
return 0;
}
数组的命名
- 数组的命令规则和变量名的规则相同,即"数字、字母、下划线的组合,但不能以数字开头
- 首先,变量的名字要符合其意义,这要求我们在命名时要能做到"词能达义,顾名思义",不要给变量起一个不相关的名字
- 其次,数组变量的名字一般使用小写字母,如果由多个单词组成,则中间以下划线分开
注:你可以较为随意的定义一个变量名,但是这样"随意"地写代码,会使代码难以阅读,"可读性"降低,因此建议按照推荐的方式来给变量命名
数组的长度必须是常量
- 数组的长度在中括号内指定,必须是一个整型常量,例如:
int arr[12];
// 下面的定义是错误的
int size = 12;
int arr[size]; // 编译器会报错,数组长度必须是常量
数组的基本方法
数组的初始值
在定义数组的时候可以指定每一个元素的初始值,例如:
char arr[5] = {90, 91, 92, 93, 94};
其语法要素为:
- 使用大括号,大括号末尾加上分号
- 大括号内指定初始值,每个初始值以逗号隔开,但最后一个数组末尾不加逗号
一些特殊的写法
char arr[5]; // 定义了一个长度为5的char型数组,不指定初始值
char arr[5] = {90, 91}; // 只指定前2个元素的初始值
注意:这种写法只能按顺序从前往后定义
_
如果在定义的时候只能给出后面的几个元素的值,则必须手动把前面的元素设置一个初始值,例如:
char arr[5] = {0, 0, 0, 90, 91}; // 只知道后2个元素的值,就先把前三个用0来占位
中括号的长度可以省略不写,当不写长度时,编译器会根据初始化列表中的元素的个数来计算其长度
char arr[] = {90, 91, 92, 93}; // 中括号没有写明长度,编译计算得到其长度为4
char arr[5] = 0; // 则等于 char arr[5] = {0, 0, 0, 0, 0};
访问数组元素
利用数组名加中括号可以访问数组中的所有元素,中括号内的数值表示元素的位置(称为"下标"或"索引")。元素的下标从0开始计算,这意味着第一个元素使用value[0],第二个元素使用value[1] ... 以此类推
例如,下面的代码用于对5个元素求和
获取数组的大小
数组的大小由元素的类型和元素的个数共同决定,例如:
数组的内存视图
每一个变量都会绑定一块内存区域,修改变量的值实质上就是修改对应内存的值,对于数组来说,它也是变量,而且相当于若干个基本变量排列在一起,那么数组在内存视图角度来看,是直接对应了若干个内存单元
定义一个short
#include <stdio.h>
int main() {
// 由于一个short类型占2个字节,所以4个short占8个字节的内存,在内存中,a[0],a[1],a[2],a[3]可以视为连续排列的8个short型变量
short a[4] = { 0x1111, 0x2222, 0x3333, 0x4444 };
return 0;
}
注:在VC的调试状态下的"内存"窗口中,可以直接观看数组a对应的内存,如下图所示,方框线内的8个字节就是数组a所占据的内存,其中 "11 11"是a[0], "22 22"是a[1], "33 33"是a[2], "44 44"是a[3],可以很直观的看到,它们是紧密排列的
数组常见问题
#include <stdio.h>
int main() {
int values[5] = { 1, 2, 3, 4, 5, 6 }; // 这样写是错的,初始化列表的长度不能大于数组长度
return 0;
}
#include <stdio.h>
int main() {
int values[5] = { 1, 2, 3, 4, 5 };
values[5] = 123; // 越界了
// 上面的代码编译器检查不出来,运行的时候会报错
return 0;
}
#include <stdio.h>
int main() {
// 这样写是对的
int arry[4] = { 1, 2, 3, 4 };
// 这样写是错的
// int arry[4];
// arry = { 1, 2, 3, 4 };
//只能够对单个元素赋值
arry[0] = 1;
arry[1] = 2;
arry[2] = 3;
arry[3] = 4;
return 0;
}
多维数组
1、二维数组的定义
type name[N1][N2],其中,type是元素类型,name是数组变量的名称,N1是第一维的大小,N2是第二维的大小
可以用行和列的概念来理解二维数组,第一个下标是行号,第二个下标是列号,例如:
// 创建一个4*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]
a[3][0] a[3][1] a[3][2]
至于3维数组、4维数组以至于N维数组,都可以用类似的方法得到,高维数组不常用
2、二维数组的初始化
二维数组和一维数组的初始化方法类似,都是用大括号初始化,由于是二维,所以需要用两层大括号来分别初始化每一行
例:对一个4行3列的数组进行初始化
#include <stdio.h>
int main(){
int a[4][3] =
{
{ 11, 12, 13 },
{ 21, 22, 23 },
{ 31, 32, 33 },
{ 41, 42, 43 },
}
}
3、二维数组的本质
二维数组、三维数组、四维等高维数组,只是在形式上比一维数组更直观更容易操作,其本质仍然是一维数组,可以从内存中看出这个结论
比如:对于int a[4][3],在内存中对应连续的12个int:a[0][0],a[0][1],a[0][2],a[0][3]...a[4][3],内存图如下
注:实际上,二维数组在内存中还是以一维数组的形式存在的,只不过是编译器帮忙把咱们能看的懂得二维数组转换成了一维数组