C语言-一维数组和二维数组,包括动态一维数组和二维数组声明和使用
数组是一种数据格式,能够存储多个同类型的值,一位数组可以用来实现线性表的顺序存储,哈希表等,二维数组可以用来保存图的邻接矩阵等。
一维数组的声明
一维数组声明赢指出一下三点:
- 存储在每个元素的值的类型,如,int,float,可以是复合类型
- 数组名
- 数组中的元素数,数组的元素数必须用值大于等于1的常量表达式定义;
注意:
数组定义中的类型不能是引用,即没有引用数组,这是因为引用是不能赋值的,而数组中的元素必须可以被赋值
定义数组a的引用:
int a[5] = {1, 2, 3, 4,5};
int (&p)[5] = a; //p是a的引用
一维数组的初始化
在定义数组时,为其元素提供一组用逗号分隔的初值,这些初值用花括号{}括起来。 初始化分为5种情况:
- 不初始化
- 全初始化
- 部分初始化
- 满初始化
- 不指定大小初始化
下面是实例:
int array_one[5]; //不初始化
int array_two[5] = {1, 2, 3, 4, 5}; //全初始化
int array_three[5] = {1, 2,}; // 部分初始化,其他默认补0
int array_four[5] = {1, 2, 3, 4, 5, 6, 7}; //满初始化,c语言不进行越界检查,不建议这样使用
int array_four[] = {1, 2, 3, 4, 5}; //不指定大小初始化
一维数组的遍历
数组是通过下标来遍历的,下标从0开始。
#include <stdio.h>
int main()
{
int array[5] = {2, 4, 6, 8,10};
for(int i=0; i<5; i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
输出结果:
2 4 6 8 10
一维数组动态声明
当数组的大小未知时候,需要动态声明一维数组,声明格式如下:
int a = new int[n];
数据使用完毕,使用:
delete []a;
来释放内存空间
二维数组的声明与初始化
二位数组是最常用的高维数组,一维数组可以看成是一行数据,二位数组像是一个表格,有行和列。
二维数组初始化分成两种:
- 按行初始化
- 顺序初始化
// 行初始化
int ia[3][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11},
};
//顺序初始化
int ib[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
行初始化可以省略某些数字,其他填充0
int ia[3][4] = {
{0, 1},
{4, 5, 6},
{8},
};
等价于
int ia[3][4] = {
{0, 1, 0, 0},
{4, 5, 6, 0},
{8, 0, 0, 0},
};
在C++中规定,声明和初始化一个二维数组是,如果对二位数组的所有元素都赋值,第一维可以省略,如
int array[][3] = {1, 2, 3, 4, 5, 6};
相当于:
int array[2][3] = {1, 2, 3, 4, 5, 6};
行优先存储和列优先存储
本质上,所有的数组在内存中都是一位线性的,不同语言采用的存储方式不同,有的采用行优先存储,有的采用列优先存储; 行优先存储指在内存中,先将二维数组的第一行按顺序存储,接着第二行,第三行… 列优先存储指在内存中,先将二维数组的第一列按顺序存储,接着第二列,第三列… 在C/C++中,二维数组是按行优先顺序存储的
二维数组的动态声明
int **a = new int* [m];
for (int i = 0; i<m; i++)
{
a[i] = new int [n];
}
相当于产生了一个二维数组a[m][n]。
使用后,用:
for(int i=0; i<m; ++i)
{
delete []a[i];
}
delete[] a;
来释放空间
欢迎关注我的微信公众号: