C++动态数组Word下载.docx
- 文档编号:21040297
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:6
- 大小:18.67KB
C++动态数组Word下载.docx
《C++动态数组Word下载.docx》由会员分享,可在线阅读,更多相关《C++动态数组Word下载.docx(6页珍藏版)》请在冰豆网上搜索。
这一句,你不能这样做:
p[len];
C++编译器会报错说len的大小不能确定,因为用这种形式声明数组,数组的大小需要在编译时确定。
而且这样也不行:
p[]=new
编译器会说不能把int*型转化为int[]型,因为用new开辟了一段内存空间后会返回这段内存的首地址,所以要把这个地址赋给一个指针,所以要用int
array01.cpp实现了一个变长的一维数组,但是要养成一个好习惯,就是注意要注销指针p,使程序释放用new开辟的内存空间。
当然使用C++标准模版库(STL)中的vector(向量)也可以实现变长数组:
array02.cpp
vector>
vector<
int>
array(len);
//声明变长数组
for(int
i=0;
i<
i++)
array[i]=i;
cout<
<
array[i]<
"
\t"
;
这里的变长数组让我联想到了java的java.util包中的vector和C#中的ArrayList,它们也可以在各自的语言中实现变长数组。
不过C++中的vector不能像C#一样有托管的垃圾回收机制回收被占用的内存空间,但是你可以在使用完vector后调用~vector()析构函数释放内存。
2.变长n维数组
变长的n维数组实现起来有些麻烦,但是在工程与软件设计应用中常使用的是二维数组,所以在这里着重介绍变长的二维数组,变长的n维数组可以按照类似的方法实现。
首先看一个经典的用C实现变长二维数组的例子:
array03.c
#include
<
stdio.h>
malloc.h>
void
x,y,i,j;
float
**a,*b;
printf("
请输入你所求解的线性方程组的行数x:
x="
);
scanf("
%d"
&
x);
请输入你所求解的线性方程组的列数y:
y="
y);
a=(float
**)malloc(sizeof(float
*)
*x);
b=(float
*)malloc(sizeof(float)
for(i=0;
x;
*(a+i)=(float
*y);
/*读入数据*/
请按行的顺序依次输入系数的值(共%d项):
x*y);
=x-1;
for(j=0;
j<
=y-1;
j++)
%f"
a[i][j]);
请按列的顺序依次输入常数的值(共%d项):
x);
b[j]);
您输入方程组的增广矩阵为:
\n"
%.5f
"
a[i][j]);
b[i]);
free(b);
free
(*(a+i));
那么用C++怎样实现呢?
在C++中可以通过new和delete运算符动态开辟和释放空间,其中new与C中malloc函数的功能相似,delete与C中free函数的功能相似。
用C++实现变长二维数组时可以采用两种方法:
双指针方法和使用STL中vector(向量)的方法。
首先介绍一下双指针方法,在这里双指针就是指像指针的指针,比如你可以这样声明一个数组:
**p
=
new
int*[num1];
而对每一个*p(一共num1个*p)申请一组内存空间:
i<
num1;
++i)
p[i]
int[num2];
其中,num1是行数,num2是数组的列数。
测试的源程序如下:
array04.cpp
iomanip>
num1,//行数
num2;
//列数
Please
enter
the
number
for
row
and
column:
endl;
cin
>
num1
//为二维数组开辟空间
j=0;
k=0;
k<
num2;
k++)
p[j][k]=(j+1)*(k+1);
setw(6)<
p[j][k]<
'
:
setw(8)<
&
p[j][k];
//释放二维数组占用的空间
m=0;
m<
m++)
p[m];
以下是运行结果:
Please
4
5
1:
004915F0
2:
004915F4
3:
004915F8
4:
004915FC
5:
00491600
00491180
00491184
6:
00491188
8:
0049118C
10:
00491190
00491140
00491144
9:
00491148
12:
0049114C
15:
00491150
00491100
00491104
00491108
16:
0049110C
20:
00491110
Press
any
key
to
continue
程序清单array04.cpp可以显示分配的内存空间单元的地址,大家可以看到,由于数组空间是动态分配的,数组行之间的地址空间是不连续的,因为不同行的数组元素的地址空间是用不同的new来分配的。
而每一行之中列之间的地址空间是连续的。
那么用vector(向量)怎样实现二维数组呢?
以下给出源程序:
array05.cpp
i,
j,
m,
//行数
n;
//列数
cout
input
value
m,n:
m>
n;
//注意下面这一行:
vector<
int后两个"
之间要有空格!
否则会被认为是重载"
。
vecInt(m,
(n));
(i
i
m;
i++)
(j
j
j++)
vecInt[i][j]
i*j;
setw(5)<
vecInt[i][j]<
setw(9)<
vecInt[i][j];
input
3
0:
00491180
00491184
00491188
0049118C
00491140
00491144
00491148
0049114C
00491100
00491104
00491108
0049110C
大家可以看到,这里vector中元素的内存的地址分配也有同双指针实现的二维数组有同样的特点。
不过用vector的方法比使用双指针简单地多,分配内存空间时会更安全,数组初始化代码也更简单,所以本人建议使用STL中的vector来实现变长多维数组。
以下是一个变长三维数组:
)
array06.cpp
k,
//一维坐标
n,
//二维坐标
l;
//三维坐标
m,n,l:
n>
l;
(n,
(l)));
for(k
k
k++)
vecInt[i][j][k]
i+j+k;
k<
vecInt[i][j][k]<
vecInt[i][j][k];
运行结果:
2
3
00492FE0
00492FE4
00492FE8
00492FEC
00492FA0
00492FA4
00492FA8
00492FAC
00492F60
00492F64
00492F68
00492F6C
00492EC0
00492EC4
00492EC8
00492ECC
00492E80
00492E84
00492E88
00492E8C
00492E40
00492E44
00492E48
00492E4C
窗体底端
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 动态 数组