我正在阅读一本编程书,我想知道一行代码是做什么的。书中没有任何评论或关于它应该做什么的解释。
下面是一个采用字符数组并向后打印的函数。
void print_reverse (char *s)
{
size_t len = strlen(s);
char *t = s + len -1; // I don't understand what this line is doing
while (t >= s) {
printf("%c", *t);
t = t - 1;
}
puts("");
}
答案 0 :(得分:8)
我们说s
是字符串"PaxDiablo"
,存储在位置1
的内存中,因此:
s
|
V
+---+---+---+---+---+---+---+---+---+----+
| P | a | x | D | i | a | b | l | o | \0 |
+---+---+---+---+---+---+---+---+---+----+
Address: 1 2 3 4 5 6 7 8 9 10
表达式t = s + len - 1
(在这种情况下,len
为9)将t
设置为s
之后的八个字符。
s t
| |
V V
+---+---+---+---+---+---+---+---+---+----+
| P | a | x | D | i | a | b | l | o | \0 |
+---+---+---+---+---+---+---+---+---+----+
Address: 1 2 3 4 5 6 7 8 9 10
换句话说,它会为您提供字符串中 last 字符的地址。
然后,代码的其余部分向后迭代字符串,方法是递减t
,直到它通过s
。
从技术上讲,这是未定义的行为,因为你只是每个人都应该比较一个字符上指向同一个数组的指针(这里我们比较t
它的一个字符在数组之前),但你很难找到一个不起作用的系统。
作为Potatoswatter(我绝对爱人们在此处选择的一些名字)在评论中指出,你可以通过使用do {} while
构造而不是{{while {}
来避免这种比较1}}:
#include <stdio.h>
#include <string.h>
void printReverse (char *str) {
size_t len = strlen (str);
if (len != 0) {
char *pStr = str + len;
do {
putchar (*(--pStr));
} while (pStr > str);
}
putchar ('\n');
}
答案 1 :(得分:1)
我们说s
指向字符串"Hello"
。在内存中,它看起来像:
s --> [ H | e | l | l | o | \0 ]
现在,char *t
向char值声明一个新的指针变量,该值使用s + len - 1
初始化,即:
s ------ ------- s + 5 // (len is 5 since strlen("Hello") is 5)
| |
[ H | e | l | l | o | \0 ]
|
------------ finally, t = s + len - 1