C 中引用 指標 const

2021-07-29 06:28:16 字數 2798 閱讀 7029

引用變數名不存在實體,即在記憶體中存沒有為此變數開闢記憶體空間。如int a0,程式會在記憶體中建立2或4位元組的空間儲存a0變數,但int &a1=a0,並不會在記憶體中開闢乙個2或4位元組的空間來儲存a1,而是將a1和a0關聯起來,通過操作a1可操作a0(功能類似指標),既然如此,為何非得多此一舉?用途見下。

引用在定義之初就必須繫結乙個變數(如1.1中int &a1=a0),不能只宣告而不繫結(如 int &a2 就會編譯錯誤)。因為它不存在實體,是另乙個變數的別名,所以建立之初就必須繫結,這點與指標不同,指標可以修改指向的變數。由於引用不存在實體,所以不能將引用繫結在另乙個引用上。但實際int &a3=a1可以執行,因為此句相當於執行int &a3=a0;

引用變數必須和繫結的變數匹配(如1.1中 int a1繫結 int a0,如果繫結的型別不匹配會錯誤,如char &a4=a0會出錯 )。

1.4->

多個引用可以繫結同乙個變數。

指標存在實體,即int *a5,即在記憶體中開闢了乙個記憶體空間(4位元組),用來儲存a5。

指標定義和初始化可以分開(如2.1,也可以先定義,再繫結a5=&a0,即將a5指向a0;也可在定義之初繫結 如int*a6=&a0),而且指標可以通過修改其值指向不同物件或變數(如int b;a6=&b,即可將a6從指向a0,改為指向b)

陣列在編譯時也會將陣列名轉化為指標,如int a7[2 ] =就定義了乙個int型陣列a7,包含2個int 變數。a7當做指標來用時,其值指向第乙個變數位址,*a7 就是a7[0],

*(a7+1)就是a7[1]。

指標最好在定義之初就初始化,避免後續誤操作。

指標存放的是乙個位址,但引用不存在實體,所以不存在指向引用的指標,但int *a8=&a1,可以執行,實際此句執行 int *a8=&a0,因為a1是a0別名。

const 修飾的變數不可變,所以在定義之初就必須初始化。如const int a8=3(也可寫作int const a8=3),也可用變數初始化 如const int a9=a7[1],之後不可更改,a8=3不允許,即使賦一樣的值也不可。

const 修飾符和引用(重要):普通引用(未被const修飾)只能繫結普通變數,const 引用可以繫結普通變數,也可繫結const 變數。

如 int b311=0; const int b312=1;

int &b313=b311;//允許,b313繫結b311,通過b313和b311均可修改b311

const int &b314=b311//允許,b314繫結b311,只能通過b311修改b311。

const int &b315=b312//允許,b315繫結到常量,

int &316 =b312//不允許,int 型別不能繫結const

const 修飾符和指標(重要):const修飾符修飾距離它最近的變數。

3.2.1未被const 修飾的普通指標,只能指向普通變數

int *p321=&b311;

3.2.2常量指標(指向常量的指標pointer to const),此指標可以指向常量,也可以指向普通變數

const int *p322=&b311;//允許,const  距離 *p322近,所以它修飾的是(*p322)這個整體,,即指向常量的指標。

const int *p323=&b312;//允許,同上

3.2.3指標常量(指標所存的位址是常量,const pointer):此指標只能指向普通常量,且不能指向其他物件,因為此指標是乙個常量。

int * const p324=&b311;//允許,p324一直指向b311,不能指向其他量,因為const 修飾 p324,這個指標內容不可改。

int *const p325=&b312;//不允許,b312是乙個常量,p325是乙個指標常量,const僅僅修飾此指標內容為常量

3.2.4常量指標常量(指標所指物件是常量,並且指向乙個固定的變數,不可更改)

const int * const p326=&b312。//const p326 內層const 修飾p326,* const p326 指這個指標指向固定變數,外層const 修飾這個整體,即指向的變數也是乙個const變數

函式引數傳遞分為傳值(指標傳遞所傳的本質也是數值,只不過是傳遞進來物件的位址),傳引用。

int c40=1,c42=2;

int add(int x,int y)

add(c40,c41);//在執行時,內部建立臨時變數,函式執行後不更改引數本身值。

int add(int *x,int y)

add(&c40,&c41);//執行時,通過傳遞進來的變數位址,定址到引數本身,進而修改。

int add(int &x,int y)

add(c40,c41);

//執行時,由於形參 是實參的引用,故也會修改外部引數。

int add( const int &x,const int &y)

add(c40,c41)//有const 修飾,不能寫成 x+=y;

int add(const int *p,const int *y)

add(&c40,&c41);//有const 修飾,不能寫成 *x+=*y;

可以看出:

形參用 const修飾後,函式在執行時,不能修改實參實際的值(如 4.4 寫成 return x+=y;則編譯不能通過)。這樣函式實現者在實現此函式時,不用擔心會修改實參的值,只是讀取實參值後做相應操作;而函式呼叫者在呼叫時,也不用擔心,呼叫時會對實參產生影響。

一般說來,使用4.4方式比4.5方式好,因為const 引用 形參綁實參後,會一直繫結,直到此函式結束。而const 修飾的指標傳入引數後,函式中對形參指標的誤操作可能會導致實參傳遞失敗。

c 引用 指標 const

1 const定義常量 const int valuename value 2 const與指標 指標常量 int const p 指標的位址不允許修改,值可以修改 常量指標 const int p 值不能修改,位址可以修改 指向常量的指標常量 const int const p 3 const與函...

引用,const引用,指標

引用,const引用,指標 一 引用 1 定義 引用不是定義乙個新的變數,而是給乙個已經定義的變數重新起乙個別名。2 宣告方法 型別 引用變數名 已定義過的變數名。3 特點 l 乙個變數可以取多個別名 但引用與其所代表的變數共享同一記憶體空間 模擬 人的別名 l 引用必須初始化,且必須宣告引用的型別...

指標和引用,const 指標和const 引用

指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...