C/C++学习笔记

C/C++参数传递方式总结

2019-12-16  本文已影响0人  零岁的我

直接上代码了,原理讲解都放在代码注释里了

#include<iostream>
using namespace std;
/*地址传递:两个形参是指针变量
函数调用时传递给形参的是实参的地址,例如&m,&n,
函数执行结果是:指针的指向并没有改变,改变的是指针指向地址的内容
地址传递实际上也是值传递,只不过传递的是参数的地址,
由于内存空间的唯一指向性,实参和形参都会指向同一个内存单元,
因此相残所指向内存单元发生变化,实参所指向内存单元也会发生变化。
*/
void goodswap(int *a,int *b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

/*这是一个有问题的函数
temp是一个临时指针变量,并且没有进行初始化,也就是指针temp所指向的单元是不可预见的
对*temp赋值就是对一个未知的存储单元赋值,而这个未知的存储单元可能存储着一个有用的数值
这样就有可能破坏系统的工作状态
*/
void badswap(int *a,int *b)
{
    int *temp;
    *temp=*a;
    *a=*b;
    *b=*temp;
}

/*值传递
实参是通过值传递给函数的,这意味着形参接受的只是发送给他们的值的副本,他们存储在函数的本地内存中,
对形参值进行任何改变都不会影响原始实参得值。
函数执行结果:形参变量内容互换了,就是a和b互换了,但是实参变量并没有发生改变;
由于实参变量与形参变量之间是单向的“值传递”方式,也就是实参可以传递给形参,但是形参不能再回传给实参
形参改变的只是实参的副本,因此形参值的改变不能使实参随之改变
*/
void errorswap(int a,int b)
{
    int temp;
    temp=a;
    a=b;
    b=temp;
}

 /*
 因为C语言单向传递的特性,
 想要把形参a和b return给实参m,n是做不到的,因为C/C++函数不能有多个返回值,除非使用引用传递的方式
 */
int fakeswap(int a,int b)
{
    int temp;
    temp=a;
    a=b;
    b=temp;
    return a,b;
    //return b;  //只能有一个返回值
}

/*
引用传递:实参与形参之间双向传递。引用是C++中的概念,因此只能在C++中使用
忽略实现原理,引用就是变量的一个别名,它没有自己的存储数据的内存位置,其访问的是另一个变量的内存位置,
对引用变量做出的任何改变,都是对它所引用得变量内存位置中数据的更改。
使用引用变量作为形参,引用变量就是实参列表中相应变量的别名,对形参的任何改变都将真正更改正在调用它的函数中的变量
*/
void swap(int &a,int &b)
{
    int temp;
    temp=a;
    a=b;
    b=temp;
}

int main(int args,char **argv,char *envp[])
{
    int m,n;
    cout<<"please input m and n:"<<endl;
    //cin>>"m=">>m>>','>>"n=">>n;
    cin>>m>>n;
    cout<<"----begore swap-------"<<endl;
    cout<<"m="<<m<<','<<"n="<<n<<endl;
    cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
    cout<<"----after goodswap--------"<<endl;
    goodswap(&m,&n); //传递给函数形参的是变量m和n的地址
    cout<<"m="<<m<<','<<"n="<<n<<endl;
    cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
    cout<<endl;

    cout<<"----begore swap-------"<<endl;
    cout<<"m="<<m<<','<<"n="<<n<<endl;
    cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
    cout<<"----after errorswap--------"<<endl;
    errorswap(m,n);
    cout<<"m="<<m<<','<<"n="<<n<<endl;
    cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
    cout<<endl;

    cout<<"----begore swap-------"<<endl;
    cout<<"m="<<m<<','<<"n="<<n<<endl;
    cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
    cout<<"----after swap--------"<<endl;
    swap(m,n);
    cout<<"m="<<m<<','<<"n="<<n<<endl;
    cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
    cout<<endl;

    cout<<"----begore swap-------"<<endl;
    cout<<"m="<<m<<','<<"n="<<n<<endl;
    cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
    cout<<"----after fakeswap--------"<<endl;
    m,n=fakeswap(m,n);
    cout<<"m="<<m<<','<<"n="<<n<<endl;
    cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
}

结果:


image.png

欢迎指正!

上一篇下一篇

猜你喜欢

热点阅读