先上代码吧:
#include <iostream>
using namespace std;
struct User{
int age;
};
void test(User u){
//值传递,u只是一个实参的拷贝对象,对u的操作和实参没有关系
u.age = 20;
cout << "test(user) user=" << &u << endl;
}
void testPointer(User *pu){
//值传递,和Java类似,传递的值是实参地址的拷贝,让pu重新指向新地址对实参没有影响
cout << "testPointer(user) user=" << pu ;
User user;
user.age = 20;
pu = &user;
cout << " pu=" << pu;
}
void testRefrence(User &ru){
//引用传递,ru是传入实参的别名,可以理解为传入的就是实参,对ru的所有操作都会反映到实参
cout << "testRefrence(user) user=" << &ru;
User user;
user.age = 20;
ru = user;//等于在对象间赋值相当于JAVA中的克隆
}
void main(){
User user, *p_user;
user.age = 10;
cout << "user=" << &user << " ";
test(user);
testPointer(&user);
cout << " user=" << &user << " " << endl;
testRefrence(user);
cout << " user=" << &user << " user.age=" << user.age << endl;
}
输入结果:
user=002BFBAC test(user) user=002BFACC
testPointer(user) user=002BFBAC pu=002BFAB8 user=002BFBAC
testRefrence(user) user=002BFBAC user=002BFBAC user.age=20
C++的引用操作符为&,使用方式如下:
int a=0;
int &b = a;
如上所示,b即为a的引用,简单说来就是a的别名,两者在内存中占用同样的位置,不会为b开辟新的内存空间,对b的操作即为对a的操作。关于引用有如下三个规则:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
那什么时候用引用,什么时候用指针呢?
指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。