1+1 不等于2? 來(lái)看這道奇怪的C語(yǔ)言題目

對(duì)于很多C語(yǔ)言初學(xué)者來(lái)說(shuō),指針是一大難題!

但是指針也是c語(yǔ)言的靈魂,離開(kāi)指針,可能c語(yǔ)言就只能處理小學(xué)數(shù)學(xué)題了。

最后,如果大家如果在自學(xué)遇到困難,想找一個(gè)C++的學(xué)習(xí)環(huán)境,可以加入我們的C++學(xué)習(xí)圈,點(diǎn)擊我加入吧,會(huì)節(jié)約很多時(shí)間,減少很多在學(xué)習(xí)中遇到的難題。


但是指針雖然難,但并沒(méi)有難到大多數(shù)人學(xué)不會(huì)的程度。C語(yǔ)言面向的使用群體是普通人,而不是智商超群的大佬們。只要用心學(xué)習(xí),肯定是可以掌握的。

今天小編又給大家?guī)?lái)一道關(guān)于指針的c語(yǔ)言面試題,話不多說(shuō)上代碼:

#include

int main()

{

int vector[2][10] = {

{1,2,3,4,5,6,7,8,9,10},

{11,12,13,14,15,16,17,18,19,20}

};

int(*a)[10] = vector;

printf("%d %d %d %d %d",

**a, **(a + 1), *(*a + 1), *(a[0] + 1), *(a[1]));

return 0;

}

程序首先定義了一個(gè)二維數(shù)組vector,并使用初始化的方式賦予了1-20的初值。

接著又定義了一個(gè)指針a,并令其指向vector。

接下來(lái)程序通過(guò)指針依次輸出5個(gè)值。

那么,這個(gè)c語(yǔ)言程序的輸出是什么呢?

初步分析

顯然這題的關(guān)鍵點(diǎn)在于指針a

首先我們要明確一點(diǎn):在理解指針的時(shí)候,要像int char short一樣,將它當(dāng)做一種數(shù)據(jù)類(lèi)型。

分析a的定義語(yǔ)句:int(*a)[10] = vector,可以發(fā)現(xiàn)a其實(shí)是一個(gè) int[10] 類(lèi)型的數(shù)組指針。

那么這個(gè)c語(yǔ)言的程序輸出結(jié)果是什么呢,得到答案最簡(jiǎn)單粗暴的方式就是直接運(yùn)行代碼:

c語(yǔ)言中的指針移動(dòng)

不僅僅是c語(yǔ)言,語(yǔ)言中的數(shù)據(jù)類(lèi)型其實(shí)就是告訴處理器應(yīng)該如何訪問(wèn)它,這句話是什么意思呢?請(qǐng)看下圖:

大家都知道數(shù)據(jù)在內(nèi)存中的最小粒度是一個(gè)字節(jié),上圖假設(shè)截取內(nèi)存中的10個(gè)字節(jié),在我的電腦上,c語(yǔ)言類(lèi)型占用了4個(gè)字節(jié),因此int類(lèi)型指針是逐4個(gè)字節(jié)訪問(wèn)內(nèi)存的。

同理,short類(lèi)型的指針是逐2個(gè)字節(jié)移動(dòng)的。char類(lèi)型的指針是逐字節(jié)的移動(dòng)的。

到這里相信大家都發(fā)現(xiàn)了,指針的加減法并不像數(shù)學(xué)概念中的加減一樣嚴(yán)格遵循 1+1 =2。

對(duì)于int型指針來(lái)說(shuō),+1 居然移動(dòng)了4個(gè)字節(jié),對(duì)于short型指針來(lái)說(shuō) +1又只移動(dòng)了兩個(gè)字節(jié)。

其實(shí)分析指針加減法的時(shí)候不應(yīng)該從只從數(shù)學(xué)角度考慮,比如 1千克 + 1克 也不等于2對(duì)吧!

這提醒了我們應(yīng)該不僅僅考慮數(shù)字,還需要考慮單位。

指針的單位就是數(shù)據(jù)類(lèi)型。int型指針的單位就是sizeof(int),short型指針的單位就是sizeof(short),這樣考慮是不是覺(jué)得合理多了。

程序輸出分析

明確了指針的加減法處理方式,再來(lái)分析程序輸出就簡(jiǎn)單多了。

**a, **(a + 1), *(*a + 1), *(a[0] + 1), *(a[1]))

1 11 2 2 11

我們首先查看一下指針的數(shù)據(jù)類(lèi)型(下圖截取自vs2019)。

從上圖中我們可以清楚地看到a的數(shù)據(jù)類(lèi)型就是一個(gè)int[10]的數(shù)組指針。

那么*a的數(shù)據(jù)類(lèi)型就是一個(gè)int[10]的數(shù)組,顯然**a就等價(jià)于*(*a+0)

那不就是數(shù)組的第0個(gè)元素1了嗎。

**(a+1)不就相當(dāng)于指針指向位置的第0個(gè)元素嗎,也就是11。

再來(lái)看第三個(gè),*a的數(shù)據(jù)類(lèi)型就是一個(gè)int[10]的數(shù)組,那么*a+1就相當(dāng)于移動(dòng)到這個(gè)數(shù)組的第1個(gè)元素(下標(biāo)從0開(kāi)始),也就是2。

第四個(gè)數(shù)字分析和第三個(gè)是類(lèi)似的,因?yàn)?*a等價(jià)于a[0],所以此處輸出也是2。

第五個(gè)數(shù)字的分析和第四個(gè)是類(lèi)似的,因?yàn)?*(a+1)和a[1]是等價(jià)的,輸出為11。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語(yǔ)言中廣泛使用的一種數(shù)據(jù)類(lèi)型。 運(yùn)用指針編程是C語(yǔ)言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,619評(píng)論 3 44
  • 1.語(yǔ)言中變量的實(shí)質(zhì) 要理解C指針,我認(rèn)為一定要理解C中“變量”的存儲(chǔ)實(shí)質(zhì), 所以我就從“變量”這個(gè)東西開(kāi)始講起吧...
    金巴多閱讀 1,979評(píng)論 0 9
  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類(lèi)型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 4,081評(píng)論 0 2
  • 2.變量和基本類(lèi)型 3.字符串、向量和數(shù)組 4.表達(dá)式 5.語(yǔ)句 2.變量和基本類(lèi)型 c++的算術(shù)類(lèi)型: 一個(gè)ch...
    暮落晴空閱讀 824評(píng)論 0 0
  • 再多的東西 換不回親人的離世 所有的一切 時(shí)間都會(huì)磨平 在平淡中見(jiàn)真知 慢慢悠悠的過(guò)著自己的小日子
    Linrry鄭閱讀 279評(píng)論 0 0

友情鏈接更多精彩內(nèi)容