C指针程序使用指针交换字符串

时间:2015-01-15 18:53:56

标签: c pointers

在下面的代码示例中,有人可以告诉我为什么str1_ptrstr2_ptr声明的类型为char **而不是char *(例如char **str1_ptr而不是char *str1_ptr函数签名中的swap1())?

#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()函数交换两个字符串。

3 个答案:

答案 0 :(得分:2)

您想要更改str1str2中声明的main()swap1()指针的值。

要完成此任务,您需要在swap1()中的每个指针上传递一个指针。

C中的字符串(即char数组)指针的类型为char *,因此指针上的指针(字符串指针上的指针)的类型为char **

答案 1 :(得分:1)

如果你看一下变量str1str2的值如何看待这些行

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

它看起来像:

                                  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并且值为str2的{​​{1}}:

Address 1

只有将|<-- str1 ->| +--------------+ | Address 2 | +--------------+ |<-- str2 ->| +--------------+ | Address 1 | +--------------+ str1的地址传递给str2,才能执行此操作。您可以使用swap1完成此操作。

由于swap1(&str1, &str2);str1的类型为str2,因此char*&str1的类型为&str2。您必须使用:

char**

而不是

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

答案 2 :(得分:0)

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

您的指针按值传递,此代码会复制,然后覆盖副本。所以原始指针是不变的。

太修复此问题 - 将指针传递给指针,以便在函数中完成的更改可以在main中被反映,因为您希望它被交换。