说到Java静态数组,我们第一时间可能就会想到相应的动态数组,两者看上去挺相似,实质却大不一样。Java静态数组是一定义出来就创建了,而动态数组则是定义时不创建,使用时才创建,一定意义上节省了内存空间。本文我们主要来讲一讲相对比较简单的Java静态数组。

实际上我们之前学习的大部分数组都是静态数组,然而在很多的时候,静态数组根本不能满足我们编程的实际需要,比方说我需要在程序运行过程中动态的向数组中添加数据,这时我们的静态数组大小是固定的,显然就不能添加数据,要动态添加数据必须要用到动态数组,动态数组中的各个元素类型也是一致的,不过这种类型已经是用一个非常大的类型来揽括—Object类型。

Java静态数组,顾名思义,是静态不变的,在内存中位于栈区,是在定义时就已经在栈上分配了固定大小,在运行时这个大小不能改变,如:

int a[10];

在函数执行完以后,系统自动销毁;

动态数组是malloc或者new出来的,位于内存的堆区,它的大小是在运行时给定,并且可以改变其,如:

i

nt *a;
a = new int[10];动

态数组,其创建麻烦,使用完必须由程序员自己通过free或者delete释放,否则严重会引起内存泄露。

new[]/delete[]
#include
#include
void fun( int *p )
{
sizeof( p ) / sizeof( p[0] );
}
int main( void )
{
int a[5];
int *p = a;
sizeof( p ) / sizeof( int ); // 结果为1
sizeof( a ) / sizeof( int ); // 结果为5
p = ( int * ) malloc( sizeof(int) * 5);
sizeof( p ) / sizeof( int ) ; //结果为1
return 0;
}

Java静态数组可以看成是一个特殊的指针,它是指是一个常量,在第一次赋值以后,不能修改。编译器还保存关于数组长度的信息sizeof()便可以体现。

一般我们定义一个数组 int a[5] ; main函数栈就为它分配空间,便把这段空间的首地址赋值给a,a 做为指针类型,具有具体值,只能作为右值(出现在在表达式的右边)。

下面我们通过实例来看一下Java静态数组的创建和简单使用:

#include// std::cout std::endl
int main(void)
{
// 创建具有10个元素的数组并且全部初始化为0
int arr1[10] = {};
// 跟上面一样, 赋值符号可省略
int arr2[10]{};
// 创建具有10个元素的数组,前三个分别初始化为1, 2, 3, 剩余全部初始化为0
int arr3[10]{ 1, 2, 3 };
// 创建具有4个元素的数组, 编译器在编译的时候会确定数组中元素的数量
int arr4[]{ 4, 5, 6, 7 };
// 对数组的元素进行操作
arr4[2] = 1024; // arr4的现在元素是{ 4, 5, 1024, 7 }
// 数组名是内存地址而不是指针, 去掉下面注释将会报错
// arr1 = arr4;
// 数组名是数组的首地址, 使用指针保存数组首地址
auto *p = arr4; // int *p = arr4;
std::cout << p[2] << std::endl;
return 0;
}