在C ++中增加一个char指针

Increment a char pointer in c++

我正在处理 Cracking the Coding Interview 中的一个问题。问题是:编写代码来反转 C 风格的字符串。 这是我得到的用 C++ 编写的答案,但我不明白增加一个字符指针背后的含义。

void swap(char &a, char &b){
    a = a^b;
    b = a^b;
    a = a^b;
}

void reverse1(char *s){
    if(!s) return;
    char *p = s, *q = s;
    while(*q) ++q;
    --q;
    while(p < q)
        swap(*p++, *q--);
}

我不明白的部分在第一个 while 循环的第二个函数中。 *p的条件是什么?为什么增量 q 会截断字符串中的起始字符?

例如,如果

char s[] = "1234567890";

s 传递给函数 reverse1 后,为什么 ++q 会得到像 "234567890" 这样的结果?

这就是终止字符串的'[=11=]' 的问题。

结果是:

0987654321

正如调用 reverse 的函数所预期的那样(在 Visual Studio 2013 中)

C 风格的字符串以 null(0x00 或 /0)结尾。

char s[] = "1234567890"; 会这样存储在内存中: 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x30 0x00

第一个 while 循环正在搜索字符串结尾。

在 while 循环开始时 q 指向 0x31

在每次迭代中,q 递增以指向下一个内存位置。

q指向0x00时循环中断。

pq 是指向 char 的指针,并且都被初始化为 string s[] 中第一个 char 的地址(作为名称C 中的数组是指向其第一个元素的指针)。 while (*q) q++;增加qchar的位置)直到到达字符串的末尾(NULL字符'[=20=]')。并且 --q 减少指向 NULL char 之前的位置,这是字符串的最后一个元素 (char)。

这就是为什么在将字符串传递给 reverse1() 并执行 ++q 后,结果将从第二个字符而不是第一个字符开始。

字符串是数组。 q 指向字符串的第一个字符。所以当你增加 q 时。 q 将指向下一个字符。