關於指標 二維陣列討論

2021-03-31 08:57:00 字數 2150 閱讀 8606

近來得閒看了阿蓉的關於指標的文章(精華區),覺得內容很生

動,討論得也很細緻。於是忍不住也想聊上幾句,和大家**一下。

概括的說,指標其實就是可變陣列的首位址,說是可變陣列,是

指其包含內容的數量的可變的,並且是可動態申請和釋放的,從而充

分節約寶貴的記憶體資源。我一向喜歡一維陣列,除非萬不得已,我一

般是不用二維陣列的,多維的則更是很少涉足了。因為一維簡單,容

易理解,而用指標指向的多維陣列就具有相當的複雜性了,也因此更

具有討論的必要。

閒話少說,這裡我就以三個二維陣列的比較來展開討論:

(1)、int **ptr;

(2)、int *ptr[ 5 ];

(3)、int ( *ptr )[ 5 ];

以上三例都是整數的二維陣列,都可以用形如 ptr[ 1 ][ 1 ] 的

方式訪問其內容;但它們的差別卻是很大的。下面我從四個方面對它們

進行討論:

一、內容:

它們本身都是指標,它們的最終內容都是整數。注意我這裡說

的是最終內容,而不是中間內容,比如你寫 ptr[ 0 ],對於三者來說,

其內容都是乙個整數指標,即 int *;ptr[ 1 ][ 1  ] 這樣的形式才

是其最終內容。

二、意義:

(1)、int **ptr 表示指向"一群"指向整數的指標的指標。

(2)、int *ptr[ 5 ] 表示指向 5 個指向整數的指標的指標。

(3)、int ( *ptr )[ 5 ] 表示指向"一群"指向 5 個整數數

組的指標的指標。

三、所佔空間:

(1)、int **ptr 和 (3)、int ( *ptr )[ 5 ] 一樣,在32位平

台裡,都是4位元組,即乙個指標。

但 (2)、int *ptr[ 5 ] 不同,它是 5 個指標,它佔5 * 4 = 20

個位元組的記憶體空間。

四、用法:

(1)、int **ptr 

因為是指標的指標,需要兩次記憶體分配才能使用其最終內容。首

先,ptr = ( int ** )new int *[ 5 ];這樣分配好了以後,它和(2)的

意義相同了;然後要分別對 5 個指標進行記憶體分配,例如:

ptr[ 0 ] = new int[ 20 ];

它表示為第 0 個指標分配 20 個整數,分配好以後, ptr[ 0 ] 為指

向 20 個整數的陣列。這時可以使用下標用法 ptr[ 0 ][ 0 ] 到

ptr[ 0 ][ 19 ] 了。

如果沒有第一次記憶體分配,該 ptr 是個"野"指標,是不能使用

的,如果沒有第二次記憶體分配,則 ptr[ 0 ] 等也是個"野"指標,也

是不能用的。當然,用它指向某個已經定義的位址則是允許的,那是另外

的用法(類似於"借雞生蛋"的做法),這裡不作討論(下同)。

(2)、int *ptr[ 5 ]

這樣定義的話,編譯器已經為它分配了 5 個指標的空間,這相當

於(1)中的第一次記憶體分配。根據對(1)的討論可知,顯然要對其進行一次

記憶體分配的。否則就是"野"指標。

(3)、int ( *ptr )[ 5 ]

這種定義我覺得很費解,不是不懂,而是覺得理解起來特別吃力,

也許是我不太習慣這樣的定義吧。怎麼描述它呢?它的意義是"一群"

指標,每個指標都是指向乙個 5 個整數的陣列。如果想分配 k 個指標,

這樣寫: ptr = ( int ( * )[ 5 ] ) new int[ sizeof( int ) * 5 * k ]。

這是一次性的記憶體分配。分配好以後,ptr 指向一片連續的位址空間,

其中 ptr[ 0 ] 指向第 0 個 5 個整數陣列的首位址,ptr[ 1 ] 指向第

1 個 5 個整數陣列的首位址。

綜上所述,我覺得可以這樣理解它們:

int ** ptr <==> int ptr[ x ][ y ];

int *ptr[ 5 ] <==> int ptr[ 5 ][ x ];

int ( *ptr )[ 5 ] <==> int ptr[ x ][ 5 ];

這裡 x 和 y 是表示若干的意思。

二維陣列 二維陣列和指標

include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...

二維陣列與二維指標

1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...

二維指標和二維陣列

二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...