C++基础——引用和指针篇
一、指针(Pointer)
定义:
指针是一个变量,用于存储另一个变量的地址。
基本用法:
#include <iostream>
using namespace std;
int main() {
int a = 10;
int* p = &a; // p 存储 a 的地址
cout << "a 的值: " << a << endl;
cout << "p 指向的值: " << *p << endl; // 通过解引用访问 a 的值
return 0;
}
常见用途:
- 动态内存管理(
new
,delete
) - 传递大对象的地址以减少复制开销
- 实现数据结构(链表、树等)
- 函数指针、回调函数
二、引用(Reference)
定义:
引用是某个变量的别名,必须在定义时初始化,不能更改指向。
基本用法:
#include <iostream>
using namespace std;
int main() {
int a = 10;
int& ref = a; // ref 是 a 的引用
ref = 20; // 相当于修改 a
cout << "a 的值: " << a << endl; // 输出 20
return 0;
}
常见用途:
- 函数参数传递:减少复制,提高效率
- 返回值优化:如操作符重载中常返回引用
- C++ 引用语义:适用于 STL 容器遍历、函数链式调用等
三、引用 vs 指针
特性 | 指针 | 引用 |
---|---|---|
是否可以为 null | 可以 | 不可以(必须绑定合法对象) |
是否可重新赋值 | 可以指向不同对象 | 不能更改绑定对象 |
是否可修改地址 | 可以 | 不可以(底层实现是隐藏的指针) |
语法使用 | 使用 * , & 操作 |
类似变量操作(无需解引用) |
是否有内存开销 | 有,实际占一个地址空间 | 没有额外开销,编译器优化处理 |
四、在函数中的对比用法
使用指针:
void swap(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
int main() {
int x = 1, y = 2;
swap(&x, &y);
cout << x << " " << y << endl; // 输出 2 1
}
使用引用(C++ 推荐):
void swap(int& a, int& b) {
int tmp = a;
a = b;
b = tmp;
}
int main() {
int x = 1, y = 2;
swap(x, y);
cout << x << " " << y << endl; // 输出 2 1
}
五、与 C 的区别
- 引用是 C++ 特有的,C 语言没有引用概念,只能用指针。
- C 中函数参数修改必须用指针,而 C++ 中可用引用,更安全简洁。
- C++ 引用语义也用于支持高级特性(如智能指针、右值引用、move 语义等)。
六、指针与引用的性能差距
- 指针和引用对应的汇编码完全相同,所以二者的没有任何的性能差异。C++中的引用可以看做是C++对于指针操作的一个“语法糖”,底层实现完全一致。
总结
适用场景 | 推荐使用 |
---|---|
函数需要修改参数 | 使用引用(C++)或指针(C) |
需要 nullptr | 只能使用指针 |
动态内存分配 | 使用指针 |
简洁代码 | 优先使用引用 |
C++基础——引用和指针篇的更多相关文章
- 【C++自我精讲】基础系列一 指针与引用
[C++自我精讲]基础系列一 指针与引用 一 前言 指针.引用.指针与引用区别. 二 指针 变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间. //变量 ...
- 【C++基础学习】引用和指针、重载、函数、内存管理
第一部分:引用VS指针 引用的含义:变量的别名 注意:变量不能只有别名,必须有一个真实的变量与之相对应 基本数据类型的引用 对别名本身的操作和它的实体的操作是一样的 1.基本数据类型的引用 类型 &a ...
- [C++基础] 数组、指针、内存篇
一.数组 2.1 int a[2][2]= { {1}, {2,3} },则 a[0][1] 的值是多少? 二维数组的初始化一般有两种方式: 第一种方式是按行来执行,如int array\[2][3] ...
- Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)
线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...
- 瘋子C语言笔记(指针篇)
指针篇 1.基本指针变量 (1)定义 int i,j; int *pointer_1,*pointer_2; pointer_1 = &i; pointer_2 = &j; 等价于 i ...
- 从编译器角度理解C++中的引用和指针
欲分析指针和引用,则要分析变量名和地址之间的关系(不管你理解还是不理解,无论你是从老师那里听到的,还是网上看到的,应该都知道两句话:1. 指针就是地址,2.引用就是给变量起个别名) 所以我们就要来分析 ...
- C中有关引用和指针的异同
参考于https://blog.csdn.net/wtzdedaima/article/details/78377201 C语言也学了蛮久的,其实一直都没有用到过或者碰到过引用的例子.前端时间再全面复 ...
- 引用、数组引用与指针引用、内联函数inline、四种类型转换运算符
一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型 &引用名 = 变量名: 例如:int a=1; int &b=a;// b是a的别名,因此a和b是同一个单元 ...
- 快速上手系列-C语言之指针篇(一)
快速上手系列-C语言之指针篇(一) 浊酒敬风尘 发布时间:18-06-2108:29 指针的灵活运用使得c语言更加强大,指针是C语言中十分重要的部分,可以说指针是C语言的灵魂.当然指针不是万能的,但没 ...
- C++基础--引用的一点补充
这一篇是对引用的一点补充,内容基本上是来自<C++ primer plus>一书第八章的内容. 前面一篇介绍了引用的一点特点,这里补充一个,将引用用于类对象的时候,有一个体现继承的特征,就 ...
随机推荐
- 【译】HTTP 文件更新了请求变量
许多用户都要求在 Visual Studio 的 HTTP 文件中添加对请求变量的支持.使用请求变量,您可以发送 HTTP 请求,然后在从 HTTP 文件发送的任何后续请求中使用响应或请求中的数据.我 ...
- 用 just 简化项目命令管理
在软件开发过程中,高效管理项目命令是提升开发效率的关键, 它们可以帮助我们自动化重复的任务,简化项目管理流程,提高效率. 今天,我们来介绍一个名为 just 的任务运行器. 它由 Casey 发起,用 ...
- [JOISC 2023 Day3] Tourism 题解
大家好,我喜欢珂朵莉树,所以我用珂朵莉树 \(AC\) 了本题. 实际上,我们比较容易发现,这题实际上就是求 \([l,r]\) 中的所有点作为关键点时,虚树所压缩的所有点(实际上就是显现出来的点+在 ...
- Typescript通用帮助类,格式化日期时间等
/** * 格式化日期选项 */ export class DateFormatOption { "M+": number;//月 "d+": number;/ ...
- .NET周刊【2月第3期 2025-02-16】
国内文章 我们是如何解决abp身上的几个痛点 https://www.cnblogs.com/jackyfei/p/18709265 张飞洪分享了abp框架在.net社区的使用经验,认为其在模块化.D ...
- luogu-P3343题解
简要题意 给定一张 \(n\) 个点 \(m\) 条边的图,边的边权是 \([0, 1]\) 之间均匀分布的随机实数,且相互独立.求最小生成树的最大边权的期望值. 思路 首先有一个比较神秘的跟概率有关 ...
- 异步导入导出Excel方案
一.异步导出Excel文件 1.设计思想 用户无需在当前页面等待导出结果,点击导出按钮后服务端即可返回前端提示用户导出处理中请到下载中心查看结果. 具体业务文件导出实现由后台异步处理导出文件到腾讯CO ...
- 2025 年最值得尝试的几款 DevOps 平台工具推荐
随着软件开发和运维的深度融合,DevOps 平台已成为现代企业加速数字化转型的核心引擎.在 2025 年,面对快速迭代的市场需求与复杂的技术架构,选择一款适配性强.功能完备的 DevOps 平台,不仅 ...
- 池化层 Pooling Layer
写在前面:人生就是努力.搞不懂.躺平,循环. 文章结构 池化层的相对位置 在多通道任务中,池化层和卷积层的不同 重要的参数stride 与 kernel_size 大小的相对关系决定3种池化层 参数 ...
- (Python)用栈实现计算器的原理及实现
前言 我们日常使用的计算器是怎么实现计算的呢?能自己判断运算符的优先级去计算,能处理括号的匹配,这些都是怎么实现的呢? 一个大家熟知的答案是用栈,好的,那么为什么要用栈?为什么栈能实现呢? 目录 前言 ...