函数参数的三种传递方式

        对于自定义函数,我们需要建立实参与形参之间的关系,这种关系可以分为传值调用和传址调用,二者在结果上的区别就是传值调用不能改变实参的值,而传址调用可以改变原实参的值。


下面以自定义swap函数为例说明:

一、传值调用:不能改变实参的值,较容易理解,略。

二、传址调用:

    1、引用传递:(常用)

        注意事项:①、int &a=n;表示给n起了一个别名a;

                         ②、函数内对a的操作及对n进行操作。

        示例代码:

#include<bits/stdc++.h>
using namespace std;
void swap(int &x,int &y)  //*
{
    int temp;
    temp=x;x=y;y=temp;
}
int main()
{
    int a,b;
    cin>>a>>b;
    swap(a,b);
    cout<<"after swap:"<<a<<" "<<b;
    return 0;
}

    2、指针传递:

        注意事项:①、int *p(定义一个指针变量),若在定义过程中对指针p赋值(int *p=?),则给p的应是一个地址;在正常语句中,*p=?表示给p所指向的目标变量赋值。

        示例代码:

#include<bits/stdc++.h>
using namespace std;
void swap( int *x,int *y )//定义时将a,b的地址传给指针型变量x和y;
{
    int temp=*x;//对指针型变量所指向的目标变量a,b赋值;
    *x=*y;
    *y=temp;
}
int main()
{
    int a,b;
    cin>>a>>b;
    swap(&a,&b);  //实参向形参传递的应为指针型变量;
    cout<<"after swap:"<<a<<" "<<b;
    return 0;

}

========================================================================

最后关于数组与指针问题的几点注意事项:

①、a[1]表示的是一个数值,*(a+1)表示的是数值;a+1表示的是a[1]的地址(同样&a[1]表示的也是a[1]的地)。

如:

#include<bits/stdc++.h>
using namespace std;
int a[101];
int main()
{
    a[1]=9;
    cout<<"a[1]="<<a[1]<<endl;
    cout<<"adress :a[1]="<<a+1<<endl;
    return 0;
}


②、a表示的是a数组的首地址,即a[0]的地址,如果用指针swap(a,b);那么交换的仅仅是a,b的第一个数。

③、指针型变量p+1表示指向数组的下一个同数据类型元素,而不是下一个字节。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值