了解反转字符串的代码

Understanding code to reverse string

我很难理解下面用于反转以 null 结尾的字符串的代码。我写了评论来解释我难以理解的台词。

void reverse(char *str)
{
    char *end = str;
    char tmp;
    if (str)     // I don't understand what is happening within this if loop and how this is carried out for `str` which is not Boolean
    {
        while (*end) // I dont know what this means either
        {
            ++end;
        }
        --end;

        while (str < end)
        {
            tmp = *str
                *str++ = *end //I am confused as to why this is not just *str = *end
                *end-- = tmp; //Similarly, why is this not *end = tmp
        }
    }
}
  1. if (str)表示 检查 str 指向 char 的指针是否不为 NULL。等同于:if (str != NULL)

  2. while (*end) 检查 end 指向的 char 是否不是空终止字符。等同于:while (*end != '[=17=]')

  3. *str++ = *endend指向的char赋值给str,然后将str指针前移1个字符。 *end--end 后退 1 个字符。

  4. while (str < end) 将地址作为数字进行比较(而不是指针指向的值)。这仅在两个指针都指向同一内存块中的不同位置时才有意义,例如在这种情况下是一个 c 字符串或任何数组。如果 str 指向字符串的第一个元素,而 end 指向第二个元素,则 str < end 将为真。第一和第二位置的实际字符将不被考虑

知道 *end = str;

end = is the pointer here

他们正在检查字符串是否不为空,如果它为空,如果 is 应该取 char 的值并赋值给它

在你的例子中,字符串是临时的

我想让你明白 char temp 在做什么,*end 作为指针将 *end 视为字符串,意味着 *end 不应该为空,temp 是字符

while (*end) 
 ++end;

它告诉我们虽然 end 不为空,这意味着结果应该是一个字符串(例如像 john 这样的名字)

--end 告诉你 null 应该清楚 然后它应该去另一个 while

while (str < end)因为字符串为空

把char temp当作字符串

*str++ = *end 然后允许字符使其成为字符串或名称 或增加字符使其成为字符串

end-- = tmp // 他们将字符串分配给该空字符串以获得 vlue

*end = str;表示end指针的值包含字符串str

的字符

if (str) 表示检查 str 指针是否不是 null ,所以当 str 指向 char.[=37= 时它总是 true ]

while (*end) 表示检查 end 是否指向 char ,当指针为 null 时条件终止,因此当指针到达字符串末尾时 end, while 条件中断和 end 指针值包含字符串 end.

的最后一个字符

*str++ = *end 这个语句可以分解成 2 个语句来理解:

首先*str=*end;str指向的char值替换为end指向的char值。

第二个 *str++; 将指针移动到替换后字符串 str 中的下一个字符。

*end-- = tmp; 这个语句可以分解成 2 个语句来理解:

首先*end = tmp;end指向的char值替换为tmp char.

second *end--; 将指针移动到替换后字符串 end 中的前一个字符。

我希望你的想法很清楚。