为什么这个交换功能不起作用? (在 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 的只是值 23,因此它不会以任何方式影响 ij 的值.

如果你这样做,与你的交换功能相同:

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

该函数接收“hello”和“world”并交换它存储这两个指针的位置。这对调用者中的 jk 没有影响。

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);

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