為什么C/C++語(yǔ)言使用指針

這是參加面試時(shí)面試官問(wèn)的一道開(kāi)放式的題目渔嚷。

問(wèn)題:為什么C/C++語(yǔ)言使用指針蒲列?

這個(gè)問(wèn)題一問(wèn)出來(lái),直接被面試官給秒殺了唧取,面試官大神,你怎么不按套路出牌呢?

說(shuō)好的malloc和new的區(qū)別呢?說(shuō)好的const和#define有什么缺點(diǎn)呢?說(shuō)好的進(jìn)程和線程有什么區(qū)別和聯(lián)系呢?說(shuō)好的進(jìn)程間通信有哪些方式呢毅弧?說(shuō)好的%¥%#……@……*&()#咆霜!@#*……“……#%#%#呢?說(shuō)好的這些面試題,統(tǒng)統(tǒng)都沒(méi)有。一上來(lái)就來(lái)這么一個(gè)問(wèn)題。加上本身語(yǔ)言表達(dá)能力不夠好司致,當(dāng)時(shí)的心情就是這樣的:不淡定中帶點(diǎn)傷感霉晕!

現(xiàn)在想想,這個(gè)問(wèn)題就是一個(gè)大坑扒俯。

首先墩邀,這個(gè)題目理解起來(lái)就有點(diǎn)貓膩。言外之意好像是想讓你說(shuō)C/C++中有指針,而C#或者Java等語(yǔ)言中沒(méi)有指針。將這些編程語(yǔ)言做一下對(duì)比。

假裝沉思了3秒鐘鸠匀,然后我就想當(dāng)然的,順著這么個(gè)思路,就開(kāi)始順口開(kāi)河了。C#是高級(jí)語(yǔ)言,沒(méi)有指針啥啥的就開(kāi)始了。反反復(fù)復(fù)那么幾句話穷当,怎么扯也扯不出個(gè)清晰的邏輯出來(lái)汪疮。說(shuō)出來(lái)的答案連自己都覺(jué)得是bullshit蜓洪。

現(xiàn)在回頭想想,當(dāng)時(shí)的理解和答案是大錯(cuò)特錯(cuò)了。這本身就就是一個(gè)錯(cuò)誤的問(wèn)題∑危或者說(shuō)萨惑,面試官就是故意將你往溝里帶姐仅,等著你中套。

答案是:每一種編程語(yǔ)言都使用指針磕道。不止C/C++使用指針疯特。

為什么這樣說(shuō)邻吞?

因?yàn)楹髞?lái)在網(wǎng)上搜索答案時(shí)旺遮,在Quora上找到了一些大神們的解答鱼响。

“Everything uses pointers. C++ just exposes them rather than hiding them,”

It’s easier to give someone an address to your home than to give a copy of your home to everyone.

每一種編程語(yǔ)言都使用指針桶癣。C++只是將指針暴露給了用戶(程序員)间雀,而Java和C#等語(yǔ)言擇是將指針給隱藏起來(lái)了连锯。

但糟糕的是摇展,有些語(yǔ)言試著將指針隱藏起來(lái)捻勉,卻露出了尾巴埠偿,有時(shí)候讓人非常費(fèi)解。

下面是30年老程序員Marcus Geduld舉的栗子。引用如下:

Take, for instance, Javascript:

function foo( bar ) {

bar++;

}

var x = 5;

foo( x );

console.log( x );

Now, what is the value of x at then end of this code? 5 or 6?

Even though, in the function, the value of x gets assigned to bar and then incremented from 5 to 6, the log statement at the end will print 5. Why? because x’s value will be copied in to the function. In other words, bar won’t be pointing at the value of x, even though I wrote foo( x ). It will be pointing at a copy of that value.

Now, let’s say I wrote this:

function foo2( anArray ) {

anArray[ 0 ]++;

}

var myArray = [ 10, 20, 30 ];

foo2( myArray );

console.log( myArray );

In this case, the log will read [ 11, 20, 30 ]. So in the first case, the value was untouched. In this case, it’s been changed. Why, because foo2 didn’t get passed a copy of a value. Rather, it got passed a pointer—to the same array that myArray pointed to. So, in the first case, x and bar pointed to different values, whereas in the second case, myArray and anArray pointe to the same value, a pointer to [10, 20, 30 ].

Put more simply, this is a variable set to a value …

var a = 10;

Whereas this is a variable set to a pointer:

var a = [ 10 ];

But since nothing makes this explicit, you just have to learn some weird rules. And since many beginners don’t, they get hopelessly muddled. And they wind up accidentally changing values they didn’t intend to change and accidentallynot-changing values they did intend to change. Ugh!

Just in case this is unclear, compare this …

function foo( bar ) { bar++; console.log( bar ) };

var x = 5;

foo( x );

console.log( x );

output:

6

5

… with this :

function foo2( bar ) { bar[ 0 ]++; console.log( bar[ 0 ] ); }

var x = [ 5 ];

foo2( x );

console.log( x[ 0 ] );

output:

6

6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末匣沼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件系奉,死亡現(xiàn)場(chǎng)離奇詭異萌踱,居然都是意外死亡能真,警方通過(guò)查閱死者的電腦和手機(jī)蝙泼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人氨距,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵粉臊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任俏拱,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茁帽。 我是一名探鬼主播铁追,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼艾船,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阻肩!你這毒婦竟也來(lái)了撕氧?” 一聲冷哼從身側(cè)響起不脯,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體睹欲,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弟翘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年历等,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黍少。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡患蹂,死狀恐怖砸紊,靈堂內(nèi)的尸體忽然破棺而出醉顽,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響续徽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仰担,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一糊识、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摔蓝,春花似錦赂苗、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至猜谚,卻和暖如春败砂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背魏铅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工吠卷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沦零。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓祭隔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疾渴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 童年的我千贯,是個(gè)白白胖胖、留著烏黑短發(fā)搞坝、忽閃著大眼睛搔谴、機(jī)靈聰慧、單純善良桩撮、活潑好動(dòng)的小姑娘敦第,加上能歌善舞而毫不...
    笑媽1228閱讀 597評(píng)論 0 3