跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++入门知识(三):引用、内联函数与 nullptr 概念详解

C++ 基础知识点涵盖引用、内联函数及 nullptr。引用作为变量别名,需初始化且绑定后不可更改指向,常用于函数传参优化效率及避免指针安全问题。内联函数在编译期展开调用代码,减少栈帧开销,但受编译器限制。nullptr 关键字用于统一空指针初始化,解决 NULL 宏在不同环境下的歧义问题。三者结合提升代码安全性与执行效率。

佛系玩家发布于 2026/3/23更新于 2026/10/373 浏览
C++入门知识(三):引用、内联函数与 nullptr 概念详解

前言

在上一篇文章中,我们学习了 C++ 的输入输出、缺省参数以及函数重载。本文将继续学习 C++ 的其他基础知识,包括引用、inline 内联函数以及 nullptr。

一、引用

1.1 引用的概念和定义

引用不是定义一个新变量,而是给已经存在的变量起一个别名。编译器不会为别名重新开辟空间,它和引用变量共同使用同一块内存。例如将土豆称为马铃薯,番茄称为西红柿,本质是同一个东西。

语法如下:

类型& 别名 = 变量

使用方法:

int a = 10;
int& num = a;

此时 num 就是 a 的新名字,值也为 10。注意在 C++ 引用中,& 的含义是给变量起别名,而非取地址。

1.2 引用的三个特性

1.2.1 引用在定义时必须初始化

在使用引用时,必须先有被引用对象,不能在没有被引用对象的情况下使用引用。

#include<iostream>
using namespace std;
int main() {
    int a = 10;
    int& num = a; // 正确,已有被引用对象 a
    // int& num; // 错误,未初始化
    return 0;
}
1.2.2 一个变量可以有多个引用

一个变量可以有一个或多个别名。

#include<iostream>
using namespace std;
int main() {
    int a = 10;
    int& num1 = a;
    int& word = a;
    int& word2 = word;
    cout << &a << endl;
    cout << &num1 << endl;
    cout << &word << endl;
    cout << &word2 << endl;
    return 0;
}

运行结果显示它们的地址相同,说明一个变量确实可以有多个别名。

1.2.3 引用只能引用一个实体

当一个变量被引用产生了一个新的别名,该别名只能用于这个变量,不能再去引用其他变量。

#include<iostream>
using namespace std;
int main() {
    int b = 10;
    int a = 20;
    int& num1 = b;
    // int& num1 = a; // 报错,重复定义
    return 0;
}

总结:引用必须在定义时就绑定到某个变量,不能先定义后绑定。一个变量可以有多个引用,但一个引用只能绑定到一个变量,且绑定后不能再指向其他变量。

1.3 引用的使用

引用的作用主要是用在函数传参和传返回值。C 语言通过拷贝实参传入形参,数据量大时效率低且存在空指针风险。引用解决了这类问题。

场景 1:函数传参

使用引用传参可以避免拷贝,直接操作原变量。

#include<iostream>
using namespace std;
void Swap(int& x, int& y) {
    int temp = x;
    x = y;
    y = temp;
}
int main() {
    int a = 10;
    int b = 20;
    Swap(a, b);
    return 0;
}
场景 2:链表操作

在单链表中,修改头节点通常需要使用二级指针。使用引用可以简化代码。

#include<iostream>
using namespace std;
typedef struct ListNode {
    struct ListNode* next;
    int val;
}ListNode;

void Push_elem_front(ListNode*& head_of_List, int elem) {
    // 逻辑实现
}

这里 head_of_List 是 phead 的别名,无需二级指针即可修改头节点指向。

场景 3:返回值

返回引用可以直接修改节点的值。

int& getNodeVal(ListNode* phead, int pos) {
    // 查找逻辑
    return pcur->val;
}
// 调用:getNodeVal(phead, pos) = 200;

注意:不能返回局部临时变量的引用,因为函数结束后内存会被回收,导致悬空引用。

1.4 const 引用

作用 1:防止变量被修改
int a = 10;
const int& num = a;
// num = 100; // 错误
作用 2:效率优化

传递大型结构体时使用 const 引用可避免拷贝开销。

typedef struct { int arr[1000]; } BigStruct;
void read(const BigStruct& s) {}
作用 3:隐式类型转换
double a = 3.14;
const int& b = a; // 允许隐式转换

1.5 引用和指针的关系

指针和引用各有特点,不可替代。

  • 引用是别名,不开空间;指针存储地址,开空间。
  • 引用必须初始化,指针建议初始化。
  • 引用初始化后不可改指向,指针可以。
  • 引用直接访问,指针需解引用。
  • sizeof 含义不同。
  • 指针易出现空指针/野指针,引用更安全。

二、inline 内联函数

被 inline 修饰的函数叫内联函数。编译时编译器会在调用处直接展开代码,不建立额外栈帧,提高效率。

#include<iostream>
using namespace std;
inline int add(int a, int b) {
    return a + b;
}

内联函数是对 C 语言宏的改进,宏容易出错且难调试。inline 由编译器控制是否展开,若代码复杂或递归,编译器可能忽略 inline 建议。

注意:inline 不建议声明和定义分离到两个文件,否则会导致链接错误。

三、nullptr

NULL 是宏,在 C 和 C++ 下含义不同。C++ 中 NULL 定义为 0,可能导致函数重载歧义。

void f(int x) {}
void f(int* x) {}
int main() {
    f(0);      // 调用 f(int)
    f(NULL);   // 调用 f(int)
    f(nullptr);// 调用 f(int*)
}

nullptr 是 C++11 引入的关键字,专门用于空指针初始化,意义统一,推荐使用。

目录

  1. 前言
  2. 一、引用
  3. 1.1 引用的概念和定义
  4. 1.2 引用的三个特性
  5. 1.2.1 引用在定义时必须初始化
  6. 1.2.2 一个变量可以有多个引用
  7. 1.2.3 引用只能引用一个实体
  8. 1.3 引用的使用
  9. 场景 1:函数传参
  10. 场景 2:链表操作
  11. 场景 3:返回值
  12. 1.4 const 引用
  13. 作用 1:防止变量被修改
  14. 作用 2:效率优化
  15. 作用 3:隐式类型转换
  16. 1.5 引用和指针的关系
  17. 二、inline 内联函数
  18. 三、nullptr

更多推荐文章

查看全部
  • PyCharm 中 GitHub Copilot 插件安装与配置指南
  • Trae 集成图片素描 MCP 实现多风格图像转换
  • PyTorch 实战:从拟合直线到识别手写数字
  • 大模型技术学习与发展的路径梳理
  • 前端埋点实现方式与核心原理
  • 大型语言模型在疾病诊断中的应用综述
  • 小模型思维链(CoT)能力微调与优化实践
  • 37 个 Python Web 开发框架整理与选型指南
  • Stable Diffusion 入门:AI 绘画原理与本地部署指南
  • Zvec 架构深度解析:阿里开源轻量级进程内向量数据库
  • 多 Agent 系统方案:从 LLM 洞见到实践应用
  • 前端核心面试题详解:从闭包原理到性能优化实战
  • Docker 部署 AI 量化分析平台及波浪理论实战
  • Java 算法:模拟类题目实战
  • HarmonyOS NEXT 静默登录与多维数据同步体系构建
  • 大厂 HR 揭秘:为什么年底才是找工作的黄金期
  • Llama 3 大模型技术报告详解:架构、训练与评估
  • Java IO 流:核心原理与实战应用指南
  • 项目部署实战:Linux、Docker 与 Jenkins 流程
  • Stable Diffusion 3.5-FP8 模型是否支持 WebGPU 加速

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online