初始化数组
如果使用变量作为角标初始化,必须是常量表达式,使用constexpr。
不能使用auto定义数组。
用字符串初始化数组时,会变成一个个字符进行初始化,同时自动加上一个空字符。
不能用数组为其他数组初始化或者赋值(在标准库中)

复杂的数组声明
int *p[10];//存放10个指向整数的指针
int (*p)[10] = &arr;//定义一个指向整数数组的指针,数组大小为10
int (&p)[10] = arr;//定义一个引用整数数组的引用,数组大小为10
(练习3.28)

下标和指针
当指针指向数组中的元素,可以对指针使用下标
int a[] = {0,1,2,3,4};
int *p = a;
int j = p[1];//等价于把p向后移动一位之后,数组的值赋值给j
(练习3.35)

C风格字符串
实际为字符数组,结尾有空字符的字符串为C风格字符串
可以使用strlen,strcopy等函数,在使用一些函数操作时,大部分是在操作指针,所以要进行注意
在使用string时,允许其中一个对象为字符字面值,不能是全部,同时string不能用来初始化指针,但是可以使用c_str函数
stirng s("Hello World");
char *str = s;//错误
const char *str = s.c_str();
c_str返回一个风格字符串,也就是指针,可以赋值给const

使用数组初始化vector对象
int a[] = {0,1,2,3,4};
vector<int> v(begin(a),end(a));
(练习3.42)

多维数组
C++并没有多维数组,本质上是数组的数组,即数组的元素还是数组
可以使用范围for语句处理多维数组
int a[][];
for(auto &row : a)
    for(auto &col : row)
    {
        col = cnt;
        ++cnt;
    }
注意要使用引用,否则在第一次循环时,编译器会认为,是要对a数组中每个元素做操作,那么编译器会把row变成指针类型,就无法进行下次循环,会非法。
多维数组的指针可以通过使用类型别名来便于理解和书写
(练习3.43,3.44)