news 2026/4/23 13:45:20

深入理解C++指针与动态内存管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入理解C++指针与动态内存管理

深入理解C++指针与动态内存管理

一、指针的基本概念

指针是C++中强大而重要的特性,它是一个变量,存储的是内存地址而不是值本身。通过指针,我们可以直接操作内存,实现高效灵活的内存管理。

1.1 获取变量地址

intdonuts=6;doublecups=4.5;cout<<"donuts地址: "<<&donuts<<endl;// 使用&获取地址cout<<"cups地址: "<<&cups<<endl;

1.2 声明和使用指针

intupdates=6;int*p_updates;// 声明指向int的指针p_updates=&updates;// 将updates的地址赋给指针cout<<"值: updates = "<<updates;cout<<", *p_updates = "<<*p_updates<<endl;// *解引用获取值cout<<"地址: &updates = "<<&updates;cout<<", p_updates = "<<p_updates<<endl;*p_updates=*p_updates+1;// 通过指针修改值cout<<"现在 updates = "<<updates<<endl;// 输出: 7

二、指针声明和初始化的细节

2.1 指针声明方式

int*ptr;// C++风格,强调类型int*ptr;// C风格,强调*ptr是int值int*ptr;// 中间风格,空格不影响// 注意:下面声明一个指针p1和一个int变量p2int*p1,p2;// p1是指针,p2是普通int变量

2.2 不同类型指针

double*tax_ptr;// 指向double的指针char*str;// 指向char的指针// 虽然都是指针,但类型不同,不能混用

三、动态内存管理:new和delete

3.1 使用new分配内存

int*pn=newint;// 分配一个int大小的内存double*pd=newdouble;// 分配一个double大小的内存*pn=1001;// 在分配的内存中存储值*pd=10000001.0;

3.2 使用delete释放内存

int*ps=newint;// 分配内存// 使用内存...deleteps;// 释放内存ps=nullptr;// 好习惯:释放后设为空指针

重要规则

  • new和delete必须配对使用
  • 不要delete非new分配的内存
  • 不要重复delete同一块内存
  • 对空指针delete是安全的

四、动态数组

4.1 创建动态数组

int*psome=newint[10];// 创建10个int的动态数组

4.2 使用动态数组

double*p3=newdouble[3];p3[0]=0.2;// 像普通数组一样使用p3[1]=0.1;p3[2]=0.8;// 指针算术p3=p3+1;// 指针移动到下一个元素cout<<"p3[0]现在是: "<<p3[0]<<endl;// 输出0.1p3=p3-1;// 移回开头delete[]p3;// 释放数组内存

4.3 释放动态数组

delete[]psome;// 注意:释放数组要加[]

五、指针与C++编程哲学

5.1 编译时决策 vs 运行时决策

  • 编译时决策:数组大小固定,效率高但缺乏灵活性
  • 运行时决策:使用new动态分配,灵活适应不同情况
// 编译时决策 - 固定大小intstaticArray[20];// 总是分配20个元素// 运行时决策 - 动态大小intsize;cout<<"需要多少元素?";cin>>size;int*dynamicArray=newint[size];// 按需分配

5.2 内存管理区域

  • 栈(stack):存储局部变量、函数参数等,自动管理
  • 堆(heap)/自由存储区(free store):new分配的内存,需手动管理

六、实用建议和注意事项

6.1 指针安全实践

// 1. 总是初始化指针int*ptr=nullptr;// 好习惯// 2. 检查指针是否有效if(ptr!=nullptr){*ptr=10;}// 3. 使用delete后设为nullptrdeleteptr;ptr=nullptr;

6.2 避免常见错误

// 错误1:未初始化指针int*badPtr;// 危险!包含垃圾值// *badPtr = 5; // 可能导致程序崩溃// 错误2:内存泄漏voidleakMemory(){int*leak=newint[100];// 忘记delete[] leak;}// 错误3:悬空指针int*dangling=newint;deletedangling;// *dangling = 10; // 错误!内存已释放

总结

指针是C++内存管理的核心工具,它提供了:

  1. 灵活性:运行时决定内存分配
  2. 效率:直接内存操作,减少拷贝
  3. 控制力:精细管理内存生命周期

关键要点

  • 理解指针存储的是地址,使用*解引用获取值
  • 使用newdelete配对管理动态内存
  • 区分deletedelete[]的使用场景
  • 始终保持良好的指针使用习惯

掌握指针需要时间和实践,但它是成为高效C++程序员的关键一步。从理解基本概念开始,逐步练习动态内存管理,最终你将能够编写出既高效又灵活的C++程序。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:45:46

Dubbo 面试必问:哪种协议最推荐?

文章目录 Dubbo推荐用什么协议&#xff1f;引言正文1. Dubbo协议特点&#xff1a;适用场景&#xff1a;示例配置&#xff1a; 2. HTTP协议特点&#xff1a;适用场景&#xff1a;示例配置&#xff1a; 3. Hessian协议特点&#xff1a;适用场景&#xff1a;示例配置&#xff1a; …

作者头像 李华
网站建设 2026/4/23 10:48:47

MCP SC-400如何实现量子加密?:20年专家亲授实战配置全流程

第一章&#xff1a;MCP SC-400 的量子加密实现MCP SC-400 是新一代安全协处理器&#xff0c;专为高敏感数据环境设计&#xff0c;支持基于量子密钥分发&#xff08;QKD&#xff09;的加密机制。其核心优势在于结合了传统公钥基础设施&#xff08;PKI&#xff09;与抗量子计算攻…

作者头像 李华
网站建设 2026/4/23 10:46:42

高效搭建本地DNS服务:MosDNS实用部署完整指南

高效搭建本地DNS服务&#xff1a;MosDNS实用部署完整指南 【免费下载链接】mosdns mosdns - 一个DNS转发器&#xff0c;使用Go语言编写&#xff0c;遵循GPLv3许可。 项目地址: https://gitcode.com/gh_mirrors/mo/mosdns 你是否经常遇到网络访问缓慢、某些网站无法打开的…

作者头像 李华
网站建设 2026/4/23 10:48:49

PT助手Plus:浏览器种子下载终极指南,3步实现一键下载

PT助手Plus&#xff1a;浏览器种子下载终极指南&#xff0c;3步实现一键下载 【免费下载链接】PT-Plugin-Plus PT 助手 Plus&#xff0c;为 Microsoft Edge、Google Chrome、Firefox 浏览器插件&#xff08;Web Extensions&#xff09;&#xff0c;主要用于辅助下载 PT 站的种子…

作者头像 李华
网站建设 2026/4/23 12:13:45

Cursor免费试用限制完全重置指南:轻松绕过设备检测

Cursor免费试用限制完全重置指南&#xff1a;轻松绕过设备检测 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro. We hav…

作者头像 李华
网站建设 2026/4/23 12:18:19

终极D2R自动化助手:Botty让你的暗黑2重制版游戏体验全面升级

厌倦了重复刷怪和枯燥跑图&#xff1f;Botty作为一款专业的D2R像素机器人&#xff0c;正在彻底改变《暗黑破坏神2&#xff1a;重制版》玩家的游戏方式。这款开源自动化工具通过智能模拟键盘鼠标操作&#xff0c;为你带来前所未有的便利体验。无论是新手玩家还是资深老鸟&#x…

作者头像 李华