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

【数据结构】你真的认识“”吗?它真的就只是“取地址”吗?或许你一直都在误解它。

我们有时候在看数据结构相关书籍时,经常会看到这样的写法:


void StackInit(ST& ps)
{assert(ps);ps.a = NULL;ps.top = 0;ps.capacity = 0;
}

注意,这里的&可不是表示取地址。如果你把它理解为取地址,那就在错误的路上狂奔,且一去不返了。 

相信大家在学习C语言时,也被指针折磨过不少。可能都出现过野指针等,这些失误让我们不胜其烦。

其实,编写书籍的老师,使用“&”这个符号,就是为了减少指针的使用。“&”在这里,是C++中的“引用”。

但是,这对于一些没有了解过相关语法的同志,那又成了一个坑。毕竟,C语言里面的“&”可是代表着“取地址”。

那么,我们接下来就来好好说道说道,“&”到底是个什么东西。

一.C语言中的“&”

我们在学习C语言的指针部分时,会经常性用到这样一个符号——“&”。

我们把它叫做“取地址”。

#include<stdio.h>int main()
{int a = 0; int* p = &a; //&a取出a的地址,p是一个指针变量,p中存放a的地址printf("%d\n",*p);return 0;
}

相信大家对于“取地址”这个用法已经很熟悉了。

数据结构中&的应用实例

我们简单写一下栈的初始化和销毁,以此来显示指针&的具体应用。 

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>typedef char STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;void StackInit(ST* ps)
{assert(ps);ps->a = NULL;ps->top = 0;ps->capacity = 0;
}void StackDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;
}int main()
{ST st;StackInit(&st);  //对栈进行初始化,需要传址StackDestroy(&st); return 0;
}

二.C++中的“&”

1.基础语法

在C++中,“&”表示的是引用,也可以理解为取别名

就像《武林外传》中的白展堂,他有另外一个名字:盗圣。那么盗圣就是他的别名。提到白展堂是在说他,提到盗圣也是在说他。

#include<iostream>
using namespace std;int main()
{int a = 100;int& aa = a;  //   引用定义    
//&  -  引用  (不是取地址)//aa  与  a  地址相同//引用 必须在定义的时候初始化//  一个变量可以有多个引用//引用一旦引用一个实体,再不能引用其它实体int b = 100;int& bb = b;int& bbb = b;int& b2 = bb;return 0;
}

注意:

  1.      引用 必须在定义的时候初始化
  2.      一个变量可以有多个引用
  3.     引用一旦引用一个实体,再不能引用其它实体

2.传引用 

//引用做参数
//叫做:传引用(不是传值也不是传地址)
void Swap(int& aa, int& bb)
{int tmp = aa;aa = bb;bb = tmp;
}int main()
{int a = 100;int b = 130;//int& aa = a;//int& bb = b;Swap(a, b);printf("%d %d", a, b);return 0;
}

 3.常引用

//常引用int main()
{权限放大,不行//const int a = 100; //权限是只读//int& aa = a; //权限是读写//可行,权限不变const int a = 100;const int& aa = a;//权限缩小,可行int b = 100;const int& bb = b;return 0;
}

 4.引用作返回值(可跳过)

如果想多了解一些C++,那么可以将下面的内容了解一下。

引用返回:不会生成拷贝返回,直接返回引用。

如果函数返回时,出了函数的作用域,如果返回对象还在(还没还给系统),则可以使用引用返回;
如果已经还给系统了,则必须使用传值返回。

引用的作用主要体现在传参和传返回值:
  1、引用传参和传返回值,有些场景下面,可以提高性能(大对象+深拷贝对象)
  2、引用传参和传返回值,输出型参数和输出型返回值。 也就是说,有些场景下面,形参的改变可以改变实参
  有些场景下,引用返回  可以改变返回对象。

三.总结 

当我们了解了“&”就是“引用”(取别名)时,那我们学习数据结构就会更得心应手了。

祝大家能在学习编程这条路上一马平川,一片光明。 

相关文章:

【数据结构】你真的认识“”吗?它真的就只是“取地址”吗?或许你一直都在误解它。

我们有时候在看数据结构相关书籍时&#xff0c;经常会看到这样的写法&#xff1a; void StackInit(ST& ps) {assert(ps);ps.a NULL;ps.top 0;ps.capacity 0; } 注意&#xff0c;这里的&可不是表示取地址。如果你把它理解为取地址&#xff0c;那就在错误的路上狂奔&…...

[深入理解SSD 21] 固态硬盘GC机制 | GC 分类 | GC 过程 | GC 和 Trim 的关系

Hello 大家好&#xff0c; 我是元存储~主页&#xff1a;元存储的博客_CSDN博客-深入理解SSD:固态存储特性与实践,深入浅出SSD:固态存储原理与特性,深入理解Flash:闪存特性与实践领域博主前言SSD上已经被写入过的Page页在重新被写入之前&#xff0c;必须要将page页所在的block块…...

大数据未来发展怎么样?

就目前情况来看&#xff0c;大数据行业前景不错薪资待遇好&#xff0c;也有越来越多的人选择大数据行业&#xff0c;各大名企对于大数据人才需求不断上涨。 大数据从业领域很宽广&#xff0c;不管是科技领域还是食品产业&#xff0c;零售业等都是需要大数据人才进行大数据的处…...

【Linux】进程和线程间的区别与联系

带你轻松理解进程与线程的区别与联系&#xff1a; 进程线程定义资源分配和拥有的基本单位CPU调度的基本单位切换情况对应进程的CPU环境的保存以及新进程环境的设置保存和设置程序计数器&#xff0c;少量的寄存器&#xff0c;以及对应的线程栈切换者操作系统操作系统切换过程用…...

【C语言】变量和常量

目录 1. 变量 1.1 变量的分类 1.1.1 局部变量 1.1.2 全局变量 1.2 变量的使用——声明、赋值、初始化 1.3 变量的作用域和生命周期 1.3.1 作用域 1.3.2 生命周期 2. 常量 2.1 字面常量 2.2 常变量&#xff08;const常量&#xff09; 2.3 简单的宏&#xff08;对象式…...

蓝桥杯-卡片换位(BFS)

蓝桥杯-卡片换位 1、题目描述2、解题思路3、完整代码(AC)1、题目描述 你玩过华容道的游戏吗? 这是个类似的,但更简单的游戏。 看下面 3 x 2 的格子 +---+---+---+| A | * | * |+---+---+---+| B | | * |+---+---+---+在其中放 5 张牌,其中 A 代表关羽,B 代表张飞,* 代表士…...

霍夫曼编码 | 贪心算法 2

霍夫曼编码是一种无损数据压缩算法。其思想是为输入字符分配可变长度代码&#xff0c;分配代码的长度基于相应字符的频率。 分配给输入字符的可变长度代码是​​​​​​​前缀代码&#xff0c;意味着代码&#xff08;位序列&#xff09;的分配方式是分配给一个字符的代码不是…...

async 与 await

目录一、async函数二、await表达式三、async与await结合一、async函数 函数的返回值为promise对象promise对象的结果由async函数执行的返回值决定 async function main(){//1.如果返回的是一个非promise类型的数据&#xff0c;那么返回的就是成功的状态// return 521//2.如果…...

MYSQL语句

在 Navicat Premium 里面test_database数据库 &#xff0c;右击 “命令列界面..” 命令列界面 中 输入命令 查看所有的数据库 show databases; 选择数据库 -- use 数据库名; use test_database; 创建表 creat table 表名(字段名1 数据类型,字段名2 数据类型) -- 创建…...

C语言函数:内存函数memcpy()以及实现

C语言函数&#xff1a;内存函数memcpy() 引言&#xff1a; #define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>int main() {int arr1[20] { 1,2,3,4,5,6,7,8,9 };int arr2[20] { 0 };strcpy(arr2, arr1);return 0; } strcpy函数&#xff1a;C语言函数&#xff1a;字…...

ArcGIS基础:栅格分区转矢量再裁剪面图层【重分类】【栅格转面】

如上所示&#xff0c;是一个原始的栅格数据&#xff08;DEM&#xff09;&#xff0c;本操作将其转为矢量要素并裁剪另外的面图层 右键属性查看数据类型&#xff0c;可以发现此栅格数据属于【浮点型】&#xff0c;这里需要注意的是&#xff1a;栅格转为矢量数据时&#xff0c;必…...

vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】

文章目录11.对axios二次封装11.1为什么需要进行二次封装axios&#xff1f;11.2在项目当中经常有API文件夹【axios】12.接口统一管理12.1跨域问题12.2接口统一管理12.3不同请求方式的src/api/index.js说明本人其他相关文章链接11.对axios二次封装 安装命令&#xff1a;cnpm inst…...

并发编程-2

1.锁的分类 1.1 可重入锁、不可重入锁 Java中提供的synchronized&#xff0c;ReentrantLock&#xff0c;ReentrantReadWriteLock都是可重入锁。 1.1.1重入&#xff1a; 当前线程获取到A锁&#xff0c;在获取之后尝试再次获取A锁是可以直接拿到的。 1.1.2不可重入&#xff…...

万字解析Linux内核调试之动态追踪

文章介绍几种常用的内核动态追踪技术&#xff0c;对 ftrace、perf 及 eBPF 的使用方法进行案例说明。 1、什么是动态追踪 动态追踪技术&#xff0c;是通过探针机制来采集内核或者应用程序的运行信息&#xff0c;从而可以不用修改内核或应用程序的代码&#xff0c;就获得调试信…...

Spring Boot 各层作用与联系

目录 1 Entity 层 2 DAO 层 3 Service 层 4 Controller 层 Spring Boot 各层之间的联系&#xff1a; controller 层-----> service 层(接口->接口实现类) -----> dao 层的.mapper 文件 -----> 和 mapper 层里的.xml 文件对应 1 Entity 层 实体层&#xff0c;…...

苦中作乐---竞赛刷题(15分-20分题库)

&#xff08;一&#xff09;概述 &#xff08;Ⅰ&#xff09;彩票是幸运的 &#xff08;Ⅱ&#xff09;AI 英文问答程序 &#xff08; Ⅲ &#xff09; 胎压检测 &#xff08;二&#xff09;题目 Ⅰ 彩票的号码有 6 位数字&#xff0c;若一张彩票的前 3 位上的数之和等于后 3 …...

超详细,多图,PVE安装以及简单设置教程(个人记录)

前言: - 写这个的目的是因为本人健忘所以做个记录以便日后再折腾时查阅,。 - 本人笔拙如有选词&#xff0c;错字&#xff0c;语法&#xff0c;标点错误请忽视&#xff0c;大概率知道了也不会修改&#xff0c;本人能看懂就好。 - 内容仅适用于本人的使用环境&#xff0c;不同…...

茴子的写法:关于JAVA中的函数传递语法糖:lambda

解决的问题&#xff1a;Java中实现函数传递。 在Java编程的实践过程中&#xff0c;有一些场景&#xff0c;我们希望能够将函数传递进去&#xff0c;不同的函数实现代表着不同的策略&#xff0c;这在JDK8以前&#xff0c;需要定义一个接口&#xff0c;这个接口中定义这个函数方…...

动态规划刷题记录(2)

今天的三个题目属于模板题&#xff0c;可能将来会遇见它们的变形应用。 1、最长上升子序列问题 这道题目的关键就在于我们的状态定义&#xff0c;我们定义&#xff1a;f(i)表示长度为i的子序列的末尾最大值。意思就是&#xff0c;比如一个子序列为&#xff1a;1,4,5&#xff0…...

2023年广东省网络安全竞赛——Web 渗透测试解析(超级详细)

任务一:Web 渗透测试 任务环境说明: √ 服务器场景:Server03 √ 服务器场景操作系统:未知(关闭连接) 通过本地 PC 中的渗透测试平台 Kali 对靶机进行 WEB 渗透,找到页面内的文件上传漏洞并且尝试进行上传攻击,将文件上传成功后的页面回显字符串作为Flag 提交(如:…...

OpenClaw故障模拟:Qwen3-14b_int4_awq异常输入处理与恢复机制

OpenClaw故障模拟&#xff1a;Qwen3-14b_int4_awq异常输入处理与恢复机制 1. 为什么需要主动制造故障 去年冬天的一个深夜&#xff0c;我的OpenClaw自动化流程突然中断了。当时它正在帮我整理一批技术文档&#xff0c;却在处理某个特殊字符时直接"卡死"。这次经历让…...

Typora风格文档化:使用Markdown实时记录PyTorch 2.8实验过程

Typora风格文档化&#xff1a;使用Markdown实时记录PyTorch 2.8实验过程 1. 为什么需要实验过程文档化 在深度学习研究领域&#xff0c;实验过程的可复现性一直是个老大难问题。很多研究者都有这样的经历&#xff1a;三个月前跑的实验&#xff0c;现在想复现结果&#xff0c;…...

告别数据打架:手把手教你用Python+Seurat整合单细胞数据,无缝衔接scVelo做RNA速率分析

告别数据打架&#xff1a;手把手教你用PythonSeurat整合单细胞数据&#xff0c;无缝衔接scVelo做RNA速率分析 单细胞测序技术的快速发展为生物医学研究带来了前所未有的分辨率&#xff0c;但不同分析工具之间的数据格式壁垒常常让研究者头疼。特别是当我们需要在R语言的Seurat和…...

OpenClaw定时任务:千问3.5-9B实现每日自动化流程

OpenClaw定时任务&#xff1a;千问3.5-9B实现每日自动化流程 1. 为什么需要定时任务自动化 去年冬天的一个深夜&#xff0c;我正熬夜准备第二天的重要汇报材料&#xff0c;突然发现需要从三个不同平台导出数据并整理成统一格式。手动操作到凌晨两点时&#xff0c;我意识到这种…...

CYBER-VISION零号协议Markdown文档大师:替代Typora的智能写作体验

CYBER-VISION零号协议Markdown文档大师&#xff1a;替代Typora的智能写作体验 如果你和我一样&#xff0c;每天都要和Markdown文档打交道&#xff0c;那你肯定知道那种感觉&#xff1a;面对一个空白文档&#xff0c;脑子里有想法&#xff0c;但就是敲不出满意的句子&#xff1…...

Qwen3.5-2B部署案例:基于Docker+Supervisor的生产级多用户服务搭建

Qwen3.5-2B部署案例&#xff1a;基于DockerSupervisor的生产级多用户服务搭建 1. 项目背景与模型介绍 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型&#xff0c;属于Qwen3.5系列的小参数版本&#xff08;20亿参数&#xff09;。这个模型专为低功耗、低门槛部署场景设计&…...

Elixir Plug安全防护:CSRF保护、SSL强制与基础认证的终极教程

Elixir Plug安全防护&#xff1a;CSRF保护、SSL强制与基础认证的终极教程 【免费下载链接】plug Compose web applications with functions 项目地址: https://gitcode.com/gh_mirrors/pl/plug Elixir Plug 是一个强大的 Web 应用构建工具&#xff0c;提供了全面的安全防…...

RK3576开发板调试EC11编码器,一分钟就失灵?原来是XL9535芯片这个引脚没上拉

RK3576开发板EC11编码器调试&#xff1a;XL9535中断引脚上拉缺失引发的"一分钟失灵"之谜 刚拿到RK3576开发板时&#xff0c;我满心期待地接上了EC11旋转编码器进行测试——上电后旋转旋钮&#xff0c;系统响应灵敏&#xff0c;GPIO中断触发准确。但正当我准备庆祝调试…...

高效医学知识图谱构建方案:CMeKG工具自动化处理中文医学文本技术深度解析

高效医学知识图谱构建方案&#xff1a;CMeKG工具自动化处理中文医学文本技术深度解析 【免费下载链接】CMeKG_tools 项目地址: https://gitcode.com/gh_mirrors/cm/CMeKG_tools 在医疗信息化与人工智能深度融合的今天&#xff0c;中文医学知识图谱构建面临严峻的技术挑…...

嵌入式系统代码执行时间测量方法与优化

1. 嵌入式程序运行时间测量的必要性在嵌入式系统开发中&#xff0c;精确测量代码执行时间是每个工程师必备的技能。无论是优化算法效率、调试实时系统&#xff0c;还是验证硬件性能&#xff0c;时间测量都扮演着关键角色。以STM32为例&#xff0c;当我们需要确认一个延时函数是…...