我试图在字符串数组中交换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
的是2
和3
的值,因此无论如何都不会影响i
和j
的值。
和你的swap函数一样,如果你这样做:
char* j = "hello";
char* k = "world";
swap(j,k);
函数接收"hello"one_answers";world"然后交换存储这两个指针的位置。这对调用方的j
或k
没有影响。
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);
解除对指针t1
和t2
的引用,函数可以直接访问原始指针ptsr[0]
和ptsr[1]
,交换它们的值。