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