news 2026/4/23 16:04:47

指针、数组与指针算术:深入理解C++内存管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
指针、数组与指针算术:深入理解C++内存管理

指针、数组与指针算术:深入理解C++内存管理

核心概念:指针与数组的等价性

指针和数组基本等价的原因在于指针算术和C++内部处理数组的方式。指针算术的核心规则是:将指针变量加1后,增加的量等于它指向的类型的字节数

double*pw;// pw + 1 增加8字节(double通常8字节)short*ps;// ps + 1 增加2字节(short通常2字节)

指针算术的实战演示

#include<iostream>usingnamespacestd;intmain(){doublewages[3]={10000.0,20000.0,30000.0};shortstacks[3]={3,2,1};double*pw=wages;// 数组名即首元素地址short*ps=&stacks[0];// 等价写法cout<<"pw = "<<pw<<", *pw = "<<*pw<<endl;pw=pw+1;// 增加8字节cout<<"pw = "<<pw<<", *pw = "<<*pw<<endl;cout<<"ps = "<<ps<<", *ps = "<<*ps<<endl;ps=ps+1;// 增加2字节cout<<"ps = "<<ps<<", *ps = "<<*ps<<endl;return0;}

数组表示法与指针表示法的等价性

C++编译器将数组表达式转换为指针表达式:

arrayName[i]等价于*(arrayName+i)pointerName[i]等价于*(pointerName+i)

关键区别

pointerName=pointerName+1;// 合法arrayName=arrayName+1;// 非法!数组名是常量

指针与字符串的关系

C-风格字符串实际上是字符数组,数组名即字符串首地址:

charflower[10]="rose";cout<<flower;// 输出:roseconstchar*bird="wren";// 字符串字面值是常量cout<<bird;// 输出:wren

重要警告:不要使用未初始化的指针或字符串常量接收输入!

使用new创建动态结构

动态结构允许在运行时分配内存:

structInflatable{charname[20];floatvolume;doubleprice;};intmain(){Inflatable*ps=newInflatable;// 动态分配结构// 访问结构成员cin.get(ps->name,20);// 使用箭头运算符cin>>(*ps).volume;// 使用解引用+点运算符cin>>ps->price;deleteps;// 释放内存return0;}

内存管理的三种方式

1. 自动存储(栈)

  • 函数内部定义的局部变量
  • 函数调用时自动创建,函数结束时自动销毁
  • 使用栈数据结构(LIFO原则)

2. 静态存储

  • 全局变量或使用static关键字
  • 程序整个生命周期都存在
  • 编译时分配内存

3. 动态存储(堆/自由存储)

  • 使用newdelete手动管理
  • 生命周期由程序员控制
  • 更灵活但需要谨慎管理

实用示例:动态字符串管理

char*getname(){chartemp[80];cout<<"Enter name: ";cin>>temp;// 分配刚好足够的内存char*pn=newchar[strlen(temp)+1];strcpy(pn,temp);// 复制字符串returnpn;// 返回动态分配的内存地址}intmain(){char*name=getname();cout<<name<<" at "<<(int*)name<<endl;delete[]name;// 必须释放!return0;}

最佳实践总结

  1. 区分指针与数组

    • 数组名是常量指针
    • 指针变量可以重新赋值
  2. 正确使用字符串

    • 使用strcpy()strncpy()复制字符串
    • 避免未初始化指针接收输入
  3. 动态内存管理

    • 每个new必须有对应的delete
    • 数组使用delete[]
    • 指针置空防止悬空指针
  4. 选择合适的内存类型

    • 局部变量用自动存储
    • 全局数据用静态存储
    • 动态大小数据用堆存储

现代C++建议

虽然理解指针和数组的关系很重要,但在实际开发中:

  • 优先使用std::string而不是C风格字符串
  • 优先使用智能指针(unique_ptr,shared_ptr)而不是原始指针
  • 优先使用标准库容器(vector,array)而不是原始数组

掌握指针和数组的核心概念是成为C++高手的关键一步,希望这篇总结能帮助你更深入地理解C++的内存管理机制!


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

研究生必备!8款AI论文工具:一键生成综述+真实文献交叉引用

正在熬夜改论文的你&#xff0c;是否被这些痛点折磨&#xff1f; 如果你是被导师批注“逻辑混乱”的研究生&#xff0c;或是为知网查重费用心疼的准毕业生&#xff0c;又或是花3天调参考文献格式仍出错的学术小白——这篇文章就是你的“论文救星指南”。今天&#xff0c;我们深…

作者头像 李华
网站建设 2026/4/23 9:16:24

windows Server 2025原生支持NVME提升80%开启方法(默认关闭)

微软确认Windows Server 2025已随10月累积更新KB5066835正式引入原生NVMe支持。官方实测显示&#xff0c;该功能较4月预告的70% IOPS提升再优化&#xff0c;最终达到80%增幅&#xff1b;4K随机读取场景下CPU周期占用降低约45%。核心变化是系统不再默认把存储设备视为SCSI&#…

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

基于STM32的智能温控风扇系统设计与实现

基于STM32的智能温控风扇系统设计与实现 摘要 本文设计并实现了一种基于STM32F103C8T6单片机的智能温控风扇系统,该系统融合了环境感知、智能决策与远程控制技术,实现了温湿度监测、人体感应、自适应风速调节和蓝牙远程控制等核心功能。系统采用DHT11温湿度传感器实时采集环…

作者头像 李华
网站建设 2026/4/23 9:21:03

.net医院预约管理系统设计开发实现

医院预约管理系统设计开发背景 医疗资源分配不均和患者就诊效率低下是当前医疗系统面临的普遍问题。传统挂号方式存在排队时间长、号源分配不透明、资源浪费等现象。信息技术的发展为优化医疗流程提供了解决方案&#xff0c;医院预约管理系统应运而生。 医院预约管理系统开发…

作者头像 李华
网站建设 2026/4/23 1:26:05

CodeRider-Kilo 驱动下的 Python Excel 自动化开发全流程深度解析

前言 在当前的数字化办公环境中&#xff0c;Excel 数据的处理与格式化占据了大量的工作时间。为了提升效率&#xff0c;利用 Python 语言编写自动化的 Excel 处理工具成为了技术人员的首选方案。CodeRider-Kilo 作为一款深度集成于 VSCode 环境的 AI 开发助手&#xff0c;其强大…

作者头像 李华
网站建设 2026/4/23 9:22:44

基于Java的售卖智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 《基于Java的售卖智慧管理系统的设计与实现》针对传统选题“烂大街”的问题&#xff0c;选择了一个在功能模块化设计上独具匠心、开发难度适中的题目。系统涵盖了客户管理、产品管理、订单管理等20余种核心业务模块&#xff0c;结合普通员…

作者头像 李华