[Powered by Google Translate] [Viikko 4, jatkuu] [David J. Malan - Harvardin yliopisto] [Tämä on CS50. - CS50.TV] Tämä on CS50, ja tämä on loppuun viikon 4. Joten hyviä uutisia ja huonoja uutisia. Ei luento maanantaina, no problem asettaa ensi viikolla. [Opiskelijat hurraavat] Et tule pitämään mihin tämä on menossa. Mutta meillä on tämä sen sijaan ensi keskiviikkona, ja siellä on myös kohti oppimäärän 1 Perjantaina luento ensi perjantaina, jotta voimme pysyä tiellä. Mutta kaikki on kuvattu tavalliseen tapaan, joten ei hätää. Ja ottaa huomioon tietovisa 0 teemme näin kohti viikon loppua on lähettää kurssin kotisivulla cs50.net selitys millaisen odotuksia sinulla pitäisi olla, kun se tulee ensimmäiseen Quiz. Yleensä se on monivalinta, tosi-epätosi, lyhyt vastaus, lyhyt koodaus ongelmia. Et aio odotettavissa toteuttamaan vastaavia ongelma, että sinulla olisi nähdä PSET, joihin sinulla on tietokone ja debuggeri ja vastaavat, mutta tulee olemaan pieni koodaus ongelmia. Ja todellakin, paras opas saada tunteen siitä, mitä CS50 tietokilpailuja ovat kuin on mennä cs50.net, siirry Tietokilpailut linkin, ja näet aiemmin useita vuosia arvoinen tietokilpailuja. Vain ymmärtää, että opetussuunnitelma ei ole aina ollut sama vuosien. Joskus lisäämme, joskus vähentää, joten jos näet joitakin aiheeseen yksi niistä vanhan tietokilpailuja että sinulla ei ole aavistustakaan, mitä se puhuu, se on joko että emme peitä se tai että emme peitä sitä. Mutta muodossa arvion, sunnuntaina, maanantaina ja tiistaina sekä kurssin laajuinen katsaus istunnossaan sunnuntai-iltana - aika ja paikka ilmoitetaan kurssin kotisivulla - teillä kaikilla on mahdollisuus kerrata kurssin opetuksen kaverit materiaalia tänä vuonna, niin osassa ja koko luokka, ja ne tullaan filmattu normaalisti samoin. Selvä. Joten pitemmittä puheitta, yhden kommentin hyväksytty / hylätty ja lisää / pudota. Olet ehkä nähnyt muistiinpanoja viime yönä, ja tämä on oikeastaan ​​vain joitakin ylimääräisiä rauhoittaa että jos olet yksi niistä, erityisesti vähemmän mukavaa tai jotakin siltä väliltä ja et tunne vain hieman yli pään, ymmärtää, että on todellakin aivan normaalia, ja siellä on runsaasti tukirakenne paikallaan, joista yksi virka oli aikomus parantaa sitäkin kohden sähköpostiini viime yönä, ja ymmärtää myös, että vaihtoehto kuin hyväksytty / hylätty ja luokkaan näin todella on tarkoitus olla mekanismi ottaa reunaan pois tietenkin näin, joten uudelleen, jos olet menoja nuo 10, 15, 20 tuntia vain yrittää saada joitakin PSET töihin ja tiedät 90-95% miten siellä mutta et löydä joitakin pirun bug, on hyväksytty / hylätty malli on eräänlainen kunnossa. Ajatuksena on, että tämä mekanismi voi sitten mennä keskittyä teidän muiden psets tai nukkua tai mitä se on, että haluat keskittyä. Joten ymmärtää, että sinulla on vasta ensi tiistaina - teknisesti 5. maanantaina mutta se on loma, joten tuleva tiistai - siirtyä hyväksytty / hylätty ja lajitellut tai päinvastoin. Ja jos olet todella jyrkänteeltä ja ajatellut pudottamalla kokonaan, ota minut kiinni jälkeen luennon tai pudota minulle huomautuksen. Haluaisimme ainakin chat ennen tarjouksen hyvästi. Selvä. Niinpä aloimme ottaa apupyörät pois viime kerralla. Erityisesti olemme keskittyneet merkkijono. String on jotain, joka on ilmoitettu CS50 kirjastossa, nimenomaan kyseisen tiedoston nimeltä cs50.h jonka aloitamme tarkastella tällä ja ensi viikolla. Mutta merkkijono on oikeastaan ​​vain yksinkertaistamista jotain se hieman arcanely kuvattu char *. Char olemme tuttuja. Se on vain yksi merkki. Mutta * kuin maanantaina merkitään mitä? >> [Opiskelija] osoitin. Osoitin. Ja mikä osoitin? >> [Opiskelija] osoite. Se on kuin osoite, paikkaan muistissa. Mikä osoite tai sijainti tai muisti? Jälleen meillä kaikilla on läppäreissä keikka tai 2 gigatavua RAM todennäköisesti näinä päivinä, ja se tarkoittaa olet miljardi tai 2000000000 tavua edestä muistia. Ja se ei ole oikeastaan ​​väliä, mitä se fyysisesti näyttää, mutta ottavat uskon että voit numeroida kaikki yksittäiset tavut että oma kannettava tietokone on - tämä on tavu 0, tämä on tavu 1, tämä on tavu 2000000000 - ja se mitä tietokone tekee. Kun varata tilaa yksittäisen merkin, esimerkiksi se kuitenkin elää jonnekin tietokoneen muistiin, ja ehkä se tavun numero 12345, ja se on jossain täällä tietokoneen muistiin. Ja osoite sitten tuon merkin on 12345. Nyt viikolla 0 kautta nyt toistaiseksi, emme ole oikeastaan ​​välittänyt jos muistissa asiat tallennetaan koska me yleensä käyttää symboleja, muuttujia, ja taulukot todella saada meidän tietoja. Mutta maanantaina ja sitäkin tänään, olet nyt menossa on sitäkin ilmeikäs voimavarojen kirjoittaa ohjelmia todella manipuloida tietokoneen muistiin kuitenkin parhaaksi näet, sekä hyvään tarkoitukseen, ja huonoja, Bugs on hyvin yleinen tulos tässä vaiheessa oppimiseen tätä kamaa. Mutta mitä se oikeastaan ​​tarkoittaa olla char *? Mennään eteenpäin takaisin - ja tulemme takaisin Binky kuten luvattiin tänään. Mennään yksinkertainen esimerkki tästä. Saanen tallenna tiedosto compare.c, ja haluan vain saada mallin koodia tässä niin ovat stdio.h, haluan myös antaa itselleni kuuluu cs50.h. Minä zoomata sinne. Haluaisin aloittaa kirjoittaminen tärkein int, main (void), ja nyt haluan tehdä jotain tällaista: printf ("Anna minulle merkkijono:") ja sitten aion käyttää string s saa GetString saada merkkijonon käyttäjä, niin aion kysyä käyttäjältä toiselle. ("Anna minulle toinen merkkijono:") ja aion pyytää heitä kautta GetString saada se. Soitan sitä t, koska t tulee jälkeen s ja s on kiva nimi merkkijono, jos se on melko yleinen. Joten GetString, ja nyt haluan vain tehdä järki tarkistaa, ja aion sanoa if (s == t) niin olen juuri menossa kertoa käyttäjälle printf ("Kirjoitit saman asian! \ n"); muuten aion tulostaa jotain ("kirjoitit jotain erilaista! \ n") tai mikä lause tulee. Eli jotain. Sitten kuten tavallista, palaan 0 mikä vain tarkoitti, että mitään pahaa ei tapahtunut, ja aion mennä eteenpäin ja kääntää ja ajaa ohjelman. Mutta maanantaina meillä oli tässä ohjelmassa, ja todellakin kerrottiin, että HELLO ole Hei ja näkemiin ei hyvästi. Käyttäytyminen näimme oli hieman enemmän kuin tämän. Anna minun mennä minun lähde hakemistoon, zoom täällä, ja tehkäämme tee vertailla. Käännetty kunnossa. Saanen juosta vertailla. Anna merkkijono: HELLO. Anna minulle toinen merkkijono: HELLO. Kirjoitit jotain erilaista! No, minäpä kokeilla jotain yksinkertaisempaa, kuten 50, 50. Kirjoitit jotain erilaista! Hei, hei. Niin selvästi, mitä on tekeillä. Mutta mikä oli selitys miksi? Ilmeisesti, rivi 12 on täysin toimimaton. Mikä perustavanlaatuinen ongelma täällä? Joo. >> [Opiskelija] Se vertaamalla osoitteet. Joo, aivan. Se on todella vertaamalla osoitteet jossa HELLO ja Hello tallennetaan. Se ei verrata kirjaimia HELLO uudestaan ​​ja uudestaan, sillä mitä todella tapahtui, kaiken tämän ajan olemme käyttäneet GetString - Tämä liitutaulu on jälleen meidän tietokoneen muistiin, ja sanokaamme Kutsun GetString todettuaan muuttujan s. Mitä minun muisti näyttää? Oletetaan mielivaltaisesti sanoa, että s näyttää tältä. Se on neliön. Ja melko paljon tahansa Olen piirtänyt pala muistia ruudulla jos se on 32 bittiä Olen piirtänyt ruudut näin, koska todellakin laitteen osoitin, osoite, on 32 bittiä. Se on sama kuin int. , Joka voi vaihdella perustuen tietokonejärjestelmään. Ne teistä, jotka ovat etäisesti tuttuja että Mac-tai PC on 64 bittiä, että todella tarkoittaa, että tietokone käyttää 64-bittisiä osoittimia, 64-bittiset osoitteet, ja joukossa upsides siitä on tietokoneet voi olla paljon enemmän muistia kuin eilispäivän. Pitkä tarina lyhyt, takaisin päivän, jolloin tietokoneita käytetään vain 32 bittiä edustamaan osoitteita, suurin tavujen voisit edustaa tässä tapauksessa oli mitä jos sinulla on 32 bittiä? Joten 4000000000, oikea, koska 2-32 on 4 miljardia euroa. Tämä numero on toistuminen kurssin. Joten jos sinulla on vain 32 bittiä, eniten voit laskea, on noin 4 miljardia euroa. Mutta se oli perustavanlaatuinen rajoitus tietokoneiden kunnes muutama vuosi sitten koska jos voit vain laskea jopa 4 miljardia euroa, sillä ei ole väliä, jos ostat 8 gigatavua RAM-muistia tai jopa 5 gigatavua RAM-muistia; et voi luottaa, että korkea, joten se oli hyödytön. Voisit vain saada ensimmäiset 3 tai 4 gigatavua tietokoneen muistiin. Se pienempi ongelma nyt, ja voit ostaa MacBook Pro ja Dells jossa 8 gigatavua RAM-muistia tai jopa enemmän näinä päivinä. Mutta jos minä jakaa yksinkertaisesti tässä ohjelmassa osoitin, osoitin nimeltään s, Se voisi näyttää tältä ruudulla koska todellakin meidän kuori takaisin tähän kerrokseen. Minä pitää sanoa merkkijonon, mutta maanantaina merkkijono on todella char *, osoite jokin merkki. Joten sallikaa että koulutus pyörä pois vaikka jatkamme käyttää GetString nyt. Joten olen ilmoitettu s, ja tämä on kimpale muistin, 32 bittiä. Mitä täällä muistissa oletuksena? >> [Äänetön opiskelijan vastausta] Mikä tuo on? >> [Opiskelija] Garbage. >> Garbage. Aivan. Jos ohjelmoija ei laita arvoa muuttujan, joka tietää, mitä se on? Joskus olet onnekas ja se on 0, mikä on tavallaan mukavaa, puhdas oletusarvo, mutta kuten näimme maanantaina joskus se on täysin järjetöntä, joitakin todella suuri positiivinen tai negatiivinen luku, jotka tulivat mistä? Joo. >> [Opiskelija] toiminto ennen. >> Joo. Usein funktio, joka sai kutsutaan ennen, sillä muistan, kuin soitat toiminnot muistiin, ne vievät enemmän tilaa alhaalta ylöspäin, ja heti kun toiminto palaa, että muisti saa käyttää uudelleen jonka seuraava kaveri, joka saa kutsutaan, joka käyttämällä samaa siivu muistia. Ja jos olet jättänyt roskat siellä, aiemmat arvot, voisimme luulla s olevan jotain arvoa, kun todellakaan emme ole laittanut mitään sinne. Joten meidän RAM tässä vaiheessa näyttää tältä. Nyt oikealla puolella linjan 7 olemme vaaditaan GetString, jonka olemme tehneet nyt viikkoja, mutta mitä GetString oikeasti tekee? GetString kirjoittaneet CS50 henkilökunta on hieman älykäs siitä, että heti kun käyttäjä alkaa kirjoittaa avaimet ja osumia Enter, GetString lukuja kuinka monta näppäilyjä tekivät käyttäjän osuma, kuinka monta merkkiä minun täytyy jakaa RAM. Ja missä se RAM tulee, kuka tietää? Se on jossain tietokoneen 2 gigatavua tai vaikka mitä muistia. Mutta Oletetaan, että tietokone löytyy tilaa sana HELLO täällä. Sana I kirjoitetaan oli H-E-L-L-O. Ja jos vedämme tätä merkkijono, voisimme tehdä sen näin. Mutta minun täytyy tehdä 1 ylimääräinen juttu. Mitä kuuluu lopussa mikä tahansa merkkijono C? Nollamerkki, jota kirjoitan \ 0. Se on teknisesti numero 0, mutta kenoviiva tekee kaikki selkeämpi , että tämä on kirjaimellisesti numero 0, kokonaisluku 0; se ei ole, esimerkiksi lainaus-lainaus päättyy 0, että saatat kirjoittaa näppäimistöllä. Joten tämä on Hello. Ja mitä sanomme maanantaina, että toimivat kuten GetString todella palauttaa kaikki nämä viikkoa? Se ei palaa merkkijono sinänsä sillä ei oikeastaan ​​ole siten koska merkkijonot eivät ole. He tavallaan valmistus on CS50 kirjastossa. Mikä on todella merkkijono, enemmän teknisesti? >> [Opiskelija] Se on ensimmäinen merkki. Aivan. Se on yksinkertaisesti osoitteen ensimmäinen merkki siitä, että käyttäjä kirjoitettu sisään Joten jos minun sanani HELLO päätyy sen tavun numero 123 ja sitten tavu numero 124, 125, 126, ja niin edelleen, jos vain numero minun tavuja 0 ylös, mitä todella GetString palaa on kirjaimellisesti numero 123. Joten mitä saa laittaa s on numero 123, ei kirjain H, ei sana HELLO, yksinkertaisesti osoite, josta löydän ensimmäinen kirjain HELLO. Mutta se ei tunnu riittävän. Pyysin teitä merkkijonon, ei merkki. Joten miten me tai tietokoneen tietää, että ELLO sellainen mukana tulevat H? Mikä on sellainen sopimus olemme? Joo. [Opiskelija] Se hokee itselleen löytää lisää merkkejä. >> Aivan. On tämä ihmisen ja tietokoneen yleissopimuksen jolloin kun olet tekemisissä jouset, tunnetaan nyt char tähdet, sinun täytyy vain keksiä jossa lopussa jokaisen merkkijonon elämässä tapahtuu oikeastaan ​​vain iteroimalla sen yli on silmukka, while-silmukka, mitä, joten kun löydät merkkijonon loppuun Nyt voit päätellä, että oi, koko sana oli HELLO. Ne teistä, joilla on aiemmin kokemusta ohjelmoinnista voi tietää Java voit vain soittaa. pituus ja muilla kielillä, voit soittaa pituus tai vastaavia. Se koska paljon kieliä, erityisesti asioita kutsutaan olio-kielet, pituus on jotain sellaista kapseloitu sisällä datalohko itse, paljon kuin me koteloitu tunnukset ja nimet ja talojen sisällä opiskelija maanantaina. Mutta C on paljon alhaisempi. Ei ole esineitä tai luokissa, jos olet kuullut näitä termejä ennen. Kaikki mitä on todella muisti osoitteita. Joten tämä on eräänlainen vanhanaikainen tapa esittää mielenkiintoisia tietorakenteita. Sinulla alkuarvo kuten osoitteen ensimmäisen merkin ja sitten vain muutamia mielivaltaisia ​​yleissopimuksen että jokainen sitoutuu noudattamaan. Joten miten on merkkijonon pituus toteutettu, ei ehdotamme? Strlen, strlen, jota jotkut teistä ovat nyt käytetty muutaman kerran. Se on melko yksinkertainen, eikö? Se on kuin 2 riviä koodia. Se on aika paljon ja silmukka jonkinlaisia, ehkä ylimääräinen paikallinen muuttuja. Mutta strlen vain on otettava osoittimen ja sitten alkaa etsiä \ 0. Ja heti, kun se havaitsee, se voi palauttaa vaiheiden kokonaismäärä, että se on toteutettu, että merkkijono. Joten voimme päätellä tästä, mitä tapahtuu seuraavaksi. Oletetaan sitten ilmoittaa t kuten olen tehnyt linjassa 10. Tämä on jonkin verran roskaa arvo. Kuka tietää ensin? Mutta oikealla puolella linjan 10 soitan GetString uudelleen. Kuka tietää mihin tämä päätyy? Oletetaan mielivaltaisesti sanoa, että käyttöjärjestelmä löytyy tilaa se tapa tänne. Satun sattumalta kirjoittaa H-E-L-L-O uudelleen, ja niin voimme tehdä samanlaista kuvaa. Mutta se, että olen latautunut tämä kuva on tahallinen koska se on erilainen HELLO kuin tämä yksi. Joten tässä tämä voi olla sijainti 456, tämä on 457, ja niin edelleen. Joten mitä saa laittaa jos kysymysmerkin kerran oli? Tässä tapauksessa 456. Olemme poiminta näitä numeroita mielivaltaisesti koska oikeastaan ​​päivän jälkeen emme aio välitä niin paljon siitä, mitä osoitetta mitään on. Kaikki välitämme on, että voimme selvittää osoitteen joidenkin pala tietoja, kuten HELLO. Joten oikeastaan ​​mitä useimmat ihmiset tekevät tietojenkäsittelytieteen puhuttaessa muisti osoitteita ja puhumme viitteitä erityisesti, eikä vaivaudu mietitään 123 - who cares jos tätä tavaraa todella on, Tiedämme vain, että se on jossain numeerinen osoite - me yksinkertaistaa maailmaa ja sanoa, että s on osoittaa, että merkin ja t on osoittaa, että merkki. Ja että se nuoli on aivan tarkoituksellista koska kirjaimellisesti nyt s on suunnattu H ja t on suunnattu muille H koska lopussa päivä, sillä ei ole väliä, mitä osoite on, mutta sillä on väliä, että meillä on kyky ilmaista kyseiseen osoitteeseen joidenkin koodinpätkä. Emme ole todellakaan manipuloida näitä osoitteita ihan vielä niin näemme missä voimme heittää väliin ja tavallaan tehdä asioita osoittimia, mutta nyt linja 12 kirjaimellisesti mitä arvoja me vertaamalla mukaan tämä tarina linjalla 12? Me sanomme on 123 yhtä sama 456? Ja se ei todellakaan ole kyse. Ja jopa käsitteellisesti, tämä osoitin ei todellakaan ole sama kuin tämän koska soitit GetString kahdesti, ja GetString ei yritä olla super ovela, se ei yritä ymmärtää, oh, kirjoitit HELLO 5 minuuttia sitten; minäpä annan samalla osoitinta annoin teille ennen, se vain allokoi uuden palan muistia aina kun soittaa sitä. Miten siis korjata tämän ongelman? Jos korkeampaa haluan verrata merkkijonoja HELLO ja Hello - En välitä osoittimet - miten voin edetä vastata kysymykseen, ei käyttäjä kirjoittaa sama asia? Mitä tässä tarvitaan? Joo. [Opiskelija] Käytä toimintoa. >> Voin käyttää toimintoa kättelyssä. Voin käyttää funktiota kutsutaan strcmp, s-t-r-c-m-p, vain lyhennetty versio sanoa merkkijono vertaa. Ja jos me mennä esimerkiksi vertailla 2, joka on yksi nykypäivän monisteita, Teen juuri sitä. Pidin kaiken muun samaa linjaa 1 alas 26 tai niin, ja nyt huomaa tämä osa on muuttunut vain vähän. Katsotaanpa sivuuttaa linja 28 hetkeksi ja keskittyä vain tämä yksi. Mitä sanomme maanantaina str Vertaile tekee? Se käsittelee ottamassa 2 osoittimia, s ja t tässä tapauksessa, tavallaan lähes laittaa sen sormen näitä 2 kirjainta, ja mitä sen täytyy tehdä, on jotain while-silmukka tai on silmukka, ja se sanoo nämä samat? Jos näin on, se liikkuu sormien tai osoittimia eteenpäin. Nämä ovat samat, nämä samat, nämä samat, nämä samat, nämä samat? Ja ooh, olen lopussa merkkijonon sekä s ja t. En ole löytänyt mitään ristiriitaisuuksia. Kyllä, nämä jouset ovat samat. Ja mitä str verrata paluu jos 2 jouset ovat samat, ilmeisesti? Zero. Joten 0 on hyvä tässä tapauksessa, koska jos se palaa -1 tai +1, tämä tarkoittaa, että on vain sattuu tulemaan ennen t aakkosjärjestykseen tai jälkeen t.. Ja miksi se olisi hyödyllistä olla toiminto, joka kertoo mikä merkkijono on ennen tai sen jälkeen vuonna sanakirjasta? [Opiskelija] Searching. >> Etsiminen ja lajittelu. Joten voit tehdä asioita, kuten binäärihakupuu tai kupla lajitella tai yhdistää lajitella jossa sinun täytyy vertailla asioita. Toistaiseksi olemme tavallaan leikata joitakin kulmat ja vain puhui lajittelua yhteydessä numeroiden koska se on mukava ja helppo puhua, mutta voit toki verrata merkkijonoja, omena ja banaani, koska jos omena tiedetään tulla ennen banaani, vastaavasti, voit siirtää merkkijonoja ympäri muistiin aivan kuten Rob teki Merge lajitella video ja teimme täällä lavalla valinta Lajittele, lisäys lajitella ja kupla lajitella. Joten jos muuta voimme ottaa tämän? Kokeillaan tätä. Mennään tavallaan unohtaa, että opetus hetkeksi ja yrittää nyt ja kopioida 1.c tehdä seuraavasti. Yhdenmukaisesti 21 sanon print jotain, Sitten Saan merkkijonon käyttäjä, Sitten olen tarkistamiseksi. Emme ole todellakaan mennyt tämä tapa vielä, mutta katsotaan nyt tehdä tämän. Mennään todella Taitat tämän kerroksen. Tämä on todella char *. Tämä kaveri on todella char *. Joten mitä se tarkoittaa olla tarkistaa jos s == NULL? On käynyt ilmi, että kun soitat toimivat kuten GetString tai yleisemmin vain pyytää tietokone antaa sinulle jonkin verran muistia, jotain voi mennä pieleen. Voisit olla hullu ja pyydä tietokoneen teratavun muistia pyytämällä biljoonia tavua muistia, jotka eivät vain olemassa tietokoneen, mutta GetString ja muut toiminnot tarvitsevat tapa huutaa sinua jos olet pyytänyt liikaa. Ja miten GetString tämä on, jos olet pyytänyt lisää muistia kuin on käytettävissä tietokoneessa, vaikka se on super, super alhainen todennäköisyys koska kukaan meistä ovat menossa kirjoittaa biljoona merkkejä ja paina sitten Enter- mutta pieni todennäköisyys, vaikka se voi olla, en silti halua tarkistaa se vain siinä tapauksessa, ja erityinen arvo GetString, vastaus, ja muita toimintoja palaa jos jotain on mennyt pieleen on NULL kaikissa korkit. Ja mikä on NULL? NULL sattuu edustamaan osoitin. Se muistiosoite 0. Maailman päätti mielivaltaisesti, jos tämä on minun tietokoneen muistiin - Tiedätkö mitä? - aiomme varastaa vain 1 tavu jokaisen tietokoneen muistiin, ja tämä on paikka 0. Me aiomme antaa sille lempinimen NULL, ja aiomme luvata että emme koskaan oikeastaan ​​laittaa todellisia tietoja ei koska vain mielivaltaisesti tarvitsemme erityinen arvo, 0, alias NULL, jotta voimme huutaa käyttäjiä, jos jokin menee pieleen. Muuten et ehkä tiedä, ei 0 tarkoittaa laittaa jotain tai se tarkoittaa jotain meni pieleen? Olemme kaikki yhtä mieltä siitä, että NULL tarkoittaa mitään ei palautettu, ei todellista osoitetta palautettiin. Nyt, täällä olen vain hyväksymällä minun ihmisen yleissopimus palaan 1 alkaen tärkeimmistä Jos jokin menee pieleen. Tämä johtuu pääasiassa paluuta yleissopimus on palauttaa 0, jos hyvä, 1 tai jokin muu arvo, jos huono. Mutta GetString ja kaikki toiminta, joka käsittelee muistissa palauttaa NULL, jos jokin menee huonosti. Okei. Joten valitettavasti linja 27, super yksinkertainen kuin se onkin, ei onnistunut kopioida merkkijono. Miksi? Voimme nähdä tämän seuraavasti. Olen väittäen linjassa 27 voidaan tehdä kopion s ja sen hakeminen t. Joten en pyydä käyttäjä 2 jousille tällä kertaa, sanon vain arvo s pitäisi laittaa t samoin. Joten nyt vain osoittaa kuinka rikki tämä on linjassa 29 eteenpäin mitä teen? Ensimmäinen olen tarkistaa, jos pituus t on suurempi kuin 0. On joitakin merkkijono siellä. Käyttäjä kirjoitettu jotain sisään Mikä on line 32 tekee ilmeisesti? [Äänetön opiskelija vastausta] >> Oikea. Voit sellaista päätellä sitä mitä sanoin sen tekee. Mutta teknisesti, mitä tämä tekee? t [0] tarkoittaa mitä? [Opiskelija] nollas merkki. >> [Malan] nollas merkki. Tai enemmän ihmisen kaltaisia, ensimmäisen merkin t, mitä se on, H ehkä tässä tapauksessa. Ja toupper mitä se sanoo. Se aktivoi nollas luonnetta t ja se muuttaa sitä. Joten tämä tarkoittaa ottaa nollas luonnetta t, tee se isoiksi, ja laita se takaisin samassa paikassa. Joten jos kirjoitat hei pieniä, pitäisi vaihtaa pienet h pääoman H. Mutta ongelma on, että linjat 35 ja 36, ​​mitä aion tehdä, on tulostaa meille s ja t. Ja mikä on sinun aavistus? Mitä minä todella menossa katsomaan jos olen kirjoittanut Hei kaikki pieniä? Mitä menossa painettu? >> [Äänetön opiskelijan vastausta] >> Mikä tuo on? [Opiskelija] Big H ja loput pieniä. >> Iso H ja loput pieni, joka s tai t? [Opiskelija] Molemmat. >> Molemmat. Aivan. Joten katsotaanpas mitä täällä tapahtuu. Anna minun mennä eteenpäin ja koota tähän. Tämä on COPY1, joten varmista COPY1. Selvä. Lähennä Haluan mennä eteenpäin ja ajaa COPY1, Anna, Sano jotain: hei pienillä kirjaimilla. Se aktivoi kopio, mutta se ilmeisesti aktivoidaan alkuperäisen samoin, sillä mitä nyt tapahtuu tämän tarinan? Yhdenmukaisesti 27 En oikeastaan ​​tunnu kopiointi merkkijono, mutta vaikka ehkä intuitiivisesti toivonut, että olisi kyse, jos ajattelee tätä kuvaa, mitä todella olen tehnyt? Puolet kuva on sama. Joten perua ajoissa, jotta t ei vielä ole tarina. S voi esiintyä tarina, mutta katsotaanpa pieniksi hei tällä kertaa. Joten haluan korjata mitä olen itse kirjoittanut tuumaa Tässä tapauksessa meillä on tässä h-e-l-l-o. Me piirtää se merkkijono, laitoin erotin linjat täällä ja minun \ 0. Joten tämä on, missä olemme pian linja 1: stä 24-ish, antaa tai ottaa, on suoritettu. Tämä on kuva minun muisti. Kun pääsen linja 27, mitä tapahtuu? Aivan kuten ennen, saan osoittimen, joka minä piirtää kuin tämä neliö. Sitä kutsutaan t.. Ja mikä sen arvo oletuksena? Kuka tietää? Jotkut roskat arvoa. Niin minä abstrakteja että pois kuin kysymysmerkki. Ja heti oikealla puolella linjan 27 suorittaa, mitä olen laskemisesta sisällä t? Sama juttu se on s. Joten jos me hetkeksi poistaa tämän abstraktion nuolen ja sanomme, Voi, tämä on muistin kuormituksen osoite 123, kun sanot t saa s, puolipiste, olet kirjaimellisesti laskemisesta 123 täällä. Nyt jos me tavallaan yksinkertaistaa maailmamme jälleen kuvia, mitä olet tehnyt todella on juuri lisätty toinen nuoli maailmaasi joka on joka osoittaa t täsmälleen sama merkkijono. Joten kun rivillä 31 ja 32 olen itse mennä muuttamassa t [0] Mikä on t [0] ilmeisesti synonyymi nyt? s [0] Niin, että kaikki tapahtuu. Ja vaikka tällainen tuntuu hieman alhainen ja mystistä ja tämä tavallaan tuntuu ehkä intuitiivisesti tämä olisi vain toimi - Olen tehnyt kopioita asioita ennen ja se toimi - jos todella miettiä, mitä merkkijono todella on, se on char *. No, mikä on? Se on osoite jokin merkki. Sitten ehkä järkevämpää, että kun yrität tehdä jotain Super näennäisen yksinkertainen näin, kaikki mitä teet on kopiointi muistin osoitteen. Et oikeastaan ​​tee mitään merkkijono itse. Joten vaikka sinulla ei ole aavistustakaan miten ratkaisisi tämän ongelman koodin, korkea, käsitteellisesti, mitä meidän on tehtävä, jotta ta jäljennös s, ilmeisesti? Joo. >> [Opiskelija] Anna sille uusi sijainti? >> Aivan. Meidän täytyy antaa t upouusi paikkaan. Meidän jotenkin luoda maailma, jossa saamme uuden palan muistia, jotka vain selvyyden vuoksi minä piirtää oikeassa alapuolella, mutta se ei tarvitse olla siellä. Mutta sen on oltava sama koko, niin minä piirtää nämä pystyviivoja samassa paikassa. Se on hienoa, jos tämä kaikki on roskaa aluksi. Kuka tietää, mitä siellä oli? Mutta vaihe 1 tulee on antaa minulle niin paljon muistia kuin tarvitsen sopimaan kopio Hei, sitten selvittää, miten kopioida h täällä, E täällä, L täällä ja niin edelleen. Mutta tämä on jo pitäisi tuntea hieman ilmeinen, vaikka jotkut yksityiskohdat ovat vielä abstrakteja. Kopioida tämä merkkijono tähän, se on vain varten silmukka tai kun silmukka tai jotain, jonka kanssa olet tullut kaikki tutumpi. Joten kokeile tätä. Sallikaa minun mennä copy2.c. Vuonna copy2.c meillä on lähes sama ohjelma paitsi linja 27. Se näyttää hieman monimutkainen, mutta jos me murtaa se alas pala palalta, vasen puoli on sama. Char * t luo tämän asian muistiin, vaikkakin kysymysmerkki koska meillä ei ole aavistustakaan mitä siellä oletuksena. Oikealla puolella olemme nyt käyttöön uuden toiminnon, malloc, muistin myöntää, anna minulle muisti, ja se ilmeisesti kestää kuinka monta argumenttia, kuinka paljon suluissa? Kuulin nurinasta 1 ja 2, mutta se on vain 1. Ei ole pilkkua, mikä tarkoittaa, että on vain 1 juttu sulkujen sisään. Vaikka on olemassa muita sulkeisiin, haluan korostaa mitä sisällä uloimman sulkeisiin, ja se on tämä lauseke: (Strlen (t) + 1) * sizeof (char). Joten jos ajattelemme tätä kautta, tämä sanoo anna minulle pituuden s. Miksi olen kuitenkin lisäämällä 1 päälle pituus? >> [Äänetön opiskelijan vastausta] Aivan. Tarvitsemme tilaa tämän kaveri hännän, kuudes merkki, joka ei ole Englanti merkitystä mutta ei ole erityisiä ohjelmallinen merkitys. Joten tarvitsemme + 1 että koska strlen palaa ihmisten odotukset pituus, Hei tai 5, se ei anna lisää nollamerkki. Olen siis manuaalisesti lisätä tätä + 1. Ja sitten tämä, * koko (char), emme ole nähneet tätä ennen. Tämä ei ole teknisesti funktio. Se on erityinen avainsanan, joka vain kertoo, mitä kokoa on joidenkin tietojen tyypin tietokoneella koska todellisuudessa, jotkut meistä ovat 32-bittisiä tietokoneita. Olen aika vanha tietokone kotona ja se käyttää vain 32 bitin osoittimia. Ja niin jos tein koko tietotyyppi, se voi olla 32 bittiä. Mutta jos olen käyttäen uutta fancy tietokone, saatan palata arvo 64 bittiä ja jotain osoitetta. Joten tässä tapauksessa, vain olla super turvallinen, emme aio kova koodi jotain - hyvin, mikä on koko char mukaan, mitä olemme sanoneet tähän mennessä? Olemme melko sanoi suullisesti että se on 1 tavu, ja se on aika paljon totta kautta linjan. Mutta jälleen kerran, oletukset yleensä huono. Ne johtavat buginen ohjelmisto, jos ihmiset käyttää ohjelmistoa tavoilla, joita et aikonut. Joten Tiivistelmä pois ja vain lisää yleisesti sanoa Tarvitsen tätä monet palasina muistia ja kukin kimpale muistia olisi vastattava koko merkin, mikä on itse asiassa yhtä suuri kuin 1 tässä tapauksessa, mutta se on yleisempi tapa kirjoittaa sitä. Eli jos sana on hei, kuinka monta tavua ei malloc ilmeisesti osoittaa Hello? [Opiskelija] Six. >> Kuusi. Tasan yhtä monta kuin meillä on kysymysmerkkejä ruudulla. Ja sitten arvata perustuu nyt ymmärrystä GetString Mitä malloc palannee? >> [Opiskelija] osoite. Osoite mitä? Ensimmäisen palan muistia. Meillä ei ole aavistustakaan, mitä on olemassa, koska jokin muu toiminto voitu käyttää tätä muistia aikaisemmin. Mutta malloc, kuten GetString, palauttaa osoitteen ensimmäisen tavun muistin että se on varattu sinulle. Kuitenkin, mitä se ei tee on täyttää tämä tyhjäksi kenoviivaan nollamerkki koska se kääntyy pois, voit käyttää malloc osoittaa mitään: ints, jouset, taulukot, kellukkeet, opiskelija rakenteita. Voit käyttää malloc täysin yleisesti. Se ei välitä tai tarvitse tietää, mitä olet jakamisesta muistia. Joten se olisi ylimielistä malloc laittaa \ 0 lopussa jokaisen palan muistia se antaa sinulle koska \ 0 juttu on vain yleissopimus jousille. Se ei käytetä ints, sitä ei käytetä kellukkeet, sitä ei käytetä opiskelijoille. Ja niin ähäkutti kanssa malloc on, että taakka on täysin sinusta ohjelmoija muistaa kuinka monta tavua olet varattu eikä koskaan käytä varten silmukka tai kun silmukan ja mennä ohi rajan palan muistia olet saanut. Toisin sanoen, heti kun varata muistia, et voi kysyä käyttöjärjestelmä, oh, muuten, kuinka suuri kimpale muisti oli tämän? Se on täysin sinun muistaa jos tarvitset arvoa. Joten katsotaanpas miten edetä käyttää tätä muistia. Linjassa 28 ja 29 Miksi minä teen tätä? Vain yhteensä järki tarkistaa. Vain jos jokin meni pieleen, pyydän joitakin hullu muistin määrän tai olen niin monia asioita käynnissä tietokoneessa, ei vain ole tarpeeksi muistia, jotain, minä ainakin haluan tarkistaa null. Todellisuudessa useimmissa tietokoneissa antaa sinulle illuusion, että jokainen ohjelma voidaan käyttää kokonaisuudessaan RAM, mutta silti, jos käyttäjä on joku hullu pitkä jono ehkä koska he pahis ja he todella yrittävät kaataa ohjelman tai hakata siihen, Haluatko ainakin tarkistaa palauttaa arvon malloc ja onko se yhtä null. Ja jos se, mennään vain lopettaa nyt, koska en tiedä mitä tehdä tässä tapauksessa. Miten kopioin merkkijono? On muutamia tapoja tehdä tätä. On str kopiointitoiminnoista C, mutta se on erittäin yksinkertainen, että teemme tämän vanhanaikaisella tavalla. Ensinnäkin haluan selvittää, mitä pituus s on. Olisin voinut laittaa tämän silmukan vaan olen vain laittaa sitä täällä selvyyden vuoksi. Joten n nyt tallentaa pituus alkuperäisen merkkijonon, joka on ilmeisesti 5. Sitten minun on loop olen iteroimalla 0 on korkeintaan n, ja kukin iterointi Laitan s [i] sisäpuolelle t [i]. Niin, että mitä minä merkitsi minun 2 sormea ​​osoittaen merkkijonot. Koska tämä silmukka toistetaan näin, aion olla kopioinnin h osaksi täällä, e osaksi täällä, L tulee tänne, koska tämä on s, tämä on t. Ja sitten lopuksi, vastaa 35 Miksi minä teen tätä? Minun täytyy varmistaa, että olen päättyneen merkkijono t. Ja tein sen näin olla super selkeä. Mutta ehdottaa, joku, jos voisi, erilainen tapa tehdä tämä. En todellakaan tarvitse linja 35. On toinenkin tapa tehdä tämä. Joo. >> [Äänetön opiskelijan vastausta] >> Sano se kovempaa. [Opiskelija] Pienempi tai yhtä suuri kuin. >> Aivan. Voisimme eli vähemmän kuin tai yhtä suuri kuin n, joka yleensä on ollut huono sillä lähes aina kun menemme jopa sama asia Luotamme mennään 1 askel liian pitkälle. Mutta muistakaa, kuinka monta tavua teimme jakaa? Me jaetaan strlen s, joten 5 + 1 yhteensä 6. Eli tässä tapauksessa voisimme tehdä jotain tällaista niin että me kopiointi ei vain hei vaan myös \ 0 aivan lopussa. Vaihtoehtoisesti voisimme käyttää toimintoa kutsutaan str kopio, strcpy, mutta se ei olisi läheskään niin hauskaa. Mutta kaikki se alla huppu. Sitten lopuksi, me teemme samoin kuin ennen. Olen isolla t ja sitten väittää, että alkuperäinen näyttää tältä ja kopio näyttää että. Joten kokeile tätä nyt. Päästä minut tänne. Tee copy2. Me lähentää ja ajaa copy2. Aion kirjoittaa Hei pieniä, ja todellakin saan pieniksi hei kuin alkuperäinen mutta pääomaa Hei kopiolle. Mutta en ole tehnyt vielä. Minun täytyy tehdä 1 viimeinen asia täällä. 46 ja 47 on selvästi vapauttaa muistia, mutta mitä se oikeastaan ​​tarkoittaa? Mitä teen, luulet, soittamalla linja 46 ja linja 47? Mikä vaikutus tällä on? Joo. [Äänetön opiskelija vastausta] >> Aivan. Olet vain kertoa käyttöjärjestelmä, hei, kiitos tästä muistia. Voit nyt käyttää sitä joku muu. Ja tässä täydellinen esimerkki roskaa arvoja. Olen juuri käyttänyt tätä muistia kirjoittaa sana hello in 2 paikkaa, täällä, täällä, täällä ja täällä. Joten tämä on h-e-l-l-o-\ 0. Mutta sitten soittaa rivi 46 ja linja 47, ja tiedät mitä siellä tapahtuu kannalta kuvan? Oikeastaan, odota, tämä kuva on vanha. Kun teemme kopion, tämä kaveri on todella osoittaa täällä, joten katsotaanpa poista numerot ja juuri abstrakteja pois meidän nuolia uudelleen. Mitä tapahtuu tässä kuvassa kun soitan ilmaiseksi? [Äänetön opiskelija vastausta] >> Ei edes. Jos Kehotan ilmaiseksi s ja t - eräänlainen temppu kysymys - tämä kuva ei muutu lainkaan koska kutsuvan s ja soittaa t vain kertoo käyttöjärjestelmä, Hei, voit käyttää tätä muistia uudelleen, mutta se ei muuta tätä null tai jokin erityinen luonne, se ei muuta tätä, se ei muuta h tai e tai l tai l-tai O joko paikka mitään muuta. Kannalta kuvan, heti kun soittaa ilmaiseksi, mikään ei muutu. Ja siinä piilee alkuperä roskat arvoista, koska jos olen myöhemmin tässä ohjelmassa kysy käyttöjärjestelmän enemmän muistia GetString tai malloc tai jotain ja käyttöjärjestelmä sanoo, että minulla on 12 tavua muistia vain vapautuisi, käytä näitä, mitä aiot luovutettava? Tulette luovutettava kimpale muistin että tyypillisesti tehdä kanssa kysymysmerkkejä, mutta mitä ovat ne kysymysmerkkejä? Ne sattuvat olemaan h-e-l-l-o, h-e-l-l-o. Nämä ovat uudet roska-arvoja heti kun vapautuu, että muistia. On todellinen maailma vaikutusta täälläkin. Tämä tapahtuu tekemistä RAM, mutta tietokoneet todella tehdä sama juttu levylle. Me puhumme tästä erityisesti tulevaisuuden ongelma setti keskittyy Forensics. Mutta mitä oikeastaan ​​tapahtuu, jos sinulla on herkkä taloudellinen tiedosto työpöydällesi tai jotkut summittainen JPEG ja vedät sen teidän roskakoriin, Mitä tapahtuu, kun vedät sen roskakoriin tai roskakoriin? Tiesit mitä puhuin. [Naurua] Mitä tapahtuu, kun olet vetää todisteista roskakori tai roskakoriin? [Äänetön opiskelija vastausta] No, niin varovainen. Mitä tapahtuu, kun teet sen? Lyhyt vastaus on ei mitään, eikö? Sketchy tai herkkä tiedosto on yhä vain istuu jossain kiintolevyllä. Useimmat meistä ainakin ovat oppineet kantapään kautta, että sinun täytyy tyhjentää roskat tai roskakori todella poistaa tiedostoja. Ja todellakin, kun klikkaa oikealla tai Control napsautuksella roskakoriin tai valitse Tiedosto, Tyhjennä roskakori tai mitä tahansa ja voit itse tyhjentää roskakorin tai roskakoriin, mitä todella tapahtuu sitten tätä kuvaa? Enemmän mitään. Joten mitään todella tapahtuu levyllä. Ja jos me vain tilapäisesti Poikkean ja kirjoittaa - Minä vain käyttää takaisin tämän. Joten nyt tarinan on muuttumassa RAM, mikä on kun ohjelmia on olemassa kun käytät niitä, levylle, mikä on kun niitä säilytetään pitkään vaikka virta sammuu, nyt - ja me palaamme tähän myöhemmin - Haluan vain teeskennellä, että tämä on kovalevy sisällä tietokoneen koska takaisin päivän ne käytetään olla pyöreä levyille, aivan kuten levykkeet. Joten jos sinulla on joitakin arkaluonteisia Excel-tiedoston, se voisi ottaa tämän palan muistia tietokoneen levyn, ja olen vain piirtämällä sama mielivaltainen 1s ja 0s. Kun vedät tiedoston kuin että teidän roskakoriin tai kierrättää bin, kirjaimellisesti mitään ei tapahdu, koska Apple ja Microsoft ovat juuri päättäneet roskakoriin ja roskakorin on oikeastaan ​​vain väliaikainen paikkamerkki. Ehkä lopulta OS tyhjentää sen sinulle, mutta yleensä se ei tee mitään, ainakin kunnes olet todella vähissä tilaa. Kuitenkin, kun menet Tyhjennä roskakori tai tyhjä roskakoriin, Vastaavasti ei tapahdu mitään tätä kuvaa. Kaikki tämä tapahtuu on muualla tietokoneessa on jonkinlainen taulukko. Se on tavallaan kuin pieni lunttilappua joka sanoo, että sanotaan, resume.doc, joten ansioluettelosi Microsoft Word-tiedoston asuivat paikassa 123 kiintolevyllä, ole muistissa eikä RAM, vaan kiintolevyllä, ja teidän pintapuolisena JPEG asuu 456, ja Excel-tiedoston asuu 789 tai missä. Kun poistat tiedostoja todella tyhjentämällä roskakori tai roskakori, Tämä kuva ei muutu. 0s ja 1s kiintolevyllä ei mene minnekään. Mutta tämä taulukko, tämä pieni tietokanta lajittelee, ei muutosta. Kun poistat ansioluettelosi, se on ikään kuin tiedosto poistetaan jossain mielessä, mutta kaikki tietokoneessa ei on unohtaa missä tuo asuu kiintolevylle. 0s ja 1s joka säveltää ansioluettelosi tai näistä muista tiedostot ovat vielä ennallaan. Joten jos teit tämän vahingossa, siellä on vielä nollasta todennäköisyys että voit palauttaa tietoja käyttämällä Norton Utilities tai joitakin kaupallisia ohjelmistoja joiden elämän tarkoitus on löytää 0s ja 1s jotka ovat tavallaan jääneet orvoiksi, unohdettu täällä mutta lähti täältä, niin että voit saada tiedot takaisin. Tai oikeuslääketieteen tutkijat poliisin kanssa tai FBI todella ottaa kovalevy ja todella etsiä malleja 0s ja 1s jotka näyttävät JPEG, näyttää Excel-tiedostoja, ja palauttaa ne näin vaikka tietokone on unohtanut heidät siellä. Joten ainoa tapa todella poistaa tietoja, kuten tulemme keskustelemaan tulevaisuudessa, on pestä tai pyyhkiä tiedoston tai kovalevylle - Et voi oikeastaan ​​päästä eroon 0s ja 1s koska muuten olisit aloittaa gigatavun kiintolevy ja haluat päätyä megatavun kiintolevyn, jos jatkuvasti ollut poistaa, kirjaimellisesti, 0s ja 1s. Joten mitä tekisit jos todella halusi peittää jälkesi ja perustavanlaatuinen ongelma on, että siellä on vielä 0s ja 1s levylle? Näen jonkun elehti että voisitte fyysisesti rikkoa laitteen. Se toimii. [Naurua] Mutta jos se on sellainen kallis ratkaisu, mikä olisi järkevämpi? Joo. >> [Opiskelija] Korvaa ne. >> Korvaa ne mitä? >> [Opiskelija] Muut tiedot. Muut tiedot. Voit vain korvata levyn kanssa 0s tai 1s tai kaikki 0s, kaikki 1s. Ja se todellakin mitä jotkut ohjelmisto ei. Voit ostaa ohjelmiston tai edes ilmainen ohjelmisto, ja jopa rakennettu Mac OS näinä päivinä, ei niinkään Windowsin, on kyky turvallisesti poistaa. Oikeastaan, jos haluat kaikki ajaa kotiin tänään, jos sinulla on Mac ja tehdä tämän, jos sinulla joitakin juttuja teidän roskakoriin, voit tehdä Tyhjennä roskakori turvallisesti, joka tekee juuri näin. Sen sijaan vain poistaa tiedostoja tässä, se ei poista 0s ja 1s täällä, Pikemminkin se vain vaihtaa ne kaikki, esimerkiksi on 0 ja piste, piste, piste. Joten yksi tulevaisuuden psets todella olla tarkoituksella palauttaa tietoja - valokuvia, jotka olemme ottaneet ihmisiä, paikkoja ja asioita kampuksella josta teemme rikosteknisen kuvan digitaalikameran muistikortilta, joka on täsmälleen sama ajatus - ja sinun täytyy haastaa itse löytää malleja, jotka edustavat JPEG kiintolevylle, paljon kuin että entinen opiskelija, jonka sähköpostin luin muutama viikko sitten tein takaisin sisarensa valokuvat. Miksi emme ota 5 minuutin tauko täällä, ja me koota enemmän muistia. Joten tässä Asiat käyvät hieman vaikeaselkoinen, mutta tämä on erittäin tehokas askel kohti ymmärrystä tämä sitäkin. Tässä on ohjelma nimeltä pointers.c. Se on yksi nykypäivän mallikoodia. Huomaa, että muutaman ensimmäisen rivin, 19 kautta 22, kaikki teemme on jotain GetString ja palauttaa osoitteen, tallentamalla sen s. Vastedes on PSET jopa 3 jos haluat mutta PSET 4 ja jossa voit alkaa ottaa nämä apupyörät pois itse, ei ole mitään syytä teeskennellä, että jouset enää olemassa. Se on varmasti kunnossa vain aloittaa sanomalla char *. Sivuhuomautuksena, online viittauksia ja kirjoja voi usein nähdä tähti vieressä muuttuja. Saatat jopa nähdä tilat noin molemmille puolille. Kaikki nämä ovat toiminnallisesti oikein. Nyt kuitenkin, me standardoida tätä lähestymistapaa tehdä super selväksi että char * on kuin sanoisi merkki osoitin. Tämä on tietotyypin. Ja sitten muuttujan nimi on s tässä tapauksessa. Joten olemme saaneet merkkijono ja olemme kutsuneet sitä s. Ja sitten täällä huomaa, että olen tekemässä todella vähän metkut. Tätä kutsutaan osoitin aritmeettinen, mikä on tavallaan erittäin yksinkertainen. Se vain tarkoittaa, lisätä ja poistaa numeroita osoittimia. Mutta tämä todella toimii. Tämä ohjelma ilmeisesti tulostaa merkkijonon s 1 merkki per rivi siten, että lopputulos - Just niin voimme pilata mihin tämä on menossa, tehdä osoittimia, ajaa osoittimet, haluan zoomata sisään Nyt haluan kirjoita jotain HELLO ja tyyppi Enter ja se tulostaa 1 merkki per rivi. Vuoteen hetki sitten, olisimme tehneet tätä hakasulje notaatio. Meillä täytyisi varten silmukka ja olimme tehdä printf s [i] ja olimme tehdä sitä uudestaan ​​ja uudestaan ​​ja uudestaan kenoviivaan n lopussa kunkin rivin. Mutta tämä ohjelma on erilainen. Tämä ohjelma käyttää, kirjaimellisesti, aritmeettinen. Joten mitä täällä tapahtuu? Ensinnäkin, ennen tätä silmukka edes suorittaa, mitä vain olla selkeä, on s oikeastaan? S on? >> [Opiskelija] osoite. >> Osoite. Ja se on osoite, kun kyseessä on hei, ensimmäinen merkki siitä, että sana, joka on h. Joten s on, tässä nimenomaisessa esimerkissä, osoite tuntia. Joten mitä se tarkoittaa tehdä s + i? No, minä alkaa 0 Tässä varten silmukka. Olemme tehneet sen monta kertaa. Olen aikoo mennä jopa merkkijonon pituus, ilmeisesti. Joten ensimmäisen iteraation tämän silmukan, i on luonnollisesti 0. Joten tämä ilmaus sanoo s + i - vaan s +0--se ilmeisesti vain s. Joten mikä on * s täällä? Nyt käytämme tähti hieman eri tavalla. Anna minun mennä eteenpäin ja päästä eroon t, koska olemme tehneet puhumme t ja kopiot s. Nyt me vain haluamme kertoa tarinan, johon s. Ja niin tällä hetkellä, sen jälkeen kun tyyppi merkkijono, meidän maailma näyttää aivan samalla tavalla kuin ennen vain s tallennetaan osoitteen h ja yleisemmin osoittaen merkkijono Hei. Jos en nyt tee kaltainen rivi * (t + i), katsotaanpa kokeilla tätä. Niin * (s + i). Saanen yksinkertaistaa tätä, koska tämä on 0, joten tämä on * (t +0). No, odota hetki. Yksinkertaistaa edelleen. Tämä on * (t). No, nyt ovat suluissa typerää, joten nyt haluan vain tehdä * s. Joten ensimmäisessä iteraatiossa tämän silmukan, että viiva, joka on korostettuna, 26, on melko vastaa tulostamiseksi. Mikä on tietotyyppi * s? Tässä yhteydessä, koska tähti sattuu olemaan vieressä s itse, mutta tarkemmin, koska emme enää julistaa s, emme ole luomassa muuttuja enää, ei ole mitään mainintaa char * linjassa 26, ei ole mitään mainintaa avainsanan merkkijonon, olemme vain käyttämällä muuttuja nimeltä s, se osoittautuu nyt tähti on hieman erilainen ja kieltämättä sekava merkitys. * S tarkoittaa tässä mene osoitteeseen s ja tulostaa mitä on olemassa. Joten s on täällä, * s on - tavallaan kuin liukumäet ja tikkaat, noudata nuoli - täällä. Joten tämä on * s. Joten mitä saa painettu ensimmäistä iterointia kyseisen silmukan rivi 26? Olen tulostaa% C, joka on tilapäinen luonne, Sitten \ n uuden linjan. * (T + i) missä i on 0 on juuri tämä. Joten mitä char asetan in% C? H. Seuraavalla iterointia silmukan - voit todennäköisesti nähdä mihin tämä on menossa - seuraavan iteraation i on tietenkin 1, joten tämä merkitsee sitä, s +1, ja sitten nyt en tarvitse suluissa koska nyt tähti tarvitsee sanoa Siirry muistiosoite s +1. Mikä on s? Mennään rullata ajassa taaksepäin ja sanoa nuoli nyt ei oikeastaan ​​tee meille mitään palveluksia. Oletetaan tarkemmin sanoa, että tämä on tallennetaan numero 123 koska alusta tämän merkkijonon hello, tämä on osoite 123, tämä on 124, ja niin edelleen. Joten toisen iteroinnin kun sanon s +1, se on kuin sanoisi 123 +1, muuten kutsutaan 124, niin mitä char saa painaa toista iterointia? E muistiosoite 124. Sitten + taas, 125, 126, 127, ja tämä silmukka onneksi pysähtyy ennen kuin saamme täällä koska olen käyttäen strlen varmistaa, että i ei lasketa liian korkea. Niin sekin on sitä. Tämäkin on aivan kuin olisimme tehneet viikko sitten. Saanen kirjoittaa sen linjan alapuolella, vaikka emme halua tehdä molempia. Tämä on identtinen nyt tähän. Joten vaikka s on merkkijono, kuten olemme vaatineet sitä viikkoja, s on todella char *. Joten jos haluamme olla super anaali, se on todella oikea kirjoittaa erityisluonteen klo nteen paikkaan käyttämällä näitä numeerisia osoitteita ja tämän tähden operaattori, mutta suoraan sanottuna, tämä on vain niin paljon puhtaampaa. Joten tämä ei ole huono. Ei syytä lakata tekemästä linja 27 täällä, mutta 26 on toiminnallisesti sama, ja se on toiminnallisesti sama juuri syistä olemme keskustelleet toistaiseksi. Ja lopuksi, 29 on aivan hyviä käytäntöjä. Soittaminen ilmaiseksi s tarkoittaa, että nyt annat takaisin muistin GetString antoi sinulle koska jälleen, kuten mainitsin maanantaina GetString viikkoja on käyttöön bug omaan koodia. Koodi viikkoja on ollut muistivuotoja jolloin olet pyytänyt GetString muistin, mutta et ole koskaan antaneet sitä takaisin. Ja se oli tietoisesti valinnut meidät pedagogisesti koska se on aivan liian paljon ajateltavaa varhain. Mutta nyt me tarvitsemme enemmän symmetria. Jos pyytää tietokoneen muistiin, kuten on asian laita GetString, kuten on ilmeisesti malloc, sinun on nyt PSET 4 edelleen myös ilmainen tällaista muistia. Huomaa että tämä on eri asia kuin ajatus int n. Sinun ei tarvitse vapauttaa tämän, koska et soita GetString ja te ette soita malloc. Ja vaikka et kutsutaan GetInt kuten tulemme lopulta nähdä, GetInt ei varata muistia sinulle, koska voit itse kulkea ympäri kokonaislukuja ja kellukkeet ja merkkiä juuri niin olemme tehneet jo viikkoja. Strings kuitenkin ovat erityisiä, koska todellisuudessa he ketjutus useiden merkkiä. Joten he vain eri merkkiä ja kellukkeet ja ints ja vastaavat. Mutta tulemme takaisin, että ennen pitkää. Kaikki kysymykset sitten tämä alku viitteitä? Joo. [Äänetön opiskelija kysymys] Ah, erittäin hyvä kysymys. Yksi harvoista asioista, C todella tekee teille, mikä on kätevää, on se keksii teille mitä kokoa on tietotyyppi ja sitten tekee tuollaista kertolasku sinulle. Tämä ei ole merkitystä, jos merkkiä, koska lähes aina char on 1 tavu, joten tämä vain toimii. Mutta vuoksi keskustelun, olisit itse tulostaa kokonaislukuja ja yritit tulostaa jotain arvoa tuo oli osoittaen kokonaisluku, te samalla ei tarvitse tehdä + 4 * En vain siksi, int on 4 tavua. Pointer aritmeettinen keskiarvo, että C-ja kääntäjä tehdä kaikki matematiikka sinulle. Sinun tarvitsee välität on laskennan eräänlainen ihmisen mielessä. Joo. [Opiskelija] Jos julistaa merkkijono sisällä on silmukan, sinun täytyy vapauttaa sen myöhemmin? Hyvä kysymys. Jos ilmoitettu merkkijono sisällä on silmukka, sinun täytyy vapauttaa sitä myöhemmin? Sinun tarvitsee vain vapaan muistin että jakaa kanssa GetString tai malloc. Joten jos vain sanoa jotain - haluan laittaa aaltosulkeita nyt niin kaikki koodi liittyy. Jos teit jotain, vaikkakin buggily, kuten tämä, char * t = s, sinun ei tarvitse maksuton t koska t ei liittynyt mitään mainintaa malloc tai GetString. Jos sitä vastoin teit tämän, GetString, niin kyllä, sinun pitäisi maksuton t. Ja itse asiassa, ainoa mahdollisuus tehdä se nyt on sisällä tämän silmukan, saman kysymyksen soveltamisala että olemme keskustelleet aikaisemmin. Muuten olisit jaettaessa muisti, jaettaessa muisti, jakaminen muisti, ja ohjelman lopussa, koska olet ulkopuolella että silmukan, T ei ole olemassa, mutta et koskaan kertonut käyttöjärjestelmä että et tarvitse tuota muistia enää. Ja ennen pitkää, sillä PSET 4 tai 5 me varustaa sinulle ohjelma nimeltä Valgrind, joka on hengeltään samanlaisia ​​GDB että se sai jokseenkin vaikeaselkoinen käyttöliittymä, mutta sen tarkoitus elämässä on auttaa sinua. Ja Valgrind on ohjelma, joka tulee jatkossa etsiä ohjelmia etsivät muistivuotoja, olipa GetString tai malloc, jonka aloitamme käyttää kaikkia enemmän kuin me lopeta CS50 kirjastoa niin paljon. Olemme vihdoin nyt tavallaan sanastoa ja tavallaan mentaalinen malli teoriassa jolla ratkaista tämä rikki ohjelman. Joten tässä rikki ohjelmassa swap toimii sisällä swap, mutta se ei koskaan todella toiminut pääasiassa koska pääasiassa kului x ja y, Recall, ja ne kuluivat arvot ovat niin sanotusti. Jäljennökset niistä annettiin vaihtaa. Vuoden swap, ja b oli todellakin vaihdettu, mutta tietenkin x ja y, kuten olemme keskustelleet maanantaina, ei ollut. Joten ehdotan vihreä täällä, että tämä on todella ratkaisu tähän. Ja itse asiassa, haluaisin siirtää minun tähdet vain oltava vaikka jälleen toiminnallisesti tämä ei ole väliä. Tulevaisuudessa viikkoa kerromme, milloin ja miksi sillä on väliä. Joten vihreä on nyt ratkaisu. Suoraan sanottuna se näyttää paljon Messier koska minulla on kaikki nämä tähdet. Saanen huomauttaa yhden asian. Ylärivillä täällä missä lukee int * ja int * b on pohjimmiltaan tekee samaa kuin se on aina tehnyt. Se julistaa 2 argumentteja tai parametreja vaihtaa, joista ensimmäinen on int osoitin kutsutaan, joista toinen on int osoitin nimeltään b. Ainoa asia, joka on uutta tässä vaiheessa on se, että siellä on tähti siellä. Mitä se tarkoittaa? A ei ole int, b ei ole int. A on osoite int ja b on osoite eri int. Tänne, tämä on kun myönnän C saa hämmentävää. Nyt käytämme tähti, mutta se on eri merkitys tässä yhteydessä. Koska emme julistaa osoittimet kuten me täällä, Tässä olemme dereferencing asioita. Niinpä teknisesti tähden tässä yhteydessä ensimmäisen, toisen ja kolmannen rivin sisällä swap on dereference toimija, mikä tarkoittaa vain mennä sinne. Joten minun sormi seurasi nuoli h, * Tarkoittaa mene tähän osoitteeseen ja löytää minua int se siellä. * B keino mennä osoitteeseen ja välittää minulle mitä siellä. Joten piirtää kuva maanantaista käyttävät nyt pino kehyksiä, pohja joista yksi tulee olemaan pää-, ylempi joista yksi tulee olemaan swap, niin että maailma näyttää, kuten maanantaina näin. Tässä on kimpale muistin että pääasiallinen aikoo käyttää. Muistamme maanantaina, että ohjelma oli vain 2 muuttujaa, yksi nimeltään x ja yksi nimeltään Y, ja olin laittanut numerot 1 ja 2 on. Nyt kun vuorottelu kuten tein maanantaina, Aiemmin kun käytin punaista versio ohjelmasta, joka näyttää tältä, Sain 2 parametrit, ja b, ja mitä me kirjoitamme täällä ja täällä? Vain 1 ja 2, kirjaimellisesti kopioi x-ja y. Tänään muuttaa. Tänään sen sijaan kulkevat ints ja b aiomme kulkea 2 osoitteet. Nämä osoitteet sattuvat osoittamaan ints, mutta näitä osoitteita ei ints itse. Ne ovat osoitteita. Se on kuin postiosoite sijaan. Joten nyt meidän täytyy vain antaa itselleni hieman tarkemmin näytöllä. Tämä on minun tietokoneen muistiin kuin se on ollut koko päivän. Nyt tarvitsemme mielivaltainen numerointi. Joten vain sanoa, vain sattumalta, että tämä on muistin osoite 123, 124. Sanotaan vain se 125, tämä on 126, ja niin edelleen, mutta se on täysin mielivaltainen. Meidän täytyy vain muutamia numerointia mieleeni. Joten nyt kun olen itse kulkea x ja y, en aio kulkea x ja y; Aion kulkea postiosoite, niin sanoakseni, x ja y niin että mitä saa säilyttää täällä ja täällä ei ole 1 ja 2, mutta jos et voi nähdä minun pieni tekstitiedosto, mitä saa siirtää täällä ja täällä? [Äänetön opiskelija vastausta] >> Aivan. 123 saa laittaa tänne ja 124 saa laittaa tänne. Nyt, koska käytin tähdittävät ensimmäinen rivi asti täällä ylhäällä, minun ohjelma juuri tietää, että 123 ja 124, vaikka he ilmeisesti kokonaislukuja että ihminen voisi huomata, ne tulisi tulkita osoitteita, numeerinen osoite. Ne eivät ole ja itse ints, he osoitteita, ja se, koska olen nimenomaan laittaa tähdet siellä. Joten nyt minun ensimmäinen, toinen ja kolmas rivi varsinaisen koodin mitä täällä tapahtuu? Katsotaan kiinnittää muu kuva. Tmp on aivan kuten se oli maanantaina. Mitään erityistä tmp. Se on vain paikallinen 32 bittiä muuttuja, ja sisällä että olen ilmeisesti tallennetaan arvo *. Nyt, jos olen vain sanonut tmp =, mitä laitoin tänne? >> [Opiskelija] 123. 123. Mutta se ei ole, mitä olen tekemässä. Sanon tmp = *. Star keinoin sinne. Joten tässä on, 123. Miten pääsen sinne? Teeskennellä siellä nuoli. No, siinä se on, 1. Joten mitä saa säilyttää tmp, ilmeisesti? Vain 1. Eli toisin sanoen, tmp on *, * välineet mennä osoite, joka on tällä hetkellä, , joka on ilmeisesti 123. Okei, täällä ollaan paikassa 123, näen numero 1, joten aion laittaa numero 1 siellä. Nyt mitä teen linjassa 2, * = * b? Tämä yksi on hieman enemmän mukana, koska mitä nyt on? Se on 123. Joten * on missä? Oikea missä olin ennen. Joten mene sinne. Okei. Nyt, lopuksi, ja lopulta tämä alkaa järkeä, toivottavasti, * B tarkoittaa mitä on b? 124. Joten minun täytyy mennä sinne, mikä on 2. Joten mitä laitoin minne? 2 menee täällä, koska * b menee *. Joten teen sen. Ja voit jo nähdä, ehkä, että olemme niin paljon lähempänä ratkaisemisen tyhmä, yksinkertainen ongelma oikein ensimmäistä kertaa koska nyt meillä on vielä muistikuva mitä x oli, meillä on 2 kappaletta, tosin y, mutta linja 3 sanoo nyt * b. Joten tässä b.. * B keinoin sinne. Joten missä on paikka 124? Se on ilmeisesti täällä. Joten mitä laitan tänne? On selvää, tmp. Joten nyt teen tämän. Joten minulla on 1 täällä ja 2 täällä. Ja nyt, mitä tästä kaikesta, 123, 124, ja 1? Heti kun swap palaa, tämä muisti on yhtä hyvä kuin menetetty sillä pian swap palaa, käyttöjärjestelmä käyttö on ilmaista, että muistin uudelleen tulevaisuudessa. Vain tärkeimmät muistiin alareunassa tämän ns pino tikkuja ympärille. Ja niin meillä on vihdoinkin nyt toimiva versio. Sallikaa minun mennä swap.c, ja huomaa seuraavat. Ylimpänä ohjelman Muutin prototyyppi on int * ja int * b. Joten ainoa asia muuttunut mennä punainen, mikä oli huono, vihreään, mikä on hyvä, on Lisäsin nämä tähdet tänään. Mutta sitten alas täällä vaihtaa itse jouduin kopioida, liittää mitä vain diassa. Olen tähti täällä, tähti täällä - joka vastaa prototyyppi - ja sitten kaikki nämä asiat nyt Tähteä paitsi tmp koska käytön väliaikainen muuttuja, ei mitään uutta siellä. Tarvitsen vain tilapäiseen varastointiin int. Joten emme tarvitse tähti siellä. Meidän täytyy vain tähti, jotta voimme ylittää tällainen mielivaltainen rajan näiden 2 kehykset tietokoneen muistiin. Mutta yksi asia on muututtava, ja olet ehkä keksineet sen jo. Mitä muita linja on selvästi erilainen nyt? >> [Opiskelija] & x. Joo, niin 25 on viimeinen koodirivi minun täytyy muuttaa, jotta tämä toimisi. Viikko sitten ja jopa maanantaina linjan 25 näytti tältä, vaihda x ja y, ja tämä oli juuri rikki koska jos sanot swap (x, y) annat kopioita x ja y vaihtaa, niin se tekee sen asian, mutta et koskaan todella muuttuu x-ja y itsensä. Joten vaikka et ole koskaan nähnyt tätä merkkiä ennen kanssa et-koodin, vain arvata. Mitä et-tee, ilmeisesti? [Opiskelija] Tulee osoitteen. >> Tulee osoitteen. Joten et-sanoo anna minulle osoitteen x. Kuka tietää missä se on? Se sattuu olemaan 123. En välitä. Vain antaa minulle osoitteen x. Ja y tarkoittaa antaa minulle osoite y. Ja tässä vaiheessa tarina on täysin yhdenmukainen kuva laadimme hetki sitten. Joten minä myönnän osoittimia, varmasti minulle kun aloitin oppiminen tätä, oli ehdottomasti yksi vaikeimmista asioista kääri mieleeni ympäri. Mutta ymmärtää, varsinkin kun pidämme leikkivät tällaisia ​​asioita, jos murtaa se alas nämä super yksinkertainen eräänlainen älyllisesti mielenkiinnoton ongelmia vain liikkuvat numeroiden ympärillä, vastaus paljon sekaannusta osoittimet todellakin voi olla peräisin näistä hyvin perus mekaniikka. Tässä osoite. Mene sinne tähti. Tai päinvastoin, tässä on et-. Selvittää, mitä osoitetta todellisuudessa on. Selvä. Eli jos on kaikki tämä muisti tulevat? Olemme vetää tätä kuvaa pari kertaa, ja pidän lupaavia Palaamme siihen, mutta tässä on edustus tietokoneen muistiin joka on hieman enemmän leimattua kuin meidän liitutaulu täällä on. Tekstin segmentti ylhäällä edustaa mitä suhteen ohjelma? [Äänetön opiskelija vastausta] >> Sorry? Sano uudestaan. [Opiskelija] varsinainen ohjelma. >> Varsinainen ohjelma. Joten 0s ja 1s että olet kääntänyt kirjoituksen jälkeen C-koodin ja sitten käynnissä clang ja tuottaa 0s ja 1s päätyy saamaan työntää sinne muistiin koska kun kaksoisnapsauttamalla kuvaketta Mac tai PC tai suorittaa komennon kuten Mario teidän nopeaa, sinun 0s ja 1s levyltä latautuvat muistiin, jotta tietokone voi manipuloida niitä ja suorittaa ne nopeammin. Joten alustettu data ja alustamaton tietoja, emme puhu paljon niitä, mutta nämä ovat vain globaaleja muuttujia. Alustettu tarkoittaa globaalien muuttujien että annoit arvoja; alustamaton tarkoittaa globaalien muuttujien jotka ette vielä anna arvot. Sitten on nämä ympäristömuuttujat jonka minä täysin vilkuttaa käteni, mutta ne ovat olemassa ja että tallentaa asioita, kuten käyttäjänimesi ja muu sellainen alemman tason yksityiskohtia. Mutta juiciest kappaletta muisti layout on tämä asia sanottu pino ja keko. Pino taas olla selkeä, on muisti, jota käytetään aina funktiot, jos on paikallisia muuttujia ja jos on parametrien kiertämään. Kaikki tämä tapahtuu pinon. Kasan emme ole puhuneet, mutta arvata kuka käyttää kasaan. Vain eri kimpale muistia. Se tapahtuu laaditaan täällä huipulla, mutta se mielivaltainen kuvallinen yleissopimuksen. Kuka ilmeisesti käyttää muistia kasan viikkoja? Se on teknisesti sinua vaan välillisesti. >> [Opiskelija] GetString. GetString ja malloc. Joten tässä on perustavanlaatuinen ero. Tiedät että viime viikkoina, että jos tarvitset muistia, vain julistaa muuttuja. Jos tarvitset paljon muistia, julistaa joukko oikeus sisällä oman toiminnan. Mutta ongelma olemme pitäneet edessä on jos julistaa muuttujia paikallisesti sisällä toimintoja, heti kun funktio palauttaa, mitä tapahtuu muistiin ja nämä muuttujat? Vain eräänlainen se ei ole enää sinun, eikö? Se katoaa eräänlainen käsitteellisesti. Se on edelleen fyysisesti siellä, tietenkin, mutta se ei ole enää asiakkaan oikeus käyttää. Tämä on tietysti ongelmallista, jos haluat kirjoittaa toimintojen elämässä että todella varata muistia ja älä anna sitä takaisin välittömästi. Asia kohtaan: GetString n tarkoitus elämässä on ole aavistustakaan etukäteen kuinka suuri merkkijono aion kirjoittaa on näppäimistö, mutta se täytyy pystyä varata muistia pitää David tai hei tai kokonainen essee että käyttäjä ehkä kirjoitettu sisään Joten GetString on käyttänyt malloc. Malloc vuoksi täytyy käyttää ei pinon; vaan se käyttää tämä asia sanottu kasaan. Ei ole mitään erilaista muistia. Se ei ole nopeampi tai hitaampi tai mitään sellaista. Se on vain fyysisesti eri paikassa. Mutta sääntö on, että muisti, joka on varattu kasaan ei koskaan oteta pois, kunnes soitat - ottaa arvata - ilmaiseksi. Sen sijaan kaikki muisti pyydät pinoon vain hieman julistamalla array tai julistetaan muuttujan kuten olemme tehneet jo viikkoja, että oletuksena päätyy pinoon. Ja se toimii hyvin 90% ajasta, mutta niitä harvinaisempia otteeseen minne haluat varata muistia ja pitää sen ympärillä, Sitten sinun täytyy käyttää toimintoa kuten malloc. Tai olemme käyttäneet toiminto, kuten GetString, joka puolestaan ​​käyttää malloc. Katsotaan jos tämä voi murtaa ja sitten kurkistaa Binky. Palaamme siihen tulevaisuudessa. Täällä on erittäin yksinkertainen ohjelma, joka on ensimmäisen 2 riviä tekee mitä? Englanti, mitä nämä ensimmäiset 2 riviä koodia tehdä sisällä tärkein? [Äänetön opiskelija vastausta] Varovasti. Se ei anna minulle osoite x tai y. [Opiskelija] Antaa viitteitä ints. >> Hyvä. Anna minulle 2 osoittimia kokonaislukuja. Toisin sanoen, anna minulle 2 paloina muistin että minun pitää piirustus tänään vaikka en hävitä sitä nyt, kuten neliöitä. Anna minulle 2 paloina muistia, yksi nimeltään x, yksi nimeltään Y - aikaisemmin Kutsuin heitä s ja t - ja mikä on sen tyyppinen, että kimpale muistia? Se tulee tallentaa osoitteen. Se on tyyppiä int *. Joten osoitteen int lopulta elää x, osoite int lopulta elää y, mutta aluksi, mitä sisällä x ja y? Kuka tietää? Garbage arvot. Sillä ei ole mitään tekemistä viitteitä. Jos emme ole laittaneet jotain siellä, kuka tietää mitä todellisuudessa on? Nyt, x. Mitä täällä tapahtuu? Tämä on legit nyt, koska x on osoitin. Se on int *. Joten se tarkoittaa, että voin laittaa x osoitteen joidenkin palan muistia. Mitä malloc palaa? Perfect, se palauttaa osoitteita, osoitteen ensimmäinen tavu koko palan muistia. Kuinka monta tavua on tähän ilmeisesti vuodeksi Esimerkiksi laite? Mitä kokoa int? 4. Jos luulet takaisin viikon 1, se ei ole erittäin tärkeää aina muistaa, että mutta tässä tapauksessa se on hyödyllistä tietää, 4 tavua. Joten tämä on jakaa kasaan 4 tavua ja se palauttaa osoitteen ensimmäinen minulle mielivaltaisesti. Nyt, mitä x tekee? * X = 42 tekee mitä? Jos tässä vaiheessa tarinan olemme x, joka näyttää tältä joitakin roskaa arvo, Tämä on nyt y joitakin roskat arvoa, nyt linja 3 Olen varattu 4 tavua. Tämä kuva lähinnä näyttää tältä. Tai tarkemmin, jos tämä on mielivaltainen osoite 123, tämä on mitä tarina nyt näyttää. * X = 42 nyt tarkoittaa mitä? Tämä tarkoittaa mene osoitteeseen 123 ja laita numero 42 siellä. Minun ei tarvitse tehdä näiden kohtien koska emme tee merkkijonoja. Minun olisi pitänyt juuri kirjoittanut sen näin, ja vain esittelyn vuoksi, 42 kuten int sellainen vie paljon tilaa, 4 tavua. Niin, että mitä siellä tapahtui, mutta siellä on ongelma nyt. * Y = 13. Mitä tulee tapahtumaan täällä? Ongelmana on * y meidän yksinkertaistetussa maailmassa tarkoittaa vain mennä osoitteeseen y. Mitä y? Se on joku roska arvoa. Joten olettaa, että roskat arvo on 5551212, jotain hullua sellaista. * Y keinoja mennä puuttumaan 5551212. Se on kuin täällä. Ei ole olemassa, esimerkiksi. Joten * y saa 13 avulla yritän piirtää 13 täällä. Sitä ei ole olemassa. Olen ylittänyt segmentti liitutaulun. Mitä saan? Tämä arvoituksellinen viesti segmentointi vika, koska yritän laittaa muistiin arvo kuin 13 paikassa, joka ei ole olemassa. Loput ohjelman saattaisi toimia hyvin, mutta enintään siihen saakka se ei ole. Joten yritä kertoa tämän tarinan. Tulemme takaisin, että kun olemme puhuneet hex. Mennään takaisin tähän ja tehdä tämä asia sanottu Binky, joka Recall on Stanfordin professori istuu kotona leikkii claymation, kertoa tarinan täsmälleen saman ohjelman. Se on vain noin 3 minuuttia pitkä. Täällä meillä on Binky. [Uros kaiutin video] Hei Binky, herätä. On aika osoittimen hauskaa. [Binky] Mikä tuo on? Lisätietoja viitteitä? Voi goody! [Uros kaiutin] No, päästä alkuun, kai me menossa pari viitteitä. [Binky] Okei. Tämä koodi jakaa 2 osoittimia, jotka voivat osoittaa kokonaislukuja. [Uros kaiutin] Okei. No, näen 2 osoittimia, mutta ne eivät näytä osoittavan mitään. [Binky] Aivan oikein. Aluksi osoittimet eivät osoita mitään. Mitä he viittaavat kutsutaan pointees, ja asettamalla niille on erillinen vaihe. [Uros kaiutin] Voi, oikea, oikea. Tiesin sen. Pointees ovat erillisiä. Er, niin miten voit jakaa pointee? [Binky] Okei. Tämä koodi allokoi uuden kokonaisluku pointee, ja tämä osa asetetaan x osoittamaan sitä. [Uros kaiutin] Hei, se näyttää paremmalta. Joten tehdä jotain. >> [Binky] Okei. Minä dereference osoitin x tallentaa numero 42 osaksi pointee. Tämän tempun minä tarvitsen taikasauvaa ja dereferencing. [Uros kaiutin] Sinun taikasauvaa ja dereferencing? Se on hienoa. [Binky] Tämä on mitä koodi näyttää. Otan vain perustanut numero ja ... [Poksahtelua] [Uros kaiutin] Hei katso, siellä se menee. Näin dereference koskevan x seuraa nuolta päästäksesi sen pointee, Tässä tapauksessa tallentaa 42 siellä. Hei, kokeile sitä tallentaa numero 13 kautta muille osoitin, y. [Binky] Okei. Otan vain mennä tänne y ja saada numero 13 perustetun ja sitten ottaa taikasauva dereferencing ja vain ... [Särinää] Vau! [Uros kaiutin] Ai hei, se ei toimi. Sano, Binky, en usko dereferencing y on hyvä idea koska perustetaan pointee on erillinen vaihe enkä usko, että koskaan tehnyt sitä. [Binky] Hmm, hyvä pointti. [Uros kaiutin] Joo. Me jaetaan osoittimen y, mutta emme koskaan aseta se osoittamaan pointee. [Binky] Hmm, hyvin tarkkaavainen. [Uros kaiutin] Hei, etsit hyvää siellä, Binky. Voitteko korjata sen niin, että y viittaa samaan pointee kuin x? >> [Binky] Toki. Minä käytän taikasauvaa osoittimen tehtävän. [Uros kaiutin] että tulee olemaan ongelma kuin ennen? [Binky] Ei, tämä ei kosketa pointees. Se vain muuttaa yksi osoitin osoittaa sama asia kuin toinen. [Poksahtelua] [Uros kaiutin] Ymmärrän. Nyt y viittaa samaan paikkaan kuin x. Joten odota. Nyt y kiinteä. Se on pointee. Joten voit kokeilla taikasauva dereferencing jälleen lähettää 13 yli. [Binky] Öh, okei. Tässä menee. [Poksahtelua] [Uros kaiutin] Hei, katso tuota. Nyt dereferencing toimii y. Ja koska osoittimia jakavat että yksi pointee, he molemmat katso 13. [Binky] Joo, jakaminen. Whatever. Joten aiomme vaihtaa paikkaa nyt? [Uros kaiutin] Oh look, olemme myöhässä. >> [Binky] Mutta - [Uros kaiutin] Muistathan 3 osoitin sääntöjä. Numero 1, perusrakenne on, että sinulla on osoittimen ja se viittaa yli pointee. Mutta osoittimen ja pointee ovat erillisiä, ja yhteinen virhe on perustaa osoittimen mutta unohtaa antaa sille pointee. Numero 2, osoitin dereferencing alkaa osoittimen ja seuraa sen nuoli yli käyttää sen pointee. Kuten me kaikki tiedämme, tämä toimii vain, jos on olemassa pointee, millaisia ​​saa takaisin sääntö numero 1. Numero 3, osoitin toimeksianto kestää yhden osoittimen ja muuttaa sitä osoittamaan samaan pointee kuin toinen osoitin. Joten kun toimeksianto, 2 osoittimet tulee osoittaa samaan pointee. Joskus sitä kutsutaan jakaminen. Ja se kaikki on sitä todella. Bye-bye nyt. Tämä on Binky. Tämä on CS50. Nähdään ensi viikolla. [Aplodit] [CS50.TV]