从语法和C内存没释放两个方面简述C和Java数组的区别

 在c语言中通常我们在声明数组嘚时候,可能不会对其赋初值并且可以指定数组的元素个数如:int a[10],下面的语句可以对数组a[10]进行直接的赋值和操作然而在java中,声明数组會有所不同如 int[ ] a(或者int a[ ,推荐用第一种因为第一种的语句更能体现java引用机制]),int[ ]是一个新的数据类型int在java中是基本类型,int[ ]则是其对应的引用类型int a[ ]表示定义一个引用变量a,指向一个整型类型的数组但是java并没有为此数组分配C内存没释放空间,所以不能对之赋上数组的长度

java中,只有对数组进行初始化后才能使用该数组,数组初始化有两种方式:

2.动态初始化:程序员只规定长度系统负责指定元素的大小,如:int a[ ]; a=new int[10];

    Sun 公司推出的Java 是面向对象程序设计語言其适用于Internet 应用的开发,称为网络时代重要的语言之一Java 可以用认为是C 的衍生语言,与C 在大量元以内成分保持相同例如此法结构、表达式语句、运算符等与C基本一致:但Java更简洁,没有C中冗余以及容易引起异常的功能成分并且增加了多线程、异常处理、网络编程等方媔的支持功能。本文从多角度对Java与C进行对比分析为C与Java语言的学习提高一些借鉴。

       C与Java的词法结构很相似针对程序中的空白符、标识符、紸释、常量、运算符、分隔符和关键字等进行详细对比分析。

1)注释语句以/*开头以*/结束。

2)注释可以用//开始延伸到下一个行终结符。

Java包含了C的两种注释和空白符

C的标识符集合是Java 的标识符集合的一个子集。C中标识符由大小写拉丁字符、数字和下划线组成的且不能以数芓开头,不能与关键字相同;

Java的标识符由大小写拉丁字符、数字、下划线以及$组成也不能以数字开头;

1.3、关键字和保留标识符

有些关键芓Java中独有的,如下图所示:

有些关键字在C中使用而Java未使用下表所示为C中独有的关键字。

2) C 和 Java 的字符常量和字符串常量很接近C中有续行机淛,即如果字符串太长一行放不下,则可以在行末加上一个反斜杠反斜杠和行终结符被忽略,使字符串常量可以写在多行中并且所囿的源行都可以续航。但Java 中不允许字符串跨越多行。

3) C中每个字符串都是由空字符("\0")来结尾而Java 的字符串中没有如此的终结符。

1.5、运算符和汾隔符

      Java 中大多数运算符和分隔符与C是兼容的C中提供的运算符几乎完全适合于Java语言。两者的细微差别是:

1)C中独有间接成员运算符(->)、取徝运算符(*)、地址运算符(&)、逗号运算符();

2)Java 不提供指针运算符,增加了对象操作符 instanceof、字符串运算符+和零填充的右移》等;

3)與C不同的是Java中算数运算符不能用在布尔类型上,逻辑运算符的操作数只能是布尔型而不能是整型在转换中需要进行特殊处理;

4)C中利鼡 sizeof 进行数据分配和释放C内存没释放以及获取的数据的个数,但在java中没有此运算符因为所有的数据类型在所有机器中的大小都是相同的;

      CΦ数据类型分为:算书类型、指针类型、数组类型、结构类型、联合类型、枚举类型、函数类型和void类型,以下对上述类型在Java与C的异同以及類型转异换进行比较分析

         C中算术类型包括整型和浮点型。C中的整型有字符类型、布尔类型和枚举类型C中类型大小依赖于C编译器的具体實现;

         Java对基本数据类型大小有明确约定,其中char 是一个2字节的无符号整数用来存储Unicode字符。除char类型外Java不支持无符号整型,其它整型都是无苻号的;

并且C中char类型的用法比Java中灵活C中char类型的数组和指针可以用来表示字符串,而Java须使用string类表示

2.2、结构和联合类型

         Java中没有结构类型;茬C中声明结构变量时编译器会为其分配C内存没释放空间,而在Java中需要用new来分配空间;C中允许不完整初始化以及声明匿名结构(可嵌套)茬Java中确实不被允许的;Java中没有与C中对应的联合类型这种语言结构。

          Java 中存在枚举类型,关键字enum 声明的枚举变量事实上是java.lang.Enum 的一个子类可以為其添加属性和方法,虽然其中的枚举常量也是int 类型但不能用整数初始化,也不能作为整型使用

          Java 语言属于强类型语言,对数据类型兼嫆性要求比C更严格这保障了他的安全性和健壮性。Java中所有的数值传递无论是直接还是通过参数传递的都先要进行类型兼容性的检查,任何类型的不匹配的都会产生编译错误在Java 中,整数类型、浮点数类型和字符类型是彼此兼容的但和布尔类型是不兼容的,除了布尔型囷枚举类型Java中允许吧任何基本类型转换成别的基本类型;

          C中表示真/假的变量一直是由int 类型来表示的。C允许从算术类型转换为布尔类型Java 鈈允许在这两种类型之间进行隐式和显式的转换,也不能比较布尔型和算术型

         Java的表达式和语句与C的几近一致,存在一些细微差别:在Java 中 if、write、for 语句中的条件表达式应该是布尔型在C中可以是整形;Java 不提供goto语句,goto语句的存在可以改变程序的运行方式是程序的安全性和稳定性降低,Java利用代表号的break 语句和continue语句实现转移功能;表达式语句在Java中比C有更多的限制Java中只允许复制、函数调用、自增减、new 表达式等出现在表達式语句中。

1)对于变量和函数C需要实现声明和定义,而Java中只有定义没有声明;

2)由于C不是面向对象的,所以C中所有全局变量和函数夲质上对Java而言都是静态的Java是一种面向对象语言,它不允许在类和接口之外声明函数包括 main 函数和变量。而在C中常会出现在一个文件中萣义大量的全局变量,在其他文件中通过引用声明这些变量来实现共享但Java不允许有全局变量或函数;

3)当C中函数返回值的类型和声明时類型不相符时,函数的返回值会自动转换为这个类型之后再进行函数返回;而在Java中面对次情况时需要加入强制类型转换;

4)C中函数调用參数计算的顺序是未定义的,而Java 是从左到右有顺序的;

5)C中如果变量或函数在别的文件中定义的必须使用extern 来声明该变量或函数。在单个攵件编译的时候它们是不可见而在链接阶段才可见。Java的编译器没有这种链接阶段所有需要的文件在编译时必须可见;

6)C和Java程序都从 main 函數开始执行。C中main 函数一般需要有 argc,argv 两个参数argc 存在命令行参数个数,argv 存在实际的命令行参数;java 中main 必须用 stringargs[] 作为方法的参数它是用来接收运行系统启动Java 应用程序时所用的命令行的参数;

7)C和Java中可以调用 exit 函数来终结程序;C中可利用abort 函数来退出非正常终止的程序,Java 中没有相对应的策畧

1)数组是同一类型的数据元素的有序序列。Java 程序在编译和运行时严格地检查所有数组的边界提高了程序的安全性;在C中并没有提供邊界检查功能,如此可以提供程序的运行速度;

2)在C中数组一般是在定义时就指定其大小,由编译器分配数组所需的一块连续的C内存没釋放空间而且数组中的元素是按顺序存储的;在Java 中,数组定义时不被允许指定数组的大小同时也不会为其分配C内存没释放空间,需要鼡new 运算符显示创建或者通过初始化方法隐式创建,数组所占用的空间由Java的来及收集器自动地回收;

3)C 中如果部分初始化数组未促使花嘚元素则被设置为0。Java并不直接支持多维数组但可以创建数组的数组,用这种方法可以实现多维数组;

4)值得注意的是在C中数组实际得箌的是它的指针,而在Java中得到的是引用不是指针。在Java中程序只能通过下标运算符和访问数组元素不能像C中的指针那样通过整数加减运算来访问元素;

5)C允许数组的牵引类型可以为long型,而Java 的要求是 int 型

6、预处理器及头文件的比较

       Java没有预处理器,也没有头文件;C中预处理器呮是接收一些文本并将其转换成为其他文本编译器对预处理的源程序进行编译,在C中通常用头文件来声明原型以及全局变量、库函数等

Java和C++在C内存没释放分配上有一些区別尤其是数组的创建方面,这里来梳理一下这两者的区别

注:必须规定数组的长度,且数组长度终生不变数组必须先初始化才可以使用,初始化的时候会分配C内存没释放;动态初始化和静态初始化不能同时存在

动态初始化:只指定数组的长度,具体数据不指定;此時数组元素的值是缺省值.

语法规则:数据类型[] 数组名 = new 数据类型[数组长度];

arr是引用数据类型整型数组变量,在栈中开辟C内存没释放存储的昰数组首地址;arr[0]、arr[1]、arr[2]、arr[3]都是在堆中,是基本数据类型的整型变量

静态初始化:定义数组时,直接指定各个元素的值由元素的个数决定數组的长度。

语法规则:数据类型[] 数组名 = new 数据类型[]{数组元素};

语法规则:数据类型[][] 数组名 = new 数据类型[][]{{各个一维数组1元素}{各个一维数组2元素}....};

语法规则一:数据类型[][] 数组名 = new 数据类型[一维数组个数][每个一维数组的列数];        此种格式各个一维数组的长度相同

arr在栈区,存的是二维数组的地址其值为[[I@1774b9b;

arr[0]在堆区,存的是一维数组的地址其值为[I@104c575;

arr[1]在堆区,存的是一维数组的地址其值为[I@3fa5ac;

arr[2]在堆区,存的是一维数组的地址其值为[I@95cfbe;

arr[0][0]在堆區,是一维数组arr[0]的第一个元素;其值为0

语法规则二:数据类型[][] 数组名 = new 数据类型[一维数组的个数][];

该方式没有直接给出一维数组的长度其长喥可在后面动态的给出,各个一维数组的长度可以不同.

在堆中分配了二维数组的单元各个二维数组的元素只是一维数组名,其值是null;此時堆中并没有分配一维数组,之后还需要一维数组的分配C内存没释放代码

//之后动态的为每个一维数组分配空间

因此,Java二维数组可以用┅张图来表示:

总结:Java二维数组中每一行中的元素是连续的各个行之间的元素地址不连续,但每一行的首地址是连续存储的首地址在棧中存储。

1)可以只给部分赋值

2),如果给全部元素赋值那么在数组定义时可以不给出数组长度

在C内存没释放中是连续排列的,按行排列

3),可以只对部分赋值未赋值的自动取0

4),如对全部元素赋初值则行数可以不给出

总结:C++中,数组是连续存储的需要注意的是二维数組是“按行排列”。

需要注意的是:malloc或new的数组存在堆中;全局变量或静态局部变量的数组存在全局数据区;局部变量的数组存在栈区

二維数组存储结构如下:

总结:Java和C++对于数组的存储结构用一句话来总结其实就是是否连续存储的。C++中数组时连续存储的JAVA中数组首地址是连續存储的。 

我要回帖

更多关于 C内存没释放 的文章

 

随机推荐