C++指针传递的作用:如何修改外部变量值

小石头
小石头
发布时间:2026-10-13| 3人浏览过
原创

在C/C++编程中,函数参数传递是核心概念之一。很多开发者困惑于为什么Java或Python中的引用类型传参也无法直接替换对象,而在C++中却能轻松修改外部变量。本文将揭示值传递的本质,并详细演示如何利用一级指针和二级指针实现对外部变量的修改。

结果与目标

本文旨在澄清C++中参数传递的误区,重点解决以下问题:为什么基本类型和某些语言中的“引用类型”无法直接修改变量?如何通过指针正确地将修改传递给调用者?

准备条件

理解指针操作需要掌握C++的基本语法环境。我们需要比较以下两种场景:

  • 值传递(Pass by Value):副本传递,内部修改不影响外部。
  • 地址/指针传递(Pass by Pointer):传递内存地址,允许函数直接操作原数据。

真实操作顺序

第1步:分析值传递的局限性

目的:验证为何普通参数无法修改外部变量。

入口:定义一个整型变量并传入函数。

动作:观察函数内部的赋值是否生效。

void pointerTest(int num) {
    num = 20; // 仅修改了副本,原变量不变
}
 
int main() {
    int num = 10;
    pointerTest(num);
    printf("%d\n", num); // 打印结果为 10
    return 0;
}

即使切换到 Java 这样的语言,其 String 也是引用类型,但传入方法后重新赋值字符串依然无法影响外部变量:

public static void pointerTest(String str) {
    str = "wk"; // 只是改变了局部引用的指向
}
 
public static void main(String[] args) {
    String str = "test";
    pointerTest(str);
    System.out.println(str); // 打印结果仍为 test
}

结论:无论是 C++ 的值传递,还是其他语言的引用传递,直接替换整个对象或变量的操作通常只在函数的局部作用域内生效。

第2步:使用一级指针修改基础类型

目的:通过传递地址,实现在函数外修改整型变量。

入口:定义 int* 形参,并在调用时传入取址符 &。

动作:在函数内部使用解引用操作符 * 写入新值。

void pointerTest(int *num) {
    *num = 20; // 直接修改 num 指向的内存地址
}
 
int main() {
    int num = 10;
    pointerTest(&num); // 传递地址
    printf("%d\n", num); // 打印结果为 20
    return 0;
}

第3步:使用二级指针修改字符串指针

目的:处理更复杂的指针,如 C 语言中的 char* 字符串。

入口:接收类型为 char** 的双指针。

动作:对双重指针进行解引用,修改底层字符数组的地址。

void pointerTest(char **str) {
    *str = "wk"; // 修改外部字符串指针的指向
}
 
int main() {
    char *str = "test";
    pointerTest(&str); // 传递字符串指针的地址
    printf("%s\n", str); // 打印结果为 wk
    return 0;
}

完成判断

通过上述代码示例可以看到,只要传入的是变量的地址,而不是变量的值,函数就能通过解引用操作符(*)直接操控外部内存。这就解释了为什么在 C/C++ 中,指针赋予了函数“修改外部状态”的能力。

简要总结

C/C++ 中得益于指针机制,能够直接修改函数外的变量值。关键在于理解我们传递的其实是“操作的权限”,即内存地址。以上就是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 算法库。