#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
部分。
答案 0 :(得分:6)
该行
ptr2 = "Test!\n";
不是否会更改ptr2
指向的缓冲区的内容。相反,它只是改变ptr2
指向的内容。在C中,指针赋值只是说“我希望这个指针停止引用它用于引用的内容,而是指向别的东西。”如果您确实想要更改指向的值,则需要取消引用指针或调用取消引用它的函数(例如,strcpy
,strcat
等。)
因此,输出就是您在上面列出的内容,“Hello World”完好无损。
答案 1 :(得分:4)
为指针指定内容时,例如ptr1
或ptr2
。你没有改变存储在那里的东西的价值,你只是改变他们指向的东西。
当你说:
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。
为什么你会想到这样做?尝试修改字符串文字的内容是未定义的行为。