關於指標的三個容易弄混淆的概念及發散

2022-07-18 07:45:10 字數 1895 閱讀 4476

對於指標來講,有3個比較容易混淆的概念:

指標位址

指標儲存的位址

指標所儲存的位址的值

在這裡,我們分別來看看他們的定義:

下面,我們用乙個具體的例子來看看上面仨個東東的不同~~~

#include using namespace std;

int main()

{ int i;

int *p=0; //初始化指標p

cout<

在程式的5,6行,我們定義了乙個變數i,和乙個指標*p,同時將這個指標初始化為0

①。然後我們採用&運算子來得到整型變數i的位址,並輸出之。後面兩句關於p的值和記憶體就是初始化該指標時系統自動為其分配的位址和值(假設p的記憶體位址為b);

在程式的第10行中,我們將3賦與i,這時i的位址並沒有發生變化。比如說如果原來i的位址為a,這是i的位址仍然為a,只不過該位址a中間的值已經成為了3。那麼後面兩句的輸出就顯而易見了,i的位址輸出應該為a,i的值為3;

在程式的第13行,我們利用取位址運算子&將i的位址賦給了p,那麼這個時候,p中的值應該就是i的位址,即為a。而p的記憶體位址並沒有發生改變,仍然為b。在這裡,我們就可以看到,對於指標p來講:

所以說在這裡,指標位址就是b,指標儲存的位址就是a,指標所儲存的位址的值就是3②

。在程式的17行,我們利用了指標可以隨意修改指向物件的值得功能,將i中的值修改成了5,那麼相應地輸出p和i的值就應該是5了③

。綜上所述,該程式的輸出為

從這個輸出上我們就可以明顯看出上面三個概念本質上的區別了。

注釋:我們在最開始定義乙個指標的時候,最應該做的就是先將這個指標變數進行初始化,以防止它變成「野指標」。因為乙個野指標可以指向任何記憶體位址,並且可以對該位址中的數值進行隨意地修改或刪除,這樣很可能對整個程式造成不良後果!所以在定義指標的時候,一定要先將其初始化成0,即上面函式中的「int *p=0」。這樣就會把這個指標的值限定成為0,從

而不會引發野指標的問題。

們在這裡分析一下造成這種原因的機理。(注:在這裡的矩形分別代表了整型變數i和指標變數p。矩形框中間的大矩形代表了該變數的數值,而小矩形代表了該變數的位址。)我們可以看到,如藍色的筆所示,i的位址為a,p的位址為b。現在有綠色的筆標出了程式第13行中的語句,將i的位址賦給p,那麼如右圖所示,p裡面的值就成為了i的位址a。在看看紅筆。我們採用了間接運算子*訪問i的值。正如紅線所標示的一樣,首先,它從p的值中找到i的位址為a,然後在從i的位址中讀取到i的值為3。這樣,就完成了利用指標p讀取整型變數i的值了。

這也是為什麼我們在程式之初需要對指標p進行初始化的原因了。從上面可以看出,只要*p修改了i的值,那麼連i自己也會把自己的值從3修改到了5。這就好比是我通過位址找到你家,然後我在你家裡面把你家的電視機拿了,那麼你家就真沒有電視機了~~~雖然我舉得這個例子不是很恰當,但是這個就是指標能幹的事情啊,囧啊~~~   

另外,程式第13行和程式第17行的位置千萬不要搞顛倒了哈。這裡面是有邏輯順序的。首先我們需要向指標p說明變數i的位址(p=&i),之後我們才能對其進行操作(*p=5)。這裡絕對不可能是先操作了再找位址,這肯定是不符合邏輯的。如果程式這樣寫,在編譯的時候不會犯錯,但是執行的時候錯誤就出來了,如下:

好了,收工~~~

關於繼承比較容易混淆的概念

1.繼承分為public繼承 protected繼承 private繼承 public繼承表示是乙個的概念,最常用。所有的public protected private引數都按原來屬性繼承下來,其中父類的private子類可能訪問 private繼承,表示有乙個的概念,所有的public prot...

c 容易混淆的概念

簡單地說,c 標準庫包含了三個部分 c 標準庫的 c 版本 c io 庫 c stl io 庫最常用的 header 是 標頭檔案 stl 包括了很多容器類 vector,list,deque,stack.還有 functinal,algorithm,iterator 等 c 標準庫的 c 版本 設...

指標與引用的三個概念

1.對常量的引用 const int ci 1024 const int r ci r 42 錯誤,r 是對常量的引用 int r ci 錯誤,試圖讓乙個非常量引用指向乙個常量物件 注 1 引用並非物件,它只是為乙個已經存在的物件所起的另乙個名字。2 引用只能繫結在物件上,而不能與字面值或某個表示式...