用swap 交换两个数

Posted 仲宇航

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用swap 交换两个数相关的知识,希望对你有一定的参考价值。

1、构建swap函数,实现两个整型变量数值的交换,且使用指针类型的数据作为swap函数的参数。

#include<stdio.h> main() {  void swap(int *p1,int *p2);//定义swap函数,用于交换。  int *p,*q;  int a,b; //定义两个指针变量和两个数a和b  printf("请输入两个数:");  scanf("%d,%d",&a,&b);//输入两个数  p=&a;  q=&b;//将p和q分别指向a和b的地址  swap(p,q);//调用swap函数对p和q执行交换    printf("\\n经过交换为:%d,%d",a,b);//输出交换后a和b的值 }  void swap(int *p1,int *p2)//定义函数内容  {    int temp;  temp=*p1;     *p1=*p2;  *p2=temp;//用变量temp实现p1与p2的交换
}


请输入两个数:22,33


经过交换为:33,22
--------------------------------
Process exited after 6.716 seconds with return value 0
请按任意键继续. . .

 

总结:1 编程后想调用函数应用指针*temp来交换p1与p2的,后来运行结束后发现没有交换,后来用将 *temp赋给其他变量才得以交换,不过复杂了很多,多此一举,所以用变量temp最为合适。

2 运行是逗号没有发现是中文的,导致久久没有发现问题,所以一定细心编程,及时修改错误。

3 通过调用函数来实现指针间的交换地址,进而实现交换两个数,所以修改数可以直接通过指针直接来对数的修改,比正常运用函数来修改数更为便利。

2:void swap(int *p,int *q){int *m;*m=*p;*p=*q;*q=*m;}为何无法实现交换?

#include<stdio.h>
void swap(int *p,int *q) //定义函数,两个整型变量数值的交换
{
 int *m;  //这里出现错误
 *m=*p;
 *p=*q;
 *q=*m;
}
int main()
{
 int a,b; //定义变量a,b
 scanf("%d,%d",&a,&b) ; //输入数,对a和b赋值
 swap(&a,&b); //用swap交换a和b
 printf("a=%d b=%d",a,b); //输出交换后数值
 return 0;
}
 
 

1.2

--------------------------------
Process exited after 14.76 seconds with return value 3221225477
请按任意键继续. . .

总结:运行后出现失败,原因是因为定义的指针m是一个存放地址的变量,但只是简单的定义,我们知道指针是指向数据的内存地址,而这里他是空的,他不指向任何对象,相当于没有箭头指向,而却想要和其他变量交换,是不能的,所以出现运行后失败的出现。如果想要正常运行,可以给*m指向一个c,并对c赋初始值,才可以交换。

#include<stdio.h>
void swap(int *p,int *q) //定义函数,两个整型变量数值的交换 
{
    int *m,c; //这里出现错误
    c=0;  
    m=&c; 
    *m=*p;
    *p=*q;
    *q=*m;
}
int main()
{
    int a,b; //定义变量a,b 
    scanf("%d,%d",&a,&b) ; //输入数,对a和b赋值 
    swap(&a,&b); //用swap交换a和b 
    printf("a=%d b=%d",a,b); //输出交换后数值 
    return 0;
}

1,2
a=2 b=1
--------------------------------
Process exited after 7.233 seconds with return value 0
请按任意键继续. . .

 

3、void swap(int *p,int *q){int *m;m=p;p=q;q=m;}为何无法实现交换?

 

#include<stdio.h>
void swap(int *p,int *q) //定义函数,两个整型变量数值的交换 
{
    int *m;   
    m=p;
    p=q;
    q=m;
}
int main()
{
    int a,b; //定义变量a,b 
    scanf("%d,%d",&a,&b) ; //输入数,对a和b赋值 
    printf("a=%p b=%p\\n",a,b);//输出用swap之前a和b的地址 
    swap(&a,&b); //用swap交换a和b 
    printf("a=%p b=%p\\n",a,b);//输出用swap之后a和b的地址 
    printf("a=%d b=%d",a,b);//输出用swap之后a和b的值 
    return 0;
}

1,2
a=0000000000000001 b=0000000000000002
a=0000000000000001 b=0000000000000002
a=1 b=2
--------------------------------
Process exited after 6.793 seconds with return value 0
请按任意键继续. . .从

总结:由地址和输出a和b的值可以看出地址和数值都没有发生交换,从a和n通过调用变为指针p和q的交换,而这种交换却只是指向,连地址都没有交换,做的是没有任何用的交换,从而输出a和b是不发生交换的。

4、构建comp函数,实现两个整数比较,比较大的值通过返回值返回给main。要求comp的参数和返回值都是指针类型数据。

#include<stdio.h>
int comp(int *p1,int *p2)//定义函数comp 
    {
    if(*p1>*p2)  //用if语句来比教较p1与p2大小来执行交换 
      return *p1;
    else
      return *p2;//如果大于返回*p1给max,小于返回*p2给max. 
    }

main()
{
    
    int a=25;
    int b=66;
    int max;
    int *c,*d;
    c=&a;
    d=&b;  //将c指向a,  b指向d. 
    max=comp(c,d); //用comp函数进行交换 
    printf("max=%d\\n",max); //输出最大值max 
    return 0;
}

max=66


--------------------------------
Process exited after 0.06281 seconds with return value 0
请按任意键继续. . .


总结:指针变量比较时直接对地址访问,从中感觉到形参与实参交相互应,用指针感觉会使枯燥的函数变得有声有色,像是多了更多的路径,今后的问题要根据结果来进行合适的选择。

 

以上是关于用swap 交换两个数的主要内容,如果未能解决你的问题,请参考以下文章

swap函数交换 指针

交换两个数的值

C/C++ 有关swap的 用swap交换两个结构体的时候驶是如何交换的,

Counting swaps

编写程序,任意输入两个数,通过函数调用交换两个变量值。

编写一个函数swap,将指定数组按照从小到大的顺序排序,