c/c++之动态数组(含二维)的浅述

8 篇文章 0 订阅

目录

C语言动态数组的两种方法:

①C99 变长数组实现动态数组,老版本不行

②calloc、realloc、malloc创建动态数组

 C++动态数组的方法: ①new②vector等容器③allocate方法

①new:

②vector:

③allocate方法:


 

C语言动态数组的两种方法:

①C99 变长数组实现动态数组,老版本不行

    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<n;i++){
        printf("%d\t",a[i]);
    }

②calloc、realloc、malloc创建动态数组

calloc:     (类型说明符*) calloc(n,size);

功能:在内存的动态存储区中分配n块长度size字节的连续区域

realloc:   (类型说明符*) realloc(void *p,int size);

功能:重新分配堆上的void指针p(可以将void*理解为任意类型的指针变量类型)所指的空间,使其长度为size个字节,同时会复制原有内容到新分配的堆上存储空间。

molloc,calloc两个函数的区别:

        在于molloc申请的是一块size空间,而calloc可以指定申请的块数,即n块size空间

    int *p=NULL,*new_p=NULL,size,new_size;
    scanf("%d",&size);
    p=(int*)calloc(size,sizeof(int));
    if(NULL==p){
        perror("calloc");
        exit(1);
    }
    for(int i=0;i<size;i++){
        scanf("%d",&p[i]);
    }
    for(int i=0;i<size;i++){
        printf("%d\t",p[i]);
    }
    printf("\n");
    new_p=(int*)realloc(p,2*size*sizeof(int));//扩大两倍
    // new_p=(int*)realloc(p,2);
    if(NULL==new_p){
        perror("realloc");
        exit(1);
    }
    //主食到下面3行,便可测试是否自动初始化新开辟的空间
    // for(int i=0;i<2*size;i++){
    //     scanf("%d",&new_p[i]);
    // }
    for(int i=0;i<2*size;i++){
        printf("%d\t",new_p[i]);
    }
    printf("\n");
    free(p);
    //不用free掉新开辟的空间,因为新开辟的空间是围绕着旧的空间开辟的
    //实质就是在p的空间后面再开辟一倍的大小
    // free(new_p);//如果释放会出现double free问题

C语言学习笔记:动态数组_浅亡的博客-CSDN博客_动态数组

 C++动态数组的方法: ①new②vector等容器③allocate方法

①new:

    //动态数组 new
    int *p,*q;
    p = new int[5];//int[5]表示一个有5个元素的指针数组s
    q = new int(8);//表示分配一个int空间并初始化为8

C++ 动态数组(new)_NGC_2070的博客-CSDN博客_c++ 动态数组

②vector:

值得一提的事:我目前还没有找到或者自己做出可以在二维数组中动态分配插入数据的代码:即两个for循环和cin>>a[i][j],用push_back();也不行

#if 0
    vector<vector<int>  > v{{1,2,3},{2,1,3},{3,2,1}};
#endif
#if 1
    //动态二维数组
    vector<vector<int>  >v;
    //定义二维数组的行为3
    v.resize(3);
    for(int i=0;i<3;i++){
        //定义二维数组的列的空间大小为3
        v[i].resize(3);
    }
#endif
#if 0
    vector<vector<int>  >v(9);// m表示二维数组初始化大小 v.size(),并不是初始值
    //给二维数组赋值,利用push.back()
    for(int i=0;i<3;i++){
        v[i].push_back(1);
        v[i].push_back(4);
        v[i].push_back(9);
    }
#endif
#if 1
    //双重for循环直接遍历
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++)
            cout<<v[j].at(j)<<" ";
        cout<<endl;
    }
#endif
#if 0
    vector<vector<int> > v = {{1,2}, {3,4}};
    for (const auto& inner : v) {
        for (const auto& item : inner) {
            cout << item << " ";
        }
        cout<<endl;
    }
    cout << endl;
#endif

C++的二维vector和C的二维数组学习 - 掘金 (juejin.cn)

③allocate方法:

T*allocate(size_t n);分配足够的存储空间来存储T的n个实例,并返回指向它的指针

第10篇:C++ 堆内存管理器-allocator - 知乎 (zhihu.com)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值