2011-03-21 81 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!」

這就是爲什麼當你輸出你的指針時,你會看到你所做的。