一、指標基本概念
指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。學習指標必須瞭解如下四個內容:
1指標的類型:去掉標識符,指標的類型對於機器而言都是一樣的
2指標指向的類型:去掉標識符和左邊的*
3指標的值:一個32位的數值(一般是記憶體位址)
4指標指向的記憶體地區:指標的值代表指標指向記憶體地區的首地址,指標指向的類型決定了該記憶體地區的大小。指標的移位操作和指標指向的類型有關動,指標一次移動一個sizeof(指標指向的類型)大小。
(1)int*ptr
=0;//指標的類型是int*
指標所指向的類型是int,指標的值為0(非法地址)表示指標未指向合法記憶體。
(2)int**ptr;//指標的類型是int** 指標所指向的的類型是int*
(3)int(*ptr)[3];//指標的類型是int(*)[3] 指標所指向的的類型是int()[3]
(4)int*(*ptr)[4];//指標的類型是int*(*)[4] 指標所指向的的類型是int*()[4]
二、指標相關的運算:
1&:取地址運算子,返回結果是一個指標(地址值都可以轉換為指標),&a的運算結果是一個指標,指標的類型是a的類型加個*,指標所指向的類型是a的類型,指標所指向的地址,就是a的地址。
2*:間接運算子,
*p的結果是p所指向的記憶體代表的值,它的類型是p指向的類型,它所佔用的地址是p所指向的地址,他的值是p指向記憶體的值。
當一個指標運算式的結果指標已經明確地具有了指標自身佔據的記憶體的話,這個指標運算式就是一個左值,否則就不是一個左值。
三、指標和數組
數組的數組名其實可以看作一個指標。一般而言數組名array代表數組本身,類型是int[10],但如果把array看做指標的話,它指向數組的第0個單元,類型是int*,所指向的類型是數組單元的類型即int。聲明了一個數組TYPEarray[n],則數組名稱array就有了兩重含義:第一,它代表整個數組,它的類型是TYPE[n];第二,它是一個指標,該指標的類型是TYPE*,該指標指向的類型是TYPE,也就是數組單元的類型,該指標指向的記憶體區就是數組第0號單元,該指標自己佔有單獨的記憶體區,注意它和數組第0號單元佔據的記憶體區是不同的。該指標的值是不能修改的,即類似array++的運算式是錯誤的。
在不同的運算式中數組名array可以扮演不同的角色。
在運算式sizeof(array)中,數組名array代表數組本身,故這時sizeof函數測出的是整個數組的大小。
在運算式*array中,array扮演的是指標,因此這個運算式的結果就是數組第0號單元的值。sizeof(*array)測出的是數組單元的大小。
運算式array+n(其中n=0,1,2,....。)中,array扮演的是指標,故array+n的結果是一個指標,它的類型是TYPE*,它指向的類型是TYPE,它指向數組第n號單元。故sizeof(array+n)測出的是指標類型的大小。
四、指標安全
在操作指標時,一定要明確指標的類型和指標指向的記憶體地區。指標導致的常見錯誤:
1 當指標值為非法記憶體位址(通常是未對指標初始化或者使用非法資料轉換為指標值)對地取地址操作會導致“記憶體不可read”錯誤;
2 當指標指向記憶體地區未被分配時,會導致“記憶體不可write”錯誤。