C++二级指针的用法指向指针的指针(多级间接寻址)

        指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。

        指针的指针就是将指针的地址存放在另一个指针里面。

        通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。        

       一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int 类型指针的指针:

int **var;

          当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符,如下面实例所示:

#include <iostream>using namespace std;int main ()
{int  var;int  *ptr;int  **pptr;var = 3000;// 获取 var 的地址ptr = &var;// 使用运算符 & 获取 ptr 的地址pptr = &ptr;// 使用 pptr 获取值cout << "var 值为 :" << var << endl;cout << "*ptr 值为:" << *ptr << endl;cout << "**pptr 值为:" << **pptr << endl;return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

var 值为 :3000
*ptr 值为:3000
**pptr 值为:3000

在 C++ 程序中,指针可以指向基本数据类型,如整型或字符型,从而允许我们访问这些数据。由于指针本身也是存储在内存中的变量,它记录着数据的内存地址,因此指针也可以指向另一个指针,即指向指针的指针。

        虽然这个概念初听起来有些复杂,但可以这样理解,指针本质上是一个存储内存地址的变量,当有一个指针变量存储了另一个指针变量所在内存的地址时,我们就称这个指针为“指向指针的指针”,又称为二级指针。

为了更清晰地展示这一概念,下面是一个实际的例子:

int N = 2;
int* pN = &N;     // 定义一个指针变量pN,记录变量N所在的内存地址
int** ppN = &pN;  // 定义一个指针变量ppN,记录指针变量pN所在的内存地址

        在这段代码中,首先定义了一个整型变量 N,然后定义了一个整型指针指向这个变量 N。换句话说,这个指针的值就是整型变量 N 在内存中的地址。最后,指向指针的指针 ppN 登场了,我们用 int** 作为数据类型定义了一个指针 ppN,其中保存的就是 pN 指针变量所在内存中的地址,也就是它指向这个整型指针 pN。

        下图展示了这三个变量之间的关系

图 1 指向指针的指针

        从图 1 中可以看到,变量 N 保存在内存地址 0016FA38 这个位置,而指针变量 pN 记录的值是 N 所在的内存位置 0016FA38,同时它自己保存在内存地址 0016FA5C 这个位置。

        同理,作为指向 pN 的指针,ppN 这个指针变量记录的值是 pN 所在内存地址 0016FA5C 的位置,而它自己保存在内存地址 0016FA90 这个位置。

        简单来讲,普通指针指向的是一个具体的数据,而指针的指针指向的是一个指针数据,我们可以把指针数据也当作某个具体的数据,它也有自己的数据类型(例如 int*),也占用一定的内存(例如 0016FA5C),记录一定的数值(例如 0016FA37)。类比普通数据,指向指针的指针的数据类型,就是在它所指向的数据的类型之后加一个“*”。

        例如,我们要定义一个指针指向另一个 int* 类型的指针,那么它自身的类型就是 int* 加一个“*”就成了 int**。而这个指针的值,同样是用“&”取得被指向的指针变量的地址赋给它,于是它就成为指向这个指针的指针。

        在 C++ 中,可以用下面的语法格式来定义一个二级指针:

数据类型** 指针变量名

其中,数据类型表示它所指向的指针的数据类型。例如:

  • int** ppN = &pN;

            这样就定义了一个指向整型指针的二级指针 ppN,它指向另一个指针变量 pN,而 pN 指针变量又指向一个整型变量。

            二级指针通常用来访问指针数组。数组不仅可以保存基本数据类型的数据,还可以保存指针,保存指针的数组被称为指针数组。如果要访问一个指针数组,使用二级指针最为方便。

// 这是一个指针数组,其中保存的是各个字符串常量的首地址指针,其类型是 const char*
const char* arrMonth[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};// 定义一个指向指针的指针
// 因为要指向的指针是 const char*类型,所以加上*后它自身的类型就是 const char**
// 这里数组的首地址 arrMonth 就是数组的第一个元素
// 也就是指向第一个字符串 “Jan” 的指针
const char** pMonth = arrMonth;// 获取用户输入
int nIndex = 0;
cout << "请输入月份对应的数字: " << endl;
cin >> nIndex;
// 对指针进行运算,使其指向相应的数组元素
// 也就是相应的字符串指针
const char* pCurMonth = *(pMonth + (nIndex - 1));
cout << "对应的月份是: " << pCurMonth << endl;

        在以上这段代码中,arrMonth 数组中保存的是多个字符串常量的指针,这些指针的数据类型是 const char*

        为了利用指针偏移方便地访问数组中的各个字符串,我们需要一个可以指向这些字符串元素的指针,因为字符串元素的类型是 const char*,所以我们定义了一个 const char** 类型的二级指针 pMonth,并将字符串数组的首地址赋值给它,使其指向字符串数组的第一个元素。然后通过对 pMonth 进行运算,让其偏移指向数组中所对应的字符串元素。

        指针运算后得到的仍然是指针,我们需要用“*”符号取得这个指针所指向的内容,才能得到对应的字符串指针,直接输出就可以得到数字对应的月份字符串

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

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

相关文章

【格与代数系统】示例

【格与代数系统】格与代数系统汇总 例1 设是由诱导的代数系统&#xff0c;则其上的二元运算满足&#xff08;ABCD&#xff09; A. B. C. D. 代数系统满足交换律、幂等律、吸收律、结合律 例2 是&#xff08;ABCD&#xff09; A.有界格 有界格&#xff1a;有最大、最小元…

Stable Diffusion 项目实战落地:手机壁纸制作-第一篇 从零基础到生成艺术品的第一步!

大家好!欢迎来到《StableDiffusion实战-手机壁纸制作》系列的第一篇! 在这一篇文章里,我们将一起探索如何用StableDiffusion(SD)这款强大的工具,快速制作出炫酷的手机壁纸。 如果你对生成艺术、AI绘图感兴趣,那你一定不能错过! 你能做什么?你将做什么! 在之前的系…

WEB3开启 Hardhat 自动验证有什么意义

这是个非常好的问题&#xff0c;尤其是你在学习 Web3 后端开发时&#xff0c;理解为什么要启用 Hardhat 自动验证合约源码&#xff0c;会让你开发流程更完整、更专业。 ✅ 一句话总结&#xff1a; 开启 Hardhat 自动验证的意义是&#xff1a;让你的合约在区块链浏览器&#xff…

Qt窗⼝的学习(一)

Qt窗⼝是通过QMainWindow类来实现的。 QMainWindow是⼀个为⽤⼾提供主窗⼝程序的类&#xff0c;继承⾃QWidget类&#xff0c;并且提供了⼀个预定义的 布局。QMainWindow包含⼀个菜单栏&#xff08;menubar&#xff09;、多个⼯具栏(toolbars)、多个浮动窗⼝&#xff08;铆 接部…

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

&#x1f4da; 本文主要总结了一些常见的C面试题&#xff0c;主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能&#xff0c;掌握这些内容&#xff0c;基本上就满足C的岗位技能&#xff08;红色标记为重点内容&#xff09;&#xff0c;欢迎大家前来学习指正&…

git提交的脚本无执行权限怎么办

问题描述 自己写的小项目&#xff0c;没有在服务器安装 Jenkins 进行项目部署&#xff0c;为了图方便&#xff0c;在项目中编写了一个 deploy.sh 脚本文件用来执行项目部署。但是在服务器上 pull 下来之后发现脚本文件没有执行权限&#xff0c;通过 chmod 命令进行赋权&#x…

004.chromium编译进阶-启动时传入cookies

一、目标&#xff1a; 实现传入参数--set-cookies[{"domain":"https://baidu.com","name":"AAAA","value":"111"},{"domain":"https://baidu.com","name":"BBB","…

【数据库复习】

数据库复习题 一、填空题1&#xff0e;数据库系统一般由&#xff08;数据库&#xff09;、应用系统、&#xff08;数据库管理系统&#xff09;、&#xff08;数据库管理员&#xff09;和用户构成。2&#xff0e;数据模型通常由&#xff08;数据结构&#xff09;、&#xff08;数…

微信小程序:选择页面单选实现(多页面均可选择)

一、效果展示 1、主页面 展示了两个选择行 2、选择页面 根据传递的参数决定员工展示的数据,并且单选,可将数据传递给主页面 二、主页面实现 1、视图层 写入了采购员和库管员的行选择信息 <view class="item flex flex-between"><view class="i…

使用docker-compose搭建redis-cluster集群

前言 如果你也因为centos的gcc版本落后导致redis编译安装不通过而烦恼&#xff0c;大可以试一试用docker去搭建redis集群。本文以单节点搭建redis-cluster三主三从为例。 ip&#xff1a;192.168.0.10redis信息&#xff1a; 客户端连接端口&#xff1a;7001 -7006集群间通信端…

【LLaMA-Factory 实战系列】二、WebUI 篇 - Qwen2.5-VL 多模态模型 LoRA 微调保姆级教程

【LLaMA-Factory 实战系列】二、WebUI 篇 - Qwen2.5-VL 多模态模型 LoRA 微调保姆级教程 1. 引言1.1 为什么选择 Qwen2.5-VL-3B-Instruct&#xff1f;1.2 环境要求 2. 环境搭建2.1 安装 LLaMA-Factory2.2 验证安装 3. 数据集准备与配置3.1 数据集结构3.2 数据格式3.3 数据集声明…

风险矩阵与灰色综合评价

一、风险矩阵&#xff08;Risk Matrix&#xff09; 1. 定义与原理 定义&#xff1a;风险矩阵是一种通过二维网格&#xff08;可能性 vs. 后果严重程度&#xff09;可视化展示风险等级的工具&#xff0c;用于优先级排序和决策支持。核心要素&#xff1a; 横轴&#xff08;X轴&…

谷歌浏览器电脑版官方下载- Google Chrome官方网页版入口

谷歌浏览器&#xff08;Google Chrome&#xff09;是一款由谷歌公司开发的免费网页浏览器&#xff0c;自2008年首次发布以来&#xff0c;迅速成为全球最受欢迎的浏览器之一。它以简洁的界面设计、快速的浏览速度和强大的安全性能而闻名。谷歌浏览器支持多种操作系统&#xff0c…

垂直电商供应链平台:重构产业生态,驱动数字化增长

垂直电商供应链平台&#xff1a;重构产业生态&#xff0c;驱动数字化增长 在电商行业竞争日益激烈的当下&#xff0c;垂直电商供应链平台凭借对细分领域的深度聚焦与数字化能力&#xff0c;成为产业升级的关键引擎。本文围绕垂直电商供应链平台的架构、价值及生态构建展开&…

VSCode 插件 Remote - SSH:开启高效远程开发之旅

在当今的软件开发领域&#xff0c;远程开发已经成为了一种越来越流行的工作方式。无论是分布式团队协作&#xff0c;还是需要在不同环境中进行开发&#xff0c;远程开发都能为开发者带来极大的便利。而 VSCode 的 Remote - SSH 插件&#xff0c;就是一款能够帮助开发者实现高效…

亚矩阵云手机+Whatnot:直播电商的自动化增长引擎

在直播电商蓬勃发展的今天&#xff0c;Whatnot作为北美领先的收藏品和潮流商品拍卖平台&#xff0c;吸引了大量卖家和收藏爱好者。然而&#xff0c;高效运营多个账号、管理直播场次、优化出价策略等挑战&#xff0c;让许多商家难以规模化经营。​​亚矩阵云手机​​与​​Whatn…

关于vue.mixin与vue.use的用法分析

背景。源码不会读&#xff0c;不清楚的问大模型。特别是对平常开发太会用到的情形。 vue.mixin。是将每一个页面注入mixin的内容。会对页面中注入$uStore而不是方便获取状态信息。 vue.use。按装的插件。用于封装完整的功能&#xff0c;如UI库&#xff0c;路由拦截器等&…

MySQL 8.x配置MGR高可用+ProxySQL读写分离(二):ProxySQL配置MySQL代理及读写分离

#作者&#xff1a;stackofumbrella 文章目录 ProxySQL简介ProxySQL架构ProxySQL的安装与配置在不同层次间移动配置 ProxySQL简介 ProxySQL是基于MySQL的一款开源的中间件的产品&#xff0c;是一个灵活的MySQL代理层&#xff0c;可以实现读写分离&#xff0c;支持Query路由功能…

基于 Python Flask 的 B/S 架构项目的软件设计思路

文章目录 基于 Python Flask 的 B/S 架构项目的软件设计思路1. 引言2. B/S架构概述2.1 什么是B/S架构2.2 B/S架构的组成层次2.3 B/S vs C/S架构对比2.4 现代B/S架构的发展趋势 3. Flask在B/S架构中的定位3.1 Flask作为B/S架构的后端框架3.2 Flask的架构优势3.3 Flask在不同B/S架…

AntV F2入门教程

以下教程将系统地介绍 AntV F2&#xff08;移动端可视化引擎&#xff09;的核心 组件 API&#xff0c;包含安装与引入、画布与图表、数据映射、几何标记、坐标轴、图例、提示、标注和滚动条等&#xff0c;每个 API 都附带完整示例代码&#xff0c;帮助你快速掌握 F2 用法。 一…