前言
在实际运用中,最常见的数组包括一些一维数组和二维数组, 它们是同一种元素的集合,主要用于处理同类型的批量数据。
一、一维数组
1. 一维数组的定义
一维数组的定义方式:类型说明符 数组名[常量表达式] ;如果要使用数组,必须先告诉计算机:这些元素的数据类型,有多少元素,即数组的定义。例如下面:
#define N 10
int main() {
//例1
int a[10];
//例2
float b[N];
//例3
int n = 10;
char c[n];
return 0;
}
数组定义时下标引用符内不可为变量,例1定义了具有十个元素的整型数组,例2定义中用了宏常量本质,而例3就出问题了n为变量,编译器就会报错。注意:常量表达式必须为正整数。
2. 一维数组的初始化
在定义数组的时候,就给数组元素赋初值,称为数组的初始化。
//初始化一个int型的数组
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
//未赋值的元素默认为0
int d[10] = { 1,2,3,4,5 };
//定义时直接赋值可以省略数组长度,数组长度为数组元素个数
float b[] = { 1.4,2.5,3.5,4.4,5.8,6.6,7.1,8.9,9.1,10.0 };
//以下都为字符数组的定义方式
//此方式初始化后无'\0'
char f[3] = { '1','2','3' };
//字符数组初始化时因为为字符串形式末尾自动添加'\0'
char c[3] = "12";
由此可以看到为赋值的元素全被赋0。
3. 一维数组的引用
引用方式: 数组名[元素下标];
int main() {
int b[10] = { 1,2,5,5,4 };
int i;
for (i = 0; i < 10; i++)
printf("%d ", b[i]);
return 0;
}
注意:1. 此时元素下标可以为变量。
2. 下标元素从0开始到数组长度减1。
3. 不要下标越界。
4.一维数组在内存中的存储
我们可以输出整个数组元素的地址来观察一下。
挨地址输出之后 ,我们可以发现每个数组元素的地址相差4个字节,是一个整型所占的内存大小,所以得出结论:数组元素在内存中从低地址到高地址连续存放。
根据这一特点我们可以使用sizeof来计算数组的长度:
int a = sizeof(b) / sizeof(b[0]);
//数组的总字节数除以单个元素的字节数即为数组长度
二、二维数组
前面提到有的问题需要用到二维数组数组来解决,二维数组常称为矩阵,把二维数组写成行和列的排列形式,可以形象化的理解二维数组的结构。
1. 二维数组的定义
二维数组的定义方式: 类型说明符 数组名[数组行长度][数组列长度];
例如: int a[3][4]; 这条语句就定义了一个3行4列的二维数组。
和一维数组一样二维数组在定义时,行长度和列长度都只能为常量表达式,不可以为变量。
根据二维数组在内存中的存储来看,二维数组 各个元素与一维数组一致是连续存储,可以将二维数组看为特殊的一维数组,他的元素分别又是三个一维数组。二维数组在c语言内存中元素排列的顺序是按行存放的,在内存中先顺序排放第一行的元素接着第二行。
2. 二维数组的初始化
二维数组初始化时可以省略行标,不可以省略列标。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[3][4]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
int a[3][4] = { {1,2,3},{1} };
int a[][4] = { 1,2,3,4,5,6 };
以上两种初始化方式,第一种为第一个花括号内为第一行元素,第二个花括号内为第二行元素,元素数不足列数的话,后面元素为0。第二种则为自动化分,不足后面元素为0。
3.二维数组的引用
引用方式: 数组名[行元素下标][列元素下标]; 下标范围与一维数组判别一致。
感谢大家的观看!