【入门级-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)。

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

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

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

相关推荐
资深web全栈开发1 小时前
[特殊字符]图解 Golang 反射机制:从底层原理看动态类型的秘密
开发语言·后端·golang
顾安r5 小时前
11.8 脚本网页 星际逃生
c语言·前端·javascript·flask
报错小能手6 小时前
C++笔记——STL map
c++·笔记
LaoZhangGong1236 小时前
STM32 F103外部晶振8MHz改为12MHz,如何配置?
c语言·stm32·单片机·嵌入式硬件·晶振
独隅6 小时前
在 Lua 中,你可以使用 `os.date()` 函数轻松地将时间戳转换为格式化的时间字符串
开发语言·lua
思麟呀7 小时前
Linux的基础IO流
linux·运维·服务器·开发语言·c++
星释7 小时前
Rust 练习册 :Pythagorean Triplet与数学算法
开发语言·算法·rust
星释7 小时前
Rust 练习册 :Nth Prime与素数算法
开发语言·算法·rust
lkbhua莱克瓦247 小时前
Java基础——集合进阶3
java·开发语言·笔记
多喝开水少熬夜8 小时前
Trie树相关算法题java实现
java·开发语言·算法