相同点:都是一种能存储类型相同的对象的容器。
不同点:数组的存储对象的大小是确定的,且一旦确定,后续不能超过所定大小的容量,而vector是可以随意添加元素的。
2. 定义int A[d]; :A是数组名,d是数组所存储的维度即容量大小,注意:因为维度必须已知,所以d只能是常量表达式。一般来说d是无符号整型,C/C++,定义了新的类型size_t,它是一种机器相关的无符号类型,被设计的足够大,以便于能够表示内存中任意对象的大小,其在C++中定义在头文件#include
size_t d=10; int A[d]; //err 因为d不是常量表达式 const size_t d=10; int A[d]; //true constexpr size_t d=10; int A[d]; //true int A[10*2-10]; //true3. 初始化
与内置类型一样,在函数体内部定义的数组,没有进行初始化的话,所有的值都是未确定的,在函数体外部定义的数组,数组元素的值都默认初始化,比如:是int类型则初始化为0,string类型则初始化为"",等等。其余,一般初始化方式如下:
int A[4]{0,1,2,3};
int A[4]={0,1,2,3};
int A[4]={0,1,2}; // 0,1,2,3,0
string A[3]={"a","b"}; // a,b,""
char A[3]="ab" //ab
注意:
- 如果初始化的长度小于数组定义的长度的话,则未初始化的值将进行默认初始化。
- 字符数组的初始化,如果没有显式的写出空白字符则需要为空白字符留一个位置。如:
const char ok[3]="abc"; //err 没有为空白字符留位置,因为空白字符也占一个位置 const char ok[3]="ab"; //true4. 存储指针的数组、数组的引用、数组的指针
int arr[10]; int *ptr[10]; //存放指针的数组 int (*ptr)[10]=&arr; //指向arr的数组,注意:他们的容量必须是一样的 int (&ptr)[10]=arr; //arr数组的引用 int *(&ptr2)[10]=ptr; //存放指针的ptr数组的引用 int (*(&ptr2)[10]=ptr; //err,不存在这样的数组,因为,这是指向ptr的引用的数组,但引用不是一个对象,所以不能这样。
建议:阅读数组的复合操作时,从内往外读,如最后一个,先读括号里面的,&ptr2得它是一个引用,然后读*(&ptr2)得它是一个存放指针的数组。
5. 访问数组一般使用范围for语句来访问数组
constexpr size_t d=3;
int A[d]{0,1,2};
for(auto &c:A)
{
c=10;
}
6. 标准库中的begin()和end()函数
定义在头文件#include
constexpr size_t k=3;
int A[k]={0,1,2};
int *b=begin(A);
int *e=end(A);


![[C++] 数组 [C++] 数组](http://www.mshxw.com/aiimages/31/1033956.png)
