2

我正在尝试解决这个问题。问题是,*“swap_nums 似乎有效,但 swap_pointers 无效。修复它。”* 顺便说一句,我是初学者 :)

我相信我可以自己解决问题,但问题是我在理解 C 中的一些编程概念时有些困难。这里我展示了需要编辑的给定代码。下面我将展示我到目前为止的思考过程。请注意:我想要一些提示而不是完整的解决方案。:-)

#include <stdio.h>
#include <stdlib.h>

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

int main (int argc, char *argv[]){

   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 print second";
   s2 = "I should print first";

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

   return EXIT_SUCCESS; } 

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

   int temp;
   temp = *x;
   *x = *y;
   *y = temp; }

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

   char *temp;
   temp = x;
   x = y;
   y = temp; }

我的思考过程:这是一个我认为可以交换整数变量 a 和 b 的程序。然后它将获取两个声明的字符串并交换它们。

主功能:

int a = 3, b = 4;

将变量 a 和 b 分别分配给 3 和 4。

char *s1, *s2;

创建一个字符指针变量(它将保存一个字符的地址)

swap_nums(&a, &b);

函数 swap_nums 正在执行。我现在就去解释我的思维过程。

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

所以我不太熟悉将东西传递给函数,如果我在这里错了,有人可以纠正我要说的话吗?

在我看来,我们将 a 和 b 的地址传递给函数 swap_nums。但是为什么我们有 int *x 和 int *y 呢?我在这里有点困惑。有人可以向我解释一下吗?

4

6 回答 6

8

在 C 中,所有内容都作为值传递,包括指针。因此,交换指针的代码会操纵指针副本,而保持原件不变。

为了交换指针,您需要将指针传递给指针,而不仅仅是指针。当然,在函数内部,您需要以与在中相同的方式添加取消引用级别swap_numbers

void swap_pointers (char **x, char **y) {
    char *temp;
    temp = *x;
    *x = *y;
    *y = temp;
}
于 2013-06-24T03:55:38.507 回答
0

将指针视为另一个变量,我们必须将指向该变量的指针传递给函数swap_pointers()

于 2013-06-24T07:19:37.527 回答
0

我猜这就是你需要的。基本且足够。

void swap(char **s1, char **s2){
char *temp=*s1;
*s1=*s2;
*s2=temp;
}

int main(){
char *s1="second";
char *s2="first";
swap(&s1,&s2);
printf("%s",s1);
printf("%s",s2);
return 0;

}  

希望这可以帮助。

于 2013-06-24T07:36:31.043 回答
0

提示:研究按值调用和按引用调用,以清楚地了解您的查询。

于 2013-06-24T06:47:12.510 回答
0

指针可能是一个地址,但它仍然按值传递给函数(就像 C 中的所有内容一样)。要交换两个指针,您需要指向指针的指针


这就是你想要的:

#include <stdio.h>

int main(void)
{
    char x='s';
    char y='o';
    char *a = &x;
    char *b = &y;
    printf("a is %x\n",a);
    printf("b is %x\n",b);
    printf("swapping\n");
    swap_pointers(&a,&b);
    printf("a is %x\n",a);
    printf("b is %x\n",b);

}

void swap_pointers(char **a, char **b)
{
    char *temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
于 2013-06-24T03:54:03.330 回答
0

这是一个提示,这有问题:

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

什么是s1类型,什么是“我应该打印第二个”?以及如何将字符串文字保存到变量中?

于 2013-06-24T03:54:41.227 回答