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;
}
步骤演示
-
创建并初始化原始动态数组
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} -
创建一个更大的数组
int* newArr = new int[newSize];解释: 创建一个新的动态数组
newArr,其大小为10,此时newArr的内容未初始化,包含垃圾值。 -
拷贝旧数组的内容到新数组
std::memcpy(newArr, arr, size * sizeof(int));解释: 使用
std::memcpy将arr中的5个整数拷贝到newArr的开头。此时newArr的前5个元素与arr相同,其余部分仍然包含垃圾值。newArr的状态如下:newArr = {0, 10, 20, 30, 40, ???, ???, ???, ???, ???} -
初始化新数组的新增部分
for (int i = size; i < newSize; ++i) {newArr[i] = i * 10; }解释: 为
newArr的新增部分填充数据。索引5到9的元素被初始化为50, 60, 70, 80, 90。newArr的最终状态如下:newArr = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90} -
打印新数组
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 -
释放内存
delete[] arr; delete[] newArr;解释: 释放之前分配的动态数组
arr和newArr所占的内存,避免内存泄漏。
总结
- 创建了一个大小为
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;
}
-
创建并初始化动态数组
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} -
调用
printArray函数printArray(arr, size);解释:
- 函数
printArray被调用,传递了arr和size作为参数。 - 在
printArray函数中,使用一个for循环遍历arr的每个元素并打印出来。打印输出如下:
0 10 20 30 40 - 函数
-
释放动态数组的内存
delete[] arr;解释:
delete[]被用来释放之前分配的动态数组arr所占的内存。- 可以避免内存泄漏。
总结
-
创建并初始化数组:
- 动态数组
arr被创建并填充了{0, 10, 20, 30, 40}。
- 动态数组
-
打印数组内容:
printArray函数打印了arr的内容:0 10 20 30 40。
-
释放内存:
- 释放了
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
我们将逐步调试这个程序,查看每一步的输出结果:
- 输入数组的大小
std::cout << "Enter the number of elements: ";
std::cin >> size;
输入: 4
输出: Enter the number of elements:
用户输入 4 被赋值给 size 变量。
- 创建动态数组
int* arr = new int[size];
操作:
创建一个 int 类型的动态数组 arr,其大小为 4。此时,数组的内容未初始化,包含垃圾值(随机数据)。
- 读取用户输入
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],用户输入1,arr[0]被设置为1。 - 第二次循环(i=1):
std::cin >> arr[1],用户输入2,arr[1]被设置为2。 - 第三次循环(i=2):
std::cin >> arr[2],用户输入3,arr[2]被设置为3。 - 第四次循环(i=3):
std::cin >> arr[3],用户输入4,arr[3]被设置为4。
- 打印用户输入的数组
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,显示了用户输入的所有整数。
- 释放内存
delete[] arr;
操作:
释放之前分配的动态数组内存。这样可以避免内存泄漏。
总结
这段代码的执行过程如下:
- 用户输入了数组的大小
4。 - 动态分配了一个大小为
4的整数数组。 - 用户依次输入了
4个整数并存储在数组中。 - 打印出用户输入的整数。
- 最后释放了动态数组所占的内存。
相关文章:
c++动态数组new和delete
文章目录 动态数组的使用大全1. **基本创建和初始化**2. **动态调整大小**3. **动态数组的使用与标准库 std::vector**4. **动态数组作为函数参数**输出 5. **使用动态数组存储用户输入** 动态数组的使用大全 1. 基本创建和初始化 示例: #include <iostream&g…...
Redis热点知识速览(redis的数据结构、高性能、持久化、主从复制、集群、缓存淘汰策略、事务、Pub/Sub、锁机制、常见问题等)
Redis是一个开源的、使用内存作为存储的、支持数据结构丰富的NoSQL数据库。它的高性能、灵活性和简单易用使其在许多场景下成为首选的缓存解决方案。以下是Redis的常见和热点知识总结。 数据结构 Redis支持五种基本数据结构: String:字符串是Redis中最…...
【C++浅析】lambda表达式:基本结构 使用示例
基本结构 [捕获列表](参数列表) -> 返回类型 { // 函数体 } 捕获列表 ([ ]): 用于指定外部变量的捕获方式。可以: 通过值捕获:[x]通过引用捕获:[&x]捕获所有变量通过值:[]捕获所有变量通过引用:[&]自…...
利用Redis获取权限的多种方式
更多实战内容,可前往无问社区查看http://www.wwlib.cn/index.php/artread/artid/10333.html Redis是我们在实战中经常接触到的一款数据库,因其在前期打点中被利用后可直接影响服务器安全所以在攻防过程中也备受红队关注,在本文中会重点分享一…...
LeetCode - LCR 146- 螺旋遍历二维数组
LCR 146题 题目描述: 给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。 螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完…...
如何获取Bing站长工具API密钥
Bing站长工具近期悄然上线了网站URL推送功能,似乎有意跟随百度的步伐。这个新功能允许站长通过API向Bing提交链接数据,当然也可以通过Bing站长工具手动提交。 本文将详细介绍如何通过Bing站长工具生成用于网站链接推送的API密钥。 首先,访问…...
NC 调整数组顺序使奇数位于偶数前面(一)
系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 输入一个长度…...
Unity异步把图片数据从显存下载到内存(GPU->CPU)
Unity异步把图片数据从显存下载到内存(GPU->CPU) 1.c#核心代码 using System.Collections; using System.Collections.Generic; using Unity.Collections; using UnityEditor.PackageManager.Requests; using UnityEngine; using UnityEngine.Rende…...
【MySQL】C/C++连接MySQL客户端,MySQL函数接口认知,图形化界面进行连接
【MySQL】C/C引入MySQL客户端 安装mysqlclient库mysql接口介绍初始化mysql_init链接数据库mysql_real_connect下发mysql命令mysql_query获取出错信息mysql_error获取执行结果mysql_store_result获取结果行数mysql_num_rows获取结果列数mysql_num_fields判断结果列数mysql_field…...
Wireshark分析工具
简单用例 首先打开软件,左上角点文件,选中要分析的文件列表。 导入用tcpdump抓的包后进行分析,这里要输入过滤条件,对网络包进行一定的过滤处理。(这里172网段是阿里云的地址,用自己写的python2脚本对阿里…...
linux网络配置脚本
通过脚本,设置静态ip以及主机名 因为企业9的网络配置文件和企业7的不一样所以,我们以rhel9和rhel7为例 rhel7/centos7/openeuler #!/bin/bash cat > /etc/sysconfig/network-scripts/ifcfg-$1 << EOF DEVICE$1 ONBOOTyes BOOTPROTOnone IPAD…...
IT管理:我与IT的故事4
首先,宣布一个“坏消息”。最近Herry童鞋的办公邮箱似乎有些“抽抽”了,所以邮件出现了延迟、拒收、被拒收、甚至是石沉大海的现象。为了能够更好的和大家进行沟通,大家如果发邮件到我办公邮箱的时候,若不嫌麻烦,可以抄…...
短链接系统设计方案
背景 需要设计一个短链接系统,主要功能主要有如下几点: ToB: 输入一个长链接,转换成短链接。这个短链接有时效性,可以设定指定过期时间。这个系统的每天会生成千万级别的短链接。数据具备可分析功能。 ToC…...
Cisco交换机SSH使用RSA公钥免密登录(IOS与Nexus,服务器以RHEL8为例)
目录 需求实验步骤0. 实验环境1. Linux2. CiscoIOS基础设置保存密钥登陆测试 3. CiscoNexus基础配置保存密钥登陆测试 需求 在实际工作中,常会遇到自动化的需求,那么在自动采集、配置等对网络设备的自动化需求中,不可避免的会遇到需要登录-&…...
QT判断操作系统类型和CPU架构
一、判断操作系统类型 1.在.pro文件中判断 macx { # mac only } unix:!macx{ # linux only } win32 { # windows only }2.在代码中判断 可以包含QGlobal头文件,判断预定义宏 #include <QtGlobal> ... #ifdef Q_OS_MAC // mac #endif#ifdef Q_OS_LINUX // …...
input[type=checkbox]勾选框自定义样式
效果图: <template> <input class"rule-checkbox" type"checkbox" checked v-model"isChecked" /> </template><script setup lang"ts"> import { ref } from vue; const isChecked ref(); </…...
鼠害监测系统:科技守护农业安全
在农业生产中,鼠害一直是威胁作物安全、影响产量的重要因素。然而,随着科技的飞速发展,鼠害监测系统正逐步成为现代农业防治鼠害的重要利器。 鼠害监测系统巧妙融合了现代光电、数控及物联网技术,实现了诱鼠、投喂鼠药、鼠情监测及…...
Ubuntu20.04如何安装配置JDK
资源准备 官方下载地址(根据自己的系统版本选择不同版本进行下载即可):Java Downloads | Oracle 如无特殊需要可直接移步至下方JDK1.8安装包 https://download.csdn.net/download/qq_43439214/89646731 安装步骤 创建Java目录 sudo mkdir …...
Python3网络爬虫开发实战(9)代理的使用 (需补充代理池的构建)
文章目录 一、代理的设置1.1 urllib 的代理设置1.2 requests 的代理设置1.3 httpx 的代理设置1.4 aiohttp 的代理设置1.4 Selenium 的代理设置1.6 Playwright 的代理设置 二、代理池的构建和维护2.1 代理池的模块构成2.2 代理池的实现 网站为了避免爬虫采集数据可能会采取一些反…...
人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连
人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连。无论是亲情、友情还是爱情,这些关系在表面的情感纽带之下,实则都涉及到价值交换的原理。这种价值交换并非仅仅局限于物质层面,而是涵盖了情感、心理等人类所需的一切…...
实测分享:电脑端专业金价查看软件 AnyGold,办公盯盘两不误
作为经常关注黄金行情的开发者与上班族,日常总被浏览器反复刷新、网页卡顿、广告弹窗、数据分散等问题困扰。最近试用了 AnyGold 这款电脑端金价查看工具,连续使用两周,整体体验稳定、轻量、实用。下面以纯实测角度,客观讲讲它的功…...
Qwen2.5深度微调成果展示|像素剧本圣殿在武侠/赛博朋克题材表现
Qwen2.5深度微调成果展示|像素剧本圣殿在武侠/赛博朋克题材表现 1. 项目概览 像素剧本圣殿(Pixel Script Temple)是基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。这个独特的创作环境将先进的大语言模型能力与8-Bit复古美学完美融合…...
人脸分析系统快速上手教程:一键部署智能人脸检测工具
人脸分析系统快速上手教程:一键部署智能人脸检测工具 1. 系统介绍与核心功能 1.1 什么是人脸分析系统 人脸分析系统(Face Analysis WebUI)是一个基于InsightFace框架的智能人脸检测与分析工具。它能够自动识别图片中的人脸,并提…...
Kandinsky-5.0-I2V-Lite-5s性能调优教程:采样步数24平衡效率与质量实测
Kandinsky-5.0-I2V-Lite-5s性能调优教程:采样步数24平衡效率与质量实测 1. 模型简介与核心能力 Kandinsky-5.0-I2V-Lite-5s是一款专为单卡环境优化的轻量级图生视频模型。它能够将静态图片转化为约5秒时长的动态视频(24fps),只需…...
qt模块学习记录
qt模块学习记录一、Qt Core其他模块都用到的核心非图形类二、Qt GUI 设计 GUI 界面的基础类,包括 OpenGL三、功能模块Qt Network 使网络编程更简单和轻便的类Qt SQL 使用 SQL 用于数据库操作的类Qt Multimedia 音频、视频、摄像头和广播功能的类四、老式界面Qt Widg…...
OpenClaw浏览器扩展:Kimi-VL-A3B-Thinking网页图文即时分析工具
OpenClaw浏览器扩展:Kimi-VL-A3B-Thinking网页图文即时分析工具 1. 为什么需要浏览器增强工具 作为一个经常需要从网页获取信息的技术写作者,我长期被两个问题困扰:一是网页内容过于冗长,需要手动筛选关键信息;二是遇…...
Unity性能优化终极利器:MeshFusion Pro
在现代游戏开发中,性能优化始终是一个核心问题。尤其是在大型场景或高复杂度模型的项目中,Draw Call 过多、顶点数量庞大以及实时生成对象都会严重拖慢游戏帧率,影响用户体验。为了应对这些挑战,Unity 开发者社区中出现了大量优化…...
提升效率:用快马一键生成模块化openclaw控制代码库
最近在做一个机器人项目,需要控制openclaw机械爪完成各种抓取任务。刚开始自己从头写控制代码时,发现光是启动流程就要处理一堆底层细节,比如初始化通信、校准位置、设置默认参数等等,不仅重复劳动,还容易出错。后来尝…...
嵌入式轻量级数值优化库:面向MCU的确定性参数寻优方案
1. 项目概述Optimization 是一个面向嵌入式平台的轻量级数值优化库,专为 Arduino 及兼容 MCU(如 STM32、ESP32、nRF52 等)设计,其核心目标是在资源受限环境下,对用户定义的单目标标量函数 f(x₁, x₂, ..., xₙ) 进行参…...
告别Qt中文乱码和C2001:一份完整的源码文件编码管理指南(从创建到编译)
Qt全流程编码管理实战:从源码创建到编译运行的终极解决方案 当你在Qt项目中第一次看到"C2001: 常量中有换行符"这个错误提示时,可能会感到困惑——明明代码看起来完全正常,为什么编译器就是不认账?更令人抓狂的是&#…...
