二維陣列名的本質

2021-08-21 18:32:12 字數 1616 閱讀 7726

本人是乙個c語言小白,二維陣列名到底是啥?一直困擾著我,不過現在我想通了。現在把我的心得分享給大家:

定義乙個2行3列的二維陣列

int a[2][3] = ;
二維陣列名a不用說肯定是乙個指標,我們知道一維陣列名是乙個指向首元素的指標,我們是通過指標步長來判斷的(即:指標進行+1所跳過的位元組數)那麼二維陣列名的步長是多少呢?

printf("a:%d, a+1:%d\n", a, a+1);

//a:10484556, a+1:10484568 相差12

我們發現,步長是12,我們建立的是乙個2行3列的二維陣列,每一行的位元組數正好是12(即:元素個數*每個元素所佔位元組數 = 12)所以可以得出二維陣列名是乙個指向每一行的指標。

怎樣得到指向整個二維陣列的指標呢?

printf("&a:%d, &a+1:%d\n", &a, &a+1);

//&a:10484556, &a+1:10484580 相差24

直接看上面的**,在二維陣列名前面加上&之後,指標的步長是24,那麼就說明,+1之後跳過了整個二維陣列,是不是覺得和一位陣列很相似呢。

我們繼續**,我想你一定還有乙個地方想不同,那就是int a[2][3]中的a[2]是神馬呢??

還是老套路,我們通過指標步長來判斷:

printf("a[0]:%d, a[0]+1:%d\n", a[0], a[0]+1);

//a[0]:10484556, a[0]+1:10484560 相差4

我們發現相差4,是不是好像有點明白了,沒錯在二維陣列中a[0]是指向每一行的首元素的。+1之後自然就是指向這一行的第i個元素了。

上面這些問題都明白了,我猜你肯定,還有一些疑問。

一些書上說&a[0], &a的區別說的很囉嗦,其實,就是指標的步長的不同嘛!

printf("&a[0]:%d, &a:%d\n",&a[0], &a);

//&a[0]:10484556, &a:10484556 相同

我們發現,它倆的位址竟然一樣。那麼是否可以判斷它倆一樣呢?答案是否定的!!

printf("&a[0]+1:%d, &a+1:%d\n", &a[0]+1, &a+1);

//&a[0]+1:10484568, &a+1:10484580

和上面的資料對比後,我們發現&a[0]跳了12個位元組(跳過了一行),而&a跳了24個位元組(跳過了整個二維陣列)這就是它們倆的區別。

最後,二維陣列其實還可以用指標表示,我覺得你只要明白了上面這些。二維陣列的指標表示法肯定能搞定!你只要明白

*(a+i)等價於a[i]
最後做一下總結:

二維陣列名指向行的,「&二維陣列名」就指向了整個二維陣列

"二維陣列名[i]" 是指向i行的首元素的。「&二維陣列名[i]」就指向了一行

二維陣列和二維陣列名

對於一位陣列我們認識到其資料元素在記憶體中是按線性順序依次排列的,且一維陣列名的值是乙個指標常量。那麼二維陣列在記憶體中又是怎麼儲存的,其陣列名又有什麼含義呢?定義乙個二維陣列 int arr 3 4 我們可以將乙個二維陣列看做是乙個其中元素為陣列的乙個一位陣列,也就是說二維陣列第一維的元素實際上是...

二維陣列名的型別

在討論二維陣列名之前我們先看一下一維陣列名表示的是什麼?int b 3 cout b endl cout b endl 執行結果 說明一維陣列名其實是乙個指向陣列第乙個元素的位址。陣列名b的型別就是int 型的 其實b的型別和int型的指標不是完全等價的 那二維陣列是不是也是這樣呢?先看一段 int...

二維陣列名 二維陣列名取位址 二級指標

先給出結論,便於以後查閱 首先給出幾個定義 typedef int p1x4 4 定義資料型別,p1x4這種型別為指向含4個int元素的1維陣列的指標 typedef int p3x4 3 4 定義資料型別,p3x4這種型別為指向含3x4個int元素的2維陣列的指標 下面從一維陣列說起 定義 int...