增加C++中的指针

use*_*652 1 c++ pointers

为什么以下两个代码段不相等?

void print (char* s) {
  if (*s == '\0')
     return;
    print(s+1);
   cout << *s;
}

void print (char* s) {
  if (*s == '\0')
     return;
    print(++s);
   cout << *s;
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*son 7

++运营商递增指针值,但随后返回原来的价值...所以print(s++)会打印的价值s增量之前,因为即使它增加了1的值s,使得存储在价值s相等s+1,但仍返回原来的s作为操作结果的值.另一方面,print(s+1)在增量后打印值,但非常重要的是不修改原始值s.因此语句的结果s+1只是一个新的临时指针值...原始值s未被修改.

此外,由于你已经增加和改变的价值s++运营商,当你打电话cout,你现在的打印值到哪里新的指针指向(这可能导致崩溃或分段错,如果你不小心和新内存位置没有用户可访问的内存s指向).随着s+1,s遗骸的价值未经修改,因此结果couts是最初指向的地方.


编辑:

正如迈克尔所指出的,这实际上是一个递归函数,所以第二个例子只是print()用相同的参数继续调用,因为如前所述,返回的值s++是原始值s.这意味着你最终会在某个时刻出现堆栈溢出,只是崩溃,除非s指向的值已经是NULL字符.

  • 实际上,第二个版本不会打印任何内容,但最终会导致堆栈溢出,除非字符串为空(或者,在编译器部分进行了非常聪明的优化,无限循环).由于使用后增量而不是预增量,该方法使用它收到的相同参数调用自身. (2认同)