最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

例如:

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

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

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

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

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

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

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

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

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

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

靜態(tài)初始化

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

動態(tài)初始化

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

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

下面給出兩者的對比截圖

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

C語言中的數(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ù)組是怎樣存儲的呢?

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

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

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

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

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

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

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

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

相關(guān)文章

  • floyd算法實現(xiàn)思路及實例代碼

    floyd算法實現(xiàn)思路及實例代碼

    這篇文章主要介紹了floyd算法實現(xiàn)思路及實例代碼,有需要的朋友可以參考一下
    2014-01-01
  • 詳解Bucket Sort桶排序算法及C++代碼實現(xiàn)示例

    詳解Bucket Sort桶排序算法及C++代碼實現(xiàn)示例

    桶排序是一種線性排序算法,這里我們來詳解Bucket Sort桶排序算法及C++代碼實現(xiàn)示例,需要的朋友可以參考下
    2016-07-07
  • C++中sprintf()函數(shù)的使用詳解

    C++中sprintf()函數(shù)的使用詳解

    本篇文章是對C++中sprintf()函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++?棧和隊列的實現(xiàn)超詳細(xì)解析

    C++?棧和隊列的實現(xiàn)超詳細(xì)解析

    棧和隊列,嚴(yán)格意義上來說,也屬于線性表,因為它們也都用于存儲邏輯關(guān)系為?"一對一"?的數(shù)據(jù),但由于它們比較特殊,因此將其單獨作為一章,做重點講解
    2022-03-03
  • 用C++實現(xiàn)SLR語法分析程序

    用C++實現(xiàn)SLR語法分析程序

    大家好,本篇文章主要講的是用C++實現(xiàn)SLR語法分析程序,感興趣的同學(xué)趕緊來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 在C++中使用HP-Socket

    在C++中使用HP-Socket

    這篇文章主要介紹了C++中簡單使用HP-Socket,HP-Socket 是一套通用的高性能 TCP/UDP /HTTP 通信 框架 ,包含服務(wù)端組件、客戶端組件和 Agent 組件,廣泛適用于各種不同應(yīng)用場景的 TCP/UDP /HTTP 通信系統(tǒng),下面來看看更具體的介紹吧
    2021-11-11
  • C語言基于回溯算法解決八皇后問題的方法

    C語言基于回溯算法解決八皇后問題的方法

    這篇文章主要介紹了C語言基于回溯算法解決八皇后問題的方法,簡單描述了八皇后問題,并結(jié)合實例形式分析了C語言使用回溯算法解決八皇后問題的相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • C++使用適配器模式模擬實現(xiàn)棧和隊列

    C++使用適配器模式模擬實現(xiàn)棧和隊列

    不論是C語言還是C++,我們都用其對應(yīng)的傳統(tǒng)寫法對棧和隊列進(jìn)行了模擬實現(xiàn),現(xiàn)在我們要用新的方法模擬實現(xiàn)棧和隊列,這個新方法就是適配器模式,文章通過代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • 獲取C++變量類型的簡單方法

    獲取C++變量類型的簡單方法

    這篇文章主要介紹了獲取C++變量類型的簡單方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • C語言冒泡排序超全面實現(xiàn)流程

    C語言冒泡排序超全面實現(xiàn)流程

    算法中排序是十分重要的,而每一個學(xué)習(xí)計算機(jī)的都會在初期的時候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語言冒泡排序的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評論

桦川县| 峡江县| 鲜城| 博湖县| 花莲县| 肇源县| 衡水市| 本溪市| 芦山县| 砚山县| 蒲城县| 上饶县| 阳东县| 堆龙德庆县| 沈丘县| 双柏县| 运城市| 长海县| 东海县| 阿尔山市| 芜湖县| 荥阳市| 昂仁县| 治多县| 金乡县| 泽库县| 晋宁县| 武冈市| 孝昌县| 仙居县| 青浦区| 肃宁县| 巴彦淖尔市| 安义县| 沈阳市| 策勒县| 花莲县| 那曲县| 屏南县| 靖远县| 进贤县|