指針和引用,const 指針和const 引用

指針和引用是在使用中經常弄混淆的兩個概念。

引用(reference)爲對象起了另外一個名字,用符號&表示。 &name,例如:

int i=1024;

int &ref=i;

一般在初始化變量時,初始值會被拷貝到新創建的對象中,然而定義引用時,程序把引用和它的初始值綁定(bind)在一起,而不是將初始值拷貝給引用。一旦初始化完成,引用將和它的初始值對象一直綁定在一起。因爲無法令引用重新綁定到另外一個對象,因此引用必須初始化。

ref=2;               //即 i=2;

int &ref2=ref;        //ref2 綁定到了那個與ref綁定的對象上,即i上

引用並非對象,因此,不能定義引用的引用。引用只能綁定到對象上,不能與字面值綁定

int &ref3=1024;             //error

 

指針

指針與引用的區別:其一,指針本身就是一個對象,允許對指針賦值和拷貝,而且在指針的生命週期內它可以先後指向不同的對象;其二,指針無須在定義時賦值。

double *ptr;         //ptr 是指向double型對象的指針

指針的值是某個對象的地址

double val=1.0;

double *pval=&val; 

利用指針訪問對象要用解引用符

cout<<*pval; //指針解引用就是所指向的對象

*pval=2.0;  //val的值被改變了,指針pval並沒有變

 

void * 是一種特殊的指針類型,可用於存放任意對象的地址。但不能直接操作void* 指針所指的對象,因爲我們並不知道這個對象到底是什麼類型,也就無法確定能在這個對象上做哪些操作。

 

指向指針的指針

int i=1024;

int *pi=&i;

int **ppi=&pi;

 

指向指針的引用

int i=42;

int *p;

int *&r=p; //r 是一個對指針p的引用

r=&i; //賦值改變的是左邊的對象,這裏r是p的另一個名字,所以給r 賦值就是令p指向i

*r=0; //解引用r得到i,也就是p所指向的對象,將i的值改爲0

 

理解r的類型,最好的辦法是從右向左閱讀r的定義。&表示r是一個引用,左邊的部分是用以確定r引用的類型到底是什麼。* 說明r引用的是一個指針,int 說明r引用的是一個int 指針

 

const

因爲const對象一旦創建後其值就不能再改變,所以const對象必須初始化。

在多個文件之間共享const對象:file1: extern const int bufSize=1024;                  file2 :extern const int bufSize;

 

const 的引用

const int  ci=1024;

cont int &r1=ci;  //fine

int &r2=ci;     //error

如果對r2 的初始化正確,則可以通過r2來改變ci的值,這跟ci是const int類型 不能改變是衝突的,所以r2語句是錯的

int i=42;

int  &r1=i;   //fine

const int &r2=i;  //fine

(注:引用的初始值必須是一個對象,但const 的引用可以是字面值。)

const int &r3=2; //fine

int &ref=10;  //error 

 

const  的指針(指向const對象的指針)

同樣的,過一個對象是const,則只能使用指向常量的指針;普通指針會嘗試修改所指向對象的值

const  double  p=3.14;

const double * cptr=&p; // fine

double *ptr=&p; //err

 

const 指針(常量指針)

常量指針:一旦初始化完成,則存放在指針中的那個地址(指針本身的值)不再改變了

int   i=10;

int  *const ptr=&i; //ptr 一直指向i

const double  pi=3.14;

const double * const   ptr2=&pi;  //ptr2 是一個指向常量對象的常量指針

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章