• 分配一维动态数组or 二维动态数组的方法以及学习 new 方法or vector


    先来个开胃菜

     1 // 使用new动态分配存储空间
     2 
     3 #include<iostream>
     4 using std::cout;
     5 
     6 int main()
     7 {
     8 // 第1种方式
     9 int *a=new int;
    10 *a=1;
    11 cout<<"使用第一种方式进行动态分配存储空间的结果为:
    "
    12 <<"*a= "<<*a<<std::endl;
    13 delete a; // 释放动态存储空间
    14 // 第2种方式
    15 int *b=new int(2);
    16 cout<<"使用第一种方式进行动态分配存储空间的结果为:
    "
    17 <<"*b= "<<*b<<std::endl;
    18 delete b; // 释放动态存储空间
    19 // 第3种方式
    20 int *c;
    21 c=new int(3);
    22 cout<<"使用第一种方式进行动态分配存储空间的结果为:
    "
    23 <<"*c= "<<*c<<std::endl;
    24 delete c; // 释放动态存储空间
    25 
    26 // 动态创建数组
    27 float *d=new float [3];//区别 1 new 类型()和 2 new 类型[数量] 
                    //一个是通过构造函数创建一个对象
                    // 一个是创建动态数组但是没有初始化 如果是内置类型会有默认的构造函数
                    //大多数需要再次分别构造初始化
    28 d[0]=3; 29 d[1]=6; 30 d[2]=8; 31 cout<<"d[0]= "<<d[0]<<std::endl; 32 d=d+1; //数组名和指针之间的根本区别 33 cout<<"d[0]= "<<d[0]<<std::endl; 34 d=d-1; 35 cout<<"d[0]= "<<d[0]<<std::endl; 36 delete [] d; // 释放动态存储空间 37 return 0; 38 }

    使用第一种方式进行动态分配存储空间的结果为:
    *a= 1
    使用第一种方式进行动态分配存储空间的结果为:
    *b= 2
    使用第一种方式进行动态分配存储空间的结果为:
    *c= 3
    d[0]= 3
    d[0]= 6
    d[0]= 3

     以上为执行结果  自己想啊!!!!

    new一个指针数组 
    对于类A的指针,可以这样写,不仅仅new,还调用了A的构造函数。

    A *P = new A();

    但是对于new 一个指针数组,我们可以这么写:

    A **P = new A *[10];//这里是创建了10个A类型的指针 返回的是指针的地址 切记没有初始化后面没有加上()

    但是我们还没有进行构造呢?//这里不能忘记了构造啊!!!!

    for(int i=0; i<10; i++)
    {
        p[i] = new A();
    }

    还有一个问题就是释放:

    for(int i=0; i<10; i++)
    {
        delete p[i];//为什么不是delete[]p[i]
    }
    delete [] p;
    //这一步很关键啊 不同的delete 不同的意图啊 自己想吧!

    —————————————————————————————————————————

    !!!!!!!!!!!!!!!!!重点

    创建动态二维数组

    1 pointer to pointer(二维指针

     int **dynamicArray = 0;

    dynamicArray = new int *[ROWS] ;
    
    for( int i = 0 ; i < ROWS ; i++ )
    {
        dynamicArray[i] = new int[COLUMNS];   //显然是多少列。切记没有初始化没有加上()!!!!!!是随机值哦!!
      //这里注意和上面的分配指针数组的区别啊!是一个[]符号啊不是()符号!    //这里两者[] ()区别是:一个是分配多少个对象至于初始化看是不是内置类型和加不加上()
      //一个是构造一个对象
                }
    for( int i = 0 ; i < ROWS ; i++ ) { delete [] dynamicArray[i] ;//这里也是同样要区别与指针数组的释放啊!前面加上了一个[]!!知道什么意思吧 } delete [] dynamicArray ;

    //加个餐!!!!!!!!!!!!
    下面描述正确的是
    
    int *p1 = new int[10]; 
    int *p2 = new int[10]();
    
    p1和p2申请的空间里面的值都是随机值
    p1和p2申请的空间里的值都已经初始化
    p1申请的空间里的值是随机值,p2申请的空间里的值已经初始化(对)
    p1申请的空间里的值已经初始化,p2申请的空间里的值是随机值
    解释
    在C++primer(第5版)中关于new的讨论有:
    1、new当个对象
    new在自由空间分配内存,但其无法为其分配的对象命名,因次是无名的,分配之后返回一个指向该对象的指针。
    1
    int *pi = new int; // pi指向一个动态分配的,未初始化的无名对象
    此new表达式在自由空间构造一个int类型对象,并返回指向该对象的指针。
    
    
    默认情况下,动态分配的对象是默认初始化的,这意味着内置类型或组合类型的对象的值是无定义的,而类类型对象将用默认构造函数进行初始化。
    
    
    2new(多个对象)数组
    new分配的对象,不管单个对象还是多个对象的分配,都是默认初始化。但可以对数组进行值初始化,方法就是:在大小之后添加一对空括号。
    
    int *pia = new int[10];    // 10个未初始化int
    int *pia2 = new int[10](); // 10个值初始化为0的int
    
    int *p2 = new int[10]();申请了空间,而且进行了初始化int *p1 = new int[10];只申请空间,没有进行初始化原因:对于一些结构体,我们可以看到()往往表示构造函数,int是基本类型算初始化吧理由:你可以测试输出两种的值你会发现p1的值未知,而p2清零了
    
    new运算符只是申请分配一个内存空间而已,因为不知道为其分配对象的名称,所以分配之后返回的只是一个指向该对象的指针,并没有初始化,加上一个()后,就相当于调用了默认构造函数,会默认初始化,用0来初始化

    //还是vector比较好理解啊!也是比较好使用!!!  二维动态数组而且是分配在栈空间的动态数组

    2 vector of vector

    #include <vector>
    using namespace std;
    
    #define ROWS  4
    #define COLUMNS  4
    vector<vector<int> > dynamicArray(ROWS, vector<int>(COLUMNS));
    
    for(int i = 0;i < dynamicArray.size();++i)//有错  int i 类型 不对  与size()函数不匹配啊
    {
          for(int j = 0;j < dynamicArray[i].size();++j)//有错
          {
               dynamicArray[i][j] = i*j;
          }
    }
    
    for(int i = 0;i < dynamicArray.size();++i)//这里有错误 自己找 同上
    {           
         for(int j = 0;j < dynamicArray[i].size();++j)//有错
         {
              cout << dynamicArray[i][j] << endl;
         }
    }
  • 相关阅读:
    【转】c#基础系列1---深入理解值类型和引用类型
    【转】Aspnet Core为什么支持跨平台
    [翻译svg教程]svg学习系列 开篇
    使用docker 解决一个小问题,你也可能用的到
    增加软链接
    漫长的表白
    被社会抽了一巴掌
    杂乱五章的2015年终总结
    [资源分享]yslow 与firebug 修复版本Firefox35【绿色版本下载】
    Web前端性能测试-性能测试知多少---深入分析前端站点的性能
  • 原文地址:https://www.cnblogs.com/zhangkele/p/7632041.html
Copyright © 2020-2023  润新知