简单理解下:
1.定义变量时
例如int* ptr = &var;
prt指针存的是变量内存地址;
例如int& ref = var;
ref引用是给var变量起外号,指向var相同的内存地址;
2.读取变量时
例如*ptr
,
是用*获取指针ptr指向内存地址里保存的变量值;
例如&var,
是用&获取普通变量var的内存地址;
3.作为函数参数时
例如void fun(int* a){int b = 0; *a = b;},函数内修改*a会影响函数外传入的参数变量值
例如void fun(int& a){int b = 0; a = b;},函数内修改a会影响函数外传入的参数变量值
4.代码测试
// 指针参数修改测试
void modify_ptr(int* a){
int b = 99;
*a = b;
}
// 引用参数修改测试
void modify_ref(int& a){
int b = 88;
a = b;
}
int main(int argc, char* argv[])
{
// 指针、引用
LOG(INFO) << "test */&:" << endl;
int var = 3000;
int* ptr = &var; // 定义一个指针,用&获取普通变量var的地址
int& ref = var; // 定义一个引用变量,指向var的地址(引用变量ref本身与var是一样的,指向了同一块内存地址,相当于起了个外号)
//int& ref = *ptr; //同上
int val = *ptr;// 定义一个变量,用*获取指针变量ptr的值
*ptr = 100; // 改变ptr指针指向的值,会导致var的值也被修改,但不会影响val。因为*ptr指向了var变量的地址,而val只是去了ptr的值而没有指针相连
cout << "Value of var :" << var << endl;
cout << "Value of &var :" << &var << endl;
cout << "Value of ptr :" << ptr << endl;
cout << "Value of *ptr :" << *ptr << endl;
cout << "Value of ref :" << ref << endl;
cout << "Value of &ref :" << &ref << endl;
cout << "Value of val :" << val << endl;
// 指针、引用参数
LOG(INFO) << "test func */& param:" << endl;
modify_ptr(&var);
cout << "Value of var :" << var << endl;
modify_ptr(ptr); //同上
cout << "Value of *ptr :" << *ptr << endl;
modify_ref(var);
cout << "Value of val :" << var << endl;
modify_ref(ref); //同上
cout << "Value of ref :" << ref << endl;
}
// 打印结果
I1228 21:51:50.451804 432086464 main.cc:294] test */&:
Value of var :100
Value of &var :0x7ffee3f1aa5c
Value of ptr :0x7ffee3f1aa5c
Value of *ptr :100
Value of ref :100
Value of &ref :0x7ffee3f1aa5c
Value of val :3000
I1228 21:51:50.451846 432086464 main.cc:310] test func */& param:
Value of var :99
Value of *ptr :99
Value of val :88
Value of ref :88
参考:https://blog.csdn.net/weixin_42878758/article/details/82865314