關於引用及取位址 運算子的用法

2021-07-05 08:37:39 字數 2494 閱讀 1576

在習慣了c語言的程式設計師眼裡 , & 這個符號的意思就是取位址和對位進行與運算 , 但在c++中 , & 被過載多了一種意思 , 就是引用。

在這裡我就不介紹位與運算了 , 我先介紹一下取位址運算  ,在學習指標的時候我們就已經用過了取位址符了 , 使用方法為在變數前面加上&即可。

int i = 0 , *pi = &i;    //指標pi獲得了i的位址

int ** p_pi = π //指標p_pi獲得了pi的位址

cout << &i << endl

<< &pi << endl << &p_pi; //可以輸出位址

接下來是介紹引用 , 簡單來說 , 引用就是被引變數的另乙個名字 , 當改變引用值時 , 被引值也會改變 , 因為它們兩就是同乙個值 , 另外 , 引用不能脫離物件單獨存在 , 引用是依附與物件存在的 , 因為引用在定義後可能被使用 , 所以引用不能是無物件的 , 所以引用在定義時必須初始化。

int i = 0 , &ri = i;    //定義並初始化乙個引用

ri++; //使i的值變為1

//int &ri2; 這裡是非法的 , 因為定義了引用ri2卻沒有初始化它 , 在這行**和下一行之間可能使用無物件的引用

//ri2 = i;

//int &ri3 = 10;

//錯誤 , 引用必須有物件 , 常量沒有物件

因為引用是變數的別名 , 所以不能將某一種型別的引用繫結到另一種型別的物件上 , 比如不能將char & 賦予int型的變數。但同型別間的引用可以切換繫結 。

int i = 0 , j = 0;

//char &rc = i; 非法 , 因為不能用不同型別去引用

int & ri = i; //合法 , ri是i的引用

ri = j; //合法 , ri是j的引用

接下來講一下怎麼區別引用和取位址 , 可以這樣說 , 引用中的&只會出現在定義中 , 在變數型別(類)名後面(與指標相似) , 並且在接下來的**中 , &符號都不會再出現 , 只需直接使用引用定義的名字即可 , 而取位址符是不用繫結類名的 , 直接在變數(物件)左邊寫上& 即可(變數可以是指標或引用 , 畢竟它們也算是變數)。

int i = 0;

int &ri = i , *pi = &i; //前乙個&是引用 , 與型別名繫結在一起 , 後乙個是取位址

cout << ri << endl; //輸出i的值

cout << &i << endl; //輸出i的位址

cout << &ri << endl; //輸出ri的位址

cout << &pi << endl; //輸出pi的位址

為什麼要有引用 , 在c++這樣一種重視效率的語言裡 , 必然需要這樣一種型別 , 但我們呼叫乙個函式時 , 就必須把引數全部複製一次 , 這樣既浪費時間又浪費空間 , 但當我們把函式列表中的形參改為該型別的引用時 , 編譯器就不會把整個物件複製進去 , 而只是把物件的位址傳過去 , 這樣在函式裡使用的就是實參本身了 , 也能夠修改它的值。

void reference_test(int &i){   //傳入的是引用,不是位址!

cout << i <

int i = 5;

reference_test(i); //正確 ,i的值變為0

//reference_test(10); 錯誤 , 10是常量

//reference_test(&i); 錯誤 , &i是i的位址 , 不是int型

現在講一下為什麼不能把常量賦給引用 , 這裡需要引入左值和右值的概念, 從字面並不能準確的理解左值右值 , 從物件的用途來講 , 右值用的是物件中的內容而不在乎物件儲存的位置(記憶體中) , 而左值既要內容也必須需要儲存位置 , 從語句上講 , 左值能夠位於賦值表示式左邊被賦值 , 右值則不然 , 從存在時間來講 , 左值在作用域內會一直存在 , 右值在使用後就會馬上被銷毀。 綜上來看  ,左值在使用場合上多於右值 , 也能代替右值 , 但右值卻不能代替左值 。 定義的內建型別變數 , 物件 , 指標 , 引用等都是左值 , 而常數 , 字串常量 , 變數間運算後的值(如 i + 5  , 而不是 i = i + 5) , 函式返回的非引用值等都是右值。 這就是為什麼 int &ri = 5 是非法的了。因為引用必須繫結到左值。右值引用(&&)暫不討論。

int i = 0 , &ri = i , *pi = &i;   //均為左值

//下列均錯誤 , 均為右值

//ri = 10;

//ri = i + 5;

//ri = return_int(); return_int返回乙個int值

這裡也只是對引用的基本認識和用法做乙個了解 , 後面我會慢慢更新。

C 引用和位址運算子

在c 中,這個符號有兩個含義,一種含義是取某個變數或者物件的位址。這個位址是指記憶體位址,這個位址取到之後,可以賦給乙個指標。例如下面這樣 int a 5 int p a 這就表示,有乙個變數為a,其值為5,然後有乙個指標變數p,它儲存了變數a的位址。但c 中,還有乙個用途是定義引用常量。引用其實就...

php運算子取整 PHP運算子及php取整函式

ceil 進一法取整 說明float ceil float value 返回不小於 value 的下乙個整數,value 如果有小數部分則進一位。ceil 返回的型別仍然是 float,因為 float 值的範圍通常比 integer 要大。例子 1.ceil 例子 echo ceil 4.3 5 ...

C 中引用與位址運算子( )

在c 中,這個符號有兩個含義,一種含義是取某個變數或者物件的位址。這個位址是指記憶體位址,這個位址取 到之後,可以賦給乙個指標。例如下面這樣 int a 5 int p a 這就表示,有乙個變數為a,其值為5,然後有乙個指標變數p,它儲存了變數a的位址。但c 中,還有乙個用途是定義引用常量。引用其實...