>> [Muziciranja]
DAVID J. Malan: U redu.
To je CS50, i to je kraj četiri tjedna.
A jedna od tema danas je da digitalne forenzike,
umjetnost oporavlja podatke.
I doista, iako ti si u sredini
upravo sada mira na tri i bijeg, sljedeći tjedan,
Fokus će biti na upravo to područje.
>> Tako je jedan od najboljih poslova koje sam ikada imao je još u srednjoj školi,
kad sam radio za lokalno Middlesex County okružnog tužitelja
ured, rade forenzika raditi.
Dakle, u suštini, Massachusetts Državna policija, na prigodu,
kada se radi o slučajevima bi dovesti u stvarima kao što tvrde diskove
i diskete i memorijske kartice i slično.
I oni će ih predati meni i mojim mentorom,
a naš je cilj bio pronaći dokaze, ako je bilo, na tim medijima.
Sada, možda ste vidjeli bljeskovi ovoga svijeta forenzike
u medijima, serije i filmove.
No, posao koji sam imao, i pretpostavljam da je svijet,
nije baš kao što bi ga vidjeti.
Uzmimo pogled na ono što vjerojatno ste vidjeli.
[Video reprodukciju]
-OK.
Sada, neka je dobiti dobar pogled na vas.
>> [Muziciranja]
>> -Stanite.
Trčanje to natrag.
>> Čekaj malo.
Idi u pravu.
-Tamo.
Zaustavite.
Full-screen.
>> -OK.
Zaustavite.
-Tighten Se na to, hoćeš li?
>> -Vector In na koji momak po stražnjem kotaču.
>> -Zoom U upravo ovdje na ovom mjestu.
>> -S Pravom opremom, slike se mogu uvećati i izoštriti.
>> Što je to?
>> -To Poboljšanja programa.
>> Možeš li jasno da se bilo?
>> Ne znam.
Idemo ga poboljšati.
>> -Enhance Odjeljak A6.
Ja poboljšane detalje, i--
-Mislim Ima dovoljno kako bi se poboljšala.
Pustite ga da se moj zaslon.
>> -Ja Pojačan odraz u njezinim očima.
-Učinimo Pokrenuti to kroz Video pojašnjenje.
>> -Edgar, Možete poboljšati to?
>> -Hang Dalje.
>> -Ja Radili na tom promišljanju.
>> Tamo je nečiji odraz.
>> -Reflection.
Tamo je odraz čovjekovog lica.
>> -The Odraz!
Tamo je odraz.
-Zoom U na ogledalu.
Možete vidjeti svoj odraz.
>> Možeš li poboljšati sliku odavde?
Možeš li ga poboljšati?
Mogu se poboljšala ovo?
Možeš li ga poboljšati?
-Drži Na sekundu.
Ja ću se poboljšala.
-Zoom U na vrata.
-Times 10.
-Zoom.
Pokret u.
-Više.
Čekaj, stani.
Prestani.
-Pause Ga.
-Rotate Nam 75 stupnjeva oko vertikalne, molim te.
>> Prestani.
Vratite se u dijelu oko vrata opet.
>> -Razumijem Sliku pojačivač koji može bitmapa?
>> Možda možemo koristiti Pradeep Singh Metoda vidjeti u prozore.
>> -The Softver je stanje u umjetnosti.
>> -The Svojstvena je isključen.
>> -S Prava Kombinacija algorithms--
>> Krenuo je uzeti osvjetljenje algoritama na sljedeću razinu,
i mogu ih koristiti za unaprijediti ovu fotografiju.
>> -Lock Na i povećanje z-osi.
>> -Enhance.
Poboljšajte.
-Enhance.
-Freeze I unaprijediti.
[END video reprodukciju]
DAVID J. Malan: Dakle, to su sve riječi, ali oni nisu bili
koristi u rečenicama ispravno.
I doista u budućnosti, u bilo koje vrijeme, molim vas, ne čujete da netko kaže riječ,
"Poboljšati", cerekanje samo malo.
Jer kada bi pokušati povećati, Na primjer, to je ono što se događa.
>> Dakle, ovdje je prekrasna slika.
Ovo je CS50 vlastiti Daven.
I pretpostavimo da smo htjeli usredotočiti se na tren u svom oku,
ili odraz negativac koji je očito
zarobljeni od strane sigurnosnih kamera.
To je ono što se događa kada zumirate sliku koja
ima samo ograničen broj bitova povezane s njom.
>> To je ono što će doći.
I doista, u Daven oku je, ali četiri, možda šest piksela
kako sastaviti točno što je svjetlucave postoji.
Dakle, problem je postavio četiri će u konačnici imati što istraživati ​​ovaj svijet, osobito
po prirodi nečega zovemo file I / O, gdje
I / O je samo fancy način rekavši ulaz i izlaz.
>> Dakle, do sada, sve interakcije smo imali s računalom
bili su velikim dijelom sa svojim tipkovnica i zaslon,
ali ne toliko s tvrdog diska, ili spremanja datoteka pored onih koje
sami napisati.
Vaši programi do sada imaju ne stvaraju, i štedi,
i ažuriranje vlastite datoteke.
>> Pa, što je datoteka?
Pa, nešto poput JPEG.
To je slika koju bi mogao imate ili uploadati na Facebook,
ili vidjeti bilo gdje na webu.
Doista, da smo samo fotografiju Pila od Daven je JPEG.
I što je zanimljivo O datoteka kao što su JPEG
da se mogu identificirati, obično, po određenim obrascima bitova.
>> Drugim riječima, što je to što razlikuje od JPEG GIF
iz PING iz Riječi Dokument iz Excel datoteke?
Pa, to je samo drugačiji obrasci bitova.
I oni su različiti obrasci obično na početku tih datoteka.
>> Tako da kada vaše računalo otvara Word doc, ili kada računalo otvara JPEG,
izgleda obično na Prvih nekoliko bitova u datoteci.
A ako se prepoznaje uzorak, ona kaže, oh, ovo je slika.
Dopustite mi da ga prikazati na korisnik kao grafičkim.
Ili, oh, ovo izgleda kao Word doc.
Dopustite mi da to pokazati na korisnika kao esej.
>> Tako, primjerice, JPEG, ispada, su
prilično sofisticiran ispod haube.
No, prva tri bajta u većini drugih JPEG početi s ova tri broja.
Dakle bajt nula, jedan, a dva su, u najviše svaki JPEG, 255, zatim broj
216, a zatim broj 255.
>> A što ćete biti u mogućnosti početi raditi idući tjedan
je zapravo viri ispod napa datoteka kao što su JPEG
i kao bitmap datoteke, i gledajući ono što je uvijek bio tamo dokle
kao što ste bili pomoću računala.
>> Ali što je tu je nije tipično pisani kao decimalnih brojeva kao što je ovaj.
Računalni znanstvenici ne imaju tendenciju da se govori u decimale.
Oni zapravo ne govori u binarnom.
Obično, kada želimo izraziti brojevima,
mi zapravo koristiti heksadecimalni, koje mogu sjetiti
od, recimo, Problem Set Jedan, koji je izazvao
što da mislim o drugom sustavu.
>> Mi, naravno, upoznati s decimale, nula do devet.
Razgovarali smo o binarnom.
A mi zapravo nemamo koristiti toliko ovdje
na van, jer računala će koristiti.
No, programeri će vrlo često, ali ne uvijek,
koristiti heksadecimalni, što samo znači imate 16 slova u svom pismu,
za razliku od dva ili 10.
>> Pa kako se računati na veći od devet u heksadecimalnom?
Polaska 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, , B, C, D, E, F, samo po konvenciji.
No, ono što je ključno je da svaki od tih je jedan simbol.
Nema 10.
Nema 11, sam po sebi, jer svaki vaših brojki, baš kao u decimale
i baš kao u binarnom, samo treba biti jedan znak, po konvenciji.
>> Pa da onda je abeceda imamo na raspolaganju za heksadecimalni.
Dakle, što to JPEG izgledati ako vas bilo bi napisati tih prvih tri
Ne bajtova kao decimale, ali, Na primjer, kao što je heksadecimalnom?
A zašto je hex čak sve to korisno?
>> Pa, brzi pogled na primjer.
Dakle, ako sam napisati bitove koji predstavljaju ove decimale numbers--
to bi moglo biti malo zahrđao Sada od nekoliko tjedana vratio,
ali lijeva i pravi su prilično lako.
255 bio je najveći broj smo moglo predstavljati s osam bitova.
To je sve one.
Dakle, jedina koja je blago Zanimljivo je srednji.
A ako ste vrsta napraviti iz matematike, što će zaključiti da je, štoviše,
da je uzorak od jednog i nule predstavlja 216.
Pa neka je samo propisuje za Sada da su točne.
Ali zašto je to zanimljivo?
>> Pa, bajt, naravno, je osam bitova.
I ispada da ako mislite od bajt kao dva komada četiri bita,
kao što je ovaj.
Dopustite mi samo dodati neki prostor.
Dakle, prije, poslije.
Upravo sam dodao malo bijelog prostora Radi vizualizacije je ovdje.
Kako bismo mogli sada predstavlja u, recimo, heksadecimalni svaki quad bitova,
Svaki set od četiri bita?
>> Tako, primjerice, na lijevoj Sada imamo 1111 u binarnom.
Što je taj broj u decimale, ako to učinite iz matematike?
Imate one mjesto, dvojke mjesto, četveronoške mjesto, a osmice mjesto.
>> PUBLIKA: 15.
DAVID J. Malan: To je 15.
Dakle, ako nam je činiti osam plus četiri plus dva plus jedan, dobivamo 15.
Tako sam mogao zapisati 15 u nastavku 1111, ali cijela stvar ovdje
je heksadecimalni, ne decimala.
Dakle, umjesto zapisivao 15, 1-5, Ja ću napisati da je u hex,
što ako mislite vratiti, ako imate nula kroz F, što je 15 će biti?
PUBLIKA: f.
DAVID J. Malan: Tako ispada da je f.
A možete raditi da se govoreći: Pa, ako je 10, onda u redu, f 15.
Dakle, doista, možemo prepisati taj isti skup brojeva kao f f.
A onda, ako ćemo napraviti malo matematike, ćemo zaključiti da je to d.
Osam je prilično jednostavan, jer mi ima jedan u Mau mjestu.
A onda, imamo par više F F-a.
>> Dakle, ono što ljudi imaju tendenciju da se dogovorno kada koriste heksadecimalni je oni samo
pisati ovo malo više jezgrovito, riješiti većinu tog bijelog prostora.
I samo da se super jasno čitatelji da je ovo heksadecimalni,
jednostavna konvencija među ljudi je li pisati nulu
x, koja nema drugo značenje nego vizualni identifikator,
Ovdje dolazi hex broj.
>> A onda, stavite dvije znamenke, f F je u ovom slučaju, tada D, zatim F F.
Dakle, ne duljimo, heksadecimalni baš sklon
da su korisni, jer je svaki od njegovog znamenki, nula do f, savršeno linije
s uzorkom od četiri bita.
>> Dakle, ako imate dva heksadecimalni znamenke, nula kroz F, opet i opet,
koji vam daje savršeno osam bitova ili jedan bajt.
Dakle, to je razlog zašto je sklon biti konvencionalno korisna.
Nema intelektualnog Sadržaj stvarno iza toga,
osim njegove stvarne korisnosti.
>> Sada JPEG nisu samo datoteku formata za grafiku.
Možda ćete se sjetiti da postoje datoteka kao što su to u svijetu,
barem od nekoliko godina unatrag.
>> Dakle, ovo je zapravo instaliran u sustavu Windows XP
na milijune računala diljem svijeta.
A to je bitmap datoteka, BMP.
I bitmap datoteka, kao što ćete vidjeti sljedeći tjedan, samo znači uzorak točaka,
piksela što oni nazivaju, preslikati na komadiće, stvarno.
>> Dakle, ono što je zanimljivo, iako, o ovom formatu, BMP, je
da je ispod haube, to ima više od samo tri bajta
da sastavite svoje zaglavlje, tako govoriti, prvih nekoliko ugriza.
To zapravo izgleda malo komplicirano na prvi pogled.
A to ćete vidjeti u P setu.
I sve nešto Posebno se to sada
nije toliko važno, jer samo činjenice da na početku svakog bitmapi
datoteka, grafičkom obliku, postoji cijela hrpa brojeva.
>> Sada Microsoft, Autor ovog formata,
sklon nazvati onima Stvari nisu ori- i znakova
i pluta, ali riječi i D riječi i čezne i bajtova.
Dakle, to su samo različite vrste podataka.
Oni su različita imena za istu stvar.
No, vidjet ćete da je u P postavio četiri.
>> Ali to je samo reći da ako čovjeka dvaput klikne neki bmp na njegov
ili njezin hard disk, a prozor do njega ili nju da se slika pokazuje,
što se dogodilo, jer je operativni Sustav vjerojatno primijetili, ne samo
Proširenje .BMP datoteke u nazivu datoteke,
ali i činjenica da postoji neki Konvencija za uzorak bitova
na samom početku tog bitmap datoteku.
>> Ali neka se sada usredotočiti na kao komplicirana datoteke,
ali umjesto na takvo nešto.
Recimo ovdje u gedit, ja samo početak
programa koji je prilično jednostavna.
Imam ih i uključuje do vrha.
Sada imam # include "structs.h", ali Vratit ću se na to u trenutku.
No, to je korisno za sada.
Dakle, ovo je program koje će provoditi
Poput matičara baze podataka.
Dakle, baza podataka o studentima, a svaki student na svijetu
ima ime i kuću, a vjerojatno i neki druge stvari, ali ćemo ga zadržati jednostavan.
Svaki student ima ime i kuću.
>> Dakle, ako sam htio napisati Program čiji je cilj u životu
Upravo se ponoviti od usredotočiti na do tri,
ako ima tri učenika na Sveučilištu Harvard.
A ja samo želim da se, koristeći GetString, ime i kuća svakog studenta,
i onda samo ispisati one out.
>> To je nešto poput tjedna Jedan, dva tjedna stvari sada,
gdje sam samo želim za petlje ili nešto slično.
I želim pozvati GetString malo puta, a zatim ispisati f nekoliko puta.
Pa kako bih mogao to učiniti, ipak, kada su i ime i kuću
uključeni su za svakog studenta?
>> Tako je moj prvi instinkt možda biti nešto poput ovoga.
Sam prvi put moglo bi se reći, dobro, daj mi, kažu, niz žice pod nazivom imena.
A ja ne želim hardcode trojica ovdje.
Što želim staviti tamo?
Dakle STUDENTI, jer to je samo konstantna proglasio na vrhu,
Upravo tako ja ne moram hardcode tri na više mjesta.
Na taj način, mogu ga promijeniti jedno mjesto, i to utječe na promjenu posvuda.
A onda, ja mogu učiniti Niz kuće studentima.
>> A sada, ja mogu učiniti nešto slično za (int i = 0; i <studenti, i ++.
Pa ja sam tipkati brzo, ali to je vjerojatno upoznati sintaksa sada.
>> A sada, to je novijeg datuma.
Ako želim staviti u i-og Ime studenta, mislim da sam to učiniti.
A onda, a ne imena ali kuće zagrada ja.
Ja to učiniti, GetString, i neka ja vratiti se i ispraviti ovu liniju.
Slažem?
Ne slažem?
To nije vrlo razumljiv.
Nisam rekla korisniku što da radi.
>> Ali sada, ako sam također Htio kasnije, ajmo
recimo, ispis te stvari greda-- tako TODO kasnije.
Ja ću učiniti više s ovo-- to nedvojbeno jest
ispravna primjena uzimajući imena i kuće, tri
od kojih je svaki ukupno od korisnika.
>> No, to nije vrlo dobar dizajn, zar ne?
Što ako učenik ima ne samo ime i kuća, ali i matični broj,
i telefonski broj, i e-mail adresu,
a možda i početna stranica, a Možda Twitter ručka,
i bilo koji broj drugih detalja povezani sa studentom ili osobe,
općenito.
Kako bi se početi dodavati Funkcionalnost ovom programu?
>> Pa, ja se osjećam kao na najjednostavniji način možda biti nešto poput, recimo,
int IDS studenti.
Dakle, ja mogu staviti sve svoje osobne iskaznice tamo.
I onda, za nešto kao što su telefonski brojevi,
Nisam siguran kako predstavljaju da su samo još.
Tako ćemo ići naprijed i samo poziv to twitters učenika, koji
je malo čudno, ali-- i hrpa više polja.
>> Ja sam počeo da učinkovito kopirati i zalijepiti ovdje.
A to će rasti prilično nezgrapan prilično brzo, zar ne?
Zar ne bi bilo lijepo kad bi bilo u svijetu poznata struktura podataka
Ne kao int ili niza, ali nešto višu razinu, apstrakcija, tako
govoriti, poznat kao student?
C nije došao s ugrađenim funkcionalnost za studente,
ali što ako sam htjela dati ga kao?
>> Pa, ispostavilo se, da ću otvoriti datoteku pod nazivom structs.h ovdje,
a vi možete učiniti upravo to.
A mi ćemo početi raditi ovo sada.
A ispod haube P postavila tri, već ste se to sada radi.
Ne postoji takva stvar kao g rect ili g ovalni u programskom jeziku C.
>> Ljudi na Stanfordu provodi onima vrste podataka koristeći ovaj pristup ovdje,
izjavljujući svoju novu podatke Vrste koje koriste novu ključnu riječ
nazvao struct i drugi jedan se zove typedef.
I doista, iako sintaksa izgleda malo drugačije od stvari
što smo vidjeli prije, u Princip, to je super jednostavna.
>> To samo znači "odrediti vrstu."
To će biti struktura, a struktura
je kao kontejner za više stvari.
I da struktura ide imati niz zove ime,
i niz naziva kuću.
I nazovimo, samo za praktičnost, cijela ova struktura podataka studenta.
>> Dakle, u trenutku kada se na zarez, imate sada
stvorili svoj vlastiti podatke Tip se zove studentski
kako sada stoji uz bok int, i plutaju, a char i string,
i g izravni, te g ovalni, i bilo koji broj od ostalog ljudi su izmislili.
>> Dakle, ono što je korisno o tome Trenutno je da, ako se vratim
na ročito 0 i završiti ovo provedba, što sam napisao
Unaprijed ovdje, primijetiti da su sve od neizbježnog nereda koji
tek treba početi događa kao što sam dodao telefonski brojevi i twitters i sve
ove ostale stvari za definicija studenta,
Sada je jezgrovito je zavrsio kao što je samo jedan niz studenata.
>> I svaki od tih studenata sada Ima više stvari unutar nje.
Tako da samo ostavlja jedno pitanje.
Kako ste dobili na ime, i kuća, i ID,
i bilo što drugo je unutar studenta?
Super jednostavno, kao.
Novi sintakse, ali jednostavna ideja.
>> Vi jednostavno indeks u nizu, kao što smo učinili prošli tjedan i to.
A ono što je očito Novi komad sintakse?
Samo., Što znači "ići unutra Struktura i dobiti polje naziva
ime, dobili na terenu pod nazivom kuća, se polje zove učenik. "
>> Tako je u P postavila tri, ako si Još uvijek radimo na tome,
i većina ljudi još uvijek se, shvatiti da kao i vi
početi koristiti stvari poput g rects i G ovali
i druge stvari koje se ne čini da dolaze iz tjedna nijedan, jedan ili dva,
shvatiti da je to zato što Stanford proglasio neke nove vrste podataka.
>> I doista, to je upravo ono što ćemo učiniti, kao i, u P je postavio četiri, kada
počinjemo se baviti stvarima kao što su slike, bitmape, i još mnogo toga.
Dakle, to je samo teaser i mentalni model za ono što dolazi.
Sada, ja procrastinated Malo je jutros.
Bio sam vrsta znatiželjan vidjeti što Microsoft je pozadina zapravo
izgleda danas.
I ispada da netko u 2006 zapravo otišao u gotovo precizno
Isto mjesto za fotografiranje u stvarnosti ono što izgleda kao da je ovih dana.
Polje je sada malo zarastao.
>> Dakle, govoreći sada slika, ajmo vratiti Daven ovdje
na zaslonu i Nikole, i samo da vas podsjetim
da, ako želite da nam se pridružite za ručak ovaj petak, voditeljica na našoj uobičajenoj URL
ovdje.
>> Dakle, gdje smo stali u ponedjeljak?
Uveli smo ovaj problem, zar ne?
To je naizgled točna provedba zamjene,
gdje ste uzimanje dva ints, jedan se zove, jedan se zove b,
mijenjati ih, baš kao i Laura je ovdje na pozornici s mlijekom i vodom,
pomoću privremenog varijabla, ili prazna čaša,
kako bismo mogli staviti B u i A u b bez nered.
Koristili smo varijablu.
To se zove temp.
>> No, ono što je temeljno Problem s ovim kodom u ponedjeljak?
Što je bio problem?
Da.
>> PUBLIKA: Ona zauzima više prostora.
>> DAVID J. Malan: zauzima više prostor, jer ja sam koristeći varijablu,
i to je u redu.
To je istina, ali ja sam će reći da je to u redu.
To je samo 32 bita u Grand poretku stvari, tako da nije velika stvar.
Ostali misli?
PUBLIKA: To je samo swaps varijable na lokalnoj razini.
DAVID J. Malan: Točno.
To je samo swaps varijable na lokalnoj razini.
Jer svaki put kad poziv function-- kada sam imao ladice iz Annenberg
zadnji put, imate glavni na dnu.
Čim pozvati funkciju nazvanu swap, swap ne dobijete X i Y,
izvorne vrijednosti.
Što potrebi zamijenite dobiti, nije mi tvrditi?
Publika: primjeraka.
DAVID J. Malan: Pa kopija njih.
Tako se dobiva jedan i dva, ako vas podsjetiti na primjer iz prošlog vremena,
ali kopija jedan i dva koji su uspješno zamijenio.
No, na žalost, na kraju, Te vrijednosti su još uvijek isti.
Tako možemo vidjeti s našim novi prijatelj, nadamo GDB,
da ili TFS i CA imaju bila vodilja prema kako slijedi.
>> Dakle, nema zamjena Podsjetimo izgleda volimo-članovima Let otvoriti ovo-- izgleda ovako.
Inicijaliziranu smo x na jednu, y na dva.
Da je hrpa ispisa F-a.
Ali onda, tipku za poziv Ovdje je na swap, koji
je upravo kod nas Upravo sam vidio trenutak prije.
Koji je točno na prvi pogled, ali funkcionalno,
Ovaj program ne radi, jer je ne trajno zamijeniti X i Y.
>> Tako ćemo vidjeti, brzo toplo ovdje s GDB, a ./noswap.
Hrpa neodoljiv informacija koje Ja ću se riješiti s kontrolom L za sada.
A sada, ja ću ići naprijed i pokrenuti ga.
I na žalost, da je nije to korisno.
To vodio program unutar toga Program pod nazivom GDB, program za ispravljanje pogrešaka,
ali to nije neka mi džaku okolo.
>> Pa kako se ja zapravo pauzirati Izvršenje unutar ovog programa?
Dakle slomiti.
I ja sam mogao slomiti na bilo Linija broj jedan, 10, 15.
Ali ja se također može slomiti simbolično rekavši prijelom Main.
I to će se postaviti pauzu točka, očito na liniji 16 u glavnom.
A gdje je linija 16?
Idemo do koda i otići do noswap.
I doista, linija 16 je Prvi u programu.
>> Pa sad, ako sam ići naprijed i tip pokrenuti ovaj put, Enter, ona zastala.
Tako ćemo džaku okolo.
Ispis x-- zašto je x nula?
A ignorirati znak za dolar.
To je samo za ljubitelj Korištenje programa.
Zašto je x nula u ovom trenutku?
Da.
>> PUBLIKA: Ona zastane neposredno prije Linija 16, a ne zapravo na liniji 16.
DAVID J. Malan: Točno.
GDB, po defaultu, je zastao Izvršenje prije linije 16.
Dakle, to nije izvršen, što znači X je od neke nepoznate vrijednosti.
A mi se posrećilo da je nešto čisto kao nulu.
Pa sad, ako sam upisati sljedeći, Sada je izvršen 16.
To me čeka izvršiti 17.
Dopustite mi ići naprijed i ispis x.
To je jedno.
Dopustite mi ići naprijed i ispis y.
Što sam trebao vidjeti sada?
>> PUBLIKA: [nečujan]
>> DAVID J. Malan: malo glasnije.
>> PUBLIKA: [nečujan]
DAVID J. Malan: Ne baš konsenzus.
Tako da, vidimo neke smeća vrijednost.
Sada, y je 134514064 postoji.
Pa, to je samo neki smeća vrijednost.
Moj program koristi RAM za različite svrhe.
Ima drugih funkcija.
Drugi ljudi pisao u mom računalu.
Dakle, ti bitovi su korišteni za druge vrijednosti, i što vidim
je ostatke nekih Prije uporabe te memorije.
>> Dakle, nije velika stvar, jer čim kao što sam upisati sljedeći, a zatim y ispisati,
to je inicijalno vrijednost koju želim.
Pa sad, idemo naprijed malo brže.
N za sljedeći.
Idemo to učiniti opet.
Ali ja ne želim pogoditi je ovdje, jer ako sam
žele vidjeti što se događa unutar swapa, što je naredba?
>> PUBLIKA: koraci.
>> DAVID J. Malan: koraci.
Dakle, ovo mi je korake u funkciju, radije nego preko njega.
I sad, to je malo zagonetan iskreno, ali to je samo
mi govori da sam u liniji 33 danas.
I neka je to učiniti opet.
Ispis temp.
Smeće vrijednost, negativna ovaj put, ali to je samo još vrijednost smeća.
Tako ćemo učiniti, ispis temp.
To je inicijalno 1, što je vrijednost x, zvani.
>> Sada, gdje su naši i X dolazi?
Pa, primjećuju u glavni, mi naziva tih vrijednosti x i y.
Zatim smo prošli da ih zamijene na sljedeći način.
X došao prvi, zarez y.
A onda, zamjena mogla ih zvati X i Y.
Ali radi jasnoće, to je nazivajući ih ib.
No, i b su sada će biti kopije X i Y, respektivno.
>> Dakle, ako sam se vratiti u GDB, temp sada je jedan i sada je jedan.
Ali, ako sam učiniti i sada napraviti print , već je premještena više.
Mlijeka razlivena u bivšem Sok od naranče je staklo, ili obrnuto.
>> A ako sam učiniti opet, a sada ako sam isprintati kao provjera uračunljivosti,
još dva, ali b je sada jedan.
Iskreno, to je još uvijek tamo.
Ne zanima me što je temp.
No, čim sam sada upisati, recimo, i dalje se vratiti, sad sam na kraju
Program.
I na žalost, je x još jedan i y još dva.
>> Dakle, ono što je korisnost GDB tamo?
Nije mi pomoći popraviti problem per se,
ali nadamo se mi pomoći razumijem realizacijom
da da, moja logika je u pravu, ali moj broj nije u konačnici vlasništvo
trajni učinak.
Dakle, to je problem smo će se sada riješiti danas.
>> Ali neka je doći preko toga.
String je laž.
Ona, također, nije tip podataka koja postoji u C. To je
bio sinonim za neke Vrijeme je za nešto drugo,
a možemo otkriti da je na sljedeći način.
>> Dopustite mi ići naprijed i otvoriti Program pod nazivom usporediti-0.
I umjesto da upišete ovo, ćemo početi hodati kroz kod
Već sam napisao, ali To je samo nekoliko redaka.
Dakle, ovo je usporedba-0.
I prvo što radim postaje jedan redak teksta.
>> Ali primijetiti ono što sam radi po prvi put.
Ono što je drugačije jasno o liniji 21?
Zapravo, čekaj malo.
To je kopija dva.
To čak nije ni pravi program.
U redu, spojler na oprezu.
U redu, tako da nikada ne misli da je.
To je odgovor na pitanje budućnosti.
>> Ovdje je usporedba-0, i ja sam o da biste dobili jedan redak teksta.
Program je mnogo jednostavnije.
Dakle, to je jednostavno.
To je kao Week One, Week Two stvari u ovom trenutku. String s = GetString.
Sada, ja to kažem opet ovdje.
Niz t = GetString.
A onda, zadnja stvar u tome Program, kao što mu ime sugerira,
se da ću pokušati ih usporediti.
>> Dakle, ako ih, prvi niz, iznosi = T, onda sam
reći upišete istu stvar.
Inače, ja ću reći upišete različite stvari.
Tako ćemo sastaviti i pokrenuti ovaj program.
Tako bi usporediti nuli.
Izgleda dobro.
Nema kompilaciju pogreške.
>> Dopustite mi ići naprijed sada i upišite ./compare-0.
Dopustite mi ići naprijed i reći nešto : Daven i nešto: Rob.
I sam upisati različite stvari.
Do sada, tako dobro.
Program čini se da je točna.
>> No, budimo ponovno pokrenuti.
Reci nešto: Gabea.
U redu.
Možda sam pogodio razmaknica ili nešto funky.
Idemo to učiniti opet.
Dakle Zamyla.
Zamyla.
Različite stvari.
Dakle, što se događa?
>> Dakle, imamo ove dvije linije broj, GetString se zove dva puta.
A onda, ja sam jednostavno pokušavate uspoređivati ​​s i t.
No, ono što je stvarno onda se događa?
Pa, moj rukopis je o mesnica ovaj primjer nešto.
I neka je zapravo bacanje ovo ovdje, kao dobro.
>> Dakle, imamo liniju poput String s = GetString.
Dakle, to je jednostavno prvi Zanimljivo linija iz tog programa.
Ali što sve ovo vrijeme nije bilo događa ispod haube?
Pa, na lijevoj strani je niz, koji je neki tip varijable,
i to se zove s.
Dakle, znam da je to pomoću memorije, ili RAM-a, u mom računalu nekako.
Tako ću apstraktno nacrtao kao trg.
32 bita, ispada, ali više o tome u budućnosti.
A onda, što se događa ovdje?
>> Pa, očito GetString dobiva niz od korisnika.
I GetString dobio Zamyla ili Gabe ili Daven.
Tako ćemo izabrati prvi od onih, koji je bio Daven.
Dakle, učinkovito, što GetString dobio ja u tom prvom slučaju je D--V-e-nje.
A onda, što još nije to mi dati tajno?
PUBLIKA: [nečujan]
DAVID J. Malan: Da, / 0 ili null karakter.
Tako da mi je dao niz učinkovito.
Ali, već znamo iz prethodnih Izgleda da je samo niz polje
znakova, i to je prestalo Ova posebna Sentinel likovima / 0.
>> Ali ako je to istina i to je trg,
ovo je očito puno veći pravokutnik.
I doista, to je, Tvrdim, samo 32 bita.
A to je očito više od 32 bita, jer je to vjerojatno
osam plus osam plus osam plus osam plus osam,
Upravo zbog bajtova u ASCII.
Kako dovraga ćemo stati Daven u ovoj maloj kutiji ovdje?
>> Pa, što je GetString zapravo radi?
Pa, ova rešetka ovdje predstavlja memorije mog računala ili RAM-a.
Tako ćemo proizvoljno reći da, ako svaki od njih predstavlja bajt,
onda možemo razmišljati o svakoj Bajt kao vlasništvo adresu,
kao 33 Oxford Streetu, ili 34 Oxford Street, ili 35 Oxford Street.
>> Dakle, baš kao i stanovi imaju adrese i zgrade imaju adrese,
tako se pojedine bajtova memorije imaju adrese ili brojeve
da ih jedinstveno identificirati.
Sada, to je proizvoljna.
No, da i dalje ostane jednostavna, idem koristiti heksadecimalni samo konvencije,
ali 0x ne znači ništa drugo nego "to je heksadecimalni."
i ja ću tvrditi da "D" završi na Byte One u memoriji.
>> Ja nemam ništa drugo događa u memorije, pa Daven dobio prvo mjesto
na Byte One.
To je, dakle, neće biti u 0x2.
To će se 0x3.
To će biti 0x4.
To će se 0x5.
To će biti 0x6.
>> Ali jednom kada počnete razmišljati o tome što radiš računala
ispod haube, možete početi zaključiti
Kako vas, prije nekoliko godina, bi implementirali C sebe.
Što je vjerojatno GetString returning-- zbog nje
osjeća kao da to nije vraća Daven po sebi
jer on sigurno ne ide da stane u ovaj mali box--
Dakle, što je GetString vjerojatno vraća?
>> PUBLIKA: [nečujan]
>> DAVID J. Malan: Položaj Daven.
I to je to otkad Week One.
Što GetString stvarno povratka nije niz, po sebi.
To je jedan od malih bijelih laži.
To je povratak adresu niz u memoriji, jedinstvena adresa.
Daven živi na 33 Oxford Streetu.
Ali više jezgrovito, Gavin živi na 0x1, Adresa Broj Jedan.
>> Dakle, ono što se stavi u to mala kutija tada, da bude jasno,
je samo adresu tog niza.
Dakle, sve ovo vrijeme, ovo traje već.
No, što to ukazuje na Trenutno je da, ako sve S ima
je broj unutar nje, koji je zaustaviti, programer,
od stavljanja bilo koji broj u bilo koja varijabla i samo skakanje
na taj komad memorije?
I doista, vidjet ćemo to je prijetnja sljedeći put.
>> Ali za sada, to se osjeća nedovoljno.
Ako kažem, me niz, daj mi Daven.
Ali ti stvarno ne mi dati Daven.
Sve što mi je dati Daven je adresa.
Kako da onda znam sigurno gdje Daven počinje i ends--
Priča postaje sve weird-- gdje Daven počinje i završava,
zatim, slijedeći niz u memoriji počinje?
>> Pa, ako ste predaje ja početak Daven,
u biti, koliko ja znam Gdje je kraj njegovog imena?
Ta posebna null karakter, koji je je sve važnija sada
ako žice ispod napa su jednostavno identificirati
jedinstveno po svojoj poziciji u memoriji.
Dakle, sve ovo vrijeme, to je ono što se događa.
>> Dakle, kada gledamo sada na kod ovdje, objasni
ako bi bug u liniji 26.
Zašto je Zamyla i Zamyla drugačije?
Zašto je Gabe i Gabe drugačije?
Da, u leđima.
>> PUBLIKA: Oni imaju različite adrese.
>> DAVID J. Malan: Jednostavno zato oni imaju različite adrese.
Jer kada zvati GetString opet, što ću učiniti brzo ovdje,
ako je to druga linija, niz t, kao što sam učinio u tom programu,
jednaka je još jedan poziv GetString.
Sljedeći put ću zvati GetString, idem
dobiti drugačiji komad memorije.
>> GetString dopušteno pitati radom
Sustav za više i više memorije.
To se neće ponovno ista šest bajtova svaki put.
To će dobiti novi komad memorije, što
znači t će dobiti neka druga vrijednost ovamo.
>> Dakle, kada radim s jednako = t, ne uspoređujete
D protiv toga i protiv ovo i V. protiv toga.
Vi uspoređujete to Nasuprot tome, što
iskreno je prilično useful-- useless-- je prilično beskoristan, jer tko stvarno
brine gdje su žice su u sjećanju?
>> I doista, nismo.
A mi ne idemo u početi posebno brige.
Samo do te mjere da pogreške mogu nastati i sigurnosne prijetnje mogu nastati volju
mi zapravo početi voditi brigu o tome.
Tako ćemo riješiti ovaj problem.
Ispada, da ga popraviti super jednostavno.
>> I neka je zapravo, prije nego što sam ponovno otkrivaju da, što bi
što učiniti ako u razredu CS50, a vi morali provesti
Usporedba protiv dvije žice.
Vi očito ne može samo koristiti i iznosi = T.
No, baš logično, kako bi li usporediti ovaj niz
Protiv ovog niza koristeći C koda?
Da.
>> PUBLIKA: Dovoljno je učiniti za petlju [nečujan]
DAVID J. Malan: Savršen.
PUBLIKA: [nečujan]
DAVID J. Malan: Da.
Dovoljno je koristiti za petlje ili dok petlje ili bilo što drugo.
Ali primjenjuje samo osnovnu ideju da, ako to je komad memorije ili niz
i to je, ponoviti više i u isto vrijeme.
I samo usporediti slova.
>> I moraš biti malo oprezni, jer vas
Ne želim jedan prst proći pokraj drugoga
jer je jedna struna dulje od druge.
Dakle, vi ćete želite provjeriti Ova posebna vrijednost na kraju, null.
Ali to je stvarno, u kraj, kao jednostavan kao taj.
I iskreno, ne trebamo domisliti da kotač.
Ovdje je verzija dva.
A ono što ću reći je da umjesto da se uspoređujete S jednak = T,
Ja sam umjesto toga ću reći, ako je niz Usporedba s zarezom t = 0 jednaka.
Sada, što je niz usporediti?
>> Ispada, da je funkcija koja dolazi s C, čija je svrha u životu
je usporediti dvije žice.
I promiješati usporedbu, ako čitamo njegova Čovjek stranica ili dokumentaciju ili CS50
referenca, to će jednostavno vam reći da promiješati
usporediti vraća bilo negativnih broj ili pozitivan broj ili nula,
gdje je nula znači da su jednaki.
>> Tako je samo nagađanje.
Što bi to značilo, ako promiješati usporedbu vraća
negativna vrijednost ili pozitivna vrijednost?
PUBLIKA: Veće ili manje od.
DAVID J. Malan: Da, veći ili manji od.
Dakle, ako ste htjeli sortirati cjelinu hrpa nizova u dictionary--
Kao što ćemo na kraju niz road-- savršena funkcija za korištenje potencijalno,
jer će to učiniti Usporedba žice za vas, i recite
što ne dolazi prije B, ili ne b dolaze prije po abecedi.
Mi možemo učiniti upravo to.
>> I primijetiti sam jednu drugu što je u ovom primjeru.
Što drugo se promijenilo veća u ovoj glavnoj funkciji?
Char *.
A to je da su druge bijele laži.
Sve ovo vrijeme, kad ste bio pisanje niz,
smo potajno prepisivanjem string kao char *, tako da zapravo Zveket
razumije vas.
>> Drugim riječima, u CS50.h i kao što smo na kraju ćemo vidjeti,
smo napravili sinonim zove string to je ista stvar kao char *.
A za sada, znamo samo da je *, U ovom kontekstu, barem
znači adresu.
>> Adresa čega?
Pa, činjenica da sam rekao char *, a ne * int ili float *,
znači da je char * adresa char.
Dakle, ovaj mali box ovdje, zvani string, stvarno tipa char *,
koji je jednostavno fancy način govoreći, U ovoj kutiji će ići adresu.
A što znači da je adresa odnosila?
Očigledno, char.
>> Ali što smo mogli apsolutno imaju int * i druge stvari.
Ali za sada, char * stvarno najviše jednostavan i jedan od interesa.
Dakle, taj problem će rasti, iako, opet.
>> Pretpostavimo da sam otvoriti ovaj program.
Da vidimo sada možemo predvidjeti što nije u redu s ovim brojem.
Tako je u ovom programu, kopirati-0, ja sam ići naprijed i opet pozvati
GetString i pohraniti vrijednost u sekundi.
>> I onda, zašto to radim, Samo kao podsjetnik iz prošlosti tjedna?
Napravili smo rekli da GetString ponekad vraća null.
Što to znači, ako GetString vraća null?
Nešto je pošlo po zlu.
To vjerojatno znači niz je previše Veliki, kompjutora iz memorije.
To se događa super, super, super Rijetko, ali to bi se moglo dogoditi.
Želimo provjeriti za to, i to je sve što radimo.
>> Zato ćemo sada vidjeti, ako ne početi provjeru redovito za stvari
poput null, možda ćete zapravo početi ići
na adrese u memoriji da su netočni.
I ti ćeš početi izazivanja sve više i više segmentacija smetnji.
Ili na Mac ili PC, samo uzrokujući računalo objesiti
ili program za zamrzavanje, potencijalno.
>> Pa sad, ja tvrdim u copy-0.c, da sam ću kopirati ove konce putem
resornih 28.
A onda, idem patentnom zahtjevu pri dnu
Ovdje da idem za promjenu jedan od njih.
>> Dakle primijetiti.
Zovem naš stari prijatelj strlen.
I samo objasniti na engleskom jeziku Što ovaj redak 34 radi?
Što t nosač 0 predstavlja lijevo.
Da.
>> PUBLIKA: Prvo karakter t?
DAVID J. Malan: Prvo karakter t.
To je sve.
Prvi znak t, želim dodijeliti veliko verziju
na prvi znak u t.
Dakle, ovo je kapitaliziranje Prvo slovo.
A onda, vrlo posljednja stvar mi je činiti U ovaj program je Tvrdim evo
izvorni, S, i ovdje je kopija, t.
>> No, temelji na priči mi samo rekli o tome što žice stvarno jesu,
ono što je linija 28 stvarno radi, i što je
rezultiralo bug ide biti na ekranu?
>> Dakle, prvo, prvo pitanje, 28.
Što se niz t = s stvarno radi?
Ako imamo na lijevom strana ovdje niz t = s;
to mi daje jednu kutiju tu i jedna kutija ovdje.
I pretpostavljam da ova adresa je 0x, recimo, 50 ovaj put, samovoljno.
Što znači niz t = S napraviti ispod haube?
>> PUBLIKA: [nečujan]
>> DAVID J. Malan: Ona pohranjuje memorije adresu tamo, tako da 0x50 ide tamo.
Dakle, ako sada idem na prvi lik u t i velika slova ga,
Što ja djelotvorno raditi u S?
Ja sam stvarno radi istu stvar, zar ne?
Jer ako Adresa 0x50-- i samo ja nemaju puno prostora na brodu ovdje,
ali pretpostavljaju da je ova 0x50 ovdje dolje, negdje u memoriji mog računala.
>> I ja sam, na primjer, Gabe u mala slova ovdje, kao što je ovaj.
I što sam rekao t nosač 0 dobiva kapitaliziraju.
Pa, t nosač 0 je Prvo slovo ut.
Dakle, malo g ide postati veliki G. No, problem
je, što se također s Point se?
>> PUBLIKA: ista.
>> DAVID J. Malan: Ista stvar točna.
Tako jednostavno objašnjenje možda, čak i ako je sintaksa je malo čudno.
Tako ćemo to učiniti.
Napravite copy-0, a zatim ./copy-0.
Reci nešto: Gabea.
I na žalost, obojica im sada su kapitaliziraju,
ali za to temeljne Razlog da smo naprosto
Sada se bavi adrese.
>> Pa kako ćemo početi address-- nema dosjetka intended--
kako ćemo se početi baviti ovaj problem?
Pa, u copy1.c, stvari idu da se malo kompliciranije.
Ali ja bih tvrditi konceptualno jednostavno rješenje.
>> Dakle, teško da se na prvi pogled.
Ne će biti lako za prvi Vrijeme što ga tip iz, možda,
ali ako je problem što jednostavno radi T = je samo
kopira adresa, što, opet, ako ja mogu pokupiti na vas,
će biti rješenje za kopiranje zapravo niz?
>> PUBLIKA: Vjerojatno ćemo koristiti petlju ponovno.
>> DAVID J. Malan: Da.
Tako ćemo morati petlju ponovno.
I zato, ako želimo kopirati Niz e u drugi string,
vjerojatno želite učiniti slovo po slovo.
No, problem je, ako To je izvorno s,
sada moramo početi izričito dodjele memorije za t.
>> Drugim riječima, neka je iscrtavanje ovaj posljednji put.
Ako je ovo String s = GetString.
I neka je stavi to ovdje, kao dobro.
To je GetString.
A onda, slike za nešto kao da će biti kao i prije,
G-A-B-E / 0.
To izgleda malo nešto poput ovoga.
A e, dakle, mi to nazivamo 0x50, a to će biti 51, 52.
>> Dakle, to je 0x50.
A onda, ja string t.
U sjećanju, to je samo idući u daj mi malo kvadrat ovako.
Dakle, što je ključni korak sad?
Ako želim kopirati S u t, što prazno trebamo ispuniti ovdje?
Ili ono što trebamo učiniti na visokoj razini?
Da?
Netko?
Da.
>> PUBLIKA: Moramo [nečujan].
DAVID J. Malan: Da, mi potrebno je popuniti prazno.
Ja se ne mogu kopirati, a zatim kapitalizirati Gabe ime
dok se ja pitam operacijski sustav za još jedan komad memorije
to je najmanje što je velik kao i original.
Tako da nas ostavlja s pitanjem.
>> Kako mogu pitati operativni sustav ne samo za jednostavne malo pointer--
jer to se zove, adresa, pointer-- ne
za jednostavnu kutijica kao što je ovaj nazvao niz?
Kako mogu pitati radom Sustav za veliki komad memorije?
Do sada sam samo dobio to natrag posredno pozivom GetString.
Kako je tako GetString čak i uzimajući svoju memoriju?
>> Pa, ispada da postoji ova druga funkcija ovdje
da smo sada ću početi koristiti.
Sada, ovo izgleda više zagonetan način than-- i ja sam jedini koji može vidjeti it--
Ova linija izgleda više zagonetan način onda bi trebao na prvi pogled.
Ali budimo zafrkavati apart.
>> Na lijevoj strani, moram char * t.
Dakle, na engleskom jeziku, počnimo formulirati odgovarajuće kazne u tehničkom žargonu.
Dakle, ovo je dodjelom varijabla tipa char * nazvao t.
Sada, što to zapravo znači?
>> Pa, to znači da je, što ću staviti u ovom varijablu t?
Adresa char.
Dakle, to je samo jednostavnije, više razuman način
opisivanja lijevu stranu.
Tako da stvara ovaj okvir ovdje samo.
Dakle, desna strana, vjerojatno, ide
izdvojiti da je veći komad memorije kako?
Tako ćemo zafrkavati ovaj apart.
>> To je neodoljiv na prvi pogled, No, ono što se događa unutar ovdje?
Prvo, tu je malloc, koji je očito naš novi prijatelj,
"Memorije izdvojiti."
Dakle, to je argument koji se prenose u njega, tako da je prilično velika rasprava.
Tako ćemo zafrkavati ovaj apart.
>> strlen S, naravno, predstavlja do-
PUBLIKA: broj znakova.
DAVID J. Malan: Samo Broj znakova u sekundi.
Dakle, duljina s, izvorni niz.
Dakle, G-A-B-E.
Dakle, to je vjerojatno i četiri u ovom slučaju.
Zašto ja to radim +1 nakon nazivajući strlen od S?
PUBLIKA: [nečujan]
DAVID J. Malan: Za to Posebna null karakter.
Ako me pitate što je duljina Gabe ime, ja ću reći četiri.
Ispod poklopca motora, iako, moram da je peti Bajt za nultu karaktera.
Dakle, to je razlog zašto radim na +1.
>> Sada samo u slučaju da se radi toga Program na računalu, osim, recimo,
CS50 aparata, gdje je veličina char
moglo biti drugačije Iz vlastitog computer--
Ispada da ja mogu zvati Operater sizeof, samo pitajte računalo,
ono što je veličina char na ovom računalu?
>> I množenjem pet u to Primjer veličinom char koje
na većini računala će Samo je jedna, malloc
će se izdvojiti za mene je ovo veliki komad memorije ovdje na desnoj strani.
I to će se return-- to je function-- tako da je
će se vratiti na mene što?
PUBLIKA: adresa?
DAVID J. Malan: adresa čega?
PUBLIKA: Od sjećanja se dodjeljuje?
DAVID J. Malan: Od memorije je dodijeljeno.
Dakle, nemam pojma, iskreno, gdje to će završiti.
Ja ću predložiti da to će završiti na 0x88.
Potpuno proizvoljna, ali negdje osim 0x50,
jer operativni sustav, što Windows i Mac OS učiniti za mene, je
pobrinite se da je davanje mi različite komade RAM-a.
>> Dakle, ovo je vrijednost u kojoj to komad memorije moglo završiti.
Dakle, to je ono što završi ovdje, 0x88.
Dakle, sada je jasno, ja mogu razumjeti da to nije isto kao i ovaj,
jer oni pokazujući na različite komade memorije.
Dakle, ako sam sad zapravo žele kopirati ovaj u, neka je učiniti vaš ponuđeno rješenje.
>> Idemo, stvoriti za petlju, i to t nosač ja dobiva e nosač sam.
Budući da sada mogu koristiti Taj niz poput zapis,
jer iako vrlo malloc općenito mi alocira memoriju,
Memorija je samo uzastopnih bajtova.
Bajt, bajt, bajt, vratio se natrag na leđa.
>> Ja sigurno mogu kao programer tretirati ga kao polje, koje
znači ja mogu koristiti ovu konačno upoznati zapis od samo nekoliko četvornih tipkovnici.
>> Pa neka mi pauzirati, jer to je puno odjednom, i
iako je osnovna ideja da se recap je da je niz, sve ovo vrijeme,
nije nova vrsta podataka po sebi.
To je samo tzv pokazivač, adresu karaktera,
što samo znači da je broj da su ljudske konvencije
skloni smo pisati kao 0x nešto.
>> Ali to je samo broj, kao 33 Oxford Street,
koja bi trebala iznositi Adresa CS zgrade.
Bilo kakva pitanja o tim detaljima?
Da?
>> PUBLIKA: Zašto smo provjeriti učiniti za t jednak nulu?
>> DAVID J. Malan: zašto radimo provjeriti t jednaka null?
Ako čitamo documentation-- Veliki question-- za malloc,
to će reći u sitnim slovima, Ponekad malloc mogli vratiti null,
baš kao GetString.
I doista, GetString vraća null Ako je, s druge strane, malloc vraća nula,
jer GetString koristi malloc.
>> A to bi se moglo dogoditi ako OS, Mac OS, Windows, što god, je jednostavno
iz memorije za vas.
Dakle, to je ono što se tamo dogodilo.
>> I neka mi otkriti jednu drugu stvar da samo može vas oduševiti
ili u potpunosti biti previše daleko iznad crte.
No, dopustite mi podići isto za petlje za kopiranje,
koji je prije nekoliko trenutaka, podsjetimo bio ovo. T nosač ja dobiva e nosač sam.
>> Lijepo i razumljiv.
Osjeća kao tjedan dva opet.
No ova verzija zapravo može biti prepisivati ​​kao ovaj, koji izgleda zagonetan.
To je tehnika naziva se kazaljka aritmetika, adresa aritmetika.
Ali zašto ovo radi?
>> Sada dosadno, Autori C odlučio se na
* simbol za različite svrhe.
Vidjeli smo što je nekad već jednom, char *, što znači "daj mi varijablu
koji će sadržavati adresa char. "
Dakle, char * u tom kontekstu znači "daj mi varijablu."
>> Nažalost, ako koristite * Bez Riječ ispred njega, kao što su char,
sada se zove dereference operatera.
A vidjet ćemo još ovoga prije dugo.
No, to samo znači "ići tamo."
To je kao da kažete, ako me netko predao na komad papira "33 Oxford Street"
ako mi je činiti "* 33 Oxford Street", to znači da "Ide niz cestu na CS zgrade."
>> Dakle * samo znači ići tamo, ako Nema riječi ispred njega.
Dakle, što je t, da bude jasno?
t je adresa na komad memorije koji je dobio natrag na mene.
e je adresa ono, da bude jasno, U primjeru smo raspravljalo,
od malih Gabe?
e je adresa of--
PUBLIKA: niz.
DAVID J. Malan: Od Gabe je izvorni naziv.
Dakle, to je adresa ovaj komad memorije.
Dakle, ako ja kažem t + Ja-- ja, obavijest, samo je naš stari prijatelj.
To je samo varijabla indeksa koji je iterating od nule na gore
duljini niza S.
Dakle, to će biti nula, onda se, zatim dva, zatim tri, pa četiri.
Tako ćemo okupiti ove nove Scratch poput slagalice, ako hoćete,
iako, opet, sintaksa je daleko više kompliciranih od nule.
Tako t je adresa + I ide mi dati
broj, jer to su sve Brojevi koje smo crtež kao hex.
No, to su samo brojke.
>> Dakle, ako adresa t mi je rekao bio 0x88, što je 0x88 plus nula.
Čak i ako vam se ne sviđa s hex još, pokušajte pogoditi.
>> PUBLIKA: originalna.
>> DAVID J. Malan: Ipak 0x88.
Dakle, što to znači * 0x88?
To znači, "tamo", što znači učinkovito, "staviti prst ovamo."
A sada na desnoj strani od Ovaj izraz, * a potom u parens,
S + I znači S, koja je obratiti ovdje na malo g gore.
e + 0 je, naravno, s, s je god.
>> Tako sada, to je * s, koji baš kao i * 33 Oxford Street znači otići na adresu
e.
Dakle, ovdje je to prst, desna ruka.
Dakle, ono što ću kopirati u što?
Stvar na desnoj strani, koji je Gabe, malo g ovdje, u ovdje.
>> I tako učinak koji Prva iteracija petlje,
kao što je predložila, iako to izgleda luda složeniji od bilo čega
što smo vidjeli prije, jednostavno govoreći ići ovdje i kopirati taj lik ovdje.
To ti daje kartu na obje lokacije.
>> I vidjet ćemo mnogo više od toga.
Ali za sada, nadam se samo da predstaviti neke od tih osnovnih ideja.
I doista, pogledajmo jedan konačni program ovdje,
a zatim obećao claymation, koji će učiniti sve u redu.
U redu.
Pa neka mi otvoriti tu idemo up--.
Pa neka me-- ćemo se vratiti na ovoj slici ne zadugo.
Dopustite mi da se otvori taj posljednji primjer ovdje.
>> Dakle, ovdje je super, super program koji ostvaruje
ništa u životu koji će napraviti sljedeće.
Prvi put deklarira dvije varijable, X i y, koji nisu brojevi ovaj put,
po sebi.
Oni nisu cijeli brojevi, sami po sebi.
Oni su očito int *.
Dakle, bilo tko, što to znači Ako vaš tip podataka, vaš promjenjiva,
je tipa int * zvijezde?
To je adresa int.
>> Dakle, nemam pojma gdje je još.
To samo znači "staviti, na kraju, adresu int ovdje. "
0x50, 0x88, gdje god je to u memorije, adresa ide tamo.
I to je ono što je y će biti, kao dobro.
>> Ako ja sada kažem x = malloc (sizeof (int)), ovo je fancy način govoreći,
hej operacijski sustav, putem malloc, daj mi dovoljno memorije za veličinu
od int, što je vjerojatno će biti 32 bita ili četiri bajta.
>> Pa što ne vraća malloc?
Malloc vraća adresu.
Dakle, što će se pohranjuju u X?
Adresu komad memorije, četiri bajta, koji malloc
upravo pronašao za mene pitajući operativni sustav.
>> Sada međuvremenu, linija četiri ovdje, * x = 42.
Samo da bude jasno, Što se događa tamo dolje?
Na lijevoj strani, * x.
to je kao * 33 Oxford Streetu.
Dakle * x znači što?
>> PUBLIKA: Idite na.
>> DAVID J. Malan: Idi na tu adresu.
Gdje god da je komad memorija, ići na njega.
I stavi ono što postoji, očito?
PUBLIKA: 42.
DAVID J. Malan: 42.
U redu, * y, ista ideja.
Idi na adresi u y.
Stavite broj 13 ima, ali ono što je y u ovom trenutku?
PUBLIKA: Nema memorije za y.
DAVID J. Malan: Postoji nema memorije za y.
Dakle, ono što se vjerojatno y sadrže, kao što smo rekli?
>> PUBLIKA: Garbage.
>> DAVID J. Malan: Neki smeća vrijednost.
Sada, smeće vrijednost je i dalje broj.
To još uvijek može biti u zabludi za adresu.
To je kao da je netko pisao nešto dolje,
i ja ga krivo protumačena kao značenju Neki zgrada niz ulicu.
A ako ste samo pokušati ići u Neki zgrada ne posjedujete,
ili neki komad memorije imate ne dano, loše stvari mogu dogoditi.
Računalo može srušiti, ili neki drugi neodređen ponašanje moglo dogoditi.
>> Dakle uvod, a zatim, kako bi Binky je to.
Još uvijek se sjećam, 20 neki ak godina kasnije,
gdje sam bio kad sam napokon razumio naputke.
>> Što će reći, ako ostavite ovdje u tri minute
i mislim da ne razumije naputke, shvatite
Ja sam se sjetio za 20 godine za nekog ludog razloga
kada i zašto je konačno potonuo u, sjedi s mojim nastave
kolega, Nishat Mehta u Stražnji dio Eliot blagovaonici.
Sad sam se sjetila to, jer je to bio
jedna od tema sam, u Konkretno, borili sa.
I onda, konačno kliknuli, kao što sam se usudio reći puno tema
na kraju će.
A sada, da bi se to osjetiti sve sretniji i sve uvjerljivije,
neka je konačni izgled u našem Posljednje tri minute ovdje na Binky,
od našeg prijatelja, Nick Parlante iz Stanforda.
>> [Video reprodukciju]
>> Hej, Binky.
Probudite se!
To je vrijeme za zabavu kazaljke.
>> Što je to?
Saznajte više o pokazivače?
Oh, slatkiši!
>> Pa, za početak, mislim da smo Trebat će par savjeta.
>> -OK.
Ovaj kod izdvaja dva pointera, što može ukazivati ​​na cijelih brojeva.
-OK.
Pa, vidim dva naputke, ali oni Ne čini se da ukazuju na ništa.
>> -Točno.
U početku, pokazivače ne ukazuju na ništa.
Stvari su ukazivale na nazivaju pointees, te ih postavljate-a
zaseban korak.
>> Oh, da, da.
Znao sam da je.
U pointees su odvojeni.
Hm, pa kako se izdvojiti pointee?
>> -OK.
Pa, ovaj kod izdvaja Novi broj pointee,
i ovom dijelu seta x ukazati na njega.
>> Hej, da izgleda bolje.
Tako bi se nešto učiniti.
>> -OK.
Ja ću dereference pokazivača x za pohraniti broj 42 u svojoj pointee.
Za ovaj trik, ja ću morati mom Čarobni štapić od Dereferencing.
>> -Vaš Čarobni štapić od Dereferencing?
To-- to je super.
>> -Ovo Je ono što kod izgleda.
Ja ću samo postaviti broj i [Pop]
>> Hej, gledaj.
Tamo to ide.
>> Znači radi se o dereference x slijedi strelica za pristup svoj pointee.
U tom slučaju, trgovina 42 unutra.
Hej pokušajte ga koristiti za pohranu broj 13 kroz druge pokazivača, y.
>> -OK.
Ja ću samo ići ovdje na Y, i dobiti broj 13 set up.
A onda, uzeti štap od Dereferencing i samo [BUZZ]
>> Oh!
>> Oh, hej!
To nije uspjelo.
Recimo, Binky, ja ne mislim da dereferencing y je dobra ideja, jer znate,
postavljanje pointee je zasebna korak.
I ne mislim da smo ikada to učinio.
>> Dobro točka.
Da.
Dodijeljeno smo pokazivača y, ali mi Nikada ga postaviti ukazati na pointee.
>> Vrlo pažljiv.
Hej, ti si izgleda dobro tamo, Binky.
Možete li to popraviti, tako da y bodova na isto pointee kao X?
>> Sigurno.
Ja ću koristiti svoj čarobni štapić od Pointer zadatak.
>> -Je Da će biti Problem kao prije?
Ne.
To ne dirajte pointees.
To samo mijenja jedan pokazivač ukazuju na istu stvar kao i drugi.
>> Oh, vidim.
Sada y ukazuje na istom mjestu kao X.
Dakle čekati.
Sada, y je fiksna.
Ima pointee.
Na taj način možete isprobati štap od Opet Dereferencing poslati 13 više.
>> -Uh, U redu.
Ovdje to ide. [POP]
>> Hej, vidi ovo.
Sada dereferencing radove na y.
I zato što su pokazivači dijele da je jedan pointee, obojica vidjeli 13.
Da.
Dijeljenje, god.
Tako ćemo se prebaciti mjesta sada?
>> Oh, vidi.
Nemamo više vremena.
>> -But--
>> Samo zapamtite tri pokazivača pravila.
Broj Jedan, osnovna struktura je da imate pokazivač,
i to ukazuje više na pointee.
Ali pokazivač i pointee su odvojeni,
i uobičajena pogreška je postaviti pokazivač,
ali zaboraviti dati ga pointee.
>> Broj Dva, pokazivač dereferencing počinje u pokazivača
i slijedi svoj strelicu nad pristupiti njegovu pointee.
Kao što svi znamo, to radi samo ako postoji
pointee, koja vrsta dobiva natrag na pravilo broj jedan.
>> Broj tri, pokazivač Dodjela traje jedan pokazivač
a mijenja ga ukazati na Isto pointee kao drugi pokazivač.
Dakle, nakon što je zadatak, dva pokazivače
će ukazati na isto pointee.
Ponekad, to se zove dijeljenje.
I to je sve što je na njega, stvarno.
Bye-bye sada.
[END video reprodukciju]
DAVID J. Malan: To je to za CS50.
Mi ćemo vas vidjeti sljedeći tjedan.