2013-02-10 91 views
0

我看到這個代碼:爲什麼不在反轉字符串時使用指針指針?

void reverse_string(char *str) 
{ 
    /* skip null */ 
    if (str == 0) 
    { 
     return; 
    } 

    /* skip empty string */ 
    if (*str == 0) 
    { 
     return; 
    } 

    /* get range */ 
    char *start = str; 
    char *end = start + strlen(str) - 1; /* -1 for \0 */ 
    char temp; 

    /* reverse */ 
    while (end > start) 
    { 
     /* swap */ 
     temp = *start; 
     *start = *end; 
     *end = temp; 

     /* move */ 
     ++start; 
     --end; 
    } 
} 

而且我不明白爲什麼一個指針的指針是不是在傳遞給函數。如果在函數內部創建了傳入指針的副本,那麼如何反轉呢?這些變化如何在外部傳播?

+0

想想指針指向什麼。這個地方在這個函數和調用者中是一樣的。 – nos 2013-02-10 23:00:23

回答

3

如何才能顛倒過來,如果傳遞的指針的副本是 裏面的函數?如何改變被傳播外

它的工作,因爲你正在做的是指針指向在內存的變化。所以在函數結束之後,指針仍然指向它過去的位置,但內容(字符的順序)已經改變。換句話說,沒有必要更改地址str指向。

1

char *數組的內存內容被修改。

0

字符串被反轉到位。也就是說,指向字符串的指針保持不變,但指向的字符串是相反的。

0

看一看while循環,你會看到字符串在原地顛倒過來。

while (end > start) 
    { 
     /* swap */ 
     temp = *start; 
     *start = *end; 
     *end = temp; 

     /* move */ 
     ++start; 
     --end; 
    } 
0

倒車的字符串是不操作上的指針。這是對指針指向的的數據操作。這就是指針本身可以通過值傳遞給函數的原因,也就是在函數內部,它實際上是傳遞給函數的指針的副本 - 沒關係,因爲不需要修改指針,只需要指向數據。