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
相关产品推荐
相关产品推荐

