一、C++的new/delete(推荐)

1、动态开辟一维数组

#include<iostream>
#include<stdio.h>using namespace std;int main() {int m = 3;int *arr = new int[m]; // m为大小// 控制台输入for (int i = 0; i < m; i++) {cin >> arr[i];}// 打印输出for (int i = 0; i < m; i++) {printf("打印输出:%d\n", arr[i]);}//空间释放:delete[] arr;arr = NULL;  //可在释放空间后将arr置为NULL,以防继续访问已被释放的空间。这句可以不要。return 0;
}

打印结果:

3
5
6
打印输出:3
打印输出:5
打印输出:6Process finished with exit code 0

2、动态开辟二维数组

#include<iostream>using namespace std;int main() {int n = 2, m = 3;int **arr = new int *[n]; // 创建了一个包含2个整型指针的数组, 即确立了数组的行数// 为每一个指针指向的位置开辟3个整型空间, 即确立了数组的列数for (int i = 0; i < n; i++) {arr[i] = new int[m];}// 控制台输入for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> arr[i][j];}}// 打印输出for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cout << arr[i][j] << ' ';}cout << endl;}//二维空间释放:for (int i = 0; i < n; i++) {delete[] arr[i];}delete[] arr;arr = NULL;  //可在释放空间后将arr置为NULL,以防继续访问已被释放的空间。这句可以不要。return 0;
}

3、动态开辟数组、释放空间

3.1 动态开辟数组

//一维数组动态申请,c数组大小为: n
int *c=new int[n];//二维数组动态申请,b数组大小为: n*p
int **b=new int*[n];
for(int i=0;i<n;i++){b[i]=new int[p];
}//三维数组动态申请, a数组大小为: m*n*p:
int ***a = new int **[m];
for (int i = 0; i < m; i++) {a[i] = new int *[n];for (int j = 0; j < n; j++) {a[i][j] = new int[p];}
}

3.2 释放空间

当不再需要一个动态分配的多维数组时,可按以下步骤释放它所占用的空间。

  • 首先释放在for循环中为每一行所分配的空间;
  • 然后释放为行指针分配的空间;
//一维空间释放:delete[] c;c = NULL;  //可在释放空间后将c置为NULL,以防继续访问已被释放的空间。这句可以不要。//二维空间释放:for (int i = 0; i < n; i++) {delete[] b[i];}delete[] b;b = NULL;  //可在释放空间后将b置为NULL,以防继续访问已被释放的空间。这句可以不要。//三维空间释放:for (int i = 0; i < m; i++) {for (j = 0; j < n; j++) {delete[] a[i][j];}delete[] a[i];}delete[] a;a = NULL;   //可在释放空间后将a置为NULL,以防继续访问已被释放的空间。这句可以不要。

3.3 案例

#include<iostream>
#include<stdio.h>using namespace std;int main() {int *a;int *b;char *c;a = new int;//分配一个整形空间,若成功则a指向该空间,否则a为nullb = new int(10);//分配一个整形空间且给这个整形空间附上初值10c = new char[10];//分配一个字符数组(字符串)空间,即c为字符串指针printf("a = %X, *a = %d\n", a, *a);printf("b = %X, *b = %d\n", b, *b);printf("c = %X, *c = %d\n", c, *c);delete a;//释放a所指的整形空间delete[]c;//释放c所指向的字符串空间,若不加【】则只是释放首地址的空间return 0;
}

打印结果:

a = 99CA12A0, *a = -1714782304
b = 99CA7FA0, *b = 10
c = 99CA15E0, *c = -112Process finished with exit code 0




二、C语言:malloc() & free()

C语言 中malloc()函数的标准形式

void* malloc (size_t size);
//size_t size 为所需要开辟的内存空间大小,单位为字节,常使用sizeof()**关键字**获得

C++ 中free()函数的标准形式

void free (void* ptr);
//与malloc(),calloc(),realloc()等函数搭配使用,参数为指向上述三函数使用时申请空间的指针

注意引用头文件stdlib.h

1、动态开辟一维数组

1.1 常见使用情况

因为数组中必须为常量表达式,如果不是,则此时无法成功创建数组

#include<stdio.h>int main() {int input = 1;scanf("%d", &input);int arr[input] = {0}; //因为数组中必须为常量表达式, 所以此时无法成功创建数组return 0;
}

这时便可以使用动态开辟的方法解决该问题。

1.2 动态创建数组

#include<stdio.h>
#include <stdlib.h>int main() {int input = 0;scanf("%d", &input);int size_all = sizeof(int) * input;int *p = (int *) malloc(size_all); //在内存的动态存储区(堆区)中分配一块长度为size_all字节的连续区域,用来存放类型说明符指定的类型【注意对malloc()函数的返回值进行强制类型转换】for (int i = 0; i < input; i++) {scanf("%d", &p[i]);}for (int i = 0; i < input; i++) {printf("\n%d", p[i]);}free(p); //牢记malloc()等函数与free()函数搭配使用,有开辟就有释放p = NULL;return 0;
}

补充说明

  1. 动态开辟的空间位于堆区,由程序员进行申请和释放,但如果程序结束前,我们并没有使用free()函数释放,系统会自动进行释放;
  2. 使用free()函数释放p所指向的空间后,我们仍然要讲p赋值为NULL!
  3. 这是因为虽然p所指向的空间已被释放,但p指针仍然存在,为了防止接下来无意间引用了P指针造成错误,我们必须将其设为NULL。

2、动态开辟二维数组

2.1 使用创建一维数组的思想进行动态开辟

#include<stdio.h>
#include<stdlib.h>#define Row 2
#define Column 3int main() {int *p = (int *) malloc(sizeof(int) * Row * Column);for (int i = 0; i < Row; i++) {for (int j = 0; j < Column; j++) {scanf("%d", &p[i * Row + j]); //注意下标访问符中的参数形式}}for (int i = 0; i < Row; i++) {for (int j = 0; j < Column; j++) {printf("\n所申请的地址:%d", &p[i * Row + j]); //注意下标访问符中的参数形式}}for (int i = 0; i < Row; i++) {for (int j = 0; j < Column; j++) {printf("\n输出:%d", p[i * Row + j]); //注意下标访问符中的参数形式}}free(p);p = NULL;return 0;
}

打印结果:

6
3
9
4
1
8所申请的地址:735804256
所申请的地址:735804260
所申请的地址:735804264
所申请的地址:735804264
所申请的地址:735804268
所申请的地址:735804272
输出:6
输出:3
输出:4
输出:4
输出:1
输出:8
Process finished with exit code 0

特点

  1. 所申请空间连续;
  2. 释放空间简单;
  3. 思路最为简单,便于想我一样的小白理解;

2.2 使用指针数组进行动态开辟

#include<stdio.h>
#include<stdlib.h>#define Row 2
#define Column 3int main() {int i = 0, j = 0;int **p = (int **) malloc(sizeof(int *) * Row);//通俗的理解为创建了一个包含2个整型指针的数组, 即确立了数组的行数for (i = 0; i < Row; i++) {p[i] = (int *) malloc(sizeof(int) * Column);}//为每一个指针指向的位置开辟3个整型空间, 即确立了数组的列数for (i = 0; i < Row; i++) {for (j = 0; j < Column; j++) {scanf("%d", &p[i][j]);}}// 打印指针地址for (i = 0; i < Row; i++) {for (j = 0; j < Column; j++) {printf("\n所申请的地址:%d", &p[i][j]);}}// 打印for (i = 0; i < Row; i++) {for (j = 0; j < Column; j++) {printf("\n输出:%d", p[i][j]);}}//循环释放指向每一行数据的指针, 形式上类似于取二维数组的每一行的首地址时,arr【Row】for (i = 0; i < Row; i++) {free(p[i]);p[i] = NULL;}free(p); //释放指向储存有2个行指针的数组的指针p = NULL;return 0;
}

打印结果:

9
6
5
0
2
1所申请的地址:216431488
所申请的地址:216431492
所申请的地址:216431496
所申请的地址:216431520
所申请的地址:216431524
所申请的地址:216431528
输出:9
输出:6
输出:5
输出:0
输出:2
输出:1
Process finished with exit code 0

特点

  1. 每一行元素所占空间连续,但行与行间并不连续;
  2. 释放步骤繁琐,易造成漏释放。

2.3 使用数组指针进行动态开辟

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<stdlib.h>#define Row 2
#define Column 3int main() {int i = 0, j = 0;int(*p)[Column] = (int (*)[Column]) malloc(sizeof(int) * Row * Column); //一次性开辟所需的全部空间// 控制台输入元素for (i = 0; i < Row; i++) {for (j = 0; j < Column; j++) {scanf("%d", &p[i][j]);}}// 打印指针地址for (i = 0; i < Row; i++) {for (j = 0; j < Column; j++) {printf("\n所申请的地址:%d", &p[i][j]);}}// 打印for (i = 0; i < Row; i++) {for (j = 0; j < Column; j++) {printf("\n输出:%d", p[i][j]);}}free(p);p = NULL;return 0;
}

打印结果:

5
3
8
9
1
3所申请的地址:1626110816
所申请的地址:1626110820
所申请的地址:1626110824
所申请的地址:1626110828
所申请的地址:1626110832
所申请的地址:1626110836
输出:5
输出:3
输出:8
输出:9
输出:1
输出:3
Process finished with exit code 0

特点

  1. 所申请的空间全部连续;
  2. 释放空间简便。



参考资料:
c语言动态开辟数组(一维与二维)
动态申请数组(c)
关于c++的动态申请(持续更新)
C++基础:动态申请二维数组

C/C++动态开辟数组【C++:new/delete(推荐):int *arr = new int[m];】【C++:vector】【C:malloc() free()】相关推荐

  1. C语言动态开辟数组(一维与二维)【malloc() free()】

    了解并熟悉malloc(),calloc(),realloc(),free()等动态开辟函数. 重点使用malloc()与free()进行数组的动态开辟! 一.认识malloc().free() C+ ...

  2. c语言动态开辟数组(一维与二维)

    文章目录 前言 一.认识malloc()与free() 二.动态开辟一维数组 1.常见使用情况 2.动态创建数组 补充说明 三.动态开辟二维数组 1.使用创建一维数组的思想进行动态开辟 所申请空间的连 ...

  3. C++动态开辟数组空间

    一维空间 int* a=new int[row],若使用memset函数初始化的话不会起到该有的作用,还是使用for来初始化; 二维空间: v=new int* [n+2];//行开辟;for(int ...

  4. int * arr 与 int arr[] 这两种定义数组方式的疑问

    10.26更新!=============================================================== 看了c爹写的书 感觉搞清楚了! int * arr 实际 ...

  5. C++ 动态开辟二维数组的的方法

    近日写到一个程序,用到了要动态开辟二维数组,一想,自己就会两种.一者:用new在堆上开辟:二者:用vector开辟.技巧没有多少,但是确实是折腾了我半天!首先,大家去网上搜一下,动态开辟二维数组的文章 ...

  6. C语言动态开辟多维数组空间

    C语言中的数组空间动态开辟 在C语言中,必不可少的需要使用到数组,通常为了动态的开辟数组空间,可以使用malloc函数,在C++中可以使用new关键字进行空间的动态开辟与回收,动态开辟空间的方法更加灵 ...

  7. C++总结笔记(十)——堆区内存开辟数组和二级指针

    文章目录 一.堆区开辟数组 1. 数组指针与指针数组的区别 2. 1维数组 3. 2维数组 二.二级指针 一.堆区开辟数组 1. 数组指针与指针数组的区别 数组指针是指指向数组的指针,它的本体是一个指 ...

  8. Java 数组定义格式-数组动态初始化-数组元素的访问-数组静态初始化-数组的遍历-数组获取最大值

    数组定义格式: 1.数组概述 在一个班级中,有非常多学生需要存储每位学生的考试成绩. 比如 a=98; b=97; c=96; d=88; -- 1)数组概述:一次性声明大量的用于存储数据的变量; 这 ...

  9. int arr 13 java,java学习13 - 数组的定义、操作、异常、二维数组

    续java学习12: 1.数组,引用类型变量,保存数据实际是保存的数组的首地址 2.定义数组容器三要素,数据类型,大小(长度),数组名 3.数组的定义公式一:数据类型[] 数组名 = new 数据类型 ...

最新文章

  1. mongodb android,如何在Android中连接到MongoDB数据库?
  2. SVN删除文件及其恢复问题详解
  3. java-jpa-criteriaBuilder使用入门
  4. 手机qq2008触屏版_[进行中]数码手机周年庆
  5. keras训练完以后怎么预测_还在使用“龟速”的单显卡训练模型?动动手,让TPU节省你的时间...
  6. Spring Cloud 5分钟搭建教程(附上一个分布式日志系统项目作为参考) - 推荐
  7. go 语言链接服务器上的mysql数据库
  8. oracle orapath,SQLNET.ORA中的NAMES.DIRECTORY_PATH设置
  9. WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
  10. 电赛日志——2016年TI杯大学生电子设计竞赛 A题:降压型直流开关稳压电源
  11. 网络规划设计师水平考试备考资料(4.网络规划与设计)
  12. Django 上传图片存储到数据库中
  13. 函数部分编程大作业(持续更新)
  14. 微型计算机从外观上看可以分为,冯.诺依曼计算机 1.3 计算机系统的组成 计算机系统概述 EDVAC的3个特点:...
  15. leetcode695岛屿的最大面积
  16. 酷派 手机 stop charging
  17. 如何提升广告ROI?转化跟踪了解一下
  18. 关闭烦人的wps广告
  19. Windows7系统优化,优化达到30多项,速度大幅提升,
  20. 【UI】产品设计之什么是色彩情绪

热门文章

  1. 前端基础----html初识、常用标签
  2. cms32L051 掉电深度睡眠的唤醒
  3. JAVA中简单图形界面的创建
  4. 将父类实体类转变子类实体类
  5. 【大数据】Hadoop生态系统及其组件
  6. 中国与美国光纤网络连接详解
  7. 科技云报道:中国电子云曹心驰:做成云计算“国家队”该有的样子
  8. 虚幻四Gameplay Ability System入门学习合集
  9. Java面向对象之创建和使用对象——定义学生/教师类并输出相关信息
  10. Java对象的生命周期与垃圾回收以及四种引用