指針學習筆記

一:指針的定義

c和c++有一個專門的存放地址的變量類型。這個變量叫做指針。
int* ip; //一個指向Int類型的指針
int** ip; //指向指針的指針
int *p[4]; //指針數組
int (*p)[4]; //指向數組的指針變量
int (*p)(); //指向函數的指針,函數沒有參數,返回int類型
int (*p[])(); //指向函數的指針數組,函數沒有參數,返回int類型
int (*(*f)(int,int))(int) //f是一個函數的指針,指向的函數的類型是有兩個int參數並且返回一個函數指針的函數,返回的函數數指針指向有一個int參數並返回int的參數
分析:當看到這樣的一個複雜的定義時,最好的處理方法就是從中間開始和向外擴張。“從中間開始”的意思是從變量名開始,這裏指的是f。“向外擴展”的意思是先注意右邊最近的項(在這個例子中f右邊是右括號結束),然後注意左邊(左邊是*,表示是一個指針,指針指向一個...),然後注意左邊(右邊爲(int,int),...帶兩個int類型參數的函數....),然後看左邊(左邊是*,表示函數返回的是一個指針),再看右邊(右邊是(int),...帶一個int參數的函數...),再看左邊(int指示函數返回int類型)。大多數申明都是以右-左-右....動作的方式工作的。

 

二:const指針與指向const的指針
const int* p; //指向const的指針
int* const p; //const指針
分析:從變量P向左看;
對於const int* p,可以看出它左邊對應的先是 int*,可以說明它是一個int類型的指針,然後接着是const,可以說明它是一個指向const類型的指針
對於int* const p,可以看出它左邊對應的先是const,可以說明p是const修飾,然後它左邊對應的是int*,說明它是一個int類型的由const修飾的指針
 

不能把一個非const對象的地址賦給一個非const指針

 

三:指針和引用的差別

(1)非空區別。在任何情況下都不能使用指向空值的引用。一個引用必須總是指向某個對象。因此如果你使用一個變量並且讓它指向一個對象,但是該變量在某些時候也可能不指向任何對象,這個時候你應該把變量申明爲指針,因爲這樣你可以賦空值給該變量。相反,如果變量肯定指向一個對象,例如你的設計不允許變量爲空,這時你就可以把變量聲明爲引用。不存在指向空值的引用這個事實意味着使用引用的代碼效率比使用指針要高。

(2)合法性區別。在使用引用之前不需要測試它的合法性。相反,指針則應該總是被測試,防止其爲空。

(3)可修改性區別。指針與引用的另一個重要的區別是指針可以被重新賦值以能指向另一個不同的對象。但是引用則總是指向在初始化時被指定的對象,以後不能改變,但是指定的對象其內容可以改變。

 

四:void指針

如果聲明指針是void*,它意味着任何類型的地址都可以間接引用那個指針。

例如:

  1. int mian()
  2. {
  3. void* vp;
  4. char c;
  5. int i;
  6. double d;
  7. vp = &c;
  8. vp = &i;
  9. vp = &d;
  10. }

一旦我們簡介引用一個void*,就會丟失關於類型的信息。這意味着在使用前,必須轉換成真確類型。

例如:

  1. int main()
  2. {
  3. int i = 3;
  4. void* vp = &i;
  5. //*vp = 3; //錯誤用法,必須先將其轉換成int類型後再使用
  6. *((int*)vp) = 3;
  7. }

 

五:空指針和迷途指針的區別

空指針:指向NUll的指針叫做空指針

迷途指針:當delete一個指針的時候,實際上僅是讓編譯器釋放內存,但指針本身依然存在。這時它就是一個迷途指針,也叫懸浮指針、失控指針。

通常,如果在刪除一個指針後又把它刪除一次,程序就會變得非常不穩定,任何情況都有可能發生。但是如果只是刪除了一個空指針,則什麼事都不會發生,這樣做非常安全。

使用迷途指針或是空指針是非法的,而且有可能造成程序崩潰。如果指針是空指針,儘管同樣是崩潰,但它同迷途指針造成的崩潰相比是一種可預料的崩潰。這樣調試起來方便的多。
 

六:杜絕“野指針”

“野指針”的成因有三種:

1.沒有初始化指針變量。任何指針變量剛被創建時不會自動成爲null指針,它的默認值是隨機的,它會亂指一氣。所以,指針變量在創建的同時應該初始化,要麼將指針設置爲NULL,要麼讓它指向有效內存。

例如:

char *p = null;

char *str = new char;

2.指針P被free()或者delete之後,沒有置爲NULL,讓人誤以爲P仍然是一個有效的指針。

3.指針操作超越了變量的作用範圍,這種情況讓人防不勝防。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章