sophisticated 发表于 2019-1-16 15:07:25

c语言课后题提问

通过指针来交换两个变量的值,下面的代码是正确的:
#include <stdio.h>

void swap(int *x, int *y);

void swap(int *x, int *y)
{
        int temp;
       
        printf("互换前 : x, y %d, %d\n", *x, *y);
       
        temp = *x;
        *x = *y;
        *y = temp;
       
        printf("互换后 : x, y %d, %d\n", *x, *y);

}

int main()
{
        int x = 3, y = 5;
       
        printf("互换前 : x, y: %d, %d\n", x, y);
        swap(&x, &y);
        printf("互换后 : x, y: %d, %d\n", x, y);
       
        return 0;
}


为什么将swap函数改成如下形式后,在main函数中x,y并没有互换(这样的改变也是在x,y的地址上直接交换的啊)
求大佬指点{:5_111:}

void swap(int *x, int *y)
{
        int *temp;
       
        printf("互换前 : x, y %d, %d\n", *x, *y);
       
        temp = x;
        x = y;
        y = temp;
       
        printf("互换后 : x, y %d, %d\n", *x, *y);

}

BngThea 发表于 2019-1-16 15:38:44

交换指针是很危险的操作,一般都是交换指针指向的值

sophisticated 发表于 2019-1-16 15:44:05

BngThea 发表于 2019-1-16 15:38
交换指针是很危险的操作,一般都是交换指针指向的值

感谢解答{:5_106:}

诺殇丨 发表于 2019-1-16 15:45:25

有可能指针是按值传递的吧?用**传递,在参数有&&?

诺殇丨 发表于 2019-1-16 15:46:18

上面错了,是用&&

ba21 发表于 2019-1-16 16:04:45

要交换地址没有你想像的那么简单,交换地址还要多声明2个指针,且要用到指向指针的指针 (实际上还是在主函数的指针上操作,原来的x,y 的地址是不可能变的)
如:
#include <stdio.h>

void swap(int **x, int **y);

void swap(int **x, int **y)
{
      int *temp;
      
      printf("互换前 : x, y %d, %d\n", **x, **y);
      
      temp = *x;
      *x = *y;
      *y = temp;
      
      printf("互换后 : x, y %d, %d\n", **x, **y);

}

int main()
{
      int x = 3, y = 5;
                int *p1, *p2;

                p1=&x;
                p2=&y;
      
      printf("互换前 : p1, p2: %d, %d\n", *p1, *p2);
                printf("互换前地址:p1, p2:%p, %p\n", p1, p2);

      swap(&p1, &p2);

      printf("互换后 : p1, p2: %d, %d\n", *p1, *p2);
                printf("互换后地址:p1, p2:%p, %p\n", p1, p2);
      
      return 0;
}

这段代码中,只是把2处地址的值进行交换
void swap(int *x, int *y)
{
      int temp;
      
      printf("互换前 : x, y %d, %d\n", *x, *y);
      
      temp = *x;
      *x = *y;
      *y = temp;
      
      printf("互换后 : x, y %d, %d\n", *x, *y);

}

=====================================================================================================
1,而你尝试的代码中是想交换主函数中2个变量的地址,要交换2个变量的地址是永远不可能的。只有上面说到交换地址还要多声明2个指针,且要用到指向指针的指针

void swap(int *x, int *y)
{
      int *temp;
      
      printf("互换前 : x, y %d, %d\n", *x, *y);
      
      temp = x;
      x = y;
      y = temp;
      
      printf("互换后 : x, y %d, %d\n", *x, *y);

}

2,void swap(int *x, int *y) 这里的x, y只不过是局部变量,作用范围只在函数体
#include <stdio.h>

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

void swap(int *a, int *b)
{
      int temp;
      
      printf("互换前 : a, b %d, %d\n", *a, *b);
      
      temp = *a;
      *a = *b;
      *b = temp;
      
      printf("互换后 : a, b %d, %d\n", *a, *b);

}

int main()
{
      int x = 3, y = 5;
      
      printf("互换前 : x, y: %d, %d\n", x, y);
      swap(&x, &y);
      printf("互换后 : x, y: %d, %d\n", x, y);
      
      return 0;
}

3, 交换指针指向的地址是可以的。不过也只作用于函数体内(要想在函数体内修改函数体外部某指针里面存放的地址还得用指向指针的指针)
#include <stdio.h>

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

void swap(int *a, int *b)
{
      int *temp;
      
      printf("互换前 : a, b %d, %d\n", *a, *b);
      
      temp = a;
      a = b;
      b = temp;
      
      printf("互换后 : a, b %d, %d\n", *a, *b);

}

int main()
{
      int x = 3, y = 5;
      
      printf("互换前 : x, y: %d, %d\n", x, y);
      swap(&x, &y);
      printf("互换后 : x, y: %d, %d\n", x, y);
      
      return 0;
}

4, 3中的代码,你可以去掉函数,直接到主函数声明2个指针,然后交换指针存放的地址但x,y 的地址是不可能改变的如:
#include <stdio.h>

int main()
{
      int x = 3, y = 5;
                int *p1, *p2, *temp;

                p1=&x;
                p2=&y;
      
      printf("互换前 : x, y: %d, %d\n", x, y);
      
               
      printf("互换前 : p1, p2 %d, %d\n", *p1, *p2);
      
      temp = p1;
      p1 = p2;
      p2 = temp;
      
      printf("互换后 : p1, p2 %d, %d\n", *p1, *p2);


      printf("互换后 : x, y: %d, %d\n", x, y);
      
      return 0;
}

sophisticated 发表于 2019-1-16 16:08:26

诺殇丨 发表于 2019-1-16 15:46
上面错了,是用&&

应该是按值传递的{:5_109:}
在main函数中(第24行)有将地址传给swap函数,你看看

sophisticated 发表于 2019-1-16 16:18:38

ba21 发表于 2019-1-16 16:04
要交换地址没有你想像的那么简单,交换地址还要多声明2个指针,且要用到指向指针的指针 (实际上还是在主函 ...

感谢指点,使我茅塞顿开{:5_106:}
页: [1]
查看完整版本: c语言课后题提问