最近写项目的过程里,碰到个传地址进入的小问题,虽然解决了,不是什么问题,但是想想自己最初学编程的时候对于指针这块的头大,就想着还是写个小demo记录一下,让刚刚学习编程的人可以明白传值和传地址是个怎么回事?
首先传值不用多说,就是是把实参的值赋值给行参,那么对行参的修改,不会影响实参的值,等于把实参的一份副本拷贝传了进去,对其操作都是在对这个副本拷贝进行的操作,因此说修改形参不会改变实参
在C语言里面还有一种就是传指针,都知道传指针的话,他其实传递的是地址,传完之后实参和行参都指向同一个对象,因此对于解引用之后都是指向同一块内存,对于解引用后形参的改变当然能去改变实参的值了。注意:传指针其实是一种特殊的传值方式,为什么?因为他传进去的也是一份副本拷贝,只不过这个拷贝是地址,因此可以通过操作地址去改版原实参内容。
写个小demo看看就懂了
void TT(int *p){
*p=10;
}
int main(){
int a=5;
int *ptr=&a;
TT(&a);//ptr指向的就是a的地址 等同于TT(ptr);
cout<<a<<endl;
TT(ptr);
cout<<a<<endl;
system("pause");
return 0;
}
成功修改实参值。
再写一份demo看看,p是否是ptr的拷贝
void TT(int *p){
*p=10;
cout<<"p: "<<p<<endl;
cout<<"&p: "<<&p<<endl;
int c=30;
p=&c;
cout<<"changed p: "<<p<<endl;
}
int main(){
int a=5;
int *ptr=&a;
TT(&a);//ptr指向的就是a的地址 等同于TT(ptr);
cout<<a<<endl;
cout<<"&a: "<<&a<<endl;
TT(ptr);
cout<<a<<endl;
cout<<"ptr: "<<ptr<<endl;
cout<<"&ptr: "<<&ptr<<endl;
system("pause");
return 0;
}
打印地址发现,p和ptr指向的都是a这块内存,但是p和ptr本身地址不同,且p最后修改了指向,p的指向地址改变而ptr不变,都能说明p是ptr的一份拷贝
C++引入了 引用,就此就有了传引用这一说
传引用 是真正的以地址的方式传递参数
传递以后,行参和实参都是同一个对象,只是他们名字不同而已
对行参的修改将影响实参的值
相当于实参是啥,形参是啥,减少了拷贝,一般来说都很推荐这么去传
void TT(int &p){
p=20;
cout<<"p: "<<p<<endl;
cout<<"&p: "<<&p<<endl;
cout<<"-------------------"<<endl;
}
int main(){
int a=5;
TT(a);
cout<<"a: "<<a<<endl;
cout<<"&a: "<<&a<<endl;
system("pause");
return 0;
}
结果显而易见