C語言的數組和指針一直是兩個容易混淆的東西,當初在學習的時候,也許爲了經過考試會對指針和數組的一些考點進行突擊,可是不少極其細節的東西也許並非那麼清楚。本篇側重點在於分析數組與指針的關係,何時數組能夠等同於指針,何時兩者不一樣。編程
首先經過一張圖來描述一下數組的訪問過程,下圖的字符數組,訪問下標爲9的的元素數組
須要注意的是若是其餘類型的變量,那麼偏移量的計算應該是 i*單變量字節數,好比char是一個字節,int是4字節,那麼int類型數組計算地址是,應該是加上偏移量 i*4微信
下面是訪問指針的例子:函數
符號表裏有一個符號p,它的地址爲4040學習
運行時,先取4040的內容,即9910。而後在取地址9910的內容,即取到指針所指向的地址的內容。spa
也就是說指針的取值,多了一個提取步驟3d
咱們經常把指針和數組混淆,好比如下這種狀況,定義爲指針,卻使用了數組的方式來取值。指針
char *p = "pointertest";blog
c = p[i];v8
定義爲指針,可是使用數組的方式來取值。咱們能夠結合以上兩種方式,來分析這種狀況下的取值過程:
1.先根據符號p的地址,取到符號p的值,是一個地址,咱們假設爲4040,也就是和上面第二種狀況的指針訪問同樣。
2.接下來就是4040+i,獲得新的地址值
3.取新的地址的內容
同理,取偏移地址的時候,須要注意變量類型,好比int類型,就是加上 i*4
如下對於兩者可相互替換作一個總結
(1)extern char a[];經過extern聲明的數組,不能用指針形式替換
(2)數組定義爲 char a[5],不能用指針的形式替換
(3)數組做爲函數參數,可使用指針形式替換
(4)在表達式中,好比c = a[i],這種狀況也可使用指針形式來替換,由於在表達式中,數組名a被當作指向該數組第一個元素的指針,因此能夠和指針相互替換。並且數組下標i能夠和指針的偏移量等同起來,a[i]等同於 *(a+i)。
自學C/C++編程難度很大,不妨和一些志同道合的小夥伴一塊兒學習成長!
C語言C++編程學習交流圈子,【點擊進入】微信公衆號:C語言編程學習基地
有一些源碼和資料分享,歡迎轉行也學習編程的夥伴,和你們一塊兒交流成長會比本身琢磨更快哦!