string 只是chars 的数组(缓冲区)。基本上,一个 8 位 unsigned ints 的数组。数组中的最后一个元素是'\0'。实际的数组可能比占据它的字符串大得多,并且 strcat 确实要求dest 足够大以同时包含dest 字符串和source 字符串。 strcat 不是像高级语言那样的即用型方法。它的用例如下所示:
-
char* buffer = malloc(strlen(string1) + strlen(string2) +1) 创建一个足以容纳两个字符串的缓冲区。
-
strpy(buffer, string1)将第一个字符串复制到缓冲区中
-
strcat(buffer, string2) 将第二个字符串附加到第一个字符串结束的缓冲区中。
++ 和-- 运算符允许将指针用作枚举器。将它们视为.next() 和.prev()。这里需要注意的是,它们在移动枚举器之前返回(或接受)该值。这在这里很关键,这基本上就是让 C 变得如此困难的原因 ;) 如果你想在更高级别重新创建它,它将是 getAndNext() 和 setAndNext()
* 是一个访问器,双向工作,所以它是枚举器的getValue() 和setValue()。
第一个块只是跳过 dest 缓冲区,直到它到达其中字符串的末尾 - 但不是缓冲区的末尾。
while (*dest)
dest.next();
伪代码为:
while (dest.get() != '\0')
dest.next();
这是因为\0 是int 含义中的实零,而int 零是布尔含义中的false。任何非零都是true。这意味着 -1、42 和 'A' 与 true 和 1 一样。所以在 C 中,我们只需跳过 != 0,这与在具有真正布尔值的语言中编写 != false 一样毫无意义。
while (*dest++ = *src++)
;
可以重述为:
while (dest.setAndNext(src.getAndNext()) != '\0')
或没有复合:
char value;
do
{
dest.set(src.get());
value = src.get();
src.next();
dst.next();
}
while (value != '\0');
这是因为在 C 中赋值是有值的。所以(*dest++ = *src++) 最终会返回被复制的字符。这就像一个内联函数,它复制、前进然后返回复制的内容。
指针可以合法地指向数组之外。这就像枚举器已经到了尽头,没有更多了。最大的区别在于高级枚举器可以并且会告诉您(通过异常),而指针将继续运行,即使它不再有意义。这就是为什么 src 和 dest 指针都被多次 ++ed 的原因,但我们不在乎,因为我们已经注意在此之后不再使用它们。
rdest 只是保存缓冲区开始的位置。我们不能返回dest,因为那个枚举数已经用完了,现在它在字符串的末尾,而我们需要返回开头。 “r”可能代表“return”,因为这个变量的整个点都是要返回的。