指针似乎与 printf 的输出不同步
Pointer seems not be sync with printf's output
我无法理解 pointer2
包含的内容。第二个 printf
打印 llo World
,但第三个打印 Hey you guys!
。为什么 strcpy
将 y 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_a 和 pointer 指向位置 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”。
我无法理解 pointer2
包含的内容。第二个 printf
打印 llo World
,但第三个打印 Hey you guys!
。为什么 strcpy
将 y 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_a 和 pointer 指向位置 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”。