2.3復合類型
2.3.1引用
在C++11標準中,增加了一個右值引用,稍微高級的東西,以後會更新。
一般來說引用都是說的左值引用。
這裏就有一個問題,什麽是左值,什麽是右值。
簡單一句話:左值長久,右值短暫
引用其實就是給對象起了另一個名字。
如:
int ival = 0;
int &refVal = val; //refVal就是引用,是ival的別名
因此,既然是別名,我們就可以通過改變別名,來改變對象。
refval = 20; //此時ival就等於20
可以測試refVal和ival的地址,我測試的時候地址都為0x7fff5fbff9c8,這裏也可以看出來兩者其實在內存中位置一樣。
註意:引用必須初始化。
但引用本身不是對象,它只是一個別名
特別的:引用在傳參數上有極大的用處
2.3.2指針
對於一個C/C++程序員來說,指針這個東西非常重要。。。但是也很頭疼,稍不註意就內存就GG。
指針也是一種復合類型,但是指針與引用不同:
1.指針本身就是一個對象,允許對指針賦值和拷貝
2.指針不用在定義時就給初值,如果指針在塊作用域內沒有被初始化,就將擁有一個不確定的值。
指針聲明用*:
int *ptr1, *ptr2; //ptr1和ptr2都是指向int對象的指針
指針指向某個對象的地址:要想獲取該地址,需要使用取地址符&
int ival = 0;
int *p = &ival; //p存放了ival的地址,也就是p指向了ival
註意:指針的類型要和指針所指的類型匹配
指針的值應該屬於下面4中狀態之一:
1.指向一個對象
2.指向緊鄰對象所占空間的下一個位置
3.空指針,意味著指針沒有指向任何對象
4.無效指針
試圖拷貝或以其他方式訪問無效指針的值會引發錯誤,編譯器也不會檢查這種錯誤,因此必須清楚知道指針是否有效。
訪問對象用解引用符*:除了聲明指針用*外,其余位置使用*都為解引用
int ival = 0;
int *ptr = &ival;
cout << *ptr; //輸出0
對指針解引用會訪問指向的對象,因此如下:
*ptr = 10;
cout << *ptr << " " << ival; //輸出結果都為10
空指針:空指針不指向任何對象,優秀的做法是使用一個指針之前檢查它是否為空
int *ptr1 = nullptr; //等於int ptr1 = 0,nullptr是C++11新標準引入的方法,是一種特殊類型的字面值,可以被轉化為任意其他指針類型
int *ptr2 = 0; //直接將p2初始化為字面常量0
int *ptr3 = NULL; //等於int *ptr3 = 0
Tips:建議初始化所有指針,詳情見Effective C++條款4中描述和C++primer P49
void* 指針:是一種特殊指針,可用於存放任意對象的地址。但是我們不能了解改地址到底是什麽類型對象。
註:任何類型指針在32位系統中都為4字節大小,在64位系統中為8字節大小,指針和數組關系很大,後面介紹,指針深入理解也可以看看深入理解計算機系統
2.3復合類型