一、指针(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 的区别

  1. 引用是 C++ 特有的,C 语言没有引用概念,只能用指针。
  2. C 中函数参数修改必须用指针,而 C++ 中可用引用,更安全简洁。
  3. C++ 引用语义也用于支持高级特性(如智能指针、右值引用、move 语义等)。

六、指针与引用的性能差距

  • 指针和引用对应的汇编码完全相同,所以二者的没有任何的性能差异。C++中的引用可以看做是C++对于指针操作的一个“语法糖”,底层实现完全一致。

总结

适用场景 推荐使用
函数需要修改参数 使用引用(C++)或指针(C)
需要 nullptr 只能使用指针
动态内存分配 使用指针
简洁代码 优先使用引用

C++基础——引用和指针篇的更多相关文章

  1. 【C++自我精讲】基础系列一 指针与引用

    [C++自我精讲]基础系列一 指针与引用   一 前言   指针.引用.指针与引用区别. 二 指针   变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间. //变量 ...

  2. 【C++基础学习】引用和指针、重载、函数、内存管理

    第一部分:引用VS指针 引用的含义:变量的别名 注意:变量不能只有别名,必须有一个真实的变量与之相对应 基本数据类型的引用 对别名本身的操作和它的实体的操作是一样的 1.基本数据类型的引用 类型 &a ...

  3. [C++基础] 数组、指针、内存篇

    一.数组 2.1 int a[2][2]= { {1}, {2,3} },则 a[0][1] 的值是多少? 二维数组的初始化一般有两种方式: 第一种方式是按行来执行,如int array\[2][3] ...

  4. Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)

    线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...

  5. 瘋子C语言笔记(指针篇)

    指针篇 1.基本指针变量 (1)定义 int i,j; int *pointer_1,*pointer_2; pointer_1 = &i; pointer_2 = &j; 等价于 i ...

  6. 从编译器角度理解C++中的引用和指针

    欲分析指针和引用,则要分析变量名和地址之间的关系(不管你理解还是不理解,无论你是从老师那里听到的,还是网上看到的,应该都知道两句话:1. 指针就是地址,2.引用就是给变量起个别名) 所以我们就要来分析 ...

  7. C中有关引用和指针的异同

    参考于https://blog.csdn.net/wtzdedaima/article/details/78377201 C语言也学了蛮久的,其实一直都没有用到过或者碰到过引用的例子.前端时间再全面复 ...

  8. 引用、数组引用与指针引用、内联函数inline、四种类型转换运算符

    一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型  &引用名 = 变量名: 例如:int a=1;  int  &b=a;// b是a的别名,因此a和b是同一个单元 ...

  9. 快速上手系列-C语言之指针篇(一)

    快速上手系列-C语言之指针篇(一) 浊酒敬风尘 发布时间:18-06-2108:29 指针的灵活运用使得c语言更加强大,指针是C语言中十分重要的部分,可以说指针是C语言的灵魂.当然指针不是万能的,但没 ...

  10. C++基础--引用的一点补充

    这一篇是对引用的一点补充,内容基本上是来自<C++ primer plus>一书第八章的内容. 前面一篇介绍了引用的一点特点,这里补充一个,将引用用于类对象的时候,有一个体现继承的特征,就 ...

随机推荐

  1. 利用纯JS导出到EXCEL

    var tableToExcel = (function () { var uri = 'data:application/vnd.ms-excel;base64,', template = '< ...

  2. 在Android源码中为APK编译系统权限

    系统权限获取 打包为APK进行系统签名 对于 部分功能的访问需要使用到系统权限,需要 添加 android:sharedUserId="android.uid.system" 权限 ...

  3. 如何用爱思助手给苹果iPhone手机免越狱修改虚拟定位教程

    使用爱思助手修改定位的方法: 1.在电脑上下载安装 爱思助手 客户端,并更新到最新版,用数据线将苹果移动设备连接到电脑. 2.连接成功后,依次打开爱思助手"工具箱 - 虚拟定位". ...

  4. 基于Potplayer类播放器或Action!类录屏软件调取摄像头方式的定时抓拍保存图像方法小结

    前面已经总结了基于Maxmspjitter的相关方法,还有基于Unity的,还有基于Openframeworks的,今天来一篇基于普通软件的: 1.专业播放器类的软件,如Potplayer.vlc.o ...

  5. AI 实践|零成本生成SEO友好的TDK落地方案

    之前写过一篇文章「Google搜索成最大入口,简单谈下个人博客的SEO」,文章里介绍了网页的描述信息TDK(Title.Description和Keywords)对SEO的重要作用,尽管已经意识到了T ...

  6. 后台返回文件URL,前端下载文件,即使设置文件名,下载的文件名称并不是自己所设置的问题

    1.背景 项目中遇到这么一个问题,上传文件后,后台返回的是一个URL,前端需要通过点击下载这个文件 2.首次处理 当时一看是下载文件,觉得很简单,无非是通过创建a标签来实现,以下是我当时的代码,用的是 ...

  7. Python 潮流周刊#94:如何解决 FastAPI 的大文件传输问题?(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  8. 多态的转型和案例--java进阶day02

    1.多态的转型 1.向上转型 我们之前学的多态创建对象,使用的都是向上转型,父类引用指向子类(赋值方式则是从子到父),f拿到子类的地址,就能访问子类的堆内存 2.向下转型 和向上转型相反,子类引用指向 ...

  9. 【数据结构与算法】Java链表与递归:移除链表元素

    Java链表与递归:移除链表元素 Java https://leetcode-cn.com/problems/remove-linked-list-elements/solution/javalian ...

  10. 什么是 Gork ?

    Grok 是埃隆·马斯克旗下的人工智能公司 xAI 的开发的一系列大型语言模型 (LLMs)产品,包括Grok 1.Grok 2和即将发布的Grok 3. 受<银河系漫游指南>的启发,Gr ...