C语言 ptr++和ptr + 1之间的差异

s2j5cfk0  于 2023-01-04  发布在  其他
关注(0)|答案(3)|浏览(171)

我写了一段代码用递归来反转一个字符串。当我运行它的时候,我得到了一个分段错误。

#include <stdio.h>

void _print_rev_recursion(char *s);

int main() {

    _print_rev_recursion("string reversal");

    return (0);

}

void _print_rev_recursion(char *s)

{

    if (!*s)

        return; 

    _print_rev_recursion(s++);

    putchar(*s);

}

当我把s改成s + 1的时候,代码是可以工作的。我想s和s+1的意思是一样的。我需要澄清。
下面是有效的代码:

#include <stdio.h>

void _print_rev_recursion(char *s);

int main() {

    _print_rev_recursion("string reversal");

    return (0);

}

void _print_rev_recursion(char *s)

{

    if (!*s)

        return; 

    _print_rev_recursion(s + 1);

    putchar(*s);

}
mm9b1k5b

mm9b1k5b1#

ptr++是后缀递增运算符,而ptr + 1是将ptr的值加1的算术表达式。
两者之间的主要区别是ptr ++在当前语句执行后将ptr的值加1,而ptr +1将ptr的当前值加1,但不更改ptr本身的值。
例如,考虑以下代码:

int i = 1;
int j = i++;

执行完这段代码后,i的值将为2,但j的值将为1,因为后缀递增运算符在将i的值赋给j后会递增i的值。
另一方面,考虑下面的代码:

int i = 1;
int j = i + 1;

在执行完该代码之后,i的值仍将是1,但j的值将是2,因为算术表达式i +1将1加到i的当前值,但不改变i本身的值。

5kgi1eie

5kgi1eie2#

我以为s ++和s +1的意思是一样的
他们没有。
s++改变s,而s+1不改变。
表达式的值也不同。s++在增量之前的值为ss+1的值为s + 1

k3bvogb1

k3bvogb13#

s++的情况下,增量发生在函数被调用 * 之后 *,所以你得到无限递归。s+1使增量发生在递归调用之前。

相关问题