C++ 指针和引用引用详解

C++ 指针和引用是两种非常重要的概念,它们在内存操作中起着至关重要的作用。在这篇文章中,我们将深入探讨C++指针和引用的基本概念、分类、转换方法、应用场景以及相关的问题与陷阱。

1. 指针的基本概念和分类

1.1 指针的概念

指针是一个变量,用于存储另一个变量的内存地址。通过指针,我们可以间接地访问和操作内存中的数据。

1.2 声明和初始化

声明指针的方法是使用星号(*)符号。例如,声明一个整型指针的方法是:

int *p;

初始化指针的方法是将其赋值为某个变量的地址。例如,将整型变量 num 的地址赋给指针 p:

int num = 10;
int *p = #

1.3 指针的运算

指针可以进行一些运算,如自增(++)、自减(–)、加减(加减一个整数)等。这些运算实际上是对指针所指向的地址进行操作。例如:

int arr[5] = {1, 2, 3, 4, 5};
int *p = &arr[0];
// 指针后移一位
p++;
// 指针前移一位
--p;
// 指针向后移动两位
p += 2;

1.4 指针与数组

指针和数组紧密相关。数组名可以被视为指向数组首元素的指针。例如,对于整型数组 arr,arr 本身就是一个指向 arr[0] 的指针。

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // p指向arr[0]

1.5 指针的指针

指针的指针是指向指针的指针。例如,声明一个指向整型指针的指针:

int num = 10;
int *p = #
int **pp = &p;

1.6 指针的分类

1.6.1 野指针(Dangling Pointer) 没有指向任何有效内存地址的指针。野指针通常是由于函数返回指针而没有正确初始化导致的。

int *p = NULL;

1.6.2 空指针(Null Pointer): 指向空地址的指针,通常用 NULL 表示。空指针在程序中常用作初始化指针。

int *p = NULL;

1.6.3 空类型指针(Void Pointer) 指向任意类型的指针,可以用 void* 表示。空类型指针在指针算术运算中非常有用。

void *p = NULL;

1.6.4 指向指针的指针(Pointer to Pointer): 指向指针的指针,例如:

int num = 10;
int *p = #
int **pp = &p;

2. 引用的定义及其与指针的关系

2.1 引用的定义

引用是一个变量的别名,它与原变量共享相同的内存地址。通过引用,我们可以直接访问和操作原变量。

2.2 声明和初始化

声明引用的方法是使用圆括号(&)符号。例如,声明一个整型引用 r:

int num = 10;
int &r = num;

注意:引用必须在声明时初始化,否则会导致编译错误。

2.3 引用的运算

引用可以进行赋值、自增、自减等运算,这些运算实际上是对原变量进行操作。例如:

int num = 10;
int &r = num;
// 对原变量进行操作
r = 20; // num的值变为20

2.4 引用与指针的关系

引用和指针都是用于间接访问和操作内存中的数据。它们之间的主要区别在于初始化和可变性。指针可以在声明后初始化为空,可以重新赋值指向不同的变量,而引用必须在声明时初始化,且一旦初始化后不能改变。

3. 指针和引用之间的转换方法与区别

3.1 指针转换为引用:

直接将指针变量名作为引用使用。

int num = 10;
int *p = #
int &r = *p; // 将指针转换为引用

3.2 引用转换为指针:

使用解引用操作符 *。

int num = 10;
int &r = num;
int *p = &r; // 将引用转换为指针

3.3 引用与指针的区别

  • 引用必须在声明时初始化,而指针可以在声明后初始化。
  • 引用只能绑定到一个变量上,一旦初始化后,就不能绑定到其他变量。指针可以重新赋值,指向不同的变量。
  • 引用不能为空(null),而指针可以为空(null)。

4. 指针和引用在实际编程中的应用场景

4.1 函数参数传递

指针和引用都可以用于函数参数传递,以实现对函数外部变量的间接访问和操作。

void modifyValue(int *p) {*p = 20;
}
void modifyValue(int &r) {r = 20;
}

4.2 动态内存分配

使用指针进行动态内存分配和释放。

int *p = new int(10);
delete p;

5. 指针和引用相关的问题与陷阱

空指针解引用: 解引用空指针会导致未定义行为,可能导致程序崩溃。

int *p = NULL;
int num = *p; // 未定义行为

野指针: 使用野指针会导致程序行为不确定,可能造成数据丢失或程序崩溃。

int *p = NULL;
*p = 10; // 野指针

引用循环引用: 两个引用相互引用会导致循环依赖,可能导致程序崩溃。

int num = 10;
int &r1 = num;
int &r2 = r1;

6. 总结

指针和引用都是用于间接访问和操作内存中的数据。它们之间的主要区别在于初始化和可变性。指针可以在声明后初始化为空,可以重新赋值指向不同的变量,而引用必须在声明时初始化,且一旦初始化后不能改变。在实际编程中,指针和引用可以根据具体需求灵活使用,但要注意避免空指针和未初始化的引用。

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

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

相关文章

「CISP考试1000题精讲」CISP练习题中的6道题精讲

第一题 Kerberos 协议是一种集中访问控制协议。它能在复杂的网络环境中,为用户提供安全的单点登录服务。单点登录是指用户在网络中进行一次身份认证,便可以访问其授权的所有网络资源,而不再需要其他的认证过程,实质是消息 M 在多个应用系统之间的传递或共享。其中消息 M 是…

js 添加、删除DOM元素

1. js添加、删除DOM元素 1.1. 添加DOM元素 1.1.1. appendChild()方法 该方法添加的元素位于父元素的末尾,使用方法: parentNode.appenChild(NewNode) // parentNode是需要添加元素的容器,NewNode是新添加的元素   创建一个li元素并添加到…

系统分析师论文总结【持续更新】

2024年3月4日,新的软考规则出来,高项改为一年一次,架构师改为一年两次。 下半年考试安排,如下图(来源官网) 收集整理系统分析师论文,方便备查。 一、2010年论文 1、论软件维护及软件课维护性…

【STM32】HAL库 CubeMX 教程 --- 高级定时器 TIM1 定时

实验目标: 通过CUbeMXHAL,配置TIM1,1s中断一次,闪烁LED。 一、常用型号的TIM时钟频率 1. STM32F103系列: 所有 TIM 的时钟频率都是72MHz;F103C8不带基本定时器,F103RC及以上才带基本定时器。…

现代DevOps如何改变软件开发格局

在软件开发的早期,该过程通常是开发人员编写代码,再将其交给质量保证(QA)进行测试。这种瀑布开发方法可能会导致质量问题和延迟,因为问题是在周期后期发现的。 一、了解DevOps和测试左移 DevOps是Development和Opera…

汉字转拼音

汉字转拼英——简单实现 依赖 <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.0</version> </dependency>汉字转拼音方式1&#xff1a; import net.sourceforge.pinyin4j.Pin…

CloudStack 中 op_host_capacity 表中的 capacity_type 取值详解

在 Apache CloudStack 中&#xff0c;op_host_capacity 数据表是用于记录云平台中主机资源容量的关键表之一。该表中的 capacity_type 字段是一个重要的属性&#xff0c;它标识了不同类型的基础架构资源。下面我们将详细解析 op_host_capacity 表中 capacity_type 的各种取值及…

2k_Day2:今天是springMVC和mybatisPlus的大白话

1.我感觉&#xff0c;springboot把配置搭好了&#xff0c;就能写业务增删改查&#xff0c;然后盯好dao、service、impl、controller就好了&#xff0c;其他的事&#xff0c;用到时才会再去配置&#xff0c;不是吗&#xff1f; 2.使用mybatisplus时&#xff0c;它有很多方法&am…

解决Gradle下载过慢问题的有效方式:使用国内镜像站点

前言 在开发过程中&#xff0c;我们经常会遇到Gradle下载速度缓慢或超时的问题。作为一个强大而流行的构建工具&#xff0c;Gradle是许多项目中必不可少的一部分。然而&#xff0c;由于官方下载地址可能受网络限制影响&#xff0c;导致下载速度较慢。针对这个问题&#xff0c;…

【题解】—— LeetCode一周小结10

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结9 4.用栈实现队列 题目链接&#xff1a;232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a…

基于ACM32 MCU的电动滑板车方案了,助力低碳出行

随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已成为电…

springboot集成 mongodb以及mongodb简单工具类

前言 springboot集成 mongodb 有开箱即用的starter 因此集成还是很方便的 集成 添加依赖 <!--mongodb--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </d…

【APP逆向】酒仙网预约茅台程序,包含逆向过程详解

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:爬虫实战,零基础、进阶教学 景天的主页:景天科技苑 文章目录 酒仙网预约抢购茅台1.抓包分析,账户名和密码登录2.短信登录3.登录+茅台预约 密码登录酒仙网预约抢购茅台 目标:账号登…

退磁曲线方形度Q与膝点Hk

大家都知道衡量钕铁铁磁体性能的指标包括剩磁Br、矫顽力HcB、内禀矫顽力HcJ和最大磁能积(BH)max&#xff0c;除此之外&#xff0c;内禀曲线方向度和Hk也是磁应用工程师非常关注的两个指标&#xff0c;今天就来了解一下这两个指标的含义及影响因素。 首先我们先来回顾一下什么是…

数据库备份脚本嘎嘎香,被秀到了!

1.Oracle RMAN备份 1.1 创建目录 [oracleOEL7 ~]$ mkdir -p /u01/dbbak/script [oracleOEL7 ~]$ cd /u01/dbbak [oracleOEL7 ~]$ chown -R oracle:oinstall script[oracleOEL7 ~]$ mkdir -p /u01/dbbak/db [oracleOEL7 ~]$ mkdir -p /u01/dbbak/arch [oracleOEL7 ~]$ cd /u01…

In-Memory Key-Value Store Live Migration with NetMigrate——泛读笔记

FAST 2024 Paper 论文阅读笔记整理 问题 分布式键值存储需要在节点之间频繁迁移键值碎片&#xff0c;以对动态工作负载变化做出反应&#xff0c;从而实现负载平衡、数据局部性和服务弹性。 现有方法局限性 现有的实时迁移技术必须假设一个或多个位置作为主查询服务点&#…

某图网查看大图接口结果加密逆向之数据解密扣取

逆向网址 aHR0cHM6Ly95ZXNtenQuY29tLw 逆向链接 aHR0cHM6Ly95ZXNtenQuY29tL2JlYXV0eS8 逆向接口 aHR0cHM6Ly95ZXNtenQuY29tL2FwcC9wb3N0L3A/aWQ9MTA3NjQy 那么我们可以看到接口请求结果为加密数据&#xff0c; 需要手动解开才可以拿到数据 展示图片大图 逆向过程 请求方式&…

管易云对接打通金蝶K3-WISE调整单查询接口与新增其他出库接口

管易云对接打通金蝶K3-WISE调整单查询接口与新增其他出库接口 来源系统:管易云 管易云是上海管易云计算软件有限公司旗下的专注提供电商企业管理软件服务的品牌&#xff0c;总部位于中国上海张江高科技产业园区。管易云旗下拥有管易云C-ERP、EC-OMS、EC-WMS、B2C/B2B/BBC/微商城…

专题二 - 滑动窗口 - leetcode 3. 无重复字符的最长子串 | 中等难度

leetcode 3. 无重复字符的最长子串 leetcode 3. 无重复字符的最长子串 | 中等难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 3. 无重复字符的最长子串 | 中等难度 1. 题目详情 给定一个字符串 s…

【Java】深入解析Java中的多态性:理解方法的重写和重载

在Java编程中&#xff0c;多态性是一种重要的概念&#xff0c;它允许我们以一种通用的方式处理不同类型的对象&#xff0c;从而增强了代码的灵活性、可扩展性和可维护性。多态性的实现主要通过方法的重写和重载&#xff0c;在本文中我们将深入探讨这两种机制的原理、使用方法以…