当前位置: 首页 > news >正文

C++中的指针详解

C++中的指针详解

在C++编程中,指针是一个非常重要且基础的概念。它允许程序员直接访问和操作内存地址,为高级数据结构和算法的实现提供了基础。本文将详细讲解C++中指针的概念、用法和注意事项,帮助读者深入理解并掌握指针的相关知识。

一、指针的基本概念

指针是一个变量,它存储的是另一个变量的内存地址,而不是值本身。通过使用指针,我们可以间接地访问和操作其他变量。在C++中,指针的定义和使用非常灵活,但也需要谨慎处理,以避免出现内存访问错误或内存泄漏等问题。

二、指针的定义和初始化

在C++中,定义指针的基本语法如下:

数据类型* 指针变量名;

这里的“数据类型”表示指针所指向的变量的类型,“*”表示这是一个指针变量,“指针变量名”是我们给指针变量取的名字。例如,我们可以定义一个指向整数的指针:

int num = 10; // 定义一个整数变量num
int* p = # // 定义一个指向整数的指针p,并将num的地址赋值给p

在这个例子中,p是一个指向整数的指针变量,它存储的是变量num的内存地址。通过&运算符,我们可以获取变量的内存地址。需要注意的是,指针变量在定义时必须被初始化,以避免指向一个不确定的内存地址。

三、指针的访问和操作

通过指针访问和操作变量需要使用*运算符,它被称为解引用运算符。例如,我们可以通过指针p访问和修改变量num的值:

// 通过指针访问变量的值
cout << "num的值是:" << *p << endl; // 输出:num的值是:10// 通过指针修改变量的值
*p = 20; // 将指针p所指向的内存地址的值修改为20
cout << "修改后num的值是:" << num << endl; // 输出:修改后num的值是:20

在这个例子中,*p表示指针p所指向的内存地址中的值,即变量num的值。通过解引用运算符*,我们可以获取或修改指针所指向的变量的值。

四、指针的运算

在C++中,指针还支持一些基本的运算操作,如加法、减法等。这些运算操作可以改变指针所指向的内存地址。例如:

int arr[5] = {1, 2, 3, 4, 5}; // 定义一个整数数组arr
int* p = arr; // 定义一个指向整数的指针p,并将arr的地址赋值给p// 通过指针遍历数组元素
for (int i = 0; i < 5; i++) {cout << "arr[" << i << "]的值是:" << *(p + i) << endl; // 输出数组元素的值
}

在这个例子中,p + i表示将指针p向后移动i个元素的位置。通过解引用运算符*和指针运算,我们可以方便地访问数组中的元素。需要注意的是,在进行指针运算时要确保指针的合法性和有效性,避免出现越界访问等问题。

五、指针与数组的关系

在C++中,数组名实际上是一个指向数组首元素的指针常量。因此,我们可以通过指针来访问和操作数组中的元素。例如:

int arr[5] = {1, 2, 3, 4, 5}; // 定义一个整数数组arr
int* p = arr; // 定义一个指向整数的指针p,并将arr的地址赋值给p// 通过指针访问数组元素
cout << "arr[2]的值是:" << *(p + 2) << endl; // 输出:arr[2]的值是:3// 通过数组名访问数组元素
cout << "arr[2]的值是:" << *(arr + 2) << endl; // 输出:arr[2]的值是:3

在这个例子中,p和arr都可以作为指向数组元素的指针来使用。通过指针或数组名加上偏移量,我们可以访问数组中的任意元素。需要注意的是,虽然数组名可以作为指针来使用,但它是一个指针常量,不能进行赋值操作。

六、指针与函数的关系

在C++中,函数参数传递可以通过值传递或指针传递来实现。通过指针传递参数可以避免复制大型数据结构时的开销,并允许函数修改调用者传入的数据。例如:

// 通过指针传递参数来交换两个整数的值
void swap(int* a, int* b) {int temp = *a; // 将a指向的值存储到临时变量temp中*a = *b; // 将b指向的值赋给a指向的内存地址*b = temp; // 将temp中的值赋给b指向的内存地址
}int main() {int x = 10;int y = 20;cout << "交换前:x=" << x << ", y=" << y << endl; // 输出:交换前:x=10, y=20swap(&x, &y); // 调用swap函数交换x和y的值cout << "交换后:x=" << x << ", y=" << y << endl; // 输出:交换后:x=20, y=10return 0;
}

在这个例子中,swap函数通过指针参数接收两个整数的地址,并交换它们所指向的内存地址中的值。这样,调用者传入的两个整数的值就被成功地交换了。需要注意的是,在使用指针传递参数时要确保指针的合法性和有效性,避免出现空指针引用等问题。同时,在函数内部修改指针所指向的值时要小心谨慎,以免引发意料之外的结果。

七、动态内存分配与指针

在C++中,我们可以使用new和delete运算符进行动态内存分配和释放。通过动态内存分配,我们可以在运行时根据需要分配或释放内存空间。例如:

// 使用new运算符动态分配内存空间并存储整数值
int* p = new int(10); // 动态分配一个整数大小的内存空间,并将值10存储在该内存空间中
cout << "*p的值是:" << *p << endl; // 输出:*p的值是:10// 使用delete运算符释放动态分配的内存空间
delete p; // 释放指针p所指向的内存空间
p = nullptr; // 将指针p置为空指针,避免出现野指针问题

在这个例子中,我们使用new运算符动态分配了一个整数大小的内存空间,并将指针p指向该内存空间。通过解引用运算符*,我们可以访问和操作该内存空间中的值。在使用完动态分配的内存空间后,我们需要使用delete运算符将其释放,并将指针置为空指针(nullptr),以避免出现野指针问题。需要注意的是,在使用动态内存分配时要谨慎处理内存泄漏和野指针等问题,以确保程序的正确性和稳定性。同时,在实际开发中建议优先考虑使用智能指针等RAII(Resource Acquisition Is Initialization)机制来管理动态分配的内存空间,以进一步提高程序的安全性和可靠性。

相关文章:

C++中的指针详解

C中的指针详解 在C编程中&#xff0c;指针是一个非常重要且基础的概念。它允许程序员直接访问和操作内存地址&#xff0c;为高级数据结构和算法的实现提供了基础。本文将详细讲解C中指针的概念、用法和注意事项&#xff0c;帮助读者深入理解并掌握指针的相关知识。 一、指针的…...

视频改字祝福 豪车装X系统源码uniapp前端小程序源码

视频改字祝福 豪车装X系统源码uniapp前端小程序源码&#xff0c;创意无限&#xff01;AI视频改字祝福&#xff0c;豪车装X系统源码开源&#xff0c;打造个性化祝 福视频不再难&#xff01; 想要为你的朋友或家人送上一份特别的祝福&#xff0c;让他们感受到你的真诚与关怀吗&am…...

google chromeDriver 地址

#chrome driver 下载地址 https://getwebdriver.com/chromedriver #chrome brower下载地址 https://googlechromelabs.github.io/chrome-for-testing/ centos 安装的dockerFile的部分命令&#xff1a; #安装browser wget https://dl.google.com/linux/chrome/rpm/stable/x86_…...

分布式与一致性协议之Raft算法(一)

Raft算法 概述 Raft算法属于Multi-Paxos算法&#xff0c;它在兰伯特Multi-Paxos思想的基础上做了一些简化和限制&#xff0c;比如日志必须是连续的&#xff0c;只支持领导者(Leader)、跟随者(Follwer)和候选人(Candidate)3种状态。在理解和算法实现上&#xff0c;Raft算法相对…...

从自定义一个作用域开始来了解SpringBean的作用域

你好&#xff0c;这里是codetrend专栏“Spring6全攻略”。 在 Spring 框架中&#xff0c;Bean 的作用域&#xff08;Scope&#xff09;定义了 Bean 实例在容器中如何创建、管理和销毁的策略。 Spring 提供了多种 Bean 作用域&#xff0c;每种作用域都有其特定的生命周期和适用…...

Android 编译文件简述(Android.mk)

Android 编译文件简述(Android.mk) Android.mk 文件是 Android 构建系统中的一种构建配置文件,使用 GNU Make 语法,用于定义 Android 项目中的模块、库、应用程序、JNI 代码等的编译和链接方式。每个 Android.mk 文件通常对应一个目录,代表构建系统应该如何处理该目录下的源…...

[React] 手动实现CountTo 数字滚动效果

这个CountTo组件npmjs里当然有大把的依赖存在&#xff0c;不过今天我们不需要借助任何三方依赖&#xff0c;造个轮子来手动实现这个组件。 通过研究其他count to插件我们可以发现&#xff0c;数字滚动效果主要依赖于requestAnimationFrame 通过js帧来让数字动起来&#xff0c;…...

9.Admin后台系统

9. Admin后台系统 Admin后台系统也称为网站后台管理系统, 主要对网站的信息进行管理, 如文字, 图片, 影音和其他日常使用的文件的发布, 更新, 删除等操作, 也包括功能信息的统计和管理, 如用户信息, 订单信息和访客信息等. 简单来说, 它是对网站数据库和文件进行快速操作和管…...

redis之集群

一.redis主从模式和redis集群模式的区别 redis主从模式:所有节点上的数据一致&#xff0c;但是key过多会影响性能 redis集群模式:将数据分散到多个redis节点&#xff0c;数据分片存储&#xff0c;提高了redis的吞吐量 二.redis cluster集群的特点 数据分片 多个存储入…...

#9松桑前端后花园周刊-React19beta、TS5.5beta、Node22.1.0、const滥用、jsDelivr、douyin-vue

行业动态 Mozilla 提供 Firefox 的 ARM64 Linux二进制文件 此前一直由发行版开发者或其他第三方提供&#xff0c;目前Mozilla提供了nightly版本&#xff0c;正式版仍需要全面测试后再推出。 发布 React 19 Beta 此测试版用于为 React 19 做准备的库。React团队概述React 19…...

STM32中UART通信的完整C语言代码范例

UART&#xff08;通用异步收发器&#xff09;是STM32微控制器中常用的外设&#xff0c;用于与其他设备进行串行通信。本文将提供一个完整的C语言代码范例&#xff0c;演示如何在STM32中使用UART进行数据传输。 硬件配置 在开始编写代码之前&#xff0c;需要确保以下硬件配置&…...

【ITK统计】第一期 分类器

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK中的分类器及其使用情况,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 在统计分…...

51单片机两个中断及中断嵌套

文章目录 前言一、中断嵌套是什么&#xff1f;二、两个同级别中断2.1 中断运行关系2.2 测试程序 三、两个不同级别中断实现中断嵌套3.1 中断运行关系3.2 测试程序 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 课程需要&#xff1a; 提示&#x…...

VUE 监视数据原理

1、如何监测对象中的数据&#xff1f; 通过setter实现监视&#xff0c;且要在new vue时就传入监测的数据 &#xff08;1&#xff09;对象中后加的属性&#xff0c;vue默认不做响应式处理 &#xff08;2&#xff09;如需给后添加的属性做响应式&#xff0c;请使用如下API&#x…...

Thinkphp使用dd()函数

用过Laravel框架的同学都知道在调试代码的时候使用dd()函数打印变量非常方便&#xff0c;在ThinkPHP6及以上的版本框架中也默认加上了这个函数。但是在ThinkPHP5或更低版本的框架中&#xff0c;dd 并不是一个内置的方法&#xff0c;不过我们可以手动添加这个函数&#xff0c;步…...

Git使用指北

目录 创建一个Git仓库本地仓库添加文件文件提交到本地仓库缓冲区添加远程仓库地址本地仓库推送到远程仓库创建新的分支拉取代码同步删除缓冲区的文件&#xff0c;远程仓库的文件.gitignore文件 创建一个Git仓库 Git仓库分为远程和本地两种&#xff0c;远程仓库如Githu上创建的…...

STM32G030F6P6TR 芯片TSSOP20 MCU单片机微控制器芯片

STM32G030F6P6TR 在物联网&#xff08;IoT&#xff09;设备中的典型应用案例包括但不限于以下几个方面&#xff1a; 1. 环境监测系统&#xff1a; 使用传感器来监测温度、湿度、气压等环境因素&#xff0c;并通过无线通信模块将数据发送到中央服务器或云端平台进行分析和监控。…...

零基础入门学习Python第二阶01生成式(推导式),数据结构

Python语言进阶 重要知识点 生成式&#xff08;推导式&#xff09;的用法 prices {AAPL: 191.88,GOOG: 1186.96,IBM: 149.24,ORCL: 48.44,ACN: 166.89,FB: 208.09,SYMC: 21.29}# 用股票价格大于100元的股票构造一个新的字典prices2 {key: value for key, value in prices.i…...

Java面试题:多线程3

CAS Compare and Swap(比较再交换) 体现了一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性. 线程A和线程B对主内存中的变量c同时进行修改 在线程A中存在预期值a,修改后的更新值a1 在线程B中存在预期值b,修改后的更新值b1 当且仅当预期值和主内存中的变量值相等…...

【QEMU系统分析之实例篇(十八)】

系列文章目录 第十八章 QEMU系统仿真的机器创建分析实例 文章目录 系列文章目录第十八章 QEMU系统仿真的机器创建分析实例 前言一、QEMU是什么&#xff1f;二、QEMU系统仿真的机器创建分析实例1.系统仿真的命令行参数2.创建后期后端驱动qemu_create_late_backends()qtest_serv…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...

Centos 7 服务器部署多网站

一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站&#xff0c;目录结构如下&#xff1a; bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...