初始化数组
如果使用变量作为角标初始化,必须是常量表达式,使用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)