C++指针核心用法详解:声明、运算与常量指针区分

周予安
周予安
发布时间:2026-10-15| 5人浏览过
原创

C++中的指针是存储内存地址的变量,能够直接操作内存数据。本文将系统讲解指针的声明与解引用、地址运算规则,重点辨析常量指针与指向常量的指针的区别,并展示指针在函数传参、返回值及类成员访问(this指针)中的实际应用场景。

指针基础:声明与解引用

指针本质上是一个存放内存地址的变量。在使用前必须明确其指向的数据类型,以确保正确的内存偏移和读写操作。

第1步:正确声明指针变量

目的:建立指针变量与目标数据类型的关联。

入口:C++源文件编辑器。

动作:使用 datatype* 语法声明指针,并使用取地址运算符 & 获取变量地址进行初始化。

重要参数:

  • * 表示当前变量是指针。
  • & 是取地址符,返回变量在内存中的起始地址。
int num = 0;
int* pnum = # // &num 表示 num 变量的内存地址,pnum 指向该地址

第2步:解引用获取或修改值

目的:通过指针访问其所指内存中存储的实际数据。

动作:在指针变量名前加 * 进行解引用。

int num = 1024;
int* pnum = #
cout << *pnum << endl; // 输出 1024,即 num 的值

指针运算与变量修改

指针支持加法与减法运算,但运算结果取决于指针指向的数据类型大小,而非单纯的字节数。

第3步:执行指针地址运算

目的:实现指向数组元素或其他相邻内存块的移动。

动作:对指针变量进行加法操作。编译器会自动将加数乘以该数据类型的大小。

int num = 1024;
int* pnum = &num;

// 打印初始地址
cout << pnum << " ";

// 指针后移 sizeof(int) 个单位(通常是一个 int 的大小)
pnum = pnum + sizeof(int);
cout << pnum; // 地址发生变化,如从 0x61ff08 变为 0x61ff18

注意:虽然示例中使用了 pnum + sizeof(int),但在常规编程中,若 pnum 是 int* 类型,pnum + 1 等同于向后移动一个 int 的长度。示例中的写法是为了直观展示地址偏移,具体数值因编译器和平台而异。

第4步:通过指针修改变量

目的:间接修改目标变量的值。

动作:解引用后进行操作。需注意运算符优先级,建议加括号明确意图。

int num = 1024;
int* pnum = &num;

(*pnum)++; // 先解引用再自增,num 变为 1025
// 若写成 *pnum++,则等价于 *(pnum++),指针会指向下一个内存位置,可能导致未定义行为

常量指针与指向常量的指针

理解 const 关键字的位置是区分这两者的关键:const 放在 * 左侧修饰值,放在右侧修饰指针本身。

第5步:声明常量指针(Pointer to Constant)

定义:指针指向的数据不可通过该指针修改,但指针本身可以指向其他地址。

声明格式:const datatype* ptr; 或 datatype const* ptr;

int num = 100;
const int* pnum = &num;

// num = 64; // 允许,因为原变量可改
// *pnum = 100; // 错误!不能通过指针修改值

第6步:声明指向常量的指针(Constant Pointer to Non-Constant)

定义:指针一旦绑定到一个地址,就不能再指向其他地址(相当于“只读地址”),但该位置的内存内容可以通过指针修改(除非内容本身也是 const)。

声明格式:datatype* const ptr;

关键点:声明和初始化必须在同一行完成,因为赋值操作无法改变指针的指向。

int num = 1024;
int* const pnum = &num; // 指针不可更改
// pnum = &other_var; // 错误!常量指针不可重新赋值
*pnum = 2048; // 正确!可以修改所指内存的值

注:数组名在表达式中通常退化为指向首元素的常量指针,其地址不可被重新赋值。

指针在函数中的应用

第7步:指针作为函数参数(传址调用)

目的:在函数内部修改外部变量的值,或通过指针访问大数据结构避免拷贝开销。

void change(int* p) {
    (*p)++; // 解引用并修改原值
}

int main() {
    int num = 1024;
    change(&num); // 传入地址
    cout << num; // 输出 1025
    return 0;
}

第8步:指针作为函数返回值

目的:返回动态分配的内存地址或数组指针。

int* movePointer(int* p) {
    p = p + 1; // 指针向后移动一位
    return p;
}

int main() {
    int list[] = {1, 2, 3};
    int* plist = list; // 指向第一个元素 1
    
    plist = movePointer(plist);
    cout << *plist << endl; // 输出 2,现在指向第二个元素
    return 0;
}

第9步:this 指针访问成员变量

目的:在类的成员函数中区分参数名与成员变量名,或显式调用对象方法。

class Circle {
public:
    double r;
    
    // 构造函数
    Circle(double r) {
        this->r = r; // 使用 this 指针指向当前对象的成员 r
    }
};

以上就是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 算法库。