《C++primer》第四章读书笔记

第4章 数组和指针

现代C++程序应使用vector和迭代器代替数组和指针,除非前二者不满足对效率的特殊要求

⒋⒈ 数组
⒈ 数组是由类型说明符、标识符和维度组成的复合类型,能保存一组某种类型的未命名对象

⒉ 定义和初始化
⑴ 类型说明符规定了存放于数组中元素的类型
可使用除引用外的任意类型,包括数组本身(数组的数组即****数组**)
⑵ 维数指定数组中包含的元素个数,须用值大于等于1的常量表达式定义,一经指定不可改变
⑶ 可以使用初值列表(用花括号括起的一组用逗号分隔的初值,可为空)显式提供元素的初值
① 此时可不指定维数,数组长度将由初值列表中的元素个数自动确定
② 若指定维数:
ⅰ 维数值不能小于初值个数
ⅱ 若维数值大于初始化列表中提供的元素个数,则只用初值列表初始化数组中前面对应的元素
其余元素,若为内置类型则初始化为0,若为类类型则调用默认构造函数
③ 对于**数组,除第一维外其余维数都须显示指定
初值列表可内嵌花括号以指明各初值对应的位置,若不使用内嵌花括号则依次初始化
⑷ 若未提供初值列表,则数组元素像普通变量一样初始化
⑸ 使用字符串字面值初始化字符数组时注意前者结尾隐含的空字符

⒊ 不允许数组直接复制和赋值

⒋ 数组元素可通过下标操作符[]访问,下标从0开始

下标越界将导致运行时错误

⒋⒉ 指针
⒈ 指针是一种能储存对象地址的对象

⒉ 定义和初始化
⑴ 形式: 类型名* 标识符;
类型名指定指针指向对象的类型(类型名为 void 时指针可指向任意类型的对象)
① 连续声明多个指针时,每个标识符前都要加
② 可以连续使用多个星号
表示指向指针的指针
③ const 限定符
ⅰ 指向 const 对象的指针
a形式: const 类型名* 标识符;
(或 类型名 const* 标识符;)
b const 对象只能与这种指针关联
c不能通过这种指针修改所指对象,无论所指是否为 const
由于有此特性,该种指针常用作函数形参以防止所指对象被意外修改
ⅱ const 指针
a形式:类型名* const 标识符
b指针本身的值不能修改,即不能改变指向,但可以改变所指对象的值
ⅲ 指向 const 对象的 const 指针
a形式: const 类型名* const 标识符
b既不能改变所指对象的值,也不能改变指向
ⅳ typedef T* pT; 则 const pT t 和 pT const t 均与 T* const t 等价
④ 指向数组的指针
ⅰ 形式: 类型名 (*标识符)[维数][维数]…[维数];
ⅱ typedef 类型名新类型名[维数][维数]…[维数];
得到数组类型的别名,可以此简化定义
⑵ 应避免使用未初始化的指针
而一个有效的指针必然为以下三种状态之一:
① 保存某确定对象的地址
② 指向一个对象的下一位置
③ 值为0
因此在对指针初始化和赋值时只能使用:
① 值为0的常量表达式
② 类型匹配的对象的地址(使用取地址操作符&获得,该运算符只能对左值使用)
③ 另一对象下一位置的地址
④ 同类型另一有效指针

⒊ 指针操作
⑴ 使用解引用操作符可以获得指针指向对象的左值,从而操作所指对象
而对指针直接进行赋值等操作将改变指针本身的值,使指针指向另一对象
⑵ 指针可被当作数组的迭代器,用以访问数组元素
① 指针的算术操作
ⅰ 指针与整型值相加(减),得到指向所指元素向后(前)移动相应位置的数组元素的新指针
ⅱ 两个指向同一数组中元素的指针(含超出末端指针)相减,得到一个 ptrdiff_t 型(定义在头文件 cstddef 中, signed 整型)结果,表示两指针所指元素间的距离
② 对指针进行下标操作[],返回所指元素向后(前)移动相应位置的数组元素引用
③ 可以计算超出末端指针,但不允许对其进行解引用操作
计算越界指针也是非法的
⑶ void
指针不支持以上操作

⒋⒊ C风格字符串
⒈ C风格字符串是以空字符结尾的字符数组
字符串字面值就是其实例

⒉ C风格字符串的标准库函数(头文件 cstring)
传给以下库函数的须为指向以空字符结尾的字符数组的非零指针
⑴ size_t strlen( char *str );
返回字符串长度(不包括结尾的空字符)
⑵ int strcmp( const char *str1, const char *str2 );
比较两个字符串,如果前者大于后者返回正数,小于返回负数,等于返回0
注:不能使用>,<,==操作符比较,它们只会比较存放地址而不会比较字符串
⑶ char *strcat( char *str1, const char *str2 );
将str2连接到str1后面,并返回str1
此函数不进行越界检查
⑷ char *strcpy( char *to, const char *from );
将str2复制到str1字符串,并返回str1
此函数不进行越界检查
⑸ char *strncat( char *str1, const char *str2, size_t count );
将str2的前至多count个字符连接到str1后面,并返回str1
如果越界则截断字符串,因此比strcat安全
⑹ char *strncpy( char *to, const char *from, size_t count );
将str2的前至多count个字符复制到str1,并返回str1
如果越界则截断字符串,因此比strcpy安全

⒊ 对于大部分程序而言,标准库类型 string 无论安全性还是效率均强过C风格字符串,因此应尽可能使用 string

你可能感兴趣的:(《C++primer》第四章读书笔记)