概述
指針是c++中重要的數據類型,它可以對指針指向的實際物理內存地址中的值進行讀/寫
示意圖如下
定義指針
指針變量的定義方法爲數據類型 *變量名稱
指針變量的讀/寫爲*指針變量
該操作代表解引用,也就是訪問指針所指向地址的內存值
int a = 10; // 創建整數型變量a
int *ptrA = &a; // 創建整數型指針類型變量ptr且初始化值爲變量a的地址
取地址符
&
是取地址符,它可以獲取某個變量所佔內存空間的內存首地址
指針大小及數據類型
指針的大小永遠只佔8(64位系統)或4(32位系統)字節
指針的數據類型則表示了這個指針指向的變量的數據類型,同時也代表指針指向內存的大小
int *ptrI = (int*)0x01;
// 這裏假設指針指向0x01首地址的控件,那麼這個指針所指向的內存空間就是0x01至0x04,因爲這個是int(4字節)類型的指針
空指針
我們可以將指針指向一個內存地址爲空的地址,通常這樣來作爲初始化,例如: int *prtI=nullprt;
野指針
野指針代表指針指向了一片沒有權限訪問的內存地址,並對這個內存地址進行操作,例如int *ptrI=(int*)0xFFFFFF
;
常量
常量指針const int *ptrInt = &itInt;
常量指針不允許修改指針所指向的值,也就是說不可以執行*ptrInt=10
的操作
指針常量int const *ptr = &itInt;
指針常量不允許修改指針的指向,也就是所不可以執行*ptr=&b
的操作
指針與數組
數組的數組名稱其實是這個數組所佔的內存空間的內存首地址,換言之是數組首元素的內存地址
訪問數組元素
以下案例展示了指針訪問數組元素
int array[10] = {1,2,3,4,5,6,7,8,9,10}; // 定義一個數組,我們假設array數組首元素地址爲0x123
int *ptrArray = array; // 爲什麼不需要&符,因爲數組名稱就是數組元素的首地址,所以prtArray=0x123
p+1; // 指針移動int個字節到0x127,因爲數組是順序的所以這是數組的第二個元素的首地址,以此類推。。。
p-1; // 指針移動int個字節到0x119,這裏指針指向了數組之外的內存地址,屬於越界操作
引用
引用其實實質上就是指針的一種封裝,它代表對某一變量的引用,通常使用在參數的傳遞上
引用的格式爲int &引用名稱 = 被引用對象
;
注意事項
- 引用必須要初始化,不可以
int &refInt;
這樣定義 - 初始化後不可以修改引用所指向的變量
// 案例
int a = 10; // 創建一個整數型變量a
int &refInt = a; // 創建一個引用對象,這個引用對象引用了變量a而不是a變量的副本,這裏可看成int *ptrInt = &a;
refInt = 100; // 變量a的值變爲100
引用做函數參數
在函數中我們可以將函數參數類型聲明爲引用類型,可以一定程度上代替指針
案例
void swapInt(int &a,int &b){
// 這裏交換了a,b變量實際參數的值
int tem = a;
a=b;
b=tem;
}
void main(){
int a=0,b=1; // 創建a b兩變量
}
/**
我們看成swapInt(int *a,int *b),裏面對a的調用你可以看成(*a),正因爲所以值才被交換
**/