指標陣列 陣列指標 二維陣列指標

2021-09-10 03:39:04 字數 2698 閱讀 5044

指標陣列

如果乙個陣列中的所有元素儲存的都是指標,那麼我們就稱它為指標陣列。

除了每個元素的資料型別不同,指標陣列和普通陣列在其他方面都是一樣的,下面是

乙個簡單的例子:

#include int main();//也可以不指定長度,直接寫作 int *parr

//定義乙個指向指標陣列的指標

int **parr = arr;

printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);

printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));

return 0;

}執行結果:

16, 932, 100

16, 932, 100

第乙個 printf() 語句中,arr[i] 表示獲取第 i 個元素的值,該元素是乙個指標,還需要在前面增加乙個 * 才能取得它指向的資料,也即 * arr[i] 的形式。

第二個 printf() 語句中,parr+i 表示第 i 個元素的位址,* (parr+i) 表示獲取第 i 個元素的值(該元素是乙個指標),* * (parr+i) 表示獲取第 i 個元素指向的資料。

#include int main();

printf("%s\n%s\n%s\n", str[0], str[1], str[2]);

return 0;

}執行結果:

c.biancheng.net

c 語言中文網

c language

需要注意的是,字元陣列 str 中存放的是字串的首位址,不是字串本身,字串本身位於其他的記憶體區域,和字元陣列是分開的。也只有當指標陣列中每個元素的型別都是 char *時,才能像上面那樣給指標陣列賦值,其他型別不行。

陣列指標和二維陣列

為了更好的理解指標和二維陣列的關係,我們先來定義乙個指向 a 的指標變數 p:

int (* p)[4] = a;
括號中的 * 表明 p 是乙個指標,它指向乙個陣列,陣列的型別為 int [4],這正是 a 所包含的每個一維陣列的型別。

[ ]的優先順序高於 * ,( )是必須要加的,如果赤裸裸地寫作 int * p[4],那麼應該理解為int * (p[4]),p 就成了乙個指標陣列,而不是二維陣列指標。

對指標進行加法(減法)運算時,它前進(後退)的步長與它指向的資料型別有關,p 指向的資料型別是 int[4],那麼 p+1 就前進 4×4 = 16 個位元組,p-1 就後退 16 個位元組,這正好是陣列 a 所包含的每個一維陣列的長度。也就是說,p+1 會使得指標指向二維陣列的下一行,p-1 會使得指標指向陣列的上一行。

下面我們就來探索一下如何使用指標 p 來訪問二維陣列中的每個元素。按照上面的定義:

p 指向陣列 a 的開頭,也即第 0 行;p+1 前進一行,指向第 1 行。

#include

int main(), , };

int (p)[4] = a;

printf("%d\n", sizeof((p+1)));

return 0;

}執行結果:

16* (p+1)+1 表示第 1 行第 1 個元素的位址。如何理解呢?* (p+1)+1 表示第 1 行第 1 個元素的位址。如何理解呢?

*(p+1)單獨使用時表示的是第 1 行資料,放在表示式中會被轉換為第 1 行資料的首位址,也就是第 1 行第 0 個元素的位址,因為使用整行資料沒有實際的含義,編譯器遇到這種情況都會轉換為指向該行第 0 個元素的指標;就像一維陣列的名字,在定義時或者和sizeof、& 一起使用時才表示整個陣列,出現在表示式中就會被轉換為指向陣列第 0 個元素的指標。

4)*( * (p+1)+1)表示第 1 行第 1 個元素的值。很明顯,增加乙個 * 表示取位址上的資料。

根據上面的結論,可以很容易推出以下的等價關係:

a+i == p+i

a[i] == p[i] == * (a+i) == *(p+i)

a[i][j] == p[i][j] == * (a[i]+j) == * (p[i]+j) == * ( * (a+i)+j) == *( * (p+i)+j)

【例項】使用指標遍歷二維陣列。

#include int main();

int(*p)[4];

int i,j;

p=a;

for(i=0; i<3; i++)

return 0;

}執行結果:

0 1 2 3

4 5 6 7

8 9 10 11

指標陣列和二維陣列指標的區別

指標陣列和二維陣列指標在定義時非常相似,只是括號的位置不同:

16. int *(p1[5]); //指標陣列,可以去掉括號直接寫作 int *p1[5];

17. int (*p2)[5]; //二維陣列指標,不能去掉括號

指標陣列和二維陣列指標有著本質上的區別:指標陣列是乙個陣列,只是每個元素儲存的都是指標,以上面的 p1 為例,在 32 位環境下它占用 4×5 = 20 個位元組的記憶體。二維陣列指標是乙個指標,它指向乙個二維陣列,以上面的 p2 為例,它占用 4 個位元組的記憶體。

二維陣列 指標陣列與陣列指標

一 首先我們從字面意思理解一下什麼是指標陣列什麼是陣列指標 1 指標陣列 本質是乙個陣列,陣列中的每乙個元素是乙個指標。2 陣列指標 本質是乙個指標,而指標指向乙個陣列。二 我們該怎麼區分指標陣列和陣列指標?1 總共有三種表示形式 int p 4 和int p 4 和int p 4 表面看起來是不是...

二維陣列相關(陣列指標 指標陣列)

一維陣列中,int a 5 變數名a就是陣列a首元素位址,是int 型別。a是整個陣列首位址,是指向有5個元素的陣列的指標。二維陣列中,變數名a就是0行起始位址,a 就有轉換到列的意思,就代表0行0列。陣列指標 是乙個指標,其指向的資料型別由乙個陣列構成 將陣列作為乙個陣列型別對待 如 int p ...

二維陣列和指標 和指標陣列,陣列指標

2007 09 12 19 45 7842人閱讀收藏 舉報 二維陣列和指標 用指標表示二維陣列元素。要用指標處理二維陣列,首先要解決從儲存的角度對二維陣列的認識問題。我們知道,乙個二維陣列在計算機中儲存時,是按照先行後列的順序依次儲存的,當把每一行看作乙個整體,即視為乙個大的陣列元素時,這個儲存的二...