首页 > 解决方案 > 将指针作为参数传递时,编译器不需要/自动添加地址和符号吗?

问题描述

在下面的代码中,*Pointer 被传递给函数。

地址和符号被省略。

这些函数仍然可以修改传递的指针中的值。

编译器是否自动添加&?

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; 
}

标签: cfunctionpointers

解决方案


只有在指针上使用 * 时才会更改值。如果你不会,值不会改变,地址会改变。考虑这些函数:

char * first_arg(char * arg) {  
    arg = 'a';
    // some other code //
}

char * second_arg(char * arg) {  
    *arg = 'c';
    // some other code //
}

第一个函数将更改arg 指向的地址。这个函数可能很危险,因为我们现在不知道地址“a”中存储的内容。此功能可能会以意想不到的方式改变 otter 范围的行为。但它不会改变 arg 指向的值。(除了硬编码 arg 的确切地址的情况)

第二个函数将更改arg 指向的地址中的值。这是我们正在寻找的明确定义的行为。这只会改变 arg 指向的内存值。


推荐阅读