【一分钟学C++】指针和引用

在这里插入图片描述

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~
公众号: C++学习与探索  |  个人主页: rainInSunny  |  个人专栏: Learn OpenGL In Qt

文章目录

  • 指针
    • 普通指针
    • 函数指针
    • 注意事项
  • 引用
    • 左值引用
    • 右值引用
    • 注意事项
  • 指针和引用区别

指针

普通指针

  指针是一个变量,它存储的是另一个变量的内存地址。通过指针,我们可以直接访问或修改存储在内存中的值。基本使用如下:

// 声明指针:要声明一个指针变量,需要在类型前面加上*符号。例如,声明一个指向整数类型的指针变量
int* ptr;// 指针赋值:可以通过取地址符&将变量的地址赋给指针变量。例如,将整数变量num的地址赋给指针ptr
int num = 10;
int* ptr = #// 解引用指针:通过解引用操作符*可以访问指针所指向的变量的值。例如,访问指针ptr所指向的整数变量的值
int value = *ptr; // value现在等于num的值,即10// 修改指针所指向的变量的值:通过解引用操作符*可以修改指针所指向的变量的值。例如,修改指针ptr所指向的整数变量的值
*ptr = 20; // 现在num的值变为20// 空指针:空指针是指不指向任何有效内存地址的指针,通常用nullptr表示
int* ptr = nullptr;// 指针常量:指针本身是一个常量,即指针的值(即所指向的内存地址)不能改变,但指针所指向的值可以改变。声明指针常量时通常在指针变量名前面加上const关键字。例如:
int a = 0;
int b = 1;
int* const p1 = &a;
p1 = &b; // 错误,指针指向的地址不可以改变
*p1 = 2; // OK,指针指向的值可以改变// 常量指针:指针指向的值是一个常量,即指针所指向的值不能改变,但指针本身的值(即所指向的内存地址)可以改变。在声明常量指针时通常在*前面加上const关键字。例如:
const int* p2 = &a;
p2 = &b; // OK,指针指向的地址可以改变
*p2 = 2; // 错误,指针指向的值不可以改变// 指向常量的的指针常量:将上面两者结合,例如:
const int* const p3 = &a;
p3 = &b; // 错误,指针指向的地址不可以改变
*p3 = 2; // 错误,指针指向的值不可以改变

函数指针

  函数指针是指向函数的指针,可以用来动态地调用不同的函数。基本使用如下:

typedef int (*funcPtr)(int, int); // 定义返回值为int,函数参数为(int, int)的函数指针类型
int add(int a, int b)
{return a + b;  
}
funcPtr funcAdd = add; // 将add函数地址赋值给函数指针funcAdd
int result = funcAdd(1, 2); // 通过funcAdd调用函数add

注意事项

  • 使用指针之前,务必对指针进行初始化,可以将指针初始化为nullptr或指向有效的内存地址。
  • 避免使用未初始化的指针或已经释放的指针,这会导致未定义行为或程序崩溃。
  • 当浅拷贝一份指针的时候,确保使用它时它指向的对象还在生命周期内。
  • 在进行指针类型转换时要谨慎,确保转换后的指针类型匹配,避免出现类型不匹配导致的问题。

引用

左值引用

  • 左值:可以取地址的对象就是左值。
  • 左值引用:左值引用就是对左值的引用,给左值取别名。主要作用是避免对象拷贝。
  • 使用场景:一般用于函数参数传递,避免对象拷贝。如果用于接收函数返回值,需要保证返回值在离开函数作用域仍然处在生命周期内。
int& ra = a;
int& r = *p;
const int& rb = b;

右值引用

  • 右值:不能取地址的对象就是右值。
  • 右值引用:右值引用就是对右值的引用,给右值取别名。主要作用是把延长对象的生命周期,一般是延长到作用域的scope之外。
  • 使用场景:作为移动构造函数的参数,作为std::move的接收者。
int&& rr1 = 10;
double&& rr2 = x + y;
double&& rr3 = fmin(x, y);
int&& rr4 = std::move(a);

注意事项

  • 左值引用只能引用左值,不能直接引用右值。但是const左值引用既可以引用左值,也可以引用右值。
    • 在 C++11标准产生之前,是没有右值引用这个概念的,当时如果想要一个类型既能接收左值也能接收右值的话,需要用const左值引用,比如标准容器的push_back接口:void push_back (const T& val)。也就是说,如果const左值引用不能引用右值的话,v.push_back(1);写法就不行了。
  • 右值引用引用右值,会使右值被存储到特定的位置。也就是说,右值引用变量本身其实是左值,可以对它取地址和赋值。

指针和引用区别

  • 定义和初始化:
    • 指针需要通过 * 符号来声明和初始化,例如:int* ptr = #
    • 引用在声明时不需要使用特殊符号,直接通过 & 符号初始化,例如:int& ref = num;
  • 空值:
    • 指针可以指向空值(nullptr),即不指向任何对象或地址。
    • 引用在声明后必须引用一个对象,不能指向空值。
  • 重新赋值:
    • 指针可以被重新赋值指向不同的对象或空值。
    • 引用一旦初始化后,不能再引用其他对象,引用变量本身就是其所引用对象的别名。
  • 算术运算:
    • 指针可以进行算术运算,指针加减整数会移动指针指向的位置。
    • 引用不支持算术运算,因为引用本质上是对象的别名。
  • 传递给函数:
    • 当作为函数参数时,指针可以传递空指针,也可以传递指向数组或动态分配内存的指针。
    • 引用作为函数参数时,可以确保不为空,且不需要进行空值检查。
  • 修改对象:
    • 通过指针可以修改所指向对象的值。
    • 通过引用也可以修改引用对象的值,因为引用本质上是对象的别名。

在这里插入图片描述


关注公众号:C++学习与探索,有惊喜哦~

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

宝兰德加入中国交通运输协会信息专业委员会,携手共绘交通行业信息化新篇章

近日,中国交通运输协会信息专业委员会(以下简称信专委)第四届会员代表大会暨第四届一次理事会扩大会议在北京成功举行。宝兰德受邀出席会议,会议总结了第三届理事会的工作,修改了信专委工作规则,选举产生了…

Android Camera系列(四):TextureView+OpenGL ES+Camera

别人贪婪时我恐惧,别人恐惧时我贪婪 Android Camera系列(一):SurfaceViewCamera Android Camera系列(二):TextureViewCamera Android Camera系列(三):GLSur…

一键生成PPT在线使用的保姆级教程:告别加班就靠它

已经过完24年所有的法定节假日的你,上班状态还好吗? 小编人倒是挺飘忽的,就那种人在工位,魂仍在青青大草原的感觉,都是牛马却失去了自由奔跑的权利...... 尤其是还要面对节前一堆没完成的工作,手动完成不…

Day-1 java入门

什么是JAVA? Java是美国的sun 公司(Stanford University Network)在1995年推出的一门计算机高级编程语言。 sun公司于2009年被Oracle(甲骨文)公司收购。 普遍认同Java的联合创始人之一:詹姆斯 高斯林 (James Gosling)为ava之父。 JAVA三大技术平台 Java SE(Java Standa…

大模型 + 在线运行 + ISRealsoft ⇒ 编程运行验证一体化

最近在撰写《计算机的错误计算》系列内容。其中用到三种在线工具,分别是大语言模型、在线运行软件以及 ISRealsoft 在线软件。 系列主要介绍各种软硬件关于数值计算的误差或错误计算。比如,各种数学库 math 中涉及的函数的误差,或算术表达式&…

用伪代码Prompt让LLM进行图推理,生成更精准内容

最近有研究发现,当LLM面对结构化数据,特别是图数据时,LLM的表现却不尽如人意。这几天,来自希腊和法国的研究团队提出了一种创新方法——利用伪代码提示来增强LLM的图推理能力。我基于这项研究先写了一个伪代码的SYSYTEM PROMPT运行…

【智能算法应用】正切搜索算法求解二维路径规划问题

摘要 本文提出了基于正切搜索算法的二维路径规划方法,用于解决包含障碍物的复杂路径规划问题。通过在二维平面中建立障碍物模型和路径目标点,利用正切搜索算法进行路径搜索,找出从起点到终点的最优路径。实验结果显示,该算法在不…

5. PH47 代码框架软件开发环境搭建

5.1. 概述 PH47 软件开发环境搭建比较简单,但毫无疑问非常重要。主要涉及到 stm32 编译链接工具 Keil;代码编辑器 Visual Studio 或者 VS code。 若需要更进一步进行 PH47 框架在不同 stm32 芯片间移植,那么还需要Stm32CubeMx 初始化代码生成…

Python 如何使用 SQLAlchemy 进行复杂查询

Python 如何使用 SQLAlchemy 进行复杂查询 一、引言 SQLAlchemy 是 Python 生态系统中非常流行的数据库处理库,它提供了一种高效、简洁的方式与数据库进行交互。SQLAlchemy 是一个功能强大的数据库工具,支持结构化查询语言(SQL)…

小白入门《大模型应用开发极简入门》学习成为善用 AI 的人!

《大模型应用开发极简入门:基于 GPT-4 和 ChatGPT》这本书旨在为读者提供一个从零开始,快速掌握大语言模型(LLM)开发的入门指南,特别是基于 GPT-4 和 ChatGPT 的应用开发。书中内容涵盖了大模型的基础概念、架构原理、…

PCL 计算点云包围盒

目录 一、概述二、代码三、结果 一、概述 PCL中计算点云包围盒的简单使用案例 二、代码 moment_of_inertia.cpp #include <vector> #include <thread>#include <pcl/features/moment_of_inertia_estimation.h> #include <pcl/io/pcd_io.h> #include…

使用java分别输出二叉树的深度遍历和广度遍历

代码功能 这段Java代码定义了一个二叉树&#xff0c;并实现了两种遍历方法&#xff1a;深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;。通过DFS&#xff0c;代码从根节点开始&#xff0c;优先访问子节点&#xff0c;直至最深的节点&…

常用的十款文件加密软件分享|2024办公文件怎么加密?赶快码住!

在现代办公环境中&#xff0c;数据安全和隐私保护变得尤为重要&#xff0c;尤其是随着远程办公、跨平台协作的普及&#xff0c;文件的加密需求大大增加。为了保障敏感信息的安全性&#xff0c;选择合适的加密软件成为必不可少的一步。本文将为大家推荐2024年常用的十款文件加密…

‌视频画面添加滚动字幕剪辑:提升观众体验的创意技巧

在视频制作中&#xff0c;字幕不仅是传达信息的重要工具&#xff0c;也是提升观众体验的关键元素。本文将探讨如何在视频画面中添加滚动字幕剪辑&#xff0c;以提升观众的观看体验。 1打开软件&#xff0c;在功能栏里切换到“任务剪辑”版块上 2添加原视频导入到表格里&#x…

简单花20分钟学会top 命令手册 (linux上的任务管理器)

1. 介绍 top 是一个常用的 Linux 命令行工具&#xff0c;用于实时监视系统资源和进程的运行情况。用户可以通过 top 命令查看系统的 CPU 使用率、内存占用情况、进程列表等重要信息&#xff0c;帮助快速了解系统运行状态并进行性能监控。该工具可以认为相当于windows上的任务管…

探索Theine:Python中的AI缓存新贵

文章目录 探索Theine&#xff1a;Python中的AI缓存新贵背景&#xff1a;为何选择Theine&#xff1f;Theine是什么&#xff1f;如何安装Theine&#xff1f;简单的库函数使用方法场景应用场景一&#xff1a;Web应用缓存场景二&#xff1a;分布式系统中的数据共享场景三&#xff1…

【DFDT】DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer

文章目录 DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformerkey points贡献方法补丁提取和嵌入基于注意力的补丁选择多流transformer块多尺度分类器实验DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer 会议/期刊:App…

Java 函数式编程(1 万字)

此笔记来自于B站黑马程序员 good Java 历史版本及其优势 函数式编程, Stream API 一.函数伊始函数、函数对象 函数对象 行为参数法 延迟执行 a-lambda b-方法引用 复习小测 Math::random () -> Math.random()Math::sqrt (double number) -> Math.sqrt(number)Student:…

光路科技TSN交换机:驱动自动驾驶技术革新,保障高精度实时数据传输

自动驾驶技术正快速演进&#xff0c;对实时数据处理能力的需求激增。光路科技推出的TSN&#xff08;时间敏感网络&#xff09;交换机&#xff0c;在比亚迪最新车型中的成功应用&#xff0c;显著推动了这一领域的技术进步。 自动驾驶技术面临的挑战 自动驾驶系统需整合来自雷达…

揭秘!尤雨溪成立的VoidZero如何改变前端世界

前言 Vue和Vite之父尤雨溪宣布成立公司 VoidZero&#xff0c;目前已经融资3200万。这篇文章欧阳将带你了解VoidZero是如何改变javascript的世界&#xff01; 加入欧阳的高质量vue源码交流群、欧阳平时写文章参考的多本vue源码电子书 痛点1: 工具太多&#xff0c;学不动 公司…