0

0

C++怎么使用指针_C++指针详解教程【必学】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-24 11:53:22

|

228人浏览过

|

来源于php中文网

原创

指针声明必须初始化为nullptr,未初始化指针值随机;动态分配后需检查,释放后置nullptr防悬空;new/delete与malloc/free不可混用;数组须配对使用new[]/delete[];函数参数按是否可空选引用或指针;shared_ptr循环引用需weak_ptr破环;指针生命周期不得短于使用范围。

c++怎么使用指针_c++指针详解教程【必学】

指针变量声明时必须初始化或明确赋值

不初始化的指针(尤其是局部指针)内容是随机内存地址,delete 或解引用会直接崩溃。很多新手以为 int* p; 是“空指针”,其实它只是未定义值,不是 nullptr

  • 声明即初始化:用 nullptr(C++11 起推荐),不要用 NULL0 —— 后两者在函数重载场景可能引发歧义
  • 动态分配后立刻检查:比如 int* p = new int(42); if (!p) return;,虽然现代系统极少失败,但嵌入式或资源受限环境仍需防御
  • 避免“悬空指针”:释放后立即置为 nullptr,比如 delete p; p = nullptr;,否则后续误用 if (p) 判断会失效(因为悬空指针非空但非法)

new / delete 和 malloc / free 不能混用

new 不仅分配内存,还会调用构造函数;delete 会调用析构函数。而 malloc / free 是纯 C 内存操作,不触发任何对象生命周期管理。混用会导致对象状态损坏、资源泄漏或未定义行为。

  • 类对象必须用 new/delete:比如 std::string* s = new std::string("hello"); delete s; —— 用 free(s) 不会调用析构函数,内部缓冲区不会释放
  • 原始内存块可用 malloc,但别对它调用 delete;反之亦然。编译器通常不报错,运行时崩得无声无息
  • 数组要配对:用 new[] 就必须用 delete[],否则只调用第一个元素的析构函数,其余被跳过

指针和引用在函数参数中怎么选

传参选指针还是引用,关键看“是否允许传入空值”和“是否需要重新绑定”。引用本质是别名,天生非空且不可重绑;指针更灵活,但也更易出错。

Hotpot.ai
Hotpot.ai

AI工具箱(图像、游戏和写作系列工具)

下载
  • 如果函数逻辑上必须有有效对象(比如修改一个 std::vector),优先用 std::vector& —— 编译器强制你传实参,不用写 if (!v) 检查
  • 如果参数可选(比如日志回调可为空),必须用指针:void process(int* opt_data),调用方可以传 nullptr
  • 别为了“看起来安全”把所有参数都改成引用:比如 void swap(int& a, int& b) 没问题,但 void load_config(Config& cfg) 如果内部可能做 cfg = Config{};,就隐含了“修改原对象”的契约,调用方未必意识到

智能指针不是万能的,循环引用得手动破

std::shared_ptr 用引用计数管理生命周期,但两个对象互相持有对方的 shared_ptr,计数永远不归零,内存就漏了。这不是 bug,是设计使然。

立即学习C++免费学习笔记(深入)”;

  • 典型场景:树节点父子互持、观察者模式中主体与监听器双向引用
  • 破环靠 std::weak_ptr:子节点存父节点用 weak_ptr,访问前用 lock() 转成临时 shared_ptr,既安全又不增加计数
  • 别滥用 weak_ptr:它带来额外开销(控制块多一次原子操作),且每次访问都要判断是否已释放 —— 只在确认有循环风险时才引入

实际写代码时,最容易被忽略的是:指针的生命周期必须比它的使用范围长。哪怕语法全对,只要 int* p = &x; 中的 x 是函数局部变量,返回 p 就是野指针 —— 这种错误不报编译警告,调试器里看到的值还常常“碰巧”是对的。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

866

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

828

2023.08.22

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

581

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1228

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号