了解反转字符串的代码
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
}
}
}
if (str)
表示
检查 str
指向 char
的指针是否不为 NULL。等同于:if (str != NULL)
while (*end)
检查 end
指向的 char
是否不是空终止字符。等同于:while (*end != '[=17=]')
*str++ = *end
将end
指向的char
赋值给str
,然后将str
指针前移1个字符。 *end--
将 end
后退 1 个字符。
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
中的前一个字符。
我希望你的想法很清楚。
我很难理解下面用于反转以 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
}
}
}
if (str)
表示 检查str
指向char
的指针是否不为 NULL。等同于:if (str != NULL)
while (*end)
检查end
指向的char
是否不是空终止字符。等同于:while (*end != '[=17=]')
*str++ = *end
将end
指向的char
赋值给str
,然后将str
指针前移1个字符。*end--
将end
后退 1 个字符。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
中的前一个字符。
我希望你的想法很清楚。