C++中的双指针和三指针

目录

摘要

双指针(Double Pointers)

含义

使用场景

三指针(Triple Pointers)

含义

使用场景

总结

双指针的详细说明

三指针的详细说明


摘要

在C++中,双指针和三指针分别是指向指针的指针和指向指向指针的指针。它们的主要作用是处理复杂的数据结构、动态内存分配以及通过函数参数修改指针。它们的详细解释、使用场景以及具体示例,我有贴一些代码在相关内容下面。(仅供参考使用)

双指针(Double Pointers)

含义

双指针是指向指针的指针,声明形式如下:

int **ptr;

这里,`ptr` 是一个双指针,它保存的是一个指针的地址,该指针指向一个整数。

使用场景

1. 动态二维数组:
   双指针可以用来动态分配和管理二维数组。

#include <iostream>
using namespace std;int main() {int rows = 3, cols = 4;int **array = new int*[rows];for (int i = 0; i < rows; ++i) {array[i] = new int[cols];}// 初始化并打印数组内容for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {array[i][j] = i * cols + j;cout << array[i][j] << " ";}cout << endl;}// 释放分配的内存for (int i = 0; i < rows; ++i) {delete[] array[i];}delete[] array;return 0;
}


2. 函数参数修改指针:
   通过传递双指针到函数,可以在函数中修改原始指针的值。

#include <iostream>
using namespace std;void modifyPointer(int **ptr) {*ptr = new int(10);  // 分配一个新整数并修改原始指针以指向它
}int main() {int *p = nullptr;modifyPointer(&p);   // 将指针的地址传递给函数cout << *p << endl;  // 输出应该是 10delete p;            // 释放分配的内存return 0;
}


3. 复杂数据结构:
   双指针常用于实现链表、树等复杂数据结构的插入和删除操作。

// 二维链表
#include <iostream>
using namespace std;// 定义二维链表节点的结构
struct Node {int value;Node* right;Node* down;Node(int val) : value(val), right(nullptr), down(nullptr) {}
};// 创建简单二维链表的函数
Node* create2DLinkedList(int rows, int cols) {Node* head = new Node(0);Node* rowNode = head;for (int i = 0; i < rows; ++i) {Node* colNode = rowNode;for (int j = 0; j < cols; ++j) {if (j > 0) {colNode->right = new Node(i * cols + j);colNode = colNode->right;}}if (i > 0) {rowNode->down = new Node(i * cols);rowNode = rowNode->down;}}return head;
}// 打印二维链表的功能
void print2DLinkedList(Node* head) {Node* rowNode = head;while (rowNode != nullptr) {Node* colNode = rowNode;while (colNode != nullptr) {cout << colNode->value << " ";colNode = colNode->right;}cout << endl;rowNode = rowNode->down;}
}// 删除二维链表和释放内存的功能
void delete2DLinkedList(Node* head) {Node* rowNode = head;while (rowNode != nullptr) {Node* colNode = rowNode;while (colNode != nullptr) {Node* tempCol = colNode;colNode = colNode->right;delete tempCol;}Node* tempRow = rowNode;rowNode = rowNode->down;delete tempRow;}
}int main() {int rows = 3, cols = 4;Node* head = create2DLinkedList(rows, cols);cout << "2D Linked List Values:" << endl;print2DLinkedList(head);delete2DLinkedList(head);return 0;
}

三指针(Triple Pointers)

含义

三指针是指向指向指针的指针,声明形式如下:

int ***ptr;

这里,`ptr` 是一个三指针,它保存的是一个双指针的地址,该双指针指向一个指针,该指针指向一个整数。

使用场景

1. 动态三维数组:
   三指针可以用来动态分配和管理三维数组。

#include <iostream>
using namespace std;int main() {int x = 3, y = 4, z = 2;int ***array = new int**[x];for (int i = 0; i < x; ++i) {array[i] = new int*[y];for (int j = 0; j < y; ++j) {array[i][j] = new int[z];}}// 初始化并打印数组for (int i = 0; i < x; ++i) {for (int j = 0; j < y; ++j) {for (int k = 0; k < z; ++k) {array[i][j][k] = i * y * z + j * z + k;cout << array[i][j][k] << " ";}cout << endl;}cout << endl;}// 释放分配的内存for (int i = 0; i < x; ++i) {for (int j = 0; j < y; ++j) {delete[] array[i][j];}delete[] array[i];}delete[] array;return 0;
}


2. 更复杂的数据结构:
   在一些极其复杂的数据结构中,可能需要三指针来管理多级嵌套的指针关系。

// 三维链表
#include <iostream>
using namespace std;// 定义三维链表节点的结构
struct Node {int value;Node* nextX;Node* nextY;Node* nextZ;Node(int val) : value(val), nextX(nullptr), nextY(nullptr), nextZ(nullptr) {}
};// 创建三维链表的函数
Node* create3DLinkedList(int xSize, int ySize, int zSize) {Node* head = new Node(0);Node* xNode = head;for (int i = 0; i < xSize; ++i) {Node* yNode = xNode;for (int j = 0; j < ySize; ++j) {Node* zNode = yNode;for (int k = 0; k < zSize; ++k) {if (k > 0) {zNode->nextZ = new Node((i * ySize * zSize) + (j * zSize) + k);zNode = zNode->nextZ;}}if (j > 0) {yNode->nextY = new Node((i * ySize * zSize) + (j * zSize));yNode = yNode->nextY;}}if (i > 0) {xNode->nextX = new Node(i * ySize * zSize);xNode = xNode->nextX;}}return head;
}// 打印三维链表的功能
void print3DLinkedList(Node* head, int xSize, int ySize, int zSize) {Node* xNode = head;for (int i = 0; i < xSize; ++i) {Node* yNode = xNode;for (int j = 0; j < ySize; ++j) {Node* zNode = yNode;for (int k = 0; k < zSize; ++k) {cout << zNode->value << " ";zNode = zNode->nextZ;}cout << endl;yNode = yNode->nextY;}cout << endl;xNode = xNode->nextX;}
}// 删除三维链表和释放内存的功能
void delete3DLinkedList(Node* head) {Node* xNode = head;while (xNode != nullptr) {Node* yNode = xNode;while (yNode != nullptr) {Node* zNode = yNode;while (zNode != nullptr) {Node* tempZ = zNode;zNode = zNode->nextZ;delete tempZ;}Node* tempY = yNode;yNode = yNode->nextY;delete tempY;}Node* tempX = xNode;xNode = xNode->nextX;delete tempX;}
}int main() {int xSize = 3, ySize = 3, zSize = 3;Node* head = create3DLinkedList(xSize, ySize, zSize);cout << "3D Linked List Values:" << endl;print3DLinkedList(head, xSize, ySize, zSize);delete3DLinkedList(head);return 0;
}


3. 高级指针操作:
   在某些高级算法和系统编程中,三指针可能被用到。

总结

双指针的详细说明

1. 声明和初始化:
   - 双指针的声明形式是 `type **ptr;`,例如 `int **ptr;`。
   - 初始化时,可以通过动态内存分配来创建指向指针的指针。

2. 动态二维数组的使用:
   - 分配内存:使用循环为每一行分配内存。
   - 访问元素:通过双重下标访问数组元素,如 `array[i][j]`。
   - 释放内存:首先释放每一行的内存,然后释放指针数组。

3. 函数参数修改指针:
   - 通过传递指针的地址到函数中,可以在函数内部修改指针的值。
   - 示例代码展示了如何在函数中分配新内存并修改原始指针。

三指针的详细说明

1. 声明和初始化:
   - 三指针的声明形式是 `type ***ptr;`,例如 `int ***ptr;`。
   - 初始化时,可以通过多级动态内存分配来创建指向指向指针的指针。

2. 动态三维数组的使用:
   - 分配内存:使用嵌套循环为每一维度分配内存。
   - 访问元素:通过三重下标访问数组元素,如 `array[i][j][k]`。
   - 释放内存:首先释放最内层的数组,然后逐级向外释放。

我们通过理解和掌握双指针和三指针的概念及使用方法,可以有效地处理C++中的复杂数据结构和多级动态内存分配。当然也可以更加灵活的设计出一些复杂的数据结构和算法,方便我们的技能提升。但关键点都在于内存的管理和对指针的操作及修改。

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

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

相关文章

C. Swap Adjacent Elements 题解

C. Swap Adjacent Elements 题解 S A E 题目大意思路代码题目大意 输入格式: 第一行一个整数 n n n ( 2 ≤ (2≤ (2≤ n n n ≤ 200000 ) ≤200000) ≤200000) 第二行 n个整数 a 1 a_1 a1​, a 2 a_2 a2​

redis 允许外网访问

要使Redis服务器允许外网访问&#xff0c;可以遵循以下步骤进行配置&#xff1a; 编辑Redis配置文件&#xff1a; 找到Redis的配置文件&#xff0c;通常位于/etc/redis/redis.conf&#xff0c;但位置可能因安装方式和操作系统而异。取消绑定本地地址&#xff1a;在配置文件中&a…

Charles-ios无法抓包原因之一证书

VPN证书安装完成后依然无法抓包存在无网络问题 VPN安装证书后直接抓包这时候抓包接口返回无网络&#xff0c;原因是IOS通用-关于本机-证书信任设计未开启信任

webpack5零基础入门-19HMR的应用

1.定义 HMR即HotModuleReplacement 开发时&#xff0c;当我们修改了其中一个模块的代码webpack默认会将所有模块重新打包编译&#xff0c;速度很慢所以我们需要做到修改摸个模块代码&#xff0c;只对这个模块的代码重新打包编译&#xff0c;其他模块不变&#xff0c;这样打包…

elementUI dialog 组件二次封装 before-close 回调函数作用

before-close 弹框关闭前的回调函数&#xff0c;父组件可以向子组件传递一个函数&#xff0c;用于修改子组件内的变量变量。应用场景如下&#xff1a; 1、封装 dialog 组件为 baseDialog&#xff0c;页面中使用 baseDialog 组件。 2、封装 dialog 组件为 baseDialog&#xff…

OpenAI和Anthropic在人工智能领域各自进行着不同的工作,以下是对它们工作内容的清晰归纳

OpenAI和Anthropic在人工智能领域各自进行着不同的工作&#xff0c;以下是对它们工作内容的清晰归纳&#xff1a; OpenAI&#xff1a; 公司背景与使命&#xff1a; 成立于2015年12月11日&#xff0c;总部位于美国旧金山。是一家由营利性公司OpenAI LP及非营利性母公司OpenAI …

ubuntu20.04部署gitlab流程

参考&#xff1a; https://blog.csdn.net/weixin_57025326/article/details/136048507 362 wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/ubuntu/focal/gitlab-ce_16.2.1-ce.0_amd64.deb/download.deb367 sudo apt install gitlab-ce…

初识Spring Boot:构建项目结构与组件解析

目录 前言 第一点&#xff1a;项目的结构 第二点&#xff1a;controller类的创建与使用&#xff08;构造器&#xff09; 第二点&#xff1a;service类的创建与使用&#xff08;逻辑层&#xff09; 第三点&#xff1a;Mapper类的创建与使用(数据操作) 总结 前言 在进行Sp…

【稳定检索】2024年心理学与现代化教育、媒体国际会议(PMEM 2024)

2024年心理学与现代化教育、媒体国际会议 2024 International Conference on Psychology and Modern Education and Media 【1】会议简介 2024年心理学与现代化教育、媒体国际会议即将召开&#xff0c;这是一场汇聚全球心理学、教育及媒体领域精英的学术盛宴。 本次会议将深入探…

目前最强的AI绘画工具 DALL-E、Stable Diffusion 和 Midjourney工具对比

大家好&#xff0c;我是AIGC的实践者SKY&#xff0c;今天和大家来聊聊DALL-E、Stable Diffusion和Midjourney。 随着人工智能技术的飞速发展&#xff0c;艺术生成工具如DALL-E、Stable Diffusion和Midjourney等&#xff0c;已经成为创意产业的新宠。这些工具利用深度学习算法&…

618适合入手哪些数码好物?实用数码好物清单分享,错过拍烂大腿!

在一年一度的618购物狂欢节里&#xff0c;许多数码爱好者们都在这次盛大的购物盛宴中觅得心仪的数码好物&#xff0c;数码产品不仅改变了我们的生活方式&#xff0c;更让我们享受到了前所未有的便捷和乐趣&#xff0c;那么在这个618&#xff0c;哪些数码好物值得我们入手呢&…

ER图介绍

在数据库设计和建模中&#xff0c;实体-关系图&#xff08;Entity-Relationship Diagram&#xff0c;简称ER图&#xff09;是一个至关重要的工具。ER图通过图形化的方式描述了现实世界中的实体&#xff08;Entity&#xff09;及其之间的关系&#xff08;Relationship&#xff0…

Java实战入门:深入解析Java中的`String.split`方法

文章目录 一、方法定义参数说明返回值 二、使用场景三、实现原理无限制分割限制分割 四、示例代码示例一&#xff1a;基本分割示例二&#xff1a;使用正则表达式分割示例三&#xff1a;限制分割次数示例四&#xff1a;保留空字符串 五、注意事项六、总结 在Java编程中&#xff…

oracle中的INTERVAL函数学习总结

Oracle 从9i数据库开始引入了一种新特性&#xff0c;可以用来存储时间间隔&#xff0c;出现了INTERVAL 函数。这个函数的表达式比较多&#xff0c;初学比较费劲不好掌握&#xff0c;经过以几个小时的查阅资料和实验&#xff0c;总结如下&#xff1a; interval year t…

python绘制北京汽车流量热力图:从原理到实践

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、热力图绘制原理 三、热力图绘制实践 1. 数据准备 2. 地图组件选择 3. 数据…

建WordPress主题官网模板

蓝色的中文WordPress企业模板 https://www.zhanyes.com/qiye/6305.html 暗红色WordPress律师事务所网站模板 https://www.zhanyes.com/qiye/23.html 红色大banner图WordPress外贸网站模板 https://www.zhanyes.com/waimao/27.html

显示器控制变频器编程软件:深入探索与实用指南

显示器控制变频器编程软件&#xff1a;深入探索与实用指南 在工业自动化日益发展的今天&#xff0c;显示器控制变频器编程软件以其高效、直观的特点&#xff0c;成为控制电机转速和工作模式的关键工具。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;对这一技术…

通过 CXCR4 靶向纳米线修补细胞表面以抑制癌症转移

引用信息 文 章&#xff1a;Cell surface patching via CXCR4-targeted nanothreads for cancer metastasis inhibition. 期 刊&#xff1a;Nature Communications&#xff08;影响因子&#xff1a;16.6&#xff09; 发表时间&#xff1a;2024/3/29 作 者&#xff1…

HttpSecurity 是如何组装过滤器链的

有小伙伴们问到这个问题&#xff0c;简单写篇文章和大伙聊一下。 一 SecurityFilterChain 首先大伙都知道&#xff0c;Spring Security 里边的一堆功能都是通过 Filter 来实现的&#xff0c;无论是认证、RememberMe Login、会话管理、CSRF 处理等等&#xff0c;各种功能都是通…

virtual cache基本概念

Virtual cache的引入 TLB只是加速了从虚拟地址到物理地址的转换,可以很快地得到所需要的数据(或指令)在物理内存中的位置,也就是得到了物理地址但是,如果直接从物理内存中取数据(或置指令),显然也是很慢的,因此可以使用在以前章节提到的Cache来缓存物理地址到数据的转换过程。实…