1. 程式人生 > >2.3復合類型

2.3復合類型

其余 null ref cout 定義 ive c++ 等於 別名

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復合類型