C++指针变量详解:定义、运算符与实战应用

周叙
周叙
发布时间:2026-10-13| 5人浏览过
原创

指针是C++语言的核心特性之一,用于直接操作内存地址。本文详细解析指针变量的定义规则、取地址符(&)与间接访问符(*)的使用逻辑,并通过实例展示如何通过改变指针指向来实现数据排序,避免不必要的内存拷贝。

理解指针变量的基本概念

在C++中,指针变量是一种特殊的变量,它存储的不是普通的数据值(如整数或字符),而是另一个变量的内存地址。为了区分普通变量和指针所指向的目标,C++使用*符号来表示“指向”关系。例如,如果i_pointer是一个指针变量,那么*i_pointer表示的是该指针当前指向的那个目标变量的值。

虽然直接对变量赋值与通过解引用指针赋值在结果上可能相同,但其背后的逻辑截然不同:
i = 3;
*i_pointer = 3;

前者是直接修改变量 i 的值,后者则是通过指针找到对应的内存位置并写入值 3。

正确定义指针变量

C++要求所有变量在使用前必须声明类型,指针变量也不例外。定义指针时,必须指定其“基类型”,这决定了该指针只能指向特定类型的数据。

第1步:确定基类型与变量名

  • 目的:明确指针可以指向的数据种类。
  • 入口/动作:使用语法 基类型 *指针变量名;。
  • 关键参数:基类型(如 int, float)必须是合法的C++类型;*仅表示这是一个指针,不是变量名的一部分。

合法的定义示例:
int i, j; // 定义整型变量
int *pointer_1, *pointer_2; // 定义两个指向整数的指针
float *pointer_3; // 指向单精度浮点数
char *pointer_4; // 指向字符

注意:pointer_3 是指针变量名,而非 *pointer_3。编译系统通常为每个指针变量分配 4 字节(具体取决于平台架构)的存储空间,用于保存地址。

第2步:建立指向关系

定义指针后,需要将其指向具体的变量。方法是将被指变量的地址赋给指针。在C++中,使用取地址运算符 & 获取变量的内存地址。

pointer_1 = &i; // 将变量 i 的地址赋值给 pointer_1
pointer_2 = &j; // 将变量 j 的地址赋值给 pointer_2

执行上述代码后,pointer_1 就“指向”了变量 i。此时,*pointer_1 等价于 i。

核心运算符与逻辑推导

操作指针主要依赖两个一元运算符:&(取地址)和 *(间接访问/解引用)。理解它们的优先级和结合方向至关重要。

1. 双重运算的逻辑等价性

当 pointer_1 = &a; 执行后:

  • &*pointer_1:根据自右至左的结合性,先计算 *pointer_1 得到变量 a,再对其取地址 &a。因此 &*pointer_1 等同于 &a。
  • *&a:先计算 &a 得到地址,再通过 * 访问该地址的内容,即得到 a 的值。因此 *&a 等同于 a。

这种互换性允许我们在代码中进行灵活的指针重定向。例如:pointer_2 = &*pointer_1; 会将 pointer_1 当前指向的对象地址赋给 pointer_2,使 pointer_2 也指向同一个目标。

2. 完整访问示例

以下代码展示了如何通过指针读取和输出变量值:

#include <iostream>
using namespace std;

int main() {
    int a = 100, b = 10;
    int *pointer_1 = &a;
    int *pointer_2 = &b;

    cout << a << " " << b << endl;          // 输出原始值:100 10
    cout << *pointer_1 << " " << *pointer_2 << endl; // 输出指针指向的值:100 10
    return 0;
}

实战:利用指针交换实现降序输出

在处理大型数据结构时,直接交换数据内容开销较大。通过交换指针的指向来实现逻辑上的顺序调整,是一种高效且常见的编程技巧。

第3步:指针交换算法流程

  • 目标:输入两个整数 a 和 b,按从大到小的顺序输出。
  • 准备:创建指针 p1 指向 a,p2 指向 b。
  • 判断:比较 a 和 b 的大小。若 a < b,说明当前的指向顺序不符合降序要求。
  • 动作:交换指针 p1 和 p2 的值(即交换它们存储的地址),而不是交换 a 和 b 的实际内容。

实现代码如下:

#include <iostream>
using namespace std;

int main() {
    int *p1, *p2, *p, a, b;
    cin >> a >> b;

    p1 = &a;
    p2 = &b;

    if (a < b) {
        p = p1;      // 临时变量暂存 p1
        p1 = p2;     // p1 改为指向 b
        p2 = p;      // p2 改为指向原来的 a
    }

    cout << "max=" << *p1 << " min=" << *p2 << endl;
    return 0;
}

假设输入 45 和 78。由于 45 < 78,程序执行指针交换。最终 p1 指向 78,p2 指向 45。通过 *p1 和 *p2 输出,实现了降序排列。

这种方法并未修改 a 和 b 在内存中的实际存储内容,仅仅是改变了观察它们的“视角”。在需要频繁移动大量数据的位置信息(如在数组排序或链表操作中)时,交换指针比复制数据要快得多。

以上就是C++中指针变量定义、运算符使用及指针交换应用的详细内容,更多关于C++基础编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。