1
#include <stdio.h>
#include <stdlib.h>

int main( void ) {
   char *ptr1 = "Hello World\n";
   char *ptr2;

   ptr2 = ptr1 + 6;
   ptr2 = "Test!\n";

   printf("%s",ptr2);
   printf("%s",ptr1);

   return EXIT_SUCCESS;   
}

输出:

Test!
Hello World

为什么我没有得到Hello Test!?我以为 id 会覆盖World-part from ptr1

4

7 回答 7

6

线

ptr2 = "Test!\n";

不改变 指向的缓冲区的内容ptr2。相反,它只是改变了ptr2点。在 C 中,指针赋值只是说“我希望这个指针停止引用它曾经引用的内容,而是指向其他东西。” 如果您确实想更改所指向的值,则需要取消引用指针或调用取消引用它的函数(例如strcpy,,strcat等)

因此,输出就是您在上面列出的内容,“Hello World”完好无损。

于 2011-03-21T09:47:51.170 回答
4

当您将某些内容分配给指针时,例如ptr1or ptr2。你并没有改变存储在那里的值,你只是改变了它们指向的东西。

当你说:

ptr2 = ptr1 + 6;

您正在指出' 字符串ptr2的第 6 个元素。ptr1然后你说:

ptr2 = "Test!\n";

这意味着ptr2现在指向内存中其他地方的一个新的不同字符串,其中包含"Test!\n". 所以你有这个:

ptr  ------->  "Hello World\n"
ptr2 ------->  "Test\n"

现在,当您打印它们时,您会得到:

Test!
Hello World
于 2011-03-21T09:47:23.640 回答
3
ptr2 = "Test!\n"

只需将 ptr2 设置为指向一个新的字符串。从逻辑上讲,您的意思是写*ptr2 = ....,但现在您将在只读内存中修改字符串文字。如果要修改它,您需要将其声明ptr1为 achar[]以便在堆栈内存中分配字符串文字。

于 2011-03-21T09:47:43.603 回答
2

指针只是指向内存地址。

你的作业没有写任何东西,它们只是改变ptr2指向的地方。

另请注意,无论如何,您都不能覆盖可执行文件中的常量字符串,这可能会使您的程序崩溃。

于 2011-03-21T09:48:12.700 回答
2

因为:

   char *ptr1 = "Hello World\n";
   char *ptr2;

此时您有两个指针,一个指向包含“Hello World”的内存位置,另一个未初始化,

   ptr2 = ptr1 + 6;

现在 ptr2 指向 ptr1 指向的位置后 6 个字节的内存位置,在“Hello World”的“W”中。如果您现在输出 ptr2,您会看到“世界”。

   ptr2 = "Test!\n";

现在 ptr2 指向一个完全不同的内存位置,其中包含“测试!”

这就是为什么当你输出你的指针时你会看到你在做什么。

于 2011-03-21T09:48:32.873 回答
1

因为:

   ptr2 = "Test!\n";

将常量文字"Test!\n"的地址分配给 ptr2 覆盖您在上一行分配的地址。

于 2011-03-21T09:48:27.580 回答
0

ptr2 = "Test!\n"; 现在ptr2指向字符串文字"Test!\n".字符串文字内容不会在任何地方被修改。

ptr1仍然指向"Hello World\n"

我认为 id 会覆盖 ptr1 中的 World-part。

为什么你会想到这样做?尝试修改字符串文字的内容是未定义的行为。

于 2011-03-21T09:47:48.300 回答