C語言 關於指標陣列和陣列指標

2021-08-19 08:18:35 字數 1930 閱讀 4386

一、指標陣列

按照語文的理解,我們知道指標陣列的中心詞是陣列,而指標是用來修飾陣列的定語。事實上在c語言中也確實是這樣,指標陣列,就是乙個陣列,乙個存放指標的陣列。它常用於指向若干字串,這樣使字串處理更加靈活方便。

下面我們通過幾個例子來理解一下指標陣列:

int* arr1[10];

char* arr2[4];

char** arr3[5];

這三個語句是指標還是陣列呢? 我們知道,運算子[ ]的優先順序是要高於的,所以在這裡,陣列名會先和[ ]結合,再和結合。那麼這三個語句所定義的變數就都是陣列而不是指標了。具體怎麼理解這三條語句呢?下面就一一詳細解釋給大家:arr1是乙個存放了10個型別為int*變數的陣列。那麼經模擬,arr2就是存放了4個型別為char*型別的變數,arr3就是存放了5個型別為char**的變數。

現在對指標陣列有乙個初步的了解了吧,我們知道,指標和陣列是很類似的,那麼指標陣列和二維陣列之間有什麼區別呢?接下來我們具體說一下指標陣列和二維陣列的對比:

1 . 二維陣列:如

char str1[3][4];
只要定義了乙個陣列,無論賦不賦值,系統都會給它分配相應的空間,而且一定是連續的空間。其每個元素都是表示乙個字元,我們可以通過下標對其元素進行修改。

2 . 指標陣列:如

char *str2[3];
代表乙個陣列,存放了3個型別為char*的變數,系統至少會分配3個連續的空間來儲存這3個元素,表示str2是乙個3個元素的陣列,每個元素是乙個指向字元型資料的指標。

我們來舉兩個例子說明一下二維陣列和指標陣列在記憶體中的儲存方式:

char str1[3][5] = ;

char *str2[3] = ;

他們在記憶體中的儲存方式如下圖:

第一幅圖是二維陣列的儲存方式,第二幅圖是指標陣列的儲存方式。我們可以看出,系統給str1分配了3* 5個位元組的空間, 而且是連續的。而給str2分配的空間取決於具體字串的長度,而且不一定連續。

所以,二者的優缺點也就顯而易見了:

指標陣列中每個元素所指的字元不必限制在相同 字元長度,而且訪問陣列的乙個元素是用指標間接進行的,效率比下標要高,但二維陣列卻可以通過下標很方便的修改某一元素的值,指標陣列不行。

二、陣列指標

同樣的,按照語文的理解,中心詞是指標,陣列是修飾指標的定語,事實上c語言中也是這樣。陣列指標,是乙個指標,指向陣列的指標,它存放的是陣列首元素的位址。我們通過乙個例子來具體說明一下:

int (*p)[10];
上面我們已經說過,運算子[ ]優先順序要高於,所以這裡加了(),那麼就是p先和*結合,在與[ ]結合。那麼顯然,這是乙個指標。它是什麼意思呢,它是指向乙個存放了型別為int的10個變數的陣列的指標,存放的這個陣列首元素位址,也就是相當於存放了乙個指標的位址。

int arr[10]=;

int*p1=&arr;

int (*p2) [10]=&arr;

上面所述的第二行語句的意思是:將陣列的位址存放在乙個int型別的指標變數中,這顯然不行的。int型指標變數只能存放乙個int型別變數元素的值,怎麼可以存放乙個陣列10個元素的變數呢?而第三行**就很好的解決了這個問題:第三行**定義了乙個指向含有10個int型變數陣列的指標,用來存放陣列arr的位址,恰恰好。

介紹完了指標陣列和陣列指標,最後我們再強調一下最核心的點:

1.指標陣列,是乙個陣列,存放指標變數的陣列。

2.陣列指標,是乙個指標,乙個可以指向陣列的指標。

C語言指標陣列和陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...

C語言指標陣列和陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...

C語言指標陣列和陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...