一、引用和指针
1.关于值传递的几种方式可行性的讨论
1)编写函数直接进行值交换(不可行)
首先编写一个函数体现值交换的思想
void swap(int x, int y)
{
int z = 0;
z = x, x = y, y = z;
}
在主函数中定义两个值,调用swap 函数,观察能否实现值的互换
#include <iostream>
void swap(int x, int y)
{
int z = 0;
z = x, x = y, y = z;
}
int main()
{
int a = 12, b = 34;
std::cout << "Before calling swap function" << std::endl;
std::cout << "a=" << a << std::endl;
std::cout << "b=" << b << std::endl;
swap(a, b);
std::cout << "After calling swap function" << std::endl;
std::cout << "a=" << a << std::endl;
std::cout << "b=" << b << std::endl;
return 0;
}
值没有发生互换
a,b两个值是实参,而x,y两个是形参。在调用swap函数后,a,b分别赋值给了x,y这两个形参,但形参在swap函数里的运算并不能影响到主函数里a,b两个实参值。
2)编写函数以指针作为形参(可行)
#include <iostream>
void swap(int* x, int* y)
{
int z = 0;
z = *x, *x = *y, *y = z;
}
int main()
{
int a = 12, b = 34;
std::cout << "Before calling swap function" << std::endl;
std::cout << "a=" << a << std::endl;
std::cout << "b=" << b << std::endl;
swap(&a,& b);
std::cout << "After calling swap function" << std::endl;
std::cout << "a=" << a << std::endl;
std::cout << "b=" << b << std::endl;
return 0;
}
假设a的地址为0X0,b的地址为1X1,调用swap函数:
a,b的地址赋给了x,y,也就是说x,y分别指向a,b
z的值变为*x(x指向a,相当于z=a=12)
*x=*y说明,地址0X0上存放的值变成了y指向的值(即b=34),
*y=z说明,地址1X1上存放的值变成了12
3)利用引用reference进行传递 (可行)
#include <iostream>
void swap(int& x, int& y)
{
int z = 0;
z = x, x = y, y = z;
}
int main()
{
int a = 12, b = 34;
std::cout << "Before calling swap function" << std::endl;
std::cout << "a=" << a << std::endl;
std::cout << "b=" << b << std::endl;
swap(a, b);
std::cout << "After calling swap function" << std::endl;
std::cout << "a=" << a << std::endl;
std::cout << "b=" << b << std::endl;
return 0;
}
引用相当于被引用的别名,在swap函数中,&x=a,&y=b。
调用swap函数,&x和&y发生互换,相当于a,b发生互换,这种方式与第一种方式不同。