指针算术
增量/减量
指针可以递增或递减(前缀和后缀)。递增指针将指针值提前到数组中的元素,该元素超过当前指向的元素。递减指针会将其移动到数组中的上一个元素。
如果指针指向的类型不完整,则不允许指针运算。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.
指针差分
可以计算两个指向相同类型的指针之间的差异。两个指针必须在同一个数组对象中; 否则未定义的行为结果。
如果 P
和 Q
在同一个数组中有两个指针,如果 P
是数组中的 i
th 元素,而 Q
是 j
th 元素,那么 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.