C++ 指针

2025 年 6 月 23 日 | 阅读 8 分钟

在 C++ 编程语言中,指针是一个变量,也称为定位符或指示符,它指向一个值的地址。地址的符号由指针 (*) 星号表示。除了创建和修改动态数据结构外,指针还可以实现按引用传递(call-by-reference)。

指针在 C++ 中的主要应用之一是遍历数组和其他数据结构。在 C++ 中,我们可以声明与数组元素具有相同数据类型的指针变量,并为其赋值第一个元素的地址。这使得我们可以使用指针算术进行直接访问和操作。

语法

它具有以下语法:

在这个语法中,

  • 数据类型:表示指针定义的数据类型。
  • 变量名:表示分配给指针的名称。

为指针分配地址

在 C++ 中,地址运算符 (&) 主要用于存储变量的地址。之后,该地址可以分配给指针变量进行初始化。

示例

在此示例中,ptr 使用地址运算符 (&) 表示存储变量 num 地址的指针。

解引用指针

在 C++ 中,解引用是访问存储在内存地址中的值的过程。它使用解引用运算符执行。它由 (*) 运算符表示。

C++ 指针示例

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

示例

编译并运行

输出

Address of number variable is: 0x7ffc7d468acc
Address of p variable is: 0x7ffc7d468acc
Value of p variable is: 45

说明

在此示例中,我们取了一个整数和一个指针 p,该指针用于存储该整数的地址。之后,程序通过指针 p 访问并打印存储在该地址的值。

如何在 C++ 中使用指针?

如果要创建 C++ 指针,需要遵循以下步骤。

  1. 首先,需要创建一个指针变量。
  2. 之后,需要使用一元地址运算符 (&) 来获取变量的地址,并将其分配给指针以初始化指针。
  3. 使用一元间接运算符 (*),它根据其参数提供的地址返回变量的值,我们可以访问存储在地址中的值。

由于数据类型知道信息占用的字节数,因此我们将其与引用关联起来。当我们递增指针时,会加上指针所指向数据类型的大小。

Cpp Pointers

指针使用的符号

C++ 指针通常使用两个符号。

符号名称描述
& (与号)地址运算符确定变量的地址。
* (星号)间接运算符访问地址中的值。

C++ 指针示例:在不使用第三个变量的情况下交换两个数字

让我们举一个例子来说明如何在 C++ 中在不使用第三个变量的情况下交换两个数字。

示例

编译并运行

输出

Before swap: ∗p1=20 ∗p2=10
After swap: ∗p1=10 ∗p2=20

说明

在此示例中,我们使用指针和算术运算在没有临时变量的情况下交换两个整数的值。首先,我们将 p1 和 p2 指向的值相加,然后调整每个值以完成交换。之后,程序显示交换前后的值,这展示了指针的操纵和解引用。

指针的类型

C++ 中有几种类型的指针。一些主要的指针类型如下

空指针

在 C++ 中,空指针是指被赋值为 nullptr(或 NULL)且不指向任何有效内存位置的指针。当我们不希望该空指针指向任何对象时,它主要用于初始化指针。

语法

它具有以下语法:

C++ 空指针示例

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

void 指针

在 C++ 中,void 指针是一种特殊的指针类型,它可以指向任何数据类型。void 指针不能直接解引用。在解引用它们之前,必须将它们转换为指向特定数据类型的另一个指针类型。

野指针

在 C++ 中,野指针是已初始化且指向某个随机内存位置的指针。

语法

它具有以下语法:

悬空指针

在 C++ 中,悬空指针是指向已删除(或释放)的内存位置的指针。它充当野指针,可能导致 C++ 程序出错。

语法

它具有以下语法:

智能指针

在 C++ 中,智能指针是 STL 提供的类模板,用于自动管理动态分配的内存。它是指针的包装类,重载了 * 和 -> 等运算符。当内存不再使用时,智能指针会自动释放内存,这有助于防止内存泄漏、悬空指针等。

指向指针的指针

在 C++ 中,我们可以构建一个指向另一个指针的指针,然后该指针可以指向数据或另一个指针。在声明指针时,需要为每个间接级别使用一元运算符 (*)。

C++ 指向指针的指针示例

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

示例

编译并运行

输出

18
18

C++ 中的引用和指针是什么?

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

  1. 值传递
  2. 通过指针参数进行引用传递
  3. 通过引用参数进行引用传递

示例

编译并运行

输出

address of n1 in main(): 0x7ffd90fcf5ec
Square of n1: address of n1 in square1(): 0x7ffd90fcf5cc
64
No change in n1: 8
address of n2 in main(): 0x7ffd90fcf5f0
address of n2 in square2(): 0x7ffd90fcf5f0
Square of n2: 64
Change reflected in n2: 64
address of n3 in main(): 0x7ffd90fcf5f4
address of n3 in square3(): 0x7ffd90fcf5f4
Square of n3: 64
Change reflected in n3: 64

说明

在此示例中,我们在 C++ 中比较了值传递、指针传递和引用传递。它表明在值传递(square1)中,某些修改不会影响原始变量。相比之下,指针传递(square2)和引用传递(square3)都允许函数更改原始值,如匹配的内存地址和更新的结果所示。

指针的优点

C++ 指针的几个优点如下

  • 指针可以精简代码并提高性能,它用于检索字符串、树等,并与数组、结构和函数一起使用。
  • 我们可以使用指针从函数返回多个值。
  • 它允许我们访问计算机内存中的任何内存位置。

指针的用法

C++ 语言中的指针有很多用途。其中一些如下

1) 动态内存分配

在 C++ 语言中,我们可以使用 malloc() 和 calloc() 函数动态分配内存,其中会使用指针。

2) 数组、函数和结构

C++ 语言中的指针广泛用于数组、函数和结构。它精简了代码并提高了性能。

3) 实现数据结构

在 C++ 中,指针可用于实现复杂的数据结构,包括链表、树和图。它允许动态地分配和链接元素。

C++ 指针常见问题解答

1) C++ 中的指针是什么?

在 C++ 中,指针是一个变量,也称为定位符或指示符,它指向一个值的地址。它使我们能够直接访问和操作存储在该地址的数据。

2) 我们如何在 C++ 中声明指针?

可以使用 (*) 运算符声明指针。

示例

3) C++ 中的 & 符号是什么意思?

在 C++ 中,& 符号用于存储变量的地址。

4) C++ 中解引用指针是什么意思?

在 C++ 中,解引用是访问存储在内存地址中的值的过程。

例如

5) C++ 中的 NULL 指针是什么?

在 C++ 中,空指针是指被赋值为 nullptr(或 NULL)且不指向任何有效内存位置的指针。