對指針的理解

1、概念數組

  指針是一種數據類型,能夠操做內存;函數

  指針本質上是地址,指向以它爲地址的內存單元;指針

  指針變量是存放內存地址的變量。code

2、指針常量與常量指針對象

  char * const p:指針常量 ,本質是常量,這個指針是一個常量;
  const char *p :常量指針 ,本質是指針, 這個指針指向一個常量。blog

  ① const char *p  和  char const *p:   const修飾 *p,*p 只讀 ,不能夠修改, p 能夠改變; 
  ② char * const p:                               const修飾p,p只讀 ,不能夠修改, *p 能夠修改;
  ③ const char * const p:                     *p 和 p都是隻讀不可修改。內存

3、指針的運算class

  *   對指針指向的內存的地址進行取值操做
  &   取指針變量存放的位置
  ++   增長一個單位長度的地址
  --    減少一個單位長度的地址
  +   加一個數字表示增長數字個單位的長度的地址
  -   減一個數字表示減小數字個單位的長度的地址變量

4、空指針 NULL數據類型

  能夠指向任何類型對象的地址。

5、野指針

  指向一個非法的或已銷燬的內存的指針。
    ① 指針變量沒有被初始化 char *p;
    ② 指針p被free或者delete以後,只是把指針所指的內存釋放掉了,沒有改變指針的值(置空)。
6、萬能指針

  void * 能夠指向任意變量的內存空間 void指針能夠和其餘類型的指針任意轉換 可是不能直接參與指針運算。

7、指針與數組的區別和聯繫 

  ① 數組是存放多個相同類型數據的集合,指針存放的是地址。數組名能夠表明存放數組的內存地址,因此數組名本質上是一個指針;
  ② 同類型指針變量能夠相互賦值,數組只能一個一個元素的賦值或拷貝;
  ③ 數組在內存中是連續存放的,開闢一塊連續的內存空間。數組是根據數組的下標進行訪問的;
  指針很靈活,它能夠指向任意類型的數據。指針的類型說明了它所指向地址空間的內存;
  ④ 數組的大小:經過sizeof(數組名)/sizeof(數據類型)計算;
  指針的大小:在32位平臺下,不管指針的類型是什麼,sizeof(指針名)都是4;
  在64位平臺下,不管指針的類型是什麼,sizeof(指針名)都是8。

 8、指針做爲函數的參數時

  ① 在聲明&定義函數時,將參數定義爲指針形式,在調用該函數時,傳入對應的指針變量便可;
  ② 在調用指針參數的函數時,函數形參將傳入的指針實參中存儲的地址進行了複製,在函數內對指針所指向的內存進行直接操做,天然會修改原 實參指針 所指向的內存區域,由於這兩個指針指向的內存區域同樣。

9、引用與指針的區別

  ① 引用的本質是指針 ,引用的底層實現是指針;
  ② 引用不是實體變量 ,指針是實體變量;
    void* int* char* double* 4/8
    int& char& double&
  ③ 引用變量必須初始化 ,指針變量能夠初始化 也能夠不初始化(野指針);
       ④ 引用變量一經初始化 ,不能再引用其它對象;
    指針初始化以後 能夠改變指向 int * const p = &a;
  ⑤ 引用不能夠爲空引用 ,指針能夠爲空指針 NULL;
  ⑥ 能夠聲明指針的引用, 但不能夠聲明引用的指針;

int *p = NULL;
int*& rp = p;//指針的引用
int a = 0;
int& ra = a;
int& *p = &ra;//不行 錯誤的
int *p = &ra;

  ⑦ 能夠聲明指針的指針 ,但不能夠聲明引用的引用;

int a = 0;
int& ra = a;
int&& rra = ra;//錯誤的
int& rra = ra;

  ⑧ 能夠聲明數組的引用 ,但不能夠聲明引用的數組;

int arr[5] = {};
int (&ra)[5] = arr;//數組的引用 ra等同於arr
int a,b,c,d,e;
int& arr[5] = {a,b,c,d,e};//錯誤的 不行的

  ⑨ 萬能指針 void* 沒有萬能引用 void&。

 

10、高級指針

  ① 指針數組
    本質是數組 ,數組裏的元素是指針。

int* arr[10];
char * str[10];

  ② 數組指針
    本質是指針 ,指針指向一個數組。

 int arr[10];
 int (*pArr)[10] = &arr;
 int brr[5][8];
 int (*pBrr)[8] = brr;
 int (*pB)[5][8] = &brr;

  ③ 函數指針     本質是指針,  指針指向一個函數。   ④ 指針函數     本質是函數 ,函數返回一個指針。   ⑤ 函數指針數組:     本質是數組,  數組裏的元素是 函數指針。

相關文章
相關標籤/搜索