1. 程式人生 > 其它 >C++篇:第五章_指標_知識點大全

C++篇:第五章_指標_知識點大全

  • C++篇為本人學C++時所做筆記(特別是疑難雜點),全是硬貨,雖然看著枯燥但會讓你收益頗豐,可用作學習C++的一大利器

六、指標

(一)指標規則

  1. 兩個指標不能進行加法運算,因為指標是變數,其值是另一個變數的地址,故兩地址相加沒意義,但可以用一個空指標賦值給某個指標變數,值為NULL

  2. 如果兩個指標是指向同一型別的兩個指標,則兩個指標之間可以進行相減(實際是所指向物件的相減)和關係、運算

  3. 無論任何指標在32位系統中是4位元組 64位系統中是8位元組

  4. 初始化為NULL的類指標,可以安全的呼叫不涉及類成員變數的類成員函式而不會出錯

  5. 初始化指標時所建立的字串常量被定義為只讀。如果試圖通過指標修改這個字串的值,程式就會出現未定義的行為,例:char* s="AAA";

  6. 指標本身存於棧中

  7. 當free釋放記憶體之後,指標還指向原來的那塊地址,需要我們設定 p = NULL;如果不手動設定 p = NULL,此時P就變成了野指標;野指標產生原因:

  8. 宣告的指標未被初始化,指標預設值隨機產生。建立指標應該將其初始化為NULL或者指向某一記憶體。

  9. free和delete掉的指標未重置為NULL,free後的指標仍指向該記憶體,但該記憶體已變為垃圾記憶體。

  10. 空指標(值為0)不指向任何實際的物件或函式,反過來說物件或函式的指標也不可能為空指標

  11. C++的指標有資料指標,函式指標,資料成員指標,成員函式指標四種,後兩種是C++專門為類擴充套件的稱為成員指標

  12. 不要試圖通過改變形參指標變數的值而使實參指標變數的值改變,因為實參變數和形參變數之間的資料傳遞是單向的

當實參是地址(如&a),傳遞的是地址,則仍然是傳值方式,當實參是變數名,而傳值的是變數的地址,才是傳址方式

  1. 在使用一個指標之前,必須先賦初始值

(二)指標使用

  1. 如果p=&a,p+4指的是p的值+4,也就是a+4(ASCALL碼+4),因此為e;(p+4)指的是首地址後移4位再取值

  2. int &i; /沒有這種語法/ int &i; /沒有這種語法/

    3. 定義:

① void f() ; // 無返回值

② void* f(); // 返回一個無型別指標

③ int (p[10])(int) // 定義了一個指標陣列,陣列元素都是int (*p)(int *)的函式指標,所以p是一個函式指標陣列

④ 64 位情況下:

(1) char ** p[4] // 表示char**陣列返回 4 * 8 = 32

(2) char * (* p)[4] // 表示指向 char* 陣列的指標返回8

(3) char (**p)[4] // 表示指向 char陣列的指標的指標返回8

 指標前加&是什麼意思

(1) 在定義時使用,如
int *a;
int * &p = a;
這種是C++中的引用(引用全部是const型別),p本身不佔用記憶體空間,只是a的一個別名,對p的訪問完全等同於對a的訪問。

(2) 在非定義時,指標前加&表示取指標的地址。如
int * a;
int **p = &a;
這裡a本身是指標變數,每個變數都有自己的記憶體空間,對變數做&操作,可以取得這個空間的首地址。於是&a就是取a的地址賦值給p,這樣,*p就等同於a

 函式指標:void (*f)(); // 宣告一個指標,指向void x()型別函式,定義函式指標需要打括號

(1) 函式指標所指向的函式,返回值型別,形參列表必須完全匹配

⑦ char (*p)[16]:p是指向長度為16的字元陣列的指標(括號中有指標表示,這個變數就是指標型別)

⑧ char p[16]:由於[ ]比優先順序高,因此p先與[4]結合,形成p[4]的陣列的形式。然後與p前面的“ * ”結合,“ * ”表示此陣列是指標型別的,故為指標陣列

  1. 指標和void*可以相互轉化(結合筆記P28void型指標)

  2. 檔案指標指向的是一塊記憶體區域,這塊區域儲存著開啟的檔案的相關資訊,包括檔案讀取指標當前位置、檔案讀取緩衝區大小等資訊,並不是指向檔案的。fscanf是從檔案中格式化讀取,fprintf才是向檔案中格式化寫入

  3. 指標允許0值常量表達式,例:int *P;P=0;

(三)const與指標

  1. 口訣:左定值,右定向。 const在的左邊不能改變字串常量的值;const在的右邊不能改變指標的指向

  2. 把一個const物件的地址賦給一個非const物件的指標變數是錯誤的,但反之可以

  3. int const p // 型別為int const,此時為常指標其指向不能改變

const intp // 型別為const int,此時為指向常量的指標變數,不能通過P修改其指向的物件的值

(四)陣列與指標

  1. int a[ ] = { 2,4,6,8 },*p=a;(注意與上面的二維陣列進行區分)
  2. 陣列名為常量指標,只能在定義是初始化,不可把其當作普通指標單獨賦值或出現在左值和某些算術運算中,只有作為引數傳遞時才退化為普通指標
  3. 兩個指標指向同一個陣列的元素則可以進行比較,不指向同一陣列則比較是無意義的
  4. *(a+1)[5] 這種表示不正確,因為就像int a[5];宣告一個長度為5的int型別陣列。這裡,a[5]只是一種宣告的寫法,這裡宣告的變數是a,不是a[5]

(五)函式與指標

  1. Int (*P)(int a); // 定義函式指標變數;可以將函式的地址(函式名)賦值給函式指標變數。但要求函式指標變數與指向函式必須有相同的返回型別、引數個數、引數型別

(六)結構體與指標

  1. 想訪問用new 所開闢的結構體空間,無法直接通過變數名進行,只能通過指標進行訪問

  2. 如果要建立一個動態連結串列,必須從第1個結點開始,逐個的開闢結點並輸入各結點資料,通過指標建立起前後相連的關係