为什么这个交换功能不起作用? (在 C 中交换字符串)
Why doesn't this swapping function work? (swapping strings in 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
(您忘记指定 return 类型 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]
并交换它们的值。
我正在尝试交换字符串数组中的 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
(您忘记指定 return 类型 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]
并交换它们的值。