1 00:00:00,000 --> 00:00:00,320 2 00:00:00,320 --> 00:00:02,700 >> DAVID J. MALAN: Låt oss skriva ett program i som vi försöker byta värderingar 3 00:00:02,700 --> 00:00:04,970 två variabler, x och y. 4 00:00:04,970 --> 00:00:07,490 I förväg har jag skrivit mycket av detta program redan. 5 00:00:07,490 --> 00:00:11,130 Först, jag deklarerar en variabel, x, och lagra i det värdet, 1. 6 00:00:11,130 --> 00:00:14,120 Då ska jag deklarera variabel y och lagra i det värdet, 2. 7 00:00:14,120 --> 00:00:17,700 >> Då ska jag fortsätta med printf att visa värdena av dessa två variabler. 8 00:00:17,700 --> 00:00:21,090 Då jag hävdar med en annan printf att byta dessa variabler. 9 00:00:21,090 --> 00:00:23,690 Då kallar jag en funktion som kallas swap. 10 00:00:23,690 --> 00:00:26,100 Och så påstår jag att variablerna har bytts. 11 00:00:26,100 --> 00:00:30,610 Och då jag skriver ut att det jag påstår är de nya värdena för x och y. 12 00:00:30,610 --> 00:00:32,030 >> Nu vad är denna funktion swap? 13 00:00:32,030 --> 00:00:34,970 Det är inte något som kommer med C. Om vi ​​tittar på toppen av min 14 00:00:34,970 --> 00:00:38,850 fil, kommer du att märka att jag har förklarat en prototyp för denna funktion swap 15 00:00:38,850 --> 00:00:42,750 som anger att det tar två Ints, godtyckligt kallas a och b, och detta 16 00:00:42,750 --> 00:00:44,300 Funktionen returnerar inte någonting. 17 00:00:44,300 --> 00:00:48,370 Så förmodligen, det gör vad den säger i swappar A: s och B: s värderingar. 18 00:00:48,370 --> 00:00:50,170 Låt oss nu genomföra swap. 19 00:00:50,170 --> 00:00:53,820 >> Först kommer jag att förklara en tillfällig variabel och tilldela den 20 00:00:53,820 --> 00:00:57,260 värdet i en, men jag kunde bara som lätt lagras i det b.. 21 00:00:57,260 --> 00:01:00,925 Jag sedan kommer att ändra värdet en att vara lika stor som i b.. 22 00:01:00,925 --> 00:01:04,849 Och så slutligen, jag ska ändra värde på b för att vara vad en var, men är 23 00:01:04,849 --> 00:01:06,340 nu i temp. 24 00:01:06,340 --> 00:01:08,910 >> Nu påstår jag vad jag just har gjort är logiskt korrekt. 25 00:01:08,910 --> 00:01:12,780 Jag har sparat ett i en temporär variabel, bytte ett värde att vara B: s, och sedan 26 00:01:12,780 --> 00:01:15,580 bytte b värde att vara vad en var. 27 00:01:15,580 --> 00:01:18,620 Men när jag kompilera och köra detta program, är jag rädd att det inte 28 00:01:18,620 --> 00:01:20,140 går vad jag ser. 29 00:01:20,140 --> 00:01:21,625 >> Gör ingen swap. 30 00:01:21,625 --> 00:01:24,350 dot slash, ingen swap. 31 00:01:24,350 --> 00:01:27,560 Och tyvärr, enligt printf, värdet av x och y, även 32 00:01:27,560 --> 00:01:31,560 efter att vi påstår att byta dem, är fortfarande 1 och 2. 33 00:01:31,560 --> 00:01:32,630 >> Nu varför är det? 34 00:01:32,630 --> 00:01:36,160 Tja, visar det sig att i huvud, när vi kallar denna funktion swap, som går i 35 00:01:36,160 --> 00:01:39,960 x och y som argument, det är faktiskt kopior av x och y som 36 00:01:39,960 --> 00:01:41,310 förs in i swap. 37 00:01:41,310 --> 00:01:45,430 Nämligen deras värden 1 och 2 är passerat in swap som a och b. 38 00:01:45,430 --> 00:01:48,590 Och det är a och b som vi är i slutändan byta i main. 39 00:01:48,590 --> 00:01:50,810 >> Det vill säga, 1 blir 2, 2 blir 1. 40 00:01:50,810 --> 00:01:54,630 Men eftersom swap har inget returvärde och eftersom det fick kopior av x 41 00:01:54,630 --> 00:01:58,220 och y, är det beteende har ingen effekt på x och y. 42 00:01:58,220 --> 00:02:02,610 Faktum är a och b scoped, så att säga, att byta, medan x och y kvar 43 00:02:02,610 --> 00:02:03,990 scoped till huvud. 44 00:02:03,990 --> 00:02:05,070 >> Så vi har ett problem. 45 00:02:05,070 --> 00:02:06,320 Men hur man fixar det? 46 00:02:06,320 --> 00:02:08,312