我知道引用是语法糖,所以代码更容易读写。
但是指针变量和引用变量有什么区别呢?
cpp int x = 5; int y = 6; int *p; p = &x; p = &y; *p = 10; assert(x == 5); assert(y == 10);
引用不能重新绑定,必须在初始化时绑定:
cpp int x = 5; int y = 6; int &q; // error int &r = x;
&
sizeof
```cpp int x = 0; int &r = x; int p = &x; int p2 = &r;
assert(p == p2); // &x == &r assert(&p != &p2); ```
```cpp int x = 0; int y = 0; int p = &x; int q = &y; int **pp = &p;
pp = 2; pp = &q; // *pp is now q pp = 4;
assert(y == 4); assert(x == 2); ```
nullptr
```cpp / the code below is undefined; your compiler may optimise it * differently, emit warnings, or outright refuse to compile it /
int &r = *static_cast(nullptr);
// prints “null” under GCC 10 std::cout << (&r != nullptr ? “not null” : “null”) << std::endl;
bool f(int &r) { return &r != nullptr; }
// prints “not null” under GCC 10 std::cout << (f(*static_cast(nullptr)) ? “not null” : “null”) << std::endl; ```
但是,您可以引用值为 的指针nullptr。
指针可以遍历数组;您可以使用++转到指针指向的下一项,并+ 4转到第 5 个元素。这与指针指向的对象大小无关。
++
+ 4
需要取消引用指针*才能访问它指向的内存位置,而可以直接使用引用。指向类/结构的指针用于->访问其成员,而引用使用..
*
->
.
引用不能放入数组,而指针可以(用户@litb 提到)
常量引用可以绑定到临时对象。指针不能(不是没有一些间接性):
cpp const int &x = int(12); // legal C++ int *y = &int(12); // illegal to take the address of a temporary.
这使得const &在参数列表等中使用更方便。
const &