1 00:00:00,000 --> 00:00:00,320 2 00:00:00,320 --> 00:00:02,700 >> DAVID J. MALAN: Kirjoitetaan ohjelma joilla yritetään vaihtaa arvojen 3 00:00:02,700 --> 00:00:04,970 kaksi muuttujaa, x ja y. 4 00:00:04,970 --> 00:00:07,490 Etukäteen, olen kirjoittanut paljon tämän ohjelman jo. 5 00:00:07,490 --> 00:00:11,130 Ensinnäkin olen julistaa muuttuja, x, ja säilytä se arvo, 1. 6 00:00:11,130 --> 00:00:14,120 Sitten Julistan muuttuja y ja säilytä se arvo, 2. 7 00:00:14,120 --> 00:00:17,700 >> Sitten jatkan siitä printf näyttää arvoja näiden kahden muuttujan. 8 00:00:17,700 --> 00:00:21,090 Sitten Väitän toisen printf voidaan vaihtamalla niitä muuttujia. 9 00:00:21,090 --> 00:00:23,690 Soitan toiminto nimeltään swap. 10 00:00:23,690 --> 00:00:26,100 Ja sitten Väitän, että muuttujat ovat vaihtaneet paikkaa. 11 00:00:26,100 --> 00:00:30,610 Ja sitten tulostaa, että mitä Väitän ovat uudet arvot x ja y. 12 00:00:30,610 --> 00:00:32,030 >> Mitä nyt on tämä toiminto swap? 13 00:00:32,030 --> 00:00:34,970 Se ei ole jotain, joka tulee C. Todellakin, jos katsomme alkuun minun 14 00:00:34,970 --> 00:00:38,850 tiedoston, huomaat että olen julistanut prototyyppi tätä toimintoa swap 15 00:00:38,850 --> 00:00:42,750 täsmensi, että se kestää kaksi ints, mielivaltaisesti kutsutaan a ja b, ja tämä 16 00:00:42,750 --> 00:00:44,300 funktio ei palauta mitään. 17 00:00:44,300 --> 00:00:48,370 Joten oletettavasti se mitä se sanoo swapeihin: n ja B: n arvoja. 18 00:00:48,370 --> 00:00:50,170 Katsotaanpa nyt toteuttaa swap. 19 00:00:50,170 --> 00:00:53,820 >> Ensiksi aion julistaa väliaikainen muuttujan ja liittää siihen 20 00:00:53,820 --> 00:00:57,260 arvo, vaikka vain voisin kuten helposti tallentaa sen b. 21 00:00:57,260 --> 00:01:00,925 En sitten aio muuttaa arvoa of olla yhtä suuri kuin b. 22 00:01:00,925 --> 00:01:04,849 Ja sitten lopuksi, aion muuttaa arvo b olla mitä oli, mutta ei 23 00:01:04,849 --> 00:01:06,340 nyt temp. 24 00:01:06,340 --> 00:01:08,910 >> Nyt Väitän mitä olen juuri tehnyt on loogisesti oikein. 25 00:01:08,910 --> 00:01:12,780 Olen tallennetaan väliaikaiseen muuttujaan, muuttunut arvo on b: n, ja sitten 26 00:01:12,780 --> 00:01:15,580 muuttunut b: n arvo on mitä on ollut. 27 00:01:15,580 --> 00:01:18,620 Mutta kun kääntää ja ajaa tämän ohjelma, pelkään, että ei ole 28 00:01:18,620 --> 00:01:20,140 menossa mitä näen. 29 00:01:20,140 --> 00:01:21,625 >> Tee, ei swap. 30 00:01:21,625 --> 00:01:24,350 dot slash, ei swap. 31 00:01:24,350 --> 00:01:27,560 Ja valitettavasti, mukaan printf, arvo x ja y, jopa 32 00:01:27,560 --> 00:01:31,560 jälkeen väitämme vaihtava niitä, on edelleen 1 ja 2. 33 00:01:31,560 --> 00:01:32,630 >> Nyt miksi? 34 00:01:32,630 --> 00:01:36,160 No, käy ilmi, että main, kun me kutsua tätä toimintoa swap, ohimennen 35 00:01:36,160 --> 00:01:39,960 x ja y argumentteina, se on itse asiassa kopioita x ja y, että 36 00:01:39,960 --> 00:01:41,310 johdetaan swap. 37 00:01:41,310 --> 00:01:45,430 Nimittäin niiden arvot 1 ja 2 ovat johdetaan swap kuin a ja b. 38 00:01:45,430 --> 00:01:48,590 Ja se on a ja b, että olemme lopulta vaihtamalla pää. 39 00:01:48,590 --> 00:01:50,810 >> Toisin sanoen, 1 tulee 2, 2 tulee 1. 40 00:01:50,810 --> 00:01:54,630 Mutta koska swap ei ole paluuta arvoa ja koska se sai jäljennöksen x 41 00:01:54,630 --> 00:01:58,220 ja y, se käyttäytyminen on mitään vaikutusta x ja y. 42 00:01:58,220 --> 00:02:02,610 Todellakin, ja b scoped, niin sanotusti, vaihtaa, kun taas x ja y ovat edelleen 43 00:02:02,610 --> 00:02:03,990 scoped to main. 44 00:02:03,990 --> 00:02:05,070 >> Joten meillä on ongelma. 45 00:02:05,070 --> 00:02:06,320 Mutta miten se korjataan? 46 00:02:06,320 --> 00:02:08,312