为什么这个交换函数不起作用?(在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;
}

有人能指出并解释我的错误吗?

C严格按值传递。将ptsr[0]pstr[1]的值传递给swap。它交换了保存这两个值的位置,但这对调用函数没有影响。考虑:

swap (int v1, int v2)
{
int t;
t = v1;
v1 = v2;
v2 = t;
}

这与您的swap函数相同,只是使用int代替。很明显,如果调用swap(1,2);,swap函数只是将2放在它存储1的位置,反之亦然,但这对调用者中的任何内容都没有影响。

也一样:

int i = 2;
int j = 3;
swap(i,j);

由于您传递给swap的是23的值,因此无论如何都不会影响ij的值。

和你的swap函数一样,如果你这样做:

char* j = "hello";
char* k = "world";
swap(j,k);

函数接收"hello"one_answers";world"然后交换存储这两个指针的位置。这对调用方的jk没有影响。

C严格按值传递。无论传递给函数的参数是什么,函数只接收。

的值。

问题中的函数只交换其参数的值。实参是数组元素的副本,因此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;
}

函数接受实参的值。

这是函数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);

解除对指针t1t2的引用,函数可以直接访问原始指针ptsr[0]ptsr[1],交换它们的值。

最新更新