C与JAVA在二维数组声明省略行列的问题

C语言与JAVA在二维数组声明省略行列的问题

我在学习过程遇到了一个C语言二维数组声明省略行列的问题,因为学习了JAVA所以做题时纠结很久,因为记得JAVA二维数组每行的元素个数可以不同,所以认为必须声明行数可以省略列数,然而在C语言中是错误的。

在这里插入图片描述
在学习C语言与JAVA的过程中做题遇到了声明二维数组时只声明行与只声明列的问题,原本以为自己记错了,回顾发现了一个很有意思的问题,原来C与JAVA在声明二维数组时遇到的这类问题是不同的。
C可以只声明列不声明行,而JAVA可以声明行而不声明列,而且JAVA的每行的元素可以各不相同。
所以查阅了一些资料,分析了一些C语言与JAVA在二维数组声明过程中遇到的行列问题

C语言二维数组思路

在C语言中二维数组的定义一般形式为dataType Arra[len1][len2];

二维数组可以看做一个len1行len2列的矩形数据,实际上所有的数据在内存中的存放是连续的。
在这里插入图片描述
在这里插入图片描述
在C语言中,二维数组是按行排列,存储一行再存储一行,是按照多条长度相同的一维数组组成。
当声明二维数组时忽略len1(行)只声明len2(列)的长度时,C语言编译器是允许这样操作的。
假设数组int a[L1][L2],如果要访问a[i][j]的值时,编译器的寻址方式为:
&a[i][j]=&a[0][0]+i*sizeof(int)n+jsizeof(int);
所以可以省略len1(行)的参数;
所以在定义声明时,同样可以忽略len1(行)的问题。
简单可以理解为,我需要一个二维数组,提前规定好每行可以装载的元素个数,后续有几行可以暂不做声明,增加时以第一行为标准成倍数增多。

就像是排列方队,首先要将第一排的人数确定好,每次增加只能以第一排的格式进行增加。
在这里插入图片描述

JAVA二维数组思路

二维数组的声明格式:type array[ ][ ] = new type[len1][len2];
在这里插入图片描述

二维数组的基本属性:

二维数组每个元素都是数组,初始化如果使用动态初始化不会给默认值,不是一个矩形,内部每个元素长度不固定
JAVA中的二维数组可以认为是数组的数组,定义一种数据类型的数组来装这种数据类型的一维数组数组,每个一维数组作为总数组的一个元素。

内存分配分析:

在内存分配过程中,先在栈内存分配一个二维数组的首地址,首地址指向堆内存。声明过程中len1的数值决定二维数组中的子数组的个数,并在堆内存中分配空间。

在声明二维数组过程中:

当len1、len2同时被赋值时,则在堆内存中创建len1个连续的len2长度的一维数组,并同时被array[][]首地址指向。

另外一种情况下,省略行列问题中,在生明二维数组过程中JAVA与C语言的不同之处则体现在,JAVA不需要声明len2(列)长度,但是必须要声明len1(行)长度,而且每行的元素个数不要求相同。
在这里插入图片描述
因为在内存分配过程中,首先为二维分配引用空间,然后在向下一维分配空间,而且内存分配过程中数组元素都是单独分配空间,所以len1(行)不可省略,len2(列)可以省略。

简单的可以理解为,在声明数组元素可等同于使用动态赋值的方法声明一个一维数组,生明时可以先不规定元素个数。但是二维数组虽然也是数组,但是需要将数组元素提前声明,因为计算机需要提前知道并准备好所需要个数的一维数组的连续数组空间。

每个数组元素都是等待动态赋值的一维数组,所以可以暂不定义元素个数。

动态赋值给我的感觉就像是一些还没出生的婴儿等待被赋予名字,性别一样,而二维数组就像是一个母亲已经决定生几个孩子,而每个孩子还没有被赋予姓名和性别,他们的名字可以相同也可以不同。

因为突然看到了这个问题,所以突然想弄明白这么回事,所以查阅了一些资料,里面有我的一些个人理解,分享出来,希望能帮助到一些人,也是想记录一下自己的学习成果吧,第一次写这种博客,也有点紧张!!!

  • 25
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值