You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:13:18