我正在努力理解下面用于反转以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
}
}
}
答案 0 :(得分:6)
if (str)
表示
检查str
指向char
的指针是否为NULL。与:if (str != NULL)
while (*end)
检查char
指向的end
是否为空终止字符。与:while (*end != '\0')
*str++ = *end
将char
指向的end
分配给str
,然后将str
指针提前1个字符。 *end--
向前推进end
1个字符。
while (str < end)
将地址作为数字进行比较(而不是指针指向的值)。这只有在两个指针指向同一存储块中的不同位置时才有意义,例如在这种情况下的c字符串或任何数组。如果str
指向字符串的第一个元素而end
指向第二个元素,则str < end
将为真。第1和第2位的实际字符将不予考虑
答案 1 :(得分:0)
*end = str;
表示end
指针的值包含字符串str
的字符
if (str)
表示检查str
指针是否不是null
,因此当true
指向char时,它总是str
。
while (*end)
表示检查end
是否指向char,当指针为null
条件终止时,所以当指针到达字符串end
的末尾时,{{1 condition break和while
指针值包含字符串end
的最后一个字符。
end
这个陈述可以分解为2个陈述来理解它:
第一个*str++ = *end
将*str=*end;
指向的char值替换为str
指向的char。
第二个end
在替换后将指针移动到字符串*str++;
中的下一个字符。
str
这个陈述可以分解为2个陈述来理解它:
第一个*end-- = tmp;
将*end = tmp;
指向的char值替换为end
char。
第二个tmp
在替换后将指针移动到字符串*end--;
中的前一个char。
我希望你的想法很清楚。
答案 2 :(得分:-1)
知道*end = str;
end = is the pointer here
如果字符串为null,如果is
应取char的值并赋值给它,那么它们是否为null;
在你的情况下,字符串是temp
我想让你理解char temp正在做什么和*end
作为指针将*end
视为字符串,意味着*end
不应为null,temp是字符
while (*end)
++end;
它告诉我,虽然end不是null,意味着结果应该是一个字符串(例如像john这样的名字)
--end
它告诉你null应该是清楚的
while (str < end)
因为字符串为空
将char temp作为字符串
*str++ = *end
然后允许字符使其成为字符串或名称
或者让角色接受使其成为一个字符串
end-- = tmp
//他们将字符串分配给该空字符串以获得vlue