2012-10-17 61 views
1

我有這樣的自定義字符串複製功能,我已經注意到,在取消引用,並修改其內容的*dest參數的變化:在C中,當我修改其內容時,爲什麼我的指針參數會改變?

char *copyArray(char *dest, char *src) 
{ 
    char *a = dest; 

    while (*dest++ = *src++) 
     ; 
    char *b = dest; 

    if ((a-b) != 0) 
     printf("Dest pointer has changed\n"); 

    return dest;                   
} 

如果你考慮下面的代碼:

int main() 
{ 
    char name [] = "Hello, there!"; 

    char *new = copyArray(name, "bye"); 

    printf("New is '%s', name is '%s'\n", new, name); 

    return 0; 
} 

我得到以下輸出:

Dest pointer has changed 
New is 'o, there!', name is 'bye' 

爲什麼會發生這種情況?

我的意圖是爲*new指向相同位置name[]指向,但顯然隨着地址改變,它指向不同的地方。

我覺得發生的一件事是,一旦複製結束,C將目標字符串的原始內容減去改變的字符數(4代表「再見」)移動到新地址並將其分配給*dest

這是真的發生了什麼?有人可以向我解釋爲什麼?

這不是真正的工作相關,我只是想更好地瞭解指針的行爲。

非常感謝您的回覆!

回答

4

這裏發生

while (*dest++ = *src++) 
    ; 

這在純英文的意思是由DEST的東西拷貝指向SRC到的東西指着的問題,那增量src和dest(即之後,提前兩個指針指向下一件事)。

如果你想避免改變指針,例如你已經創建的變量,並返回那個指針,可以使用指針的副本。

+0

哦,是的,我正在修改dest的內存地址,因此我只得到原始字符串的一部分。我不得不承認我完全忘了那一點。 – Nobilis

+1

@Nobilis不,你沒有改變「dest的內存地址」,而是「內存地址dest **指向**」。非常重要的區別,一開始並不容易理解,但是至關重要的是,如果你想在C – fvu

+0

中發展,那麼我非常感謝:) – Nobilis

4

該參數dest被遞增(在while條件)四次(如"bye"爲4個字符,包括其中將在while的最終迭代被分配零)的功能copyArray()內,然後它的值被返回,以便new指向name + 4

要有new指向name開頭acopyArray()開始。

+0

謝謝,是的,一旦fvu聲明我得到了那部分,我現在就返回它,而不是原始的目標。大多數情況下,我希望我能理解指針以及像這樣簡單的事情,這讓我感到很開心:) – Nobilis

相關問題