白骑士的C++教学进阶篇 2.1 指针与引用

系列目录

上一篇:白骑士的C++教学基础篇 1.5 数据结构

        指针和引用是C++中非常重要的概念,它们提供了强大的功能,使程序员能够直接操作内存,提高程序的效率和灵活性。在本篇博客中,我们将深入探讨指针与引用的基础知识,以及它们的区别与使用场景。

指针基础

        指针是一种变量,用于存储内存地址。通过指针,我们可以访问和操作存储在该地址上的数据。指针在C++中的基本用法如下:

指针的声明与初始化

        指针变量的声明包括数据类型和一个星号 ‘*‘ 符号。例如,声明一个指向整数的指针:

int* ptr;

        可以使用取地址运算符 ‘&‘ 将变量的地址赋给指针,例如:

int value = 10;
ptr = &value;

        此时,‘ptr‘ 指向变量 ‘value‘ 的内存地址。

访问指针指向的值

        使用解引用运算符 ‘*‘ 可以访问指针指向的值:

int value = 10;
int* ptr = &value;std::cout << "Value: " << value << std::endl;
std::cout << "Pointer address: " << ptr << std::endl;
std::cout << "Pointer dereferenced: " << *ptr << std::endl;

        在上面的代码中,‘*ptr‘ 返回 ‘ptr‘ 指向的变量 ‘value‘ 的值。

指针运算

        指针可以进行算术运算,例如递增和递减。对于指向数组元素的指针,这些运算特别有用,例如:

int arr[] = {1, 2, 3, 4, 5};
int* ptr = arr;std::cout << "First element: " << *ptr << std::endl;
ptr++;
std::cout << "Second element: " << *ptr << std::endl;

        指针运算会根据指针所指向的数据类型自动调整步长。

引用基础

        引用是变量的别名,定义后必须被初始化。引用提供了一种更安全和简洁的方式来操作变量,而不需要使用指针。

引用的声明与初始化

        引用的声明使用‘&‘符号,并在声明时进行初始化。例如,声明一个引用:

int value = 10;
int& ref = value;

        此时,‘ref‘ 是变量 ‘value‘ 的别名,对‘ref‘的操作与对 ‘value‘ 的操作完全相同,例如:

std::cout << "Value: " << value << std::endl;
std::cout << "Reference: " << ref << std::endl;ref = 20;std::cout << "Value after modification: " << value << std::endl;

        在上面的代码中,通过引用 ‘ref‘ 修改变量 ‘value‘ 的值。

引用作为函数参数

        引用常用于函数参数,避免传值带来的拷贝开销,同时允许函数直接修改传入的变量,例如:

void increment(int& ref) {ref++;
}int main() {int num = 10;increment(num);std::cout << "Number after increment: " << num << std::endl;return 0;
}

        在上面的代码中,函数 ‘increment‘ 通过引用参数直接修改传入的变量 ‘num‘ 的值。

指针与引用的区别与使用场景

        指针和引用在功能上有一些相似之处,但它们在语法和使用场景上有重要的区别。

指针与引用的主要区别

  1. 初始化指针可以在声明后再初始化,而引用必须在声明时初始化。
  2. 空值指针可以指向空(‘nullptr‘),而引用必须引用有效的对象。
  3. 重定向指针可以在程序运行过程中重新指向不同的对象,而引用在初始化后不能更改其引用的对象。
  4. 语法简洁性引用在使用时更加简洁,语法上与普通变量无异,而指针需要使用‘*‘和‘&‘进行解引用和取地址操作。

使用场景

指针的使用场景

  1. 动态内存分配:指针用于操作堆上的动态内存,例如通过‘new‘和‘delete‘管理内存。
  2. 数据结构:指针常用于实现链表、树等复杂数据结构。
  3. 指针数组:指针可以用于实现数组的动态大小和多维数组。

引用的使用场景

  1. 函数参数:引用常用于函数参数,避免传值拷贝,提高效率。
  2. 返回值优化:引用可以用于函数返回值,避免拷贝开销。
  3. 常量引用:用于避免函数参数的拷贝,同时保护参数不被修改。

        通过以下示例代码,我们可以更好地理解指针和引用的区别及其使用场景:

#include <iostream>// 使用指针实现动态内存分配
void dynamicMemoryExample() {int* ptr = new int(42);std::cout << "Dynamically allocated value: " << *ptr << std::endl;delete ptr;
}// 使用引用作为函数参数
void modifyByReference(int& ref) {ref *= 2;
}// 使用指针作为函数参数
void modifyByPointer(int* ptr) {*ptr *= 2;
}int main() {// 指针示例int value = 10;int* ptr = &value;std::cout << "Value before modification: " << value << std::endl;modifyByPointer(ptr);std::cout << "Value after modification by pointer: " << value << std::endl;// 引用示例int anotherValue = 20;std::cout << "Another value before modification: " << anotherValue << std::endl;modifyByReference(anotherValue);std::cout << "Another value after modification by reference: " << anotherValue << std::endl;// 动态内存分配示例dynamicMemoryExample();return 0;
}

总结

        指针和引用是C++中强大的工具,理解它们的区别和使用场景对编写高效、灵活的程序至关重要。指针提供了直接操作内存的能力,适用于动态内存分配和复杂数据结构,而引用提供了一种更简洁的语法,适用于函数参数和返回值优化。在编程实践中,合理选择使用指针或引用可以大大提高代码的可读性和性能。希望通过本篇博客的介绍,您能更好地掌握指针和引用的用法,为深入学习C++奠定坚实的基础。

下一篇:白骑士的C++教学进阶篇 2.2 面向对象编程(OOP)

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

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

相关文章

从零开始学习嵌入式----Makefile工具

一、Makefile 简明指南 你是否曾经面对过一堆源代码文件&#xff0c;却不知道如何将它们编译成可执行文件&#xff1f;或者你是否厌倦了每次修改代码后都要手动输入冗长的编译命令&#xff1f; 如果是的话&#xff0c;那么 Makefile 就是你的救星&#xff01; 二、Makefile 是什…

全网最适合入门的面向对象编程教程:14 类和对象的 Python 实现-类的静态方法和类方法,你分得清吗?

全网最适合入门的面向对象编程教程&#xff1a;14 类和对象的 Python 实现-类的静态方法和类方法&#xff0c;你分得清吗&#xff1f; 摘要&#xff1a; 本文主要介绍了Python中类和对象中的类方法和静态方法&#xff0c;以及类方法和静态方法的定义、特点、应用场景和使用方…

网安防御保护-小实验

1、DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3、办公区设备10.0.2.10不允许访问DMZ区的FTP服务器和HTTP服务器&#xff0c;仅能ping通…

vue 环境变量那些事

常见的项目环境变量的使用 总则&#xff1a;使用 .env.环境名字文件去定义&#xff0c;运行命令的时候指定环境 比如&#xff1a;.env 代表所有环境变量使用的一些变量 .env.development 代表的开发环境变量 .env.production 代表的生产环境变量也就是上线以后使用的 vitevu…

自主研发接口测试框架

测试任务&#xff1a;将以前完成的所有的脚本统一改写为unitest框架方式 1、需求原型 1.1 框架目录结构 V1.0&#xff1a;一般的设计思路分为配置层、脚本层、数据层、结果层&#xff0c;如下图所示 V 2.0&#xff1a;加入驱动层testdriver 1.2 框架各层需要完成的工作 1、配…

Fast DDS library windows 下源码编译(cmake)

目录 编译环境&#xff1a; 编译需要的源码文件&#xff1a; Fast DDS编译&#xff1a; 注意事项&#xff1a; 参考文档&#xff1a; 基于Fast DDS 的源码来编译相关的库&#xff0c;然后可以通过python 来调用库文件实现dds 数据通信&#xff0c;本文就详细的介绍编译过程…

机器学习筑基篇,容器调用显卡计算资源,Ubuntu 24.04 快速安装 NVIDIA Container Toolkit!...

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Ubuntu 24.04 安装 NVIDIA Container Toolkit 什么是 NVIDIA Container Toolkit? 描述:NVIDIA Container Toolkit(容器工具包)使用户能够构建和运行 GPU 加速的容器,该工具包括一个容器运行时库和实用程序,用于自动…

石油巨头受冲击!埃克森美孚、BP接连发出盈利预警

KlipC报道&#xff1a;近日&#xff0c;BP&#xff08;英国石油&#xff09;预计其第二季度将面临10亿至20亿美元的减值费用&#xff0c;并发出警告称其炼油利润率“大幅下降”&#xff0c;石油交易收益预计出现疲软。消息公布后&#xff0c;其股价下跌超4%。 由于中间馏分油利…

JavaScript(8)——函数

函数 function,是被设计执行特定任务的代码块。 函数可以把具有相同或相似逻辑的代码包裹起来&#xff0c;通过函数调用执行这些代码&#xff0c;这么做的优势有利于精简代码方便复用。类似于alert(),prompt()和console.log()&#xff0c;这些都是js函数&#xff0c;不过已经…

STL(一)

书写形式&#xff1a;string (const string& str, size_t pos, size_t len npos); 举例&#xff1a; int main(){ string url("https://mp.csdn.net/mp_blog/creation/editor?spm1000.2115.3001.4503") string sub1(url,0,5);//从下标为0开始向后5个字符&…

如何在 Python 中创建一个类似于 MS 计算器的 GUI 计算器

问题背景 假设我们需要创建一个类似于微软计算器的 GUI 计算器。这个计算器应该具有以下功能&#xff1a; 能够显示第一个输入的数字。当按下运算符时&#xff0c;输入框仍显示第一个数字。当按下第二个数字时&#xff0c;第一个数字被替换。 解决方案 为了解决这个问题&am…

华为OD机考题(HJ108 求最小公倍数)

前言 经过前期的数据结构和算法学习&#xff0c;开始以OD机考题作为练习题&#xff0c;继续加强下熟练程度。 描述 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值&#xff0c;设计一个算法&#xff0c;求输入A和B的最小公倍数。 数据范围&#xff1a;1≤…

Spring中的适配器模式和策略模式

1. 适配器模式的应用 1.1适配器模式&#xff08;Adapter Pattern&#xff09;的原始定义是&#xff1a;将一个类的接口转换为客户期望的另一个接口&#xff0c;适配器可以让不兼容的两个类一起协同工作。 1.2 AOP中的适配器模式 在Spring的AOP中&#xff0c;使用Advice&#…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十九章 Linux 工具之make 工具和 makefile 文件

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

集群管理脚本

虚拟机集群管理脚本 文章目录 虚拟机集群管理脚本一、远程调用脚本(remote_call.sh)二、远程复制目录脚本(remote_copy.sh) 一、远程调用脚本(remote_call.sh) 如果有传命令参数&#xff0c;则执行该命令&#xff1b;如果没有传命令参数&#xff0c;则不执行。 #!/bin/bashcm…

【嵌入式Linux】<知识点> GDB调试(更新中)

文章目录 前言 一、GDB调试预备工作 二、GDB的启动与退出 三、GDB中查看源代码 四、GDB断点操作 五、GDB调试指令 前言 在专栏【嵌入式Linux】应用开发篇_Linux打工仔的博客中&#xff0c;我们已经写了大量的源程序。但是在调试这些程序时我们都是通过printf大法和肉眼除…

评估指标:精确率(Precision)、召回率(Recall)、F1分数(F1 Score)

评估指标&#xff1a;精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1分数&#xff08;F1 Score&#xff09; 前言相关介绍1. 准确率&#xff08;Accuracy&#xff09;2. 精确率&#xff08;Precision&#xff09;3. 召回率&#xff08;Re…

Cadence23打开与关闭飞线,修改位号丝印大小

打开与关闭所有飞线&#xff1a; 显示部分飞线&#xff1a; 单独显示网络飞线尤为好用&#xff0c;点击上图中的网络&#xff0c;之后鼠标点击器件中你想高亮的网络即可单独打开部分飞线。 这里的关闭部分网络的飞线也很好用&#xff0c;可以临时关闭讨厌的GND飞线&#xff1a…

掌握Postman的API请求模板:一键生成,效率倍增

&#x1f4d8; 掌握Postman的API请求模板&#xff1a;一键生成&#xff0c;效率倍增 Postman是API开发和测试的瑞士军刀&#xff0c;而其请求模板功能更是提升工作效率的利器。API请求模板允许用户定义一组可重用的请求配置&#xff0c;从而快速生成和发送API请求。本文将深入…

virturalBox+K8S部署jaeger-all-in-one

pod的yaml如下&#xff1a;这里使用的是主机host模式 apiVersion: apps/v1 kind: Deployment metadata:name: jaegerlabels:app: jaeger spec:replicas: 1selector:matchLabels:app: jaegertemplate:metadata:labels:app: jaegerspec:hostNetwork: truecontainers:- name: jae…