使用指针反转字符串

时间:2015-03-05 03:34:59

标签: c string

我目前正在研究不同的算法来练习我的编码强度,并遇到了一个反转字符串的算法。它使用指针,我对正在发生的事情感到困惑。代码如下:

void reverse(char *str) {
   char * end = str;
   char tmp;
   if (str) {
      while (*end) {
         ++end;
      }
  --end;
  while (str < end) {
     tmp = *str;
     *str++ = *end;
     *end-- = tmp;
  }
 }
}

所以在这段代码中,结尾放在第一个while循环中的字符串内存位置的末尾。然后第二次是我感到困惑的地方。我不明白* str ++ = * end和* end-- = * temp。

的含义

为什么会这样?当行tmp = * str出现时,字符串的第一个字母是否进入temp或者我是否错误地想到了这个?

2 个答案:

答案 0 :(得分:3)

正如您所知,end指向最后一个字符。 现在在第二个for循环中,他只是用最后一个字符交换第一个字符,然后将str指针移向其权限并向左移动。

while (str < end) {
     tmp = *str;  // storing the char at str in temp
     *str++ = *end;  // storing the char at end at str position and then incrementing str .. i.e. moving str right
     *end-- = tmp;  // storing the char in tmp at end position and then decrementing tmp .. i.e. moving tmp left 
  }

答案 1 :(得分:1)

最好尝试一个例子,下面是单词"hello"的第二个while循环。 *str的值始终存储在tmp中,然后*end被复制到*str,总体效果是每次迭代后*str*end的值*str切换。 *end上的后递增和{{1​​}}上的后递减都不会在赋值语句之后生效。

    *end
    v
hello        tmp='h'
^
*str
------------------
   *end
   v
oellh        tmp='e'
 ^
 *str
------------------
  *end
  v
olleh        tmp='e'
  ^
  *str

执行在此处停止,因为str < end生成错误值,因为它们现在都指向相同的字符。