指针
指针 本质上是存储地址的变量,指针不仅是地址,还携带类型语义。
cpp
long* ptr {nullptr};long*:类型声明,表示 "指向long的指针"。*:表示这是一个指针类型。- 该指针变量可以存储一个
long类型数据的内存地址。
ptr:声明指针变量的变量名。nullptr:[[空指针字面量]]

TIP
经验法则:每次声明一个指针变量时,务必立即使用 适当的指针 或 nullptr 进行初始化,不要使其处于未初始化状态。
通过指针选择成员
cpp
// pdata 的类型为 vector<int>*,指向int元素向量的指针
std::vector<int>* pdata {new std::vector<int>{}};
// 要使用指针访问向量对象,必须先解引用运算符
(*pdata).push_back(66);
// C++ 提供箭头运算符(间接成员选择运算符)
pdata->push_back(66);指针的算术运算
cpp
// 1. 指针进行加减运算
// 给指针加 1 就表示给它递增一个所指向类型的元素
double* pvalue;
++pvalue; // 等价于 pvalue += 1,double 类型占据 8 个字节,pvalue 的值递增 8
// 2. 计算两个指针之间的差
// 仅在指针类型相同且指向同一个数组时,可以从一个指针中减去另一个指针
long numbers[] {10, 20, 30, 40, 50, 60, 70, 80};
long *pnum1 {&numbers[6]}; // 指向第七个数组元素
long *pnum2 {&numbers[1]}; // 指向第二个数组元素
// 指针之差由元素决定,而不是字节决定
auto diff1 {pnum1 - pnum2}; // 5,若是 pnum2 - pnum1 = -5
// C++ 规定,将两个指针相减,得到的值的类型为 std::ptrdiff_t
// 这是 <cstddef> 模块中定义的某个带符号整型的平台特定类型别名
std::ptrdiff_t diff2 {pnum2 - pnum1}; // -5
// 3. 比较指针
// 可以安全地比较相同类型的指针
pnum2 - pnum1 = -5 -> pnum2 - pnum1 < 0 -> pnum2 < pnum1