【C++】指针

news/2025/9/21 15:41:20/文章来源:https://www.cnblogs.com/Skyrim-sssuuu/p/19103704

内存

程序中最重要的一件事,就是内存。当启动一个程序的时候,所有的代码都被载入到内存当中,内存中的所有的二进制指令都在告诉计算机你的代码需要做什么。

没有内存,计算机什么都做不了,而指针对于管理和操纵内存十分重要。

什么是指针

指针是一个整数,一种存储内存地址的数字。(类型与这无关)

简单解释:假如只有一条街道和一排的房子,这就是计算机中的内存;这条街上的每一个房子都是一个内存字节,而每一栋房子都有门牌号,这就是这个字节对应的地址。假如你想上门送/取货,即读写内存字节,门牌号(指针)就告诉了我们需要送/取货的房子(对应内存字节)在哪。

程序演示

空指针

我们可以知道,类型不会改变一个指针的实质:指针的实质就是一个内存地址,是一个整数。

下面是一份完整的空指针代码:

点击查看代码
#include <iostream>#define LOG(x) std::cout << x << std::endl;int main()
{void* ptr = nullptr;std::cin.get();return 0;
}

运行结果

这里可以看到空指针存储的内存地址值为x0x0000...

image

指针赋值

这里将会用指针赋值的方式来演示指针究竟是什么,以及其根本上有什么作用:

点击查看代码
#include <iostream>#define LOG(x) std::cout << x << std::endl;int main()
{int var = 1;int* ptr = &var;*ptr = 8;std::cin.get();return 0;
}

运行结果

从结果中我们可以看到,指针ptr存储了var的地址&var,此时ptr = &var
程序中我们使用了 " * " 来反引用指针ptr,并将这个内存地址上的值修改为了100。
由于ptr = &var,通俗来说,我们作为为快递员,通过指针ptr 得到了门牌号(地址),知道了我们要送/取货的房子(内存字节),并使用 " * " 来敲门(反引用),将货物(值)送入了房子当中,进而将变量var的值给改变了。

image

内存

通过内存就可以很清晰的看见,此地址下的内存被改变成了8。
上面的例子创建了一个整数,而一个整数是4字节的内存,所以我们知道指针指向的内存是4个字节。
但实际上,我们并不知道指针指向的数据有多大,因为指针并不包含数据,它只包含了内存地址。

image

通过new来创建指针

之前都是在栈上创造的内存,现在使用new可以在堆上创造内存。

点击查看代码
#include <iostream>#define LOG(x) std::cout << x << std::endl;int main()
{char* buf = new char[8];memset(buf, 0, 8);delete[] buf;std::cin.get();return 0;
}

运行结果

让我们看看在删除buf之前的值:
我们给指针分配了8个字节,用来存储数据的指针,指向数据开头。

image

内存

image

多重指针

还有另一点,指针同时也是变量,其存储的地址的值也会存储在某一内存地址中,那么就可以引申出用双重指针或三重指针等等,即指向指针的指针:

点击查看代码
#include <iostream>#define LOG(x) std::cout << x << std::endl;int main()
{char* buf = new char[8];memset(buf, 0, 8);char** ptr = &buf;delete[] buf;std::cin.get();return 0;
}
// 变量 <- 指针1存储变量的内存地址的值到某一内存地址中
// 指针1 <- 指针2存储指针1的内存地址的值到某一内存地址中
// 指针2 <- 指针3存储指针2的内存地址的值到某一内存地址中

运行结果

image

内存

二重指针ptr内存地址:

image

单重指针buf内存地址:

image

总结

指针只是存储内存地址的整数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Quart

Quart📌 在软件/编程里 Quart 是一个 Python 异步 Web 框架,API 和 Flask 几乎完全兼容,但基于 asyncio,所以可以用 async/await 写异步代码。你可以把它理解为 “异步版 Flask”。典型用途:写高并发 Web 服务、…

AI驱动建筑行业数字化转型

AI驱动建筑行业数字化转型精细化管理为目标的数字化转型是建筑产业发展的必然趋势 建筑业当前面临着行业增速下降、劳动力成本上升、单个项目投标家数增加、资源环境约束加剧等挑战,且随着时代发展,建筑项目的规…

详细介绍:前端学习——CSS

详细介绍:前端学习——CSSpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

VSCode 把代码发送到激活状态下的终端

VSCode 把代码发送到激活状态下的终端 你有没有遇到过这样的情况:在VSCode里写Python代码时,经常需要打开好几个终端。但问题是,Shift+Enter快捷键只能把选中的代码发送到第一个终端。有时候,如果VSCode意外重启,…

java设计模式-工厂模式(文件上传) - 实践

java设计模式-工厂模式(文件上传) - 实践2025-09-21 15:33 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block…

线性结构之数组[基于郝斌课程]

线性结构:把所有的结点用一根线穿起来 连续存储[数组]什么叫做数组:元素类型相同,大小相等/* @file main.c @brief 线性结构之数组 @author EricsT (EricsT@163.com) @version v1.0.0 @date 202…

完整教程:Vue中的props方式

完整教程:Vue中的props方式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

深度剖析 B 站关键词排名:策略与技巧全解析 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

图解25:MySQL主从复制原理

使用AI图生图,有些修饰的还不错,有些差强人意,特别是文字内容混在一起的AI明显是比较难处理

用 Go 编写验证码识别脚本(基于 Tesseract)

一、概述 识别验证码通常用于登录自动化、表单填写等自动化流程中。对于字符清晰、干扰较少的验证码,OCR 是一种轻便高效的识别方式。本文介绍如何使用 Go 调用 Tesseract OCR 实现验证码图片的识别。 二、前提条件安…

第03周 预习、实验与作业:面向对象入门2与类的识别

一、什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性?Student的getName应该用static修饰吗? (1)什么样的方法应该用static修饰? 1.工具类或者辅助方法 例如:Math.sqrt()、Arrays.sort()等,…

完整教程:MySQL 存储过程完整实战手册---一篇吃透 Stored Procedure

完整教程:MySQL 存储过程完整实战手册---一篇吃透 Stored Procedure2025-09-21 15:15 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto …

数据结构 静态链表的实现(算法篇) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Zero-Shot、One-Shot、Few-Shot概念

Zero-Shot提示:模型只根据任务的描述生成响应,不需要任何示例。 One-Shot提示:只提供一个例子。 Few-Shot提示:提供几个例子。在提示中的作用是通过少量样本引导模型对特定任务进行学习和执行,例如通过提供少量风…

ADS放入元器件include和DK.zip文件依然提示未定义

ADS放入元器件include和DK.zip文件依然提示未定义各位ADS大佬,我在ads中导入CUSTOMER_ADS_V2005AP0806_PRJ.zip和图片中的这些文件(都是导入元器件模型和其中一个zip文件)都提示下面的截图,是我导入的顺序不对,还…

AI元人文(十三):良知觉醒——论三值伦理模型与元道德主体的诞生

AI元人文(十三):良知觉醒——论三值伦理模型与元道德主体的诞生 文/岐金兰 楔子:规则之外的深渊 “第一定律:机器人不得伤害人类个体,或因不作为致使人类个体受到伤害。” 阿西莫夫的“机器人三定律”曾为我们描…

SPAR类比推理模型学习(与常见小目标检测方法总结) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Oracle EBS ERP——常见查询业务场景 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

「MCOI-05」魔仙

题意 给定一个 \(n\), 构造长度为 \(n\) 的序列,使得和为 0,乘积为 \(n\)。 解答 我们考虑 \(n\) 的性质,发现 \(0\) 是一个偶数,如果序列中没有偶数,作为一对奇数乘积的 \(n\) 自然也会是奇数,奇数个奇数整不出…

BlueHat v18 会议资料现已发布:前沿安全技术与漏洞缓解策略

微软安全响应中心公开BlueHat v18会议资料,包含主题演讲、前沿技术追踪和攻击类型缓解策略的幻灯片与视频,同时宣布BlueHat以色列站征稿启动,鼓励安全研究者提交前沿研究成果。上个月我们成功举办了又一届精彩的Blu…