【问题标题】:Why doesn't this swapping function work? (swapping strings in C)为什么这个交换功能不起作用? (在 C 中交换字符串)
【发布时间】:2021-04-30 00:20:00
【问题描述】:

我正在尝试交换字符串数组中的 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;
}

有人可以识别并解释我的错误吗?

【问题讨论】:

  • 如果您使用int 这样做,您认为swap(1,2); 会做什么?
  • 没有交换的返回类型?

标签: c pointers pass-by-reference swap pass-by-value


【解决方案1】:

函数按值接受其参数。

那是函数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],交换它们的值。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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 严格按值传递。无论您传递给函数的参数是什么,该函数都只接收的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 2015-05-21
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        相关资源
        最近更新 更多