这篇主要将的是数组的简单概述和使用的注意事项
由于字符数组是我们常用的一种数组,所以我会单独出一篇关于字符数组的
指针也比较重要,所以也要单纯出一篇
数组概述
数组
- 构造数据类型之一
- 数组是具有一定顺序关系的若干个变量的集合,组成数组的各个变量称为数组的元素
- 数组中各元素的数据类型要求相同,用数组名和下标确定。数组可以是一维的,也可以是多维的。
一维数组
一维数组的定义
- 所谓一维数组是指只有一个下标的数组。它在计算机的内存中是连续存储的。
- C语言中,一维数组的说明一般形式如下:
<存储类型> <数据类型 > <数组名>[<表达式>] - 数组名表示内存首地址,是地址常量sizof(数组名)是数组占用的总内存空间
- 编译时分配连续内存内存字节数=数组维数*sizeof(元素数据类型)
int main(){
int a[6], i;
for(i = 0; i < 6; i++)
printf("%p\n", &a[i]); //%p表示指针地址,打印可见地址是连续的
printf("%p\n", &a); //数组名a即为首地址
printf("%d\n", &sizeof(a)); //a的大小
return 0;
}
注意事项
- C语言对数组不作越界检查,编译时不会报错,使用时要注意
int a[5]; a[5] = 10; //编译不报错,运行报错
一维数组的引用
- 数组必须先定义,后使用
- 只能逐个引用数组元素,不能一次引用整个数组
- 数组元素表示形式:数组名[下标]
其中:下标可以是常量或整型表达式
一维数组的初始化
-
初始化方式:在定义数组时,为数组元素赋初值
int a[5]={1,2,3,4,5}; -
说明
数组不初始化,其元素值为随机数
int main(){
int a[6], i;
for(i = 0; i < 6; i++)
printf("%p %d\n", &a[i],a[i]);
return 0;
}
对static数组元素不赋初值,系统会自动赋以0值
static int a[5];
//等价于:a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0;
只给部分数组元素赋初值
int a[5]={6,2,3};
//等价于:a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0;
int a[3]={6,2,3,5,1}; // 报错(×)
二维数组
二维数组的
实际上我们定义的二维数组在内存中仍然像是一维数组那样连续存储的。可以想象为把一个矩阵一层层伸展铺平。其中行许优先。 比如定义了一个array[3][4],那就指的是定义了一个三行四列的矩阵形状的二维数组,如下图所示。
- 二维数组Array由3个元素构成,即Array[0],Array[1],Array[2]
- 其中每个Array[i]是包含4个元素的一维数组
二维数组定义和初始化
// 可以使用下面的方法来初始化二维数组,也就是直接将二维数组铺平,写成一维数组的形式
int array[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
// 可以使用标准的二维数组的初始化方式
int array[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
//可以不用指明二维数组的行数,但要指明列数
int array[][4];
二维数组的使用
#include<stdio.h>
int main(){
int a[3][4],i,j;
int count = 0;
for(i = 0; i < 3; i++)
for(j = 0; j < 4; j++)
a[i][j]=count++;
for(i = 0; i < 3; i++)
for(j = 0; j < 4; j++)
printf("a[%d][%d] = %d\n", i, j, a[i][j]);
return 0;
}
注意:必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量