用new/delete动态创建数组| 一维/二维/三维

我在看一些C++方面的教材时,一些书上这样写到:

用New操作可以创建多维数组,new 类型名 T[下标表达式1][下表表达式2]...。数组的个数是除最左边一位外各位下表表达式的乘积。

如:float (*fp)[25][10];

fp=new float[10][25][10];//用new操作产生了一个指向25*10的二维数组的指针;

而,这么写:float *fp=new float[10][25][10]; 是错误的,原因是什么呢?下面试分析之:

实际上,不难发现,指针总是比它指向的数组对象少一维。

****一维数组如;float *fp=new float[10];指针fp开始指向的是一维数组的首地址,指针fp是一个

指向float型数据的指针。

****二维数组如:float (*fp)[25]=new float[10][25],指针fp开始指向的是二维数组的首地址,指针fp是一个指向有25个元素的的float类型的一维数组,而fp

有10个偏移,每个偏移都指向一个有25个元素的float类型的一维数组,所以实际上相当于一个二维数组。如果在深入一步进行理解,就可以写出如下等价代码:

float **fp=new float* [10] ;

for (int i=0;i<10;i++)
      
       fp[i]=new float[25] ;

****三维数组如:float (*fp)[25][10]=new float[10][25][10];指针fp是一个指向25*10的二维float型的数组的指针,指针的偏移是10,不过每个偏移指向的是一个二维
数组。

******用一段程序进行总结:

 1 #include<iostream>
 2 using namespace std;
 3 /*
 4  *--- 用new创建动态的多维数组
 5  *--- 深入理解指针的功能和作用
 6  */
 7 int main()
 8 {
 9     float *fp=new float[5];
10     float (*fp1)[5]=new float[4][5];
11     float (*fp2)[4][5]=new float[2][4][5];
12     cout<<"---------The division 1-----------"<<endl;
13     for(int i=0;i<5;i++)
14     {
15         fp[i]=i;
16     }
17     for(int j=0;j<5;j++)
18     {
19         cout<<fp[j]<<" ";
20     }
21     cout<<endl<<endl;
22     cout<<"--------The division 2-----------"<<endl;
23     for(int i=0;i<4;i++)
24     {
25         for(int j=0;j<5;j++)
26         {
27             *(*(fp1+i)+j)=(float)(i*4+j*5);
28         }
29     }
30     for(int i=0;i<4;i++)
31     {
32         for(int j=0;j<5;j++)
33         {
34             cout<<fp1[i][j]<<" ";
35         }
36         cout<<endl;
37     }
38     cout<<endl;
39     cout<<"---------The Division 3--------------"<<endl;
40     for(int i=0;i<2;i++)
41     {
42         for(int j=0;j<4;j++)
43         {
44             for(int k=0;k<5;k++)
45             {
46                 *(*(*(fp2+i)+j)+k)=(float)(i*2+j*4+k*5);
47             }
48         }
49     }
50 
51     for(int i=0;i<2;i++)
52     {
53         for(int j=0;j<4;j++)
54         {
55             for(int k=0;k<5;k++)
56             {
57                 cout<<fp2[i][j][k]<<" ";
58             }
59             cout<<endl;
60         }
61         cout<<endl;
62     }
63     cout<<endl;
64     /*----释放动态内存空间,防止内存泄漏----*/
65     delete [] fp;
66     delete [] fp1;
67     delete [] fp2;
68     return 0;
69 }

代码运行结果:

原文地址:https://www.cnblogs.com/sjlove/p/3082586.html