为何C语言函数中的指针形参未完成重新赋值?
问题解析:为何函数内修改指针未影响主函数变量?
原代码
#include <stdio.h> void func(char *name, char *buff) { name = &buff[0]; } void main() { char name[4] = {'A','B','C','D'}; char buff[4] = {'E','F','G','H'}; printf("%s \n",name); func(&name[0], &buff[0]); printf("%s \n",name); }
运行输出
ABCD
ABCD
用户疑问
调用func函数试图将指针指向buff首地址后,main函数中的name未改变,为何func内的指针重新赋值没有生效?
问题原因
这是C语言值传递特性导致的:
- 当你把
&name[0](数组name的首地址)传递给func的char *name参数时,传递的是指针的副本——func内部的name是全新的局部变量,它和main里的数组name只是初始值相同,但存储在不同内存位置。 func里执行name = &buff[0];,只是修改了这个局部指针副本的指向,完全不会影响main里的数组name。另外要注意,main里的name是数组名,本质是常量指针,本身就不允许被修改指向。
解决方法
如果要实现让main里的指针指向buff的目的,需要传递指针的指针(双重指针),或者让函数返回新的指针。以下是双重指针的实现示例:
#include <stdio.h> void func(char **name, char *buff) { *name = buff; // 通过双重指针修改原指针的指向 } int main() { char name_arr[4] = {'A','B','C','D'}; char buff[4] = {'E','F','G','H'}; char *name = name_arr; // 用可修改的指针变量存储数组首地址 printf("%s \n", name); func(&name, buff); printf("%s \n", name); return 0; }
这段代码的运行输出会是:
ABCD
EFGH
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

