C/C++編程筆記:C語(yǔ)言中數(shù)組與指針的異同,兩大核心知識(shí)點(diǎn)分析
C語(yǔ)言的數(shù)組和指針一直是兩個(gè)容易混淆的東西,當(dāng)初在學(xué)習(xí)的時(shí)候,也許為了通過(guò)考試會(huì)對(duì)指針和數(shù)組的一些考點(diǎn)進(jìn)行突擊,但是很多極其細(xì)節(jié)的東西也許并不是那么清楚。本篇側(cè)重點(diǎn)在于分析數(shù)組與指針的關(guān)系,什么時(shí)候數(shù)組可以等同于指針,什么時(shí)候二者不同。
數(shù)組的訪問(wèn)
首先通過(guò)一張圖來(lái)描述一下數(shù)組的訪問(wèn)過(guò)程,下圖的字符數(shù)組,訪問(wèn)下標(biāo)為9的的元素





需要注意的是如果其他類型的變量,那么偏移量的計(jì)算應(yīng)該是 i*單變量字節(jié)數(shù),比如char是一個(gè)字節(jié),int是4字節(jié),那么int類型數(shù)組計(jì)算地址是,應(yīng)該是加上偏移量 i*4
指針的訪問(wèn)
下面是訪問(wèn)指針的例子:

符號(hào)表里有一個(gè)符號(hào)p,它的地址為4040
運(yùn)行時(shí),先取4040的內(nèi)容,即9910。然后在取地址9910的內(nèi)容,即取到指針?biāo)赶虻牡刂返膬?nèi)容。
也就是說(shuō)指針的取值,多了一個(gè)提取步驟
二者差異特性總結(jié)

什么時(shí)候二者可以相互替換
我們常常把指針和數(shù)組混淆,比如以下這種情況,定義為指針,卻使用了數(shù)組的方式來(lái)取值。
char *p = "pointertest";
c = p[i];
定義為指針,但是使用數(shù)組的方式來(lái)取值。我們可以結(jié)合以上兩種方式,來(lái)分析這種情況下的取值過(guò)程:
1.先根據(jù)符號(hào)p的地址,取到符號(hào)p的值,是一個(gè)地址,我們假設(shè)為4040,也就是和上面第二種情況的指針訪問(wèn)一樣。
2.接下來(lái)就是4040+i,得到新的地址值
3.取新的地址的內(nèi)容
同理,取偏移地址的時(shí)候,需要注意變量類型,比如int類型,就是加上 i*4

以下對(duì)于二者可相互替換做一個(gè)總結(jié)
(1)extern char a[];通過(guò)extern聲明的數(shù)組,不能用指針形式替換
(2)數(shù)組定義為 char a[5],不能用指針的形式替換
(3)數(shù)組作為函數(shù)參數(shù),可以使用指針形式替換
(4)在表達(dá)式中,比如c = a[i],這種情況也可以使用指針形式來(lái)替換,因?yàn)樵诒磉_(dá)式中,數(shù)組名a被當(dāng)做指向該數(shù)組第一個(gè)元素的指針,所以可以和指針相互替換。而且數(shù)組下標(biāo)i可以和指針的偏移量等同起來(lái),a[i]等同于 *(a+i)。
自學(xué)C/C++編程難度很大,不妨和一些志同道合的小伙伴一起學(xué)習(xí)成長(zhǎng)

學(xué)習(xí)C/C++編程知識(shí),提升C/C++編程能力,歡迎關(guān)注UP一起來(lái)成長(zhǎng)!
另外,UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~