【入门级-C++程序设计:11、指针与引用-引 用】

引用是C++中一种重要的复合类型,它为已存在的变量提供了一个别名。引用本质上是对另一个变量的间接访问方式,但与指针不同,引用提供了更安全、更直观的语法。

基本语法

类型 &引用名 = 被引用变量;

举例说明:

int x = 10;

int &ref = x; // ref是x的引用(别名)

ref = 20; // 给ref赋值为20,现在x的值变为20

cout << x; // 输出20

下面通过几个具体的例子来详细说明C++中引用的使用和特性:

示例1:基本引用使用

#include

using namespace std;

int main() {

int num = 42;

int &ref = num; // ref是num的引用(别名),初始化,声明时绑定到有效变量num

cout << "num: " << num << endl; // 输出42

cout << "ref: " << ref << endl; // 输出42

ref = 100; // 通过引用修改值

cout << "修改后 num: " << num << endl; // 输出100

// 验证它们的内存地址相同

cout << "&num: " << &num << endl;

cout << "&ref: " << &ref << endl; // 输出相同的地址

return 0;

}

输出:

num: 42

ref: 42

修改后 num: 100

&num: 0x7ffd4a3b5a24

&ref: 0x7ffd4a3b5a24

说明:

ref 和 num 是同一块内存的别名,修改 ref 等同于修改 num。

引用和原变量的地址相同。

示例2:引用必须在声明时初始化

int main() {

int x = 10;

int &ref1 = x; // 正确:声明时初始化

int &ref2; // 错误:引用必须初始化(编译报错)

return 0;

}

说明:

引用必须在定义时绑定到一个已存在的变量,不能先声明后赋值。

示例3:函数参数传递(避免拷贝)

#include

using namespace std;

void swap(int &a, int &b) {

int temp = a;

a = b;

b = temp;

}

int main() {

int m = 5, n = 10;

swap(m, n); // 传递引用,直接修改原值

cout << "m: " << m << ", n: " << n << endl; // 输出 m: 10, n: 5

return 0;

}

输出:

m: 10, n: 5

说明:

函数参数使用引用时,可以直接修改实参的值(类似指针但语法更简洁)。

避免了值传递时的拷贝开销(对大型对象尤其重要)。

示例4:引用 vs 指针

#include

using namespace std;

int main() {

int val = 50;

// 指针方式

int *ptr = &val;
ptr = 60; // 需要解引用操作符( )

// 引用方式

int &ref = val;

ref = 70; // 无需解引用,直接使用

cout << "val: " << val << endl; // 输出70

return 0;

}

说明:

引用比指针更安全(无空引用风险)且语法更直观。

示例5:常量引用(避免修改)

#include

using namespace std;

void printValue(const int &r) {

// r = 100; // 错误:不能通过常量引用修改值

cout << "值: " << r << endl;

}

int main() {

int x = 42;

printValue(x); // 安全传递,避免拷贝

return 0;

}

说明:

const int & 表示只读引用,适用于不希望函数修改实参的场景。

常用于传递大型对象(如std::string)以避免拷贝开销。

示例6:引用不能重新绑定

int main() {

int a = 1, b = 2;

int &ref = a;

ref = b; // 这是将b的值赋给a,而非让ref改为引用b!

cout << a; // 输出2(a的值被修改为2)

return 0;

}

说明:

引用一旦初始化后,不能再绑定到其他变量。ref = b 是赋值操作,而非重新绑定。

引用的特点总结

别名性质:引用不是独立的对象,它只是已存在变量的另一个名字,引用和原变量共享同一内存地址。

做函数参数:引用传递可避免拷贝,且能修改实参(若需只读则加const)。

必须初始化:引用在声明时必须初始化,声明时需绑定到有效变量;且之后不能改变绑定的对象,减少了意外修改的风险。

安全性(无空引用):引用必须绑定到一个有效的对象(指向有效对象),不存在"空引用",避免了空指针风险。

自动解引用:使用引用时不需要特殊语法,就像使用普通变量一样,不需要解引用操作符(*)。

相关推荐
晓蛋2 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
weilx12342 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
傲世仙尊2 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
牵猫散步的鱼儿2 天前
重载、重写(覆盖)、重定义区别
c语言
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
phltxy2 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
Smileyqp沛沛2 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++