增加C ++中的指针

时间:2011-05-10 23:06:41

标签: 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;
}

4 个答案:

答案 0 :(得分:7)

++运算符递增指针值,但随后返回原始值...因此print(s++)将在递增之前打印s的值,因为即使它添加了值为1到s,使得s存储的值等于s+1,它仍然返回原始值s作为< em>结果的操作。另一方面,print(s+1)在增量后打印值,但非常重要的是不会修改s的原始值。因此,语句s+1结果只是一个新的临时指针值... s的原始值未被修改。

此外,由于您使用s运算符增加并更改++的值,因此当您调用cout时,您现在将值打印到新指针的任何位置指向(如果你不小心,并且新的内存位置s指向的话没有用户可访问的内存),这可能会导致崩溃或分段错误。使用s+1时,s的值仍未修改,因此cout的结果将位于s最初指向的位置。


编辑:

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

答案 1 :(得分:1)

  1. s++s+1两个表达式都与增加指针本身的位置有关,而不是指针位置包含的值

  2. s++的价值仅为ss+1的值是s的一个位置!

  3. 执行ss++的值比以前更进一步。使用s+1后,s的值不变。
  4. 因此,他们打印字母的顺序是相反的!

答案 2 :(得分:1)

由于看起来OP将print(s++)更改为print(++s),这是非常不同的,这里是对这个新版本的解释。

在第一个例子中,你有:

print(s+1);
cout << *s;

s + 1不会修改s。因此,如果s是4,而你print(s+1),则之后s仍然是4。

print(++s);
cout << *s;

在这种情况下,++ s修改s的本地值。它将它递增1.因此,如果它在print(++s)之前为4,则之后 5

在这两种情况下,相当于s + 1的值都会传递给print函数,导致它打印下一个字符。

因此,两个函数之间的区别在于第一个函数将递归打印字符#0,然后是1,2,3,...,而第二个函数打印1,2,3,4 ......(...它会跳过第一个字符并在之后打印“\ 0”。

例:
对于s+1版本,print("hello")将导致h e l l o 对于++s版本,print("hello")将导致e l l o \0

答案 3 :(得分:0)

我将尝试解释前后增量的示例,您可以从中解决自己发布的问题。

#include <iostream>

void foo(int num)
{
    std::cout << num << "\n" ;
}

int main()
{
    int number = 10 ;

    foo( number++ ) ;
    foo( ++number ) ;
    foo( number + 1 ) ;

    getchar() ;

    return 0 ;
}

<强>输出:

  

10
  12个
  13

为什么10?

foo( number++ ) ;

后增量操作在数字上完成。含义,数字的值首先传递给foo,然后数字的值在foo返回时递增。因此,在函数返回后,数字为11。

为什么12?

foo( ++number ) ;

预增量操作在数字上完成。这意味着,在调用foo之前,number的值会增加到12.然后传递给foo。因此,即使在函数返回后,数字仍为12。

为什么选择13?

这是直截了当的。 数字的值未修改,但传递的值为数字的值加1。在此过程中,不会修改数字。因此,即使在函数返回后,数字仍然是12。

希望这有助于自己解决问题(尽管在你的情况下是纸笔练习):)