c++里怎么定义一个不知道大小的数组
发布时间:2025-05-25 12:38:14 发布人:远客网络
一、c++里怎么定义一个不知道大小的数组
这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做:
//用指针p指向new动态分配的长度为len*sizeof(int)的内存空间
注意int*p=new int[len];这一句,你不能这样做:
C++编译器会报错说len的大小不能确定,因为用这种形式声明数组,数组的大小需要在编译时确定。而且这样也不行:
编译器会说不能把int*型转化为int[]型,因为用new开辟了一段内存空间后会返回这段内存的首地址,所以要把这个地址赋给一个指针,所以要用int*p=new int[len];
array01.cpp实现了一个变长的一维数组,但是要养成一个好习惯,就是注意要注销指针p,使程序释放用new开辟的内存空间。
当然使用C++标准模版库(STL)中的vector(向量)也可以实现变长数组:
vector<int> array(len);//声明变长数组
cout<<array[i]<<"\t";
这里的变长数组让我联想到了java的java.util包中的vector和C#中的ArrayList,它们也可以在各自的语言中实现变长数组。不过C++中的vector不能像C#一样有托管的垃圾回收机制回收被占用的内存空间,但是你可以在使用完vector后调用~vector()析构函数释放内存。
变长的n维数组实现起来有些麻烦,但是在工程与软件设计应用中常使用的是二维数组,所以在这里着重介绍变长的二维数组,变长的n维数组可以按照类似的方法实现。首先看一个经典的用C实现变长二维数组的例子:
printf("请输入你所求解的线性方程组的行数x:x=");
printf("请输入你所求解的线性方程组的列数y:y=");
a=(float**)malloc(sizeof(float*)*x);
b=(float*)malloc(sizeof(float)*x);
*(a+i)=(float*)malloc(sizeof(float)*y);
printf("请按行的顺序依次输入系数的值(共%d项):",x*y);
printf("请按列的顺序依次输入常数的值(共%d项):",x);
printf("您输入方程组的增广矩阵为:\n");
那么用C++怎样实现呢?在C++中可以通过new和delete运算符动态开辟和释放空间,其中new与C中malloc函数的功能相似,delete与C中free函数的功能相似。用C++实现变长二维数组时可以采用两种方法:双指针方法和使用STL中vector(向量)的方法。
首先介绍一下双指针方法,在这里双指针就是指像指针的指针,比如你可以这样声明一个数组:
而对每一个*p(一共num1个*p)申请一组内存空间:
其中,num1是行数,num2是数组的列数。测试的源程序如下:
cout<<"Please enter the number for row and column:"<<endl;
cin>> num1>> num2;
cout<<setw(6)<<p[j][k]<<':'<<setw(8)<<&p[j][k];
Please enter the number for row and column:
1:004915F0 2:004915F4 3:004915F8 4:004915FC 5:00491600
2:00491180 4:00491184 6:00491188 8:0049118C 10:00491190
3:00491140 6:00491144 9:00491148 12:0049114C 15:00491150
4:00491100 8:00491104 12:00491108 16:0049110C 20:00491110
程序清单array04.cpp可以显示分配的内存空间单元的地址,大家可以看到,由于数组空间是动态分配的,数组行之间的地址空间是不连续的,因为不同行的数组元素的地址空间是用不同的new来分配的。而每一行之中列之间的地址空间是连续的。
那么用vector(向量)怎样实现二维数组呢?以下给出源程序:
cout<<"input value for m,n:";
//注意下面这一行:vector<int后两个">"之间要有空格!否则会被认为是重载">>"。
vector<vector<int>> vecInt(m, vector<int>(n));
cout<<setw(5)<<vecInt[i][j]<<":"<<setw(9)<<&vecInt[i][j];
0: 00491180 0: 00491184 0: 00491188 0: 0049118C
0: 00491140 1: 00491144 2: 00491148 3: 0049114C
0: 00491100 2: 00491104 4: 00491108 6: 0049110C
大家可以看到,这里vector中元素的内存的地址分配也有同双指针实现的二维数组有同样的特点。不过用vector的方法比使用双指针简单地多,分配内存空间时会更安全,数组初始化代码也更简单,所以本人建议使用STL中的vector来实现变长多维数组。以下是一个变长三维数组:)
cout<<"input value for m,n,l:";
cin>>m>>n>>l;
vector<vector<vector<int>>> vecInt(m, vector<vector<int>>(n, vector<int>(l)));
cout<<setw(5)<<vecInt[i][j][k]<<":"<<setw(9)<<&vecInt[i][j][k];
0: 00492FE0 1: 00492FE4 2: 00492FE8 3: 00492FEC
1: 00492FA0 2: 00492FA4 3: 00492FA8 4: 00492FAC
2: 00492F60 3: 00492F64 4: 00492F68 5: 00492F6C
1: 00492EC0 2: 00492EC4 3: 00492EC8 4: 00492ECC
2: 00492E80 3: 00492E84 4: 00492E88 5: 00492E8C
3: 00492E40 4: 00492E44 5: 00492E48 6: 00492E4C
二、如果数组的长度不确定怎么办
C语言中,对于不知道长度的数组怎样输入。。。
1、一维数组程序举例:冒泡法。得到结果进行输出。二维数组常称为矩阵。把二维数组写成行列的排列形式,可以形象的理解二维数组的逻辑结构。
2、C语言中不能定义未确定个数的数组,不过可以用指针来变相的完成你的要求。
3、输入数组需要使用指针获取地址后,就能对得到的数组就行操作了。
可以,但是有可能会报数组下标越界的错误。建议先判断一下长度,再赋值。还有就是,为什么不用ArrayList呢。用add添加,就不会有越界危险了。如果你需要数组的话,toArray()转变成数组就可以了。
长度未知就不能用数组了,用collection类list或者Vector,都可以实现二维数组的功能。
貌似不行,java里面声明数组必须指定长度,不然JVM将来不知道如何分配内存给这个数组,所以JAVA编译器会不会给这样的代码通过编译的。
使用java.util.Vector就可以了,不过此类不能存储基本数据类型,要使用对应的类替代,如int与Integer,float与Float等等。Vector.add(Object)往向量里放数据,get(int)取出指定索引的数据。具体的你可以看看API。
不过,不定参数有两个规定:第一,方法的参数列表中最多只有一个不定长度的参数;第二,就是不定长度的数组的位置必须是最后一个参数。不然不能通过编译。
可以,但是有可能会报数组下标越界的错误。建议先判断一下长度,再赋值。还有就是,为什么不用ArrayList呢。用add添加,就不会有越界危险了。如果你需要数组的话,toArray()转变成数组就可以了。
貌似不行,java里面声明数组必须指定长度,不然JVM将来不知道如何分配内存给这个数组,所以JAVA编译器会不会给这样的代码通过编译的。
长度未知就不能用数组了,用collection类list或者Vector,都可以实现二维数组的功能。
使用java.util.Vector就可以了,不过此类不能存储基本数据类型,要使用对应的类替代,如int与Integer,float与Float等等。Vector.add(Object)往向量里放数据,get(int)取出指定索引的数据。具体的你可以看看API。
你这么写的话,那个n还是一个变量,c语言首先需要编译才能执行,而编译的时候编译器就认为这个n是不确定的,所以他不知道要给你分配多大的存储空间,我建议你可以定义一个指针来做,下面是一个例子。
main(){vectorintn;intx;while(cinx)n.push_back(x);//建议你看一看关于vector的操作,访问vector的方法很简单,可以用数组下标访问,也可以新建一个迭代器。个人认为vector很类似于动态链表。
vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
在C语言中,数组的大小是在定义的时候就需要确定的,不然编译的时候进行分配内存时,会使计算机不知道该分配多少内存单元而报错。然而,可以根据定义一个链表来达到可变的效果。
三、在java类中怎么定义一个不确定行列的二维数组,怎么赋值
在Java中定义一个不确定行列的二维数组,可以使用Vector对象来实现。通过嵌套Vector可以创建一个动态的二维结构,具体实例如下:
首先定义一个二维可变数组的Vector对象:
Vector<Vector> vector= new Vector<Vector>();
接着,创建第一个一维Vector对象v1:
向v1中添加三个不同类型的对象:
向v2中添加五个不同类型的对象:
使用循环For语句可以任意添加多个对象到二维数组中:
//vector.remove(0);移除可以使用remove移动添对象里面的对象
访问并打印二维数组中的特定元素:
System.out.println(vector.get(1).get(3));
v.remove(3);//v2移除//第4个元系
再次添加改动后的v1到二维数组中:
System.out.println(vector.get(1).get(3));