我写了一个简单的函数来执行逆转:
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
第一个位置的指针。
答案 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的私有和本地变量。您可以在不影响调用函数范围内存在的原始值的情况下修改此值。