导读:本期聚焦于小伙伴创作的《为什么在函数中修改指针变量的值,函数外部却无法获取到修改后的值?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《为什么在函数中修改指针变量的值,函数外部却无法获取到修改后的值?》有用,将其分享出去将是对创作者最好的鼓励。

在C语言等支持指针的编程语言中,函数参数传递默认采用值传递的方式,这个机制是导致函数内修改指针变量值无法同步到外部的核心原因。很多开发者会混淆指针指向的内容修改和指针变量本身修改的差异,从而产生疑惑。

为什么在函数中修改指针变量的值,函数外部却无法获取到修改后的值?

值传递的核心逻辑

值传递的本质是函数调用时,会把实参的值复制一份给形参,形参和实参是两个独立的变量,修改形参的值不会影响实参。即使实参是指针,这个规则依然成立,因为指针本身也是一个变量,存储的是内存地址。

比如我们有一个指针变量int* p,它存储的是某个整型变量的地址,当我们把p作为参数传给函数时,函数内部的形参int* qp的副本,qp一开始存储相同的地址,但它们是两个不同的变量。

错误示例演示

下面是一段典型的错误代码,尝试在函数内修改指针变量本身的值,希望函数外部能获取到修改后的指针:

#include <stdio.h>
#include <stdlib.h>

// 尝试修改指针变量本身的值
void change_pointer(int* ptr) {
    // 为ptr分配新的内存,修改的是形参ptr的值
    ptr = (int*)malloc(sizeof(int));
    *ptr = 100;
    printf("函数内ptr指向的值:%dn", *ptr);
}

int main() {
    int a = 10;
    int* p = &a;
    printf("调用前p指向的值:%dn", *p);
    change_pointer(p);
    // 这里访问*p还是原来的a的值,不是100
    printf("调用后p指向的值:%dn", *p);
    return 0;
}

这段代码的执行结果是,函数内打印的值是100,但是函数调用后,main函数里的p还是指向原来的变量a,指向的值还是10。原因就是change_pointer函数的形参ptrp的副本,函数内给ptr赋值新的地址,只是修改了副本的内容,不会影响原来的p变量。

正确的修改方式

如果想要在函数内修改指针变量本身的值,并且让外部能获取到修改结果,需要传递指针的指针,也就是二级指针,这样函数的形参就能指向外部的指针变量,修改形参指向的内容就能同步到外部。

修改后的正确代码如下:

#include <stdio.h>
#include <stdlib.h>

// 传递二级指针,修改指针变量本身的值
void change_pointer(int** ptr) {
    // 修改*ptr,也就是外部的指针变量的值
    *ptr = (int*)malloc(sizeof(int));
    **ptr = 100;
    printf("函数内指针指向的值:%dn", **ptr);
}

int main() {
    int a = 10;
    int* p = &a;
    printf("调用前p指向的值:%dn", *p);
    change_pointer(&p);
    // 此时p已经指向新分配的内存,值为100
    printf("调用后p指向的值:%dn", *p);
    // 记得释放分配的内存
    free(p);
    return 0;
}

这里函数的形参是int** ptr,我们传入的是p的地址&p,那么*ptr就对应外部的p变量,修改*ptr的值就是修改p的值,这样函数外部的指针变量就能获取到修改后的结果。

常见误区对比

很多开发者会混淆两种修改场景,我们可以通过表格对比两种场景的差异:

修改场景是否需要二级指针示例
修改指针指向的内存中的内容不需要函数内执行*ptr = 20,修改的是ptr指向的整型变量的值
修改指针变量本身存储的地址需要函数内执行ptr = 新地址,需要二级指针才能同步到外部

总结

函数内修改指针变量的值无法同步到外部,根本原因是函数参数的值传递机制,形参是实参的副本,修改形参不影响实参。如果需要修改指针变量本身,需要传递二级指针,通过解引用二级指针来修改外部指针变量的值。而如果是修改指针指向的内容,直接传递一级指针即可。理解这个差异能帮助开发者更清晰地使用指针,避免不必要的错误。

指针函数参数传递值传递指针变量修改C语言修改时间:2026-07-13 23:33:23

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。