zoukankan      html  css  js  c++  java
  • 用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 }

    代码运行结果:

  • 相关阅读:
    降维-基于RDD的API
    GraphX编程指南
    GPU自动调度卷积层
    TVM部署预定义模型
    做个普通人,就挺好的
    Spring 的 @Primary 注解
    微信公众平台消息接口开发(30)大众点评商户信息团购及优惠券查询
    大众点评API获取某坐标周边酒店信息
    Sharding-jdbc 读写分离(三)- springboot+mybatis+Hikari
    Sharding-jdbc 分库分表专题内容(二)springboot+mybatis+Hikari
  • 原文地址:https://www.cnblogs.com/sjlove/p/3082586.html
Copyright © 2011-2022 走看看