文章目录
在主函数中实现两数的交换
/*
直接在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分别为取地址的内容表达式,然后进行地址的内容交换。