C语言中传递给void函数的一级指针能否修改其指向地址?
结论
仅调整func_p内部逻辑、不改变函数入参和返回值定义的前提下,不可能修改外部原指针的指向。
原理说明
C语言的参数传递默认是值传递,你把一级指针传入函数时,函数拿到的是原指针的独立副本,二者存在不同的内存空间,没有绑定关系。你在func_p里修改ptr的指向,本质是改的这个本地副本的值,完全不会影响到外部的原指针,不管做什么类型转换都绕不开这个规则。
你可以把指针直接当成普通变量理解:它的类型是int*,但本质就是存了个地址值的普通变量,传参逻辑和普通int变量没有任何区别:
int a = 1; void test(int x) { x = 2; // 这里改的是x的本地副本,外部的a不会变 }
类型转换只能改变你对某块内存存储数据的解读方式,不可能凭空让你拿到外部原指针所在内存的写入权限。你要修改外部任意一个变量的值,不管这个变量是普通int还是指针类型,都必须拿到这个变量本身的地址才能写入:
- 要修改
int类型的变量,需要传它的指针也就是int*类型入参 - 要修改
int*类型的指针变量,自然就需要传它的指针也就是int**类型的二级入参
这也是你示例中func_pp能够生效的核心逻辑。
内容的提问来源于stack exchange,提问作者loukritios
相关产品推荐
相关产品推荐

