回答

收藏

C++中的指针变量和引用变量有什么区别?

技术问答 技术问答 283 人阅读 | 0 人回复 | 2023-09-12

我知道引用是语法糖,所以代码更容易读写。1 s: K- X9 G9 a9 J
但是指针变量和引用变量有什么区别呢?
( w8 T# B. e9 r" ?8 W                                                               
8 }4 L- D9 }# m: G) F% _: N5 h    解决方案:                                                               
0 x; n: \1 e# f5 R' u4 g; w+ k                                                                [ol]可重新分配指针:[/ol]cpp   int x = 5;   int y = 6;   int *p;   p = &x;   p = &y;   *p = 10;   assert(x == 5);  assert(y == 10);# o) X9 d' q- f: e1 \) n' u# ?; e
引用不能重新绑定,必须在初始化时绑定:4 x6 @$ n  N* o9 L/ H! M
cpp   int x = 5;   int y = 6;   int &q; // error   int &r = x;
! b; K2 \+ D, a2 i[ol]指针变量有自己的标志:一个独特的、可见的内存地址,可以用一元运算符获得,也可以用这个运算&一定量的空间用符测量sizeof。在参考中使用这些操作符将返回与参考绑定值相对应的值;参考自己的地址和大小是看不见的。由于参考以这种方式假设原始变量的身份,因此可以很容易地将参考视为同一变量的另一个名称。[/ol]```cpp. ]5 X3 i, H- v
            int x = 0;
9 |, z" m, W6 Y            int &r = x;. g! ~0 n. B3 u7 d6 S/ e7 L& }2 S
            int p = &x;
# `. ~! b. u6 @8 w8 J            int p2 = &r;
; s6 h0 Z/ O6 e, P5 S' \assert(p == p二、 / &x == &r
) O0 e/ s) {6 X9 S) T8 _* W7 }# i            assert(&p != &p2);" h8 ?2 c: |9 D+ D4 M* P
            ```& c  z$ S# }% d' u/ `/ z+ d# }
[ol]您可以指向任何嵌套指针,以提供额外的间接指针。引用只提供一级间接。[/ol]```cpp! t. u0 S0 p2 Y! N9 R
            int x = 0;3 }$ h3 _$ ]/ k  L/ J0 U
            int y = 0;
/ b- a/ f: [& T/ s, l/ T            int p = &x;
: ?  m1 F3 Y4 V, M1 p; C0 A            int q = &y;
) n, g# `8 v  ~8 [; ~0 B; [8 Q8 k            int **pp = &p;& d* I1 r, g5 {* i( s' d
pp = 2;
1 x' |4 p* Y7 D# H  J* F6 p, h            pp = &q; // *pp is now q( P3 R2 n6 g# k1 A& S0 W" ]' C' p
pp = 4;9 \3 u0 u* r" }- L( l6 K
assert(y == 4);0 w  S0 t- u: W+ i3 {
            assert(x == 2);
1 }, ]& J) U- v7 d  u            ```9 I7 [% d+ l4 f% T- R
[ol]指针可以分配nullptr,而引用必须绑定到现有对象。如果你足够努力,你可以绑定一个对 的引用nullptr,但这是未定义的,不一致。[/ol]```cpp
5 X) `: K; R8 H. |- U4 N  |! M            /    the code below is undefined; your compiler may optimise it1 o8 `3 L0 u7 ?1 X' ]0 O: E; I: H
                * differently,emit warnings,or outright refuse to compile it /
3 t9 X5 i3 |' \9 v: P' mint &r = *static_cast<i>(nullptr);
0 [; K, [3 S1 |, `- A: ~$ c; m// prints “null” under GCC 10
4 d" z: H/ \2 h( B. l& S            std::cout$ H) i8 e. v0 G+ L, P2 S% R# l* T( t
                           
7 P9 K7 J9 \+ H' r4 wbool f(int &r) { return &r != nullptr; }  r4 {2 g# d+ `. f
// prints “not null” under GCC 10) v+ n* P( b+ T+ K% E' Z/ O! ]- j
            std::cout8 W. T7 M. t1 p, X% V, f" {5 M
                            ; m9 N/ O- z/ L4 ]) z$ l
但是,你可以引用值为 的指针nullptr。8 Z' }' M0 |" \' q% {6 ?6 Z
[ol]指针可以遍历数组;可以用  转到指针指向的下一项, 4转到第 5 元素。这与指针指向的对象大小无关。
% U# Y  Y; H$ E; \" ^5 Y& E+ ^引用指针需要取消*可以直接访问其指向的内存位置。指向类/结构指针用于->访问其成员并引用使用..3 H& F' W! ]' T6 S: Q1 b
引用不能放入数组,但指针可以(用户@litb 提到)
# i1 T# A' s/ V常量引用可以绑定到临时对象。指针不能(不是没有间接性):5 h' H* B0 p& M7 e* G. V
[/ol]cpp   const int &x = int(12); / legal C     int *y = &int(12); / illegal to take the address of a temporary.' k5 I0 ?* w4 ~
这使得const &使用参数列表更方便。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则