指针算术

增量/减量

指针可以递增或递减(前缀和后缀)。递增指针将指针值提前到数组中的元素,该元素超过当前指向的元素。递减指针会将其移动到数组中的上一个元素。

如果指针指向的类型不完整,则不允许指针运算。void 总是不完整的类型。

char* str = new char[10]; // str = 0x010
++str;                    // str = 0x011  in this case sizeof(char) = 1 byte

int* arr = new int[10];   // arr = 0x00100
++arr;                    // arr = 0x00104 if sizeof(int) = 4 bytes

void* ptr = (void*)new char[10];
++ptr;    // void is incomplete.

如果指向结束元素的指针递增,则指针指向超过数组末尾的一个元素。这样的指针不能被解除引用,但可以递减。

增加指向数组中一个结束元素的指针,或者将指针递减到数组中的第一个元素会产生未定义的行为。

出于指针算术的目的,可以处理指向非数组对象的指针,就像它是大小为 1 的数组一样。

加法/减法

整数值可以添加到指针; 它们用作递增,但是通过特定的数字而不是 1.也可以从指针中减去整数值,作为指针递减。与递增/递减一样,指针必须指向完整类型。

char* str = new char[10];  // str = 0x010
str += 2;                  // str = 0x010 + 2 * sizeof(char) = 0x012

int* arr = new int[10];    // arr = 0x100
arr += 2;                  // arr = 0x100 + 2 * sizeof(int) = 0x108, assuming sizeof(int) == 4.

指针差分

可以计算两个指向相同类型的指针之间的差异。两个指针必须在同一个数组对象中; 否则未定义的行为结果。

如果 PQ 在同一个数组中有两个指针,如果 P 是数组中的 ith 元素,而 Qjth 元素,那么 P - Q 将是 i - j。结果的类型是 std::ptrdiff_t,来自 <cstddef>

char* start = new char[10];  // str = 0x010
char* test = &start[5];
std::ptrdiff_t diff = test - start; //Equal to 5.
std::ptrdiff_t diff = start - test; //Equal to -5; ptrdiff_t is signed.