重读C++ Primer 学习笔记 --数组篇

C++ Primer 第五版 第101页

数组的维度必须是一个常量表达式

unsigned cnt = 42;//不是常量表达式
constexpr unsigned sz=42;//常量表达式
int arr[10];
int *parr[sz];//含有42个整型指针的数组
string bad[cnt];//错误 cnt不是常量表达式
string strs[get_size()];//当get_size是constexpr时正确 否则错误

C++ Primer 第五版 第102页

可以对数组进行列表初始化 未指定数组维度时会对其维度进行推断。指定数组维度的话,列表数目不得超过数组维度。对于多余的维度未初始化部分编译器会进行推断。

const unsigned sz = 3;
int ia1[sz] = {0,1,2};
int a2[] = {0,1,2};
int a3[5] = {0, 1, 2};//生成数组{0, 1, 2, 0, 0}
string a4[3] = {"hi","hye"};//等价于{"hi", "hye", ""}
int a5[2] = {0,1, 2};//错误 列表超长

字符数组有一种较为特殊的初始化方式,即用字符串字面值进行初始化

char a1[] = {'C', '+', '+'};//尾部没有空字符,维度为3
char a2[] = {'C', '+', '+','\0'};//显式添加空字符,维度为4
char a3[] = "C++";//自动添加空字符,维度为4
const char a4[6] = "Daniel";// 报错,大小不足以容纳加一个空字符

数组不支持拷贝和赋值
由于引用不是对象 所以不支持引用数组

C++ Primer 第五版 第103页

复杂数组声明

int (*Parray)[10] = &arr; //Parray 是指向一个含有10个整数的数组
int (&arrRef)[10] = arr;//arrRef 是引用一个含有10个整数的数组

一般来说,从右往左理解比较简单
但是对于Parray来说,从右往左理解就有点不合理,应该从内向外理解
*Parray 意味着他是一个指针,再观察右边意味着他指向一个数组
数组下标通常将其定义为size_t类型

C++ Primer 第五版 第105页

指针和数组

string nums[] = {"one", "two"};
string *p = &nums[0];
string *p2 = nums;//与上一句等价 ,编译器将其自动替换成指向首元素的指针

C++ 11在iterator头文件中引入了begin和end,与容器的同名成员功能类似 ,但需要注意的是数组并不是类,所以只能作为函数的参数进行输入

int *beg = begin(ia);
int *last = end(ia);

C++ Primer 第五版 第111页

使用数组初始化vector对象
不允许使用数组初始化数组,也不允许使用vector初始化数组,但是可以使用数组初始化vector
只需要指明拷贝区域的首尾地址即可

int int_arr[] = {0,1,2,3,4,5};
vector ivec(begin(int_arr), end(int_arr));
vector subVec(int_arr+1, int_arr+4);//拷贝int_arr[1],2,3

C++ Primer 第五版 第111页

多维数组初始化

int ia[3][4] = {
    {0,1 , 2, 3},
    {4,5,6,7},
    {8,9,10,11}
};//
//没有内嵌花括号也可以
int ia[3][4] = {0, 1,2,3,4,5,6,7,8,9,10,11}

与一维数组类似 并不需要每个元素都需要显式初始化,可以选择仅初始化前面几个

C++ Primer 第五版 第114页

使用范围for遍历多维数组

size_t cnt = 0;
for (auto &row :ia)
  for (auto &col:row){
        col=cnt;
        ++cnt;
  }

在这个例子中,由于要改变数组元素,所以使用了引用操作,实际上还有一个深层次的原因

for (const auto &row : ia)
    for (auto col:row)
        cout<

这个循环并没有写操作,但是为什么要使用引用呢?这时为了避免数组自动转为指针,如果不使用引用,程序无法通过编译 因为ia的元素实际上是数组,在遍历过程中,row会被自动转换为指向首元素的int*,显然就无法进行遍历了
也就是说,对于范围for处理多维数组,除最内层循环外,都应使用引用

你可能感兴趣的:(重读C++ Primer 学习笔记 --数组篇)