一、指針
1.指針持有一個對象的位址,稱為指針“指向”該對象。可通過指針可以間接操縱它指向的對象。一個指針有兩個存儲單元,一個是指針自己的存儲單元,裡面存放着所指對象的位址;另一個就是指針指向的對象的存儲單元,裡面存放該對象的值。
2.定義指針文法:
類型 *指針變量
;
3.指針引用方法:
int x = 100, y = 20;
int *pi = &x;
*pi = y; // 間接操作pi指向的x,即x = y
4.指針類型:指針的類型即指針指向的類型。
需要在定義指針時指出指針的類型。
type* pointer;
5.空指針:指針值為0時是一個空指針,即不指向任何對象的指針。
表示空指針的3種方法:;nullptr(在c++11中);預處理常量NULL
<cstdlib>
=6.指針運算:
同類型的指針可以進行相等和不等操作,結果是bool類型;
指針可以進行加或減整數值運算;
自增、自減運算适用于指向數組元素的指針;
7.void*指針:可以持有任何類型的位址值;相關的值是個位址;void指針隻能傳送該位址值或者和其他位址值進行比較;void指針不能到其他類型指針的直接指派。
二、引用
1.引用的定義和初始化:
類型 &引用名 = 初始值;
2.左值引用:左值引用又稱為别名,它可以作為對象的另一個名字;可以通過左值引用間接地操縱對象。引用一旦初始化,就不能再指向其他的對象。
定義:
type& refVariable = leftValue;//引用必須被初始化,初始值是一個有記憶體位址的對象
3.右值引用:
類型
&&右值引用變量 = 右值表達式;
右值引用由類型辨別符和兩個取位址符(&&)定義;
右值引用必須被初始化,初始值是右值表達式;
不能将右值引用直接綁定到一個左值上;
三、常量表達式和constexpr
1.常量表達式是指值不會改變并且在編譯過程中就能計算出結果的表達式。const描述的都是“運作時常量性”,即運作資料不可更改。
2.将對象聲明為一個constexpr類型,以便編譯器來驗證對象的值是否是一個常量表達式。聲明為constexpr的資料對象一定是一個常量,且必須用常量表達式初始化。
3.CV限定詞:
(1)const限定詞:關鍵字const限定的對象是不可改變的;
(2)volatile限定詞:關鍵字volatile限定的對象不能被編譯器例行優化。
4.指向const對象的指針(非const ):const type *cp; 或者type const cp;(cp的值不能改變)
指向非const對象的const指針:type const cp = initAddressValue;(cp是常量指針,初始化後值不能改變)
const type const cp = initAddressValue;
四、零散知識點:
1.range-for(簡化的for):從頭到尾對容器或序列的所有元素逐個執行某操作。暴力取值時使用。
文法形式:
for(declaration:expression)//expression是要處理的序列,declaration定義一個變量,表示序列中的每個元素 statements;statement是一條語句或語句塊,表示對元素的處理代碼
eg:
for(int e:{2,3,5,7,11,13,17,19}) sum+=e
2.auto和decltype
(1)auto為用auto聲明變量的類型,由編譯器去自動分析表達式的類型,推斷出變量的實際類型。定義auto變量必須有初始值
(2) 希望從初始值表達式推斷出要定義的變量的類型時,用auto
(3)希望從表達式推斷出要定義的變量的類型,但是又不想用這個表達式的值初始化該變量時,用decltype。
3.動态存儲空間管理
(1)new運算符:在堆上動态配置設定空間,建立對象,并傳回對象的位址;一般将new傳回的位址儲存在指針變量中,以便間接通路堆上的對象。
表達式三種形式:a.配置設定單個對象:new 類型 或者 new 類型(初始值)
b.配置設定多個連續存儲的對象:new 類型[數組大小]
c.定位new,在指定位置配置設定空間:new (指針) 類型;
(2)delete運算符:釋放new運算符配置設定的空間
b.釋放new配置設定的單個對象的delete形式:delete 指針;
c.釋放new配置設定的數組的delete形式:delete[] 指針;
d.定位new沒有對應的delete表達式;
(3)空懸指針
delete後的ip不是空指針,而是“空懸指針”,即指向不确定的單元
(一定不能這樣用,會産生很嚴重的錯誤,如果修改的系統中重要的一個資料,可能導緻系統崩潰)