C++ 在c+中增加一个字符指针+;

C++ 在c+中增加一个字符指针+;,c++,pointers,while-loop,increment,C++,Pointers,While Loop,Increment,我正在写一个关于破解编码面试的问题。问题是:编写代码来反转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; whi

我正在写一个关于破解编码面试的问题。问题是:编写代码来反转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--);
}

s
传递到函数
reverse1
后,为什么
++q
会给您一个类似
“234567890”
的结果?

这是终止字符串的“
\0”
的问题

结果是:

0987654321
正如从名为reverse的函数(在Visual Studio 2013中)所预期的那样,

C样式字符串以null(0x00或/0)结尾

chars[]=“1234567890”将存储在内存中,如下所示:
0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x30 0x00

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

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

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


q
指向
0x00
时,循环中断。

p
q
是指向
char
的指针,它们都初始化为
字符串s[]
中第一个
char
的地址(因为
C
中的数组名称是指向其第一个元素的指针)<代码>while(*q)q++
增加
q
char
)的位置,直到到达字符串的末尾(
NULL
character
'\0'
)。和
--q
将位置减少到
NULL
char之前的位置,char是字符串的最后一个元素(char)


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

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

请不要使用xor
^
进行交换,因为它已损坏,请使用临时变量。C字符串以null结尾,因此
while(*q)
循环将遍历字符串中的字符,直到遇到null字符(计算结果为0/false)。步骤1。首先,请学习C的基础知识。步骤2。试着自己回答问题。3.只有当你仍然被困住的时候,回来问一个问题。这真的太基本了。我投票将这个问题作为离题题来结束,因为它显示了对所用语言缺乏基本知识,也缺乏对问题本身的研究。不要使用异或交换,它比在大多数现代系统上使用临时异或交换要慢,而且容易产生别名
0987654321