>> DAVID J. MALAN: Kirjoitetaan ohjelma joilla yritetään vaihtaa arvojen
kaksi muuttujaa, x ja y.
Etukäteen, olen kirjoittanut paljon tämän ohjelman jo.
Ensinnäkin olen julistaa muuttuja, x, ja säilytä se arvo, 1.
Sitten Julistan muuttuja y ja säilytä se arvo, 2.
>> Sitten jatkan siitä printf näyttää arvoja näiden kahden muuttujan.
Sitten Väitän toisen printf voidaan vaihtamalla niitä muuttujia.
Soitan toiminto nimeltään swap.
Ja sitten Väitän, että muuttujat ovat vaihtaneet paikkaa.
Ja sitten tulostaa, että mitä Väitän ovat uudet arvot x ja y.
>> Mitä nyt on tämä toiminto swap?
Se ei ole jotain, joka tulee C. Todellakin, jos katsomme alkuun minun
tiedoston, huomaat että olen julistanut prototyyppi tätä toimintoa swap
täsmensi, että se kestää kaksi ints, mielivaltaisesti kutsutaan a ja b, ja tämä
funktio ei palauta mitään.
Joten oletettavasti se mitä se sanoo swapeihin: n ja B: n arvoja.
Katsotaanpa nyt toteuttaa swap.
>> Ensiksi aion julistaa väliaikainen muuttujan ja liittää siihen
arvo, vaikka vain voisin kuten helposti tallentaa sen b.
En sitten aio muuttaa arvoa of olla yhtä suuri kuin b.
Ja sitten lopuksi, aion muuttaa arvo b olla mitä oli, mutta ei
nyt temp.
>> Nyt Väitän mitä olen juuri tehnyt on loogisesti oikein.
Olen tallennetaan väliaikaiseen muuttujaan, muuttunut arvo on b: n, ja sitten
muuttunut b: n arvo on mitä on ollut.
Mutta kun kääntää ja ajaa tämän ohjelma, pelkään, että ei ole
menossa mitä näen.
>> Tee, ei swap.
dot slash, ei swap.
Ja valitettavasti, mukaan printf, arvo x ja y, jopa
jälkeen väitämme vaihtava niitä, on edelleen 1 ja 2.
>> Nyt miksi?
No, käy ilmi, että main, kun me kutsua tätä toimintoa swap, ohimennen
x ja y argumentteina, se on itse asiassa kopioita x ja y, että
johdetaan swap.
Nimittäin niiden arvot 1 ja 2 ovat johdetaan swap kuin a ja b.
Ja se on a ja b, että olemme lopulta vaihtamalla pää.
>> Toisin sanoen, 1 tulee 2, 2 tulee 1.
Mutta koska swap ei ole paluuta arvoa ja koska se sai jäljennöksen x
ja y, se käyttäytyminen on mitään vaikutusta x ja y.
Todellakin, ja b scoped, niin sanotusti, vaihtaa, kun taas x ja y ovat edelleen
scoped to main.
>> Joten meillä on ongelma.
Mutta miten se korjataan?