在c ++

时间:2015-07-20 05:49:22

标签: c++ pointers while-loop increment

我正在处理Cracking the Coding Interview的一个问题。问题是:编写代码来反转C风格的字符串。 以下是我用c ++编写的答案,但我不理解增加char指针的含义。

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"的结果?

4 个答案:

答案 0 :(得分:1)

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

这就是为什么在将字符串传递给++q并执行arr.reject{|h| h[:id].nil?} => [{:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!107", :name=>"Folder 11", :type=>"folder"}, {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!105", :name=>"Pictures", :type=>"album"}, {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!113", :name=>"Public", :type=>"folder"}, {:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!124", :name=>"sasd", :type=>"folder"}] 之后,结果将从第二个字符开始,而不是从第一个字符开始。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

C样式字符串为空(0x00或/ 0)终止。

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

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

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

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

q指向0x00循环中断时。

答案 3 :(得分:-1)

这就是'\0'终止字符串的问题。

结果是:

0987654321

从一个名为reverse(在Visual Studio 2013

的函数中预期的