C语言与java语言中关于二维数组的区别

目录
  • C语言数中二维数组的定义格式
  • Java语言中二维数组的定义与初始化
    • 静态初始化
    • 动态初始化
  • 下面给出两者的对比截图
    • C语言中的数组元素分布
    • Java中的数组元素分布

数组是编程语言中常用的数据结构,然而在不同的环境下,其定义及初始化的方式也不尽相同。下面来讲述一下CJava中对于二维数组定义的区别以及其背后的原理。

C语言中,二维数组的初始化可以省略行数,但不能省略列数;而在java中却是正好相反的,即列数可以省略,而行数是不能省略的。为什么会是这样呢?首先我们来回顾一下C和Java中二维数组的定义。

C语言数中二维数组的定义格式

类型名   数组名 [行数][列数];

例如:

int a[3][2];        /*表示定义了二维数组a,3行2列,6个元素 */

可见,在C语言中,二维数组的元素数量等于行数和列数的乘积,所以二维数组一经定义,其被分配的内存大小就已经确定了。

因此,对于单纯的定义二维数组来说,其行和列都是不可省略的,一旦有省略,那么在编译时就会报“数组内存大小不确定”的错误。

代码段及编译结果如下图所示:

int a[][5];        /*在定义数组a时省略了行数*/ 

而我们所说的可以省略行数,是在对二维数组初始化的时候,即在定义时给数组元素赋初值的时候。要想编译时不报错,就需要让编译器知道该数组占用的内存空间,只不过在有省略的情况下就只能让编译器自己推断出数组占用的内存空间了,那么为什么省略了行就能够推断出来,而省略了列就不可以呢?

这就要提到二维数组元素在内存中的存储方式了。C语言是按照“先行后列”的顺序来存储数组的,即先存储第0行的元素,然后是第1行的元素,以此类推。所以编译器必须知道每行元素的个数,才能由初始化的结果推断出行数,进而推断出二维数组所占用的内存空间。而每行元素的个数正是二维数组的列标。

Java语言中二维数组的定义与初始化

Java语言中对于二维数组的定义稍微有些复杂,创建一个Java数组需要三个步骤:声明数组、创建数组空间、创建数组元素并初始化。

其中初始化可以分为:静态初始化和动态初始化。

静态初始化

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

动态初始化

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

由动态初始化可以看出,在还没有为二维数组元素赋初值时,列下标是可以省略的。在这里要声明的一点是:C语言中二维数组的每个元素都是大小相同的一维数组,即如果把其中的各个元素铺开,会是一个矩形;但在Java中并不要求每一个一维数组的大小一致,所以也就不能在定义的时候说明列数。

下面给出两者的对比截图

(以相同的元素分别为C和Java中的二维数组初始化)

C语言中的数组元素分布

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中的数组元素分布

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的二维数组是怎样存储的呢?

Java二维数组的数组名存储在栈中,堆里面存放的是new出来的结构,比如具体的数组元素。在定义二维数组时,先在栈里申请行数,然后等具体要用到哪一个一维数组了再向堆申请内存。

所以在定义二维数组时,若省略了列数,则可以看做是申请了若干个(行数)一维数组,但是具体的一维数组中的数据暂时是不知道的。

下面给出Java中二维数组的内存解析图:

由上图可知:数组arr1在定义时行标和列标都给出了,其定义的过程可以描述为:先在栈里为arr1申请行数,即为arr1申请一片空间并把空间的首地址赋给arr1,相当于确定好了该二维数组arr1中有三个元素,分别为三个一维数组。而列标被定义出来就意味着为二维数组的每个数据元素都分配好了内存空间,并把三个一维数组的首地址传了过去。对于arr1的各个数据元素,因为在定义的时候没有赋初值,且是String类型,所以默认为null。

数组arr2在定义时省略了列标,所以相当于只给出了arr2这个int型二维数组的四个一维数组元素,而没有为这四个一维数组赋初值。而因为arr2的四个元素都为引用数据类型(数组),所以默认值为null。

  • arr2[1] = new int[5]; 相当于为arr2的第二个元素指明了一块内存空间,并把这块空间的首地址赋给了arr2[1],arr2[1]的长度为5,元素类型为int型,又因为没有为这个一维数组赋初值,所以默认值为0。
  • arr2[1][1] = 1; 的作用是把arr2[1]这个一维数组的第二个元素赋值为1。
  • arr2[2][2] = 1; 因为没有为arr2的第三个元素分配内存空间,所以此时会报空指针异常。

最后,再次回到Java中定义二维数组时为什么不能省略行数的问题。结合上述的内存解析,我们知道Java中的二维数组是要先确立行数,进而才能确立列数,也就是要申请一片内存空间用来存放每个一位数组的地址,然后才能为每个一维数组分配内存空间。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C语言 指针与二维数组详解

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 0   1   2   3 4   5   6   7 8   9  10  11 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放 a[

  • 从头学习C语言之二维数组

    目录 二维数组: 语法: 二维数组存放方式: 二维数组的访问: 二维数组的初始化: 示例: 总结 二维数组: 引入一个想法: 一个变量:相当于一个点. 一维数组(也就是数组):点汇聚成为一条直线. 二维数组:直线汇聚成一个平面. 三维数组:平面汇聚成立体图形. 语法: 类型 数组名[常量表达式][常量表达式] int a[6][6];//6*6,6行6列 char b[4][5];//4*5,4行5列 double c[6][3];//6*3,6行3列 二维数组存放方式: 二维数组的访问: 数组

  • C语言二维数组几种常用的表示方法

    名称:二维数组的几种表示方法 说明:常用的有以下几种二维数组的表示方法: (1).第一种是普通的二维数组的表示方法. (2).第二种是用一维数组来表示二维数组,从显示的元素地址可以看出,二维数组和一维数组表示的二维数组在内存中的储存方式其实是一样的,不过使用二维数组看起来要简单些,只要不用进行地址转换. (3).第三种表示是用指针数组.本例中的c[i]中的元素其实是地址.这种方法对各个元素大小不一样的情况下比较适用.如:假定有若干个不等长字符串需要我们处理,如果使用a [i ][j]结构,则j必

  • C语言与java语言中关于二维数组的区别

    目录 C语言数中二维数组的定义格式 Java语言中二维数组的定义与初始化 静态初始化 动态初始化 下面给出两者的对比截图 C语言中的数组元素分布 Java中的数组元素分布 数组是编程语言中常用的数据结构,然而在不同的环境下,其定义及初始化的方式也不尽相同.下面来讲述一下C和Java中对于二维数组定义的区别以及其背后的原理. 在C语言中,二维数组的初始化可以省略行数,但不能省略列数:而在java中却是正好相反的,即列数可以省略,而行数是不能省略的.为什么会是这样呢?首先我们来回顾一下C和Java中

  • Java基础语法之二维数组详解

    一.二维数组 进入正题之前.首先为了便于大家理解,我画了一个图: xx枪战游戏中, 我是一个刚刚注册账号的小白,系统送了我两把枪,此时,我的武器库只有这么一层(可以理解为一位数组,枪就是对应的数组中对应的元素) 经过艰苦卓绝的战斗,终于有了一笔钱,现在我打算配置好的游戏装备,我现在有了一个枪柜,它可以存放三层的枪械,每一层都可以放多把武器(这个就是二维数组,有多层,每层都是一个一维数组) 随着游戏时长和我的高超技术,获取游戏装备的效率越来越高了,一个枪柜已经存不下了,于是,我就有了多个枪柜(这个

  • 利用Java如何实现将二维数组转化为链式储存

    目录 链式存储结构 代码思路 代码实现 输出结果 总结 链式存储结构 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在插入.删除数据元素时比顺序存储要快,但是在查找一个节点时则要比顺序存储要慢. 使用链式存储可以克服顺序线性表需要预先知道数据大小的缺点,链表结构可以充分利用内存空间,实现灵活的内存动态管理.但是链式存储失去了数组随机存取的特点,同时增加了节点的指针域,空间开销较大. 下图就是最简单最一般的单向链表: 代码思路 将二维数组压缩成链式存

  • Java基础知识精通二维数组的应用

    目录 1.什么是二维数组 2.定义格式 3.二维数组的使用 4.二维数组的遍历 本文章主要讲二维数组定义,用法. 1.什么是二维数组 在二维数组多个元素为一维数组的数组就称为二维数组 2.定义格式 格式一: 元素的数据类型[][] 数组的名字 = new 元素的数据类型[二维数组的长度][一维数组的长度]: int[][] a = new int[3][2]; 解释: 这个二维数组中还有3个一维数组,每个一维数组中有两个元素. 格式二: 元素的数据类型[][] 数组的名字 = new 元素的数据

  • PHP中遍历二维数组_以不同形式的输出操作实例

    如下所示: <body> <?php //定义二维索引数组 $arr = array( array("101","李军","男","1976-02-20","95033"), array("103","陆君","男","1974-06-03","95031"), array("10

  • 一些Python中的二维数组的操作方法

    需要在程序中使用二维数组,网上找到一种这样的用法: #创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0]] myList = [[0] * 3] * 4 但是当操作myList[0][1] = 1时,发现整个第二列都被赋值,变成 [[0,1,0], [0,1,0], [0,1,0], [0,1,0]] 为什么...一时搞不懂,后面翻阅The Python Standard Library 找到答案 list * n->n sha

  • java高效打印一个二维数组的实例(不用递归,不用两个for循环)

    打印1个元素,不让循环变量i++,走出思维定式(执行一次循环体,就i++).public class OneForPrint2DArr { public static void main(String[] args) throws Exception { int[][] a = { { 1, 2, 3 }, { 4, 5} }; for (int i = 0, j = 0; i < a.length;) { System.out.println(a[i][j]); j++; if (j >=

  • numpy中实现二维数组按照某列、某行排序的方法

    如何根据二维数组中的某一行或者某一列排序?假设data是一个numpy.array类型的二维数组,可以利用numpy中的argsort函数进行实现,代码实例如下: data = data[data[:,2].argsort()] #按照第3列对行排序 注意:argsort返回的只是排好序后的行索引,不会改变原数组. 按照某行进行排序,可以利用转置操作,代码如下所示: data = data.T(data.T[:,2].argsort()).T # 按照第3行对列进行排序 也可以直接按行进行排序,

  • Python中的二维数组实例(list与numpy.array)

    关于python中的二维数组,主要有list和numpy.array两种. 好吧,其实还有matrices,但它必须是2维的,而numpy arrays (ndarrays) 可以是多维的. 我们主要讨论list和numpy.array的区别: 我们可以通过以下的代码看出二者的区别 >>import numpy as np >>a=[[1,2,3],[4,5,6],[7,8,9]] >>a [[1,2,3],[4,5,6],[7,8,9]] >>type(a

  • Java编程实现的二维数组转置功能示例

    本文实例讲述了Java编程实现的二维数组转置功能.分享给大家供大家参考,具体如下: /** * 实现二维数组的转置 * @author HAN * */ public class transposition_Arrays2D_ch6_4 { final static double PI=3.1415; public static void main(String[] args) { /*StaticTest st1=new StaticTest(); StaticTest st2=new Sta

随机推荐