C++函数的值传递和地址传递的区别

一级目录

二级目录

三级目录

C++函数的值传递和地址传递的区别

前言:

对于c++早期学习中指针的学习与运用可谓是难点与重点,虽然概念比较简单(只是*p指向某一个地址,通过指针形参可以获取所指向地址的存储信息)但是就其的几种基本使用形式,如果不花大把功夫初学者很难理解。

1.函数的值传递定义

当函数的形参为基本类型变量、结构体类型变量、类类型变量时,函数的参数传递方式属于值传递,实参为相应的变量、常量、表达式等。值传递是一种单向传递,只能把实参传递到形参,对形参操作不会影响实参的值.

void fun1(int *x,int *y){
	int t;
	t=*x;*x=*y;*y=t;
	cout<<"*x="<<*x<<"*y="<<*y<<endl;
}

函数fun1就是值传递,在这里完全不必把它复杂化理解,x=y就是指针名称的交换。(此处可以用笔略做推导就十分清楚了)调用函数1输出的实参不变形参改变。值传递不会影响主函数实参的值。

函数的地址传递定义:

当函数的形参是某种类型的指针时,实参为相应的地址时,函数参数传递的是地址。传递方式是地址传递,地址传递时实参也可以是保存了某个地址的指针变量;既可以操作指针也可以操作指针所指向的内存空间。

void fun2(int *x,int *y){
	int *t;
	t=x;x=y;y=t;
	cout<<"*x="<<*x<<"*y="<<*y<<endl;
}

函数fun2就是地址传递,*x=*y是指针的转递(就是对指针所指向的内存空间进行交换或传递)调用函数2时输出结果形参和实参都发生了改变。

void fun3(int *x,int *y){
	int *t;
	t=x;x=y;y=t;
	cout<<"*x="<<*x<<"*y="<<*y<<endl;
}

2.2:对地址传递稍作改进fun3:其实使用起来与fun1几乎没有差别,但是fun1是指针名称交换指向不变,而fun3是指针指向改变而指针名称不变。二者调用输出结果一毛一样。但属于地址传递。
2.3:地址传递可能会改变主函数实参的值。

void fun4(int *x,int *y){
	int *t;
	t=*x;*x=*y;*y=t;
	cout<<"*x="<<*x<<"*y="<<*y<<endl;
}

2.3:注意fun4编译过程不会报错,但是不能完成传递,不可选用这个方式传递。
3函数的引用传递定义:函数的参数是引用传递时,形参为某种类型的变量引用,实参为相应的变量。根据引用的概念,引用传递时,形参是对实参的重新命名,形参和实参是同一内存空间的两个名称。
如fun5,在调用fun5时,将变量a,b重命名为x,y,现在a,x是同一个内存空间的名称,所以此时若a,b交换则x,y交换,x,y交换则a,b交换。

void fun5(int&x,int &y){
      int t;
      t=x;x=y;y=t;
      cout<<"x="<<x<<"y="<<y<<endl;
      }

在这里注意&x,&y,用的&是引用符合,不是取地址符合。并且引用传递中实参与形参必须是同类型的变量,不能是地址或常量或者其他类型的变量。引用传递会影响主函数的实参的值。

#include<iostream>
using namespace std;
void fun1(int *x,int *y){
	int t;
	t=*x;*x=*y;*y=t;
	cout<<"*x="<<*x<<"*y="<<*y<<endl;
}
void fun2(int *x,int *y){
	int *t;
	t=x;x=y;y=t;
	cout<<"*x="<<*x<<"*y="<<*y<<endl;
}
void fun3(int *x,int *y){
	int *t;
	t=x;x=y;y=t;
	cout<<"*x="<<*x<<"*y="<<*y<<endl;
}
void fun4(int *x,int *y){
	int *t;
	t=*x;*x=*y;*y=t;
	cout<<"*x="<<*x<<"*y="<<*y<<endl;
}
void fun5(int&x,int &y){
      int t;
      t=x;x=y;y=t;
      cout<<"x="<<x<<"y="<<y<<endl;
      }
int main(){
	int a,b;
	cout<<"please cin what you want to exchange:"<<endl; 
	cin>>a>>b;
	cout<<"old dates:"<<"a="<<a<<'\t'<<"b="<<b<<endl;
	cout<<"new dates1:";
	fun3(&a,&b);
	cout<<"new dates2:"<<"a="<<a<<"b="<<b<<endl;
	return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值