函数的三种值传递方式

关于函数参数的传递方式

传值参数:

实际参数的值被复制到由函数开辟的内存空间中,成为形参的初始值。完成参数值传递之后,函数体中的语句对形参的访问、修改都是在这个标识对象上操作的,与实际参数无关。

实例:

复制代码
#include<iostream>
#include<cstring>
using namespace std;
void swap(int ,int);
int main()
{
    int a, b;
    cin >> a >> b;
    cout << "a=" << a << " b=" << b << endl;
    swap(a, b);              
    cout << "a=" << a << " b=" << b << endl;
    system("pause");
}
void swap(int a, int b)             
{
    int temp = a;           
    a = b;
    b = temp;
    cout << "a=" << a << " b=" << b << endl;
}
View Code
复制代码

输出结果:

理解:输入4,5,赋给a,b。调用函数swap,把a,b的值传递给函数中的形参,在swap函数中,输出交换后的形参的值。然后再main函数中输出a,b的值,发现a,b实际上并没有交换值,这是因为swap函数只对形参进行操作。

 

指针参数:

指针传递本质上和值传递差不多,实际上是把实际的指针参数传递给函数中创建的形参指针。不同的地方在于,指针传递的情况时,可以通过再函数中通过形参指针的间址访问对实际变量做出更改,这是值传递无法做到的。

代码:

复制代码
#include<iostream>
#include<cstring>
using namespace std;
void swap(int *, int *);
int main()
{
    int a, b;
    cin >> a >> b;
    cout << "a=" << a << " b=" << b << endl;
    swap(&a, &b);              //把a,b的地址传递给swap函数
    cout << "a=" << a << " b=" << b << endl;
    system("pause");
}
void swap(int *p, int *q)
{
    int temp = *p;            //通过指针简直访问,交换a,b的值
    *p = *q;
    *q = temp;
}
View Code
复制代码

 

 引用参数:
与以上两者不同的是函数调用时,形式参数不需要开辟新的存储空间,形式参数名作为引用(别名)绑定与实际参数表示的对象上。执行函数体时,对形参的操作就是对实参对象操作。

 代码:

复制代码
#include<iostream>
#include<cstring>
using namespace std;
void swap(int &, int &);
int main()
{
    int a, b;
    cin >> a >> b;
    cout << "before swaping: ";
    cout << "a=" << a << " b=" << b << endl;
    swap(a, b);              //实际参数是整形变量名
    cout << "after swaping: ";
    cout << "a=" << a << " b=" << b << endl;
    system("pause");
}
void swap(int &p, int &q)    //形式参数是整形引用
{
    int temp = p;            //通过名访问,交换a,b的值
    p = q;
    q = temp;
}
复制代码

使用const引用参数:

复制代码
#include<iostream>
#include<cstring>
using namespace std;
void swap(const int &,const int &);
int main()
{
    int a = 2, b = 55;
    cout << a << " " << b << endl;
    swap(a, b);
    cout << a << " " << b;
}
void swap(const int &a, const int &b)
{
    int temp = a;  
    a = b;      //非法操作a所绑定的对象被约束为只读,无法通过别名对该对象进行修改
    b = temp;
}
复制代码

与上述类似,使用const关键字约束对指针变量所指向对象的访问,这种指针称为指向常量指针。
如:

int a=2,b=3;

const int *p1=&a;       //声明一个指向常量的指针并给指针初始化

const int *p2;

 p2=&b;      //可以通过,因为指向常量的指针只对指针所指向的对象进行约束,并不对指针本身进行约束,所以可以先声明,后赋值

*p1=3;        //非法,无法通过p1间接对a进行修改

a=3;         //合法,a是int型变量,可以修改

 

posted @   裏表異体  阅读(2457)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示