引用 : 就是爲對象起了另一個名字;例 : int i = 42; int &a = i;這裏 a是i的另一個名字;
定義引用時,程序把引用和它的初始值綁定在一起,而不是將初始值拷貝給引用;
因爲無法令引用重新綁定到另外一個對象,因此引用必須初始化;
引用並非對象,只是爲一個已經存在的對象起的另外一個名字;引用只能綁定到對象上,而不能與字面值或某個表達式的計算結果綁定在一起;
指針 : 變量名前一定要有 * ; 獲取地址 ,使用& ;
指針的類型 要與所指向對象的類型一致 ;
指針值 : 應屬於下列4中狀態 之一 :
1 , 指向一個對象;
2, 指向緊鄰對象所佔空間的下一個位置 ;
3 , 空指針 ,意味着指針沒有指向任何對象 ;
4, 無效指針 , 就是上述情況之外的其他值 .
試圖拷貝或以其他方式訪問無效指針的值都將引發錯誤 ,編譯器不檢查此類錯誤 ;
利用 解引用符(*) 訪問對象 ;
空指針 ;不指向任何對象 ;使用指針之前先檢查它是否爲空 ;
生成空指針的方法 :
int *p = nullptr; //等價於 int * p = 0;
int *p1=0; //直接將p1初始化爲字面值常量0;
int *p2 = NULL ;//等價於 int *p2=0; 需要引入 #include cstdlib;
建議初始化所有指針 ;在可能的情況下 ,儘量等定義了對象之後再定義指向它的指針 ;
對於兩個類型相同的合法指針,可以 用(==) 或 (!=)來比較,結果爲bool類型 ;如果兩個指針存放的地址值相同,爲true ;
兩個指針存放地址值相同 的3中情況 :
1, 都爲空 ;
2 ,指向同一個對象 ;
3, 都指向了同一個對象的下一地址 ;
void*是以一種特殊的指針類型,可存放任意對象的地址 ;因爲不知道這個對象是什麼類型,無法確定在這個對象上做哪些操作,所以不能直接操作void*指針所指的對象 ;
引用不是對象,沒有實際地址,所以不能定義指向引用的指針 ;
指針,引用 共同點 : 實現了對其他對象的間接訪問 ;
指針 與引用的區別 :
1,指針本身就是對象,允許對指針賦值和拷貝,而且在指針的生命週期內可以先後指向幾個不同的對象;
2, 指針無須在定義時賦初值;
指向指針的指針 :
int value = 12; //int 型變量
int *p = &value; // 定義指針p ,值爲value的地址
int **p1 = &p; //定義指針p1, 值爲p的地址;
int *p2 = p; //定義指針p2,值爲p存儲的值;
const限定符 :相當於java中的final ;
const對象一旦創建就不能再改變 ,所以必須初始化;初始值可以使任意複雜的表達式 ;
與非const類型所參與的操作相比 ,主要的區別在於只能在const類型的對象上執行不改變其內容的操作 ;
默認情況下 ,const對象僅在文件內有效 ; 解決辦法 : 對const變量,無論是聲明還是定義,都添加extern關鍵字 ;這樣只需要定義一次就可以在其他文件訪問了;
引用的類型必須與其引用對象的類型一致 ,例外情況之一 :
在初始化常量引用時,允許用任意表達式作爲初始值,只要該表達式的結果能轉成引用的類型即可;尤其允許一個常量引用綁定非常量的對象,字面值,甚至是一般表達式 ;
例 : int i = 42;
const int &r = i ;//允許const int &綁定到一個普通int對象上;
const int &r1 =42; //r1是一個常量引用 ;
const int &r2 = r*2;//
int & j = r * 2; / /錯誤 :j是一個普通非常量引用 ;
指針和const :
指向常量的指針 : 不能用指針改變所指對象的值 ; 存放常量對象的地址,只能使用常量指針;
指針類型必須與所指對象類型一致 例外之一 :
允許一個指向常量的指針指向一個非常量對象 ;
例 : const double i = 3.14;
const double *p = &i;
*p = 2; //錯誤 ,在這裏不能使用指針修改對象的值;
double d = 3.245;
p = &d ; //正確 ;這是例外情況之一;
常量 指針 : 使用const可以修飾任意對象,包括指針;
必須初始化 ,初始化完成,它的值(存放在指針中的地址)就不能再修改了.不變的是指針本身的地址值而不是地址所指的值 ;