全面理解:C++中的指针和迭代器,以及解引用操作符(*)和箭头操作符(->)的用法
指针与迭代器的基础概念
指针:
指针是一种变量
,其值为另一种类型的对象在计算机内存中的地址。你可以使用指针来直接访问和操作它指向的对象。指针的使用非常强大,但也很危险,因为你有可能错误地操作内存,这可能会导致程序崩溃或其他不可预期的行为。
迭代器:
迭代器是一种对象
,它能够遍历并操作某种数据结构(如数组、列表、集合等)中的元素。每种数据结构都可能有自己专用的迭代器。迭代器的好处是它为处理各种数据结构提供了统一的接口,并提供了一种保护机制,使你不必直接处理内存。- 它可以被视为一个高级的指针,因为它提供了类似指针的功能,例如指向容器中的特定位置、访问该位置的元素等操作。
- 迭代器不仅限于指向类或结构体,它可以指向任何类型的对象。
两者的基本用法示例:
int arr[] = {1, 2, 3, 4, 5}; // 数组// 指针使用
int* p = arr;
cout << *p << endl; // 输出 1
p++; // 移动指针
cout << *p << endl; // 输出 2// 迭代器使用
vector<int> v(arr, arr+5); // 将数组转换为向量
vector<int>::iterator it = v.begin();
cout << *it << endl; // 输出 1
it++; // 移动迭代器
cout << *it << endl; // 输出 2
从这里我们就看出了指针与迭代器本质上的区别,那就是指针是一个变量,而迭代器是一个对象
。
解引用符 * 与 箭头符 ->的基础概念
在 C++ 中,解引用符号(*)和箭头操作符(->)都与指针相关,但它们在实际使用中具有不同的含义和用途。
解引用操作符():
- 在 C++ 中,解引用操作符()用于获取指针所指向的对象的值。也就是说,如果我们有一个指向某个对象的指针,我们可以通过解引用操作符来访问或修改该对象的值。例如:
int x = 10;
int* ptr = &x; // ptr 是一个指向整数 x 的指针
std::cout << *ptr; // 这将输出 10,因为 *ptr 代表指针 ptr 所指向的值。
箭头操作符(->):
- 箭头操作符(->)在 C++ 中用于访问指针(或智能指针)指向的对象的成员。这通常在处理指向结构或类的指针时使用。它其实是对“解引用然后访问成员”的一种简化形式。例如,如果你有一个指向对象的指针,而该对象有一个名为 ‘val’ 的成员,你可以使用箭头操作符来访问或修改 ‘val’ 的值。例如:
struct MyStruct {int val;
};MyStruct obj;
obj.val = 10;MyStruct* ptr = &obj; // ptr 是一个指向 obj 的指针
std::cout << ptr->val; // 这将输出 10,因为 ptr->val 访问的是 ptr 指向的对象的 val 成员。
- 在这里,
箭头操作符(->)实际上是两个操作的简写:首先解引用指针(*ptr),然后访问解引用后对象的成员(.val)。以上面的代码为例,ptr->val 相当于 (*ptr).val。
- 在一定程度上,你可以把迭代器看作是指针的一种通用、更高级的形式。
总的来说,解引用操作符(*)和箭头操作符(->)都与指针操作相关,但它们的用法和上下文有所不同。解引用操作符用于获取指针指向的对象的值,而箭头操作符用于访问指针指向的对象的成员。
解引用符与箭头符在指针与迭代器上的用法区别
C++中的解引用操作符(*)和箭头操作符(->)的用法在指针和迭代器中都有所体现,但其具体行为取决于它们操作的对象类型。
-
对于指针,
操作符*用于获取指针指向的对象,而操作符->用于访问指针指向的对象的成员。
-
对于迭代器,
操作符*同样用于获取迭代器指向的对象,而操作符->则用于访问迭代器指向的对象的成员
(只有在该对象是类或结构时才能这样做)。
在list、unordered_map的具体示例。
list的具体示例
#include <iostream>
#include <list>struct Test {int val;Test(int v) : val(v) {}
};int main() {std::list<Test> l;l.push_back(Test(10));std::list<Test>::iterator it = l.begin();std::cout << (*it).val << std::endl; // 输出 10std::cout << it->val << std::endl; // 输出 10return 0;
}
- 在这个例子中,我们首先创建了一个list,然后使用迭代器来访问列表中的元素。注意,在list中,迭代器只支持++和–操作。
unordered_map 的具体示例
#include <iostream>
#include <unordered_map>int main() {std::unordered_map<std::string, int> um;um["one"] = 1;std::unordered_map<std::string, int>::iterator it = um.begin();std::cout << (*it).first << ": " << (*it).second << std::endl; // 输出 one: 1std::cout << it->first << ": " << it->second << std::endl; // 输出 one: 1return 0;
}
- 在这个例子中,我们首先创建了一个unordered_map,然后使用迭代器来访问其元素。在unordered_map中,每个元素都是一个键值对,我们可以使用->first和->second来访问键和值。
总结
我们主要讨论了C++中的指针和迭代器,以及解引用操作符(*)和箭头操作符(->)的用法。
指针和迭代器:
-
指针是一种变量,它存储了另一种类型的对象在内存中的地址。通过指针,你可以直接访问和修改它指向的对象。
-
迭代器是一种专门的对象,它可以被视为一个高级的指针,因为它提供了类似指针的功能,例如指向容器中的特定位置、访问该位置的元素等操作。
迭代器不仅限于指向类或结构体,它可以指向任何类型的对象。- 对于迭代器,如果迭代器指向的对象是类或结构体,你可以使用->操作符来访问该对象的成员。
- 对于指向基本类型的迭代器,你只能使用操作符来获取迭代器指向的值,而不能使用->操作符访问成员,因为基本类型没有成员。
**解引用操作符()和箭头操作符(->):**
-
解引用操作符(*)用于获取指针或迭代器指向的对象。
-
箭头操作符(->)用于访问指针或迭代器指向的对象的成员。
-
我们使用多个示例演示了这些概念,包括在不同类型的容器(如数组、向量、列表、无序映射等)中,以及在嵌套数据结构中的应用。
总的来说,理解指针和迭代器,以及如何使用解引用和箭头操作符,对于编写有效和正确的C++代码是非常重要的。
最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容
。
相关文章:

全面理解:C++中的指针和迭代器,以及解引用操作符(*)和箭头操作符(->)的用法
指针与迭代器的基础概念 指针: 指针是一种变量,其值为另一种类型的对象在计算机内存中的地址。你可以使用指针来直接访问和操作它指向的对象。指针的使用非常强大,但也很危险,因为你有可能错误地操作内存,这可能会导致…...

Vite 使用学习指南
Vite 的基本概念和特点 Vite 是什么,它的主要特点是什么 Vite 是一个基于 ES modules 的前端构建工具,它的主要特点包括: 快速的冷启动:Vite 采用了基于浏览器原生 ES 模块的开发模式,可以在开发时快速启动应用&…...

【算法训练(day6)】双指针模板
一.双指针算法的由来和使用场景 通常情况下我们可能会遇到在某些可遍历的集合中寻找满足某种性质的字串或元素。这时候我们采取暴力的思路就会面临多重循环。我们可以利用题目中所给的集合并利用其性质将多重循环降成一重循环。光用语言描述可能不太好理解。接下来看几个双指针…...

免费常用的API接口大全
免费常用的API接口大全 OPEN AI : ChatGPT 能够模拟人类的语言行为,与用户进行自然的交互。ChatGPT 可以用于处理多种类型的对话,包括对话机器人、问答系统和客服机器人等。它还可以用于各种自然语言处理任务,比如文本摘要、情感分…...

【HTML】第 2 节 - HTML 标签
欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、标题标签 3、段落标签 4、文本格式化标签 5、图像标签 5.1、基本作用 5.2、属性 6、超链接标签 7、音频标…...

MATLAB算法实战应用案例精讲-【数模应用】残差检验(附Java、python和MATLAB代码)
目录 几个高频面试题目 线性回归残差是否一定满足正态分布? 一般情况 特殊情况...

初学Qt(Day03)
今天概览 今天的目标是写一个动态的彩虹灯 一开始是有思路的。只是写的过程中有太多小bug了,真的是防不胜防 我的思路是: 主界面是一个开始界面,点击开始按钮之后,有一个子界面出现,显示出彩虹灯转动的效果。 内部的执…...

皮卡丘xss之htmlspecialchars、xss之href输出、xss之js输出
1.xss之htmlspecialchars htmlspecialchars()函数的功能如下: htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。 预定义的字符是: (1)& (和号)成为 & (2)…...

ArrayList和LinkedList的区别
ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。 LinkedList使用了循环双向链表数据结构。与基于数组ArrayList相比…...

记录 vue3 webpack 使用 iframe 遇到的坑
需求 我尝试用Vue3写一个自己的主页,把常用的功能集中到主页中,如下图 后发现一个好玩的东西,js实现的在网页底部出现鱼和波浪,如下图,就像想也放到自己的主页中,搜索后发现可以在Vue中用iframe标签直接引…...

华为OD机试真题 Java 实现【去除多余空格】【2023Q1 100分】
一、题目描述 去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。 条件约束: 不考虑关键词起始和结束位置为空格的场景;单词的的开始和结束下标保证涵盖一个完整的单词,即一个坐标对开始和结束…...

SAP-MM 条件类型字段解析
01、“定价类型”:定义此条件类型的代码和描述,代码不能重复,描述可更改,根据实际需要,条件类型可定制; 02、“存取顺序”:表示此条件类型在定价时,要到存取顺序号定义的条件表中读…...

C#,码海拾贝(28)——求解“对称正定方程组”的“平方根法”之C#源代码
using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…...

碳纤维单丝外径测试中的纳米分辨率激光衍射法解决方案
摘要:碳纤维单丝热膨胀系数是碳纤维复合材料设计、生产与可靠性和寿命评估的重要参数,本文针对单丝径向高温热膨胀系数测试这一难题提出了相应的解决方案。解决方案的核心内容是基于激光衍射法和高温辐射加热,并采用衍射轮廓拟合技术以及相应…...

服务(第三十二篇)nginx做缓存服务器
nginx作为缓存服务配置语法 1、proxy_cache_path 配置语法(即缓存路径配置语法) Syntax:proxy_cache_path path [levelslevels] [use_temp_pathon|off] keys_zonename:size [inactivetime] [max_sizesize] [manager_filesnumber] [manager_s…...

Java 集合、数组、字符串的相互转换(关于list.toArray(new String[0])的源码分析)
在 Java 中,可以通过以下方式实现集合、数组和字符串之间的相互转换。 一、集合和数组的相互转化 ①、将集合转为数组:(toArray 方法) List<String> list new ArrayList<>(); list.add("apple"); lis…...

Redis的全局命令及相关误区
Redis中所说的数据结构是针对key-value中的value而言的。主要的结构包括String、哈希表、列表、集合等等在redis中存在16个库,涉及到后期的集群搭建只能使用0号库最为方便 查看所有键(支持通配符) keys * keys S*返回当前数据库中的键总数 …...

C++核心编程—类和对象,类的三大特性——封装、继承、多态
纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 💬文章目录 一.类和对象的概念①什么是对象?②抽象和类1.类的基本概念2.类的声明与定义:3.对象的创建与使用 二.类的封装①为什么有封…...

keep-alive 是 Vue 内置的一个组件,被用来缓存组件实例。
文章目录 简介注意点使用 keep-alive 有以下优缺点优点缺点 简介 keep-alive 是 Vue 内置的一个组件,被用来缓存组件实例。 使用 keep-alive 包裹动态组件时,被包裹的组件实例将会被缓存起来,而不会被销毁,直到 keep-alive 组件…...

(八)Spring之IOC控制反转、DI依赖注入介绍和使用(详解)
文章目录 前言SpringSpring IOC 简介BeanIOC 概述IOC 本质理解 Spring IOC 应用IOC xml装配IOC 依赖注入IOC Bean的作用域 IoC 自动装配Bean 的自动装配注解实现自动装配 IoC 使用注解开发模拟实现Spring IoC 前言 “Spring”在不同的上下文中表示不同的事物。它可以用来引用 …...

凸缺陷 convexityDefects
获取凸包,可以参考我的这篇文章: 凸包(Convex Hull)代码实现案例 获取了凸包之后,可以干什么呢? 凸缺陷凸包与轮廓之间的部分称为凸缺陷。凸缺陷可用来处理手势识别等问题。 通常情况下,使用如…...

c语言编程练习题:7-43 Shuffling Machine
Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techniques are seen as weak, and in order to avoid “inside jobs” where employees collaborate with gamblers by performing inadequate shuffles, many casinos empl…...

ffmpeg enum AVChannel枚举解析
AVChannel枚举是在2022-12-20的提交中添加的,对应的版本号是5.1. 这个提交的描述是"avutil/channel_layout: add AVChannel enum and related functions"。 原型 typedef struct AVChannelCustom {enum AVChannel id;char name[16];void *opaque; } AVCh…...

invest模型教程
详情点击链接:invest模型教程——建议收藏 1.生态系统服务 2.InVEST模型 3.InVEST所需数据(分辨率、格式、投影系统等)、获取及标准化预处理 4.InVEST运行 5.ArcGIS工具支撑InVEST模型 5.1ArcGIS数据形式与数据格式、数据格式之间的相互转换…...

LinuxShell编程
Shell编程 Shell的概念介绍 命令解释器 Shell是命令解释器(command interpreter),是Unix操作系统的用户接口,程序从用户接口得到输入信息,shell将用户程序及其输入翻译成操作系统内核(kernel)能够识别的指令&#x…...

stm32学习笔记-11 SPI通信
11 SPI通信 文章目录 11 SPI通信11.1 SPI通信协议11.2 W25Q64简介11.3 实验:软件SPI读写W25Q6411.4 SPI通信外设11.5 实验:硬件SPI读写W25Q64 注:笔记主要参考B站 江科大自化协 教学视频“ STM32入门教程-2023持续更新中”。 注:…...

“微商城”项目(3页面布局)
1.设置标题 设置页面头部标题,方便告诉用户当前显示的是哪一个页面。编辑src\router.js文件,示例代码如下。 routes: [{ path: /, redirect: /home, meta: { title: 首页 } },{ path: /home, component: Home, name: home, meta: { title: 首页 } } ] …...

Java 八股文 - MySQL
MySQL 1. MySQL 有几种锁? 三种锁的特点 表级锁:开销小,加锁快;不会出现死锁;锁定颗粒度大,发生锁冲突的概率最高,并发度最低。行级锁:开销大,加锁慢;会…...

周赛347(模拟、思维题、动态规划+优化)
文章目录 周赛347[2710. 移除字符串中的尾随零](https://leetcode.cn/problems/remove-trailing-zeros-from-a-string/)模拟 [2711. 对角线上不同值的数量差](https://leetcode.cn/problems/difference-of-number-of-distinct-values-on-diagonals/)模拟 [2712. 使所有字符相等…...

String AOP的使用
面向切面编程,面向特定方法编程,以方法为对象,在不修改原方法的基础上,对方法进行操作扩展等,底层是通过动态代理实现的 使用开发步骤: 1、创建一个类,加上Aspect声明为一个AOP切面类ÿ…...