對像我一樣的初學者而言,指針數組、數組指針,聽名字就很容易傻傻分不清。對于數組與指針的不同,筆者已經在上一篇文章裡面已經做出了相對簡單的解釋。那麼,“指針數組”和“數組指針”這倆貨,又是個啥奇怪的東西呢?
為了防止混淆,我們先從命名上給一個分辨它們的“真實身份”的小技巧。這個技巧就是:
看名字的最後兩個字。比如“數組指針”,它就是指針;而“指針數組”,是一個數組。在不了解它們有啥用的情況下,先厘清楚兩種相似概念的不同是一件有必要的事情。
在“驗明正身”之後,我們首先來談談
指針數組的詳細概念以及基礎用法。
在C語言和C++等語言中, 數組元素 全為 指針變量 的 數組 稱為指針數組,指針數組中的元素都必須具有相同的存儲類型、指向相同資料類型的指針變量。指針數組比較适合用來指向若幹個字元串,使字元串處理更加友善、靈活。一維指針數組的定義形式為:“類型名*數組辨別符[數組長度]”。(引自百度百科)
指針數組_百度百科baike.baidu.com
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CNjRjY0EWY3YTY0IWNyYDMihTZ0ITYlRWMmFjZiFTZj9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
用筆者自己的話簡單的總結一下:指針數組就是以數組的形式儲存的”一串”指針。一個普通的數組可以存放一定數量的資料,這個資料包括了字元、數字、浮點數等。而指針數組,就是一個儲存一定數量指針的一個
數組。
指針數組的定義形式為:
//type *p[n];
和普通數組的定義相比,定義指針數組時多用了一個“ * ”符号,這顯示出了數組中儲存的資料的”特别之處”。
下面再随便舉幾個例子(懶得想了,抄書)
#include
這個簡單的例子,不難看出,其實所謂的指針數組,就是一口氣定義多個指針,而且可以以類似我們早期學習的調用數組的形式來調用某個固定的指針變量。仔細想想,其實也不算很難,對吧?
當然了,除了原來就有的,筆者還想展示它和“正常“的數組不太那麼一樣的地方。
談到數組,就有一個繞不開的話題——字元串。單一的字元串,我們往往用一維數組定義,而多個字元串,我們就要引入二維數組。考慮到可能有很多像我一樣基礎不那麼紮實的萌新,我再舉個例子:
char
這個就是初學者們使用的最早最原始的字元串定義方式了。
我們再來看看指針數組怎麼定義字元串:
char
我們可以用一維指針數組,定義多個字元串——對比一下二維數組,感覺檔次一下就上來了呢?
但是!我要說但是!二維數組和指針數組所定義的字元串,是有差別的!
我用一個例子說明,它們最大的差別是什麼:
char
不賣關子了,最終的輸出結果是“Hello”。
當我們嘗試改變一維指針數組中某個或數個元素之後的時候,和我一樣的初學者會很蒙蔽——因為我們做不到,我們無法更改已經定義的指針數組之中的任何一個元素。
至于原因,需要我們學習了更多的知識後才能了解到,這裡姑且不提。我們暫時隻需要知道,指針數組不像二維數組那麼随心所欲了。(其實筆者也不太會......等過幾天學通了我再來補吧)
接下來要讨論的,是
數組指針的問題。
筆者最開始的時候給出的技巧已經說明了:關注最後兩個字。顧名思義,數組指針應該是一個數組,它的定義如下:
數組指針,指的是數組名的指針,即數組首元素位址的指針。即是指向數組的指針。例:int (*p)[10]; p即為指向數組的指針,又稱數組指針。(來源于百度百科)
不那麼晦澀的說法:就是數組指針,是一個
指向數組的指針。
舉個栗子~~
int
有幾點需要注意:
- 上回書說道:數組本質上是一個位址資料,不需要在初始化指針的時額外添加&取址符号。但是這裡情況有所不同,請看第2點。
- 在這裡不使用&時,編譯器會提示warning,結果也是怪怪的東西。需要注意的是,這裡的指針指向的是一整個數組,和普通的指針有所不同。而數組整體在記憶體中也是單獨存放的。為了指針能夠指向數組整體,我們需要另外使用一個取址符号來得到整個數組的位址。
- 用指針間接通路數組中某一個數值的話,情況可能會與之前有所不同。請看下面的例子。
#include
相信很多小夥伴看到那兩個“ * ”就已經開始懷疑人生了......相信我,我比你的狀态好不到哪裡去。
我們再來看看一看上面第二點。按照筆者自己的了解就是,數組名本身是一個位址,但是因為這裡定義數組指針需要使用數組自身的位址(這和用數組名定義結果是不同的。用數組名直接定義的話,是給予了指針數組的第一個元素的數值,而我們定義的數組指針需要一個具有3個元素的完整數組)。是以,我們在這裡例子中使用p,先通過取數組的位址得到了數組名——而正如筆者反複強調的,數組名實際上是一個位址資料,是以在對數組的位址資料進行運算後,再次使用取址符号“*”,就成功取得了對應的數組的值。
這一段确實十分難懂,筆者能力有限,沒法寫的更加通俗易懂一點......不過我曾經偶然看到的一個生動的小例子,說不定可以幫到你:
- 指針數組:在一個信箱中,有數個不同位址的信件,可以寄往不同的地方。
- 數組指針:在一份信件中,有數張信紙,信紙的數量表示了信中資訊量。
參考來源于菜鳥教程:
筆記清單 | 菜鳥教程www.runoob.com
由于筆者本人也是一名初學者,錯誤在所難免。如果有任何不妥之處,還請盡請之處,筆者會盡快更改。