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
的函数之前没有将 &
附加到 s1
和 s2
是错误吗?
如果有人能在这里解决我的问题,请不要给出完整的解决方案!我想用你给我的东西作为我自己修复它的工具。如果我真的不能自己修复它,我会在稍后解决。
提前联系!
您将指向两个 null-terminated 字符串的第一个字符的指针传递给 swap_pointers
函数。
在函数内部,当您使用例如*x
与 x[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);
要交换对象 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
.[=40 的别名=]
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 );
我正在做一个练习,任务是修复 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
是错误吗?
如果有人能在这里解决我的问题,请不要给出完整的解决方案!我想用你给我的东西作为我自己修复它的工具。如果我真的不能自己修复它,我会在稍后解决。
提前联系!
您将指向两个 null-terminated 字符串的第一个字符的指针传递给 swap_pointers
函数。
在函数内部,当您使用例如*x
与 x[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);
要交换对象 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
.[=40 的别名=]
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 );