指针 - 查询

时间:2011-03-21 09:44:40

标签: c pointers memory-address

#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 - ptr1部分。

7 个答案:

答案 0 :(得分:6)

该行

ptr2 = "Test!\n";

是否会更改ptr2指向的缓冲区的内容。相反,它只是改变ptr2指向的内容。在C中,指针赋值只是说“我希望这个指针停止引用它用于引用的内容,而是指向别的东西。”如果您确实想要更改指向的值,则需要取消引用指针或调用取消引用它的函数(例如,strcpystrcat等。)

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

答案 1 :(得分:4)

为指针指定内容时,例如ptr1ptr2。你没有改变存储在那里的东西的价值,你只是改变他们指向的东西。

当你说:

ptr2 = ptr1 + 6;

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

ptr2 = "Test!\n";

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

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

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

Test!
Hello World

答案 2 :(得分:3)

ptr2 = "Test!\n"

只需将ptr2设置为指向新的字符串即可。从逻辑上讲,您打算编写*ptr2 = ...。,但现在您将在只读内存中修改字符串文字。您需要将ptr1声明为char[],以便在您想要修改它时将字符串文字分配到堆栈内存中。

答案 3 :(得分:2)

指针只指向内存地址。

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

另请注意,无论如何,您无法覆盖可执行文件中的常量字符串,它可能会导致程序崩溃。

答案 4 :(得分:2)

由于:

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

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

   ptr2 = ptr1 + 6;

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

   ptr2 = "Test!\n";

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

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

答案 5 :(得分:1)

由于:

   ptr2 = "Test!\n";

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

答案 6 :(得分:0)

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

ptr1仍然指向"Hello World\n"

  

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

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