c++primer笔记--3.5数组

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值