C ++数组


数组是相似对象的集合

我们可以具有整数,字符,字符串,任何用户定义的类型等的数组。由于我们可以在数组中具有任何种类的集合(整数,字符,字符串等),因此以一种通用的方式,我们可以称数组为相似对象的集合。

数组大小固定

声明数组后,我们无法更改数组的大小。 这意味着我们既不能减小数组的大小,也不能增大数组的大小。

数组的元素将在内存中连续分配

当我们创建一个数组时,数组的每个元素将被分配到连续的内存位置。

连续的内存位置意味着紧接在数组的第一个元素之后,第二个元素将出现在内存中。 在第二个元素之后,将出现第三个元素,依此类推。

所有元素都将在存储位置中连续分配。

数组的第一个元素将具有最低的地址,而最后一个元素将具有最高的地址。

数组的元素由索引访问

数组的元素由索引访问。 第一个元素的索引为0,第二个元素的索引为1,第三个元素的索引为2,依此类推。 最后一个元素将具有索引(n-1),其中n是数组中元素的数量。

  • 数组是相似对象的集合吗?
  • 数组的大小固定吗?
  • 数组的元素会在内存中连续分配吗?
  • 索引可以访问数组的元素吗?

如果您对以上所有问题均回答“是”,则数组的定义为

数组是连续存储的相似对象的固定集合,这些相似对象由索引访问

数组声明

数组的声明使用以下语法:

elements_type name_of_array [ number_of elements]

以下是数组声明的一些示例:
//declare an array of 100 elements of the type int
int myIntArray[100];
//declare an array of 5 elements of the type double
double myDoubleArray[5];

声明数组时,内存分配发生在堆栈内存中。 数组的内存布局是连续的。 阵列的标识符(其“名称”)是阵列在内存中的起始地址。 下图可以说明数组double myDoubleArray [5]的内存布局

数组的每个“单元”的大小都是原来的两倍。 您必须记住,数组的编号以0开头,以元素数量– 1结尾。
要使用声明的数组,您必须对其进行初始化。

数组初始化

有几种初始化数组的方法:

    1. 通过在方括号中使用一个语句:

int anotherIntArray[3] = { 1, 2, 5, 7 };
    1. 如果以这种方式初始化数组,则可以在声明中忽略数组的大小:

int anotherIntArray[] = { 1, 2, 5, 7 };

数组的大小将根据元素数自动设置。 该数组的大小为4。

访问数组的元素

直接访问数组的元素。 可以通过使用数组的索引访问元素来完成。

当必须使用数组时,需要访问数组的元素。 可以通过使用括号将元素的索引与数组名称一起使用来完成。 索引是元素在数组中的位置。 换句话说,index是元素相对于数组开头的偏移量。 数组中元素的计数从0开始,因此数组的第一个元素的索引为0。这是内存布局和包含5个double类型元素的数组的索引的示例:

这是在循环中访问数组元素的示例:

//display all values of an array in a loop
for (int i = 0; i < 4; ++i)
cout << "Element with index " << i <<" is "<< anotherIntArray[i] << endl;

该循环使用索引i访问元素。 看一下输出:

索引为0的元素为1
索引为1的元素为2
索引为2的元素为5
索引为3的元素为7

您不能对索引使用负数。 另外,不能使用大于数组大小的索引–1。如果尝试这样做,则将访问位于数组附近的一部分内存。 它会对您的程序产生绝对致命的结果。

将数组传递给函数

您可以将数组传递给函数。 要将数组传递给函数,您只需要将其添加到参数列表中即可。 这是一个简单的函数示例,该函数将数组作为参数:

void passArray(int arr[], int size)
{
	for(int i = 0; i != size; ++i)
		cout << "Array[" << i << "] = " << arr[i] << endl;
}

要使用参数调用此函数,只需将数组作为简单参数传递:
passArray(anotherIntArray, 4);

从函数返回数组

有可能从函数返回数组。 但这是通过使用指针完成的,并在下面进行了讨论 从函数返回指向数组的指针.

多维数组

C ++允许您创建多维数组。 多维数组是一个元素也属于数组的数组。 多维数组的一个简单示例是表示矩阵的二维数组。 在这个数组元素是一维数组。 您必须对多维数组的声明使用以下语法:

elements_type name_of_array [ number_of elements1] [ number_of elements2]… 
[ number_of elementsN]

这是N维数组的声明。 基本上,您将在程序中使用2或3维数组。

2D阵列

2D阵列代表矩阵。 对于数组中的任何元素,方括号中的第一个索引是该元素的行数,第二个索引是该元素的列数。 您可以通过以下方式声明2D数组:

//2d array of ints
int array2D[3][2];

此声明意味着您声明一个包含3行2列的数组。 您可以通过以下方式想象这个数组:

即使它是一个2D数组,但上述数组的内存布局将是连续的:

这是访问二维数组的示例:

//initialize 2D array:
for (int i = 0; i < 3; ++i)
	for (int j = 0; j < 2; ++j)
		array2D[i][j] = i + j;
//display 2d array
for (int i = 0; i < 3; ++i){
	for (int j = 0; j < 2; ++j)
		cout << array2D[i][j] << "  " ;
	cout << endl;

用于显示2D数组的输出:

0 1
1 2
2 3

3D阵列

3D数组是具有3个索引的数组:

//3d array of ints
int array3D[3][5][4];

有几种方法可以想象3D阵列是什么。 我们建议您将3D数组想象成一本书的表,每页上的行和列数相同。 在这种情况下,第一个索引是页面数,第二个索引是页面上的行数,第三个索引是页面上的列数:

3D数组的初始化:

	
for (int i = 0; i < 3; ++i)
	for (int j = 0; j < 5; ++j)
		for (int k = 0; k < 4; ++k)
			array3D[i][j][k] = i + j - k;

3d阵列和所有阵列的内存布局是连续的。

您可以通过以下方式打印此数组:

for (int i = 0; i < 3; ++i){
	cout << "Page #" << i << endl;
	for (int j = 0; j < 5; ++j)
	{
		for (int k = 0; k < 4; ++k)
			cout << array3D[i][j][k] << " ";
		cout << endl;
	}
}

3D数组的输出为:

第#0页
0 -1 -2 -3
1 0 -1 -2
2 1 0 -1
3 2 1 0
4 3 2 1
第#1页
1 0 -1 -2
2 1 0 -1
3 2 1 0
4 3 2 1
5 4 3 2
第#2页
2 1 0 -1
3 2 1 0
4 3 2 1
5 4 3 2
6 5 4 3

如您所见,3D数组是2D数组的数组。