指標的定義和初始化

2021-06-20 00:51:05 字數 2448 閱讀 8831

每個指標都有乙個與之關聯的資料型別,該資料型別決定了指標所有指向的物件的型別。例如,乙個int 型指標只能指向 int 型物件。

1.指標變數的定義

c++語言使用 * 號把乙個識別符號宣告為指標:

vector*pvec;

int        *p1, *p2;

string    *pstring;

2.另一種宣告指標的風格

在定義指標變數時,可用空格符號 * 與氣候的識別符號分別開來,如下:

string*  ps;

也就是說,該語句把ps定義為乙個指向 string 型別物件的指標。

這種指標宣告風格容易引起這樣的誤解:把string * 理解為一種資料型別,認為在同意宣告語句中定義的其他變數也指向 string 型別物件的指標。

如果使用下面的語句 :

string*  p1, p2;

實際上只把ps1 定義為指標,而ps2並非指標,只是乙個普通的string 物件而已。如果需要在乙個宣告語句中定義了兩個指標,必須在每乙個變數識別符號前再加符號 * 宣告:

string* ps1,*ps2;

3.指標的可能取值

乙個有效的指標必然是以下三種狀態之一:1.儲存乙個特定物件的位址;2.指向某個物件後面的另一物件;3.是0值。若指標儲存0值,表明它不指向任何物件。未初始化的指標是無效的,直到給該指標賦值後,才可以使用它。下面的定義是合法的:

int  ival = 1024;

int  *pi = 0;

int  *pi2 = &ival;

int  *pi3;

pi = pi2;

pi2 = 0;

4.避免使用未初始化的指標

就像使用其他沒有初始化的變數一樣,使用未初始化的指標時的行為c++標準中並沒有定義,它幾乎總會導致執行時崩潰。然而,導致崩潰的這一原因很難發現。

對於大多數的編譯器來說,如果使用未初始化的指標,會將指標中存放的不確定值視為位址,然後操縱該記憶體位址中存放的位內容。使用未初始化的指標相當於操縱這個不確定位址中儲存的基礎資料。因此,在對未初始化的指標進行解引用時,通常會導致程式崩潰。

c++語言無法檢測指標是否未被初始化,也無法區分有效位址和由指標分配到的儲存空間中存放的二進位制位形成的位址。建議在使用之前初始化所有的變數,尤其是指標!

建議:如果可能的話,除非所指向的物件已經存在,否則不要先定義指標,這樣可避免定義乙個未初始化的指標。

如果必須分開定義指標和其所指向的物件,則將指標初始化為0.因為編譯器可檢測出0值的指標,程式可判斷出該指標並未指向乙個物件。

5.指標初始化和複製操作約束

對指標進行初始化或賦值只能使用一下四種型別的值:

(1)0值常量表示式,例如:在編譯時可獲得0值的整型const 物件或字面值常量0.

(2)型別匹配的物件的位址。

(3)另一物件之後的下一位址。

(4)同型別的另乙個有效指標。

把 int 型變數賦值給指標是非法的,儘管此 int 型變數的值可能為0.但允許把數值 0 賦值給指標:

int  ival;

int  zero = 0;

const  int c_ival = 0;

int  *pi = ival;

pi = zero;

pi  = c_ival;

pi = 0;

除了使用數值0外,還可以使用c++語言從c語言中繼承下來的預處理變數null,該變數在cstdlib標頭檔案中定義,其值為0.如果在**中使用了這個預處理變數,則編譯時會自動被數值0替換。因此,把指標初始化為null等效於初始化為0值:

int  *pi = null;// ok:equivalent  to  int *pi = 0;

正如其他預處理器變數一樣,不可以使用null這個識別符號給自定義的變數命名。

6.void *指標

double  obj = 3.14;

double  *pd = &obj;

void *pv = &obj;

pv =pd;  //pd can be a pointer to any type

void *指標只支援幾種有限的操作:1.與另乙個指標進行比較;2.向函式傳遞void*指標或從函式返回void * 指標;3.給另乙個void*指標賦值。不允許使用void *指標操縱它所指向的物件。

初始化指標

includeusing namespace std int main nullptr 是 c 新標準引入的特性,visual c 2010 編譯器支援它。過去已經使用0或 null 編譯器將用 0代替此巨集 來初始化指標,當然它們現在仍然可以使用。但是,使用 nullptr 初始化指標要好得多。因...

指標的初始化

指標代表的是記憶體單元的編號或位址,通過指標就可以找到對應的記憶體單元。對指標進行初始化或賦值的實質是將乙個位址或同型別 或相相容的型別 的指標賦給它,而不管這個位址是怎麼取得的。1 指標的初始化 指標初始化時,的右運算元必須為記憶體中資料的位址,不可以是變數,也不可以直接用整型位址值 但是int ...

指標的初始化

下面的函式有什麼錯誤 int square volatile int ptr 這段 的目的是用來返指標 ptr指向值的平方,但是,由 於 ptr指向乙個volatile型引數,編譯器將產生類似下面的 int square volatile int ptr 由於 ptr的值可能被意想不到地該變,因此a...