二維數(shù)組的地址分布究竟是什么樣的?
在數(shù)組專題的文章講解中,講到了二維數(shù)組的地址分布情況,之后也陸續(xù)有錄友與我交流這個(gè)問(wèn)題,這幾天抽空去做一下實(shí)驗(yàn),發(fā)現(xiàn)在C++中二維數(shù)組的地址空間是連續(xù)的。
所以單獨(dú)發(fā)文來(lái)講一講這個(gè)問(wèn)題。
C++測(cè)試代碼如下:
- // 測(cè)存儲(chǔ)地址
- void test_arr() {
- int array[2][3] = {
- {0, 1, 2},
- {3, 4, 5}
- };
- cout << &array[0][0] << " " << &array[0][1] << " " << &array[0][2] << endl;
- cout << &array[1][0] << " " << &array[1][1] << " " << &array[1][2] << endl;
- }
- int main() {
- test_arr();
- }
測(cè)試地址為
- 0x7ffee4065820 0x7ffee4065824 0x7ffee4065828
- 0x7ffee406582c 0x7ffee4065830 0x7ffee4065834
注意地址為16進(jìn)制,可以看出二維數(shù)組地址是連續(xù)一條線的。
一些錄友可能看不懂內(nèi)存地址,我就簡(jiǎn)單介紹一下, 0x7ffee4065820 與 0x7ffee4065824 差了一個(gè)4,就是4個(gè)字節(jié),因?yàn)檫@是一個(gè)int型的數(shù)組,所以兩個(gè)相信數(shù)組元素地址差4個(gè)字節(jié)。
0x7ffee4065828 與 0x7ffee406582c 也是差了4個(gè)字節(jié),在16進(jìn)制里8 + 4 = c,c就是12。
如圖:
可以看出在C++中二維數(shù)組在地址空間上是連續(xù)的。
像Java,Python是沒(méi)有指針的,同時(shí)也不對(duì)程序員暴漏其元素的地址,尋址操作完全交給虛擬機(jī)。
所以看不到每個(gè)元素的地址情況,這里我以Java為例,也做一個(gè)實(shí)驗(yàn)。
- public static void test_arr() {
- int[][] arr = {{1, 2, 3}, {3, 4, 5}, {6, 7, 8}, {9,9,9}};
- System.out.println(arr[0]);
- System.out.println(arr[1]);
- System.out.println(arr[2]);
- System.out.println(arr[3]);
- }
輸出的地址為:
- [I@7852e922
- [I@4e25154f
- [I@70dea4e
- [I@5c647e05
這里的數(shù)值也是16進(jìn)制,這不是真正的地址,而是經(jīng)過(guò)處理過(guò)后的數(shù)值了,我們也可以看出,二維數(shù)組的每一行頭結(jié)點(diǎn)的地址是沒(méi)有規(guī)則的,更談不上連續(xù)。
所以Java的二維數(shù)組可能是如下排列的方式:
總結(jié)
不同編程語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)在地址中的分布方式是不一樣的,C++中我們是可以直接獲取元素的地址,通過(guò)實(shí)驗(yàn),我們也證實(shí)了二維數(shù)組的元素確實(shí)是相鄰的。
在其他語(yǔ)言中,并沒(méi)有指針,也獲取不到每個(gè)元素的地址,以Java為例,通過(guò)實(shí)驗(yàn)可以推測(cè)可能Java里的二維數(shù)組是不相鄰的。
這里算是對(duì)之前講解數(shù)組內(nèi)容的一個(gè)糾正,也是給大家做一個(gè)科普。
大家可以發(fā)現(xiàn)C++賦給程序員足夠的自由,這也是C++的魅力所在。
但有的時(shí)候太自由了往往不是好事,編程語(yǔ)言都是各有各的優(yōu)點(diǎn),也不是哪門(mén)語(yǔ)言難,它就一定好!
好了,希望通過(guò)本篇大家可以二維數(shù)組的內(nèi)存分布有個(gè)初步的認(rèn)識(shí)了。
本文轉(zhuǎn)載自微信公眾號(hào)「代碼隨想錄」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系代碼隨想錄公眾號(hào)。