1. 程式人生 > >陣列和指標,怎麼去理解?

陣列和指標,怎麼去理解?

指標可以幫助開發人員處理複雜的資料結構,直接處理記憶體地址。

但是不恰當地使用指標將會導致記憶體洩露、記憶體懸掛、野指標(不安全指向)等問題的出現,

將威脅到軟體系統的穩定性和安全性。

記憶體懸掛:如果已釋放了物件,卻沒有將對應的指標置為NULL,該指標就是所謂的“懸掛指標”。

delete p; p=NULL;

野指標:指向被釋放的或者訪問受限的垃圾記憶體的指標。

成因:沒有被初始化,delete或free後沒有置NULL,指標操作超越了變數的作用範圍。

class A
{
public:
void Func(void){ cout << “Func of class A” << endl; }
};
class B
{
public:
A *p;
void Test(void)
{
A a;
p = &a; // 注意 a 的生命期 ,只在這個函式Test中,而不是整個class B
}
void Test1()
{
p->Func(); // p 是“野指標”
}

};

一個指標變數有兩個屬性,一個是它的值(即地址),另外一個是它的型別。

指標的資料型別有兩個作用:

1、指示編譯在解引用時從記憶體中讀取幾個位元組,指標指向 下一個元素記憶體 跳變幾個位元組; ——關於這個還是要繼續找找資料看看吧

2、指示編譯在進行指標型別轉換時如何進行型別檢查和匹配。       int nValue=0xFF00;

C/C++中有兩類特殊指標:空指標和void型指標

空指標可以給任何指標賦值,所以空指標一般用於判斷指標是否合法。

void型指標,又稱通用指標,可指向任何變數。C語言允許把任何變數的地址作為指標賦給通用指標。

表示這個指標指向的記憶體中的資料的型別要由使用者來指定。

比如記憶體分配函式malloc函式返回的指標就是void *型,使用者在使用這個指標的時候,要進行強制型別轉換;

也就是顯式說明該指標指向的記憶體中是存放的什麼型別的資料。如:

(int *)malloc(1024)————表示強制規定malloc返回的void*指標指向的記憶體中存放的是一個int型資料。

指標變數支援解引用、算數操作等基本操作。

解引用:

對於c語言中指標的操作符有兩個:&和*。

對於&,好理解,翻譯的也不錯,就是“取地址”的意思。

但對於*,翻譯為“解引用”,是“取指標指向的地址的內容”。

算數操作:

   可實現指標的移動。如果指標指向一個數組,通過指標的算數操作在指向陣列某個元素的指標上加上(減去)一個整型數值,

就可以計算出指向陣列另外一個元素的指標值。

int ia[]={1,2,3,4};
int *pa=ia;            //pa 指向ia[0]
int *pa2=pa+4;    //pa2指向ia[4]

注意:算數操作僅支援兩種形式:指標+/-整數 (如上面程式碼); 指標 - 指標。

如果兩個指標指向同一個陣列,它們就可以相減,其結果為兩個指標之間的元素數目。

無指標+指標,以及不能對void *指標進行算數操作。

如果還不是很懂,可以看看http://blog.csdn.net/gdmmhym/article/details/6451554 這個網頁的東西,解釋的還挺清楚的。

const 修飾指標

有兩種:指向const物件的指標; const 指標。

指向const物件的指標,不允許用指標修改指標所指向的物件。

const指標,能過指標可實現所指向物件的修改,但不允許指標的值發生變化。“自以為指向const的指標”