0.在作为参数的作用中指针和引用的共同特点是都可以在函数中改变实参对象,标准 C 中是没有引用形参的,只能使用指针形参。
1.就函数参数传递数值而言,传递指针与传递引用唯一的优势是避免拷贝,同时带来实参被改变的风险,但是可以通过const来尽量避免。
2.就为改变实参这个目的而言,指针对于引用的优势在于当你有可能需要传入一个空的概念*(尚未创立的对象,空指针可以表示,而引用无法表示空的概念)的时候,指针还有一个优势是引用不利于理解代码。
比如问题:
(如void xchange1(int *n1,int *n2
))或引用形参(如void xchange2(int &n1,int &n2)
)。
在调用fun的地方,开发者马上能警觉pi所指内容可能在fun中改变,而看不出对ri的影响。有人可能会说使用const, 那也是在定义的地方,在调用的地方看不见,读代码的人总得多看一层。
3.就为改变实参这个目的而言,引用对于指针在于其存在是为了降低指针灵活性带来的风险,指针形参不仅可以将数据的引用传入函数,还可以在函数内改变这个指针,也就是说在函数内部可以改变调用域的变量(而不仅仅是对象)
4.相比起引用,指针有这些特点:
指针变量可以被重复赋值或更改(引用则不行,一经赋值不能再改)
指针变量可以为空(引用必须指向具体对象)
#include <iostream>
#include <cstdlib>
using namespace std;
void xchange1(int *n1,int *n2);
void xchange2(int &n1,int &n2);
int main(void)
{
int num1 = 9,num2 = 0;
cout<<num1<<' '<<num2<<endl;
xchange1(&num1,&num2);
cout<<num1<<' '<<num2<<endl;
xchange2(num1,num2);
cout<<num1<<' '<<num2<<endl;
system("pause");
return 0;
}
void xchange1(int *n1,int *n2)
{
auto temp = *n1;
*n1 = *n2;
*n2 =temp;
}
void xchange2(int &n1,int &n2)
{
auto temp = n1;
n1 = n2;
n2 = temp;
}