在函数中修改一个值可以通过指针传值或者引用传址的方式传递
值传递
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的,参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
指针的值传递
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
对指针操作
函数定义
void PointerPinAndFunc_ExchangeLoc(int *p1,int *p2)
{
int *temp=p1;
p1=p2;
p2=temp;
}
函数调用
int a=1;
int b=2;
int *q1=&a;
int *q2=&b;
PointerPinAndFunc_ExchangeLoc(q1,q2);
上面示例中,p1、p2参数是指针变量,函数调用时会创建这两个指针对象,开辟新的空间,其地址与实参的空间地址并不相同,即他们是都是值传递的。所以指针p1、p2的交换并不会影响指针q1、q2。
由此可知,最终结果:
同理下面结果一样。
int a=1;
int b=2;
PointerPinAndFunc(&a,&b);
那我们想要交换值呢?我们如何对形参的指向进行操作?我们看一下下面的示例
对指针指向操作
void PointerPinAndFunc(int *p1,int *p2);
int main()
{
// OnlyPointPin();
// PointPinAndArray();
int a=1;
int b=2;
PointerPinAndFunc(&a,&b);
cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
system("pause");
return 0;
}
//note 指针和函数
void PointerPinAndFunc(int *p1,int *p2)
{
int temp=*p1;
*p1=*p2;
*p2=temp;
}
注意:大家容易把*p与p混淆,注意指针概念。C++语言入门-指针
如果写成这样,得出的结果是完全不一样的,我们的目的是对a与b的内存进行操作,需要用*p解引用来交换a、b的值,而不是交换指针变量的值(所指向的地址)。
错误示例:
void PointerPinAndFunc_ExchangeLoc(int *p1,int *p2);
int main()
{
// OnlyPointPin();
// PointPinAndArray();
int a=1;
int b=2;
PointerPinAndFunc_ExchangeLoc(&a,&b);
cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
system("pause");
return 0;
}
//note 交换指针地址
void PointerPinAndFunc_ExchangeLoc(int *p1,int *p2)
{
int *temp=p1;
p1=p2;
p2=temp;
}
除了指针值传递之外,我们还可以通过引用传址的方式,直接对原内存进行操作。
引用参数传址
引用参数传址的方式,实际上与指针*p的操作类似,都是对原内存进行操作。不过引用参数传址不需要指针。它直接通过传递地址来对内存操作,看下示例。
函数定义
//note 交换指针地址
void PointerPinAndFunc_ExchangeLoc_2(int &p1,int &p2)
{
int temp=p1;
p1=p2;
p2=temp;
}
函数调用
int a=1;
int b=2;
int *q1=&a;
int *q2=&b;
cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
cout<<"loc(a):"<<&a<<endl;
cout<<"loc(b):"<<&b<<endl;
PointerPinAndFunc_ExchangeLoc_2(a,b);
cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
cout<<"loc(a):"<<&a<<endl;
cout<<"loc(b):"<<&b<<endl;
cout<<"q1:"<<*q1<<endl;
cout<<"q2:"<<*q2<<endl;
其中p1,p2为引用参数,可以理解为是实参的别名,不进行值传递。函数调用时p1,p2会充当实参别名引用实参,仅只起引用作用。虽然也作为局部变量在栈中开辟了内存空间。其存放的地址就是实参的内存地址,对形参的任何操作都被处理成间接寻址。
在方法中,对p1、p2引用参数的操作就是对实参操作。
由此可知,最终结果为:
本文所有案例代码: