数组和指针:
在C++程序中,尽量使用vector,只有在追求程序速度的时候才在类里使用数组和指针。
4.1 数组:
(1)特殊的字符数组一定要记得添加'\0'。
(2)数组不能直接复制和赋值。
4.2 指针的引入
(1)指针用于指向对象。
(2)指针值保存的是对象的地址。
指针定义个初始化:
(1)很多运行时错误都是源于使用了未初始化的指针。
void* 指针
(1)C++提供void*指针,可以保存任何对象的地址。
(2)void*表明该指针与一地址相关,只是不知道这个地址上存储的对象的类型。
(3)void*只支持有限的操作:与另一个指针比较,向函数传递void*指针或者返回void*指针,
给另一个void*指针赋值。
(4)不允许使用void*指针操纵它所指向的对象。
指针与引用的比较:
(1)引用总是关联着某个对象,所以在定义引用时没有初始化是错误的。
(2)给引用赋值的差别,给引用赋值是修改与该引用所关联的值,而并不是使引用与另一个对象相关联。
(3)引用一旦定义就始终指向(关联)着这个对象。
指针与数组:
(1)在表达式中使用数组名时,该名字会自动转换指向数组第一个元素的指针。
(2)C++中允许计算数组或对象超出末端的位置,但不允许对这些地址进行解引用操作。
指针与const限定符:
指向const对象的指针:
(1)const double *ptr ptr为指向const对象的指针,即不能通过这个指针来修改它所指向的值。但是可以修改这个指针本身
(2)自以为指向const的指针,也可以用指向const对象的指针指向非const的对象。
(3)不能使用void*指针保存const对象的地址,而要用const void*指针。
const指针:
(1)int a;int* const ptr=&a;
(2)const指针值不能修改,也就意味着不能使其又去指向另外一个值。
(3)指针所指对象的值能否修改完全取决于该对象的类型。
指向const对象的const指针:const double *const ptr。
指针和typedef:
(1)typedef string *pstring; const pstring pstr;
这里const修饰的是pstring这个类型,所以pstr应该是指向string对象的const指针。
C风格字符串:
(1)C++通过(const)char* 指针来操作C风格的字符串,以空字符结束。
(2)cstring是C++处理c风格字符串函数的头文件,而string.h是C语言提供的。
C++处理c风格字符串函数:
(1)传递给这些标准库函数例程的指针必须具有非零值,并且指向以 null 结束 的字符数组中的第一个元素。
(2)永远不要忘记字符串结束符 null
(3)调用者必须确保目标字符串具有足够的大小
函数:
(1)strlen(s) ——返回 s 的长度,不包括字符串结束符 null
(2)strcmp(s1, s2)—— 比较两个字符串 s1 和 s2 是否相同。若 s1 与 s2 相等,返 回 0;若 s1 大于 s2,
返回正数;若 s1 小于 s2则返回负数
(3)strcat(s1, s2) ——将字符串 s2 连接到 s1 后,并返回 s1
(4)strcpy(s1, s2) ——将 s2 复制给 s1,并返回 s1
(5)strncat(s1, s2,n)——将 s2 的前 n 个字符连接到 s1 后面,并返回 s1
(6)strncpy(s1, s2, n)——将 s2 的前 n 个字符复制给 s1,并返回 s1。
4.4 创建动态数组
(1)每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对 象,此内存空间称为程序的自由存储区或堆。
(2)C 语言程序使用一对标准库函数malloc 和 free 在自由存储区中分配存储空间,而 C++ 语言则
使用 new 和 delete 表达式实现相同的功能。
动态数组初始化:
(1)string *psa = new string[10];这个初始化了,而int *pia = new int[10];没有初始化。
(2)int *pia2 = new int[10] (); 圆括号要求编译器对数组做值初始化,在本例中即把数组元素都设置为 0。
(3)对于动态分配的数组,其元素只能初始化为元素类型的默认值, 而不能像数组变量一样,用初始化列表
为数组元素提供各不相 同的初值。
(4)如果我们在自由存储区中创建的数组存储了内置类型的 const 对象,则必 须为这个数组提供初始化:
因为数组元素都是 const 对象,无法赋值。实现这 个要求的唯一方法是对数组做值初始化。
动态空间的释放:
(1)C++ 语言为指针提供 delete [] 表达式释放指针所指向的数组 空间。delete [] pia;
(2)方括号告诉编译器该指针指向 的是自由存储区中的数组,而并非单个对象。
(3)如果遗漏了空方括号对,这是一个编译器无法发现的错误,将 导致程序在运行时出错。