为什么当我们反转此函数中的字符串时,char *str 的指针没有改变?
Why doesn't the pointer for the char *str change when we reverse the string in this function?
我写了一个简单的函数来执行就地反转:
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私有的本地变量。 您可以随心所欲地修改此值,而不会影响调用函数作用域中存在的原始值。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 为什么在使用字符指针 str1 而不是 str 时会出现分段转储?
- 超级级别的方法称为super具有sub的str attr 实例在循环 实例中创建的方法是作为super的指针存储在向
- 为什么当我们反转此函数中的字符串时,char *str 的指针没有改变?
- basic_ostringstream::str悬挂指针
- 删除指针后,str 指针自身的占用空间可以存在