这里只做备份,后续有时间再完整分析
PS:c语言中没有引用的概念,所以swap_1()这个函数是无法通过编译的。但是在C++中是支持该方法的即所谓的多重含义,即在此处的&并不是取地址而是其中的变量的别名,如果以后用不到C++可以不用了解,因为在c中可以通过指针即swap_2()这个函数来间接改变函数内的值。效果其实差不多。不过在实际中,因为C++是c的超集,理论上可以使用stdio.h这个头文件如果将这个文件的后缀名改成.cpp然后用g++来编译那么swap_1()这个函数是可以通过编译并且运行的。所以有意思的是swap_1()这个函数要想编译只需要将.c文件改成.cpp文件即可运行。
//引用和指针的区别
#include<iostream>
using namespace std;
void swap_1(int &a,int &b);
void swap_2(int *kk,int *dd);
void swap_3(int ds,int dds);
enum tt{
x0=11,
x1,
x2,
x3,
x4,
x5
};
int main()
{
int m=x0;
int n=x1;
int l=x2;
int pp=x3;
int m1=x4;
int m2=x5;
cout<<"1:m="<<m<<",n="<<n<<",l="<<l<<",p="<<pp<<",m1="<<m1<<",m2="<<m2<<endl;
swap_1(m,n);
cout<<"2:m="<<m<<",n="<<n<<",l="<<l<<",p="<<pp<<",m1="<<m1<<",m2="<<m2<<endl;
swap_2(&l,&pp);
cout<<"3:m="<<m<<",n="<<n<<",l="<<l<<",p="<<pp<<",m1="<<m1<<",m2="<<m2<<endl;
swap_3(m1,m2);
cout<<"4:m="<<m<<",n="<<n<<",l="<<l<<",p="<<pp<<",m1="<<m1<<",m2="<<m2<<endl;
}
void swap_1(int &a,int &b) //int &a=m;即a是m的别名则x=a;即x=m;即改变了引用的值会影响被引用的值
{
int x;
x=a;
a=b;
b=x;
}
void swap_2(int *c,int *d) //取地址用指针,将存放变量l和pp的地址取出,将其中的值进行交换,地址是客观存在的将其中的值交换必会使值发生变化
{
int y;
y=*c;
*c=*d;
*d=y;
}
void swap_3(int e,int f) //在函数内部进行交换由于没有用引用和取地址,函数虽然在内部将两个参数的值进行了交换但是所创建的运算空间即内存空间是动态的
{ //它们会在函数运行完成后将所有的值都销毁并且该函数是void类型没有返回值所以在它结束后m1和m2的值没有变化
int z;
z=e;
e=f;
f=z;
}