我正在做一个练习,任务是修复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函数之前,不将它们附加到s1和s2是错误吗?
如果有人能在这里解决我的问题,请不要给出完整的解决方案!我想用你给我的东西作为我自己修复它的工具。如果我真的不能自己解决这件事,我以后会接下去的。
泰伊提前了!
发布于 2022-02-10 13:01:32
让我们首先考虑一下下面的代码片段
int a = 3, b = 4;
swap_nums(&a, &b);要交换对象a和b,您需要通过指向它们的指针通过引用将它们传递给函数swap_nums。因此,在取消引用指针的函数中,我们可以直接访问原始对象并更改它们的值。
void swap_nums(int *x, int *y) {
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}同样,我们需要对变量s1和s2进行处理。也就是说,我们需要通过指向它们的指针通过引用将它们传递给函数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 );在您的程序中,a和b具有int类型,也就是说,T是int类型的别名。
typedef int T;
T a = 3, b = 4;所以函数声明看起来就像
void swap_nums( T *x, T *y );对于变量s1和s2,可以编写
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 );发布于 2022-02-10 12:58:32
将指向两个以空结尾的字符串的第一个字符的指针传递给swap_pointers函数。
在函数内部,当您使用例如*x时,它与x[0]相同。
因此,您将x的第一个字符与y的第一个字符交换。
如果要切换指针,就需要像对swap_nums那样模拟逐个引用传递,并将指针传递到指针,即char **。并在调用中使用指针到运算符&。
所以应该是
void swap_ponters(char **x, char **y);和
swap_pointers(&s1, &s2);https://stackoverflow.com/questions/71065453
复制相似问题