为什么当我们反转此函数中的字符串时,char *str 的指针没有改变?

Why doesn't the pointer for the char *str change when we reverse the string in this function?

本文关键字:str 指针 char 改变 字符串 我们 为什么 函数      更新时间:2023-10-16

我写了一个简单的函数来执行就地反转:

void in_place_reverse(char *str){
    if(!str || !(*str)){
        return;
    }
    char *str_end = str+strlen(str)-1;
    int temp;
    while(str < str_end){
        temp = *str;
        *(str++) = *str_end;
        *(str_end--) = temp;
    }
}

我只是想知道为什么当我做这样的事情时:

char str[] = "Reverse me!";
cout << "Original: " << str << endl;
in_place_reverse(str);
cout << "Reversed: " << str << endl;

str函数内部未更改。我问的原因是,*(str++)行正在增加指向str的指针。所以我真正要问的是为什么这样的事情是不必要的:

char *str_beg = str;
char *str_end = str+strlen(str)-1;
int temp;
while(str_beg < str_end){
    temp = *str_beg;
    *(str_beg++) = *str_end;
    *(str_end--) = temp;
}

这样我们实际上就不会更改指向str第一个位置的指针。

你实际上是隐式地这样做的,因为"str"是按值传递的(阅读:"作为临时变量中的副本")。

要在没有(分散注意力的)指针的情况下澄清这一点:考虑

void increment(int x) {
  x++;
}
int i = 1;
cout << i << endl;
increment(i);
cout << i << endl;

这将打印"1"两次。在increment例程中看到x与传递的i具有相同的。但它不是同一个变量i.事实上,它是i的副本。当我们从例程中返回时,副本将被丢弃。延伸阅读:如果我们通过引用传递x,情况会有所不同,如下所示:

void increment(int &x) {
  x++;
}
函数

void in_place_reverse(char *str)的声明会导致在调用函数时在名为str的变量中创建指针的副本,该变量是in_place_reverse私有的本地变量。 您可以随心所欲地修改此值,而不会影响调用函数作用域中存在的原始值。