C++的传值、传引用、传指针

有时候我们在编写函数时,常常会为一个现象感到费解。比如,编写一个交换a和b的值的函数,函数体里面确实是把a和b的值交换了,但是执行完毕之后,输出a和b的值,却发现依然是原来的值。

传值:

#include<iostream>
using namespace std;

void swap(int a,int b) {
	int t = a;
	a = b;
	b = t;
}

int main() {
	int a = 1;
	int b = 2;
	swap(a,b);
	cout << "a = "<< a << " b = " << b << endl;
}

输出结果:

这里的swap实际上已经做了a和b的交换,为什么函数退出之后,又恢复了原来的值呢?这就是传值与传引用的区别。这种方式在传参形式上属于传值的形式,如果是传值,那么在函数传参的时候,实际上函数体本身对传进来的参数进行了复制,在函数体中,参与交换的并不是变量a和b本身,而是它们的一个副本(可能名称相同,但是地址不一样),所以,自然,无论对这个副本进行何种操作,都不能影响到原来的参数a和b。

传引用:

如果将函数改成如下形式:

void swap(int &a,int &b) {
	int t = a;
	a = b;
	b = t;
}

此时,&a和&b就是原来的变量a和b的一个引用。引用类型是C++特有的。实际上就是把a和b(地址和原来相同,是同一个变量)传了进来。函数的输出结果为:

一定要注意一下,这里的&并不是取址,因此,在调用函数传参是,参数并不是地址。

传指针:

此外,还有另外一种交换a和b值的方法,那就是指针传递,这是,对形参(指针)的操作,实际上相当于对实参的操作。比如以下代码:

void swap_point(int* a,int* b) {
	int* t = a;
	a = b;
	b = t;
}

输出结果:

 此外,对于数组也是一样,如果希望执行完之后改变数组本身的值,那么应该在传参数的时候,传入数组的头指针。

传指针与传引用的相同点与区别:

★相同点:

●都是地址的概念;

指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

★不同点:

●指针是一个实体,而引用仅是个别名;

●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;

●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有     的,  前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)

●引用不能为空,指针可以为空;

●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;

●指针和引用的自增(++)运算意义不一样;

●引用是类型安全的,而指针不是 (引用比指针多了类型检查)

猜你喜欢

转载自blog.csdn.net/Bubbler_726/article/details/83141887