聲明(declaration),定義(definition)
如果想聲明一個變量而非定義它,就在變量名前添加關鍵字extern,而且不要顯式地初始化變量.
extern int i;//聲明i而非定義i
int j;//聲明并定義j
extern double pi=3.1415;//定義
聲明可以被多次聲明
復合類型(compound type)--引用(reference)和指針(pointer)
引用(reference)
通過將聲名符寫成&d的形式來定義引用類型
int ival=1024;
int &refval=ival;
int &refVal2;//報錯,引用必須被初始化
引用并非對象,相反的,它只是為一個已經存在的對象所起的另外一個名字(引用即別名)
為引用賦值,實際上是把值賦給了與引用綁定在一起的對象.
引用只能綁定到對象中,不能把字面值或者某個表達式的值綁定到引用上.
int &val=1024;//報錯,不能把字面值賦給引用.
double i=3.1415;
int &val=i;//報錯:不能把double對象賦給int引用.
指針(pointer)
- 指針本身就是一個對象,允許對指針賦值和拷貝,而且在指針的生命周期內它可以先后指向幾個不同的對象.
- 指針無需在定義時賦初值.
- 定義指針的方法是將聲名符寫成*d的形式,其中d是變量名.
int *i,*i1;
double dp,*dp2//
- 獲取對象的地址:取地址符(&)
double val=3.14;
int *p=&val;//取val的地址賦值給指針p;
- 因為引用不是對象,所以不能定義指向引用的指針.
int i=1024;
int *p1=&i;//將i取地址賦給指針p1
int *p2=p1;//將p1指針賦給指針p2
//p2和p1指向的對象是同一個對象
- 利用指針訪問對象
如果指針指向了一個對象,則允許使用解引用符(*)來訪問對象.
int i=1024;
int *p=&i;//將i取地址賦給指針p
*p=2048;//指針p所指向的i也變成2048
- 空指針(null pointer)
c++11中增加了使用nullptr字面值來定義空指針
int *p=nullptr;//c++11中增加
int *p1=0;//將p2初始化字面量0;
int *p2=NULL;//需要首先#include <cstdlib>;
- void*指針
void*指針是一種特殊的指針,可用于存放任意對象的地址.要注意的是,不能直接在void*指針中操作void*指針所指向的對象,因為我們不知道void*指針所指向的是何種對象,但是可以通過static_cast進行類型轉換.
int i=1024;
void *p=&i;//將i取地址賦給void指針
cout<<*p<<endl;//錯誤,對void*指針不能操作輸出
int *p1=static_cast<int*>(p);//將指針p進行類型轉換賦給p1
- 對指針的引用
int i=1024;
int *p;
int *&r=p;//從右向左讀,r首先是個引用(&),
//然后其他聲明符的其他部分確定r引用的類型是什么,*標識引用的是一個指針
** 涉及到指針或者引用的聲明,一般有兩種寫法:(注意:沒有誰對誰錯)**
- 把類型修飾符(&或者*)和變量標識符寫在一起.
int *p=nullptr;//這種形式著重強調變量所具有的復合類型.
- 把類型修飾符(&或者*)和類型名寫在一起.
int* p=nullptr;//這種形式強調聲明定義了一種復合類型.
面對一條比較復雜的指針或者引用的聲明語句時,從右向左閱讀有助于弄清楚它的真實含義