C++ Primer笔记( 3.5.1)—— 定义和初始化内置数组
#include<iostream>
#include<vector>
#include<string>
using std::string;
using std::vector;
/**************************************************************************/
/* 与vector相似的地方是,数组也是存放类型相同的对象的容器,这些对象本身没 */
/* 有名字,需要通过其所在位置访问。 */
/* 与vector不同的地方是,数组的大小确定不变,不能随意向数组中增加元素。因 */
/* 为数组的大小固定,因此对某些特殊的应用来说程序的运行时性能较好,但是相 */
/* 应地也损失了一些灵活性。 */
/**************************************************************************/
int main()
{
/* ----- 例子 ----- */
//数组中元素的个数也属于数组类型的一部分,编译的时候维度应该是已知的。
//也就是说,维度必须是一个常量表达式。
unsigned cnt = 42; //不是常量表达式
constexpr unsigned sz = 42; //常量表达式
int arr[10]; //含有10个整数的数组
int *parr[sz]; //含有42个整型指针的数组
//string bad[cnt]; //错误:cnt不是常量表达式
//定义数组的时候必须指定数组的类型,不允许用auto关键字由初始值的列表推断类型。
//另外和vector一样,数组的元素应为对象,因此不存在引用的数组。
/* ---------------- */
/* ----- 显示初始化数组元素 ----- */
//可以对数组的元素进行列表初始化,此时允许忽略数组的维度。
//如果在声明时没有指明维度,编译器会根据初始值的数量计算并推测出来。
const unsigned sz2 = 3;
int ial[sz2] = { 0,1,2 }; //含有3个元素的数组,元素值分别是0,1,2
int a2[] = { 0,1,2 }; //维度是3的数组
int a3[5] = { 0,1,2 }; //等价于a3[] = {0, 1, 2, 0, 0}
string a4[3] = { "hi", "bye" }; //等价于a4[] = {"hi", "bye", ""}
// int a5[2] = { 0,1,2 }; //错误,初始值过多
std::cout << "a2的元素为:[";
for (auto i : a2)
std::cout << i << ", ";
std::cout << "]"<<std::endl;
std::cout << "a3的元素为:[";
for (auto i : a3)
std::cout << i << ", ";
std::cout << "]" << std::endl;
std::cout << "a4的元素为:[";
for (auto i : a4)
std::cout << i << ", ";
std::cout << "]" << std::endl;
/* ------------------------------ */
/* ----- 字符数组的特殊性 ----- */
//字符数组有一种额外的初始化形式,我们可以用字符串字面值对此类数组初始化。
//当使用这种方式时,一定要注意字符串字面值的结尾处还有一个空字符,这个空字符
//也会像字符串的其他字符一样被拷贝到字符数组中去:
char b1[] = { 'C', '+', '+' }; //列表初始化,没有空字符
char b2[] = { 'C', '+', '+', '\0' }; //列表初始化,含有显式的空字符
char b3[] = "C++"; //自动添加表示字符串结束的空字符
const char b4[7] = "Daniel"; //正确:最后的空字符还需要占用一个空间
//const char b5[7] = "Daniel"; //错误:没有空间可以存放空字符
/* ---------------------------- */
/* ----- 不允许拷贝和赋值 ----- */
//不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值:
int c[] = { 0,1,2 }; //含有3个整数的数组
//int c2[] = a; //错误:不允许使用一个数组初始化另一个数组
//a2 = a; //错误:不能把一个数组直接赋值给另一个数组
/* ---------------------------- */
/* -----理解复杂的数组声明----- */
//和vector一样,数组能存放多大数类型的对象。例如,可以定义一个存放指针的数组。
//又因为数组本身就是对象,所以允许定义数组的指针以及数组的引用。
//在这几种情况中,定义存放指针的数组比较简单和直接,但是定义数组的指针或数组的引用就稍微复杂一点了;
int *ptrs[10]; //ptrs是含有10个整型指针的数组
//int &refs[10] = /* ? */; //错误:不存在引用的数组
int(*Parray)[10] = &arr; //Parray指向一个含有10个整数的数组
int(&arrRef)[10] = arr; //arrRef引用一个含有10个整数的数组
/* ---------------------------- */
return 0;
}