c語言二維數組a中,&a,&a[0],a[0][0]的值與值的類型

c語言二維數組中的一些表達式的值與意義的問題


前兩天寫代碼的時候遇到一些關於數組的問題,進而對二維數組進行了一些深入的思考。想到了一個有意思的問題。

在二維數組a中,&a,&a[0],&a[0][0]的輸出值都是一樣的爲什麼它所代表的意義不一樣呢?在這裏插入圖片描述

這裏先說明一下&a,&a[0],&a[0][0]各自的意義,&a代表的是整個二維數組的地址,&a[0]代表的是二維數組首行的地址,&a[0][0]代表的是二維數組首行首元素的地址,那麼爲什麼它們的值是一樣的,然而它們所表達的意義卻一點都不相同呢?

實際上它們的值並不是完全相同的,它們僅僅只是在數值上是一樣的,它們的類型是完全不同的,就好比如int類型的1與char類型的1是完全不同的。
爲了解釋它們的值的類型不同,我們以一個例子來說明。

在這裏插入圖片描述
從圖中可以看到,雖然這三個表達式的值在數值上是一樣的,但是在它們分別作+1運算後,所得到的值是完全不同的。
我們知道指針是一個值爲地址的變量,所以我們可以把這些值認爲是指針的值,而&a+1,&a[0]+1,&a[0][0]+1則可以認爲是指針作加一的運算。指針加一的運算規則就是在指針的值上加一個指針所指變量的單位,比如有一個int數組,指針p指向這個數組的首元素,指針p的值是數組的第一個int變量的地址,則p+1的結果就是數組的第二個int變量的地址。
我們再說明一個知識,一維數組可以malloc一段內存然後賦值給一個指針實現,而二維數組可以以二級指針的方式實現,就是一個二級指針指向一級指針,多個一級指針分別指向一個元素。因此我們可以以指針的方式來理解數組。

&a

a是一個二維數組,可以理解爲a是一個二級指針,而&a是這個二級指針的地址,則可以理解爲是一個指向它的一個三級指針的值。因此再上述例子中&a值的類型爲int***,它所指變量的類型int**,因此&a+1就是下一個int**的地址,也就是整個二維數組之後的那個地址。

&a[0]

同樣的,a[0]是二維數組的首行,可以理解爲一個一級指針,因此&a[0]的值是一個指向它的二級指針的值,則&a[0]值的類型爲int**,所指變量類型爲int*,所以&a[0]+1就是下一個int*的地址,也就是二維數組的第二行的地址。

&a[0][0]

a[0][0]是一個int類型的元素,&a[0][0]就是一個指向它的一級指針的值,則&a[0][0]值的類型爲int*,所指變量類型是int,&a[0][0]+1就是下一個int的地址,也就是二維數組首行第二個變量的地址。

本文章對此問題的解釋就到此爲止,對於本文可能存在的一些錯誤,歡迎所有讀者指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章