区别1:指针传递和引用传递是以不同的方式实现相同的效果,但是指针传递的本质还是值传递,只是传递的值是地址。
就拿 交换两个数的函数来举例:
// 指针传递 void swap(int * val1, int * val2) { int temp; temp = *val1; *val1 = *val2; *val2 = temp; } // 引用传递 void swap_numbers(int & val1,int & val2) { int temp; temp = val1; val1 = val2; val2 = temp; }
调用上面两个函数都可以实现 val1 和 val2 的值的交换。
int first = 1, second = 2; swap_numbers(first,second); // 传递引用,也就是别名 int a,b; swap(&a,&b); // 传递指针,也就是地址
但是,归根到底,指针是储存了值的地址的值,也还是实现了值传递。
而引用传递,传入的是变量名称,相当于在交换函数内部使用了外部变量的别名,操作的依然是变量本身。
区别2:指针传递相对于引用传递更灵活,也就更不受约束。
如果把引用传递类比为指针传递开辟了新的变量存储了别名的相关信息的话,那么,指针传递的地址的值是可变的,同时,该地址空间中存储的值也是可变的;而引用传递却是和别名是捆绑,不可再指向其他的地址空间的。
引用本质上就是一个 const 指针,但是两者有一定的差别,不能互换使用。
总之,引用传递作为 C++ 区别于 C 语言的一种特性,使得传参更为灵活,方便,还避免了指针使用易出错的情况。
详细的引用传递和指针传递的引用可以 参考博客: