2015-01-15 43 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)