栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

透彻理解:C/C++中参数传递:传值、传地址、传引用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

透彻理解:C/C++中参数传递:传值、传地址、传引用

再理解:C/C++中参数传递:传值、传地址 1.参数传递:传值(C/C++)

#include
void swap(int m,int n){
	printf("形参交换前m=%d n=%dn",m,n);
	int temp;
	temp=m;
	m=n;
	n=temp;
	printf("形参交换后m=%d n=%dn",m,n);
}
void main(){
	int a,b;
	printf("请输入a,b两个实参值:");
	scanf("%d %d",&a,&b);
	swap(a,b);
	printf("实参交换后a=%d b=%dn",a,b);
}

由以上结果表明,传值只传递实参的副本(即形参),函数只对形参进行操作,对实参无影响

注意:函数调用结束后,普通变量会被自动销毁,而指针不会被自动销毁,所以使用指针可以实现值的回传

2.参数传递:传地址(C/C++) 2.1 传递指针变量

正确示范操作:
以下操作通过传地址实现了实参值转换

#include
void swap(int *m, int *n){	//传入实参a,b的存储地址 
	printf("形参交换前:m=%d n=%dn",*m,*n);
	printf("形参交换前,m的存储地址:%d n的存储地址:%dn",&m,&n);
	int t;	//中间变量 
	t=*m;	//解引用m获得值,其实在交换指针存储的内容(即变量的存储地址) 
	*m=*n;	//所以实现了实参值的交换
	*n=t;
	printf("形参交换后:m=%d n=%dn",*m,*n);
	printf("形参交换后,m的存储地址:%d n的存储地址:%dn",&m,&n);
}

void main(){
	int a,b,*p1,*p2;
	printf("请输入两个实参值a,b:");
	scanf("%d %d",&a,&b);
	p1=&a,p2=&b;	//获取变量a,b地址
	printf("实参交换前,a的存储地址%d b的存储地址%dn",&a,&b);
	swap(p1,p2);
	printf("实参交换后a=%d b=%dn",a,b);
	printf("实参交换后,a的存储地址%d b的存储地址%dn",&a,&b);
}

以上操作本质上是交换了两个解引用的值

错误示范操作:
以下操作并没有通过传地址实现实参值转换

#include

void swap(float *m,float *n){
	printf("形参交换前,m=%f n=%fn",*m,*n);
	printf("形参交换前,m的存储地址:%X n的存储地址:%Xn",&m,&n);
	float *t;	//定义指针t
	t=m;	//只是在交换指针的存储地址,而并不是在交换指针的存储内容(即变量的存储地址) 
	m=n;	//所以无法实现实参值的交换
	n=t;
	printf("形参交换后,m=%f n=%fn",*m,*n);
	printf("形参交换后,m的存储地址:%X n的存储地址:%Xn",&m,&n);
}

void main(){
	float a,b,*p1,*p2;
	printf("请输入两个实参值a,b:");
	scanf("%f %f",&a,&b);
	p1=&a;
	p2=&b;
	printf("实参交换前,a的存储地址:%X b的存储地址:%Xn",&a,&b);
	swap(p1,p2);
	printf("实参交换后,a=%f b=%fn",a,b);
	printf("实参交换后,a的存储地址:%X b的存储地址:%Xn",&a,&b);
}

以上操作本质上是交换了指针的值
原来指针m指向a,现改为指向b
原来指针n指向b,现改为指向a
a,b值并没有进行交换

2.2 传递数组首地址(数组名)
#include 
#define N 10
int max(int a[]);
int main ( ) {
	int a[10];
	int i,m;
	for(i=0;i>a[i];
	m=max(a);	//传入数组首元素地址(数组名)
	std::cout<<"the max number is:"< 

3.参数传递:传引用(C++)


#include
void swap(float &m,float &n){
	float temp;
	temp=m;
	m=n;
	n=temp;
}
int main(){
	float a,b;
	std::cin >> a >> b;
	std::cout << a << b << std::endl;
	swap(a,b);
	std::cout << a << b << std::endl;
}

以上操作本质上是交换了引用值(即交换了原值),对引用的操作就是对被引用的操作


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312429.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号