关于参数传递

按数据值传递参数
按值传递参数时,是将实参变量的值复制一个到临时存储中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变。
按地址值传递参数
按地址传递参数时,把实参变量的地址传送给被调用过程,形参和实参共用内存的同一地址。在被调用过程中,形参的值一旦改变,相应实参的值也跟着改变。
其中

void swap1(int *p1, int *p2)

void swap2(int &p1, int &p2)

void swap3(int p1.int p2)

三种函数处理方式,在前两种种都会改变实参的值,只有最后一种按值传递不会改变实参的值。

于是得出今天晚上的最后一个结论,当 用指针作为传递参数时,你对函数形参的实际操作也会带来实参的变化。

这个是应该引起注意的。

#include<cstdio>
using namespace std;
void swap1(int *p1, int *p2)
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}

void swap2(int &p1, int &p2)
{	int temp;
	temp=p1;
	p1=p2;
	p2=temp;
}

void swap3(int *p1,int *p2)
{
    int *temp;
    temp = p1;
    p1   = p2;
    p2   = temp;
}

void swap4(int a,int b)
{
    int temp;
    temp = a;
    a    = b;
    b    = temp;
}
int main(int argc, char* argv[])
{

int a, b;
int *pointer_1,*pointer_2;

printf("方法1请输入两个数(a<b)\n");
scanf("%d %d", &a, &b);//输入变量值  在scanf里面放逗号  是傻逼
pointer_1=&a; pointer_2=&b;//让指针分别指向两个变量
if (a<b) swap1(pointer_1,pointer_2);//调用交换算法1
printf("\n%d %d\n", a, b);

printf("\n方法2:请输入两个数(a<b)\n");
scanf("%d %d", &a, &b);//输入变量值  在scanf里面放逗号  是傻逼
if (a<b) swap2(a, b); //调用交换算法2
printf("\n%d %d\n", a, b);

printf("\n方法3:请输入两个数(a<b)\n");
scanf("%d %d", &a,&b);//输入变量值  在scanf里面放逗号  是傻逼
pointer_1=&a; pointer_2=&b;//让指针分别指向两个变量
if (a<b)  swap3(pointer_1,pointer_2); //调用交换算法2
printf("\n%d %d\n", a, b);

printf("\n方法3:请输入两个数(a<b)\n");
scanf("%d %d", &a, &b);//输入变量值  在scanf里面放逗号  是傻逼
if (a<b) swap4(a, b); //调用交换算法2
printf("\n%d %d\n", a, b);
return 0;
}

这里定义了四个交换函数,
第一个函数的形参是指针,对应的是实参的地址值,函数调用时将实参的地址值传递给形参指针,作为形参指针的值,使得形参指针指向实参地址对应的数据。函数通过间接访问方式,可以修改对应的值(注意交换时要交换两个恶形参指针指向的数据值,而不是地址值)。
第三个函数的形参也是指针,但结果是不能交换二者的值,因为函数swap交换的是形参的地址值(指针的指向),但没有进行a与b的交换。

第二个函数式运用引用作为函数的形参,引用是已存在变量的别名(alias),通过引用可以间接访问变量。可以改变变量的值(注意:引用和原变量是指向同一个内存地址的,系统不会为应用变量重新分配地址)

第四个函数就是采用传数据值的方式:调用swap时a和b的值拷贝给形参a和b,函数交换的是形参a和b的值而不会改变实参a和b的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值