int int& int * int**的區別、聯繫和用途

源:http://blog.csdn.net/willian0621/article/details/12838157

1、int;

int是C++關鍵字,表示整型,其大小是32位有符號整型,表示的範圍是-2,147,483,648 到 

2,147,483,647;在聲明和定義變量時使用,它表示的意思是所聲明或所定義的變量爲整型變量。

如果其用於函數參數時,其傳遞方向爲值傳遞,即只能將實參的值傳遞給形參,而不能將

形參的值傳遞給實參。

例如:通過這種方式去進行交換兩個數是無法達到目的的。

例子1:

#include<iostream>
using namespace std;            
voidswap1(inta,intb)
{   
     inttmp;   
     tmp = a;    
     a = b;    
     b = tmp;    
 }   
 int main(){   
     inta = 1;    
     intb = 2;    
     swap1(a, b);    
     cout<<"a = "<<a<<endl;   
     cout<<"b = "<<b<<endl;   
     system("pause");   
     return0;   
 }

結果爲:a=1
b=2
因爲傳遞的方式爲值傳遞(單向傳遞);
2、int&;
這裏的&不是取地址符號,而是引用符號,引用是C++對C的一個重要補充。變量的引用就是
變量的別名,講的通俗一點就是另外一個名字,比如:“張三這個人在家裏,老爸老媽叫他
三娃子,那麼這個三娃子就是指張三這個人,如果叫張三去做某事,就是叫三娃子去做某事,
這兩個名字指的是同一個人。”同樣可以理解如果變量b是變量a的引用 那麼無論a,b中任
何一個值改變,另外一個也相應的改變,在聲明一個引用時,必須同時使之初始化,即聲
明它代表哪一個變量。請注意:由於引用不是獨立的變量,編譯系統不給它單獨分配存
儲單元,因此在建立引用時只有聲明沒有定義,只是聲明它與原有的某一變量的關係。
在聲明一個變量的引用後,在本函數執行期間,該引用一直與其代表的變量相聯繫,不能
再作爲其他變量的別名。說得簡單點:張三和三娃子是指同一個人,不能李四也叫三娃子,
如果可以這樣,叫三娃子去做什麼,是叫李四呢還是張三呢,這就會亂套了。所以在C++中
一個引用變量只能對應一個原始的變量,不能對應兩個或多個原始的變量;
下面簡單說明引用:
a)聲明引用時必須指定它代表的是哪一個變量,即對它初始化。
int &a=b;這樣是聲明a是變量b的引用
如果是int &a;這樣就是錯的,沒有指定a代表哪一個變量。
b)引用與其所代表的變量共享同一內存單元,系統並不爲引用另外分配存儲單元;
這個應該好理解;就像前面所說的,張三和三娃子都是同一個人,三娃子只是張三的別名。
因此,對於 int &a=b;這個例子來說,要輸出a和b 的地址,肯定是相同的。
c)怎樣區分&是引用還是取地址符呢?方法是:判斷&a這樣的形式前是否有類型符即
int &a=b;如果有類型符(int)則是引用,否則是取地址運算符。
d)對引用的初始化,可以是一個變量名,也可以是另一個引用。
換句話說:張三的別名可以是三娃子,三小子……及其他多個別名
而三娃子也可以有其他的別名,比如說:老三,小三等
用程序可以這樣:
int a=1; //這裏是定義一個整形變量
int &b=a;//聲明b是整型變量a的別名
int &c=b;//聲明c是整型引用變量b的別名
int &d=a;//聲明d是整型變量a的別名
e)引用初始化後不能再被重新聲明爲另一變量的別名
即三娃子既然是指張三這個人,就不能讓其他人也叫三娃子
即一個別名只能對應一個原始變量,但是一個原始變量可以有多個別名,而且別名也可以
由自己的別名。

C++中增加引用主要是作爲函數參數,進行數據傳遞的功能;
我們知道如果用變量名作爲實參,其傳遞方向是單向的,而用引用作爲實參其傳遞方向
是雙向的;
也許你會問,在c語言中不是有指針嗎,用指針進行參數傳遞不也是雙向的嗎?其實其
本質上也是值傳遞,只不過是將變量的地址傳給指針,通過指針獲取變量的值,這樣做
雖能得到結果,但通過指針運算符去訪問有關變量,比較麻煩。
下面分析一下使用引用和使用指針變量作爲函數形參的不同(以例子1中的swap函數爲例):
1、如果使用引用,則不必在swap函數設立指針變量,指針變量要另外開闢內存單元,其
內容是地址。而引用不是一個獨立的變量,並不佔用內存單元
2、在main函數中調用swap函數時實參不必再變量名前加&以表示地址,系統傳遞的是
實參的地址不是實參的值。
3、使用指針變量時,爲了表示指針變量所指向的變量,必須使用指針運算符*,而使用
引用時,引用就代表該變量,不必使用指針運算符*;
4、用引用完成的工作,用指針也能完成。但引用比指針的使用直觀、方便,直截了當,
不必“兜圈子”,容易理解。有些過去只能用指針來處理的問題,現在可以用引用來代替,
從而降低了程序設計的難度。
對引用進一步說明:
1、不能建立void類型的引用。
因爲任何實際存在的變量都是屬於非void類型的,void的含義是無類型或空類型,
void只是在語法上相當於一個類型而已。
2、不能建立引用的數組。
如:char c[6]="hello";
char &rc=c;//錯誤
因爲數組名是數組首元素的地址,本身不是一個佔有存儲空間的變量。
3、可以將變量的引用的地址賦給一個指針,此時指針指向的是原來的變量。
這句話可以這樣說:將引用變量的地址賦給一個指針,此時指針指向的是引用變量,
相當於指向原來的變量
int a=2;
int &b=a;//這個聲明語句中的&是一個引用
int *p=&b;//這個指針初始化語句中的&是取地址運算符
上面一行等價於 int *p=&a;
但是不能定義指向引用類型的指針變量,不能寫成
int & *p=&a;//企圖定義指向引用類型的指針變量p,錯誤
因爲引用不是一種獨立的數據類型,因此不能建立指向引用類型的指針變量。
4、可以建立指針變量的引用如
int i=5;
int *p=&i;
int * &pt=p;//建立指針變量p的引用pt
引用變量pt代表一個int *類型的數據對象(即指針變量)
5、可以用const對引用加以限定,不允許直接改變該引用的值,但是可以改變原
變量的值去改變引用的值;
int i=5;
const int &a=i;
a=3;//錯誤,因爲引用a是const int 類型不能直接改變引用的值
但是可以這樣修改:
i=3;
此時輸出i和a都是3
6、可以用常量或表達式對引用進行初始化,但此時必須用const作聲明。
int i=5;
const int &a=i+1;
此時編譯系統是這樣處理的:生成一個臨時變量,用來存放該表達式的值,引用是
該臨時變量的別名、系統將“const int &a=i+1;”轉換爲
int temp=i+1;
const int &a=temp;
臨時變量是在內部實現的,用戶不能訪問臨時變量;
用這種辦法不僅可以用表達式對引用進行初始化,還可以用不同類型的變量對之
初始化;如
double d=3.1415926;
const int &a=d;
以上等價爲:
double d=3.1415926;
int temp=d;
const int &a=temp;
如果在上面不用const則會發生錯誤
double d=3.1415926;
int &a=d;//未加const,錯誤
爲什麼?因爲如果可以這樣做,那麼修改引用a的值(如a=3.56),則臨時變量temp的值也
變爲3.56,即修改了臨時變量temp的值,但不能修改變量d的值,這往往不是用戶所希望
的,即存在二義性。與其允許修改引用的值而不能實現用戶的目的,還不如不允許修改
引用的值。這就是C++規定對這類引用必須加const的原因。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章