#include<iostream>
using namespace std;
void swap1(int x,int y);
void swap2(int *px,int *py);
void swap3(int &x,int &y);
int main(){
int a=1,b=2;
int *pa=&a,*pb=&b; /*定义的指针变量的时候,也就是说指针变量前面有int,float,char等关键字的时候。
*pa并不表示指针变量,*是指一个指针变量的标志,其实pa才表示指针变量。
当没有int,float,char等关键字的时候,我们试着打印一下*pa,它会打印出一个a的值,那就是1,
这个表示a的地址对应的值,然后再打印一下pa,它会打印出一个地址就是a的地址,
坦白说,"int *pa=&a"里面的*pa和直接写个"*pa"是不同的意思!*/
/*我们可以理解为“int *pa=&a”里面的“*pa”和单独的”pa“是一样的意思,都表示地址; 单独的“*pa”表示地址a对应的值*/
//*pa,pa,&pa三者的含义是什么?
//cout<<*pa;打印的是a的地址对应的值,就是1。
//cout<<pa;输出指针变量pa的值,它的值就是a的地址。
//cout<<&pa;输出变量pa的地址,当然变量a的地址和变量pa地址是不一样的
cout<<"swap1之前打印地址"<<&a<<" "<<&b<<endl;
cout<<"swap1之前打印值"<<a<<" "<<b<<endl;
swap1(10,20); /*发现swap1(a,b)和swap1(10,20)的结果仅仅表现在函数内部,
所以当swap1(a,b)的时候,只是把普通是数字1和2赋值进去了,
并没有真正把a和b的值传进去,所以a和b的值是不会交换的;
swap2和swap3函数中,不能像swap1函数一样直接赋数值进去*/
cout<<"调用swap1之后打印值:"<<"a="<<a<<"\t"<<"b="<<b<<endl;
cout<<"调用swap1之后打印地址"<<&a<<" "<<&b<<endl;
//=========================================================================================================
cout<<"==========================================================================================="<<endl;
a=1;b=2;
cout<<"swap2之前打印地址"<<&a<<" "<<&b<<endl;
cout<<"swap2之前打印值"<<a<<" "<<b<<endl;
swap2(pa,pb);
cout<<"调用swap2之后打印值:"<<"a="<<a<<"\t"<<"b="<<b<<endl;
cout<<"调用swap2之后打印地址"<<&a<<" "<<&b<<endl;
//========================================================================================================
cout<<"==========================================================================================="<<endl;
a=1;b=2;
cout<<"swap3之前打印地址"<<&a<<" "<<&b<<endl;
cout<<"swap3之前打印值"<<a<<" "<<b<<endl;
swap3(a,b);
cout<<"调用swap3之后打印值:"<<"a="<<a<<"\t"<<"b="<<b<<endl;
cout<<"调用swap3之后打印地址"<<&a<<" "<<&b<<endl;
}
void swap1(int x,int y){ //调用swap1(a,b)时候,里面的a和b并没有指定是a的值和b的值,只代表单纯的数字而已。
int tmp=x; //打比方,A同学拿着苹果,B同学拿着香蕉,程序并没有从A,B两个同学手里把两种水果交换,
x=y; //而是自己另外买了苹果和香蕉,然后把两种水果交换了。结果A同学还是拿着苹果,B同学还是拿着香蕉,所以没有交换
y=tmp; //也可以理解为swap1函数仅仅对函数内部起作用
cout<<"swap1函数内部打印x,y的值:"<<x<<"\t"<<y<<endl;
}
void swap2(int *px,int *py){ //使用swap2(pa,pb)传进变量a和b的地址
int tmp;
tmp=*px; //pa和pb的值,也就是a和b的地址信息,传进去以后,仅仅对a和b的值进行交换;
*px=*py; //为什么用指针才能交换?直接交换就不行?有指针才能告诉a和b地址在哪里呀,知道他们两在哪里才能交换他们的数值
*py=tmp; //仅仅找个数字1和2,却不知道a和b在哪里,肯定交换不了a和b的值
cout<<"swap2函数内部打印x,y的值:"<<*px<<"\t"<<*py<<endl;
}
void swap3(int &x,int &y){ //引用了变量a和变量b,a代替了x,b代替了y,可以理解为,
int tmp=x; //程序已经知道A同学拿苹果B同学拿香蕉了,那当然就可以有效地交换水果了
x=y;
y=tmp;
cout<<"swap3函数内部打印x,y的值:"<<x<<"\t"<<y<<endl;
}
运行结果:
image.png图解:
指针详解图:
image.png
代码图片
image.png
网友评论