【C++】3-1.2 c++通过引用传参

【C++】3-1.2 c++通过引用传参

1.运行环境

操作系统:windows10
使用的IDE:visual studio comunity 2019
编译器标准:ISO C++17 标准 (std:c++17)

2.引用传参示例

# include <iostream>

int main()
{
    
    
	int x;
	int& rx{
    
    x};            //C++11中可以用这种窄化的方式初始化变量;引用变量rx在声明的同时就需要初始化,这里初始化为x的别名;
	auto a{
    
     5 }, b{
    
     10 };  //自动推导变量类型;
	
	void swap(int&, int&); //申明函数,告知编译器;
	rx = 77;
	std::cout <<"x="<< x << std::endl; //输出数字5
			
	std::cout << "Before: a=" << a << " ,b=" << b << std::endl;
	swap(a, b);                     //调用时只需传普通变量即可;
	std::cout << "After: a=" << a << " ,b=" << b << std::endl;
	
	return 0;
}

//定义一个引用传递的函数
// 函数用于交换值
void swap(int& x, int& y) {
    
    
	int  t;
	t = x;  x = y;  y = t;
}

运行如下图:
在这里插入图片描述
说明:
形参类型为引用,即变量的别名;
当传实参a,实参b,形参x,y分别为实参a,实参b的别名!
在swap函数内的对别名操作就是对原变量名操作,即对实参a,b操作!

3.其它传参

-3.1、通过值传参的示例

#include <iostream>
//pass by value
void swap(int x, int y) {
    
    
	int  t;
	t = x;  x = y;  y = t;
}
int main() {
    
    
	int a = 5, b{
    
     10 };
	std::cout << "Before: a=" << a << " ,b=" << b << std::endl;
	swap(a, b);
	std::cout << "After:  a=" << a << " ,b=" << b << std::endl;
	return 0;
}

运行如下:
在这里插入图片描述
可以看到:
swap函数内的局部变量并不能操作main函数内的局部变量;
分析:调用swap函数时,实参a,实参b分别拷贝给了形参x,形参y;

-3.2、通过指针传参的示例
对地址进行操作肯定是能够实现变量值的修改!

#include <iostream>

//pass by pointer
void swap(int* x, int* y) {
    
    
	int  t;
	t = *x;  *x = *y;  *y = t;
}
int main() {
    
    
	auto a{
    
     5 }, b{
    
     10 };
	std::cout << "Before: a=" << a << " b=" << b << std::endl;
	swap(&a, &b);
	std::cout << "After: a=" << a << "b=" << b << std::endl;
	return 0;
}

说明:
形参为指针类型;实参需要传递指针地址,即通过&取变量的地址;
实参a,实参b的地址分别对应&a、&b;在函数调用时,&a、&b分别传给形参x,y;
即形参x,形参y分别为指向变量a、变量b的地址!

在swap函数内,修改指针地址所指向的变量值,需要使用*符号,进行解引用操作!
对地址所在变量修改,即可实现main函数内的局部变量a,b值的修改!

4.总结

引用传递的函数:
调用时只需传普通变量即可;
在被调函数中改变引用变量的值,则改变的是实参的值(引用类型的形参就可以看成是实参变量本身);

猜你喜欢

转载自blog.csdn.net/jn10010537/article/details/115287568