C語言的陣列和指針一直是兩個容易混淆的東西,當初在學習的時候,也許爲了通過考試會對指針和陣列的一些考點進行突擊,但是很多極其細節的東西也許並不是那麼清楚。本篇側重點在於分析陣列與指針的關係,什麼時候陣列可以等同於指針,什麼時候二者不同。
首先通過一張圖來描述一下陣列的存取過程,下圖的字元陣列,存取下標爲9的的元素
需要注意的是如果其他型別的變數,那麼偏移量的計算應該是 i*單變數位元組數,比如char是一個位元組,int是4位元組,那麼int型別陣列計算地址是,應該是加上偏移量 i*4
下面 下麪是存取指針的例子:
符號表裡有一個符號p,它的地址爲4040
執行時,先取4040的內容,即9910。然後在取地址9910的內容,即取到指針所指向的地址的內容。
也就是說指針的取值,多了一個提取步驟
我們常常把指針和陣列混淆,比如以下這種情況,定義爲指針,卻使用了陣列的方式來取值。
char *p = "pointertest";
c = p[i];
定義爲指針,但是使用陣列的方式來取值。我們可以結合以上兩種方式,來分析這種情況下的取值過程:
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語言程式設計學習基地
有一些原始碼和資料分享,歡迎轉行也學習程式設計的夥伴,和大家一起交流成長會比自己琢磨更快哦!