数组
数组和指针都可以像标准库的vector 一样顺序地遍历一组数据,然而他们与vector 相比却能更直接地接触到计算机的内存,因此在高效的同时也会有更大的风险。在有了标准库以后,可以用vector 替代数组,所以在一般情况下,推荐使用vector 。
vector 的push_back()操作可以无限的添加元素,因此vector 是动态的,与vector 不同,数组是一种完全静态的数据结构,在初始化的时候要给数组指定大小,并且不能修改。
数组的创建和初始化
vector 在创建的时候需要元素类型和名称两个信息,而vector 的大小可以在初始化的时候指定,也可以不指定。由于数组是静态的,因此一定要为其指定大小,这也称作数组的维度。数组的维度必须像switch 的case后面的表达式那样,是一个在编译的的时候就能确定的整形常量表达式。
数组的创建
#include <iostream>
using namespace std;
//数组的创建
int main()
{
int arr1[2];
const int constNum = 4;
float att2[constNum];
int arr3[constNum + 1];
int num = 5 ;
char arr4[num];
return 0 ;
}
示例中展示了数组的创建。arr1直接使用整型字面量作为数组的大小,这没什么问题;arr2使用 const int,在编译时的值也是确定的;arr3使用了const int和字面量的算数表达式,值也可以确定;最后的arr4由于使用了变量,虽然num初始化和数组初始化之间并没有不确定的改变,但是使用变量就是不合法的。
在上一个例子中,定义了一些空的数组,然而并没有给出数组的元素初始值,因此数组的初始值将会是编译器默认的初始值或着无法预计的随机数值。为了保证程序的确定性可以像vector那样给数组的每个元素分别赋值,也可以使用如下的显示数组的方法,称 初始化列表。
数组的初始化列表
#include <iostream>
using namespace std;
//数组的初始化列表
int main()
{
int arr1[5] = {0, 1, 2, 3, 4 };
int arr2[5] = {0, 1, 2 };
int arr3[] = { 0, 1, 2, 3, 4 };
return 0;
}
例子中可以看出初始化列表的几种方法,在花括号中的数字就是我们按顺序给数组每个元素赋的值。arr1的初始化列表中的值个数与数组大小相等,而arr2中的值个数比数组大小少,在这种情况下没有初始化的元素依然有着默认的值。如果初始化列表中元素个数超出了数组大小,那么编译器会报错。要注意,在最后的arr3 中我们没有给定数组的大小,在这种情况下数组会随着初始化列表的大小而确定。
数组的操作
数组的下标操作与vector的下标操作类似,也会有越界的问题。
数组的下标操作
#include <iostream>
using namespace std;
//数组的下标操作
int main()
{
int arr1[5] = { 0, 1, 2, 3, 4 };
int arr2[5] = { 0, 1, 2 };
int arr3[] = { 0, 1, 2, 3, 4 };
for ( int i = 0; i < 5; i++ )
{
cout << arr1[i] << "";
}
cout << endl;
for ( int i = 0; i < 5;i++)
{
cout << arr2[i] << "";
}
cout << endl;
for ( int i = 0;i < 5;i++ )
{
cout << arr3[i] << "";
}
cout << endl;
return 0 ;
}
运行结果:
数组的下标操作也可以用“arr2 [i] = arr1 [i]”的形式将元素赋值给另一个数组,已达到复制的效果。使用下标操作符赋值单个数组元素也是因为数组不能像vector那样直接用arr1 和arr2这样的数组名称将整个数组内容赋值到另一个数组。vector可以使用“vec1 = vec2”这样的形式赋值,而
“arr2 =arr1”就会产生编译错误。
数组名不能用于赋值
#include<iostream>
using namespace std;
//数组名不能用于赋值
int main ()
{
int arr1[3] = { 0, 1, 2 };
int arr2[3] = { 3, 4, 5 };
for ( int i = 0;i < 3;i++)
{
cout << arr1[i] << " " ;
}
cout << endl;
//数组名不能作为左值直接赋值
arr2 = arr1;
for (int i = 0; i < 3;i++)
{
cout << arr2[i] << " " ;
}
cout << endl;
return 0 ;
}
出现错误的根本原因是数组名不能做做左值,这是因为数组再分配内存的时候不仅大小是固定的,其在内存的位置也是不可修改的,数组名在编译时表示唯一的内存地址,所以不能作为左值被修改。数组是在c语言中已经存在的一个原始类型,因此并不能像vector那样重新定义赋值操作。