C/C++ 有关swap的 用swap交换两个结构体的时候驶是如何交换的,
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++ 有关swap的 用swap交换两个结构体的时候驶是如何交换的,相关的知识,希望对你有一定的参考价值。
是一个结构直接对另一个结构赋值吗?
还有怎样让两个结构交换地址?
用swap可以吗?怎样实现??????
《effective c++ 》条款25会对你有所帮助
可以下载电子版预览一下追问
是不是得用结构体指针?如果不是 给点提示呗
追答用吧,用指针可以提高效率,我给你发个pdf你看吧,很久不玩c++了,有些东西都忘了
用标准库swap函数,你得明白它是怎么工作的,然后我们又能对它做些其它的什么工作来提高效率
不如说是 让两个指针交换它的值吧~~~
而且两个指针必须是相同类型的。
不同类型进行交换的话 需要进行强制类型转换,而且十分不安全。追问
是的 可以这样说,那么可以让两个类型相同的结构体交换地址吗?
怎样换?
函数 C/C++里面的函数a=1,b=2;swap(a,b);可以交换两个数的值
用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;}为何无法实现交换?
总结:运行后出现失败,原因是因为定义的指针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
请按任意键继续. . .
总结:指针变量比较时直接对地址访问,从中感觉到形参与实参交相互应,用指针感觉会使枯燥的函数变得有声有色,像是多了更多的路径,今后的问题要根据结果来进行合适的选择。
以上是关于C/C++ 有关swap的 用swap交换两个结构体的时候驶是如何交换的,的主要内容,如果未能解决你的问题,请参考以下文章