在本文中,您將學(xué)習(xí)有關(guān)指針的所有知識。您將學(xué)習(xí)如何將值存儲在計算機中以及如何使用指針訪問它們。
指針是C++的強大特性,它將C++與其他編程語言(如Java和Python)區(qū)分開來。
指針在C ++程序中用于訪問內(nèi)存和操縱地址。
要了解指針,您首先應(yīng)該知道如何在計算機上存儲數(shù)據(jù)。
在程序中創(chuàng)建的每個變量都在計算機內(nèi)存中分配了一個位置。變量存儲的值實際上存儲在指定的位置中。
為了知道數(shù)據(jù)存儲在哪里,C++有一個&操作符。操作符& (reference)給出變量占用的地址。
如果var是變量,則&var給出該變量的地址。
#include <iostream> using namespace std; int main() { int var1 = 3; int var2 = 24; int var3 = 17; cout << &var1 << endl; cout << &var2 << endl; cout << &var3 << endl; }
輸出結(jié)果
0x7fff5fbff8ac 0x7fff5fbff8a8 0x7fff5fbff8a4
注意: 在您的系統(tǒng)上可能不會得到相同的結(jié)果。
開頭的0x表示地址為十六進制格式。
請注意,第一個地址與第二個地址相差4個字節(jié),第二個地址與第三個地址相差4個字節(jié)。
這是因為在64位系統(tǒng)中,整數(shù)(類型為int的變量)的大小為4個字節(jié)。
C ++使您能夠直接操作計算機內(nèi)存中的數(shù)據(jù)。 您可以根據(jù)需要分配和取消分配內(nèi)存中的任何空間。 這是使用Pointer(指針)變量完成的。
指針變量是指向內(nèi)存中另一個變量所指向的特定地址的變量。
int *p; 或, int* p;
上面的語句定義了一個指針變量p。它保存了內(nèi)存地址
星號(*)是解引用運算符,表示指向的指針。
在這里,指針p是指向int的指針,即它指向存儲器地址中的整數(shù)值。
如上所述的引用運算符(&)給出了變量的地址。
要獲取存儲在內(nèi)存地址中的值,我們使用解引用運算符(*)。
例如:如果number變量存儲在內(nèi)存地址0x123中,并且它包含一個值5。
reference(&)操作符給出值0x123,而dereference(*)操作符給出值5。
注意:注意:c++指針聲明中使用的(*)符號不是引用指針。它只是一個創(chuàng)建指針的類似符號。
C ++程序演示了指針的工作。
#include <iostream> using namespace std; int main() { int *pc, c; c = 5; cout << "Address of c (&c): " << &c << endl; cout << "Value of c (c): " << c << endl << endl; pc = &c; // 指針pc保存變量c的內(nèi)存地址 cout << "pc持有的指針地址(pc): "<< pc << endl; cout << "地址指針pc持有的值(*pc): " << *pc << endl << endl; c = 11; // 內(nèi)存地址&c中的值從5更改為11。 cout << "地址指針pc持有(pc): " << pc << endl; cout << "地址指針pc持有的內(nèi)容(*pc): " << *pc << endl << endl; *pc = 2; cout << "Address of c (&c): " << &c << endl; cout << "Value of c (c): " << c << endl << endl; return 0; }
輸出結(jié)果
Address of c (&c): 0046FD44 Value of c (c): 5 pc持有的指針地址(pc): 0046F 地址指針pc持有的值(*pc): 5 地址指針pc持有(pc): 0046FD4 地址指針pc持有的內(nèi)容(*pc): Address of c (&c): 0046FD44 Value of c (c): 2
程序的用法說明
當(dāng)c = 5;值5存儲在變量c-0x7fff5fbff8c 的地址中。
當(dāng)pc = &c;指針pc的地址為c-0x7fff5fbff8c時,表達式(解引用運算符)*pc輸出存儲在該地址中的值5。
當(dāng)c = 11;由于pc持有的地址指針與c - 0x7fff5fbff8c相同,所以當(dāng)執(zhí)行表達式*pc時,c的值也會發(fā)生變化,現(xiàn)在輸出11。
當(dāng)*pc = 2時;它改變了pc - 0x7fff5fbff8c存儲的地址的內(nèi)容。這個從11變成了2。因此,當(dāng)我們輸出c的值時,這個值也是2。
假設(shè)您希望指針pc指向c的地址。然后,
int c, *pc; pc=c; /* 錯誤! pc是地址,而c不是地址。 */ *pc=&c; /*錯誤! * pc是地址指向的值,而&c是地址。*/ pc=&c; /* 正確! pc是一個地址,&c也是一個地址。 */ *pc=c; /* 正確! * pc是地址指向的值,而c也是一個值。 */
在這兩種情況下,指針pc都不是指向c的地址。
您還應(yīng)該查看這些與指針相關(guān)的教程: