C C 指向二維陣列的指標

2021-07-30 05:47:40 字數 1572 閱讀 3285

設有整型二維陣列a[3][4]如下:

0 1 2 3

4 5 6 7

8 9 10 11

它的定義為:

int a[3][4]=,,}

設陣列a的首位址為1000,各下標變數的首位址及其值如圖所示。

c語言允許把乙個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a[0]、a[1]、a[2]。每乙個一維陣列又含有四個元素。

陣列及陣列元素的位址表示如下:從二維陣列的角度來看,a是二維陣列名,a代表整個二維陣列的首位址,也是二維陣列0行的首位址,等於1000。a+1代表第一行的首位址,等於1008。如圖:

a[0]是第乙個一維陣列的陣列名和首位址,因此也為1000。*(a+0)或*a是與a[0]等效的, 它表示一維陣列a[0]0 號元素的首位址,也為1000。&a[0][0]是二維陣列a的0行0列元素首位址,同樣是1000。因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。

同理,a+1是二維陣列1行的首位址,等於1008。a[1]是第二個一維陣列的陣列名和首位址,因此也為1008。&a[1][0]是二維陣列a的1行0列元素位址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。

由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。

此外,&a[i]和a[i]也是等同的。因為在二維陣列中不能把&a[i]理解為元素a[i]的位址,不存在元素a[i]。c語言規定,它是一種位址計算方法,表示陣列a第i行首位址。由此,我們得出:a[i],&a[i],*(a+i)和a+i也都是等同的。

另外,a[0]也可以看成是a[0]+0,是一維陣列a[0]的0號元素的首位址,而a[0]+1則是a[0]的1號元素首位址,由此可得出a[i]+j則是一維陣列a[i]的j號元素首位址,它等於&a[i][j]。

由a[i]=*(a+i)得a[i]+j=*(a+i)+j。由於*(a+i)+j是二維陣列a的i行j列元素的首位址,所以,該元素的值等於*(*(a+i)+j)。

把二維陣列a分解為一維陣列a[0]、a[1]、a[2]之後,設p為指向二維陣列的指標變數。可定義為:

int (*p)[4]

它表示p是乙個指標變數,它指向包含4個元素的一維陣列。若指向第乙個一維陣列a[0],其值等於a,a[0],或&a[0][0]等。而p+i則指向一維陣列a[i]。從前面的分析可得出*(p+i)+j是二維陣列i行j 列的元素的位址,而*(*(p+i)+j)則是i行j列元素的值。

二維陣列指標變數說明的一般形式為:

型別說明符 (*指標變數名)[長度]

其中「型別說明符」為所指陣列的資料型別。「*」表示其後的變數是指標型別。「長度」表示二維陣列分解為多個一維陣列時,一維陣列的長度,也就是二維陣列的列數。應注意「(*指標變數名)」兩邊的括號不可少,如缺少括號則表示是指標陣列(本章後面介紹),意義就完全不同了。

詳細舉例和細節使用請看另一篇博文:

c c 筆記 指向陣列的指標與二維陣列

指向陣列的指標與二維陣列 定義乙個二維陣列很簡單,如int matrix 3 10 如果我們想在函式中對這個二維陣列進行修改那麼該如何傳遞引數呢?有兩種方式 void func int mat 10 或 void func int mat 10 mat 10 mat就是乙個指向陣列的指標。同時 ma...

二維陣列與指向二維陣列的指標

指標陣列 是陣列元素為指標的陣列,本質為陣列。int p n 陣列指標 是指向陣列首元素的指標,其本質為指標。int p n 的優先順序高於指標運算子 操縱二維陣列 int a i j int pa j pa a a 代表該二維陣列的首位址 pa 代表該二維陣列的首位址 pa 也代表該二維陣列的首位...

C語言二維陣列指標(指向二維陣列的指標)

二維陣列的定義 int matrix 見圖的操作那篇文章裡面的定義 或者這篇文章提供了另外一種方法。二維陣列在概念上是二維的,有行和列,但在記憶體中所有的陣列元素都是連續排列的,它們之間沒有 縫隙 以下面的二維陣列 a 為例 int a 3 4 從概念上理解,a 的分布像乙個矩陣 0 1 2 3 4...