这是一本关于C头Head First的小函数。 此功能应在屏幕上向后显示一个字符串。
void print_reverse(char *s)
{
size_t len = strlen(s);
char *t = s + len - 1;
while ( t >= s )
{
printf("%c", *t);
t -- ;
}
puts("");
}
不幸的是,我不明白它是如何逆转的 串。
size_t len = strlen(s);
//计算数量
字符串中的字符
char *t = s + len - 1;
// 't'
是指针
一个char类型
我不明白在这个等式中's'
使用了什么值;我已经读过,当数组变量的名称被赋给指针时,它实际上是指地址
第一个字符,即数组[0];因此's'
这里的值为0,或者它是否具有整数值
一个特定的角色?
例如,单词是s [] =“hello”。那么如果s [0] ='h'。将strlen(s)
添加到s[0]
应该产生104(十进制),因此s + len - 1 = 104 + 6 - 1 = 109(-1因为我假设
我必须减去'\0'
占用的strlen
字符
考虑到)。但109是'm'
。我看不出路
这个等式遍历字符串。
while (t >= s)
;我认为这意味着虽然
t
不等于零,是否正确?
谢谢!
答案 0 :(得分:2)
首先,s
是指针,而不是普通的char变量。
因此,当您将字符串的内存地址分配给s
时,它包含第一个位置的地址。
指针运算:通过向指针添加1,使其指向下一个存储位置。回想一下,字符串存储在连续的内存位置。
所以,如果s
指向“你好”,
printf(*s)
将打印'H'printf(*(s+1))
将打印“e”。现在,我们在len
中有长度(= 5)。当我们将len - 1
添加到s
时,我们会将其指向前方的5个位置。它现在指向'o'。
然后通过执行while(t >= s)
我们比较两个指针(t
和s
)并在t
指向的地址处打印值并递减它,直到它变为等于s
这是第一个元素。
插图:
初始条件:
H e l l o
*s *t
现在我们打印*t
并递减它。
输出:o
H e l l o
*s *t
我们继续进一步: 输出:lleH
H e l l o
*s
*t
从现在起t
== s
,我们停止了。
答案 1 :(得分:1)
void print_reverse(char *s)
此处s
是指向字符串
size_t len = strlen(s);
这等于字符串的字符数(\0
未计算)
char *t = s + len - 1;
此时,t
是一个新指针,指向字符串的最后一个元素(如果您不清楚,请阅读有关指针算术的内容)
while ( t >= s )
{
printf("%c", *t);
t -- ;
}
在此循环中t
在每次迭代时递减,以便每次指向字符串中的前一个字符时。
在最后一次迭代中,t==s
,这意味着您正在打印字符串的第一个元素。
答案 2 :(得分:0)
通过将指针t
设置为字符串的最后一个字符然后执行以下操作来反转字符串:
t
指向的字符。t
减少一个(让它向左移动一个字符)t
现在指向字符串的第一个字符之前。 s
是指向字符串第一个字符的指针。字符串只是内存中由NUL字符('\0'
)终止的字符序列。当t == s
,t
指向第一个字符时,t < s
,t
指向之前的第一个字节第一个字符,此字节为没有字符串的一部分。
当循环终止时,t
将不为零。 t
和s
是指针,这意味着它们的值是内存地址。 s
的值是字符串第一个字符的内存地址,该地址肯定不为零。
答案 3 :(得分:0)
s
包含数组第一个字符的地址,而不是第一个字符本身。地址不是从数组开始的偏移量,而是任意(对用户)的值。因此,当您向len - 1
添加s
时,结果是指向索引len - 1
处字符的指针。
换句话说,这个:
char *t = s + len - 1;
与此相同:
char *t = &s[len - 1];
只要while (t >= s)
指向数组开始时或之后的内存位置,条件t
的计算结果为真。