当前位置: 首页 > news >正文

全面理解: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++中的指针和迭代器,以及解引用操作符(*)和箭头操作符(->)的用法

指针与迭代器的基础概念 指针&#xff1a; 指针是一种变量&#xff0c;其值为另一种类型的对象在计算机内存中的地址。你可以使用指针来直接访问和操作它指向的对象。指针的使用非常强大&#xff0c;但也很危险&#xff0c;因为你有可能错误地操作内存&#xff0c;这可能会导致…...

Vite 使用学习指南

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

【算法训练(day6)】双指针模板

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

免费常用的API接口大全

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

【HTML】第 2 节 - HTML 标签

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

MATLAB算法实战应用案例精讲-【数模应用】残差检验(附Java、python和MATLAB代码)

目录 几个高频面试题目 线性回归残差是否一定满足正态分布? 一般情况 特殊情况...

初学Qt(Day03)

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

皮卡丘xss之htmlspecialchars、xss之href输出、xss之js输出

1.xss之htmlspecialchars htmlspecialchars()函数的功能如下&#xff1a; htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。 预定义的字符是&#xff1a; &#xff08;1&#xff09;& &#xff08;和号&#xff09;成为 &amp; &#xff08;2&#xff09;…...

ArrayList和LinkedList的区别

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

记录 vue3 webpack 使用 iframe 遇到的坑

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

华为OD机试真题 Java 实现【去除多余空格】【2023Q1 100分】

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

SAP-MM 条件类型字段解析

01、“定价类型”&#xff1a;定义此条件类型的代码和描述&#xff0c;代码不能重复&#xff0c;描述可更改&#xff0c;根据实际需要&#xff0c;条件类型可定制&#xff1b; 02、“存取顺序”&#xff1a;表示此条件类型在定价时&#xff0c;要到存取顺序号定义的条件表中读…...

C#,码海拾贝(28)——求解“对称正定方程组”的“平方根法”之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…...

碳纤维单丝外径测试中的纳米分辨率激光衍射法解决方案

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

服务(第三十二篇)nginx做缓存服务器

nginx作为缓存服务配置语法 1、proxy_cache_path 配置语法&#xff08;即缓存路径配置语法&#xff09; Syntax&#xff1a;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 中&#xff0c;可以通过以下方式实现集合、数组和字符串之间的相互转换。 一、集合和数组的相互转化 ①、将集合转为数组&#xff1a;&#xff08;toArray 方法&#xff09; List<String> list new ArrayList<>(); list.add("apple"); lis…...

Redis的全局命令及相关误区

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

C++核心编程—类和对象,类的三大特性——封装、继承、多态

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;文章目录 一.类和对象的概念①什么是对象&#xff1f;②抽象和类1.类的基本概念2.类的声明与定义&#xff1a;3.对象的创建与使用 二.类的封装①为什么有封…...

keep-alive 是 Vue 内置的一个组件,被用来缓存组件实例。

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

(八)Spring之IOC控制反转、DI依赖注入介绍和使用(详解)

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

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...