C++笔记:对两个整数实现交换的一点思考

在主函数中实现两数的交换

/*
直接在main函数内交换两个数
*/
#include<iostream>
#include<windows.h>
using namespace std;
int main(){
 SetConsoleOutputCP(65001);
 int number1,number2;//分配内存地址,内存地址的值为一个随机数
 cout<<"请输入number1:"<<endl;
 cin>>number1;//3覆盖掉随机数
 cout<<"请输入number2:"<<endl;
 cin>>number2;//6覆盖掉随机数
 int tmp;//此时tmp变量内存地址存放的值是一个随机数
 tmp=number1;//将tmp变量在内存地址保存的值改为number1变量在内存地址保存的值,此时tmp和number1和number2的值为3,3,6
 number1=number2;//将number1变量在内存地址中保存的值改为number2变量在内存地址中保存的值,此时tmp和number1和number2的值为3,6,6
 number2=tmp;//将number2变量在内存地址保存的值改为tmp变量在内存地址保存的值,此时tmp和number1和number2的值为3,6,3
 
 cout<<&tmp<<endl<<&number1<<endl<<&number2<<endl;//打印变量内存地址值,方便查看下面的思维导图
 
 cout<<"number1="<<number1<<endl;
 cout<<"number2="<<number2<<endl;
 return 0;
}

输出:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述看到其他教材还可以用和差法保存变量,再进行变量之间的值交换,此处作为扩展吧!

#include <stdio.h>
int main(void)
{
 int a,b;
 printf("请输入a的值:");
 scanf("%d",&a);//输入a=1 
 printf("请输入b的值:");
 scanf("%d",&b);//输入b=2
 printf("交换前:a=%d b=%d\n",a,b);
 a=a+b;//a=3(覆盖原来的a值) ,b=2
 b=a-b;//b=1(覆盖原来的b值),a=3 
 a=a-b;//b=1,a=2(再次覆盖原来的a值)
 printf("交换后:a=%d b=%d\n",a,b);
 return 0;
}

输出:
在这里插入图片描述
这种算法存在潜在的错误,比如a和b足够大,则a+b会造成内存溢出,导致程序出错

在自定义处理函数,使用"值传递"参数实现两数的交换(无法实现)

/*
使用值传递参数
*/
#include<iostream>
#include<windows.h>
using namespace std;
void swap(int a,int b){
 int tmp;
 tmp=a;
 a=b;
 b=tmp;
}
int main(){
 SetConsoleOutputCP(65001);
 int number1,number2;
 cout<<"请输入number1:"<<endl;
 cin>>number1;
 cout<<"请输入number2:"<<endl;
 cin>>number2;
 
 swap(number1,number2);
 cout<<"number1="<<number1<<endl;
 cout<<"number2="<<number2<<endl;
 return 0;
}

输出:
在这里插入图片描述
传值调用,即,主调函数将实参数值复制给被调用的函数形参处,该处代码没有实现两数交换的原因是,主函数在调用swap函数时,在内存中新开辟了两处命名为a,b的内存空间存放传来的值,并进行换值操作,swap函数内的局部变量a和b与main函数的number1和numbr2变量没有任何关系,所以number1和number2不受影响。

在自定义处理函数,使用"引用传递"参数实现两数的交换

/*
使用引用传递参数
*/
#include<iostream>
#include<windows.h>
using namespace std;
void swap(int &a,int &b){
 int tmp;
 tmp=a;
 a=b;
 b=tmp;
}
int main(){
 SetConsoleOutputCP(65001);
 int number1,number2;
 cout<<"请输入number1:"<<endl;
 cin>>number1;
 cout<<"请输入number2:"<<endl;
 cin>>number2;
 cout<<"swap()函数通过接收引用参数交换number1和number2:"<<endl;
 swap(number1,number2);
 cout<<"number1="<<number1<<endl;
 cout<<"number2="<<number2<<endl;
 return 0;
}

输出:
在这里插入图片描述
在函数swap内定义了两个引用变量a和b,它是实参number1和number2的别名,对a和b的操作与对number1和number2的操作完全一致。注意:一个C++引用被初始化后,无法使用它再去引用另一个对象,它不能被重新约束。

在自定义处理函数,使用"指针传递"参数实现两数的交换

/*
使用指针传递参数
*/
#include<iostream>
#include<windows.h>
using namespace std;
void swap(int *a,int *b){
 int tmp;
 tmp=*a;
 *a=*b;
 *b=tmp;
}
int main(){
 SetConsoleOutputCP(65001);
 int number1,number2,*p1,*p2;
 cout<<"请输入number1:"<<endl;
 cin>>number1;
 cout<<"请输入number2:"<<endl;
 cin>>number2;
 p1=&number1;
 p2=&number2;
 cout<<"通过传递指针参数交换number1和number2:"<<endl;
 swap(p1,p2);
 cout<<"number1="<<number1<<endl;
 cout<<"number2="<<number2<<endl; 
 return 0;
}

输出:
在这里插入图片描述
在函数swap内的(形参)指针变量a和b存放number1和number2的内存地址,*a,*b分别为取地址的内容表达式,然后进行地址的内容交换。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值