C++: int int int * int**的区别、联系和用途
1、int;
int是C++關(guān)鍵字,表示整型,其大小是32位有符號(hào)整型,表示的范圍是-2,147,483,648 到
2,147,483,647;在聲明和定義變量時(shí)使用,它表示的意思是所聲明或所定義的變量為整型變量。
如果其用于函數(shù)參數(shù)時(shí),其傳遞方向?yàn)橹祩鬟f,即只能將實(shí)參的值傳遞給形參,而不能將
形參的值傳遞給實(shí)參。
例如:通過(guò)這種方式去進(jìn)行交換兩個(gè)數(shù)是無(wú)法達(dá)到目的的。
例子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;
}
結(jié)果為:a=1
b=2
因?yàn)閭鬟f的方式為值傳遞(單向傳遞);
2、int&;
這里的&不是取地址符號(hào),而是引用符號(hào),引用是C++對(duì)C的一個(gè)重要補(bǔ)充。變量的引用就是
變量的別名,講的通俗一點(diǎn)就是另外一個(gè)名字,比如:“張三這個(gè)人在家里,老爸老媽叫他
三娃子,那么這個(gè)三娃子就是指張三這個(gè)人,如果叫張三去做某事,就是叫三娃子去做某事,
這兩個(gè)名字指的是同一個(gè)人。”同樣可以理解如果變量b是變量a的引用 那么無(wú)論a,b中任
何一個(gè)值改變,另外一個(gè)也相應(yīng)的改變,在聲明一個(gè)引用時(shí),必須同時(shí)使之初始化,即聲
明它代表哪一個(gè)變量。請(qǐng)注意:由于引用不是獨(dú)立的變量,編譯系統(tǒng)不給它單獨(dú)分配存
儲(chǔ)單元,因此在建立引用時(shí)只有聲明沒(méi)有定義,只是聲明它與原有的某一變量的關(guān)系。
在聲明一個(gè)變量的引用后,在本函數(shù)執(zhí)行期間,該引用一直與其代表的變量相聯(lián)系,不能
再作為其他變量的別名。說(shuō)得簡(jiǎn)單點(diǎn):張三和三娃子是指同一個(gè)人,不能李四也叫三娃子,
如果可以這樣,叫三娃子去做什么,是叫李四呢還是張三呢,這就會(huì)亂套了。所以在C++中
一個(gè)引用變量只能對(duì)應(yīng)一個(gè)原始的變量,不能對(duì)應(yīng)兩個(gè)或多個(gè)原始的變量;
下面簡(jiǎn)單說(shuō)明引用:
a)聲明引用時(shí)必須指定它代表的是哪一個(gè)變量,即對(duì)它初始化。
int &a=b;這樣是聲明a是變量b的引用
如果是int &a;這樣就是錯(cuò)的,沒(méi)有指定a代表哪一個(gè)變量。
b)引用與其所代表的變量共享同一內(nèi)存單元,系統(tǒng)并不為引用另外分配存儲(chǔ)單元;
這個(gè)應(yīng)該好理解;就像前面所說(shuō)的,張三和三娃子都是同一個(gè)人,三娃子只是張三的別名。
因此,對(duì)于 int &a=b;這個(gè)例子來(lái)說(shuō),要輸出a和b 的地址,肯定是相同的。
c)怎樣區(qū)分&是引用還是取地址符呢?方法是:判斷&a這樣的形式前是否有類(lèi)型符即
int &a=b;如果有類(lèi)型符(int)則是引用,否則是取地址運(yùn)算符。
d)對(duì)引用的初始化,可以是一個(gè)變量名,也可以是另一個(gè)引用。
換句話說(shuō):張三的別名可以是三娃子,三小子……及其他多個(gè)別名
而三娃子也可以有其他的別名,比如說(shuō):老三,小三等
用程序可以這樣:
int a=1; //這里是定義一個(gè)整形變量
int &b=a;//聲明b是整型變量a的別名
int &c=b;//聲明c是整型引用變量b的別名
int &d=a;//聲明d是整型變量a的別名
e)引用初始化后不能再被重新聲明為另一變量的別名
即三娃子既然是指張三這個(gè)人,就不能讓其他人也叫三娃子
即一個(gè)別名只能對(duì)應(yīng)一個(gè)原始變量,但是一個(gè)原始變量可以有多個(gè)別名,而且別名也可以
由自己的別名。
?
C++中增加引用主要是作為函數(shù)參數(shù),進(jìn)行數(shù)據(jù)傳遞的功能;
我們知道如果用變量名作為實(shí)參,其傳遞方向是單向的,而用引用作為實(shí)參其傳遞方向
是雙向的;
也許你會(huì)問(wèn),在c語(yǔ)言中不是有指針嗎,用指針進(jìn)行參數(shù)傳遞不也是雙向的嗎?其實(shí)其
本質(zhì)上也是值傳遞,只不過(guò)是將變量的地址傳給指針,通過(guò)指針獲取變量的值,這樣做
雖能得到結(jié)果,但通過(guò)指針運(yùn)算符去訪問(wèn)有關(guān)變量,比較麻煩。
下面分析一下使用引用和使用指針變量作為函數(shù)形參的不同(以例子1中的swap函數(shù)為例):
1、如果使用引用,則不必在swap函數(shù)設(shè)立指針變量,指針變量要另外開(kāi)辟內(nèi)存單元,其
內(nèi)容是地址。而引用不是一個(gè)獨(dú)立的變量,并不占用內(nèi)存單元
2、在main函數(shù)中調(diào)用swap函數(shù)時(shí)實(shí)參不必再變量名前加&以表示地址,系統(tǒng)傳遞的是
實(shí)參的地址不是實(shí)參的值。
3、使用指針變量時(shí),為了表示指針變量所指向的變量,必須使用指針運(yùn)算符*,而使用
引用時(shí),引用就代表該變量,不必使用指針運(yùn)算符*;
4、用引用完成的工作,用指針也能完成。但引用比指針的使用直觀、方便,直截了當(dāng),
不必“兜圈子”,容易理解。有些過(guò)去只能用指針來(lái)處理的問(wèn)題,現(xiàn)在可以用引用來(lái)代替,
從而降低了程序設(shè)計(jì)的難度。
對(duì)引用進(jìn)一步說(shuō)明:
1、不能建立void類(lèi)型的引用。
因?yàn)槿魏螌?shí)際存在的變量都是屬于非void類(lèi)型的,void的含義是無(wú)類(lèi)型或空類(lèi)型,
void只是在語(yǔ)法上相當(dāng)于一個(gè)類(lèi)型而已。
2、不能建立引用的數(shù)組。
如:char c[6]="hello";
char &rc=c;//錯(cuò)誤
因?yàn)閿?shù)組名是數(shù)組首元素的地址,本身不是一個(gè)占有存儲(chǔ)空間的變量。
3、可以將變量的引用的地址賦給一個(gè)指針,此時(shí)指針指向的是原來(lái)的變量。
這句話可以這樣說(shuō):將引用變量的地址賦給一個(gè)指針,此時(shí)指針指向的是引用變量,
相當(dāng)于指向原來(lái)的變量
int a=2;
int &b=a;//這個(gè)聲明語(yǔ)句中的&是一個(gè)引用
int *p=&b;//這個(gè)指針初始化語(yǔ)句中的&是取地址運(yùn)算符
上面一行等價(jià)于 int *p=&a;
但是不能定義指向引用類(lèi)型的指針變量,不能寫(xiě)成
int & *p=&a;//企圖定義指向引用類(lèi)型的指針變量p,錯(cuò)誤
因?yàn)橐貌皇且环N獨(dú)立的數(shù)據(jù)類(lèi)型,因此不能建立指向引用類(lèi)型的指針變量。
4、可以建立指針變量的引用如
int i=5;
int *p=&i;
int * &pt=p;//建立指針變量p的引用pt
引用變量pt代表一個(gè)int *類(lèi)型的數(shù)據(jù)對(duì)象(即指針變量)
5、可以用const對(duì)引用加以限定,不允許直接改變?cè)撘玫闹?#xff0c;但是可以改變?cè)?/p>
變量的值去改變引用的值;
int i=5;
const int &a=i;
a=3;//錯(cuò)誤,因?yàn)橐胊是const int 類(lèi)型不能直接改變引用的值
但是可以這樣修改:
i=3;
此時(shí)輸出i和a都是3
6、可以用常量或表達(dá)式對(duì)引用進(jìn)行初始化,但此時(shí)必須用const作聲明。
int i=5;
const int &a=i+1;
此時(shí)編譯系統(tǒng)是這樣處理的:生成一個(gè)臨時(shí)變量,用來(lái)存放該表達(dá)式的值,引用是
該臨時(shí)變量的別名、系統(tǒng)將“const int &a=i+1;”轉(zhuǎn)換為
int temp=i+1;
const int &a=temp;
臨時(shí)變量是在內(nèi)部實(shí)現(xiàn)的,用戶不能訪問(wèn)臨時(shí)變量;
用這種辦法不僅可以用表達(dá)式對(duì)引用進(jìn)行初始化,還可以用不同類(lèi)型的變量對(duì)之
初始化;如
double d=3.1415926;
const int &a=d;
以上等價(jià)為:
double d=3.1415926;
int temp=d;
const int &a=temp;
如果在上面不用const則會(huì)發(fā)生錯(cuò)誤
double d=3.1415926;
int &a=d;//未加const,錯(cuò)誤
為什么?因?yàn)槿绻梢赃@樣做,那么修改引用a的值(如a=3.56),則臨時(shí)變量temp的值也
變?yōu)?.56,即修改了臨時(shí)變量temp的值,但不能修改變量d的值,這往往不是用戶所希望
的,即存在二義性。與其允許修改引用的值而不能實(shí)現(xiàn)用戶的目的,還不如不允許修改
引用的值。這就是C++規(guī)定對(duì)這類(lèi)引用必須加const的原因。
結(jié)果:
?
總結(jié)
以上是生活随笔為你收集整理的C++: int int int * int**的区别、联系和用途的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: layui导航栏页面滚动固定_网站建设页
- 下一篇: android 播放声音资源,andro