我們先研究兩種類型:引用和指針。
引用
note:c++11中新增了一種引用:所謂的“右值引用”,我們將會在後面具體的學習。當我們提到引用時,指的是“左值引用”。
引用爲對象起了另一個名字,引用類型引用另外一種類型。通過將聲明符聲明成&d的形式來定義引用類型,其中d是變量名:
int value = 1024;
int &d = value; //d指向value(d是value的另一個名字)
int &value2; //錯誤,引用類型必須初始化引用即別名:引用並非對象,相反,它只是一個已經存在的對象所起的另外一個名字。
定義一個引用之後,對其進行的所有的操作都是在與之對應的對象上進行的。
d = 2; //把2賦給d指向的對象,此處即是賦給value
int a = d; //與a = value的結果一樣。
指針
指針是指向另外一種類型的複合類型。
定義指針的方法是將聲明符寫成*d的形式,其中d是變量名。
int *p1,*p1;//p1,p2都是指向int型對象的地址
double *q1,*q2;//q1,q2都是指向double型對象的地址
獲取對象的地址
指針指向某個對象的地址,獲取對象的地址使用取地址符(&)。
int a = 2;
int *b = &a;
第二句定義了一個int型指針b,隨後初始化b令其指向int型對象
所有指針的類型都要和它指向的類型嚴格匹配
int a = 1;
double *b = a;//錯誤
利用指針訪問對象
如果指針指向了一個對象,則允許使用解引用符(操作符*)來訪問該對象。
int val = 4;
int *p = val;
cout << *p;//由符號*得到指針所指向的對象
空指針
空指針不指向任何對象,在試圖使用一個空指針之前代碼可以首先檢查它是否爲空。
以下爲幾種生成空指針的方法:
int *p1 = nullptr;//c++11新規範,等價於int *p1 = 0;
int *p2 = 0;//需要先#include cstdlib
int *p3 = NULL;//等價於int *p3 = 0;需要先包含頭文件。NULL爲預處理變量
最好使用nullptr,同時儘量避免使用NULL
賦值和指針
引用和指針都能提供對對象的間接訪問。
然而具體的實現細節中,二者有很大的不一樣,最重要的就是引用不是對象,在使用方面會到一個引用無法二次賦值的受限。
指針卻是無限制的,它可以和普通的對象一樣使用。
void*指針
void*類型的指針可以存放任意類型的指針