C語言指標要點

2021-07-09 14:46:14 字數 1903 閱讀 6481

乙個有效的指標必然是以下三種狀態之一: 儲存乙個特定物件的位址; 指向某個物件後面的另乙個物件; 或者是0值(注意只能是0常量的表示式,或者直接0。絕對不能來個變數0)

int

*pi2 = & ival;

pi2 = 0;

int*pi3; //dangerous, because pi3 is uninitialized

一定要避免使用為初始化的指標:

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

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

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

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

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

//cstdlib #defines null to 0

int *pi = null;// ok:

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

void *指標

c++提供了一種特殊的指標型別void *,它可以儲存任何型別物件的位址。

double obj = 3.14;

double *pd = &obj;

// ok: void* can hold the address value of any data pointer type

void *pv = &obj; //obj can be an object of any type

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

void*指標只支援集中有限的操作:與另乙個指標進行比較; 向函式傳遞void*指標或從函式返回void*指標; 給另乙個void*指標賦值。

不允許用void*指標操縱它所指向的物件。

解釋下列宣告語句,並指出哪些是非法的,為什麼?

const int i =0, *p = i; //合法,const int型物件i和指向const int型物件的指標p, i初始化為0, p初始化為0。
已知乙個指標p,你可以確定該指標是否指向乙個有效的物件嗎?如果可以,如何確定?如果不可以,請解釋原因。

我原本的答案:可以,看該指標是否被初始化。

標準答案:不可以, 無法確定某指標是否指向乙個有效的物件。因為,在c++語言中,無法檢測指標是否未被初始化,也無法區分乙個位址是否為有效的位址,還是由指標所分配的儲存空間中存放的不確定值的二進位制位形成的位址。

解釋指標和引用的主要區別

1。定義引用時沒有初始化時錯誤的。

2。賦值行為的差異:給引用賦值修改的是該引用所關聯物件的值,而並不是使引用與另乙個物件關聯。引用一經初始化,就始終指向同乙個特定的物件。

C語言指標的學習要點

指標的定義 變數的指標,其含義是指該變數的位址 指標和指標變數 指標是乙個位址,指標變數是存放位址的變數 兩個運算子 是指標運算子,也叫 間接訪問 運算子,p代表指標變數p指向的物件。是取位址運算子,a是變數a的位址。例題 int point,a 4 point a 下面均代表位址的一項是 a.po...

C語言要點

一關鍵字 1.static 第乙個作用 修飾變數。變數又分為區域性和全域性變數,但它們都存在記憶體的靜態區。由於被static修飾的變數總是存在記憶體的靜態區,所以即使這個函式執行結束,這個靜態變數的值還是不會被銷毀,函式下次使用時仍然能用到這個值。static int j void fun1 vo...

C語言解惑要點

1 運算子的優先順序 2 型別轉換 2.1 有符號與無符號數 結果輸出為 2 2 1 2147483647 1 2147483647 2.2 浮點數與整數 3 控制流 這一部分主要需要注意if else之間的巢狀時的配對情況,及迴圈語句的終止條件與狀態。4 轉義字元 除了 n t這一類的轉義字元,還...