数组是一种类似于标准库类型vector的数据结构,元素储存在连续的存储空间内。
数组与vector的异同
同:数组也是存放类型相同的对象的容器,这些对象本身没有名字,需要通过其所在的位置访问。
异:数组的大小确定不变,不能随意向数组中增加元素。
所以如果不清楚元素的确切个数,请使用vector。
同时数组也是一种复合类型,数组声明形式:a[d],其中a是数组的名字,d是数组的维度。数组中元素的个数也属于数组类型的一部分,编译的时候维度应该是已知的,而且是结果不为0的常量表达式。
和内置类型的变量一样,如果在函数内部定义了某种内置类型的数组,那么默认初始化会令数组含有未定义的值。定义数组的时候必须指定数组的类型,不允许用auto关键字由初始值的列表推断类型,而且数组的元素应为对象,因此不存在引用的数组。
在对数组进行列表初始化时,允许忽略数组的维度。编译器会根据初始值数量计算并推测出来。如果指明了维度,数组元素的数量不应超过维度的大小。假如维度比提供的初始值数量大,则提供的初始值初始化靠前的元素,剩下的元素被初始化成默认值。
注意:不允许一个数组初始化或复制给另一个数组。字符数组有一种额外的初始化形式,我们可以用字符串常量对此类数组进行初始化。使用这种方式时,要注意字符串字面值的结尾处还有一个空字符,这个空字符会像其他字符一样拷贝到字符数组中。如:
char a1[]={'c'}; //没有空字符
char a2[]={'c','\0'}; //维度为2,显示包含空字符
char a3[]="hello"; //自动添加
char a4[6]="daniel" //错误,没有足够空间存放空字符
数组的声明:
数组能存放大多数类型的对象,比如:指针。所以要理清楚存放指针的数组、数组的指针、数组的引用之间的区别。
int *ptr[10]; //ptr是含有10个整型指针的数组
int &ptr1[10]; //错误,不存在存放引用的数组
int (*ptr2)[10]=&arr //ptr2指向一个含有10个整数的数组
int (&ptr3)[10]=arr //ptr3引用一个含有10个整数的数组
int *(&array)[10]= ptr //array是数组的引用,该数组含有10个指针
要想理解数组声明的含义,最好的办法是从数组的名字开始按照由内向外的顺序阅读。访问数组元素的方法:
一下标运算符
二范围for语句
用法和string和vector的相同,但是在使用数组下标的时候,通常将下标定义为size_t类型。size_t是一种机器相关的无
符号类型。