c++primer笔记--3.5数组

来源:互联网 发布:javascript读音 编辑:程序博客网 时间:2024/05/08 00:14
1 与vector不同的是,数组的大小确定不变,不能随意向数组中增加元素。因为数组的大小固定,因此数组在运行时的性能较好,但相应的会损失一些灵活性。
2 如果不清楚元素的确切个数,请使用vector。
3 数组是一种复合类型。维度说明了数组中元素的个数,因此必须大于0。数组中元素个数也属于数组类型的一部分,编译的时候维度必须是已知的,维度必须是一个常量表达式。
4 和内置类型的变量一样,如果在函数内部定义了某种内置类型的数组,那么默认初始化会令数组含有未定义的值
5 定义数组的时候必须指定数组的类型,不允许使用auto关键字由初始值的列表推断类型。另外和vector一样,数组的元素应为对象,因此不存在引用的数组。
6 char str[] = "c++"; 空字符也会像字符串的其它字符一样被拷贝到字符数组中去。
7 不能将数组的内容拷贝给其它数组作为其初始值,也不能用数组为其它数组赋值。
8 定义数组的指针和数组的引用:
    int (*p)[10];  // p指向一个含有10个整数的数组
    int (&p)[10];  // p引用一个含有10个整数的数组
9 要想 数组声明的含义,最好的办法是从数组的名字开始按照由内向外的顺序阅读
10 在使用数组下标的时候,通常将其定义为size_t类型,size_t是一种机器相关的无符号类型。
11 数组的下标运算符是c++定义的,vector的下标运算符是标准库vector自己定义的只能用在vector对象上
12 当需要遍历数组的所有元素时,最好的办法也是使用范围for循环。
13 在c++语言中,指针和数组有非常紧密的联系,使用数组的时候编译器一般会把它转换成指针。
14 和其它对象一样,对数组的元素使用取地址符就能得到指向该元素的指针
    string nums[] = {"one", "two", "three"};
    string *p = &nums[0];   // p 指向nums的第一个元素
15 数组还有一个特性:在很多用到数组名字的地方,编译器都会自动地将其替换成一个指向数组首元素的指针
    string *p2 = nums;  // 等价于p2 = &nums[0]
16 在大多数表达式中,使用数组类型的对象其实是使用一个指向数组首元素的指针
    int ia[10] = {0};
    auto ia2(ia); // ia2是一个整型指针,指向ia的第一个元素
    auto ia2(&ia[0]);
17 但是使用decltype时,不会发生上面的那种转换
    decltype(ia) ia3 = (10, 0);
18 指针也是迭代器,vector和string的迭代器支持的运算,数组的指针全都支持。
19 获取数组的尾后指针:
    int str[10] = {0};
    int *p = &str[10]; // 指向str尾元素的下一位置的指针
20 标准库函数begin()和end(): c++11引入了两个名为begin()和end()的函数定义在iterator头文件中,数组不是类类型,因此这两个函数不是成员函数,使用的方法如下:
    int str[10] = {0};
    int *beg = begin(str);
    int *last = end(str);
21 和迭代器一样,两个指针相减的结果是它们之间的距离,参与运算的两个指针必须指向同一个数组当中的元素,两个指针相减的结果的类型是一种名为ptrdiff_t的标准库类型
22 如果p是空指针,允许给p加上或减去一个值为0的整型常量表达式,两个空指针也允许彼此相减,结果为0。
23 只要指针指向的是数组中的元素(或者数组中尾元素的下一位置),都可以执行下标运算:
    int *p = &ia[2];
    int j = p[1]; // p[1]等价于*(p+1),也就是ia[3];
    int k = p[-2]; // ia[0];
    标准库类型限定使用的下标必须是无符号类型,而内置的下标运算无此要求
34 尽管c++支持c风格字符串,但在c++程序中最好还是不要使用它们,这是因为c风格字符串不仅使用起来不太方便,还极易引发程序漏洞,是诸多安全问题的根本原因。
35 字符串字面值是一种通用结构的实例,这种结构就是c++由c继承而来的c风格字符串。
36 c风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法。字符串存放在字符数组中并以空字符结束。
37 strlen(p); strcmp(p1,p2); strcat(p1,p2); strcpy(p1,p2);这几个函数是定义在cstring头文件中的用来处理c风格字符串的函数。
38 传入此类函数的指针必须指向以空字符作为结束的数组:
    char c[] = {'c', '+', '+'};
    cout << strlen(c) << endl;  // 严重错误,c没有以空字符结束
39 要想比较两个c风格字符串需要调用strcmp函数,相等返回0
40 对大多数应用来说,使用标准库string要比使用c风格字符串更安全,更高效。
41 任何出现字符串字面值的地方都可以用以空字符结束的字符数组类替代
42 string专门提供了一个名为c_str()的成员函数,它的返回值是一个c风格的字符串,也就是说函数的返回结果是一个指针,该指针指向一个以空字符结束的字符数组。
43 无法保证c_str()函数返回的数组一直有效,如果后续的操作改变了string对象的值就可能让之前返回的数组失去效用。
44 不允许使用一个数组为另一个内置类型的数组赋初值,也不允许使用vector对象初始化数组,允许使用数组来初始化vector对象。
    vector<int> ivec(begin(str), end(str));
45 现代的c++程序应当尽量使用vector和迭代器,避免使用内置数组和指针;尽量使用string,避免使用c风格的基于数组的字符串

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 爱奇艺游戏直播打不开怎么办 弄不到引产证明怎么办 小中考没过怎么办 学生对语文老师有意见怎么办 初三数学总是提不上怎么办 孩子数学太差怎么办 初一孩子学习不好怎么办 数学就是学不会怎么办 小猫太凶了怎么办 2个月狗狗感冒了怎么办 狗狗病了不吃东西怎么办 两个月小狗喝水怎么办 狗狗受凉拉稀怎么办 打篮球鼻子歪了怎么办 qq有个猫的表情怎么办 狗喝牛奶拉肚子怎么办 幼犬喝牛奶了怎么办 比基尼线有点黑怎么办 比基尼处皮肤黑怎么办 电脑桌面不显示图标怎么办 微信多人视频图像很小怎么办 人呆呆傻傻的怎么办 发烧冷的发抖怎么办 cad字体是问号怎么办 电脑打字框一直闪怎么办 主屏幕按钮失灵怎么办 孩子不优秀父母怎么办 同事不听你指挥怎么办 孩子常规太差怎么办 安全教案烫伤了怎么办 新生儿40天淘气怎么办 孩子不听老师讲课怎么办 孩子心理出现问题怎么办 打小孩脸打紫了怎么办 上夜班白天睡不好怎么办 实行两票制一品红会怎么办 ae合成素材丢失怎么办 百折裙褶子开了怎么办 touch马克笔干了怎么办 酒精马克笔干了怎么办 怎么办图片变成线稿