首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >swap_pointers工作的诀窍是什么?

swap_pointers工作的诀窍是什么?
EN

Stack Overflow用户
提问于 2022-02-10 12:53:12
回答 2查看 149关注 0票数 1

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

应该交换两根绳子。

代码语言:javascript
复制
s1 = "I should print second.";
s2 = "I should print first.";

到目前为止我的工作:

代码语言:javascript
复制
#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是错误吗?

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

泰伊提前了!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-10 13:01:32

让我们首先考虑一下下面的代码片段

代码语言:javascript
复制
int a = 3, b = 4;

swap_nums(&a, &b);

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

代码语言:javascript
复制
void swap_nums(int *x, int *y) {

    int tmp;

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

同样,我们需要对变量s1s2进行处理。也就是说,我们需要通过指向它们的指针通过引用将它们传递给函数swap_pointers

所以你需要写

代码语言:javascript
复制
swap_ponters( &s1, &s2 );

函数的声明和定义如下

代码语言:javascript
复制
void swap_ponters(char **x, char **y)
{
    char *tmp = *x;
    *x = *y;
    *y = tmp;
}

通常,如果您有两个对象,如

代码语言:javascript
复制
T a;
T b;

如果T是某种类型说明符,那么要更改函数中的对象,需要通过指向它们的指针将它们传递给函数。因此,函数swap的声明将类似于

代码语言:javascript
复制
void swap( T *a, T *b );

该函数将被调用为

代码语言:javascript
复制
swap( &a, &b );

在您的程序中,ab具有int类型,也就是说,Tint类型的别名。

代码语言:javascript
复制
typedef int T;

T a = 3, b = 4;

所以函数声明看起来就像

代码语言:javascript
复制
  void swap_nums( T *x, T *y );

对于变量s1s2,可以编写

代码语言:javascript
复制
typedef char *T;

T s1, s2;

同样,函数声明将类似于

代码语言:javascript
复制
void swap_pointers( T *x, T *y );

该函数将被调用为

代码语言:javascript
复制
swap_pointers( &s1, &s2 );

在本例中,Tchar *类型的别名,那么函数声明可以重写如下

代码语言:javascript
复制
void swap_pointers( char * *x, char * *y );
票数 3
EN

Stack Overflow用户

发布于 2022-02-10 12:58:32

将指向两个以空结尾的字符串的第一个字符的指针传递给swap_pointers函数。

在函数内部,当您使用例如*x时,它与x[0]相同。

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

如果要切换指针,就需要像对swap_nums那样模拟逐个引用传递,并将指针传递到指针,即char **。并在调用中使用指针到运算符&

所以应该是

代码语言:javascript
复制
void swap_ponters(char **x, char **y);

代码语言:javascript
复制
swap_pointers(&s1, &s2);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71065453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档