指針和引用

本文來源于
http://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in?rq=1
我用自己的語言表述一下:

總的區(qū)別:
1,指針可以多次改變其值吃沪,而引用一旦確定就不能改變關系。
就是說指針可以更改其指向的元素,而引用是綁定的關系
2穆咐,指針可以指向不存在的地方拓售,其值可以為NULL签孔,而引用必須和一個具體的元素綁定。
3捶障,指針可以有算術運算,比如p++纲刀;但引用是不可以的

具體的內(nèi)在區(qū)別:

c++標準非常小心的避開了規(guī)定編譯器應該如何實現(xiàn)引用项炼,大多數(shù)編譯器將其通過指針來實現(xiàn)。
比如是下面這樣的聲明:
int &ri=i;
如果沒有被優(yōu)化掉(if it's not optimized away entirely示绊,翻譯的可能不準確)锭部,那么分配和指針同樣大小的內(nèi)存,然后把指針放到內(nèi)存里面

綜合來說面褐,使用的時候注意一下兩點就好:

  • 在函數(shù)的參數(shù)里面和返回量使用引用
  • 用指針來實現(xiàn)結構體和算法

As a general rule,
Use references in function parameters and return types to define useful and self-documenting interfaces.
Use pointers to implement algorithms and data structures.

補充一點我遇到的情況:

void foo(int a)
{
    a++;
}

int main()
{
    
    int a = 1;
    foo(a);
    std::cout << a;
}

這個函數(shù)執(zhí)行之后a的值是不會改變的拌禾!

原因出于C語言固有的函數(shù)策略。具體地說:當我們以變量a為函數(shù)foo的參數(shù)的時候展哭,函數(shù)foo將變量a的數(shù)據(jù)值刷寫到該函數(shù)治下的變量x湃窍,也就是說,函數(shù)foo內(nèi)部的變量x只是擁有了作為調(diào)用該函數(shù)的參數(shù)即變量a的數(shù)據(jù)值的私有副本摄杂。換句話說坝咐,函數(shù)foo內(nèi)部的變量x,只是被初始化了一個值析恢,至于這個值是從哪里來的墨坚,站在變量x的角度,它自己是永遠無法知道的映挂。這猶如: 代碼: x = a ; 作為左值的x泽篮,只是被賦值以另一個左值a所能handle的內(nèi)存區(qū)域上的數(shù)據(jù),除此之外柑船,有關左值a自己的其他一切信息帽撑,都不會傳達給x。所以鞍时,在執(zhí)行了上述語句之后亏拉,分別對左值x和a的任何更改性操作扣蜻,都不會影響到對方。

要想通過改變a的值及塘,就需要使用引用和指針了:

void foo(int &a)
{
    a++;
}

或者:

void bar(int *x)
 {
 (*x)++; 
} 

我們調(diào)用函數(shù)bar的寫法莽使,也應當有所改變,應當這樣:
bar(&a);
此時笙僚,被傳入函數(shù)bar的參數(shù)芳肌,是一個指向變量a的指針。函數(shù)bar治下的變量x(這是一個指針變量)所擁有的肋层,依然僅僅是前者的值的一個私有副本亿笤。 函數(shù)bar在其內(nèi)部,通過把間接訪問(星號)操作符作用在這個私有副本上栋猖,handle到了變量a所對應的那塊內(nèi)存區(qū)域净薛,從而,間接地在那塊區(qū)域上刷寫了新的數(shù)據(jù)蒲拉。當然罕拂,變量a自已對此是一無所知的,只不過全陨,以后當其他地方又“召喚”a的時候爆班,a若自有記性,會心說:“唉辱姨?這個值跟原來的不一樣了嘛柿菩,一定是哪個臭小子,在背地里拿了一個指向我的指針去間接地修改了這個值……”

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雨涛,一起剝皮案震驚了整個濱河市枢舶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌替久,老刑警劉巖凉泄,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚯根,居然都是意外死亡后众,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門颅拦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒂誉,“玉大人,你說我怎么就攤上這事距帅∮蚁牵” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵碌秸,是天一觀的道長绍移。 經(jīng)常有香客問我悄窃,道長,這世上最難降的妖魔是什么蹂窖? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任广匙,我火速辦了婚禮,結果婚禮上恼策,老公的妹妹穿的比我還像新娘。我一直安慰自己潮剪,他們只是感情好涣楷,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抗碰,像睡著了一般狮斗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弧蝇,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天碳褒,我揣著相機與錄音,去河邊找鬼看疗。 笑死沙峻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的两芳。 我是一名探鬼主播摔寨,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怖辆!你這毒婦竟也來了是复?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤竖螃,失蹤者是張志新(化名)和其女友劉穎淑廊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體特咆,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡季惩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腻格。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜀备。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荒叶,靈堂內(nèi)的尸體忽然破棺而出碾阁,到底是詐尸還是另有隱情,我是刑警寧澤些楣,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布脂凶,位于F島的核電站宪睹,受9級特大地震影響,放射性物質發(fā)生泄漏蚕钦。R本人自食惡果不足惜亭病,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘶居。 院中可真熱鬧罪帖,春花似錦、人聲如沸邮屁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佑吝。三九已至坐昙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芋忿,已是汗流浹背炸客。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留戈钢,地道東北人痹仙。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像殉了,于是被迫代替她去往敵國和親蝶溶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

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

  • 一.指針 ** 1.指針概念**:指針就是用來保存內(nèi)存地址的變量宣渗。 2.聲明指針的方式:int *p抖所;與運算符*結...
    YBshone閱讀 409評論 0 4
  • 從概念上講。指針從本質上講就是存放變量地址的一個變量痕囱,在邏輯上是獨立的田轧,它可以被改變,包括其所指向的地址的改變和其...
    IvanRunning閱讀 369評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器琅锻,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 指針和引用在C++中很常用,但是對于它們之間的區(qū)別很多初學者都不是太熟悉弦悉,下面來談談他們2者之間的區(qū)別和用法。1....
    我家有個小太陽閱讀 282評論 0 2
  • 指針和引用 1. 引用和指針有什么區(qū)別蟆炊? 引用是 C++ 中新增的變量類型稽莉,是對 C 的一個擴充。引用給變量起一個...
    MinoyJet閱讀 372評論 0 2