美文网首页C/C++学习笔记
C/C++参数传递方式总结

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

作者: 零岁的我 | 来源:发表于2019-12-16 18:36 被阅读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

欢迎指正!

相关文章

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

    直接上代码了,原理讲解都放在代码注释里了 结果: 欢迎指正!

  • C++ 引用传递的学习

    C++ 引用与引用作为函数的参数C++函数的三种传递方式为:值传递、指针传递和引用传递 C++ 上课习题 刘月林2...

  • Android打包,通过命令行来控制C++代码的宏

    参数传递流程 实现 gradle对命令行参数的响应 Android默认的C++构建方式 在默认的Android构建...

  • Python 函数中,参数是传值,还是传引用?

    Python 函数中,参数是传值,还是传引用? 代码示例 在 C/C++ 中,传值和传引用是函数参数传递的两种方式...

  • C++引用与指针

    C++里函数参数传递有3种方式:值传递,指针传递,引用传递 其中值传递大家都很清楚,传递到函数中的值是原值的一个拷...

  • Python函数

    函数的参数 在 C/C++ 中,传值和传引用是函数参数传递的两种方式,学 Python 时,有人喜欢生搬硬套地问类...

  • C++将函数名作为函数参数传递:函数指针,将函数名传递进去 树的先序、中序和后序遍历方式

  • C++ 函数调用时的三种参数传递方式

    C++ 函数调用时的三种参数传递方式 [TOC] 为了又一年校招季,准备开始刷题了。决定使用 C++,那么先复习一...

  • Java 基础笔记

    一、Java中参数传递 Java中方法的参数传递实际上都是值传递,有别于C/C++;在使用对象传递时只能修改对象的...

  • C++使用Lambda函数实现多线程

    转帖: C++使用Lambda函数实现多线程thread - 传递引用参数

网友评论

    本文标题:C/C++参数传递方式总结

    本文链接:https://www.haomeiwen.com/subject/jgrdnctx.html