指针似乎与 printf 的输出不同步

Pointer seems not be sync with printf's output

我无法理解 pointer2 包含的内容。第二个 printf 打印 llo World,但第三个打印 Hey you guys!。为什么 strcpyy you guys!\n 复制到 llo World 中呢?根据我对下面程序的理解,最后的输出应该是 llo Worldy you guys!\n,不是吗?

int main() 
{
    char str_a[20];  // a 20 element character array
    char *pointer;   // a pointer, meant for a character array
    char *pointer2;  // and yet another one

    strcpy(str_a, "Hello World\n");

    pointer = str_a; // set the first pointer to the start of the array
    printf("%p\n", pointer);

    pointer2 = pointer + 2; // set the second one 2 bytes further in
    printf("%s", pointer2);       // print it

    strcpy(pointer2, "y you guys!\n"); // copy into that spot
    printf("%s", pointer);        // print again
}

指针pointer指向数组的第一个字符str_a

pointer = str_a;

该数组包含字符串 "Hello World\n"

指针pointer2指向字符串的第三个元素

pointer2 = pointer + 2;

也就是指向"llo World\n".

然后这个子串被覆盖保持不变 str_a[0]str_a[1].

strcpy(pointer2, "y you guys!\n");

所以数组 str_a 包含字符串 "Hey you guys!\n"

其实上面strcpy的调用等价于

strcpy( &str_a[2], "y you guys!\n");

因为反过来这个语句

pointer2 = pointer + 2;

等同于

pointer2 = &str_a[2];

pointer2 = &pointer[2];

还有这个电话

printf("%s", pointer); 

输出字符串。

"He"(从str_a[0]开始)加上"y you guys!\n"(从str_a[2]开始)得到结果字符串。

char str_a[20];  // a 20 element character array
char *pointer;   // a pointer, meant for a character array
char *pointer2;  // and yet another one

第一行创建并分配内存给20个字符。 另外两个只创建指向任何内容的指针。这些指针可用于指向内存区域,这意味着您可以在其中存储地址(数字)。

strcpy(str_a, "Hello World\n");

此行将“Hello World\n”复制到 str_a(已分配内存 - OK)。

pointer = str_a; // set the first pointer to the start of the array
printf("%p\n", pointer);

现在,我们将str_a的地址复制到pointer变量中。这两个变量可以以相同的方式使用。它们指向相同的内存。打印指向的内存地址。

pointer2 = pointer + 2; // set the second one 2 bytes further in
printf("%s", pointer2);       // print it

这里我们也复制了一个地址(一个数字),就像之前做的一样,但是我们在地址上加了2。所以,如果 str_apointer 指向位置 X,现在,pointer2 将指向X+2(X是一个数字,块的内存地址)。我们知道这个块(str_a)的内容是“HelloWorld\n”,然后,pointer2指向右边 2 个字符的位置:“llo World\n”。这仅表示pointer2存储的地址号指向该位置,但分配的块还包含整个句子。

strcpy(pointer2, "y you guys!\n"); // copy into that spot
printf("%s", pointer);        // print again

现在,我们可以看到pointer2指向的地址的字符副本。因此,前两个字符在复制位置之外,"y you guys!\n" 将被复制到 str_a 的位置 2,即位置 0 pointer2.

结果:“He”(str_a的前两个字符未动)+“y you guys!\n”(复制到[=29的字符=]pointer2) = "嘿你们!\n"

如果你打印 pointer2,你会看到“y you guys!\n”。