指針和引用的區(qū)別

指針和引用在C++中很常用耀销,但是對于它們之間的區(qū)別很多人都不是太熟悉,下面來解釋下他們2者之間的區(qū)別和用法富腊。

1.指針和引用的定義和性質(zhì)區(qū)別:

(1)指針:指針是一個變量腺占,只不過這個變量存儲的是一個地址,指向內(nèi)存的一個存儲單元毒租;而引用跟原來的變量實(shí)質(zhì)上是同一個東西稚铣,只不過是原變量的一個別名而已。如:

int a=1;int *p=&a;
int a=1;int &b=a;

上面定義了一個整形變量和一個指針變量p墅垮,該指針變量指向a的存儲單元从媚,即p的值是a存儲單元的地址。

而下面2句定義了一個整形變量a和這個整形a的引用b噩凹,事實(shí)上a和b是同一個東西临扮,在內(nèi)存占有同一個存儲單元。

(2)可以有const指針剃允,但是沒有const引用沛简;

(3)指針可以有多級,但是引用只能是一級(int **p斥废;合法 而 int &&a是不合法的)

(4)指針的值可以為空椒楣,但是引用的值不能為NULL,并且引用在定義的時候必須初始化牡肉;

(5)指針的值在初始化后可以改變捧灰,即指向其它的存儲單元,而引用在進(jìn)行初始化后就不會再改變了统锤。

(6)"sizeof引用"得到的是所指向的變量(對象)的大小毛俏,而"sizeof指針"得到的是指針本身的大小饲窿;

(7)指針和引用的自增(++)運(yùn)算意義不一樣煌寇;

2.指針和引用作為函數(shù)參數(shù)進(jìn)行傳遞時的區(qū)別:

(1)指針作為參數(shù)進(jìn)行傳遞:

#include<iostream>
using namespace std;

void swap(int *a,int *b)
{
  int temp=*a;
  *a=*b;
  *b=temp;
}

int main(void)
{
  int a=1,b=2;
  swap(&a,&b);
  cout<<a<<" "<<b<<endl;
  system("pause");
  return 0;
}

結(jié)果為

  2 1

用指針傳遞參數(shù),可以實(shí)現(xiàn)對實(shí)參進(jìn)行改變的目的逾雄,是因?yàn)閭鬟f過來的是實(shí)參的地址阀溶,因此使用*a實(shí)際上是取存儲實(shí)參的內(nèi)存單元里的數(shù)據(jù)腻脏,即是對實(shí)參進(jìn)行改變,因此可以達(dá)到目的银锻。

再看一個程序;

#include<iostream>
using namespace std;

void test(int *p)
{
  int a=1;
  p=&a;
  cout<<p<<" "<<*p<<endl;
}

int main(void)
{
    int *p=NULL;
    test(p);
    if(p==NULL)
    cout<<"指針p為NULL"<<endl;
    system("pause");
    return 0;
}

運(yùn)行結(jié)果為:

  0x7fff5fbff5e4 1

  指針p為NULL

大家可能會感到奇怪永品,怎么回事,不是傳遞的是地址么击纬,怎么p回事NULL鼎姐?事實(shí)上,在main函數(shù)中聲明了一個指針p掉弛,并賦值為NULL症见,當(dāng)調(diào)用test函數(shù)時,事實(shí)上傳遞的也是地址殃饿,只不過傳遞的是指地址谋作。也就是說將指針作為參數(shù)進(jìn)行傳遞時,事實(shí)上也是值傳遞乎芳,只不過傳遞的是地址遵蚜。當(dāng)把指針作為參數(shù)進(jìn)行傳遞時,也是將實(shí)參的一個拷貝傳遞給形參奈惑,即上面程序main函數(shù)中的p和test函數(shù)中使用的p不是同一個變量吭净,存儲2個變量p的單元也不相同(只是2個p指向同一個存儲單元),那么在test函數(shù)中對p進(jìn)行修改肴甸,并不會影響到main函數(shù)中的p的值寂殉。

如果要想達(dá)到也同時修改的目的的話,就得使用引用了原在。

3.將引用作為函數(shù)的參數(shù)進(jìn)行傳遞:

在講引用作為函數(shù)參數(shù)進(jìn)行傳遞時友扰,實(shí)質(zhì)上傳遞的是實(shí)參本身,即傳遞進(jìn)來的不是實(shí)參的一個拷貝庶柿,因此對形參的修改其實(shí)是對實(shí)參的修改村怪,所以在用引用進(jìn)行參數(shù)傳遞時,不僅節(jié)約時間浮庐,而且可以節(jié)約空間甚负。

看下面這個程序:

#include<iostream>
using namespace std;

void test(int &a)
{
  cout<<&a<<" "<<a<<endl;
}

int main(void)
{
    int a=1;
    cout<<&a<<" "<<a<<endl;
    test(a);
    system("pause");
    return 0;
}

輸出結(jié)果為:

      0x7fff5fbff5e4 1

      0x7fff5fbff5e4 1

再看下這個程序:

這足以說明用引用進(jìn)行參數(shù)傳遞時,事實(shí)上傳遞的是實(shí)參本身审残,而不是拷貝梭域。

所以在上述要達(dá)到同時修改指針的目的的話,就得使用引用了维苔。

#include<iostream>
using namespace std;

void test(int *&p)
{
  int a=1;
  p=&a;
  cout<<p<<" "<<*p<<endl;
}

int main(void)
{
    int *p = NULL;
    test(p);
    if (p != NULL) {
        cout << "p不為NULL "<<p;
    }
    system("pause");
    return 0;
}

輸出結(jié)果為:

0x7fff5fbff5e4 1
p不為NULL 0x7fff5fbff5e4
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碰辅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子介时,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沸柔,死亡現(xiàn)場離奇詭異循衰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)褐澎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門会钝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人工三,你說我怎么就攤上這事迁酸。” “怎么了俭正?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵奸鬓,是天一觀的道長。 經(jīng)常有香客問我掸读,道長串远,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任儿惫,我火速辦了婚禮澡罚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肾请。我一直安慰自己留搔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布铛铁。 她就那樣靜靜地躺著隔显,像睡著了一般。 火紅的嫁衣襯著肌膚如雪避归。 梳的紋絲不亂的頭發(fā)上荣月,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音梳毙,去河邊找鬼哺窄。 笑死,一個胖子當(dāng)著我的面吹牛账锹,可吹牛的內(nèi)容都是我干的萌业。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼奸柬,長吁一口氣:“原來是場噩夢啊……” “哼生年!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起廓奕,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抱婉,失蹤者是張志新(化名)和其女友劉穎档叔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒸绩,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衙四,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了患亿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片传蹈。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖步藕,靈堂內(nèi)的尸體忽然破棺而出惦界,到底是詐尸還是另有隱情,我是刑警寧澤咙冗,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布沾歪,位于F島的核電站,受9級特大地震影響乞娄,放射性物質(zhì)發(fā)生泄漏瞬逊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一仪或、第九天 我趴在偏房一處隱蔽的房頂上張望确镊。 院中可真熱鬧,春花似錦范删、人聲如沸蕾域。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旨巷。三九已至,卻和暖如春添忘,著一層夾襖步出監(jiān)牢的瞬間采呐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工搁骑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斧吐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓仲器,卻偏偏與公主長得像煤率,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乏冀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 指針和引用在C++中很常用蝶糯,但是對于它們之間的區(qū)別很多初學(xué)者都不是太熟悉,下面來談?wù)勊麄?者之間的區(qū)別和用法辆沦。1....
    我家有個小太陽閱讀 283評論 0 2
  • 從概念上講昼捍。指針從本質(zhì)上講就是存放變量地址的一個變量识虚,在邏輯上是獨(dú)立的,它可以被改變端三,包括其所指向的地址的改變和其...
    IvanRunning閱讀 374評論 0 1
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型舷礼。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一鹃彻。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)郊闯; ...
    朱森閱讀 3,449評論 3 44
  • 指針 指針是什么 為了了解指針的概念,我們先來看一個小故事蛛株。話說福爾摩斯派華生到威爾爵士居住的城堡去取回一個重要的...
    去留無意hmy閱讀 559評論 0 1
  • 孤是孤單的孤团赁,獨(dú)是獨(dú)立的獨(dú)。 或許你們是真的沒有感受過孤獨(dú)谨履。孤獨(dú)不是幾個人同行你停下綁鞋帶沒人特意等你欢摄,因?yàn)槿?..
    QTM閱讀 460評論 0 1