引用传递和指针传递都是对地址进行的操作。
引用传递
相当于给实参起了个别名,引用的任何操作都是在原始地址中进行的,所以如果对引用的形参进行了更改,实参也会跟着变化。
(附:在引用传递时,被调形参虽然在堆栈中开辟了新的内存空间,但是存放的却是实参变量的地址,所以调用函数对形参做任何操作,都会对实参有影响。)
简单而言之,就是你(代表原始地址)有个糖(代表地址),引用(假设是个人)硬给你抢过来了,然后你就没了,引用拥有了一个糖,而这个糖原本是你的。
指针传递
指针的传递方式是值传递,它传递的是地址值,地址值传递过程,是被当作函数的局部变量进行处理,即在堆栈中开辟了内存空间,存放的是实参的地址值,相当于给实参存了个副本。
所以当我们对副本进行任何操作,都不会改变实参的值。
个人觉得理解原理了,写代码用哪种方式都不是大问题了,比如说,源数据重要的就用指针传递,原数据不重要的就随意了,喜欢哪种就用那种啦~
身为程序员,写的文章没有几行代码,心里有点不太舒服,所以就简单的写两个例子
引用传递
#include <iostream>
using namespace std;
void swap(int&, int &);
int main()
{
int a = 1, b = 2;
cout << "Before swapping"<< endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
swap (a, b); // 调用函数
cout << "\nAfter swapping" << endl;
cout << "a = " << a << endl;
cout << "b = "<< b << endl;
return 0;
}
void swap(int& n1, int& n2)
{
int temp;
temp = n1;
n1 = n2;
n2 = temp;
}
输出结果:
Before swapping
a = 1
b = 2
After swapping
a = 2
b = 1
指针传递
#include <iostream>
using namespace std;
void swap(int *, int *);
int main()
{
int a = 1,b = 2;
cout << "Before swappong" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
swap(&a, &b); // 调用函数
cout << "\nAfter swapping" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
// 参数是指针
void swap(int *n1, int *n2)
{
int temp;
temp = *n1;
*n1 = *n2;
*n2 = temp;
}
输出结果:
Before swapping
a = 1
b = 2
After swapping
a = 2
b = 1
哈哈,这一个星期收获颇多,在自学C++,这两天在学习指针的部分,看到引用传递和指针传递,觉得很有意思,便搜了很对相关文档看,有的文章写了很多,但我看了还是不明白什么是引用传递什么是指针传递,不过在我不妥协的坚持下,用了一上午去理解了,然后总结为了几句简单的话,若有理解不到位的请多多指教~