含义:有序数据的集合(这些数据之间存在内在联系,具有相同属性)
数组中每个元素具有相同的数据类型
1、定义一维数组
比如: int a[10] 类型符 数组名[常量表达式]
这样便向计算机申请了10个能存储整型数据的【连续】内存空间;强调:在计算机中,这些内存空间是连续的
1)定义数组时[ ]中只能是常量或常量表达式 int a=10; int b[a]; //错误
#define N 10 int b[N] //正确 (#define为预处理,在编译之前完成)
2)在被调函数中(自定义函数)定义数组,其长度可以是变量
void max(int n)
{ int a[n]; }//在max函数中定义了一个有n个元素的数组,n由实参传递进来
2、引用一维数组
先定义一个数组: int a[10]={0};
引用形式:
1)数组名[下标]; a[0]代表第1号元素
2)数组名 a 是数组首元素的地址 a+1表示元素a[1]的地址
*a是取首地址里的值,同理 *(a+1)是取a[1]的值
3)指针 int *p=a;//定义一个和数组数据类型相同的指针 并让p指向数组的首地址
p+1则表示a[1]的地址,*(p+1)是取a[1]的值
同理 p[1]也可以引用a[1]元素的值
从上面就可以看出数组名的实质就是指针,只不过是常指针,意思是这个指针是一个常量
3、一维数组初始化
1)定义式初始化:int a[10]={1,2,3,4,5,6,7,8,9,10};
也可以只初始化一部分,其他会自动初始化为0;比如:int a[10]={1,2,3};
在定义时不指定数组长度:int a[ ]={1,2,3,4,5,6,7,8,9,10}; //表示这个数组中有10个元素
————|||||||||||||||||||||————————||||||||||||||||||||||||||————————|||||||||||||||||||||||||||||||——————————||||||||||||||||||||||||||||||||————————|||||||||||||||||||————
二维数组
1、定义二维数组
类型说明符 数组名 [常量表达式][常量表达式]
可以这样理解:二位数组可以看成是一种特殊的一维数组,只不过它的元素又是一个一维数组
比如:int a[4][3];
1)a是二维数组名,对a+1则表示特殊一维数组的下一个元素
a---------------->a[0],a[1],a[2],a[3](这里a[0],a[1]…的意义也是指针)
2)a[0]是一维数组名,对a[0]+1,加的是一个int 字节的元素
a[0]------------->a[0][0],a[0][1],a[0][2](这里a[0][0],a[0][1]表示的是元素)
a[1]------------->a[1][0],a[1][1],a[1][2]
a[2]------------->a[2][0],a[2][1],a[2][2]
2、内存分布:和一维数组相同,二维数组的内存分布也是连续的内存空间
二维数组中的元素排列的顺序是按行存放的,意思是:在内存中先顺序存放第一行的元素,紧接着存放第2行的元素(线性存放)
3、引用二维数组的元素(略)
4、二维数组的初始化
分行赋值
int a[3][2]={{1,2},{1,2},{1,2}};
可以只对部分元素赋值
int a[3][2]={{1}.{1,5},}; //对第一行的第一个元素,第二行的全部元素赋值
5、二维数组名也是一个常指针
int a[3][2];
a是指向数组的第一个特殊元素(前面说过二维数组是一个特殊的一维数组,它的元素是一个一维数组)
所以该数组名的指针类型是指向含有m个元素的一维数组的指针
int (*p)[2]=a;
p+1 相当于a+1
详见二维数组名和指针辩析