C++ 指針的算術(shù)運算
指針是一個用數(shù)值表示的地址。因此,您可以對指針執(zhí)行算術(shù)運算??梢詫χ羔樳M(jìn)行四種算術(shù)運算:++、--、+、-。
假設(shè) ptr 是一個指向地址 1000 的整型指針,是一個 32 位的整數(shù),讓我們對該指針執(zhí)行下列的算術(shù)運算:
ptr++
在執(zhí)行完上述的運算之后,ptr 將指向位置 1004,因為 ptr 每增加一次,它都將指向下一個整數(shù)位置,即當(dāng)前位置往后移 4 個字節(jié)。這個運算會在不影響內(nèi)存位置中實際值的情況下,移動指針到下一個內(nèi)存位置。如果 ptr 指向一個地址為 1000 的字符,上面的運算會導(dǎo)致指針指向位置 1001,因為下一個字符位置是在 1001。
遞增一個指針
我們喜歡在程序中使用指針代替數(shù)組,因為變量指針可以遞增,而數(shù)組不能遞增,因為數(shù)組是一個常量指針。下面的程序遞增變量指針,以便順序訪問數(shù)組中的每一個元素:
#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *ptr; // 指針中的數(shù)組地址 ptr = var; for (int i = 0; i < MAX; i++) { cout << "Address of var[" << i << "] = "; cout << ptr << endl; cout << "Value of var[" << i << "] = "; cout << *ptr << endl; // 移動到下一個位置 ptr++; } return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結(jié)果:
Address of var[0] = 0xbfa088b0 Value of var[0] = 10 Address of var[1] = 0xbfa088b4 Value of var[1] = 100 Address of var[2] = 0xbfa088b8 Value of var[2] = 200
遞減一個指針
同樣地,對指針進(jìn)行遞減運算,即把值減去其數(shù)據(jù)類型的字節(jié)數(shù),如下所示:
#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *ptr; // 指針中最后一個元素的地址 ptr = &var[MAX-1]; for (int i = MAX; i > 0; i--) { cout << "Address of var[" << i << "] = "; cout << ptr << endl; cout << "Value of var[" << i << "] = "; cout << *ptr << endl; // 移動到下一個位置 ptr--; } return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結(jié)果:
Address of var[3] = 0xbfdb70f8 Value of var[3] = 200 Address of var[2] = 0xbfdb70f4 Value of var[2] = 100 Address of var[1] = 0xbfdb70f0 Value of var[1] = 10
指針的比較
指針可以用關(guān)系運算符進(jìn)行比較,如 ==、< 和 >。如果 p1 和 p2 指向兩個相關(guān)的變量,比如同一個數(shù)組中的不同元素,則可對 p1 和 p2 進(jìn)行大小比較。
下面的程序修改了上面的實例,只要變量指針?biāo)赶虻牡刂沸∮诨虻扔跀?shù)組的最后一個元素的地址 &var[MAX - 1],則把變量指針進(jìn)行遞增:
#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *ptr; // 指針中第一個元素的地址 ptr = var; int i = 0; while ( ptr <= &var[MAX - 1] ) { cout << "Address of var[" << i << "] = "; cout << ptr << endl; cout << "Value of var[" << i << "] = "; cout << *ptr << endl; // 指向上一個位置 ptr++; i++; } return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結(jié)果:
Address of var[0] = 0xbfce42d0 Value of var[0] = 10 Address of var[1] = 0xbfce42d4 Value of var[1] = 100 Address of var[2] = 0xbfce42d8 Value of var[2] = 200
更多建議: