2011-03-21 57 views
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从ptr1

+0

我相信你可以写出比这更好的标题。 – 2011-07-17 00:14:24

回答

4

当您将某些内容分配给指针时,如ptr1ptr2。你没有改变存储在那里的价值,你只是在改变他们指向的东西。

当你说:

ptr2 = ptr1 + 6; 

您正在ptr2ptr1的字符串的第6元。然后你说:

ptr2 = "Test!\n"; 

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

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

现在,当你打印出来,你会得到:

Test! 
Hello World 
3
ptr2 = "Test!\n" 

简单地设置PTR2指向一个新的字符串。从逻辑上讲,你的意思是写*ptr2 = ...。,但现在你会修改只读内存中的字符串字面值。您需要声明ptr1char[],以便如果要修改它,字符串文字将分配到堆栈内存中。

0

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

ptr1仍然指向"Hello World\n"

我以为id会覆盖ptr1的世界部分。

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

6

线

ptr2 = "Test!\n"; 

是否更改缓冲区的内容在由ptr2指出。相反,它只是改变了什么ptr2指向。在C中,指针赋值只是说“我希望这个指针停止引用它所引用的内容,而是指向其他的东西。”如果实际上想要更改所指向的值,则需要取消引用指针或调用一个将其解除引用的函数(例如,strcpy,strcat等)

因此,输出是您上面列出,与“Hello World”完好无损。

2

指针指向内存地址。

你的任务不写任何东西,他们只是改变ptr2指向的地方。

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

1

因为:

ptr2 = "Test!\n"; 

分配常量文字"Test!\n"的地址PTR2覆盖您在上线指定的地址。

2

因为:

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

在这一点上,你有两个指针,一个指向一个内存位置containig的 “Hello World” 和其他未初始化,

ptr2 = ptr1 + 6; 

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

ptr2 = "Test!\n"; 

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

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