当前位置: 首页 > news >正文

c++动态数组new和delete

文章目录

  • 动态数组的使用大全
    • 1. **基本创建和初始化**
    • 2. ==**动态调整大小**==
    • 3. **动态数组的使用与标准库 `std::vector`**
    • 4. **动态数组作为函数参数**
      • 输出
    • 5. **使用动态数组存储用户输入**

动态数组的使用大全

1. 基本创建和初始化

示例

#include <iostream>int main() {int size = 5;// 创建并初始化动态数组int* arr = new int[size];for (int i = 0; i < size; ++i) {arr[i] = i * 10;}// 打印动态数组for (int i = 0; i < size; ++i) {std::cout << arr[i] << " ";}std::cout << std::endl;// 释放动态数组的内存delete[] arr;return 0;
}

说明:创建了一个大小为 5 的动态数组,并将其初始化为 0, 10, 20, 30, 40。使用完成后释放内存。

2. 动态调整大小

动态调整数组大小,通常需要创建一个新的数组,拷贝原来的内容,然后删除旧的数组。

#include <iostream>
#include <cstring> // for std::memcpyint main() {int size = 5;int newSize = 10;// 创建并初始化动态数组int* arr = new int[size];for (int i = 0; i < size; ++i) {arr[i] = i * 10;}// 创建一个更大的数组int* newArr = new int[newSize];// 拷贝旧数组的内容到新数组std::memcpy(newArr, arr, size * sizeof(int));// 初始化新数组的新增部分for (int i = size; i < newSize; ++i) {newArr[i] = i * 10;}// 打印新数组for (int i = 0; i < newSize; ++i) {std::cout << newArr[i] << " ";}std::cout << std::endl;// 释放内存delete[] arr;delete[] newArr;return 0;
}

步骤演示

  1. 创建并初始化原始动态数组

    int* arr = new int[size];
    for (int i = 0; i < size; ++i) {arr[i] = i * 10;
    }
    

    解释: 创建一个大小为 5 的动态数组 arr,并用 0, 10, 20, 30, 40 初始化。这个数组的内容如下:

    arr = {0, 10, 20, 30, 40}
    
  2. 创建一个更大的数组

    int* newArr = new int[newSize];
    

    解释: 创建一个新的动态数组 newArr,其大小为 10,此时 newArr 的内容未初始化,包含垃圾值。

  3. 拷贝旧数组的内容到新数组

    std::memcpy(newArr, arr, size * sizeof(int));
    

    解释: 使用 std::memcpyarr 中的 5 个整数拷贝到 newArr 的开头。此时 newArr 的前 5 个元素与 arr 相同,其余部分仍然包含垃圾值。newArr 的状态如下:

    newArr = {0, 10, 20, 30, 40, ???, ???, ???, ???, ???}
    
  4. 初始化新数组的新增部分

    for (int i = size; i < newSize; ++i) {newArr[i] = i * 10;
    }
    

    解释:newArr 的新增部分填充数据。索引 59 的元素被初始化为 50, 60, 70, 80, 90newArr 的最终状态如下:

    newArr = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90}
    
  5. 打印新数组

    for (int i = 0; i < newSize; ++i) {std::cout << newArr[i] << " ";
    }
    std::cout << std::endl;
    

    输出: 打印 newArr 的所有元素:

    0 10 20 30 40 50 60 70 80 90
    
  6. 释放内存

    delete[] arr;
    delete[] newArr;
    

    解释: 释放之前分配的动态数组 arrnewArr 所占的内存,避免内存泄漏。

总结

  • 创建了一个大小为 5 的动态数组 arr 并初始化。
  • 创建了一个更大的动态数组 newArr,并将 arr 的内容拷贝到 newArr 的前 5 个位置。
  • 初始化了 newArr 的其余部分。
  • 打印了 newArr 的所有元素。
  • 释放了分配的内存。

3. 动态数组的使用与标准库 std::vector

std::vector 是 C++ 标准库提供的一个动态数组类,提供了许多方便的功能,例如动态扩展和自动内存管理。以下是一个使用 std::vector 的例子:

示例

#include <iostream>
#include <vector>int main() {// 创建并初始化 std::vectorstd::vector<int> vec = {0, 10, 20, 30, 40};// 添加新元素vec.push_back(50);// 打印 std::vectorfor (int i = 0; i < vec.size(); ++i) {std::cout << vec[i] << " ";}std::cout << std::endl;// 删除最后一个元素vec.pop_back();// 打印 std::vectorfor (int i = 0; i < vec.size(); ++i) {std::cout << vec[i] << " ";}std::cout << std::endl;return 0;
}

说明std::vector 允许动态添加和删除元素,简化了动态数组的使用和管理。这个示例演示了如何使用 std::vector 添加和删除元素。

4. 动态数组作为函数参数

使用指针创建动态数组以及调用动态数组

#include <iostream>// 打印动态数组的函数
void printArray(int* arr, int size) {for (int i = 0; i < size; ++i) {std::cout << arr[i] << " ";}std::cout << std::endl;
}int main() {int size = 5;// 创建并初始化动态数组int* arr = new int[size];for (int i = 0; i < size; ++i) {arr[i] = i * 10;}// 使用函数打印数组printArray(arr, size);// 释放动态数组的内存delete[] arr;return 0;
}

  1. 创建并初始化动态数组

    int size = 5;
    int* arr = new int[size];
    for (int i = 0; i < size; ++i) {arr[i] = i * 10;
    }
    

    解释:

    • size 被设置为 5,因此 arr 的大小为 5
    • arr 被分配并初始化为一个包含 5 个元素的动态数组。
    • for 循环遍历数组的每个位置,并将其值设置为 i * 10
    • 最终,arr 的内容如下:
    arr = {0, 10, 20, 30, 40}
    
  2. 调用 printArray 函数

    printArray(arr, size);
    

    解释:

    • 函数 printArray 被调用,传递了 arrsize 作为参数。
    • printArray 函数中,使用一个 for 循环遍历 arr 的每个元素并打印出来。打印输出如下:
    0 10 20 30 40
    
  3. 释放动态数组的内存

    delete[] arr;
    

    解释:

    • delete[] 被用来释放之前分配的动态数组 arr 所占的内存。
    • 可以避免内存泄漏。

总结

  1. 创建并初始化数组:

    • 动态数组 arr 被创建并填充了 {0, 10, 20, 30, 40}
  2. 打印数组内容:

    • printArray 函数打印了 arr 的内容:0 10 20 30 40
  3. 释放内存:

    • 释放了 arr 占用的内存。

输出

程序的输出结果是:

0 10 20 30 40

5. 使用动态数组存储用户输入

#include <iostream>int main() {int size;std::cout << "Enter the number of elements: ";std::cin >> size;// 创建动态数组int* arr = new int[size];// 读取用户输入std::cout << "Enter " << size << " integers: ";for (int i = 0; i < size; ++i) {std::cin >> arr[i];}// 打印用户输入的数组std::cout << "You entered: ";for (int i = 0; i < size; ++i) {std::cout << arr[i] << " ";}std::cout << std::endl;// 释放内存delete[] arr;return 0;
}

说明:这个示例演示了如何创建一个动态数组以存储用户输入,并在程序结束时释放内存。

这些示例涵盖了动态数组的基本操作、调整大小、与标准库的集成以及作为函数参数的用法。std::vector 通常是更推荐的选择,因为它封装了动态数组的管理细节。

步骤演示

假设你在执行这个程序时输入如下数据:

  • size 输入值为 4
  • 用户输入的整数是 1, 2, 3, 4

我们将逐步调试这个程序,查看每一步的输出结果:

  1. 输入数组的大小
std::cout << "Enter the number of elements: ";
std::cin >> size;

输入: 4
输出: Enter the number of elements:
用户输入 4 被赋值给 size 变量。

  1. 创建动态数组
int* arr = new int[size];

操作:
创建一个 int 类型的动态数组 arr,其大小为 4。此时,数组的内容未初始化,包含垃圾值(随机数据)。

  1. 读取用户输入
std::cout << "Enter " << size << " integers: ";
for (int i = 0; i < size; ++i) {std::cin >> arr[i];
}

输出: Enter 4 integers:
用户输入的整数依次存储到数组 arr 中。假设输入的整数是 1, 2, 3, 4。这段代码的循环过程如下:

  • 第一次循环(i=0): std::cin >> arr[0],用户输入 1arr[0] 被设置为 1
  • 第二次循环(i=1): std::cin >> arr[1],用户输入 2arr[1] 被设置为 2
  • 第三次循环(i=2): std::cin >> arr[2],用户输入 3arr[2] 被设置为 3
  • 第四次循环(i=3): std::cin >> arr[3],用户输入 4arr[3] 被设置为 4
  1. 打印用户输入的数组
std::cout << "You entered: ";
for (int i = 0; i < size; ++i) {std::cout << arr[i] << " ";
}
std::cout << std::endl;

输出: You entered: 1 2 3 4
这段代码的循环过程如下:

  • 第一次循环(i=0): 输出 arr[0],即 1
  • 第二次循环(i=1): 输出 arr[1],即 2
  • 第三次循环(i=2): 输出 arr[2],即 3
  • 第四次循环(i=3): 输出 arr[3],即 4

最终输出为 You entered: 1 2 3 4,显示了用户输入的所有整数。

  1. 释放内存
delete[] arr;

操作:
释放之前分配的动态数组内存。这样可以避免内存泄漏。

总结

这段代码的执行过程如下:

  1. 用户输入了数组的大小 4
  2. 动态分配了一个大小为 4 的整数数组。
  3. 用户依次输入了 4 个整数并存储在数组中。
  4. 打印出用户输入的整数。
  5. 最后释放了动态数组所占的内存。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • kubernetes k8s Daemonset 控制器 原理 讲解 配置
  • 微前端架构下的多租户支持:实现与最佳实践
  • Android app安装第三方应用
  • Linux服务器运维管理面板1panel
  • 【技术方案】技术解决方案过程文件(Word原件)
  • 【二分查找】--- 初阶题目赏析
  • HarmonyOS NEXT - Toast和Loading使用
  • IndexError: list index out of range | 列表索引超出范围完美解决方法
  • 【STM32 FreeRTOS】软件定时器
  • C/C++ 数学运算与数学函数
  • 【MySQL】表的设计
  • ECMAScript6语法:类
  • 常见编码形式特征汇总(1)
  • 数据库根据日期统计SQL编写记录
  • c语言-经典例题
  • Babel配置的不完全指南
  • cookie和session
  • Docker下部署自己的LNMP工作环境
  • Hibernate【inverse和cascade属性】知识要点
  • iOS小技巧之UIImagePickerController实现头像选择
  • Python中eval与exec的使用及区别
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 简单易用的leetcode开发测试工具(npm)
  • 开源地图数据可视化库——mapnik
  • 你不可错过的前端面试题(一)
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 算法-插入排序
  • 微服务入门【系列视频课程】
  • 再谈express与koa的对比
  • ​2020 年大前端技术趋势解读
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • (30)数组元素和与数字和的绝对差
  • (LeetCode C++)盛最多水的容器
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (十二)Flink Table API
  • (四)JPA - JQPL 实现增删改查
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .net快速开发框架源码分享
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [c]统计数字
  • [echarts] y轴不显示0
  • [emacs] CUA的矩形块操作很给力啊
  • [iOS]-UIKit
  • [Java][Liferay] File system in liferay
  • [java]删除数组中的某一个元素
  • [LVGL]:MACOS下使用LVGL模拟器
  • [msg_msg] corCTF2021 -- fire_of_salvation
  • [Noi2015]程序自动分析
  • [osgearth]通过API创建一个earth模型
  • [POJ3067]Japan