本章介绍了数组和指针。数组和指针所提供的功能类似于标准库的 vector 类与string 类和相关的迭代器所提供。我们可以把vector 类型理解为更灵活、更容易管理的数组,同样,string 是 C 风格字符串的改进类型,而 C 风格字符串是以空字符结束的字符数组。
迭代器和指针都能用于间接地访问所指向的对象。vector 类型所包含的元素通过迭代器来操纵,类似地,指针则用于访问数组元素。尽管道理都很简单,但在实际应用中,指针的难用是出了名的。
某些低级任务必须使用指针和数组,但由于使用指针和数组容易出错而且难以调试,应尽量避免使用。一般而言,应该优先使用标准库抽象类而少用语言内置的低级数组和指针。尤其是应该使用string 类型取代 C 风格以空字符结束的字符数组。现代 C++ 程序不应使用C风格字符串。
术语
C-style strings(C 风格字符串)C 程序把指向以空字符结束的字符数组的指针视为字符串。在 C++ 中,字符串字面值就是 C 风格字符串。C 标准库定义了一系列处理这种字符串的库函数,C++ 中将这些标准库函数放在cstring 头文件中。由于 C 风格字符串本质上容易出错,C++ 程序应该优先使用 C++ 标准库类string 而少用 C 风格字符串。网络程序中大量的安全漏洞都源于与使用 C 风格字符串和数组相关的缺陷。
特定编译器为语言添加的特性。依赖于编译器扩展的程序很难移植到其他的编译器。
-
compound type(复合类型)
-
使用其他类型定义的类型。数组、指针和引用都是复合类型。
-
const void*
-
可以指向任意 const 类型的指针类型,参见 void *。
-
delete expression(delete 表达式)
-
delete 表达式用于释放由 new 动态分配的内存:
delete [] p;
在此表达式中,p 必须是指向动态创建的数组中第一个元素的指针,其中方括号必不可少:它告诉编译器该指针指向数组,而非单个对象。C++ 程序使用delete 取代 C 语言的标准库函数free。
-
dimension(维数)
-
数组大小。
-
dynamically allocated(动态分配的)
-
在程序自由存储区中建立的对象。该对象一经创建就一直存在,直到显式释放为止。
-
free store(自由存储区)
-
程序用来存储动态创建对象的内存区域。
-
heap(堆)
-
自由存储区的同义词。
-
new expression(new表达式)
-
用于分配动态内存的表达式。下面的语句分配了一个有 n 个元素的数组:
new type[n];
该数组存放 type 类型的元素。new 返回指向该数组第一个元素的指针。C++ 程序使用new 取代 C 语言的标准库函数malloc。
-
pointer(指针)
存放对象地址的对象。
-
pointer arithmetic(指针算术操作)
-
可用于指针的算术操作。允许在指针上做加上或减去整型值的操作,以获得当前指针之前或之后若干个元素处的地址。两个指针可做减法操作,得到它们之间的差值。只有当指针指向同一个数组或其超出末端的位置时,指针的算术操作才有意义。
-
precedence(优先级)
-
在复杂的表达式中,优先级确定了操作数分组的次序。
-
ptrdiff_t
-
在 cstddef 头文件中定义的与机器相关的有符号整型,该类型具有足够的大小存储两个指针的差值,这两个指针指向同一个可能的最大数组。
-
size_t
-
在 cstddef 头文件中定义的与机器相关的无符号整型,它具有足够的大小存储一个可能的最大数组。
-
* operator(* 操作符)
-
对指针进行解引用操作获得该指针所指向的对象。解引用操作符返回左值,因此可为其结果赋值,等效于为该指针所指向的特定对象赋新值。
-
++ operator(++ 操作符)
-
用于指针时,自增操作符给指针“加 1”,移动指针使其指向数组的下一个元素。
-
[] operator([] 操作符)
-
下标操作符接受两个操作数:一个是指向数组元素的指针,一个是下标 n。该操作返回偏离指针当前指向 n 个位置的元素值。数组下标从 0 开始计数——数组第一个元素的下标为 0,最后一个元素的下标是数组长度减 1。下标操作返回左值,可用做赋值操作的左操作数,等效于为该下标引用的元素赋新值。
-
& operator(& 操作符)
-
取地址操作符需要一个操作数,其唯一的操作数必须是左值对象,该操作返回操作数对象在内存中的存储地址。
-
void*
-
可以指向任何非 const 对象的指针类型。void* 指针只提供有限的几种操作:可用作函数形参类型或返回类型,也可与其他指针做比较操作,但是不能进行解引用操作。