回答

收藏

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

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

我知道引用是语法糖,所以代码更容易读写。) q, c! v0 u$ @) H% X
但是指针变量和引用变量有什么区别呢?: ~. X4 ^# Y9 p' |4 p
                                                                ' a1 j1 D- D* E9 v
    解决方案:                                                               
4 C0 D! ^6 S/ Y' e) C! M" {                                                                [ol]可重新分配指针:[/ol]cpp   int x = 5;   int y = 6;   int *p;   p = &x;   p = &y;   *p = 10;   assert(x == 5);  assert(y == 10);+ _0 d1 N0 i9 B7 r3 _+ J$ i: J
引用不能重新绑定,必须在初始化时绑定:
. b3 R0 l+ g7 \" Z1 Mcpp   int x = 5;   int y = 6;   int &q; // error   int &r = x;
5 _- L4 T8 m4 S, v[ol]指针变量有自己的标志:一个独特的、可见的内存地址,可以用一元运算符获得,也可以用这个运算&一定量的空间用符测量sizeof。在参考中使用这些操作符将返回与参考绑定值相对应的值;参考自己的地址和大小是看不见的。由于参考以这种方式假设原始变量的身份,因此可以很容易地将参考视为同一变量的另一个名称。[/ol]```cpp
, D  R& p" d! [1 B  Z% R0 o# o            int x = 0;( }& g# A6 D. g, B
            int &r = x;
0 F* c9 N; D4 C- w3 Q            int p = &x;
1 ~+ ~4 r+ A7 B0 R8 f6 V# s4 _1 v. j            int p2 = &r;4 J; P' N% N! H, c8 D6 p
assert(p == p二、 / &x == &r
! L! h9 o9 i7 \& w& H) G$ F) e+ }0 P8 G            assert(&p != &p2);
% P& W! l% m' u* Y            ```
4 ^7 E2 i* ?: z/ c$ j; L( |[ol]您可以指向任何嵌套指针,以提供额外的间接指针。引用只提供一级间接。[/ol]```cpp
3 ~+ ?8 x/ J3 L% O7 D) F            int x = 0;
0 T' }# U  y( X$ S            int y = 0;; `  R4 Y5 \& V( u
            int p = &x;
: A( }6 {$ |* M( l) n0 {# U" H  D            int q = &y;+ @7 Y" ]! F1 n) v% M1 B) c' ]6 W
            int **pp = &p;5 J; z, x" B5 U  r% U. s
pp = 2;
. T( P; ?+ v; J$ @            pp = &q; // *pp is now q
, z; |  z3 C8 [- a
pp = 4;
, J  B! I  G! Q) h1 \) X- P, Aassert(y == 4);
& z1 V" Z( b3 U1 h            assert(x == 2);, n4 W8 d, ~3 z3 `
            ```
7 L! @/ [' ?8 R[ol]指针可以分配nullptr,而引用必须绑定到现有对象。如果你足够努力,你可以绑定一个对 的引用nullptr,但这是未定义的,不一致。[/ol]```cpp
- w6 r6 p7 q2 q1 z9 Z3 {- v/ j            /    the code below is undefined; your compiler may optimise it2 ]; y) G4 C+ D) C+ a
                * differently,emit warnings,or outright refuse to compile it /, N. s! o2 {/ u3 C+ j8 t5 _
int &r = *static_cast<i>(nullptr);
7 l" q5 m; S6 \5 Y4 M* v  G// prints “null” under GCC 108 t' G' _! N4 _* i6 T' W
            std::cout
$ S$ \; S# q7 n  a( r" n* \                           
5 w: Q3 I& o3 c1 c6 v. cbool f(int &r) { return &r != nullptr; }5 h- H3 ?! Q  I8 Y$ o) E
// prints “not null” under GCC 10$ P  }$ ~. v3 Z
            std::cout( ~: U. o4 g' V# g
                           
+ c$ D0 ?* B# i但是,你可以引用值为 的指针nullptr。
$ U+ z. h% S  _, R[ol]指针可以遍历数组;可以用  转到指针指向的下一项, 4转到第 5 元素。这与指针指向的对象大小无关。2 i% j) h- _6 {9 |
引用指针需要取消*可以直接访问其指向的内存位置。指向类/结构指针用于->访问其成员并引用使用..3 f) K0 P8 ]  G# E! A' e
引用不能放入数组,但指针可以(用户@litb 提到)1 e* C6 L2 I" m+ }: n
常量引用可以绑定到临时对象。指针不能(不是没有间接性):
$ J! u2 N8 g/ \! Z, i[/ol]cpp   const int &x = int(12); / legal C     int *y = &int(12); / illegal to take the address of a temporary.8 [$ e# M5 J& j' H8 }
这使得const &使用参数列表更方便。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则