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

时间:2014-12-23 16:33:42

标签: c++

我写了一个简单的函数来执行逆转:

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第一个位置的指针。

2 个答案:

答案 0 :(得分:3)

你实际上是在暗示,因为'str'是按值传递的(读作:'作为临时变量中的副本')。

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

void increment(int x) {
  x++;
}

int i = 1;
cout << i << endl;
increment(i);
cout << i << endl;

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

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

答案 1 :(得分:1)

函数void in_place_reverse(char *str)的声明导致在调用函数时创建的指针的副本,在名为str的变量中,该变量是in_place_reverse的私有和本地变量。您可以在不影响调用函数范围内存在的原始值的情况下修改此值。