2015-01-15 45 views
-2

在下面的代碼示例的C指針節目交換,有人可以告訴我爲什麼str1_ptrstr2_ptr與在swap1()功能的簽名char **類型,而不是char *(例如的替代char **str1_ptrchar *str1_ptr)宣佈?字符串的指針使用

#include<stdio.h> 

/* Swaps strings by swapping pointers */ 

void swap1(char **str1_ptr, char **str2_ptr) { 
    char *temp = *str1_ptr; 

    *str1_ptr = *str2_ptr; 
    *str2_ptr = temp; 
} 

int main() { 
    char *str1 = "geeks"; 
    char *str2 = "forgeeks"; 

    swap1(&str1, &str2); 

    printf("str1 is %s, str2 is %s", str1, str2); 

    getchar(); 

    return 0; 
} 

swap1()函數交換兩個字符串。

+0

你需要一個指針,你希望交換的類型,在這種情況下,類型爲char *,這樣一個指針爲char *爲char ** – ZivS

回答

2

您想要更改main()中指定的str1str2指針的值從swap1()

爲了達到這個目的,你需要在swap1()的每個指針上傳遞一個指針。

C中的一個字符串(即char數組)指針的類型爲char *,所以這樣一個指針上的指針(字符串指針上的指針)的類型爲char **

0

如果你void swap1(char *str1_ptr, char *str2_ptr)

你的指針是按值傳遞,而這種代碼的副本,然後將覆蓋副本。所以原始的指針是不變的。

太固定了 - 將指針傳遞給指針,以便在函數中完成的更改可以是主要反映爲,因爲您希望它被交換。

1

如果您怎麼看待變量str1和線

char *str1 = "geeks"; 
char *str2 = "forgeeks"; 

它看起來像後str2外觀的值:

        Address 1 (block of memory for "geeks") 
            | 
|<-- str1 ->|     v 
+--------------+     +--------------------------+ 
| Address 1 |     | g | e | e | k | s | '\0' | 
+--------------+     +--------------------------+ 

            Address 2 (block of memory for "forgeeks") 
            | 
|<-- str2 ->|     v 
+--------------+     +--------------------------------------+ 
| Address 2 |     | f | o | r | g | e | e | k | s | '\0' | 
+--------------+     +--------------------------------------+ 

既然你要交換,其中str1str2指出,您有興趣進行必要的更改,以使str1的值爲Address 2,值爲str2Address 1

|<-- str1 ->| 
+--------------+ 
| Address 2 | 
+--------------+      

|<-- str2 ->| 
+--------------+ 
| Address 1 | 
+--------------+ 

你可以這樣做,只有當你傳遞的str1str2的地址swap1。您通過使用swap1(&str1, &str2);來完成此操作。

由於str1str2類型是char*,的&str1&str2類型是char**。這是你必須使用:的

void swap1(char **str1_ptr, char **str2_ptr) 

代替

void swap1(char *str1, char *str2)