對(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。