C++的指针*与引用&

简单理解下:

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

发表评论

邮箱地址不会被公开。