如何解决为什么这个交换功能不起作用? 在 C 中交换字符串
我试图交换字符串数组中的 2 个条目,但我的 swap
函数在调用时没有交换。
swap(char*,char*);
int main() {
char *ptsr[2] = { "x","y" };
swap(ptsr[0],ptsr[1]);
}
swap(char *t1,char *t2) {
char *t;
t = t1;
t1 = t2;
t2 = t;
}
有人可以识别并解释我的错误吗?
解决方法
问题中的函数仅交换其参数的值。参数是数组元素的副本,因此 swap
函数无效。
要交换数组中的指针,必须传递它们的地址并更改交换函数的原型:
#include <stdio.h>
void swap(char **t1,char **t2) {
char *t;
t = *t1;
*t1 = *t2;
*t2 = t;
}
int main() {
char *ptsr[2] = { "x","y" };
swap(&ptsr[0],&ptsr[1]);
printf("pstr: { \"%s\",\"%s\" }\n",pstr[0],pstr[1]);
return 0;
}
,
C 是严格按值传递的。您将 ptsr[0]
和 pstr[1]
的值传递给 swap
。它交换保留这两个值的位置,但这对调用函数没有影响。考虑:
swap (int v1,int v2)
{
int t;
t = v1;
v1 = v2;
v2 = t;
}
这与您的交换函数相同,只是使用 int
代替。应该很清楚,如果您调用 swap(1,2);
,swap
函数只是将 2
放在它存储 1
的位置,反之亦然,但这对调用者中的任何内容。
如果你这样做也一样:
int i = 2;
int j = 3;
swap(i,j);
由于您传递给 swap
的只是值 2
和 3
,因此它不会以任何方式影响 i
和 j
的值。
如果您这样做,则与您的交换功能相同:
char* j = "hello";
char* k = "world";
swap(j,k);
该函数接收“hello”和“world”并交换它存储这两个指针的位置。这对调用方中的 j
或 k
没有影响。
C 是严格按值传递的。无论您传递给函数的参数是什么,该函数都只会接收其值。
,函数按值接受它们的参数。
那就是函数swap
(你忘记指定返回类型void
)
void swap(char *t1,char *t2) {
char *t;
t = t1;
t1 = t2;
t2 = t;
}
处理表达式 ptsr[0]
和 ptsr[1]
的值的副本。修改副本不会影响原始指针。
您可以想象函数定义及其调用方式如下
swap(ptsr[0],ptsr[1]);
//...
void swap( /*char *t1,char *t2*/) {
char *t1 = ptsr[0],*t2 = ptsr[1];
char *t;
t = t1;
t1 = t2;
t2 = t;
}
如您所见,变量和 ptsr[0]
和 ptsr[1]
未更改。
要更改函数中的对象(特别是可以具有指针类型的对象),您需要通过引用将其传递给函数。
在 C 中,通过引用传递意味着通过指向对象的指针间接传递对象。
所以函数 swap
看起来像
void swap(char **t1,char **t2) {
char *t;
t = *t1;
*t1 = *t2;
*t2 = t;
}
并且该函数必须被调用 .like
swap( &ptsr[0],&ptsr[1] );
或者一样
swap(ptsr,ptsr + 1);
取消对指针 t1
和 t2
的引用,函数可以直接访问原始指针 ptsr[0]
和 ptsr[1]
交换它们的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。