我目前正在研究不同的算法来练习我的编码强度,并遇到了一个反转字符串的算法。它使用指针,我对正在发生的事情感到困惑。代码如下:
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或者我是否错误地想到了这个?
答案 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
生成错误值,因为它们现在都指向相同的字符。