亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語(yǔ)言與java語(yǔ)言中關(guān)于二維數(shù)組的區(qū)別

 更新時(shí)間:2022年08月19日 11:21:37   作者:triumph_421  
這篇文章主要介紹了C語(yǔ)言與java語(yǔ)言中關(guān)于二維數(shù)組的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

數(shù)組是編程語(yǔ)言中常用的數(shù)據(jù)結(jié)構(gòu),然而在不同的環(huán)境下,其定義及初始化的方式也不盡相同。下面來(lái)講述一下CJava中對(duì)于二維數(shù)組定義的區(qū)別以及其背后的原理。

C語(yǔ)言中,二維數(shù)組的初始化可以省略行數(shù),但不能省略列數(shù);而在java中卻是正好相反的,即列數(shù)可以省略,而行數(shù)是不能省略的。為什么會(huì)是這樣呢?首先我們來(lái)回顧一下C和Java中二維數(shù)組的定義。

C語(yǔ)言數(shù)中二維數(shù)組的定義格式

類型名   數(shù)組名 [行數(shù)][列數(shù)];

例如:

int a[3][2];        /*表示定義了二維數(shù)組a,3行2列,6個(gè)元素 */

可見(jiàn),在C語(yǔ)言中,二維數(shù)組的元素?cái)?shù)量等于行數(shù)和列數(shù)的乘積,所以二維數(shù)組一經(jīng)定義,其被分配的內(nèi)存大小就已經(jīng)確定了。

因此,對(duì)于單純的定義二維數(shù)組來(lái)說(shuō),其行和列都是不可省略的,一旦有省略,那么在編譯時(shí)就會(huì)報(bào)“數(shù)組內(nèi)存大小不確定”的錯(cuò)誤。

代碼段及編譯結(jié)果如下圖所示:

int a[][5];        /*在定義數(shù)組a時(shí)省略了行數(shù)*/ 

而我們所說(shuō)的可以省略行數(shù),是在對(duì)二維數(shù)組初始化的時(shí)候,即在定義時(shí)給數(shù)組元素賦初值的時(shí)候。要想編譯時(shí)不報(bào)錯(cuò),就需要讓編譯器知道該數(shù)組占用的內(nèi)存空間,只不過(guò)在有省略的情況下就只能讓編譯器自己推斷出數(shù)組占用的內(nèi)存空間了,那么為什么省略了行就能夠推斷出來(lái),而省略了列就不可以呢?

這就要提到二維數(shù)組元素在內(nèi)存中的存儲(chǔ)方式了。C語(yǔ)言是按照“先行后列”的順序來(lái)存儲(chǔ)數(shù)組的,即先存儲(chǔ)第0行的元素,然后是第1行的元素,以此類推。所以編譯器必須知道每行元素的個(gè)數(shù),才能由初始化的結(jié)果推斷出行數(shù),進(jìn)而推斷出二維數(shù)組所占用的內(nèi)存空間。而每行元素的個(gè)數(shù)正是二維數(shù)組的列標(biāo)。

Java語(yǔ)言中二維數(shù)組的定義與初始化

Java語(yǔ)言中對(duì)于二維數(shù)組的定義稍微有些復(fù)雜,創(chuàng)建一個(gè)Java數(shù)組需要三個(gè)步驟:聲明數(shù)組、創(chuàng)建數(shù)組空間、創(chuàng)建數(shù)組元素并初始化。

其中初始化可以分為:靜態(tài)初始化和動(dòng)態(tài)初始化。

靜態(tài)初始化

int[][] arr = new int[][]{{1,2,3,6},{4,5},{7,8,9}};
等價(jià)于
int arr[][] = {{1,2,3,6},{4,5},{7,8,9}};

動(dòng)態(tài)初始化

int [][] arr3 = new int[4][3];
int [][] arr4 = new int[4][];

由動(dòng)態(tài)初始化可以看出,在還沒(méi)有為二維數(shù)組元素賦初值時(shí),列下標(biāo)是可以省略的。在這里要聲明的一點(diǎn)是:C語(yǔ)言中二維數(shù)組的每個(gè)元素都是大小相同的一維數(shù)組,即如果把其中的各個(gè)元素鋪開(kāi),會(huì)是一個(gè)矩形;但在Java中并不要求每一個(gè)一維數(shù)組的大小一致,所以也就不能在定義的時(shí)候說(shuō)明列數(shù)。

下面給出兩者的對(duì)比截圖

(以相同的元素分別為C和Java中的二維數(shù)組初始化)

C語(yǔ)言中的數(shù)組元素分布

int arr[3][4] = {{1,2,3,6},{4,5},{7,8,9}};
for(int i = 0; i < 3; i++){
    for(int j = 0; j < 4; j++){
        printf("%d  ",arr[i][j]);
	}
		printf("\n");
	} 

Java中的數(shù)組元素分布

int[][] arr = new int[][]{{1,2,3,6},{4,5},{7,8,9}};
		for(int i = 0; i < arr.length; i++){
			for(int j = 0; j < arr[i].length; j++){
				System.out.print(arr[i][j] + " ");
			}
			    System.out.println();
		}

那么Java的二維數(shù)組是怎樣存儲(chǔ)的呢?

Java二維數(shù)組的數(shù)組名存儲(chǔ)在棧中,堆里面存放的是new出來(lái)的結(jié)構(gòu),比如具體的數(shù)組元素。在定義二維數(shù)組時(shí),先在棧里申請(qǐng)行數(shù),然后等具體要用到哪一個(gè)一維數(shù)組了再向堆申請(qǐng)內(nèi)存。

所以在定義二維數(shù)組時(shí),若省略了列數(shù),則可以看做是申請(qǐng)了若干個(gè)(行數(shù))一維數(shù)組,但是具體的一維數(shù)組中的數(shù)據(jù)暫時(shí)是不知道的。

下面給出Java中二維數(shù)組的內(nèi)存解析圖:

由上圖可知:數(shù)組arr1在定義時(shí)行標(biāo)和列標(biāo)都給出了,其定義的過(guò)程可以描述為:先在棧里為arr1申請(qǐng)行數(shù),即為arr1申請(qǐng)一片空間并把空間的首地址賦給arr1,相當(dāng)于確定好了該二維數(shù)組arr1中有三個(gè)元素,分別為三個(gè)一維數(shù)組。而列標(biāo)被定義出來(lái)就意味著為二維數(shù)組的每個(gè)數(shù)據(jù)元素都分配好了內(nèi)存空間,并把三個(gè)一維數(shù)組的首地址傳了過(guò)去。對(duì)于arr1的各個(gè)數(shù)據(jù)元素,因?yàn)樵诙x的時(shí)候沒(méi)有賦初值,且是String類型,所以默認(rèn)為null。

數(shù)組arr2在定義時(shí)省略了列標(biāo),所以相當(dāng)于只給出了arr2這個(gè)int型二維數(shù)組的四個(gè)一維數(shù)組元素,而沒(méi)有為這四個(gè)一維數(shù)組賦初值。而因?yàn)閍rr2的四個(gè)元素都為引用數(shù)據(jù)類型(數(shù)組),所以默認(rèn)值為null。

  • arr2[1] = new int[5]; 相當(dāng)于為arr2的第二個(gè)元素指明了一塊內(nèi)存空間,并把這塊空間的首地址賦給了arr2[1],arr2[1]的長(zhǎng)度為5,元素類型為int型,又因?yàn)闆](méi)有為這個(gè)一維數(shù)組賦初值,所以默認(rèn)值為0。
  • arr2[1][1] = 1; 的作用是把a(bǔ)rr2[1]這個(gè)一維數(shù)組的第二個(gè)元素賦值為1。
  • arr2[2][2] = 1; 因?yàn)闆](méi)有為arr2的第三個(gè)元素分配內(nèi)存空間,所以此時(shí)會(huì)報(bào)空指針異常。

最后,再次回到Java中定義二維數(shù)組時(shí)為什么不能省略行數(shù)的問(wèn)題。結(jié)合上述的內(nèi)存解析,我們知道Java中的二維數(shù)組是要先確立行數(shù),進(jìn)而才能確立列數(shù),也就是要申請(qǐng)一片內(nèi)存空間用來(lái)存放每個(gè)一位數(shù)組的地址,然后才能為每個(gè)一維數(shù)組分配內(nèi)存空間。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++智能指針模板應(yīng)用詳細(xì)介紹

    C++智能指針模板應(yīng)用詳細(xì)介紹

    從比較簡(jiǎn)單的層面來(lái)看,智能指針是RAII(Resource Acquisition Is Initialization,資源獲取即初始化)機(jī)制對(duì)普通指針進(jìn)行的一層封裝。這樣使得智能指針的行為動(dòng)作像一個(gè)指針,本質(zhì)上卻是一個(gè)對(duì)象,這樣可以方便管理一個(gè)對(duì)象的生命周期
    2022-08-08
  • C語(yǔ)言實(shí)現(xiàn)通訊管理系統(tǒng)設(shè)計(jì)

    C語(yǔ)言實(shí)現(xiàn)通訊管理系統(tǒng)設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通訊管理系統(tǒng)設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++17中的std::optional的具體使用

    C++17中的std::optional的具體使用

    這篇文章主要介紹了C++17中的std::optional的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 基于VC編寫COM連接點(diǎn)事件的分析介紹

    基于VC編寫COM連接點(diǎn)事件的分析介紹

    本篇文章是對(duì)VC編寫COM連接點(diǎn)事件進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Visual Studio2022+QT6創(chuàng)建桌面應(yīng)用實(shí)現(xiàn)

    Visual Studio2022+QT6創(chuàng)建桌面應(yīng)用實(shí)現(xiàn)

    本文主要介紹了Visual Studio2022+QT6創(chuàng)建桌面應(yīng)用實(shí)現(xiàn),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • QT實(shí)現(xiàn)讀寫ini文件的示例代碼

    QT實(shí)現(xiàn)讀寫ini文件的示例代碼

    .ini文件是Initialization?File的縮寫,即初始化文件,本文主要給大家介紹了關(guān)于Qt讀寫ini文件的相關(guān)方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • C語(yǔ)言基礎(chǔ)之C語(yǔ)言格式化輸出函數(shù)printf詳解

    C語(yǔ)言基礎(chǔ)之C語(yǔ)言格式化輸出函數(shù)printf詳解

    這篇文章主要介紹了C語(yǔ)言格式化輸出函數(shù)printf詳解,printf函數(shù)中用到的格式字符與printf函數(shù)中用到的格式修飾符,感興趣的小伙伴可以借鑒一下
    2023-03-03
  • C語(yǔ)言版學(xué)生成績(jī)管理系統(tǒng)

    C語(yǔ)言版學(xué)生成績(jī)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言版學(xué)生成績(jī)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++中const、volatile、mutable使用方法小結(jié)

    C++中const、volatile、mutable使用方法小結(jié)

    這篇文章主要介紹了C++中const、volatile、mutable使用方法小結(jié),需要的朋友可以參考下
    2020-01-01
  • C++二叉樹(shù)實(shí)現(xiàn)詞頻分析功能

    C++二叉樹(shù)實(shí)現(xiàn)詞頻分析功能

    這篇文章主要為大家詳細(xì)介紹了C++二叉樹(shù)實(shí)現(xiàn)詞頻分析功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評(píng)論