在下面的代码示例中,有人可以告诉我为什么str1_ptr
和str2_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()
函数交换两个字符串。
答案 0 :(得分:2)
您想要更改str1
中str2
中声明的main()
和swap1()
指针的值。
要完成此任务,您需要在swap1()
中的每个指针上传递一个指针。
C中的字符串(即char数组)指针的类型为char *
,因此指针上的指针(字符串指针上的指针)的类型为char **
。
答案 1 :(得分:1)
如果你看一下变量str1
和str2
的值如何看待这些行
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' |
+--------------+ +--------------------------------------+
由于您希望在str1
和str2
指向的位置进行交换,因此您有兴趣进行必要的更改,以使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中被反映,因为您希望它被交换。