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;
③ 函數指針 本質是指針, 指針指向一個函數。 ④ 指針函數 本質是函數 ,函數返回一個指針。 ⑤ 函數指針數組: 本質是數組, 數組裏的元素是 函數指針。