>> [MUSIC JOC]
David J. MALAN: Bine.
Acest lucru este CS50, iar această este sfârșitul de patru saptamani.
Iar unul dintre subiectele de astăzi este că de criminalistica digitale,
arta de a recupera informații.
Și într-adevăr, chiar dacă tu ești în mijlocul
chiar acum de Pace de la Three și Breakout, săptămâna viitoare,
accentul se va pune pe tocmai acest domeniu.
>> Deci, una din cele mai tari locuri de muncă am vreodată a avut a fost din nou în școală absolvent,
atunci când am fost de lucru pentru locale Middlesex County District Attorney lui
birou, fac criminalistica de lucru.
Deci, în esență, Massachusetts Poliția de stat, pe ocazie,
atunci când se lucrează la cazuri ar aduce în lucruri cum ar fi hard disk-uri
și dischete și carduri de memorie și altele asemenea.
Și ei le-ar preda la mine și mentorul meu,
și scopul nostru a fost de a găsi dovezi, dacă nu a fost cazul, pe aceste medii.
Sclipiri Acum, este posibil să fi văzut din această lume de criminalistica
în mass-media, TV și filme.
Dar treaba am avut, și Îndrăznesc să spun că lumea,
Nu este destul ca te-ar vedea.
Să aruncăm o privire la ceea ce probabil ati vazut.
[VIDEO PLAYBACK]
-OK.
Acum, sa trecem o privire bine la tine.
>> [MUSIC JOC]
>> Stai așa.
Fugi înapoi.
>> Așteaptă un minut.
Du-te drept.
Acolo.
Freeze asta.
Full-ecran.
>> -OK.
Freeze asta.
-Tighten Pe care, da?
>> -Vector În pe care tip de roata din spate.
>> -Zoom În chiar aici, pe acest loc.
>> -Cu Echipamentul potrivit, Imaginea poate fi mărită și ascuțit.
>> Ce-i asta?
>> -E Un program de îmbunătățire.
>> Pot tu clar că la orice?
>> -Nu Stiu.
Să spori.
>> -Enhance Secțiunea A6.
Am îmbunătățit detaliu, si--
-Cred Nu e de ajuns pentru a spori.
Eliberați-l la ecranul meu.
>> -Am Sporită reflectarea în ochi.
-Sa Rula acest lucru printr- accesoriu video.
>> -Edgar, Puteți îmbunătăți acest lucru?
>> -Hang Pe.
>> -Am Fost de lucru pe această reflecție.
>> Reflecție cuiva -Este.
>> -Reflection.
-E O reflectare a feței bărbatului.
>> Reflecție -Contravaloarea!
-E O reflecție.
-Zoom În pe oglinda.
Puteți vedea o reflecție.
>> -Poti Îmbunătăți imaginea de aici?
-Pot Ai spori?
-Putem Spori acest lucru?
-Pot Ai spori?
-Stai Pe un al doilea.
Voi spori.
-Zoom În pe ușă.
Vremurile 10.
-Zoom.
Mișcă în.
-Mai.
Stai, nu mai.
-Nu.
-Pause Ea.
Rotiți cilindrul ne 75 de grade în jurul verticală, vă rog.
>> -Nu.
Du-te înapoi la partea despre ușa din nou.
>> -Ai Un potențiator de imagine care poate bitmap?
>> Poate putem folosi Pradeep Singh Metoda de a vedea în ferestre.
>> -Contravaloarea Software-ul este de ultimă generație.
>> -Contravaloarea Valoare proprie este oprit.
>> -Cu Dreapta combinație de algorithms--
>> Iluminare luate -E algoritmi la nivelul următor,
si eu le pot folosi pentru a spori această fotografie.
>> -Lock Pe mări și axa Z.
>> -Enhance.
Consolidarea.
-Enhance.
-Freeze Și spori.
[END VIDEO PLAYBACK]
David J. MALAN: Deci, acestea sunt toate cuvintele, dar ele nu au fost
utilizate în propoziții corect.
Și într-adevăr, în viitor, în orice moment, vă rog, auzi pe cineva spune cuvântul,
"Spori", chicotit doar un pic.
Pentru că atunci când încercați pentru a spori, de exemplu, aceasta este ceea ce se întâmplă.
>> Deci, aici este o fotografie superba.
Acest lucru este propriu Daven CS50 lui.
Și să presupunem că ne-am dorit să concentreze asupra sclipire în ochi,
sau reflectarea băiat rău că a fost în mod clar
capturat de camera de securitate.
Aceasta este ceea ce se întâmplă atunci când te măriți o imagine care
are numai un număr finit de biți asociat.
>> Asta este ceea ce v-ar lua.
Și, într-adevăr, în ochi Daven lui este însă patru, poate șase pixeli
care compun exact ceea ce a fost strălucitor acolo.
Deci, problema Set patru vor avea în cele din urmă să exploreze această lume, în special
prin natura ceva noi numim fișier I / O, în cazul în care
I / O este doar un mod fantezist de spune de intrare și ieșire.
>> Deci până acum, toate interacțiunile am avut-o cu un calculator
au fost în mare parte cu dumneavoastră tastatură și ecran,
dar nu atât de mult cu hard disk, sau salvarea de fișiere dincolo de cele pe care le
te scrie.
Programele au până acum Nu a fost crearea și salvarea,
și actualizarea lor fișiere.
>> Ei bine, ceea ce este un fișier?
Ei bine, ceva de genul un JPEG.
Aceasta este o imagine pe care s-ar putea au sau încărca pe Facebook,
sau vedea oriunde pe web.
Într-adevăr, fotografia ne-am a văzut de Daven a fost un JPEG.
Și ceea ce este interesant despre fișiere, cum ar fi JPEG
este faptul că acestea pot fi identificate, în mod tipic, de anumite modele de biți.
>> Cu alte cuvinte, ceea ce se face că distinge un JPEG de la un GIF
de la un ping de la un cuvânt document de la un fișier Excel?
Ei bine, e doar diferit modele de biți.
Și aceste modele diferite sunt de obicei, la începutul aceste fișiere.
>> Așa că, atunci când computerul se deschide un Word doc, sau atunci când un calculator se deschide un JPEG,
se pare de obicei la prima serie de biți în dosar.
Și dacă se recunoaște un model, se spune, oh, aceasta este o imagine.
Lasă-mă să-l afișeze la utilizatorul ca un grafic.
Sau, oh, acest lucru arata ca un doc Word.
Lasă-mă să-l arate la utilizatorul ca un eseu.
>> Deci, de exemplu, JPEG, se pare, sunt
destul de sofisticat sub capota.
Dar primele trei octeti din mai toate JPEG începe cu aceste trei numere.
Deci octet zero, unu, doi și sunt, în cele mai multe fiecare JPEG, 255, atunci numărul
216, atunci numărul 255.
>> Și ceea ce vei putea pentru a începe să faci săptămâna viitoare
este, de fapt bagi sub capota de fisiere cum ar fi JPEG
și ca fișiere bitmap, și văzând ceea ce a fost mereu acolo pentru cât mai mult
ca ai fost cu ajutorul unui calculator.
>> Dar ceea ce este acolo nu este de obicei scris ca numere zecimale, cum ar fi acest lucru.
Oamenii de stiinta de calculator nu au tendința de a vorbi în zecimal.
Ei nu vorbesc cu adevărat în binar.
De obicei, atunci când ne-o dorim pentru a exprima numere,
vom folosi de fapt hexazecimal, care s-ar putea aminti
de, să zicem, problema Set Unul, care a contestat
să te gândești la un sistem diferit.
>> Noi, desigur, sunt familiarizați cu zecimale, zero, prin noua.
Am vorbit despre binar.
Și noi nu prea am de a folosi atât de mult aici
pe afară, pentru că computerele vor folosi asta.
Dar programatori va foarte de multe ori, dar nu întotdeauna,
utilizați hexazecimal, ceea ce înseamnă doar ai 16 litere din alfabetul,
spre deosebire de două sau 10.
>> Deci, cum a face tu numeri la mare decât nouă în hexazecimal?
Mergi 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, doar prin convenție.
Dar ceea ce este esențial este că fiecare dintre acestea este un singur simbol.
Nu există nici o 10.
Nu există nici o 11, în sine, pentru că fiecare de cifre dvs., la fel ca în zecimal
și la fel ca în binar, ar trebui doar fie un singur caracter, prin convenție.
>> Așa că atunci este alfabetul avem la dispoziția noastră pentru hexazecimal.
Deci, ce arata o JPEG ca daca au fost de a scrie cele primele trei
Nu bytes ca zecimal, dar, de exemplu, așa cum hexazecimal?
Și de ce este hex chiar tot ce util?
>> Ei bine, o privire rapidă la un exemplu.
Deci, dacă am scrie biți care reprezintă aceste numere, zecimal
acest lucru ar putea fi un pic ruginit acum de la câteva săptămâni înapoi,
dar cea din stânga și un drept sunt destul de ușor.
255 a fost cel mai mare număr WE ar putea reprezenta cu opt biți.
A fost toate cele.
Deci, singurul care-i ușor interesant este cel din mijloc.
Și dacă un fel de a face out matematica, va deduce că, într-adevăr,
ca model de una și zero reprezintă 216.
Așa că hai să prevadă pentru acum că acestea sunt corecte.
Dar de ce este acest interesant?
>> Ei bine, un octet, desigur, este de opt biti.
Și se pare că, dacă credeți de un octet ca două bucăți de patru biți,
ca aceasta.
Lasă-mă să adăugați ceva spațiu.
Deci, înainte, după.
Tocmai am adăugat niște spațiu alb de dragul vizualizare lui aici.
Cum am putea reprezenta acum în, să zicem, hexazecimal fiecare quad de biți,
fiecare set de patru biți?
>> Deci, de exemplu, pe partea stângă acum, avem 1111 în binar.
Ce este acest număr în zecimal, dacă faci din matematica?
Ai locul celor, locul doi cate doi, locul patru labe, și locul optari.
>> Audiența: 15.
David J. MALAN: E 15.
Deci, dacă facem opt plus patru plus doi plus unu, avem 15.
Așa că am putea scrie 15 de mai jos 1111, dar ideea aici
este hexazecimal, nu zecimal.
Deci, în loc de a scrie în jos 15, 1-5, Am de gând să scrie că în hex,
care, dacă credeți înapoi, dacă aveți la zero prin f, ceea ce este de 15 va fi?
Audiența: f.
David J. MALAN: Deci, se dovedește că lui f.
Și tu poți merge prin a spune, bine, în cazul în care o este de 10, atunci OK, f este de 15.
Deci, într-adevăr, am putea rescrie acest același set de numere ar fi f f.
Și apoi, dacă facem un pic de matematica, vom deduce că asta e d.
Opt este destul de ușor, pentru că ne-am am unul în locul optari.
Și atunci, avem un cuplu mai f f lui.
>> Deci, ceea ce oamenii au tendința de a face, prin convenție atunci când utilizează hexazecimal este că doar
Trimite aceasta un pic mai succint, scăpa de cele mai multe din acel spațiu alb.
Și doar pentru a fi foarte clar pentru cititorii că aceasta este hexazecimal,
Convenția de la simplu printre oameni se va scrie zero,
x, care nu are altă semnificație decât un identificator vizuală a,
aici vine un număr hexazecimal.
>> Si apoi, ai pus cele două cifre, f f în acest caz, atunci d a, atunci f f.
Deci, pe scurt, hexazecimal doar tinde
pentru a fi utile pentru că fiecare dintre ei cifre, zero, prin f, perfect linii
cu un model de patru biți.
>> Deci, dacă aveți două cifre hexazecimale, zero, prin F, din nou și din nou,
care vă oferă perfect opt biți sau un octet.
Deci, de aceea tinde sa fi convențional util.
Nu e nici un intelectual conținut într-adevăr dincolo de asta,
altele decât utilitatea reală.
>> Acum, JPEG nu sunt singura fișier formate pentru grafica.
S-ar putea aminti că există fișiere, cum ar fi acest lucru din lume,
cel puțin de câțiva ani.
>> Deci asta a fost de fapt instalate în Windows XP
pe milioane de PC-uri din intreaga lume.
Și acesta a fost un fișier de tip bitmap, BMP.
Și un fișier bitmap, după cum veți vedea în continuare săptămână, înseamnă doar un model de puncte,
pixeli ca acestea sunt numite, o hartă pe biți, într-adevăr.
>> Deci, ceea ce este interesant, însă, despre acest format de fișier, BMP, este
că sub capota, se are mai mult de doar trei bytes
care compun antet sale, așa de a vorbi, primele câteva mușcături.
De fapt, pare un pic complicat la prima vedere.
Și veți vedea acest lucru în setul P.
Și obtinerea ceva în special de acest lucru acum
nu este atât de important, ca doar faptul că, la începutul fiecărui bitmap
fișier, un format grafic, există o grămadă de numere.
>> Acum Microsoft, autor al acestui format,
tinde să cheme pe cei Lucrurile nu int și caractere
, pluteste, dar cuvintele și d cuvinte și lungi și bytes.
Deci, ele sunt doar diferite tipuri de date.
Sunt nume diferite pentru același lucru.
Dar veți vedea că în P Set patru.
>> Dar aceasta este doar să spun că, dacă un om dublu-clic pe un fisier BMP pe lui
sau hard disk ei, și o fereastră se deschide care să arate că el sau ea a imaginii,
că sa întâmplat pentru că de operare Sistemul presupune observat nu numai
extensia BMP în numele de fișier,
dar, de asemenea, faptul că există unele convenție la modelul de biți
de la bun început de care fișier de tip bitmap.
>> Dar să ne concentrăm acum asupra un astfel de dosar complicat,
dar în schimb pe ceva de genul asta.
Să presupunem că aici în gedit, I Trebuie doar începuturile
de un program care este destul de simplu.
Am niște include până sus.
Acum am # include "structs.h", dar Voi reveni la faptul că într-o clipă.
Dar acest lucru este util pentru acum.
Deci, acesta este un program de care va pune în aplicare
cum ar fi baza de date a registratorului.
Deci, o bază de date de studenți, și fiecare elev din lume
are un nume și o casă și, probabil, unele alte chestii, dar vom păstra simplu.
Fiecare elev are un nume și o casă.
>> Deci, dacă am vrut să scrie o program ale cărui scop în viață
a fost doar pentru a repeta de la zero până la trei,
în cazul în care există trei elevi de la Universitatea Harvard.
Și eu vreau doar pentru a obține, cu ajutorul getString, Numele și casa fiecărui elev,
și apoi doar imprima cele mai.
>> Aceasta este un fel de Săptămâna Una, doua saptamani, lucrurile acum,
unde vreau doar o pentru buclă sau ceva de genul asta.
Și vreau să numesc getString câteva ori, și apoi imprimați f de câteva ori.
Deci, cum s-ar putea face acest lucru, deși, atunci când atât un nume și o casă
sunt implicate pentru fiecare elev?
>> Deci, primul meu instinct ar putea fi de a face ceva de genul asta.
S-ar putea spune în primul rând, bine, da-mi, spune, o serie de siruri de caractere, numite nume.
Și eu nu vreau o hardcodati trei aici.
Ce vreau să pun acolo?
Astfel încât elevii, pentru că e doar o constantă a declarat în partea de sus,
doar ca eu nu trebuie să hardcodati trei în mai multe locuri.
În acest fel, am putea schimba un singur loc, și aceasta afectează o schimbare peste tot.
Și apoi, s-ar putea face șir case elevi.
>> Și acum, s-ar putea face ceva de genul pentru (int i = 0; i <studenților; i ++.
Deci, eu sunt tastarea rapidă, dar acest lucru este probabil sintaxă familiar acum.
>> Și acum, aceasta a fost mult mai recent.
Dacă vreau să pun în i-lea Numele elevului, cred că fac asta.
Și apoi, nu numele dar casele bracketing i.
Eu fac acest lucru, getString, și să mă duc înapoi și repara această linie.
De acord?
Nu sunt de acord?
Nu este foarte user-friendly.
Nu am spus utilizatorul ce să facă.
>> Dar acum, dacă eu, de asemenea, a vrut să mai târziu, să
să zicem, imprima aceste lucruri out-- așa TODO mai târziu.
Am de gând să facă mai mult cu asta-- această îndoială este
o punere în aplicare corectă a obtinerea numelor si case, trei
dintre acestea totală a fiecărui, de la un utilizator.
>> Dar acest lucru nu este un design foarte bun, nu?
Ce se întâmplă dacă un elev are nu doar un nume și o casă, dar, de asemenea, un număr de identificare,
și un număr de telefon, și o adresă de e-mail,
și, poate, o pagină de start, și poate un mâner Twitter,
și orice număr de alte detalii asociat cu un elev sau o persoană,
mai general.
Cum ne-ar începe să adăugați funcționalitate pentru acest program?
>> Ei bine, mă simt ca cel mai simplu mod s-ar putea fie de a face ceva de genul, să zicem,
int IDS elevi.
Deci, eu pot pune toate ID-urile lor acolo.
Și apoi, pentru ceva cum ar fi numere de telefon,
Nu sunt sigur cum să reprezintă faptul că doar încă.
Deci, să mergem mai departe și doar apel acest Twitters studenți, care
este un pic ciudat, dar-- și un buchet mai multe câmpuri.
>> Am început să efectiv copy si paste aici.
Și acest lucru este de gând să crească destul de greoi destul de repede, nu?
Nu ar fi frumos dacă ar exista în lume o structură de date cunoscute
nu ca un întreg sau un șir de caractere, dar ceva nivel mai înalt, o abstracțiune, așa
de a vorbi, cunoscut ca un elev?
C nu a venit cu built-in funcționalitate pentru studenți,
dar ce se întâmplă dacă am vrut să-i dea o astfel?
>> Ei bine, se pare, am de gând să deschide un fișier numit structs.h aici,
și puteți face exact asta.
Și vom începe să faci acest lucru acum.
Și sub capota P Set trei, ai fost deja fac asta acum.
Nu există nici un astfel de lucru ca o g rect sau un g oval în limbajul de programare C.
>> Cei de la Stanford în aplicare a celor tipuri de date prin utilizarea acestei abordări aici,
declararea lor de date nou tipuri utilizând un cuvânt cheie nou
numit struct și un alt unul numit typedef.
Și într-adevăr, chiar dacă sintaxa arată un pic diferit de chestii
am văzut înainte, în principiu, e foarte simplu.
>> Acest lucru înseamnă doar "a defini un tip."
Asta va fi o structură, și o structură
este la fel ca un recipient pentru mai multe lucruri.
Și că structura se întâmplă pentru a avea un șir numit nume,
și un șir numit casă.
Si sa-i spunem, doar pentru comoditate, tot acest elev structură de date.
>> Deci, în momentul în care ajunge la punct și virgulă, aveți acum
a creat propriul date tip numit elev
care acum se află alături de int, și float, char și, și de coarde,
și g rect, și g ovale, și orice număr de alte lucruri pe care oamenii s-au inventat.
>> Deci, ce este util despre acest acum este că, dacă mă duc înapoi
la struct 0 și să termin această punerea în aplicare, pe care am scris
în prealabil aici, observăm că toate de messiness inevitabil că
era pe cale să înceapă acum ca am adaugat numere de telefon și pe Twitter și toate
alte lucruri definiție a unui student,
acum este succint înfășurat ca doar un singur element de elevi.
>> Și fiecare dintre aceste elevi acum are mai multe lucruri în interiorul de el.
Așa că lasă doar o singură întrebare.
Cum puteți obține la numele, și casa, și ID-ul,
și orice altceva este în interiorul a elevului?
Super simplu, de asemenea.
New sintaxă, dar o idee simplă.
>> Ești pur și simplu index în matrice, așa cum am făcut-o săptămâna trecută și acest lucru.
Și ceea ce este în mod clar noua piesa de sintaxă?
Doar., Care înseamnă "a merge în interiorul structura și de a lua domeniu numit
nume, pentru a primi câmpul numit casa, obține câmpul numit elev. "
>> Deci, în P a stabilit trei, dacă ești încă de lucru pe care,
și majoritatea oamenilor încă se, își dau seama că pe măsură ce
începe să utilizați lucruri cum ar fi g rects și g ovale
și alte lucruri care nu par să provin din Săptămâna zero, unu, sau doi,
dau seama că asta pentru ca Stanford a declarat unor noi tipuri de date.
>> Și într-adevăr, asta este exact ceea ce vom face, de asemenea, în P Set patru, atunci când
vom începe să se ocupe cu lucruri cum ar fi imagini, bitmap, și mai mult.
Deci, asta e doar un teaser și un model mental pentru ceea ce va veni.
Acum, am tergiversat un pic în această dimineață.
Am fost un fel de curios să văd ce tapet Microsoft de fapt
arata ca azi.
Și se pare că cineva în 2006 de fapt, sa dus la aproape exact
în același loc pentru a fotografia în realitate ceea ce arata ca aceste zile.
Câmpul este acum un pic prea mare.
>> Deci, vorbind acum de imagini, Să aducem înapoi Daven aici
pe ecran și Nicolae, și doar să vă reamintesc
că, dacă doriți să vă alăturați nouă pentru masa de prânz vineri, cap la URL-ul nostru obișnuit
aici.
>> Deci, unde ne-am lăsa pe luni?
Am introdus această problemă, nu?
Aceasta a fost aparent o corectă punerea în aplicare a swap,
prin care vă luați două int, unul numit, unul numit b,
le schimba, la fel ca Laura a făcut aici pe scena cu laptele și apa,
prin utilizarea unui temporară variabilă, sau o ceașcă goală,
astfel încât să putem pune b într-o și o în b fără a face o mizerie de lucruri.
Am folosit o variabilă.
Se numește temp.
>> Dar ceea ce a fost fundamentală problema cu acest cod pe luni?
Care a fost problema aici?
Da.
>> Audiența: Este nevoie de mai mult spațiu.
>> David J. MALAN: Ocupă mai mult spațiu, pentru că eu sunt, folosind o variabilă,
și asta e bine.
Acest lucru este adevărat, dar eu sunt O să spun că e în regulă.
Este doar 32 de biți în Marele schemă a lucrurilor, deci nu este o afacere mare.
Alte gânduri?
Audiența: Se swap doar variabilele la nivel local.
David J. MALAN: Exact.
Acesta swap doar variabilele la nivel local.
Pentru că de fiecare dată când suni un function-- când am avut tăvi de Annenberg
ultima dată, aveți principal pe partea de jos.
De îndată ce ați apela o funcție numită de swap, de swap nu se x și y,
valorile originale.
Ce face get schimb, ne-am pretinde?
Audiența: Copii.
David J. MALAN: Deci, copii ale acestora.
Deci, acesta devine unul și doi, dacă amintesc exemplul din ultimul timp,
ci o copie a unu și doi care sunt schimbate cu succes.
Dar, din păcate, în cele din urmă, aceste valori sunt în continuare la fel.
Deci, putem vedea acest lucru cu nostru nou prieten, sperăm GDB,
că tu sau TFS și lui Ca au fost director tu față de cum urmează.
>> Deci, nici o rechemare de swap arata ca-- să deschide asta-- arata ca acest lucru.
Am inițializat x uneia, y la doi.
Am avut o grămadă de imprimare f lui.
Dar apoi, apelul cheie aici a fost de a schimba, care
este exact codul WE tocmai am văzut în urmă cu o clipă.
Ceea ce este corect în primul vedere, dar funcțional,
acest program nu funcționează, pentru că aceasta nu schimba permanent x și y.
>> Deci, hai sa vedem aceasta, o încălzire rapidă, aici cu GDB, o ./noswap.
O grămadă de informații copleșitoare care Voi scăpa de cu control L pentru acum.
Și acum, am de gând să mergeți mai departe și a alerga it.
Și, din păcate, că nu a fost faptul că util.
Ea a fugit programul în interiorul acestui program numit GDB, un debugger,
dar nu-mi băga în jurul.
>> Deci, cum pot de fapt o pauză execuție în acest program?
Deci, pauza.
Și am putea rupe în orice linie număr, unul, 10, 15.
Dar pot, de asemenea, rupe simbolic prin a spune pauză principal.
Și care va stabili o pauză punct, se pare că la linia 16 in principal.
Și unde este linia 16?
Să mergem până la codul și du-te până la noswap.
Și într-adevăr, linia 16 este prima în program.
>> Deci, acum, dacă am merge mai departe și de tip rula acest moment, Enter, se opri.
Așa că haideți să scormoni în jurul.
Printeaza X- de ce este x la zero?
Și ignora semnul dolar.
Asta e doar pentru crescator utilizare a programului.
De ce este x zero, în acest moment?
Da.
>> Audiența: Este oprit chiar înainte de linia 16, nu de fapt, pe linia 16.
David J. MALAN: Exact.
GDB, în mod implicit, a întrerupt execuție chiar înainte de linia 16.
Deci, nu a executat, care înseamnă că x este de o anumită valoare necunoscută.
Și am avut noroc că e ceva curat ca zero.
Deci, acum, dacă am introduce următorul, acum executat 16.
Se așteaptă ca eu să execute 17.
Lasă-mă să mergeți mai departe și de imprimare x.
Este una.
Lasă-mă să mergeți mai departe și de imprimare y.
Ce ar trebui să vedeți acum?
>> Audiența: [inaudibil]
>> David J. MALAN: Un pic mai tare.
>> Audiența: [inaudibil]
David J. MALAN: Nu chiar un consens.
Deci, da, vedem o anumită valoare gunoi.
Acum, y este 134514064 acolo.
Ei bine, e doar o valoare gunoi.
Programul meu foloseste RAM pentru scopuri diferite.
Există și alte funcții.
Alte persoane au scris în interiorul computerului meu.
Deci cele de biți au fost utilizate pentru alte valori, și ceea ce văd
este resturi de unele utilizare înainte de acea amintire.
>> Deci, nu e mare lucru, pentru că în cel mai scurt cum am tip următor și apoi imprimați y,
este inițializat la valoarea pe care vreau.
Deci, acum, să mergem mai departe un pic mai repede.
N pentru viitor.
Să o facem din nou.
Dar eu nu vreau să lovi ea aici, pentru că dacă eu
Vreau să văd ce se întâmplă în interiorul de schimb, ceea ce-i comanda?
>> Audiența: pași.
>> David J. MALAN: pași.
Deci, asta-mi pașii într-o funcție, mai degrabă decât asupra ei.
Și acum, e un pic criptic sincer, dar aceasta este doar
mi-a spus că sunt în linia 33 acum.
Și să facem asta din nou.
Temperatura de imprimare.
Valoare gunoi, negativ de această dată, dar asta e doar încă o valoare gunoi.
Așa că haideți să facă în continuare, temperatura de imprimare.
Este inițializată la 1, ceea ce a fost valoarea x, aka o.
>> Acum, în cazul în care sunt noastră o și x provenind din?
Ei bine, observa in principal, ne-am numit aceste valori x și y.
Apoi am trecut-le pentru a schimba, după cum urmează.
X a venit primul, virgulă y.
Și apoi, de swap-ar putea să le numesc x si y.
Dar pentru claritate, este numindu-le o și b.
Dar a și b sunt acum de gând să fie copii ale x și y, respectiv.
>> Deci, dacă mă întorc la GDB, temp este acum un an și este acum unul.
Dar dacă am face în continuare și acum face print o, o a fost deja mutat.
Laptele a fost turnat în prima pahar de suc de portocale, sau invers.
>> Și dacă eu fac în continuare din nou, iar acum dacă am imprima ca un control bun-simț,
o este încă doi, dar b este acum unul.
Sincer, este încă acolo.
Nu-mi pasă ce temperatura este.
Dar, de îndată ce acum eu tip, să zicem, continua să se întoarcă, acum eu sunt la capătul
programul.
Și, din păcate, x este încă una și y este încă doi.
>> Deci, ce a fost utilitatea GDB acolo?
Aceasta nu a ajutat-mi repara Problema în sine,
dar sperăm să mă ajute Înțeleg că prin realizarea
că da, logica mea este drept, dar codul meu nu este în cele din urmă au
un impact permanent.
Deci asta eo problemă că suntem va rezolva acum astăzi.
>> Dar să ajungem acolo prin aceasta.
String este o minciună.
Este, de asemenea, nu un tip de date care există în C. Este
a fost un sinonim pentru unii timp pentru altceva,
și putem descoperi că, după cum urmează.
>> Lasă-mă să mergeți mai departe și să se deschidă un program numit compara-0.
Și, mai degrabă decât acest tip unul, vom începe să se plimbe prin codul
I-am scris deja, dar e doar câteva rânduri.
Deci, acest lucru este compara-0.
Și primul lucru pe care fac devine o linie de text.
>> Dar observați ce am face pentru prima dată.
Ceea ce este diferit în mod clar despre linia 21?
De fapt, stai un minut.
Aceasta este copia două.
Asta nu este chiar programul potrivit.
Bine, alertă spoiler.
Bine, nu contează atât de asta.
Ăsta e răspunsul la o întrebare viitor.
>> Aici se compara-0, și eu sunt pe cale de a obține o linie de text.
Programul mult mai simplu.
Deci, acest lucru este simplu.
Acest lucru este ca Saptamana Una, doua saptamani, lucrurile în acest moment. string s = getString.
Acum, o spun din nou aici.
șir t = getString.
Și apoi, ultimul lucru în acest Programul, așa cum sugerează și numele,
este am de gând să încerce să le compara.
>> Deci, dacă s, primul șir, este egal cu = t, atunci eu sunt
O să spun ce tastați același lucru.
Altfel, am de gând să spun tastați lucruri diferite.
Deci, haideți să compila și rula acest program.
Deci, asigurați compara zero.
Arată bine.
Nu erori de compilare.
>> Lasă-mă să merg mai departe acum și de tip ./compare-0.
Lasă-mă să mergeți mai departe și spune ceva : Daven și ceva: Rob.
Și eu scriu lucruri diferite.
Până în prezent, atât de bine.
Programul pare a fi corect.
>> Dar să-l ruleze din nou.
Spune ceva: Gabe.
În regulă.
Poate am lovit bara de spațiu sau ceva funky.
Să o facem din nou.
Deci, Zamyla.
Zamyla.
Diferite lucruri.
Deci, ce se întâmplă?
>> Deci avem aceste două linii de cod, getString fiind numit de două ori.
Și apoi, eu sunt pur și simplu încercarea de a compara s și t.
Dar ceea ce atunci se întâmplă?
Ei bine, scrisul meu e pe cale să macelari acest exemplu oarecum.
Și să arunce efectiv asta aici, de asemenea.
>> Deci, avem o linie de genul string s = getString.
Deci, asta e pur și simplu primul linie interesant din acest program.
Dar ceea ce a fost în tot acest timp întâmplă sub capotă?
Ei bine, pe stâng lateral este șir, care este un anumit tip de variabile,
și se numește uri.
Deci, eu știu că acest lucru este cu ajutorul memoriei, sau RAM, in cumva computerul meu.
Așa că am de gând să abstract trage ca pe un pătrat.
32 de biți, se pare, dar mai mult pe faptul că, în viitor.
Și atunci, ce se întâmplă aici?
>> Ei bine, evident getString devine un șir de utilizator.
Și getString primit Zamyla sau Gabe sau Daven.
Deci, haideți să aleagă primul de aceia, care a fost Daven.
Deci, în mod eficient, ceea ce getString primit mă în care primul caz a fost D-o-v-e-n.
Și apoi, ce altceva a făcut ea mi-a dat în secret?
Audiența: [inaudibil]
David J. MALAN: Da, / 0 sau null caracter.
Așa că mi-a dat în mod eficient un șir.
Dar noi știm deja de la precedenta arată că un șir este doar o matrice
de caractere, și este reziliat de către acest caracter special Sentinel, / 0.
>> Dar dacă acest lucru este adevărat și acesta este un pătrat,
acest lucru este în mod clar un dreptunghi mult mai mare.
Și într-adevăr, aceasta este, Eu susțin, doar 32 de biți.
Și acest lucru este în mod clar mai mult de 32 biți, pentru că aceasta este, probabil,
opt plus opt plus opt plus opt plus opt,
doar din cauza octeți în ASCII.
Cum naiba vom potrivi Daven în această cutiuță aici?
>> Ei bine, ceea ce este de fapt getString face?
Ei bine, această grilă reprezintă aici memorie sau RAM computerul meu.
Deci, să spunem în mod arbitrar că în cazul în care fiecare dintre acestea reprezintă un octet,
atunci ne putem gândi la fiecare octet ca având o adresă,
ca 33 Oxford Street, sau 34 Oxford Street, sau 35 de Oxford Street.
>> Deci, la fel ca și casele au adrese și clădiri au adrese,
face acest lucru bytes individuale ale memorie au adrese sau numere
care le identifica în mod unic.
Acum, acest lucru este arbitrară.
Dar să-l păstrați simplu, am de gând să folosi hexazecimal doar prin convenție,
dar 0x înseamnă nimic altceva decât "aceasta este hexazecimal."
și am de gând să pretind că "D" se încheie până la Byte Una din memorie.
>> Nu am nimic altceva se întâmplă în memorie, astfel încât Daven luat primul loc
la Byte One.
Acest lucru, atunci, va fi 0x2.
Acest lucru se întâmplă pentru 0x3.
Acest lucru va fi 0x4.
Acest lucru se întâmplă pentru 0x5.
Acest lucru va fi 0x6.
>> Dar, odată ce începi să te gândești despre ceea ce face a calculatorului
sub capota, puteți începe să deducem
cum, în urmă cu câțiva ani, ar fi au pus în aplicare C în sine.
Ce este getString probabil returning-- deoarece
se simte ca nu e revenind Daven, în sine,
pentru că el cu siguranță nu se va pentru a se potrivi în acest mic box--
astfel încât ceea ce este, probabil, getString întoarce?
>> Audiența: [inaudibil]
>> David J. MALAN: Locul de amplasare a Daven.
Și a făcut acest lucru încă de săptămâna One.
Ceea ce este cu adevărat getString returnarea nu este un șir, în sine.
Aceasta este una dintre cele mai mici minciuni albe.
Se întoarce adresa șir în memorie, adresa unică.
Daven locuiește la 33 Oxford Street.
Dar mai succint, Gavin trăiește la 0x1, Adresa Number One.
>> Deci, ceea ce se pune în acest cutie mică atunci, să fie clar,
este doar adresa de acel șir.
Deci, în tot acest timp, acest a fost întâmplă.
Dar ceea ce sugerează acest lucru la acum este că dacă tot e are
este un număr interiorul ei, care este să te oprească, programator,
de a pune orice număr din orice variabilă și chiar sărind
pentru că bucata de memorie?
Și într-adevăr, vom vedea că este o amenințare data viitoare.
>> Dar pentru acum, acest lucru se simte insuficient.
Dacă spun, adu-mi o șir, să-mi dai Daven.
Dar tu nu prea-mi Daven.
Tot ce-mi da este adresa Daven lui.
Cum atunci știu sigur unde Daven începe și ends--
Povestea din ce in ce weird-- unde Daven începe și se termină,
și apoi, următoarea șir în memorie începe?
>> Ei bine, dacă sunteți predarea mă începutul Daven,
în esență, cum știu în cazul în care la sfârșitul numelui său este?
Asta caracter nul special, care este cu atât mai important acum
dacă siruri de caractere sub capota sunt pur și simplu identificate
unic prin amplasarea lor în memorie.
Deci, în tot acest timp, asta-i ceea ce se întâmplă.
>> Așa că atunci când ne uităm acum la codul de aici, explica
dacă ar fi bug-ul în linia 26.
De ce este Zamyla și Zamyla diferit?
De ce este Gabe și Gabe diferit?
Da, în spate.
>> Audiența: Ei au adrese diferite.
>> David J. MALAN: Pur și simplu pentru că ei au adrese diferite.
Pentru că atunci când te sun getString din nou, ceea ce voi face repede aici,
în cazul în care aceasta este a doua linie, șirul t, așa cum am făcut în acest program,
este egal cu un alt apel la getString.
Data viitoare eu numesc GetString, am de gând
pentru a obține o bucată diferit de memorie.
>> GetString este permis să solicite de operare
sistem pentru mai multe și mai multă memorie.
Nu se va refolosi la fel șase bytes de fiecare dată.
Va obține un nou bucată de memorie, care
înseamnă t este mergi la a lua o altă valoare pe aici.
>> Așa că atunci când am face s egal = t, tu nu esti comparat
D împotriva acestei și A împotriva aceasta și V împotriva acestui lucru.
Ai comparat asta împotriva acestei, care
sincer este destul de useless-- useful-- este destul de inutil, pentru că într-adevăr cine
îi pasă în cazul în care siruri de caractere sunt în memorie?
>> Și într-adevăr, noi nu avem.
Iar noi nu vom începe deosebit de grijuliu.
Numai în măsura în care bug-uri pot apărea și amenințările la adresa securității pot apărea voința
am de fapt, începe să le pese de acest lucru.
Așa că haideți să rezolve această problemă.
Se pare, sa-l repari foarte simplu.
>> Și să de fapt, înainte de a arată că, din nou, ceea ce ar fi
ai face dacă într-o clasă CS50, și a trebuit să pună în aplicare
o comparație împotriva a două șiruri.
Tu clar nu se poate folosi doar e egal = t.
Dar în mod logic, cum ai compara acest șir
În acest șir folosind cod C?
Da.
>> Audiența: Fă pentru buclă [inaudibil]
David J. MALAN: Perfect.
Audiența: [inaudibil]
David J. MALAN: Da.
Doar folosi o buclă pentru sau o în timp ce buclă sau orice altceva.
Dar se aplică doar ideea de bază că, dacă aceasta este o bucată de memorie sau un tablou
și aceasta este, itera ambele în același timp.
Și tocmai compara literele.
>> Și tu trebuie să fii un puțin atent, pentru că
Nu vreau un deget sa dribleze pe de altă parte
pentru că un șir este mai mult decât celălalt.
Deci, ai de gând să doriți să verificați pentru această valoare deosebită la sfârșitul anului, nul.
Dar este într-adevăr, în final, la fel de simplu ca asta.
Și sincer, nu avem nevoie de să reinventeze roata.
Aici este versiunea a doua.
Și ceea ce am de gând să spun aici este că în loc de a compara uri este egal = t,
Eu în schimb să spun, dacă string comparație cu virgulă s t este egal cu = 0.
Acum, ceea ce este compara șir?
>> Se pare, este o funcție care vine cu C, al cărei scop în viață
este de a compara doua siruri de caractere.
Și se amestecă compara, dacă citim sale Pagina de om sau documentație sau CS50
referință, se va pur și simplu să vă spun că se amestecă
compara întoarce fie un negativ număr sau un număr pozitiv sau zero,
unde înseamnă zero, ele sunt egale.
>> Deci, doar presupuneri.
Ce s-ar putea însemna dacă se amestecă întoarce comparare
valoare negativă sau pozitivă de valoare?
Audiența: Mai mare sau mai mic de.
David J. MALAN: Da, mai mare sau mai mic de.
Deci, dacă ai vrut să rezolve un întreg buchet de siruri de caractere într-un dictionary--
cum vom în cele din urmă în jos road-- Funcția perfect pentru a utiliza potențial,
pentru ca va face asta comparație cu siruri de caractere pentru voi, și spune-
tu nu o are, înainte de b, sau nu b veni înainte de o alfabetic.
Putem face exact asta.
>> Si observa am facut o alta lucru în acest exemplu.
Ce altceva sa schimbat mare în această funcție principală?
Char *.
Și acest lucru este că alte minciună albă.
În tot acest timp, când ai scris șir,
am fost rescrierea secret șir de char *, astfel încât zăngănit de fapt
te înțelege.
>> Cu alte cuvinte, în CS50.h și cum vom vedea în cele din urmă,
ne-am făcut un șir sinonim numit că e același lucru ca char *.
Și acum, știu doar că *, În acest context, cel puțin,
înseamnă adresa.
>> Adresa de ce?
Ei bine, faptul că i-am spus char *, și nu int * sau float *,
înseamnă că char * este adresa unui char.
Deci, acest mic cutie aici, alias șir, este într-adevăr de tip char *,
care este pur și simplu un mod fantezist de a spune, în această casetă va merge o adresă.
Și ce adresa se referă la?
Aparent, un char.
>> Dar am putut absolut au int * și alte lucruri.
Dar pentru acum, char * este într-adevăr cel mai simplă și una de interes.
Deci, această problemă se întâmplă să crească, deși, din nou.
>> Să presupunem că am deschide acest program.
Să vedem dacă acum putem prezice Ce e în neregulă cu acest cod.
Deci, în acest program, copiați-0, sunt O să mergeți mai departe și de apel din nou
GetString și stoca valoarea în s.
>> Și apoi, de ce fac acest lucru, la fel ca un memento de săptămâna trecut?
Noi am spus că getString uneori returneaza null.
Ce înseamnă dacă GetString returneaza null?
Ceva a mers prost.
Este, probabil, înseamnă că șirul este prea mare, afară computerului de memorie.
Se întâmplă super, super, super- rar, dar s-ar putea întâmpla.
Vrem să verificați pentru ea, și asta e tot ce facem.
>> Pentru că vom vedea acum, dacă tu nu faci începe verificarea în mod obișnuit pentru lucruri
ca nul, s-ar putea de fapt începe să meargă
la adrese din memorie care nu sunt valide.
Și ai de gând să înceapă inducerea tot mai multe defecte de segmentare.
Sau într-un Mac sau un PC, doar provocând un calculator pentru a închide
sau un program de a îngheța, potențial.
>> Deci, acum, eu susțin în copie-0.c, pe care am am de gând pentru a copia aceste siruri de caractere de drum
de linia 28.
Și apoi, am de gând a pretinde în partea de jos
aici că am de gând pentru a schimba una dintre ele.
>> Deci, observa acest lucru.
Am sunat vechiul nostru prieten strlen.
Și explica în limba engleză ceea ce face această linie 34?
Ce face t suport 0 reprezintă pe stânga.
Da.
>> Audiența: Primul caracter al t?
David J. MALAN: Primul caracter de t.
Asta este.
Primul caracter al t, vreau pentru a atribui versiunea majuscule
a primului caracter din t.
Deci, acest lucru este valorificarea prima scrisoare.
Și apoi, ultimul lucru pe care îl fac în acest program este ca eu pretind aici e
originalul, e, și aici e copie, t.
>> Dar, bazat pe povestea pe care tocmai a spus despre ce siruri de caractere sunt într-adevăr,
ceea ce este într-adevăr linia 28 a face, și ceea ce este
bug-ul rezultat va să fie pe ecran?
>> Deci, în primul rând, prima întrebare, 28.
Ce se string t = i într-adevăr face?
Dacă avem pe-stânga lateral aici șir t = s;
care îmi dă o cutie aici și o cutie de aici.
Și să presupunem că această adresă este 0x, să zicem, 50 de această dată, în mod arbitrar.
Ce șir t = s face sub capota?
>> Audiența: [inaudibil]
>> David J. MALAN: Se stochează în memoria aborda acolo, deci 0x50 merge acolo.
Deci, dacă acum, mă duc la primul caracter în t și majuscule ea,
ceea ce fac eu în mod eficient la s?
Fac într-adevăr același lucru, nu?
Pentru că, dacă Adresa 0x50-- și doar, eu Nu avem prea mult loc pe placa de aici,
dar presupun că acest lucru este 0x50 aici, undeva în memoria calculatorului meu.
>> Si eu am, de exemplu, Gabe cu litere mici aici, ca aceasta.
Și am spus t suport 0 se capitalizate.
Ei bine, t suport 0 este prima literă din t.
Atât de puțin g se va deveni mare G. Dar problema
este, ceea ce nu e de asemenea, punctul de?
>> Audiența: La fel.
>> David J. MALAN: exact același lucru.
Deci, o explicație simplă, probabil, chiar dacă sintaxa este un pic ciudat.
Deci, hai sa facem acest lucru.
Asigurați-copie 0 și apoi ./copy-0.
Spune ceva: Gabe.
Și, din păcate, atât de le-au fost capitalizate,
dar pentru că la baza motiv pentru care suntem pur și simplu
acum de-a face cu adrese.
>> Deci, cum putem începe să address-- nr joc de cuvinte intended--
cum putem incepe sa abordeze această problemă special?
Ei bine, în copy1.c, lucrurile merg pentru a obține un pic mai complicat.
Dar mi-ar pretinde o soluție conceptual simplu.
>> Atât de greu pentru a ajunge la prima vedere.
Nu va fi ușor pentru primul dată când îl introduceți în, probabil,
dar dacă problema este că pur și simplu a face t = s doar
exemplare adresa, ceea ce, din nou, în cazul în care pot alege pe tine,
va fi solutia pentru copierea de fapt un șir?
>> Audiența: Vom probabil folosi din nou o buclă.
>> David J. MALAN: Da.
Deci, vom avea nevoie din nou de o buclă.
Și pentru că, dacă vrem să copiați o s șir într-un alt șir,
probabil vrem să o facem caracter cu caracter.
Dar problema este, în cazul în care aceasta este originar s,
acum avem nevoie pentru a începe în mod explicit alocarea de memorie pentru t.
>> Cu alte cuvinte, să redesena aceasta ultima dată.
În cazul în care acest lucru este șir s = getString.
Și să punem asta aici, de asemenea.
Acest lucru este getString.
Și apoi, imaginea de ceva așa va fi ca înainte,
g-a-b-e-/ 0.
Pare ceva de genul asta.
Și s de aceea, noi numim acest 0x50, și că va fi 51, 52.
>> Deci, aceasta este 0x50.
Și apoi, eu fac șir t.
În memorie, care este doar de gând să da-mi un pic de pătrat ca asta.
Deci care este pasul cheie acum?
Dacă vreau să copiați s în t, ceea ce gol ce avem nevoie pentru a umple aici?
Sau de ce avem nevoie pentru a face la un nivel înalt?
Da?
Cineva?
Da.
>> Audiența: Avem nevoie de [neauzit].
David J. MALAN: Da, ne-am Trebuie să completați acest gol.
Eu nu pot copia și apoi valorifica Numele lui Gabe
până când am cere sistemul de operare pentru un alt segment de memorie
care este cel puțin la fel de mare ca și originalul.
Așa că ne lasă cu o întrebare.
>> Cum pot cere sistemul de operare nu doar pentru un simplu mic pointer--
ca aceasta se numește, o adresă, o pointer-- nu
pentru o cutie simplă puțin ca aceasta numit un șir?
Cum pot întreba de operare sistem pentru o mare parte din memorie?
Până acum, am primit doar că înapoi indirect prin apel getString.
Deci, cum este getString chiar obtinerea memoria sa?
>> Ei bine, se pare că nu există această altă funcție aici
că vom începe acum să folosească.
Acum, acest lucru pare than-- mod mai criptic și eu sunt singurul care poate vedea it--
această linie pare mult mai criptic atunci ar trebui la prima vedere.
Dar să-l tachineze pe langa.
>> Pe partea stângă, am char * t.
Deci, în limba engleză, să începem să formuleze Exemple adecvate în jargonul tehnic.
Deci, aceasta este alocarea unui variabila de tip char * numit t.
Acum, ce înseamnă de fapt acest lucru?
>> Ei bine, asta înseamnă că, ceea ce am de gând pentru a pune în această variabilă numită t?
O adresă de un char.
Deci, asta e doar cel mai simplu, mai mult mod rezonabil
a descrie partea stângă.
Deci, care creează această casetă aici numai.
Deci, partea dreaptă, probabil, se va
să aloce că mai mare bucată de memorie cum?
Așa că haideți să tachineze acest afară.
>> E copleșitor, la prima vedere, dar ceea ce se întâmplă în interiorul aici?
În primul rând, nu e malloc, care este aparent noul nostru prieten,
"Memorie aloca."
Deci, acesta este argumentul fiind trecut în ea, așa că este un argument destul de mare.
Așa că haideți să tachineze acest afară.
>> strlen de s, desigur, reprezintă Cel--
Audiența: Numărul de caractere.
David J. MALAN: Doar Numărul de caractere din s.
Astfel lungimea s, șirul original.
Deci G-a-b-e.
Deci, este, probabil, patru în acest caz.
De ce fac una după apel strlen de s?
Audiența: [inaudibil]
David J. MALAN: Pentru că caracter nul special.
Dacă mă întrebați pe mine ce-i durata de Numele lui Gabe, am de gând să spun patru.
Sub capota, deși, am nevoie de că al cincilea octet pentru caracterul nul.
De aceea fac un.
>> Acum, doar în cazul în care se execută acest Programul pe un alt calculator decât, să zicem,
aparatul CS50, în cazul în care dimensiunea unui char
pot fi diferite din propria mea computer--
se dovedește că eu pot suna la acest Operatorul sizeof, cere doar computerul,
ceea ce este de mărimea unui char pe acest calculator?
>> Și prin înmulțirea cinci în acest exemplu de dimensiunea unei char, care
pe majoritatea calculatoarelor se va doar unul, malloc
se va aloca pentru mine acest mare bucată de memorie pe aici pe dreapta.
Și o să revenim acesta este un function-- asa ca este
O să se întoarcă la mine ce?
Audiența: Adresa?
David J. MALAN: Adresa de ce?
Audiența: Din memoria este alocată?
David J. MALAN: Din memorie este alocată.
Deci, nu am nici o idee, sincer, în cazul în care acest lucru se va termina.
Am de gând să propună se va ajunge la 0x88.
Complet arbitrar, ci în altă parte decât 0x50,
deoarece sistemul de operare, ceea ce Windows și Mac OS face pentru mine, este
asigurați-vă că ea dă ma diferite bucăți de RAM.
>> Deci, aceasta este valoarea în cazul în care acest lucru bucată de memorie s-ar putea ajunge.
Deci, asta este ceea ce se termină aici, 0x88.
Deci, acum, în mod clar, eu pot înțelege că acest lucru nu este la fel ca aceasta,
deoarece acestea sunt îndreptat la diferite bucăți de memorie.
Deci, dacă am acum de fapt, vreau să copiați acest în, hai să facem soluția propusă.
>> Să mergem, de a crea o buclă pentru, și de a face t suport i se s suport i.
Pentru că acum pot folosi această notație-matrice ca,
deoarece chiar dacă malloc foarte generic mă alocă memorie,
memorie este doar bytes învecinate.
Byte, octet, octet, spate în spate la spate.
>> Pot cu siguranță ca un programator trata ca pe o matrice, care
înseamnă că pot folosi acest final, familiar notație de doar câteva paranteze pătrate.
>> Deci, permiteți-mi să pauză acolo, pentru că aceasta este mult dintr-o dată, chiar
deși ideea de bază a recapitulare este că șir, în tot acest timp,
nu este un nou tip de date în sine.
E doar un așa-numit pointer, o adresă a unui caracter,
ceea ce înseamnă doar că e un număr care prin convenție umană
avem tendința de a scrie ca 0x ceva.
>> Dar este doar un număr, ca 33 Oxford Street,
care se întâmplă să fie Adresa CS clădiri.
Orice întrebări cu privire la aceste detalii?
Da?
>> Audiența: De ce verifica pentru t egal la null?
>> David J. MALAN: De ce nu ne-am verifica pentru t egal la null?
Dacă citim documentation-- mare intrebare pentru malloc,
se va spune în imprimare amenzii, uneori malloc s-ar putea intoarce null,
la fel ca getString.
Și într-adevăr, getString returneaza null în cazul în care, la rândul său, malloc returnează null,
deoarece getString utilizează malloc.
>> Și asta s-ar putea întâmpla în cazul în care sistemul de operare, Mac OS, Windows, orice, este pur și simplu
din memorie pentru tine.
Deci, asta e ceea ce sa întâmplat acolo.
>> Și lasă-mă să dezvălui un alt lucru care s-ar putea sufla doar mintea ta
sau complet să fie prea departe peste linie.
Dar permiteți-mi să trag în sus aceeași pentru bucla de copiere,
care în urmă cu o clipă, rechemare a fost aceasta. t suport i se s suport i.
>> Frumos și ușor de utilizat.
Se simte ca doua saptamani din nou.
Dar această versiune de fapt, poate fi rescrisă ca aceasta, care pare criptic.
Este o tehnica numita pointer aritmetică, adresa aritmetică.
Dar de ce face acest lucru?
>> Acum enervant, autori de C a decis să introducă
simbolul * pentru diferite scopuri.
Am văzut o dată folosit deja, char *, care înseamnă "da-mi o variabilă
care va conține adresa unui char. "
* Deci, char în acest context înseamnă "da-mi o variabilă."
>> Din păcate, dacă utilizați * fără un cuvânt în fața ei, cum ar fi char,
aceasta se numește acum operatorul dereference.
Și vom vedea mai mult de acest lucru înainte de mult.
Dar aceasta înseamnă doar "du-te acolo."
E ca si cum spune, dacă cineva mi-a dat pe o bucată de hârtie "33 Oxford Street,"
dacă fac "* 33 Oxford Street," care înseamnă "Du-te pe drumul spre clădirea CS."
>> Deci * înseamnă doar du-te acolo, dacă nu există nici un cuvânt în fața lui.
Deci, ce este t, pentru a fi clar?
t este adresa bucată de memorie care a fost dat înapoi la mine.
s este adresa de ceea ce, să fie clar, în exemplul de care am discutat,
de Gabe litere mici?
s este adresa de--
Audiența: Șirul.
David J. MALAN: De numele original al lui Gabe.
Deci, este adresa de această bucată de memorie.
Deci, dacă eu spun t + Eu-- i, aviz, este doar vechiul nostru prieten.
E doar o variabilă index care este iterarea de la zero pe sus
cu lungimea șir s.
Deci, va fi zero, atunci una, apoi două, apoi trei, apoi patru.
Deci, haideți să adune aceste noi Piese de puzzle-Scratch ca, daca vreti,
deși, din nou, sintaxa este mult mai arcane decât zero.
Deci t este o adresă + i este de gând să-mi dea
un număr, pentru că acestea sunt toate Numerele pe care le-am desenat ca hex.
Dar sunt doar numere.
>> Deci, în cazul în care adresa de t-am spus a fost 0x88, ceea ce este 0x88 plus zero.
Chiar dacă nu sunteți confortabil cu hex încă, să ia o presupunere.
>> Audiența: Originalul.
>> David J. MALAN: Încă 0x88.
Deci, ce * 0x88 înseamnă?
Aceasta înseamnă, "du-te acolo", ceea ce înseamnă în mod eficient, "a pus degetul aici."
Și acum pe partea dreaptă a această expresie, * și apoi în parens,
s + i înseamnă s, care este aborda aici de mic g.
s + 0 este, desigur, s, oricare ar fi s este.
>> Deci, acum, e s *, care la fel ca * 33 Oxford Street înseamnă a merge la adresa
uri.
Deci, aici e deget, mâna dreaptă.
Deci, ce am de gând să copieze în ce?
Lucrul pe dreapta, care este Gabe, mic g aici, în aici.
>> Și astfel efectul de care prima iterație a buclei,
cum ai cerut, chiar dacă se pare nebun mai complicat decât orice
am văzut înainte, se spune pur și simplu du-te aici și copia acel caracter aici.
Este oferindu-vă o hartă de ambele locații.
>> Și vom vedea mult mai mult de acest lucru.
Dar pentru acum, speranța este doar de a introduce unele dintre aceste idei de bază.
Și într-adevăr, să ne uităm la un program de finală aici,
și apoi claymation promis, care va face totul în regulă.
În regulă.
Așa că lasă-mă să deschid up-- acolo mergem.
Așa că haideți să mine-- vom reveni la această imagine înainte de mult timp.
Lasă-mă să deschid acest ultim exemplu aici.
>> Deci, aici este o super, super program care realizează
nimic în viață care face următoarele.
Ea declară primele două variabile, x și y, care nu sunt numere de această dată,
per se.
Ei nu sunt numere întregi, în sine.
Ele sunt aparent int *.
Deci oricine, ceea ce înseamnă dacă tipul de date, variabila,
este de tip int * stea?
Asta e adresa de int.
>> Deci, nu am nici o idee unde este încă.
Aceasta înseamnă doar "a pus, în cele din urmă, adresa de int aici. "
0x50, 0x88, ori de câte ori este în memorie, o adresă se întâmplă acolo.
Și asta e ceea ce y este Va fi, de asemenea.
>> Dacă spun acum x = malloc (sizeof (int)), acesta este un mod fantezist de a spune,
hei sistem de operare, prin malloc, da-mi suficientă memorie pentru dimensiunea
de un întreg, care este, probabil, va fi de 32 biți sau patru bytes.
>> Deci, ce se întoarce malloc?
Malloc returnează o adresă.
Deci, ceea ce se va primi stocate în x?
Adresa de bucată de memorie, cele patru bytes, că malloc
doar găsite pentru mine, cerându sistemul de operare.
>> Acum între timp, linie patru aici, * x = 42.
Doar pentru a fi clar, Ce se întâmplă acolo jos?
Pe partea stângă, * x.
asta e ca * 33 Oxford Street.
Deci * x înseamnă ce?
>> Audiența: Du-te la.
>> David J. MALAN: Du-te la acea adresă.
Ori de câte ori că bucata de memorie este, du-te la ea.
Și a pus ceea ce acolo, în mod evident?
Audiența: 42.
David J. MALAN: 42.
Bine, * y, aceeași idee.
Du-te la adresa din y.
Pune numărul 13 acolo, dar ceea ce este si in acest moment?
Audiența: Nu există nici o memorie de y.
David J. MALAN: Nu este nici o memorie de y.
Deci, ce face, probabil, y conține, așa cum ne-am spus?
>> Audiența: Garbage.
>> David J. MALAN: O valoare gunoi.
Acum, valoarea gunoi este încă un număr.
Ea poate fi totuși confundată cu o adresă.
E ca și cum cineva mâzgălit ceva în jos,
și l-am interpretat în sensul unele clădiri pe stradă.
Și dacă încearcă să meargă în unele clădiri nu vă aparține,
sau unele bucată de memorie nu au a fost dat, lucruri rele s-ar putea întâmpla.
Computer-ar putea prăbuși, sau un alt Comportamentul nedeterminata s-ar putea întâmpla.
>> Deci intro, apoi, la Binky este aceasta.
Încă îmi amintesc, 20 câțiva ani mai târziu ciudat,
unde am fost când am în cele din urmă înțeles indicii.
>> Ceea ce este de spus, dacă pleca de aici în trei minute
și cred că eu nu fac înțelege indicii, realiza
Am amintit de 20 ani pentru un motiv oarecare nebun
când și de ce în cele din urmă sa scufundat în, de zi cu învățătura mea
colegi, Nishat Mehta în înapoi de Eliot sala de mese.
Acum, mi-am amintit acest lucru, deoarece acest lucru a fost
unul dintre subiectele I, în special, sa luptat cu.
Și apoi, în cele din urmă a făcut clic, ca și cum aș îndrăzni să spun o mulțime de subiecte
în cele din urmă o va face.
Iar acum, pentru a face ca simt mai fericit și mai convingătoare,
haideți să aruncăm o privire finală în nostru ultimele trei minute aici la Binky,
de la prietenul nostru, Nick Parlante de la Stanford.
>> [VIDEO PLAYBACK]
>> Hei, Binky.
Treziți-vă!
E timpul pentru distracție pointer.
>> Ce-i asta?
Aflați mai multe despre indicii?
Ce bine!
>> Ei bine, pentru a începe, cred că suntem avea nevoie de câteva indicii.
>> -OK.
Acest cod alocă două indicii, care pot indica numere întregi.
-OK.
Ei bine, eu văd cele două indicii, dar ele nu par a fi îndreptat la nimic.
>> Asta-i drept.
Inițial, indicii nu indică nimic.
Lucrurile pe care le indica sunt numite pointees, și a le propune lui
o etapă separată.
>> Oh, da, corect.
Știam că.
Cele pointees sunt separate.
Er, așa cum a face tu aloca un pointee?
>> -OK.
Ei bine, acest cod alocă un nou pointee întreg,
și acest seturi de piese x pentru a indica spre el.
>> Hei, care arată mai bine.
Deci, face o fac ceva.
>> -OK.
Voi dereference indicatorul x la stocați numărul 42 în pointee sale.
Pentru acest truc, am nevoie meu Magic Wand de dereferencing.
>> Tău Magic Wand de dereferencing?
Asta-- asta e minunat.
>> Asta este ceea ce codul pare.
Voi doar înființat numărul, și [POP]
>> Hei, uite.
Nu merge.
>> Deci a face o dereference pe x urmează săgeata pentru a accesa pointee sale.
În acest caz, un magazin de 42 de acolo.
Hei, încercați să utilizați-l pentru a stoca numărul 13 prin cealaltă indicatorul, y.
>> -OK.
Mă duc doar aici la y, și pentru a obține numărul 13 set up.
Și apoi, ia Bagheta de Dereferencing și doar [BUZZ]
>> Oh!
>> Oh, hei!
Asta nu a mers.
Spune, Binky, nu cred că dereferencing y este o idee bună, pentru că știi,
înființarea pointee este o etapă separată.
Și nu cred că am făcut-o vreodată.
>> Punct Bună.
Da.
Am alocat y pointer, dar ne-am nu-l setat pentru a indica o pointee.
>> Foarte atent.
Hei, arăți bine acolo, Binky.
Poți să-l repari, astfel încât punctele de y la aceeași pointee ca x?
>> Sigur.
Voi folosi Magic Wand meu de Pointer Atribuire.
>> -E Care va fi o problemă ca înainte?
Nu.
Acest lucru nu atinge pointees.
Se schimbă doar un pointer la indica acelasi lucru ca un alt.
>> Oh, văd.
Acum puncte y în același loc ca x.
Deci, așteptați.
Acum, y este fix.
Ea are o pointee.
Astfel, puteți încerca Bagheta de Dereferencing din nou pentru a trimite peste 13 ani.
>> Uh, OK.
Aici merge. [POP]
>> Hei, uita-te la asta.
Acum dereferencing lucrări pe y.
Și pentru că indicii sunt de partajare că unul pointee, amândoi vedea 13.
Da.
Schimbul, indiferent de.
Deci, vom schimba locurile acum?
>> Oh, uite.
Nu mai avem timp.
>> -Dar
>> Doar amintiți-vă cele trei reguli indicatorul.
Number One, structura de bază este că veți avea un pointer,
și-l arată pe de o pointee.
Dar indicatorul și pointee sunt separate,
și eroarea comună este de a crea un pointer,
dar a uitat să-i dea un pointee.
>> Number Two, pointer dereferencing pornește de la indicatorul
și urmează săgeata peste pentru a accesa pointee acestuia.
După cum știm cu toții, această funcționează doar dacă există
o pointee, ce fel de se întoarce la regula numărul unu.
>> Numărul Trei, pointer cesiune are un pointer
și se schimbă pentru a indica același pointee ca un alt indicator.
Deci, după atribuirea, cele două indicii
va indica la aceeași pointee.
Uneori, aceasta se numește partajare.
Și asta e tot acolo este să-l, într-adevăr.
La revedere acum.
[END VIDEO PLAYBACK]
David J. MALAN: Asta e pentru CS50.
Ne vedem săptămâna viitoare.