ListNode* newhead = (ListNode*)malloc(sizeof(ListNode));
1 F9 l" y c7 N* P8 m+ C
newhead->val = x;
9 @- J. y- M1 R% w' e( I1 I
newhead->next = NULL;
' ~/ R/ T0 i( o' p j/ {% x
if (phead == NULL)
{
phead = newhead;
}
+ _. l1 Z* [7 a
else
{
ListNode* Tail = phead;
% K# J9 X" o1 H* ~9 V
while (Tail->next)
{
, ]$ ?. v+ {8 \+ W2 H: o
Tail = Tail->next;
}
9 L8 h$ j# j/ l3 ~, w
Tail->next = newhead;
i& P3 n; c; v
}
8 Z4 [$ v6 U& Y7 u& V7 i
}
# u# _! P/ k+ D- V1 X6 l: d0 d
int main()
{
ListNode* head = NULL;
ListPushBank(head, 100);
ListPushBank(head, 200);
return 0;
}
复制代码
8 F. s5 y' S0 l. O1 }. P- Z0 j
2引用特征 # X6 w+ r7 W* Q, z* C a" N
引用有一些很重要的特征需要我们注意6 ~! f. N7 s) {1 x* i
1 `5 o$ M# O# L" T. G
1.引用在定义时必须初始化 " K$ v9 @3 i6 K5 i- J( a& N" L: @8 b% e6 X( X' y$ V8 W- v3 T+ [
& x, S) W, g2 @/ o7 B" I9 D+ b
这里不难可能出语法直接时报错的。3 P# p/ V5 N0 o7 S. _
, C6 ~$ U3 Y' O- ^
2.一个变量可以有多个引用 & ~" K0 V5 @ r: x' y/ M4 j
nt main()
{
int a = 10;
% C: F; `4 k1 V0 ]
int& ra = a;
int& rb = a;
! z0 j6 N) V% |5 l
int& rc = a;
printf("ra=%d,rb=%d,rc=%d\n",ra,rb,rc);
return 0;
9 G2 h/ a% Z# P! S# ?( D. R
}
复制代码
+ e7 I$ o: K1 _9 F6 M# @' J" M) \& A
& G+ {* J( S3 t6 Q 4 w- U8 c7 Z) d2 [; X( Y
一个变量可以有多个引用并且多个引用都共用一个地址空间。 $ m: r$ [: \: M! \ ( H# b+ l1 O U" p V5 h. X 4 X* B% V7 m7 M v 3.引用一旦引用一个实体再不能引用其他实体 , X* b8 c' Z. i
[b] 变量是只可读的变量的引用对象也只能是可读的这也就是变量权限平移.[/b]
/ P. v: t$ V' M1 M! l) r- `) y
7 q3 Q. a4 [+ F' b' ]- S$ Z
[/b]
上述的结论不仅针对引用对指针也是有着同样的效果
2 t0 a+ \) O8 V: m5 Q3 }
: F& u" }, l3 T5 f9 C* O( ~7 m, d
[img]/14583405934f4946b983152b595a9570.png[/img]
, i$ |$ i. h' c/ F$ w1 K
: Z# e& y L# M- z) X0 I) A
[b] 场景二[/b]
+ }$ T/ j) O) F# K7 n/ p
9 K2 Z+ Z/ I: a, Y* B t
[img]/8ad30a1367dd4a9785bc0596212141ec.png[/img]
1 u' o7 j. w, O! {9 R4 w
[b]
[ol][*]这里的报错大家是不是认为是类型的原因导致的但是往后看加上一个const就没有报错了而且仍然是int类型的引用。[*][b]首先来了解类型转的原理类型转换是有一个中间变量的而引用的对象的就是那个临时变量因为临时变量具有常属性所以加上一个 const 就可以消除报错。[/b][/ol]
: I. \" G2 j2 f) K. S
[/b]
6 H0 i: M$ V4 @
4 使用场景[/size]
1.做参数
3 |0 p! U4 C! Z
我们之前使用指针实现函数来交换两个变量的值
X( s: ^# _, k$ t: l: J3 c
[code]void Swap(int* pleft, int* pright)
{
int tmp = *pleft;
*pleft = *pright;
; d% n* {& p% j5 P7 S K
*pright = tmp;
; f H/ B: A% S
}
复制代码
; i3 X( y' c( v, }: n' Z 原理我就不多解释了想必大家都已经熟记于心了今天我们用引用也可以实现 : O3 W$ I& j5 C. O/ I F) g4 B. l 7 U- ?" S0 A) G( W1 @% ]8 ?: k[code]void Swap(int& left, int& right) 9 I/ ~1 U* l3 X9 X3 f( J0 L W. ^{& i. Q2 ], N* r r
int temp = left;7 f3 V5 _1 C8 ^ Q# K
left = right; 2 p" O8 L. m$ p; f right = temp;+ h. k" O& f$ y$ P, ]' \
}( U# l( ^" ]1 v5 N) G
int main()! G" C; D% q4 F" b
{" G) o8 y* ?, `' E
int a = 10; int b = 20;, ?0 X0 S" p: t( X9 x
std::cout , g8 n* ~! V8 a6 L5 G, A* m4 r' A0 z
; x1 j" ], e8 n t
2.作为返回值 , r9 u0 x9 s/ q- k1 A* v[code]int& add(int a, int b)1 a* k# T' k& }6 t9 k6 V) i8 O
{ : I! G4 ^6 {8 w. O; u* G int sum = a + b;+ t$ v" R% c: s
return sum;; Z4 e7 x! a) M" V. i& U
}8 i" J# ]9 {* H, A5 H. e r
int main() ) a6 d# \5 g# q+ T& K+ I% w) Z{8 H! ~! e4 E* \$ D/ u0 m5 a
int& ret = add(1, 2);$ f& S- e3 G' ^; Z9 l! j/ ?( p7 W9 T
std::cout $ |; o; z* x" r u* ?2 S Q7 |" |8 P
. g- s. c, y+ ?9 C% N 问题来了我们只对ret进行了一次赋值但是两次输出却是两个值。这又是为什么呢 % E7 Y/ ~# h6 ^. r0 y ' n' u5 B, B# M% b C4 K* B/ M4 }* j% ]