指標算術
增量/減量
指標可以遞增或遞減(字首和字尾)。遞增指標將指標值提前到陣列中的元素,該元素超過當前指向的元素。遞減指標會將其移動到陣列中的上一個元素。
如果指標指向的型別不完整,則不允許指標運算。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.