当前位置: 首页 > 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…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...