C/C++知识点

1、指针与引用的区别

  • 指针是一个变量,该变量存储的是一个地址;引用是原变量的别名,等同于对原变量操作
  • 指针可以是空值;引用必不是空值
  • 指针可以在任何时候赋值;引用只能且必须在初始化时赋值
  • &出现在初始化时(等号的左边)、函数的声明和定义中时,即为引用,可避免产生临时对象
  • &出现在等号的右边时,即为取址,不可修改赋值

引用 正确/错误代码

int a;
int &b = a;
int &c = b;
int &d = b;
d = 1;
cout << a << " " << b << " " << c << " " << d << endl;
const int &e = 1;
// Success

int &f;
// E0252 “引用变量‘f’需要初始值设定项”:不能只声明引用不设定初始值

int &g = 1;
// E0461 “非常量引用的初始值必须为左值” :常数显然不能作为左值

int h = 2;
&a = h;
&b = h;
// E0137 “表达式必须是可修改的左值”:&带参数代表取址,显然不能作为可修改的左值

关于传值、传引用、传指针

  • 传值是最简单明了的。优点是新生成了临时对象,不会对原有对象造成干扰,相对的缺点则是无法对原对象进行修改(如果返回后赋值就不如直接引用)
  • 传引用和传值是相对的。优点是直接对原有对象进行操作,相对的缺点就是不会生成新的对象,原有对象被改变了就无法回退(要想保留原来的对象就必须使用值传递)
  • 传指针则兼顾上述两者。优点是既可以对原有的对象直接进行操作,又可以生成新的对象,缺点是虽然可以生成新的对象,但是相较于值传递分配的对象空间需要手动释放,容易因为代码问题造成内存泄漏。

ps:虽然指针看起很好用,但是在没有对应需求(对原对象进行操作、生成新的对象进行操作)时,传值和传引用显然更加简洁,所以并没有那种方式就一定最好,一切都应该看需求来定,有得必有失,存在即合理

2、左值与右值

不可作为左值即为只能作为右值;
常见的不可作为左值:1、&a

你可能感兴趣的:(C/C++知识点)