指標算術

增量/減量

指標可以遞增或遞減(字首和字尾)。遞增指標將指標值提前到陣列中的元素,該元素超過當前指向的元素。遞減指標會將其移動到陣列中的上一個元素。

如果指標指向的型別不完整,則不允許指標運算。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.