C++ 中引用与指针的区别

2025年5月30日 | 6 分钟阅读

在 C++ 中,引用和指针看起来相似,但它们之间存在一些差异。引用是现有变量的另一个名称的变量,而指针是存储另一个变量地址的变量。

在本文中,我们将讨论 C++ 中引用指针的区别。在讨论它们的区别之前,我们必须了解 C++ 中的引用和指针。

C++ 中的引用是什么?

引用是使用与号 (&) 符号定义的。现有变量的别名在 C++ 中是引用变量,它通过不同的名称访问相同的内存位置。一旦将引用初始化为变量,就不能修改它以引用另一个变量。

C++ 引用示例

让我们通过一个例子来说明 C++ 中的引用。

示例

编译并运行

输出

The value of 'i' variable is :8

说明

在此示例中,我们为变量 'i' 创建了一个引用变量,即 'a'。创建引用变量后,我们可以借助变量 'a' 访问 'i' 的值。

C++ 中的指针是什么?

指针是包含另一个变量地址的变量。可以使用 (*) 运算符解引用它以访问指针指向的内存位置。它可以与任何数据类型一起使用,例如数组、基本数据类型和用户定义类型,包括和结构。

C++ 指针示例

让我们通过一个例子来说明 C++ 中的指针。

示例

编译并运行

输出

First number: 13
Second number: 9
Addition: 22

说明

在此示例中,我们将两个整数 x 和 y 的地址存储在指针 ptr1 和 ptr2 中,然后使用解引用(*ptr1 和 *ptr2)访问它们的值以计算它们的和。最后,它打印原始值和加法结果。

引用和指针之间的主要区别

C++ 中引用和指针之间有几个主要区别。一些主要区别如下:

定义

在 C++ 中,引用变量是现有变量的另一个名称。它主要用于“按引用传递”,其中引用变量作为参数传递给函数,并且传递此变量的函数作用于变量的原始副本。另一方面,指针是一个存储另一个变量地址的变量。它通过保存某些变量的内存地址来简化编程。

声明

在 C++ 中,可以通过在变量前添加 '&' 符号来声明引用变量。如果此符号用于表达式中,它将被视为地址运算符。另一方面,在使用指针变量之前,我们应该声明一个指针变量,并且该变量是通过在变量前添加 '*' 运算符来创建的。

重新赋值

在 C++ 中,我们不能重新分配引用变量。另一方面,指针可以重新分配。当我们使用数据结构(如链表、树等)时,这很有用。

内存地址

在引用的情况下,引用和实际变量都指向相同的地址。引用总是指向它最初初始化的同一个变量。它不能更改以引用另一个变量。

引用示例

示例

编译并运行

输出

The address of 'a' variable is : 0x7fff078e7e44 
The address of 'i' variable is : 0x7fff078e7e4

说明

上面的输出显示引用变量和实际变量具有相同的地址。

在**指针**的情况下,指针变量和实际变量将具有不同的内存地址。

指针示例

示例

编译并运行

输出

The memory address of p variable is :0x7ffef9ea3db0
The memory address of k variable is :0x7ffef9ea3dac

空值

在 C++ 中,我们不能将 NULL 值赋给引用变量。另一方面,指针变量可以赋 NULL 值。

间接

在 C++ 中,指针可以有指向指针的指针,这提供了多个级别的间接。

指针示例

示例

编译并运行

输出

The value of q is : 0x7fffc17a95f4

说明

在此示例中,指针 'p' 指向变量 'a',而 'q' 是一个双指针,指向 'p'。因此,我们可以说 'p' 的值将是 'a' 变量的地址,而 'q' 变量的值将是 'p' 变量的地址。

另一方面,引用在 C++ 中只包含一个级别的间接。

引用示例

示例

编译并运行

输出

main.cpp: In function 'int main()':
main.cpp:18:10: error: cannot bind 'int' lvalue to 'int&&'
int &&q=p;  // Only valid with std::move

算术运算

在 C++ 中,算术运算可以应用于名为“指针算术”的指针。另一方面,算术运算不能应用于引用。在 C++ 中不存在“引用算术”这个词。

引用和指针的表格形式区别

在这里,我们将以表格形式讨论 C++ 中引用和指针的几个区别。

特点引用指针
定义它表示现有变量的别名。它是一个包含另一个变量内存地址的变量。
语法int &ref = var;int *ptr = &var;
Null 检查它不能为空。它可以为 null。
重新赋值引用不能重新分配给另一个变量。指针可以重新分配以指向不同的变量。
参数引用使用按引用传递语义进行传递。指针可以通过传递变量的地址来模拟按引用传递。
内存地址它用于共享与原始值相同的地址。它包含自己的内存地址。
间接它只提供一个级别的间接。它提供额外级别的间接。

结论

总之,C++ 引用和指针都提供了几种间接访问和操作数据的方法,但它们可以用于不同的目的。引用易于理解和简单,这使它们适用于参数传递和别名。

另一方面,指针提供更大的灵活性,支持空值、重新分配和动态内存处理。我们可以根据需要选择这些方法。当需要简单性和安全性时,引用是合适的,而当需要更多控制和动态行为时,指针是合适的。

C++ 中引用和指针的区别常见问题

1) C++ 中引用和指针的主要区别是什么?

引用和指针的主要区别在于,引用是变量的别名,而指针保存变量的内存地址。

2) C++ 中的指针可以重新分配吗?

是的,C++ 中的指针可以重新分配以指向不同的变量。

3) C++ 中引用比指针提供更高的安全性吗?

是的,引用比指针提供更高的安全性,因为它们必须被初始化且不能为 null。

4) C++ 中的引用可以像指针一样为 Null 吗?

不,引用应该引用一个有效的变量。指针可以为 Null。

5) C++ 中指针需要解引用才能访问值吗?

是的,指针需要使用 * 运算符来访问值。