>> [Musiikki soi]
DAVID J. MALAN: Okei.
Tämä on CS50, ja tämä on viikon lopussa neljä.
Ja yksi aiheista tänään on, että digitaalisen aineiston tutkintaan,
taidetta toipumassa tietoa.
Ja todellakin, vaikka olet keskellä
nyt Rauhan Three ja Breakout, ensi viikolla,
keskitytään Juuri tällä alalla.
>> Joten yksi hienoimmista työpaikoista koskaan oli palasi tutkijakoulu,
kun olin työskennellyt paikallisten Middlesex County syyttäjän
toimisto, tekee tutkintaan toimi.
Niin olennaisesti, Massachusetts Valtiollinen poliisi, toisinaan
työskenneltäessä Tapauksille tuoda asioita, kuten kiintolevyt
ja levykkeet ja muistikortit ja vastaavat.
Ja he toimittavat ne minulle ja minun mentori,
ja tavoitteenamme oli löytää todisteita, jos oli mitään, näitä median.
Nyt olet ehkä nähnyt välähdyksiä Tämän maailman tutkintaan
tiedotusvälineissä, televisio ja elokuvat.
Mutta työ minulla oli, ja daresay että maailma,
ei ole aivan kuin näkisit sen.
Katsotaanpa katsomaan mitä Olet varmasti nähnyt.
[VIDEOTOISTOSTA]
-OK.
Nyt, saada hyvä katsoa sinua.
>> [Musiikki soi]
>> -Pidä Sitä.
Ajaa sen takaisin.
>> Hetkinen.
Mene oikealle.
Tuolla.
Jäätyä että.
Full-screen.
>> -OK.
Jäätyä että.
Tiukentaa ylös, että sinä?
>> -Vector Kauppaa näillä kaveri takapyörä.
>> -Zoom Sisään täällä tällä paikalla.
>> -Kun Oikeat laitteet, Kuvaa voi suurentaa ja terävöittää.
>> Mitä se on?
>> -Se Tehostamisohjelma.
>> Voitko selvää, että mihin tahansa?
>> En tiedä.
Katsotaan parantaa sitä.
>> -Paranna § A6.
Olen parannettu yksityiskohta, ja--
-Luulen On tarpeeksi parantaa.
Vapauta se minun näytöllä.
>> -I Parannettu pohdintaa hänen silmässä.
Piiloudutaan ajaa tätä kautta kuvanmuokkausteknologia.
>> -Edgar, Voit lisätä tämän?
>> -Hang Päälle.
>> -Olen Työskennelleet tämän pohdintaa.
>> Tuolla on joku heijastus.
>> -Reflection.
-Siellä Heijastaa miehen kasvot.
>> P heijastus!
Tuolla on pohdintaa.
-Zoom Sisään peiliin.
Näet pohdintaa.
>> Voitko parantaa kuvan täältä?
Voitko parantaa sitä?
-Voimmeko Parantaa tätä?
Voitko parantaa sitä?
Odota hetki toinen.
Minä parantaa.
-Zoom Vuonna oveen.
-Times 10.
-Zoom.
-Siirrä Sisään.
-Enemmän.
Odota, lopeta.
Lopeta.
-Pause Sitä.
-Rotate Meille 75 astetta ympäri pystysuoran, kiitos.
>> Lopeta.
Mene takaisin osa siitä ovesta.
>> -Sain Kuva tehostajana, joka voi bittikartta?
>> Ehkä voimme käyttää Pradeep Singh menetelmä kurkistaa ikkunoita.
>> P ohjelmisto on uusinta.
>> P ominaisarvo on pois päältä.
>> -Kun Oikea yhdistelmä algorithms--
>> -Hän Otettu valaistus algoritmeja seuraavalle tasolle,
ja voin käyttää niitä parantaa tämän valokuvan.
>> -Lock Päälle ja suurentaa z-akselin.
>> -Paranna.
Parantaa.
-Paranna.
-Freeze Ja parantaa.
[END VIDEOTOISTOSTA]
DAVID J. MALAN: Joten ne ovat kaikki sanat, mutta ne eivät olleet
käytetään lauseita oikein.
Ja todellakin tulevaisuudessa, milloin tahansa, kiitos, kuulet jonkun sanovan sanan,
"Parantaa", hihittää vain vähän.
Koska kun yrität parantaa, Esimerkiksi tämä on mitä tapahtuu.
>> Joten tässä on upea kuva.
Tämä on CS50 oma Daven.
Ja olettaa, että halusimme painopiste on pilke silmäkulmassa,
tai heijastus pahis, joka oli selvästi
vangiksi valvontakamera.
Tämä on mitä tapahtuu, kun suurennat kuvan, että
on vain äärellinen määrä bittien liittyy siihen.
>> Eli mitä saisit.
Ja todellakin, vuonna Daven silmään on vaan neljä, ehkä kuusi pikseliä
että säveltää mitä oli kimaltelevan siellä.
Joten Harjoitus neljä on lopulta voit tutustua maailmaan, erityisesti
luonteeltaan jotain kutsumme tiedoston I / O, jossa
i / o on vain hieno tapa sanomalla tulon ja lähdön.
>> Niin tähän mennessä kaikki vuorovaikutukset meillä on ollut tietokoneen kanssa
ovat olleet pääosin kanssa näppäimistö ja näyttö,
mutta ei niinkään kiintolevy, tai tiedostojen tallentamista niiden lisäksi, joita
itse kirjoittaa.
Ohjelmat ovat toistaiseksi ei ollut luomassa, ja säästää,
ja päivittää omia tiedostojaan.
>> No, mikä tiedosto?
No, jotain JPEG.
Tämä on kuva saatat on tai ladata Facebook,
tai nähdä kaikkialla internetissä.
Todellakin, että kuva me vain saha Daven oli JPEG.
Ja mikä mielenkiintoista noin tiedostoja, kuten JPEG
on se, että ne voidaan tunnistaa, tyypillisesti, tietyt bittikuvioina.
>> Toisin sanoen, mikä on se, että erottaa JPEG GIF
alkaen ping Word Asiakirjan Excel-tiedoston?
No, se on vain erilainen bittikuvioina.
Ja näiden eri kuviot ovat Yleensä alussa kyseiset tiedostot.
>> Niin, että kun tietokone avataan Word doc, tai kun tietokone avataan JPEG,
se näyttää tyypillisesti Ensimmäinen useita bittejä tiedoston.
Ja jos se tunnistaa kuvion, se sanoo, oi, tämä on kuva.
Saanen tuoda sen käyttäjälle graafinen.
Tai, oi, tämä näyttää Word doc.
Haluan näyttää sen käyttäjälle essee.
>> Joten esimerkiksi JPEG, se kääntyy pois, ovat
varsin kehittyneitä alla huppu.
Mutta kolme ensimmäistä tavua melkein joka JPEG aloittaa nämä kolme numeroa.
Niin tavu nolla, yksi ja kaksi ovat, ja melkein joka JPEG, 255, niin numero
216, sitten numero 255.
>> Ja mitä voit alkaa tehdä ensi viikolla
on todella tönäisi alla huppu tiedostoja, kuten JPEG
ja kuten bittikarttatiedostot, ja nähdä mikä on aina ollut siellä niin kauan
koska olet käyttänyt tietokonetta.
>> Mutta mitä siellä ei ole tyypillisesti kirjoitettu kuten desimaalilukuja näin.
Tietotekniikan tutkijoita ei taipumus puhua desimaalin.
He eivät todellakaan puhu binary.
Tyypillisesti, kun haluamme ilmaista numeroita,
me todella käyttää heksadesimaali-, joka ehkä muistatte
alkaen vaikkapa Harjoitus Yksi, joka haastoi
miettimään eri järjestelmää.
>> Me, tietenkin, ovat tuttuja Desimaaliluvulliset, nollasta yhdeksään.
Puhuimme binary.
Ja meillä ei oikeastaan ​​ole käyttää niin paljon täällä
ulos, sillä tietokoneet käyttävät sitä.
Mutta ohjelmoijat hyvin Usein, mutta ei aina,
käyttää heksadesimaali-, mikä tarkoittaa vain sitä, Sinulla on 16 kirjainta teidän aakkoset,
toisin kuin kaksi tai 10.
>> Joten miten voit laskea korkeamman kuin yhdeksän heksadesimaali-?
Menet 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, , b, c, d, e, f, vain sopimuksen mukaan.
Mutta mitä tärkeintä on, että jokainen Näiden on yksi symboli.
Ei ole 10.
Ei ole 11, sinänsä, koska kukin teidän numeroa, ihan niinkuin desimaalin
ja aivan kuten binary, pitäisi vain olla yksi merkki, jota yleissopimus.
>> Joten silloin on aakkosten meillä käytössämme heksadesimaaliluvussa.
Joten mitä JPEG näyttää jos oli kirjoittaa ulos ensimmäisen kolmen
tavut eivät desimaalin vaan, Esimerkiksi heksadesimaali-?
Ja miksi hex jopa kaikki, että hyödyllinen?
>> No, vilkaista esimerkki.
Joten jos kirjoitan ulos bittien edustavat nämä desimaalin numbers--
tämä saattaa olla hieman ruosteessa nyt muutaman viikon takaisin,
mutta vasen ja oikea on melko helppoa.
255 oli suurin määrä me voisi edustaa kahdeksan bittiä.
Se oli kaikki ykkösiä.
Joten ainoa, joka on lievästi mielenkiintoista on keskimmäinen.
Ja jos sellaista tehdä ulos matematiikka, voit päätellä, että todellakin,
että kuvio yhden ja nollat ​​edustaa 216.
Joten vain määrätä, nyt, että ne ovat oikein.
Mutta miksi tämä mielenkiintoinen?
>> No, tavu, tietenkin, on kahdeksan bittiä.
Ja käy ilmi, että jos luulet tavun kaksi paloina neljä bittiä,
näin.
Saanen lisätä tilaa.
Joten ennen, jälkeen.
Olen vain lisännyt joitakin valkoinen tila visualisointi vuoksi täällä.
Miten voi nyt edustamme, vaikkapa heksadesimaali- kukin quad bittejä,
jokaisen sarjan neljä bittiä?
>> Niinpä esimerkiksi, vasemmalla nyt meillä on 1111 binary.
Mikä on tuo numero kymmenjärjestelmässä jos et ulos matematiikka?
Sinulla on niitä paikka, kaksittain paikka, nelosta paikka, ja kahdeksikkoa paikka.
>> Yleisö: 15.
DAVID J. MALAN: On 15.
Joten jos teemme kahdeksan plus neljä plus kaksi plus yksi, saamme 15.
Niin voisin kirjoittaa 15 alla 1111, mutta pointti tässä
ei heksadesimaali-, ei desimaalia.
Niin kirjoittamisen sijaan alas 15, 1-5, Aion kirjoittaa, että hex,
jotka, jos luulet takaisin, jos sinulla on nolla-F, mikä on 15 tulee?
Yleisö: f.
DAVID J. MALAN: Eli se kääntyy pois se on f.
Ja voit työskennellä että ulos sanomalla, hyvin, jos on 10, niin OK, f on 15.
Joten todellakin, voisimme kirjoittaa näitä samoja numeroita kuin ff.
Ja sitten jos teemme vähän matematiikkaa, me päätellä, että se on d.
Kahdeksan on melko helppoa, koska me on yksi kasia paikassa.
Ja sitten meillä on vielä pari e e n.
>> Joten mitä ihmiset tapana tehdä sopimuksen mukaan kun he käyttävät heksadesimaalista on ne vain
Kirjoitan tätä hieman lyhyemmin, päästä eroon useimmat että valkoinen tila.
Ja vain olla erittäin selväksi lukijoille, että tämä on heksadesimaali-,
yksinkertainen yleissopimus keskuudessa Ihmisillä kirjoitat nolla
x, jolla ei ole muuta merkitystä kuin visuaalinen tunniste,
tässä tulee hex numero.
>> Ja sitten, laitat kaksi numeroa, f f tässä tapauksessa sitten d, niin f f.
Niin pitkän tarinan lyhyesti, heksadesimaali- vain taipumus
olla kätevä, koska sen numeroa, nolla-F, täydellisesti linjat
kanssa rakenteessa neljä bittiä.
>> Joten jos sinulla on kaksi heksadesimaaliyksikön, nolla-F, uudestaan ​​ja uudestaan,
joka antaa sinulle täydellisesti kahdeksan bittiä tai yksi tavu.
Joten siksi se pyrkii olla tavanomaisesti hyödyllinen.
Ei mitään älyllistä sisältö todella pidemmälle,
muu kuin sen todellinen hyödyllisyys.
>> Nyt JPEG eivät ole ainoa tiedostomuodot grafiikka.
Saatat muistaa, että on olemassa tiedostoja, kuten tässä maailmassa,
ainakin muutama vuosi sitten.
>> Joten tämä oli oikeastaan asennettu Windows XP
miljooniin tietokoneisiin ympäri maailmaa.
Ja tämä oli bittikarttatiedostoa, BMP.
Ja bittikarttatiedostoa, niin näet seuraavan viikolla, vain tarkoittaa pistekuvion
pikselit niitä kutsutaan, kartta bittiä, todella.
>> Niin mitä mielenkiintoista, vaikka, tästä tiedostomuoto, BMP, on
että alla huppu, se on enemmän kuin vain kolme tavua
jotka muodostavat sen otsikkoa, niin puhua, muutaman ensimmäisen puree.
Se todella näyttää hieman monimutkainen ensi silmäyksellä.
Ja näet tämän P asetettu.
Ja saada jotain Erityisesti ulos tästä nyt
ei ole niin tärkeä, koska juuri se seikka, että alussa jokainen bittikartta
tiedosto, graafisessa muodossa, siellä on koko joukko numeroita.
>> Nyt Microsoft, Kirjailija tämän muodon,
yleensä soittaa nämä asioita ei ints ja merkkiä
ja kelluu mutta sanoja ja d sanat ja pitkät ja tavua.
Joten he ovat vain erilaiset tiedot.
Ne ovat eri nimiä sama asia.
Mutta huomaat, että P asettanut neljä.
>> Mutta tämä on vain sanoa, että jos ihminen kaksoisnapsauttaa joitakin BMP tiedosto hänen
tai hänen kiintolevyn, ja ikkuna avautuu ylös osoittaa hänelle, että kuva,
että tapahtui, koska toiminta järjestelmä oletettavasti huomannut paitsi
.BMP tiedostopääte tiedoston nimi,
mutta myös se, että on olemassa jokin yleissopimus ohjeeseen bittien
aivan alussa Kyseisen bittikarttatiedosto.
>> Mutta katsotaanpa nyt keskittyä niin monimutkainen tiedoston,
mutta sen sijaan jotain tällaista.
Oletetaan täällä GEdit, I vain alku
on ohjelma, joka on melko yksinkertainen.
Minulla on myös alkuun asti.
Nyt minulla on # include "structs.h", mutta Palaan tähän hetken kuluttua.
Mutta tästä on hyötyä nyt.
Niin tämä on ohjelma että menee toteuttaa
kuten rekisterinpitäjän tietokantaan.
Joten tietokanta opiskelijoita, ja jokainen opiskelija maailmassa
on nimi ja talon ja luultavasti joidenkin muita juttuja, mutta me pitää se yksinkertainen.
Jokaisella opiskelijalla on nimi ja talon.
>> Joten jos halusin kirjoittaa ohjelmaa, jonka tarkoitus elämässä
oli vain kerrata päässä nolla jopa kolme,
jos on kolme opiskelijaa Harvardin yliopistossa.
Ja haluan vain saada käyttäen GetString, opiskelijan nimi ja talon,
ja sitten vain tulostaa ne pois.
>> Tämä on tavallaan kuin viikko Yksi, Viikko Kaksi kamaa nyt,
jos haluan vain varten silmukka tai jotain.
Ja haluan soittaa GetString muutaman kertaa, ja sitten tulostaa f muutaman kerran.
Joten miten voisin tehdä tämän, vaikka, kun sekä nimi ja talon
ovat mukana jokaiselle opiskelijalle?
>> Joten minun ensimmäinen vaisto pitää olla tehdä jotain tällaista.
Voisin ensin sanoa, hyvin, anna minulle, sanoa, Merkkijonotaulukko nimitelty.
Ja en halua hardcode kolme täällä.
Mitä haluan laittaa sinne?
Niin opiskelijoita, koska se on vain jatkuva julisti huipulla,
juuri niin minulla ei ole hardcode kolme useissa paikoissa.
Näin voin vaihtaa sen yhteen paikkaan, ja se vaikuttaa muutoksen kaikkialla.
Ja sitten, voisin tehdä merkkijono taloa opiskelijoille.
>> Ja nyt voisin tehdä jotain for (int i = 0; i <opiskelijoiden i ++.
Joten olen kirjoittaessa nopeasti, mutta tämä on varmasti tuttuja syntaksi nyt.
>> Ja nyt tämä oli uudempi.
Jos haluan laittaa i: nnen opiskelijan nimi, taidan tehdä tätä.
Ja sitten, ei nimiä mutta taloa haarukoida i.
Teen tämän, GetString, ja anna minun mennä takaisin ja korjata tätä linjaa.
Olen samaa mieltä?
Eri mieltä?
Se ei ole kovin käyttäjäystävällinen.
En ole kertonut käyttäjä mitä tehdä.
>> Mutta nyt, jos minäkin halusi myöhemmin, katsotaanpa
vaikkapa tulostaa nämä asiat out-- niin Tehtävät myöhemmin.
Aion tehdä enemmän this-- tämä luultavasti IS
asianmukainen täytäntöönpano saada nimet ja taloja, kolme
niistä yhteensä jokaisen, käyttäjältä.
>> Mutta tämä ei ole kovin hyvä suunnittelu, oikea?
Mitä jos opiskelija ei ole vain nimi ja talon, mutta myös ID-numero,
ja puhelinnumero, ja sähköpostiosoite,
ja ehkä kotisivun, ja Ehkä Twitter kahva,
ja useita muita yksityiskohtia liittyvät opiskelija tai henkilö,
yleisemmin.
Miten alamme lisätä toiminnallisuus tähän ohjelmaan?
>> No, minusta tuntuu yksinkertaisin tapa pitää olla tehdä jotain, sanokaamme,
int tunnukset opiskelijoille.
Joten voin laittaa kaikki tunnukset sinne.
Ja sitten, jotain kuten puhelinnumeroita,
En ole varma, miten vakuuttaa, ettei vielä.
Joten mene eteenpäin ja vain puhelun Tämän Twitters opiskelijoita, jotka
on hieman outoa, mutta-- ja joukko enemmän kenttiä.
>> Olen alkanut tehokkaasti kopioi ja liitä tänne.
Ja tämä tulee kasvamaan aika kömpelö melko nopeasti, eikö?
Eikö olisi kiva jos olisi maailman tietorakenne tiedossa
eikä int tai merkkijono, mutta jotain korkeammalle tasolle, abstraktio, joten
puhua, tunnetaan opiskelija?
C ei tullut sisäänrakennettu toiminnallisuus opiskelijoille,
mutta mitä jos halusin antaa sille tällaista?
>> No, se kääntyy pois, aion Avaa tiedosto nimeltä structs.h täällä,
ja voit tehdä juuri näin.
Ja me aiomme alkaa tehdä tätä nyt.
Ja alla huppu P asetti kolme, olet jo tehnyt tätä nyt.
Ei ole olemassa sellaista asiaa kuin g rect tai g soikea ohjelmointikieli C.
>> Folks Stanfordin täytäntöön ne tietotyypit käyttämällä tätä lähestymistapaa täällä,
julistamalla omia uusia tietoja tyyppeihin käyttäen uusi avainsana
nimeltään struct ja toinen yksi nimeltään typedef.
Ja todellakin, vaikka syntaksin näyttää hieman erilainen kuin tavaraa
olemme nähneet ennen, vuonna Periaatteessa se on erittäin yksinkertaista.
>> Tämä tarkoittaa vain sitä "määritellä tyyppi."
Se tulee olemaan rakennetta, ja rakenne
on aivan kuin säiliön useita asioita.
Ja että rakenne on menossa on merkkijono kutsutaan nimellä,
ja merkkijono kutsutaan talon.
Ja kutsukaamme, vain mukavuussyistä, tämä koko tietorakenne opiskelija.
>> Joten nyt saat puolipiste, sinulla on nyt
luotu omat tietosi tyyppi nimeltään opiskelija
että nyt rinnalla int, ja kellua, ja nieriää ja string,
ja g välilliset, ja g soikea, ja rajoittamattoman määrän Muiden asioita ihmiset ovat keksineet.
>> Joten mitä hyötyä tästä nyt, että jos menen takaisin
to struct 0 ja lopettaa tämän täytäntöönpanoa, jonka kirjoitin
etukäteen täällä, huomaa, että kaikki väistämätön messiness että
oli alkamassa tapahtuu niin lisäsin puhelinnumeroita ja twitters ja kaikki
näitä muita asioita opiskelijan määritelmä,
nyt se on ytimekkäästi kääritty ylös on vain yksi joukko opiskelijoita.
>> Ja jokainen näistä opiskelijoiden nyt on useita asioita sisälle.
Niin että vain jättää yksi kysymys.
Miten saat haluamasi nimen, ja talon, ja tunnus,
ja mitä muuta on sisällä opiskelija?
Super yksinkertainen, samoin.
Uusi syntaksi, mutta yksinkertainen idea.
>> Sinun tarvitsee vain indeksinä array, kuten teimme viime viikolla ja tätä.
Ja mikä on selvästi uusi pala syntaksin?
Vain., Joka tarkoittaa "mennä sisälle rakenne ja saada kentän nimeltään
nimi, saat kentän nimeltään talossa, saada kentän nimeltään opiskelija. "
>> Joten P asetti kolme, jos olet edelleen työtä, että
ja useimmat ihmiset silti on, ymmärtää, että kun
alkaa käyttää asioita, kuten g rects ja g ovals
ja muita asioita, jotka eivät näytä tulevat Viikko nolla, yksi tai kaksi,
ymmärtää, että se johtuu Stanford julisti uusia tietotyyppejä.
>> Ja todellakin, se on juuri sitä, mitä jaamme tehdä samoin, P asettanut neljä, kun
alamme käsitellä asioita kuten kuvia, logoja, ja enemmän.
Joten se on vain teaser ja henkinen malli, mitä on tulossa.
Nyt olen lykänneet hieman tänä aamuna.
Minulla oli sellainen utelias näkemään, mitä Microsoft taustakuva todella
näyttää tänään.
Ja se osoittautuu joku 2006 todellisuudessa meni lähes tarkalleen
Sama paikka kuvata todellisuudessa mitä näyttää, että näinä päivinä.
Kenttä on nyt hieman umpeen.
>> Niin puhuu nyt kuvia, Katsotaanpa tuoda takaisin Daven täällä
ruudulla ja Nicholas, ja muistuttaa teitä
että jos haluat liittyä meihin lounaalle perjantaina, pään tavallisia URL
täällä.
>> Mistä siis jätämme pois maanantaina?
Otimme tämän ongelman, eikö?
Tämä oli ilmeisesti oikea täytäntöönpano swap,
jolloin viet kaksi ints, yksi nimeltään, yksi nimeltään b,
vaihtaa niitä, aivan kuten Laura teki tässä lavalla maito ja vesi,
käyttämällä väliaikaista muuttuja, tai tyhjä kuppi,
jotta voisimme laittaa B ja vuonna b ilman sotkemaan asioita.
Käytimme muuttuja.
Sitä kutsutaan temp.
>> Mutta mikä oli olennainen Ongelmana tässä koodi maanantaina?
Mikä oli ongelma?
Joo.
>> Yleisö: Se vie enemmän tilaa.
>> DAVID J. MALAN: vie enemmän tilaa, koska olen käyttäen muuttuja,
ja se on OK.
Se on totta, mutta olen aio sanoa, että on OK.
Se on vain 32 bittiä grand järjestelmässä asioita, joten ei ole iso juttu.
Muita ajatuksia?
Yleisö: Se vain koronvaihtosopimukset muuttujat paikallisesti.
DAVID J. MALAN: Aivan.
Se vain swap muuttujat paikallisesti.
Koska tahansa soitat function-- kun minulla oli lokerot Annenberg
Viimeisen kerran, olet tärkein pohjassa.
Heti kun soitat toiminto nimeltään swap, swap ei saada x ja y,
alkuperäiset arvot.
Mitä swap get, ei me väitämme?
Yleisö: kopiot.
DAVID J. MALAN: Niin jäljennökset.
Joten se saa yhden ja kahden, jos muistuttaa esimerkiksi viime kerralla,
mutta kopio yksi ja kaksi jotka ovat onnistuneesti vaihdettu.
Mutta valitettavasti lopussa, nämä arvot ovat edelleen samat.
Jotta voimme nähdä tämän kanssa uusi ystävä, toivottavasti GDB,
että sinä tai TF: n ja Ca: n on on ohjata sinua kohti seuraavaa.
>> Joten ei swap muistaa näyttää kuin-- katsotaanpa avata this-- näyttää tältä.
Me alustetaan x yhden, y kaksi.
Oli joukko tulostaa f n.
Mutta sitten, avain puhelu täällä oli vaihtaa, mikä
Juuri koodi me Näin juuri hetki sitten.
Mikä on oikein ensimmäinen silmäyksellä, mutta toiminnallisesti,
tämä ohjelma ei toimi, koska se ei pysyvästi vaihtaa x ja y.
>> Katsotaanpa tätä, pikalämmitysjärjestelmä täällä GDB, ./noswap.
Joukko ylivoimainen tietoa, Haen eroon Control L nyt.
Ja nyt aion mennä eteenpäin ja käyttää sitä.
Ja valitettavasti, että ei ollut hyötyä.
Se juoksi ohjelman sisällä tämän ohjelma nimeltä GDB, debuggeri
mutta se ei anna minun penkoa.
>> Joten miten voin itse keskeyttää suorituksen sisällä tätä ohjelmaa?
Niin tauko.
Ja voisin rikkoa millään linja numero yksi, 10, 15.
Mutta voin myös rikkoa symbolisesti sanomalla tauko tärkein.
Ja se tulee asettaa tauko piste, ilmeisesti linja 16 main.
Ja missä on line 16?
Mennään jopa koodi ja mennä jopa noswap.
Ja todellakin, linja 16 on ensimmäinen ohjelmaan.
>> Joten nyt, jos menen eteenpäin ja tyyppi ajaa tällä kertaa, Anna, se pysähtyi.
Joten penkoa.
Tulosta x-- miksi x nolla?
Ja sivuuttaa dollarin merkki.
Se on vain harrastaja ohjelman käyttöä.
Miksi x nolla tällä hetkellä?
Joo.
>> Yleisö: Se pysähtyi juuri ennen linja 16, ei oikeastaan ​​linjalla 16.
DAVID J. MALAN: Aivan.
GDB, oletuksena on keskeytetty toteutus juuri ennen linja 16.
Joten se ei ole toteuttanut, joka tarkoittaa x on noin tuntematon arvo.
Ja meillä kävi tuuri, että se on jotain puhdasta kuin nolla.
Joten nyt jos kirjoitan seuraavaksi, nyt se toteutetaan 16.
Se odottaa minua suorittamaan 17.
Anna minun mennä eteenpäin ja tulostaa x.
Se on yksi.
Anna minun mennä eteenpäin ja tulostaa y.
Mitä minun pitäisi nähdä nyt?
>> Yleisö: [kuulumaton]
>> DAVID J. MALAN: hieman kovempaa.
>> Yleisö: [kuulumaton]
DAVID J. MALAN: Ei aivan yksimielisyys.
Joten kyllä, näemme roskat arvo.
Nyt, y on 134514064 siellä.
No, se on vain joku roska arvo.
Oma ohjelma käyttää muistia eri tarkoituksiin.
Ei muita toimintoja.
Muut ihmiset kirjoittivat sisällä minun tietokone.
Joten ne bitit on käytetty muut arvot, ja mitä näen
on jäänteitä noin ennen käyttöä, että muistia.
>> Joten ei ole iso juttu, koska heti kun kirjoitan seuraavaksi ja sitten tulostaa y,
se alustetaan arvo että haluan.
Joten nyt mennään eteenpäin hieman nopeammin.
N seuraavaa.
Tehdään se uudestaan.
Mutta en halua lyödä sen tässä, koska jos minä
haluavat nähdä mitä tapahtuu sisällä Vaihtokorien, mitä komento?
>> Yleisö: vaiheita.
>> DAVID J. MALAN: vaiheita.
Joten tämä astuu minut toiminto, pikemminkin kuin sen yli.
Ja nyt se on hieman arvoituksellinen rehellisesti, mutta tämä on vain
kertoo minulle Olen linjassa 33 nyt.
Ja tehdään tämä uudestaan.
Tulosta temp.
Garbage arvo, negatiivinen tällä kertaa, mutta se on vain vielä roskat arvo.
Joten tehdä seuraavaksi, tulostaa temp.
Se alustetaan 1, joka oli arvo x, aka.
>> Nyt, missä ovat meidän ja X tulee?
No, ilmoituksen tärkein, me kutsutaan nämä arvot x ja y.
Me sitten siirretään ne vaihtaa seuraavasti.
X oli ensin, pilkku y.
Ja sitten, swap niitä voisi kutsua x ja y.
Mutta selvyyden, se on kutsuen heitä ja b.
Vaan ja b ovat nyt olemaan kopioita x ja y, vastaavasti.
>> Joten jos menen takaisin GDB, temp on nyt yksi ja on nyt yksi.
Mutta jos teen seuraavaksi ja nyt tehdä tulosta , on jo siirtynyt.
Maito on kaadetaan entiseen appelsiinimehua lasiin, tai päinvastoin.
>> Ja jos teen seuraavaksi uudestaan, ja nyt jos tulostan ulos järki tarkistaa,
on vielä kaksi, mutta b on nyt yksi.
Suoraan sanottuna, se on yhä olemassa.
En välitä, mitä lämpötila on.
Mutta heti kun olen nyt kirjoitat, sanokaamme, edelleen mennä takaisin, nyt olen lopussa
ohjelma.
Ja valitettavasti, x on edelleen yksi ja y on edelleen kaksi.
>> Joten mikä oli hyödyllisyys GDB siellä?
Se ei auta minua korjaamaan ongelma sinänsä,
mutta se toivottavasti auttaa minua ymmärtää sitä ymmärtämättä
että kyllä, minun logiikka on oikea, mutta minun koodi ei lopulta ottaa
pysyviä vaikutuksia.
Niin, että ongelma olemme menossa nyt ratkaista tänään.
>> Mutta katsotaanpa sinne Poiketen tästä.
Merkkijono on valhe.
Sekin, ei tietotyyppi että on olemassa C. Se
ollut synonyymi joidenkin aikaa jotain muuta,
ja voimme paljastaa, että seuraava.
>> Anna minun mennä eteenpäin ja avata kutsuttu ohjelma vertaa-0.
Ja sen sijaan kirjoita tämä yksi, alamme kulkea koodi
Olen jo kirjoittanut, mutta se on vain muutaman rivin.
Joten tämä on verrata-0.
Ja ensimmäinen asia teen on saada rivi tekstiä.
>> Mutta huomaa, mitä olen tekee ensimmäistä kertaa.
Erona selvästi noin linjan 21?
Oikeastaan, odota hetki.
Tämä on kopio kaksi.
Se ei ole edes oikea ohjelma.
Okei, spoileri hälytys.
Kunnossa, niin älä välitä siitä.
Se on vastaus tulevaisuuden kysymys.
>> Täällä on verrata-0, ja olen saamassa rivi tekstiä.
Ohjelman paljon yksinkertaisempi.
Joten tämä on yksinkertaista.
Tämä on kuin viikko yksi, Viikko Kaksi tavaraa tällä hetkellä. string s = GetString.
Nyt sanon sen taas tänne.
merkkijono t = GetString.
Ja sitten, viimeinen asia tässä ohjelma, kuten nimestäkin voi päätellä,
on Aion yrittää verrata niitä.
>> Joten jos s, ensimmäinen merkkijono, vastaa = t, niin olen
aikoo sanoa kirjoitat sama asia.
Muuta, aion sanoa kirjoitat eri asioita.
Joten kääntää ja ajaa ohjelman.
Joten vertailla nolla.
Näyttää hyvältä.
Ei kokoelma virheitä.
>> Anna minun mennä eteenpäin nyt ja kirjoita ./compare-0.
Anna minun mennä eteenpäin ja sanoa jotain : Daven ja jotain: Rob.
Ja kirjoitan eri asioita.
Toistaiseksi niin hyvä.
Ohjelma näyttää olevan oikea.
>> Mutta katsotaanpa käyttää sitä uudelleen.
Sano jotain: Gabe.
Kunnossa.
Ehkä osuin välilyöntiä tai jotain funky.
Tehdään se uudestaan.
Niin Zamyla.
Zamyla.
Eri asioita.
Joten mitä on tekeillä?
>> Joten meillä on nämä kaksi riviä koodin, GetString kutsutaan kahdesti.
Ja sitten, olen yksinkertaisesti yritä verrata s ja t.
Mutta mitä oikeastaan ​​sitten tapahtuu?
No, minun käsiala on noin teurastaa tässä esimerkissä hieman.
Ja lähdetään todella heittää tämä ylös tänne, samoin.
>> Joten meillä on linja, kuten string s = GetString.
Niin, että vain ensimmäinen mielenkiintoisen tuosta ohjelmasta.
Mutta mitä tämä kaikki aika on ollut takana tapahtuu huppu?
No, vasemmalla puolella on merkkijono, joka on tietyntyyppinen muuttuja,
ja sitä kutsutaan s.
Joten tiedän, että tämä käyttää muistia, tai RAM, minun tietokone jotenkin.
Joten aion abstraktisti piirtää että neliö.
32 bittiä, se kääntyy pois, mutta siitä lisää tulevaisuudessa.
Ja sitten, mitä tapahtuu täällä?
>> No, GetString ilmeisesti saa merkkijonon käyttäjältä.
Ja GetString sai Zamyla tai Gabe tai Daven.
Joten valita ensimmäinen niistä, jotka oli Daven.
Niin tehokkaasti, mikä GetString sai minulle, että ensimmäisessä tapauksessa oli D-V-e-n.
Ja sitten, mitä muuta teki se antaa minulle salaa?
Yleisö: [kuulumaton]
DAVID J. MALAN: Joo, / 0 tai tyhjä merkki.
Niin tehokkaasti antoi minulle merkkijono.
Mutta tiedämme jo aikaisemmista näyttää, että jono on vain joukko
merkkejä, ja se lopetettiin tätä erityistä kiinteän pisteen merkki, / 0.
>> Mutta jos tämä on totta ja tämä on neliö,
tämä on selvästi paljon suurempi suorakulmio.
Ja todellakin, tämä on, Väitän, vain 32 bittiä.
Ja tämä on selvästi enemmän kuin 32 bittiä, koska tämä on luultavasti
kahdeksan plus kahdeksan plus kahdeksan plus kahdeksan plus kahdeksan,
vain koska tavujen ASCII.
Miten hitossa aiomme sovi Daven tähän pieni laatikko täällä?
>> No, mitä GetString todella tekee?
No, tämä grid täällä edustaa tietokoneeni muistiin tai RAM.
Joten mielivaltaisesti sanoa, että jos jokainen näistä edustaa tavu,
voimme ajatella kunkin tavu olevan osoitteen,
kuten 33 Oxford Street, tai 34 Oxford Street, tai 35 Oxford Street.
>> Joten aivan kuten kodeissa on osoitteita ja rakennukset ovat osoitteita,
niin tehdä yksittäisiä tavuja muisti osoitteita tai numeroita
että yksilöllisesti tunnistaa ne.
Nyt tämä on mielivaltainen.
Mutta pitää se yksinkertainen, aion käyttää heksadesimaali- vain sopimuksen mukaan,
mutta 0x merkitse mitään muita kuin "tämä on heksadesimaali-."
ja aion vaatia, että "D" päätyy tavua Yksi muistiin.
>> Minulla ei ole mitään muuta meneillään muistia, joten Daven sai ensimmäisen paikan
klo Byte One.
Tämä siis tulee olemaan 0x2.
Tämä on menossa 0x3.
Tämä tulee olemaan 0x4.
Tämä on menossa 0x5.
Tämä tulee olemaan 0x6.
>> Mutta kun alkaa ajatella mitä tietokone tekee
alla huppu, voit alkaa päätellä
miten muutama vuosi sitten, olisi ovat toteuttaneet C itse.
Mikä on GetString luultavasti returning-- koska se
tuntuu se ei ole paluu Daven sinänsä
koska hän varmasti aio sopivaksi tässä vähän box--
joten mitä GetString todennäköisesti palaamassa?
>> Yleisö: [kuulumaton]
>> DAVID J. MALAN: sijainti Daven.
Ja se on tehnyt tätä lähtien viikko yksi.
Mikä GetString on todella paluu ei ole merkkijono, sinänsä.
Se on yksi pieni valkoinen valheita.
Se on palaamassa osoite merkkijono muistiin, yksilöllinen osoite.
Daven asuu 33 Oxford Street.
Mutta lyhyemmin, Gavin elää klo 0x1, Osoite Number One.
>> Joten mitä saa laittaa tähän pieni laatikko sitten, on selvää,
on vain osoite merkkijonon.
Joten kaikki tällä kertaa, tämä on jatkunut.
Mutta mitä tämä vihjaa nyt on, että jos kaikki s on
on numero sisällä se, kuka pysäyttää sinut, ohjelmoija,
panemasta tahansa numero mikä tahansa muuttuja ja vain hyppy
kuin kimpale muistia?
Ja todellakin, näemme se uhkaa ensi kerralla.
>> Mutta nyt tämä tuntuu riittämätön.
Jos sanon, saada minut merkkijono, annat minulle Daven.
Mutta et todellakaan anna minulle Daven.
Kaikki annatte minulle on Daven osoite.
Miten sitten tietää varmasti jossa Daven alkaa ja ends--
Tarina alkaa olla weird-- jossa Daven alkaa ja loppuu,
ja sitten, seuraava merkkijonon muistiin alkaa?
>> No, jos olet jakamassa minua alussa Daven,
olennaisesti, mistä tiedän jos lopussa hänen nimensä on?
Että erityistä null merkki, joka on entistä tärkeämpää nyt
jos jouset alla huppu ovat yksinkertaisesti tunnistettu
yksikäsitteisesti niiden sijainti muistiin.
Joten koko tämän ajan, joka on mitä on tekeillä.
>> Joten kun katsomme nyt koodi tähän, selittää
Jos haluat vian linjan 26.
Miksi Zamyla ja Zamyla erilainen?
Miksi Gabe ja Gabe erilainen?
Joo, takana.
>> Yleisö: Niillä on eri osoitteet.
>> DAVID J. MALAN: Yksinkertaisesti siksi, ne ovat eri osoitteita.
Koska kun soitat GetString jälleen, jonka minä teen nopeasti täällä,
jos tämä on toinen linja, merkkijono t, kuten tein, että ohjelman
vastaa toisen puhelun GetString.
Seuraavan kerran soitan GetString, aion
saada eri kimpale muistia.
>> GetString on sallittu kysyä toiminta
järjestelmää enemmän ja enemmän muistia.
Se ei tule käyttää samaa kuusi tavua joka ikinen kerta.
Se tulee saada uusi kimpale muistia, joka
tarkoittaa t on menossa jokin muu arvo tänne.
>> Joten kun en s vastaa = t, et ole vertaamalla
D vastaan ​​ja vastaan Tämän ja V vastaan.
Olet verrataan tämän vastaan, joka
suoraan sanottuna on melko useful-- useless-- on melko turha, koska kuka oikeasti
välittää missä jouset ovat muistissa?
>> Ja todellakin, meillä ei.
Ja emme aio aloittaa erityisen huolehtiva.
Ainoastaan ​​siinä määrin, että vikoja voi syntyä ja turvallisuusuhat voivat syntyä tahtoa
me todella alkaa välitä tästä.
Joten korjata ongelman.
Osoittautuu, voit korjata sen erittäin yksinkertaisesti.
>> Ja lähdetään itse, ennen kuin paljastaa, että jälleen, mikä olisi
et jos CS50 luokassa, ja sinun piti toteuttaa
vertaaminen kaksi merkkijonoa.
Olette selvästi voi vain käyttää s vastaa = t.
Mutta loogisesti, kuinka vertaisit tämän merkkijonon
vastaan ​​merkkijono käyttäen C-koodia?
Joo.
>> Yleisö: Just do silmukka [kuulumaton]
DAVID J. MALAN: Perfect.
Yleisö: [kuulumaton]
DAVID J. MALAN: Joo.
Just käyttää silmukka tai kun silmukka tai mitä tahansa.
Mutta vain soveltaa perusajatuksesta, että jos tämä on kimpale muistia tai array
ja tämä on, kerrata yli molemmat samaan aikaan.
Ja juuri verrata kirjaimia.
>> Ja sinun täytyy olla hieman varovainen, koska olet
halua yhden sormen ohittaa muut
koska yksi merkkijono on pitempi kuin toinen.
Niin olet menossa haluavat tarkistaa tämä erityinen arvo lopussa, null.
Mutta se todella on, että loppuun, niin yksinkertaista.
Ja suoraan sanottuna, emme tarvitse keksiä pyörän.
Tässä on versio kaksi.
Ja mitä aion sanoa tässä, että sijaan vertaamalla vertaistuki = t,
Minä sen sijaan aio sanoa, jos merkkijono vertailun n pilkuilla t on = 0.
Nyt, mitä on merkkijono vertailla?
>> On käynyt ilmi, se on toiminto, joka mukana C, jonka elämän tarkoitus
on vertailla kahta merkkijonoa.
Ja sekoita vertailla, jos luemme sen man-sivulta tai asiakirjoja tai CS50
viite, se yksinkertaisesti kertoa, että kohua
vertaa palauttaa joko negatiivinen numero tai positiivinen tai nolla,
Nolla tarkoittaa, että ne ovat yhtä.
>> Niin vain arvailua.
Mitä se voisi tarkoittaa, jos sekoita vertaa palaa
negatiivinen arvo tai positiivinen arvo?
Yleisö: suurempi tai pienempi kuin.
DAVID J. MALAN: Joo, suurempi tai pienempi kuin.
Joten jos halusi lajitella koko nippu jousille dictionary--
koska me lopulta alas road-- Virheetöntä käyttää mahdollisesti,
koska se tulee tehdä vertailu jouset sinulle, ja kertoa
teistä tekee tulee ennen b, tai ei b tulevat ennen aakkosjärjestyksessä.
Voimme tehdä juuri näin.
>> Ja huomaa, tein yhden muun asia tässä esimerkissä.
Mitä muuta on muuttunut korkeampi jopa tässä päätehtävä?
Char *.
Ja tämä on, että muut valkoinen valhe.
Kaikki tällä kertaa, kun olet kirjoittanut merkkijonon,
olemme salaa kirjoittamasta merkkijonon char * jotta kalahtaa todella
ymmärtää sinua.
>> Toisin sanoen, CS50.h ja niin me lopulta nähdä,
teimme synonyymi kutsutaan merkkijono se on sama asia kuin char *.
Ja nyt tiedän vain että *, Tässä yhteydessä, ainakin,
tarkoittaa osoite.
>> Osoite mitä?
No, se, että sanoin char *, eikä int * tai float *,
tarkoittaa, että char * on osoitteen merkkiä.
Joten tämä pieni laatikko täällä, alias merkkijono, on todella tyyppiä char *,
joka on yksinkertaisesti hieno tapa sanoa, tähän kohtaan menee osoite.
Ja mitä se osoite viittaa?
Ilmeisesti merkkiä.
>> Mutta voisimme aivan on int * ja muita asioita.
Mutta nyt, char * on oikeastaan ​​kaikkein suoraviivainen ja yksi kiinnostava.
Niin tämä ongelma on menossa nousta, vaikka, jälleen.
>> Taitaa tämän ohjelman avaamista.
Katsotaan nyt voimme ennustaa Mitä vikaa tämän koodin.
Joten tässä ohjelmassa, copy-0, olen aio mennä eteenpäin ja taas soittaa
GetString ja tallentaa arvon s.
>> Ja sitten, miksi teen tämän, aivan kuten muistutuksen viikkoa aikaisemmin?
Teimme sanoa, että GetString joskus palauttaa null.
Mitä se tarkoittaa, jos GetString palauttaa null?
Jokin meni pieleen.
Se tarkoittaa luultavasti merkkijono on liian iso, tietokoneen muisti.
Se tapahtuu super, super, super harvoin, mutta se voisi tapahtua.
Haluamme tarkistaa sitä, ja siinä kaikki teemme.
>> Koska näemme nyt, jos et aloittaa tarkkailun tavallisesti asioita
kuten null, saatat todella alkaa mennä
osoitteisiin muisti, ovat pätemättömiä.
Ja aiot aloittaa asiakkuutta enemmän ja enemmän segmentointi viat.
Tai Mac tai PC, vain saa tietokoneen ripustaa
tai ohjelma jäädyttää, mahdollisesti.
>> Joten nyt olen väittävät copy-0.c, että minä aijon kopioida nämä jousille tavalla
linjan 28.
Ja sitten, aion Patenttivaatimuksen alareunassa
tässä, että aion muuttaa yksi heistä.
>> Niin huomaa.
Soitan vanha ystävämme strlen.
Ja juuri selittää Englanti mitä tämä linja 34 tekee?
Mitä t kiinnike 0 edustavat vasemmalla.
Joo.
>> Yleisö: Ensimmäinen merkki t?
DAVID J. MALAN: Ensimmäinen merkki t.
Siinä se.
Ensimmäisen merkin t, haluan määrittää isoiksi versio
ensimmäisen merkin t.
Joten tämä on hyödyntäminen ensimmäinen kirjain.
Ja sitten, aivan viimeinen tekoni Tässä ohjelmassa on Väitän tässä
alkuperäinen, s, ja tässä on kopio, t.
>> Vaan perustuu tarinan me vain kertoi mitä kieliä todella ovat,
mikä on line 28 todella tekee ja mitä on
Tuloksena bug menossa olla ruudulla?
>> Joten ensimmäinen, ensimmäinen kysymys, 28.
Mikä on merkkijono t = s todella tekee?
Jos meillä on vasemmassa puoli tässä string t = s;
joka antaa minulle yksi laatikko täällä ja yksi laatikko täällä.
Ja kai tämä osoite on 0x, sanokaamme, 50 tällä kertaa, mielivaltaisesti.
Mitä string t = s tehdä alla huppu?
>> Yleisö: [kuulumaton]
>> DAVID J. MALAN: Se tallentaa muistiin käsitellä siellä, niin 0x50 menee sinne.
Joten jos nyt menen ensin merkki t ja isoiksi sitä,
mitä olen tehokkaasti tekee s?
Olen todella tehdä sama asia, eikö?
Koska jos Osoite 0x50-- ja vain minä ei ole paljon tilaa pöydällä täällä,
mutta olettaa, että tämä on 0x50 tänne, jonnekin minun tietokoneen muistiin.
>> Ja olen esimerkiksi Gabe pienillä täällä, kuten tämä.
Ja olen sanonut t kiinnike 0 saa aktivoitu.
No, t kiinnike 0 on ensimmäinen kirjain t.
Niin vähän g on menossa tullut iso G. Mutta ongelma
on, mitä s myös viitata?
>> Yleisö: sama.
>> DAVID J. MALAN: täsmälleen sama asia.
Niin yksinkertainen selitys ehkä, vaikka syntaksi on hieman outo.
Joten tehdään tämä.
Tehdä kopio-0 ja sitten ./copy-0.
Sano jotain: Gabe.
Ja valitettavasti, molemmat ne on nyt aktivoitu,
vaan että taustalla syystä, että olemme yksinkertaisesti
nyt tekemisissä osoitteita.
>> Niin miten alamme address-- no pun intended--
miten me vastataan tätä ongelmaa?
No, copy1.c, asiat etenevät saada hieman monimutkaisempi.
Haluaisin kuitenkin vaatia käsitteellisesti yksinkertainen ratkaisu.
>> Niin vaikea päästä ensi silmäyksellä.
Ei tule olemaan helppoa ensimmäistä kun kirjoitat sen pois, ehkä,
mutta jos ongelma on, että yksinkertaisesti tee t = s vain
kopioi osoite, mitä, uudelleen, jos voin valita sinua,
tulee olemaan ratkaisu ja oikeastaan ​​kopiointi merkkijono?
>> Yleisö: me luultavasti käyttää silmukka uudelleen.
>> DAVID J. MALAN: Joo.
Joten olemme menossa tarvitse silmukka uudelleen.
Ja koska jos haluamme kopioida merkkijonon s toiseen merkkijono,
me luultavasti halua tehdä sitä merkki kerrallaan.
Mutta ongelma on, jos tämä on alunperin s,
Nyt meidän täytyy aloittaa nimenomaisesti muistin allokointi t.
>> Toisin sanoen, nyt piirtää tämän viimeisen kerran.
Jos tämä on merkkijono s = GetString.
Ja laitetaan tämä tänne, samoin.
Tämä on GetString.
Ja sitten, kuvan jotain kuin että tulee olemaan kuin ennen,
g-a-b-e / 0.
Se näyttää vähän jotain tällaista.
Ja s siksi me kutsumme tätä 0x50, ja että tulee olemaan 51, 52.
>> Joten tämä on 0x50.
Ja sitten, en merkkijono t.
Muistiin, joka on juuri menossa antaa minulle pienen aukion näin.
Niin mitä tärkeä askel nyt?
Jos haluan kopioida s kohti t, mitä tyhjä meidän täytyy täyttää täällä?
Vai mitä meidän on tehdä korkealla tasolla?
Joo?
Joku?
Joo.
>> Yleisö: Meidän [kuultavissa].
DAVID J. MALAN: Joo, me täytyy täyttää tämä tyhjäksi.
En voi kopioida ja sitten hyödyntämään Gabe nimi
kunnes Pyydän käyttöjärjestelmä toisen kimpale muistia
joka on vähintään yhtä suuri kuin alkuperäinen.
Niin että jättää meille kysymyksen.
>> Miten Pyydän käyttöjärjestelmä ei vain yksinkertainen pikku pointer--
koska tätä kutsutaan, osoite, pointer-- ei
yksinkertainen pieni laatikko näin kutsutaan merkkijono?
Miten pyydän toiminta järjestelmä iso kimpale muistia?
Toistaiseksi olen vain saanut sen takaisin välillisesti soittamalla GetString.
Joten miten on GetString jopa saada sen muistiin?
>> No, käy ilmi, että siellä on tämä toinen toiminto täällä
että me nyt alkaa käyttää.
Nyt tämä näyttää paljon enemmän arvoituksellinen than-- ja minä olen ainoa, joka näkee se--
tämä linja näyttää paljon enemmän arvoituksellinen sen pitäisi ensi silmäyksellä.
Mutta katsotaanpa kiusaa se erilleen.
>> Vasemmalla puolella, minulla on char * t.
Niin Englanti, aloitamme muotoilla oikea lauseita teknistä ammattikieltä.
Joten tämä on kohdentaa tyyppisenä muuttujana char * nimeltään t.
Nyt, mitä se oikeastaan ​​tarkoittaa?
>> No, se tarkoittaa, mitä olen menossa laittaa tämä muuttuja nimeltään t?
Osoitteen merkkiä.
Joten se on vain yksinkertaisempi, järkevämpi tapa
kuvata vasemmalla puolella.
Jotta luodaan tämä jos täällä vain.
Joten oikea puoli, oletettavasti on menossa
myöntää, että isompi kimpale muistia miten?
Joten kiusaa tällä toisistaan.
>> Se on ylivoimainen ensi silmäyksellä, mutta mitä tapahtuu täällä sisällä?
Ensinnäkin siellä malloc, joka on ilmeisesti uusi ystävämme,
"Muisti jakaa."
Joten tämä on argumentti siirrellään siihen, niin se on aika iso argumentti.
Joten kiusaa tällä toisistaan.
>> strlen ja s, edustaa tietenkin sanot--
Yleisö: merkkien määrä.
DAVID J. MALAN: Just merkkien määrä s.
Joten pituus s, alkuperäisen merkkijonon.
Niin G-a-b-e.
Joten se on luultavasti neljä tässä tapauksessa.
Miksi minä teen +1 jälkeen soittamalla strlen S?
Yleisö: [kuulumaton]
DAVID J. MALAN: Tästä erityistä null merkki.
Jos minulta kysytään mitä pituus Gabe nimi, aion sanoa neljä.
Alla huppu, vaikka, tarvitsen että viides tavu null merkki.
Joten siksi olen tekemässä +1.
>> Nyt vain jos käytät tätä ohjelma tietokoneella muuta kuin sanoa,
CS50 laite, jos koko char
voi olla erilainen omasta computer--
Osoittautuu, että voin kutsua tätä operaattori sizeof, kysykää tietokone,
mikä on koko char tässä tietokoneessa?
>> Ja kertomalla viidellä tässä esimerkiksi koko nieriä, joka
useimmissa tietokoneissa vain yksi, malloc
aikoo myöntää minulle tämä iso kimpale muistia täällä oikealla.
Ja se tulee return-- se on function-- joten se on
aio palata mitä?
Yleisö: osoite?
DAVID J. MALAN: osoite, mitä?
Yleisö: muistin se jaetaan?
DAVID J. MALAN: Of muistia se kohdennetaan.
Joten minulla ei ole aavistustakaan, rehellisesti, mihin tämä on menossa päätyä.
Aion ehdottaa, että se tulee päätyvät 0x88.
Täysin mielivaltaista, vaan muualla kuin 0x50,
koska käyttöjärjestelmä, mikä Windows ja Mac OS tehdä minulle, on
varmista, että se antaa minua eri paloina muistia.
>> Joten tämä on arvoa, jos tämä kimpale muisti saattaa päätyä.
Joten tämä on mitä päätyy tänne, 0x88.
Joten nyt selvästi, ymmärrän , että tämä ei ole sama kuin tämä,
koska he osoittaen eri paloina muistia.
Joten jos en nyt itse halua kopioida tätä vuonna, nyt tee Ehdotettu ratkaisu.
>> Mennään vain, luoda silmukka, ja tehdä t kiinnike i saa s kiinnike i.
Koska nyt voin käyttää tämän taulukon kaltainen merkintä,
sillä vaikka malloc hyvin yleisesti jakaa minua muisti,
muisti on vain peräkkäisiä tavuja.
Tavu, tavu, tavu, takaisin takaisin takaisin.
>> Voin varmasti kuin ohjelmoija käsitellä sitä array, joka
tarkoittaa, että voin käyttää tätä vihdoin tuttuja Kaikki merkinnät ovat vain joitakin hakasulkeisiin.
>> Joten haluan tauko siellä, koska tämä on paljon kerralla, vaikka
vaikka perusajatus kertaus on merkkijono, koko tämän ajan,
ei ole uusi tietotyyppi sinänsä.
Se on vain niin sanottu osoitin, osoitteen luonne,
mikä tarkoittaa vain se numero että ihmisen yleissopimus
meillä on tapana kirjoittaa niin 0x jotain.
>> Mutta se on vain numero, kuten 33 Oxford Street,
joka sattuu olemaan CS rakennuksen osoite.
Kysyttävää nämä tiedot?
Joo?
>> Yleisö: Miksi tarkista t yhtä nollaamaan?
>> DAVID J. MALAN: Miksi tarkista t yhtä nollaamaan?
Jos luemme documentation-- suuri question-- varten malloc,
se aikoo sanoa sakon tulostaa, joskus malloc saattaa palata null,
kuten GetString.
Ja todellakin, GetString palauttaa null Jos puolestaan ​​malloc palauttaa null,
koska GetString käyttää malloc.
>> Ja se voisi tapahtua, jos OS, Mac OS, Windows riippumatta, on yksinkertaisesti
muisti ei riitä sinulle.
Niin, että mitä siellä tapahtui.
>> Ja anna minun paljastaa yksi asia että voi vain puhaltaa mieltäsi
tai kokonaan olla liian kaukana yli linjan.
Mutta haluan vetää ylös sama silmukka kopiointiin,
joka hetki sitten, takaisinkutsu tätä. t kiinnike i saa s kiinnike i.
>> Mukava ja käyttäjäystävällinen.
Tuntuu Viikko Kaksi uudelleen.
Mutta tämä versio todella voi olla kirjoittaa uudelleen tämä, joka näyttää arvoituksellinen.
Se on tekniikkaa kutsutaan osoittimen aritmeettinen, osoite aritmeettinen.
Mutta miksi tämä toimii?
>> Nyt ärsyttävän, laatijat C päätynyt
* symboli eri tarkoituksiin.
Olemme nähneet sitä käytetään jo kerran, char *, joka tarkoittaa "antaa minulle muuttuja
että menee sisältävät osoitteen merkkiä. "
Joten char * tässä yhteydessä tarkoittaa "anna minulle muuttuja."
>> Valitettavasti, jos käytät * ilman sana sen eteen, kuten nieriä,
se on nyt nimeltään dereference operaattori.
Ja näemme lisää tämän ennen pitkää.
Mutta se vain tarkoittaa "mene sinne."
Se on kuin sanoisi, jos joku ojensi minulle pala paperia "33 Oxford Street,"
jos teen "* 33 Oxford Street," joka tarkoittaa "Mennä tiellä CS rakennukseen."
>> Joten * tarkoittaa vain mennä sinne, jos ei ole sanaa sen edessä.
Joten mikä on t, olla selvillä?
t on osoite kimpale muisti, joka sai takaisin minulle.
s on osoite, mitä, tehdä selväksi, esimerkissä olemme keskustelleet,
on pieniä Gabe?
s on osoite of--
Yleisö: merkkijono.
DAVID J. MALAN: Gabe alkuperäinen nimi.
Joten se osoite tämä kimpale muistia.
Joten jos sanon t + minä-- i, huomautus, on vain vanha tuttu.
Se on vain indeksimuuttujaa joka on iteroimalla nollasta ylös
pituuden merkkijonon s.
Joten se tulee olemaan nolla, yksi, sitten kaksi, sitten kolme, sitten neljä.
Joten koota nämä uudet Naarmunkaltainen palapelin palaset, jos haluatte,
vaikka jälleen syntaksin on paljon mystistä kuin tyhjästä.
Joten t on osoitteesi + i ei aio antaa minulle
numero, koska nämä ovat kaikki numeroita että olemme piirustuksen hex.
Mutta ne ovat vain numeroita.
>> Joten jos osoite t sanoimme oli 0x88, mitä 0x88 plus nolla.
Vaikka et ole tyytyväinen kanssa hex vielä arvata.
>> Yleisö: alkuperäinen.
>> DAVID J. MALAN: Still 0x88.
Joten mitä * 0x88 tarkoittaa?
Se tarkoittaa, "mene sinne", joka tarkoittaa tehokkaasti ", laita sormesi tänne."
Ja nyt oikealla puolella tätä ilmaisua, * ja sitten parens,
t + i tarkoittaa s, mikä on käsitellä täällä pikku g.
s + 0 on, tietenkin, s, mikä s on.
>> Joten nyt se on * s, joka aivan kuten * 33 Oxford Streetin tarkoittaa mene osoitteeseen
s.
Joten tässä on tämä sormi, oikea käsi.
Joten mitä aion kopioida mitä?
Asia oikealla, joka on Gabe, pikku g täällä, osaksi täällä.
>> Ja niin vaikutus, että ensimmäinen iterointia silmukan,
kun ehdotettu, vaikka se näyttää hullu monimutkaisempi kuin mitään
olemme nähneet ennen, on yksinkertaisesti sanomalla täältä ja kopioi että hahmo täällä.
Se antaa sinulle kartan molemmissa paikoissa.
>> Ja näemme paljon enemmän tästä.
Mutta nyt, toivo on vain käyttöön joitakin näistä perusajatuksia.
Ja todellakin, katsotaanpa yksi lopullinen ohjelma täältä,
ja sitten lupasi claymation, joka tekee kaikki kunnossa.
Kunnossa.
Joten anna minun avata up-- sinne mennään.
Joten anna minulle-- Palaamme Tämän kuvan ennen pitkää.
Saanen avata tämän lopullisen esimerkiksi täältä.
>> Joten tässä on super, super ohjelma, joka saa aikaan
ei mitään elämässä, joka tekee seuraavaa.
Ensin kaksi muuttujaa, x ja y, jotka eivät ole numeroita tällä kertaa,
sinänsä.
He eivät ole kokonaislukuja, sinänsä.
Ne ovat ilmeisesti int *.
Niin juuri kukaan, mitä se tarkoittaa jos tietosi tyyppi, muuttuja,
on tyyppiä int * tähden?
Tuo osoite int.
>> Joten minulla ei ole aavistustakaan, missä se on vielä.
Se vain tarkoittaa "laittaa, lopulta, osoite int täällä. "
0x50, 0x88, missä se on muisti, osoite sinne.
Ja sitähän y on olemaan, samoin.
>> Jos minä nyt sanon x = malloc (sizeof (int)), tämä on hieno tapa sanoa,
hei käyttöjärjestelmän kautta malloc, anna minulle tarpeeksi muistia koko
ja int, joka on luultavasti olemaan 32 bittiä tai neljä tavua.
>> Joten mitä malloc palaa?
Malloc palauttaa osoitteen.
Joten mitä tulee varastoidaan x?
Osoite kimpale muistin, neljä tavua, että malloc
juuri löytänyt minulle pyytämällä käyttöjärjestelmä.
>> Nyt välin linja neljä täällä, * x = 42.
Vain olla selvää, mitä tapahtuu siellä?
Vasemmalla puolella, * x.
joka on kuin * 33 Oxford Street.
Joten * x tarkoittaa mitä?
>> Yleisö: Mene.
>> DAVID J. MALAN: Mene osoitteeseen.
Silloin kun kimpale muisti on, siirry siihen.
Ja laittaa mitä siellä ilmeisesti?
Yleisö: 42.
DAVID J. MALAN: 42.
Okei, * y, saman ajatuksen.
Mene osoitteeseen y.
Laita numero 13 siellä, mutta mikä on y tällä hetkellä?
Yleisö: Ei ole muisti y.
DAVID J. MALAN: Ei ei muisti y.
Joten mitä y luultavasti sisältävät, kuten olemme sanoneet?
>> Yleisö: Garbage.
>> DAVID J. MALAN: Jotkut roskat arvo.
Nyt roskat arvo on edelleen numero.
Se voi silti erehtyä luulemaan osoite.
Se on kuin joku intiimissä jotain alas,
ja olen tulkinnut sen tarkoittavan jonkin rakennuksen kadulla.
Ja jos vain yrittää mennä jonkin rakennuksen et omista,
tai jotkut kimpale muistia et ole annettu, pahoja asioita voi tapahtua.
Tietokone saattaa kaatua, tai jokin muu määrittelemätön käytös voi tapahtua.
>> Niin intro, sitten, että Binky on tämä.
Muistan vieläkin, 20 Jostain kumman vuotta myöhemmin,
missä olin, kun sain vihdoin ymmärretty viitteitä.
>> Toisin sanoen, jos lähteä täältä kolmessa minuutissa
ja mielestäni ei ymmärtää osoittimia, ymmärtää
Olen muistetaan 20 vuotta jostain hullu syystä
milloin ja miksi se lopulta upposi in, istuu minun opetus
kaveri, Nishat Mehta vuonna takana Eliot ruokasalissa.
Nyt olen muistanut tämä koska tämä oli
yksi aiheista, minä vuonna Erityisesti kamppaillut.
Ja sitten se lopulta napsautetaan, kuten uskallan sanoa paljon aiheita
lopulta.
Ja nyt tehdä, että tuntuu kaikki onnellisempia ja sitäkin vakuuttavampi,
Otetaanpa lopullisen ilmeen meidän kolmen viimeisen minuutin täällä Binky,
ystävämme, Nick Parlante Stanford.
>> [VIDEOTOISTOSTA]
>> Hei, Binky.
Herää!
On aika osoitin hauskaa.
>> Mitä se on?
Oppia viitteitä?
Voi Goody!
>> -No, Päästä alkuun, taidamme menossa on pari viitteitä.
>> -OK.
Tämä koodi myönnetään kaksi osoittimia, mikä voi viitata kokonaislukuja.
-OK.
No, näen kaksi osoitinta, mutta ne eivät näytä osoittavan mitään.
>> -Näinhän.
Aluksi osoittimet eivät viittaa mihinkään.
Mitä he viittaavat kutsutaan pointees, ja ne asetettaisiin n
erillisessä vaiheessa.
>> -Voi, Oikea, oikea.
Tiesin, että.
Pointees ovat erillisiä.
Er, joten miten jakaa pointee?
>> -OK.
No, tämä koodi kohdentaa uusi kokonaisluku pointee,
ja tämä osa sarjaa x osoittamaan sitä.
>> Hei, että näyttää paremmalta.
Tee siitä jotain.
>> -OK.
Tulen dereference osoitin X Tallenna numero 42 osaksi pointee.
Tämän tempun, minä tarvitsen Taikasauva on Dereferencing.
>> -Your Taikasauva of Dereferencing?
That-- se on hienoa.
>> -Tämä on mitä koodi näyttää.
Olen juuri perustanut numero, ja [POP]
>> Hei, katso.
Siellä se menee.
>> -Joten Tekee dereference on x seuraa nuolta käyttää sen pointee.
Tällöin myymälä 42 siellä.
Hei kokeile sitä tallentaa numeron 13 kautta muille osoitin, y.
>> -OK.
Menen tänne y, ja saada numero 13 perustaa.
Ja sitten, ottaa sauvaa Dereferencing ja vain [BUZZ]
>> -Voi!
>> -Voi Hei!
Se ei toimi.
Sano, Binky, en usko dereferencing y on hyvä idea, koska tiedät,
perustamalla pointee on erillisessä vaiheessa.
Ja en usko meidän koskaan tehnyt sitä.
>> -good Kohta.
Niin.
Me jaetaan osoittimen y, mutta me koskaan aseta se osoittamaan pointee.
>> -very Tarkkaavainen.
Hei, etsit hyvä siellä, Binky.
Voitko korjata sen niin, että y pistettä samaan pointee kuin x?
>> Totta kai.
Minä käytän taikasauva Pointer Tehtävä.
>> Onko tuo olemaan ongelma kuin ennen?
Ei.
Tämä ei koske pointees.
Se vain muuttaa yhden osoittimen viittaavat sama asia kuin toinen.
>> -Voi Näen.
Nyt y viittaa samaan paikkaan kuin x.
Niin odota.
Nyt y on kiinteä.
Se on pointee.
Joten voit kokeilla sauvaa Dereferencing jälleen lähettää 13 yli.
>> -Uh, OK.
Täällä se menee. [POP]
>> Hei, katso tuota.
Nyt dereferencing teosten y.
Ja koska osoittimet jakavat että yksi pointee, he molemmat katso 13.
Niin.
Jakaminen riippumatta.
Joten aiomme vaihtaa paikkaa nyt?
>> Katsokaa.
Olemme loppuu aika.
>> -But--
>> -Vain Muistaa kolme osoitinta sääntöjä.
Number One, perusrakenne on, että sinulla on osoitin,
ja se osoittaa yli pointee.
Mutta osoitinta ja pointee ovat erillisiä,
ja yleinen virhe on perustaa osoitin,
mutta unohtaa antaa sille pointee.
>> Number Two, osoitin dereferencing alkaa osoittimen
ja seuraa sen nuolta yli käyttää sen pointee.
Kuten me kaikki tiedämme, tämä toimii vain, jos on
pointee, millaisia saa takaisin Sääntö yksi.
>> Numero kolme, osoitin toimeksianto kestää yhden osoittimen
ja muuttaa sen osoittamaan sama pointee kuin toinen osoitin.
Joten luovutuksen jälkeen, kaksi osoitinta
tulee osoittaa samaan pointee.
Joskus sitä kutsutaan jakaminen.
Ja että kaikki on sitä, todella.
Bye-bye nyt.
[END VIDEOTOISTOSTA]
DAVID J. MALAN: Se on se CS50.
Nähdään ensi viikolla.