swap_pointers 工作的诀窍是什么?

What is the trick for swap_pointers to work?

我正在做一个练习,任务是修复 swap_pointer()

应该交换两个字符串。

s1 = "I should print second.";
s2 = "I should print first.";

我目前的工作:

#include <stdio.h>

void swap_nums(int *, int *);
void swap_pointers(char *x, char *y);

int main(void) {

    int a = 3, b = 4;
    char *s1, *s2;

    swap_nums(&a, &b);

    printf("a is %d\n", a);
    printf("b is %d\n", b);

    s1 = "I should be printed second.";
    s2 = "I should be printed first.";

    /* swap_pointers(s1, s2); */

    printf("s1 is %s\n", s1);
    printf("s2 is %s\n", s2);

    return 0;
}

void swap_nums(int *x, int *y) {

    int tmp;

    tmp = *x;
    *x = *y;
    *y = tmp;
}

void swap_pointers(char *x, char *y) {

    char tmp;

    tmp = *x;
    *x = *y;
    *y = tmp;
}

我认为在将它们传递给 swap_pointers 的函数之前没有将 & 附加到 s1s2 是错误吗?

如果有人能在这里解决我的问题,请不要给出完整的解决方案!我想用你给我的东西作为我自己修复它的工具。如果我真的不能自己修复它,我会在稍后解决。

提前联系!

您将指向两个 null-terminated 字符串的第一个字符的指针传递给 swap_pointers 函数。

在函数内部,当您使用例如*xx[0] 相同。

因此您将 x 的第一个字符与 y 的第一个字符交换。

如果你想切换指针,你需要像使用swap_nums一样模拟pass-by-reference,并将指针传递给指针,即char **。并在调用中使用 pointer-to 运算符 &

所以应该是

void swap_ponters(char **x, char **y);

swap_pointers(&s1, &s2);

让我们首先考虑这个代码片段

int a = 3, b = 4;

swap_nums(&a, &b);

要交换对象 ab,您需要通过指向它们的指针将引用传递给函数 swap_nums。因此,在取消引用指针的函数中,我们可以直接访问原始对象并更改它们的值。

void swap_nums(int *x, int *y) {

    int tmp;

    tmp = *x;
    *x = *y;
    *y = tmp;
}

我们需要对变量 s1s2 做同样的事情。那就是我们需要通过指向它们的指针将它们传递给函数swap_pointers

所以你需要写

swap_ponters( &s1, &s2 );

并且函数将像

一样被声明和定义
void swap_ponters(char **x, char **y)
{
    char *tmp = *x;
    *x = *y;
    *y = tmp;
}

一般来说,如果你有两个对象,比如

T a;
T b;

其中 T 是某种类型说明符,然后要更改函数中的对象,您需要通过指向它们的指针通过引用将它们传递给函数。所以函数 swap 的声明看起来像

void swap( T *a, T *b );

并且该函数将被调用为

swap( &a, &b );

在您的程序中 ab 具有类型 int,即 T 是类型 int.[=40 的别名=]

typedef int T;

T a = 3, b = 4;

所以函数声明看起来像

  void swap_nums( T *x, T *y );

对于变量 s1s2 你可以写

typedef char *T;

T s1, s2;

函数声明又会像

void swap_pointers( T *x, T *y );

并且该函数将被调用为

swap_pointers( &s1, &s2 );

因为在这种情况下 T 是类型 char * 的别名,那么函数声明可以重写为

void swap_pointers( char * *x, char * *y );