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

C语言将指针作为参数传递时,编译器会自动添加&地址符吗?

问题解答

首先明确结论:这不是编译器自动添加了&符号,属于C语言指针传递的正常行为。

具体原理如下:

  • C语言的函数参数默认都是值传递,你调用first_arg(command_pointer)时,是把command_pointer中存储的内存地址复制了一份,传给了函数形参arg。
  • 形参arg和外部的command_pointer虽然是两个独立的指针变量,但二者存储的内存地址完全一致,都指向input()返回的同一块内存空间。
  • 你在first_arg中执行*j = '\0'的操作,是直接修改这个公共地址指向的内存里的内容,自然会对外部生效,不需要额外添加&取地址符。

只有当你需要修改指针变量本身的取值(比如让外部的command_pointer指向另一块全新的内存,而非修改它当前指向的内存内容)时,才需要传递&command_pointer,此时对应的函数形参需要声明为二级指针char**类型。

你给出的示例代码属于标准的指针用法:

char * input();

void get_command() {
    char * command_pointer = input();
    char * second = second_arg(command_pointer); //second needs to be before first
    char * first = first_arg(command_pointer);   //becuase first adds a /0 
    choose(first, second);
    free(command_pointer);   
}

char * first_arg(char * arg) {  
    char * j = strchr(arg, '-');
    if(j==NULL) {
        return arg;
    }
    *j = '\0';
    return arg;
}

char * second_arg(char * arg) {  
    char * j = strchr(arg, '-');
    if( j==NULL  ) {
        return NULL;
    }
    return ++j; 
}

内容的提问来源于stack exchange,提问作者seamus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:54:04