重读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<int> ivec(begin(int_arr), end(int_arr));
vector<int> 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<<col<<endl;

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容