C语言-一维数组和二维数组,包括动态一维数组和二维数组声明和使用

数组是一种数据格式,能够存储多个同类型的值,一位数组可以用来实现线性表的顺序存储,哈希表等,二维数组可以用来保存图的邻接矩阵等。 一维数组

一维数组的声明

一维数组声明赢指出一下三点:

  1. 存储在每个元素的值的类型,如,int,float,可以是复合类型
  2. 数组名
  3. 数组中的元素数,数组的元素数必须用值大于等于1的常量表达式定义;

注意:

数组定义中的类型不能是引用,即没有引用数组,这是因为引用是不能赋值的,而数组中的元素必须可以被赋值

定义数组a的引用:

int a[5] = {1, 2, 3, 4,5};
int (&p)[5] = a;		//p是a的引用

一维数组的初始化

在定义数组时,为其元素提供一组用逗号分隔的初值,这些初值用花括号{}括起来。 初始化分为5种情况:

  1. 不初始化
  2. 全初始化
  3. 部分初始化
  4. 满初始化
  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;

来释放内存空间

二维数组的声明与初始化

二位数组是最常用的高维数组,一维数组可以看成是一行数据,二位数组像是一个表格,有行和列。 二维数组 二维数组初始化分成两种:

  1. 按行初始化
  2. 顺序初始化
// 行初始化
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;

来释放空间

欢迎关注我的微信公众号: QR-code