我在看一些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 }
代码运行结果: