>> DAVID MALAN: Bună ziua, și bun venit înapoi la CS50.
Deci, acesta este sfârșitul de patru saptamani.
Doar un anunț întâi.
Deci, așa-numitul cincea luni este vine aceasta vine luni.
Acest lucru este posibilitatea de a schimba de la SAT / UnSat la un grad scrisoare, sau de la
Calitate scrisoare SAT / UnSat.
Supărător, că procesul are nevoie de o semnătură, pentru că trebuie să completați
unul dintre aceste add / drop forme roz.
>> Deoarece punct de vedere tehnic, SAT / UnSat versiune și versiunea gradul litera
au numere de catalog distincte.
Dar nu e mare lucru.
Vino la mine sau de la Rob sau a Lauren în orice punct.
Sau e-mail, dacă nu aveți un fel de documente care aveți nevoie astăzi, și ne-
va fi sigur de a vă ajuta să luați grijă de asta înainte de luni.
>> În regulă, așa că astăzi -
De fapt, există un pic de un ecou.
Putem tonul ma jos un pic?
OK.
Așa că astăzi, vom introduce un subiect cunoscut sub numele de indicii.
Și eu recunosc că aceasta este una din subiecte mai complexe pe care avem tendința de a
acoperă în această clasă, sau într-adevăr orice curs introductiv care utilizează C.
>> Dar ia cuvântul meu pentru ea, în special Dacă mintea ta se simte un pic mai mult îndoit
astăzi și în următoarele săptămâni.
Nu este reprezentativ de apariție a mai rău la acest lucru înseamnă doar că
este un subiect deosebit de sofisticat care promit, câteva săptămâni
prin urmare, va părea mult prea izbitor simplu în retrospectivă.
>> Îmi amintesc încă la această zi.
Am fost așezat la Elliott sala de mese, a următoarei ședințe pentru a-mi TF Nishat Mehta,
care a fost un rezident al casei Elliott.
Și pentru un motiv oarecare, această subiect câteva clicuri.
Care este de a spune că am prea luptat cu ea pentru o anumită cantitate de timp, dar am
va face tot posibilul pentru a evita orice astfel de lupta cu un subiect care în cele din urmă
este destul de puternic.
>> De fapt, unul dintre subiectele pe care le vom discuta în următoarele săptămâni este că
de securitate, și cum puteți de fapt, exploata mașini în moduri
care nu au fost destinate.
Și aceste exploatări sunt de obicei rezultatul de bug-uri, greseli pe care le
oamenii fac de nu înțelege unele de punere în aplicare care stau la baza
detalii prin care programele sunt realizate.
>> Acum, pentru a face acest lucru pare cu atât mai ușor de utilizat prietenos, m-am gândit să joace un 10
al doilea preview de un pic claymation Figura numit Binky care a fost adus la
viata de un prieten de-al nostru de la Stanford, profesor Nick parlante.
Deci, permiteți-mi să vă dau această teaser de Binky aici.
>> [Redare video]
>> -Hei, Binky.
Trezește-te.
E timpul pentru distracție pointer.
>> -Ce-i asta?
Aflați mai multe despre indicii?
Oh, goodie.
>> [END redare video]
>> DAVID MALAN: Acesta este Stanford informatică.
Astfel mai mult pe care să vină.
>> [Aplauze]
>> DAVID MALAN: Îmi pare rău, Nick.
>> Astfel amintesc că ultima dată când am ajuns pe acest Cliffhanger cu adevarat interesant
prin care această funcție pur și simplu nu au de lucru.
Cel puțin intuitiv, am simțit ca și cum ar trebui să funcționeze.
Pur și simplu schimbarea valorilor a două numere întregi.
Dar amintesc că atunci când am imprimat valorile originale în principal, o și
doi, ei erau încă una și două și nu doi și unu.
>> Deci, lasă-mă să comuta de fapt pe la aparat.
Și am scris un pic de cod scheletice în avansa aici, unde am susțin că x
va fi 1, y va fi 2.
Apoi am imprima atât lor Valorile cu print f.
>> Atunci eu pretind aici că am de gând să le schimba.
Am lăsat un loc gol aici pentru a ne completați astăzi, într-o clipă.
Apoi, am de gând să pretind că două variabile au fost schimbate.
Apoi, am de gând să imprima le din nou.
Și așa sperăm, că ar trebui să vezi 1, 2.
2, 1.
Asta e super-simplu Scopul chiar acum.
>> Deci, cum putem merge despre schimbarea două variabile?
Ei bine, dacă eu propun aici că aceste cupe ar putea reprezenta memorie într-un calculator.
Aceasta este o mușcătură, această este un alt mușcătură.
Am fi putut-o voluntar venit pe sus și amesteca-ne ceva de băut, dacă familiar?
Hai sus.
Care e numele tău?
>> JESS: Jess.
>> DAVID MALAN: Jess?
Hai sus, Jess.
Dacă nu te superi, trebuie sa punem Google sticla pe tine astfel încât să putem
imortaliza acest lucru.
OK, sticla.
Înregistrarea unui clip video.
Și OK, suntem buni la du-te cu Jess aici.
Bine.
Îmi pare bine.
>> Deci, ce aș vrea să fac aici - dacă ai putea, destul de repede -
doar ne toarna o jumatate de pahar de Orange suc și o jumătate de pahar de lapte,
reprezentând eficient numerele 1 într-o singură cupă și 2 în cealaltă cupa.
>> Acest lucru va fi imagini bune.
>> JESS: Îmi pare rău.
>> DAVID MALAN: Nu, nu.
E în regulă.
Frumos.
În regulă, deci avem patru octeți în valoare de suc de portocale.
Vom numit valoarea 1.
Acum, un alt patru octeti în valoare de lapte.
Va numi valoarea 2.
Deci, x și y, respectiv.
>> Bine, asa ca acum, dacă sarcina la îndemână - pentru tine, Jess, în fața tuturor
de colegii dumneavoastră -
este de a schimba valorile x și y astfel pe care ne-o dorim suc de portocale în
alte Cup și laptele în acest pahar, cum S-ar putea - înainte de a face de fapt,
l - du-te despre a face acest lucru?
>> OK, decizie inteleapta.
Deci, ai nevoie de un pic mai mult memorie.
Deci, haideți să aloce o temporar ceașcă, dacă vreți.
Si acum continua să facă schimb de x și y.
>> Excelent.
Deci, foarte bine facut.
Vă mulțumesc foarte mult, Jess.
Poftiți.
Un mic suvenir.
>> OK, deci, evident, o idee foarte simplă.
Complet intuitiv că avem nevoie de un pic mai mult spațiu de stocare - în această formă,
o ceașcă - dacă de fapt, doresc să schimba aceste două variabile.
Deci, haideți să facă exact acest lucru.
Aici între care eu pretind că sunt gând să faci ceva pompare, voi
mergeți mai departe și să declare temp.
Și voi stabili o egal cu, să zicem, x.
>> Apoi, am de gând să schimbe valoarea de x fel ca Jess făcut aici cu
lapte și suc de portocale să fie egal cu y.
Și am de gând să schimbe y să fie egal pentru a nu x, pentru că acum ne-ar fi
blocat într-un cerc, ci mai degrabă temp.
Unde am temporar - sau în cazul în care Jess a pus temporar suc de portocale
înainte platesti care cupa cu lapte.
>> Așa că lasă-mă să merg mai departe acum și să facă acest lucru.
Se numește noswap.c.
Și acum permiteți-mi să ruleze nu de swap.
Și într-adevăr văd, dacă am extinde Fereastra un pic, că
x este 1, y este 2.
Și atunci x este 2, y este 1.
>> Dar amintesc că luni am făcut lucruri un pic diferit prin care am
implementat în schimb o funcție de ajutor, dacă vreți, care a fost de fapt gol.
Am sunat-l schimb.
I-am dat doi parametri, și am sunat le-o și am sunat le-b.
>> Sincer, am putea să le x și y apel.
Nu e nimic de oprire ma de la a face asta.
Dar aș argumenta că e atunci un pic ambiguu.
Deoarece amintesc de luni pe care le a susținut că acești parametri au fost
copii ale valorilor trecut inch
Deci, doar popotelor cu dvs. minte, cred că, dacă utilizați
exact aceleași variabile.
>> Asa ca le voi numi un loc și b, doar pentru claritate.
Dar le-am putea numi cele mai orice vrem.
Și am de gând să copiați și să lipiți în mod eficient acest cod de acolo de sus
jos în aici.
Pentru că am văzut că funcționează.
Deci, asta e intr-o forma destul de buna.
Și voi schimba mea x la o, mi x pentru o, y mea de b și y mea de b.
>> Deci, cu alte cuvinte, aceeași logică exactă.
Exact același lucru pe care Jess făcut.
Și apoi singurul lucru ce trebuie să fac în sus aici, desigur, este acum invoca această
funcția, sau suna această funcție.
Așa că va apela această funcție cu două intrări, x și y, și a lovit Salvare.
>> În regulă, deci fundamental același lucru.
De fapt, le-am făcut, probabil, programul inutil de complexe de
scris o funcție care tocmai ia unele șase linii de cod în timp ce eu
anterior au pus în aplicare acest lucru în doar trei.
>> Așa că lasă-mă să merg mai departe acum și remake-ul acest lucru, nu fac nici de swap.
În regulă, am greșit aici.
Acest lucru ar trebui să fie o eroare care s-ar putea a se vedea în ce mai frecvent ca dvs.
Programele devin mai complexe.
Dar există o repara ușor.
Lasă-mă să derulați înapoi aici.
>> Și ceea ce este prima eroare văd eu?
Declarația implicit.
Ce înseamnă că indică de obicei?
Oh, am uitat prototipul.
Am uitat să-i învețe compilator care swap- va exista, chiar dacă el
nu există de la bun început a programului.
Deci, eu sunt doar de gând să spun vid, de swap, Int, un b Int, punct și virgulă.
>> Deci, eu nu am de gând să-l reimplementa.
Dar acum se potrivește cu ceea ce este aici.
Și notificare, lipsa de un punct și virgulă aici, care nu este necesară atunci când
de punere în aplicare.
>> Deci, lasă-mă să refacă acest lucru, nu fac schimb.
Mult mai bine forma.
Rula nici de swap.
Și la naiba.
Acum ne-am întors de unde am fost, luni, în cazul în care lucru nu schimba.
>> Și ceea ce este explicația intuitiv de ce acesta este cazul?
Da?
>> STUDENT: [inaudibil].
>> DAVID MALAN: Exact.
Deci, a și b sunt copii ale x și y.
Și, de fapt, în orice moment ai fost apelarea unei funcții până acum că
trece variabile, cum ar fi int -
la fel de swap se asteapta aici -
voi au fost trecerea la copii.
>> Acum, asta înseamnă că este nevoie de un pic de timp, o fracțiune de secundă, pentru
computer pentru a copia de biți de la un variabilă în biți de altul.
Dar asta nu-i mare lucru.
Dar ele sunt, totuși, o copie.
>> Iar acum, în contextul schimb, Sunt, de fapt, cu succes
schimbare a și b.
De fapt, hai să facem o scurtă verifică bun-simț.
Print f o este de% i, linie nouă.
Și conectați hai într-o.
Acum, hai sa facem acelasi lucru cu b.
Și să facem același lucru aici.
>> Și acum, permiteți-mi să copiați aceleași linii din nou la partea de jos a funcției
după cei trei linii de interesant ar putea fi executate, și
imprimare a și b din nou.
Deci, acum, hai să facem acest lucru, nu fac schimb.
Permiteți-mi să fac o fereastră terminal bit mai înalt, astfel încât să putem vedea
mai mult de ea, la o dată.
>> Și a alerga nu de swap.
x este 1, y este 2. a este 1, b este 2.
Și apoi, o este 2, b este 1.
Deci, este de lucru, la fel ca Jess a făcut aici în interiorul de swap.
Dar, desigur, se are nici un efect pe variabile în principal.
>> Așa că am văzut un truc prin care am ar putea rezolva această problemă, nu?
Cand esti confruntat cu această definire a domeniului problema, ai putea miza si faceti-va x
și Y ce fel de variabile în loc?
>> Ai putea să le facă la nivel mondial.
Pune-le la foarte de sus a fișierului așa cum am făcut-o, chiar și în jocul de 15.
Noi folosim o variabilă globală.
Dar, în cadrul unui joc 15, este rezonabil să aibă un nivel global
variabilei reprezentând bord, deoarece toate elementele de 15.c este tot
de punere în aplicare a jocului.
Asta e ceea ce există fișierul de a face.
>> Dar, în acest caz aici, eu sunt solicită un schimb funcție.
Vreau să schimb două variabile.
Și ar trebui să înceapă să se simtă doar neglijent dacă soluția la toate noastre
probleme atunci când am rula în domeniul de aplicare probleme este de a face aceasta la nivel mondial.
Pentru că foarte repede programul nostru este va deveni destul de un dezastru.
Și am făcut asta foarte rar ca rezultat în 15.c.
>> Dar se pare că există o cale mai bună totul.
Permiteți-mi merge de fapt, înapoi și a șterge imprima lui f, doar pentru a simplifica acest cod.
Și permiteți-mi să propun ca acest lucru, într-adevăr, este rău.
Dar, dacă în loc să adaug, in unele asteriscuri și stele, eu pot transforma în schimb acest
funcție într-una care este de fapt operaționale.
>> Așa că lasă-mă să mă întorc aici și să recunoaștem spune asteriscuri este întotdeauna dificil,
asa ca voi spune stele.
Voi Fess doar până la acel unul.
Bine.
Și acum, ce am de gând de a face schimb?
>> Deci, în primul rând, am de gând să specificați că, în loc de a trece un int în
funcția de swap, eu sunt în schimb de gând să spun stea Int.
Acum, ceea ce indică steaua?
Acest lucru este că noțiunea de un pointer care Binky, caracterul claymation, a fost
referindu-se la un moment în urmă.
>> Deci, dacă am spune Int stele, sensul acest lucru acum este că o nu va fi
în trecut prin valoarea sa.
Nu va fi copiat inch
Mai degrabă, este adresa unui va fi trecut inch
>> Astfel amintesc că în interiorul computerului este o grămadă de memorie, altfel
cunoscut sub numele de RAM.
Și că RAM este doar o grămadă de bytes.
Deci, în cazul în care Mac-ul sau PC-ul are doi gigabytes, aveți 2
miliarde de bytes de memorie.
>> Acum, sa presupunem doar că doar a să păstreze lucrurile frumos și ordonat, am
atribui o adresă -
un număr -
pentru fiecare octet de RAM din computer.
Primul octet din cei 2 miliarde de euro este de numărul zero.
Următorul este numărul un octet, numărul doi, tot drumul pe sus, dot dot
punct, la aproximativ 2 miliarde.
>> Astfel încât să puteți numarul de bytes de memorie în computer.
Deci, să presupunem că asta e ceea ce ne referim de o adresă.
Așa că atunci când văd int stea o, ce se întâmplă a fi trecut în schimb acum este
adresa o.
Nu sa valoare, dar indiferent poștal sale Adresa este, ca să spunem așa -
locației sale în RAM.
>> Și în mod similar pentru b, am de gând pentru a spune același lucru.
Int, stele, b.
Ca o paranteza, tehnic stele ar putea merge în alte locații.
Dar vom standardiza de stele fiind chiar lângă tipul de date.
>> Deci semnături Swap înseamnă acum, dă-mi adresa un int, iar apelul
că adresa o.
Și dă-mi o adresa de INT și apelați care adresa b..
>> Dar acum codul meu de aici trebuie să se schimbe.
Pentru că dacă eu declar temp int -
care este încă de tip int -
dar păstrează într-o, ce fel de valoare?
Pentru a fi clar, am pune un o cu codul asa cum este scris chiar acum?
>> Pun locație într-o.
Dar nu-mi pasă despre locația acum, nu?
Temperatura există doar trei ceașcă Jess " a existat, pentru ce scop?
Pentru a stoca o valoare.
Lapte sau suc de portocale.
Nu a stoca de fapt adresa oricare dintre aceste lucruri, care se simte un
puțin lipsite de sens în această reală Contextul mondial oricum.
>> Deci, într-adevăr, ceea ce vreau să pun la temp nu este adresa unui, dar
Conținutul o.
Deci, dacă a este un număr ca 123, aceasta este octet 123 de memorie care o tocmai
întâmplă să fie ocuparea, că valoarea într-o întâmplă să fie de ocupație.
>> Dacă eu vreau să merg la acea adresă, Am nevoie să spun o stea.
Similar, dacă ar fi să schimbe ceea ce este la adresa unei, am schimba
aceasta pentru a începe o.
Dacă vreau să stocați în ceea ce-i la o locatie cu ceea ce este la locul
la b, b stele stele.
>> Deci, pe scurt, chiar dacă acest lucru nu este destul scufundarea în încă - și nu aș aștepta
că ar fi atât de repede -
dau seama că tot ce fac este prefixarea aceste stelele la variabile mele,
spune nu apuca valorile.
Nu schimba valorile.
Ci, mai degrabă, du-te la aceste adrese și pentru a obține valoarea.
Du-te la acea adresă și schimbarea valoare acolo.
>> Deci, acum lasă-mă să derulați înapoi până la partea de sus, doar pentru a rezolva această linie aici, la
schimba prototip pentru a se potrivi.
Dar acum am nevoie pentru a face un alt lucru.
Intuitiv, dacă m-am schimbat tipurile de argumente care de swap se așteaptă,
Ce altceva am nevoie pentru a schimba în codul meu?
>> Când m-am apel de swap.
Pentru că acum, ce am Am trece de a schimba în continuare?
Valoarea x și valoarea lui y, sau lapte și suc de portocale.
Dar eu nu vreau să fac asta.
Eu în schimb să treacă în ce?
Locul de amplasare a x și locația de y.
Care sunt adresele lor poștale, ca să spunem așa.
>> Deci, pentru a face acest lucru, există un ampersand.
Fel ampersand de sunete, cum ar fi adresa.
așa n, ampersand, adresa lui x, și adresa de y.
Deci, este deliberată pe care le folosim ampersand când apela functia,
și stelele când declararea și atunci când realizarea funcției.
>> Și cred că a ampersand ca adresa operatorului, și stele, cum
du-te acolo operatorul -
sau, mai corect, operatorul dereference.
Astfel că este o mulțime de cuvinte doar pentru a spun că acum, sperăm, de swap se întâmplă
pentru a fi corect.
>> Lasă-mă să merg mai departe și să facă -
să redenumiți efectiv fișierul, ca nu cumva acest program încă să fie numit nici de swap.
Eu susțin că o vom numi swap.c acum.
Deci, a face, schimba.
Dot, slash, schimba.
>> Și acum, într-adevăr, x este 1, y este 2.
Și apoi, x este 2, y este unul.
Ei bine, să vedem dacă nu putem face acest lucru o pic diferit cu privire la ceea ce este
întâmplă pe aici.
În primul rând, permiteți-mi mări noastră desen ecran aici.
Și lasă-mă să propună pentru un moment - și ori de câte ori mă trage aici vor fi reflectate
acolo acum - permiteți-mi să propun ca aici este o grămadă de memorie, sau
RAM, în interiorul computerul meu.
>> Și acesta va fi numărul musca, să zicem, 1.
Acest lucru va fi octeți numărul 2.
Și eu voi face o grămadă mai mult, și apoi o grămadă de dot dot puncte de
indică faptul că există 2 miliarde de euro de aceste lucruri.
4, 5, și așa mai departe.
>> Deci, există primii cinci octeti de memoria computerului meu.
În regulă?
Foarte puțini din 2 miliarde de euro.
Dar acum am de gând să propună următor.
Am de gând să propun ca x va stoca numărul 1, și Y se întâmplă
pentru a stoca numărul 2.
Și lasă-mă să merg mai departe acum și reprezintă aceste valori, după cum urmează.
>> Să facem acest lucru, după cum urmează.
Dă-mi doar o secundă.
O secundă.
OK.
Vreau sa fac acest lucru un pic -
hai sa facem acest lucru din nou.
În caz contrar, am de gând să și utilizarea aceleași numere, neintenționat,
de mai multe ori.
>> Deci, doar așa că avem numere diferite pentru a vorbi despre, sa-i spunem acest octet
numărul 123, 124, 125, 126, și dot dot dot.
Și permiteți-mi să pretind că am de gând să pune valoarea 1 aici, iar valoarea 2
aici, altfel cunoscut ca x și y.
Așa că doar așa se întâmplă că acest lucru este x, aceasta este y.
>> Și doar printr-o întâmplare, calculator, sistemul de operare,
sa întâmplat să pună x la locație numărul 123.
Și Y ajuns la locația 124 -
la naiba.
Ar fi trebuit stabilit acest lucru.
Oh, omule, nu chiar vreau să fac asta?
Da, doresc să se stabilească acest lucru și b buna despre acest lucru astăzi.
Ne pare rău, noi la asta.
>> 127, 131, și nu am vrut să fie această complex, dar de ce am schimba
Numerele acolo?
Pentru că doresc să int fi de fapt patru bytes.
Deci, hai să fim foarte anal cu privire la acest lucru.
Așa că, dacă 1 se întâmplă să fie abordate 123, 2 va fi la adresa
127 pentru ca e doar 4 despartirile departe.
Asta e tot.
Și vom uita de toate alte adrese din lume.
>> Deci, x este la locația 123, y este la locația 127.
Și acum, ce fac eu de fapt vrei sa faci?
Când m-am apel de swap acum, ceea ce este de fapt se întâmplă?
Ei bine, când am apel schimb, am trece la adresa x și adresa de y.
Deci, de exemplu, în cazul în care aceste două piese de hârtie reprezintă acum două
Argumentele a și b pentru a schimba, ceea ce sunt eu de gând să scrie pe prima dintre acestea,
pe care am de gând pentru a apela referă la ca o?
>> Exact, 123.
Deci, acest lucru am pretinde este o.
Acesta este un parametru.
Pun adresa de x acolo.
>> Ce-i asta?
>> Nu, nu.
Asta e OK.
Încă bun, mai bun.
Deci, aceasta este o.
Și acum în a doua bucată de hârtie, acest lucru va fi b, și ceea ce sunt eu
va fi scris pe această bucată de hârtie?
127.
>> Deci, singurul lucru care sa schimbat de la elocvent noastră anterioară a acestei povești este,
mai degrabă decât pur și simplu 1 și 2, sunt O să treacă în 123 și 127.
Și am acum de gând să pun astea în interiorul din această casetă, bine?
Astfel că cutie neagră reprezintă acum funcția de swap.
>> Între timp, hai acum pe cineva implementa funcția de swap.
Ar fi cineva aici ofer voluntar?
Hai sus.
Care e numele tău?
Charlie.
În regulă, Charlie.
Hai sus.
>> Deci, Charlie se va juca rolul de cutia neagră.
Și Charlie, ce mi-ar place să faci acum se implementeze schimbul în așa fel
că, având în vedere cele două adrese, ai fost de fapt merge
pentru a schimba valorile.
Și voi sopti la ureche Cum de a rula televizor aici.
>> Așa că mergeți mai departe, și tu ești cutia neagră.
Ajunge acolo.
Ce valori vezi pentru o, și Ce valori vezi pentru b?
>> CHARLIE: a este 123 și b este 127.
>> DAVID MALAN: Bine, exact.
Acum, pauza acolo doar pentru o clipă.
Primul lucru pe care ai de gând să faci acum, conform codului - care
Voi trage acum pe ecran -
va fi de a aloca un pic bit de memorie numit temp.
Așa că am de gând să merg mai departe și da acea memorie.
>> Deci, aceasta va fi a treia variabilă că aveți acces la
ai sunat temp.
Și ce ai de gând să scrie pe bucata temperatura de hârtie?
>> CHARLIE: indicatori, corect?
>> DAVID MALAN: OK, dar nu neapărat indicii.
Deci, linia de cod care le-am evidențiată pe partea dreaptă,
Să începem de acolo.
Se spune o stea.
Deci, o este în prezent stocarea numărul 123.
Și doar intuitiv, ceea ce am vrut stele 123?
>> Dar în mod special, în cazul în care a este 123, stele, un mijloc de ce?
Valoarea unui.
Sau mai mult ocazional, du-te acolo.
Deci, permiteți-mi să propun ca, deține o în mâna ta, mergeți mai departe și să trateze ca
de parcă ar fi o hartă.
Și merge-te pe a calculatorului memorie, și ne găsim ceea ce este
la locația 123.
Exact.
>> Deci, vom vedea la locația 123 este ceea ce, în mod evident?
OK, deci ce valoare acum esti gând să pună în temp?
Exact.
Deci, mergeți mai departe și face asta.
Și scrie numărul 1 de pe bucata de hârtie, care este intitulat în prezent temp.
>> Și acum, următorul pas pe care ai de gând să pună în aplicare
va fi ceea ce.
Ei bine, pe partea dreaptă a următoarea linie de cod este steaua b. b, de
Desigur, stochează o adresă.
Care se adresează 127.
Steaua b înseamnă ceea ce, ocazional vorbind?
>> Du-te la acea locație.
Deci, mergeți mai departe și ne găsim ceea ce este la locația 127.
OK.
Desigur, la locația 127, este încă valoarea 2.
Deci, ce ai de gând acum la magazin orice e de locație într-o?
Deci stea un mijloc de a merge la locul de.
Care este locatia un?
>> Exact.
Deci, acum, dacă doriți să modificați ceea ce la acea locație -
Voi merge mai departe și a alerga radiera sunt aici.
Și acum pune-l înapoi pe pensula.
Ce număr ai de gând să scrie în care cutia goală acum?
>> Exact.
Deci, această linie de cod, să fie clar - să ma opresc ce face Charlie și
subliniez aici, ce-a făcut este scrie în cutia aia de la locație 123
valoarea care a fost anterior la B.
Și astfel am implementat acum, într-adevăr această a doua linie de cod.
>> Acum, din păcate, nu există încă o linie rămas.
Acum, ceea ce este în temp, literalmente?
Este evident numărul unu.
Asta nu-i o adresă.
E doar un număr, un fel de o variabilă de la o saptamana.
>> Iar acum, când spui stea b, ceea ce înseamnă du-te la adresa b, care este de
Desigur aici.
Deci, odată ce ajunge acolo -
Voi merge mai departe și a șterge ceea ce este de fapt acolo - si ceea ce esti
de gând să scrie acum la 127 de locație?
>> CHARLIE: Temp, care este unul.
>> DAVID MALAN: Temp, care este unul.
Și ce se întâmplă cu temp în cele din urmă?
Ei bine, nu prea știu.
Noi nu le pasă cu adevărat.
Orice dată când am implementat o funcție Până în prezent, toate variabilele locale trebuie
sunt într-adevăr locale.
Și ei doar dispar.
Sunt recuperate de operare sistem în cele din urmă.
>> Deci, faptul că temperatura are încă Valoarea 1 este un fel de fundamental
neinteresante pentru noi.
Bine, deci o rundă de aplauze dacă am putea pentru Charlie.
Foarte bine facut.
>> Bine, deci ce mai face acest lucru înseamnă că ne putem face?
Deci, se dovedește că am fost spune câteva minciuni albe
de ceva timp.
Într-adevăr, se pare că un șir, tot acest timp, nu este într-adevăr o
secvență de caractere per se.
Este un fel de este că intuitiv.
>> Dar tehnic vorbind, este un șir tipul de date pe care am declarat în interiorul
CS50 biblioteca a simplifica lumea pentru primele câteva săptămâni de clasa.
Ce un șir într-adevăr este este adresa de un caracter undeva în memoria RAM.
Un șir este într-adevăr un număr, cum ar fi 123 sau 127, care se întâmplă de a delimita
în cazul în care un șir începe în memoria computerului.
>> Dar aceasta nu reprezintă șir, per se, în sine.
Și putem vedea acest lucru, după cum urmează.
Lasă-mă să merg mai departe și să se deschidă un cod care e printre
exemple de cod sursă de astăzi.
Și am de gând să merg mai departe și deschide la, să zicem, compara-0.c.
Acesta este un program cu erori care se întâmplă să fie puse în aplicare după cum urmează.
>> În primul rând.
Am de gând să spun ceva.
Apoi, am de gând să merg mai departe și obține un șir de utilizator
în care linia următoare.
Apoi, am de gând să o spun din nou.
Apoi am de gând pentru a obține un alt șir de la utilizator.
>> Și observați, eu arăt una din siruri într-o variabilă numită s, i
un alt din aceste siruri de caractere într-o variabilă numită t.
Și acum am de gând să ceară, foarte în mod rezonabil, că dacă e egal egal t,
șirurile sunt aceleași.
Tastați același lucru.
Altfel, siruri de caractere sunt Nu același lucru.
>> La urma urmei, dacă am de intrare două int, două caractere, două flotoare, două duble, nici de
tipurile de date care le-am vorbit despre până acum să le compare -
amintesc că am făcut foarte clar de ceva vreme în urmă că tu nu faci acest lucru, pentru că o
semn egal unic este, desigur, operatorului de atribuire.
Așa că ar fi un bug.
>> Noi folosim semnul egal egal, care compară într-adevăr
lucruri pentru adevărata egalitate.
Dar eu susțin acest lucru este buggy.
Dacă am merge mai departe și de a face compara la zero, și apoi nu dot slash compara zero.
Și am tip în, să zicem, salut.
Și apoi să-l salut din nou.
Literalmente același lucru, computerul creanțe am scris lucruri diferite.
>> Acum, poate doar am scris gresit ceva.
Voi scrie numele meu de data asta.
Adică, salut.
Bună ziua.
Este diferit de fiecare data.
>> Ei bine, de ce este asta?
Ce se intampla cu adevarat sub capota?
Ei bine, ce se întâmplă cu adevărat pe dedesubt hota este șirul apoi
Am scris în acea prima dată, de exemplu, este cuvântul salut, desigur.
Dar dacă ne reprezentăm această sub capota, amintesc că o
string este într-o matrice.
Și am spus la fel de mult în trecut.
>> Deci, dacă am trage ca matrice ca aceasta, sunt O să reprezinte ceva destul de
similar cu ceea ce am făcut acum o clipă.
Și nu e de fapt ceva special aici, de asemenea.
Ce am determina sa la sfârșitul fiecărui șir?
Da, acest zero, backslash, care este doar modul de reprezentare,
literalmente, 00000000.
Opt 0 biți într-un rând.
>> Nu știu, sincer, ce-i după această.
Asta e doar o grămadă mai mult RAM interiorul computerului meu.
Dar aceasta este o matrice.
Am vorbit despre tablouri înainte.
Și vorbim de obicei despre matrice ca fiind locația la zero,
apoi unul, apoi doi.
Dar asta e doar pentru comoditate.
Și asta e cu totul relativ.
>> Când sunteți de fapt obtinerea de memorie de la calculator, este, desigur, orice
2 miliarde de unele bytes ciudate, potențial.
Deci, într-adevăr sub capota, în tot acest timp, da.
Acest lucru ar putea fi foarte bine la zero suport.
Dar dacă sapi mai adanc sub capota, care este într-adevăr
adresa numărul 123.
Aceasta este adresa 124.
Aceasta este adresa 125.
>> Și nu am în bară de data asta.
Acestea sunt acum una bytes în afară de ceea ce motiv?
Cât de mare este un char?
Un caracter este doar un octet.
Un int este de obicei de patru octeți.
Deci, de aceea am făcut 123, 127, 131 și așa mai departe.
Acum pot păstra matematica simpla și fă plus 1.
Și acest lucru este acum ceea ce se întâmplă cu adevărat pe sub capota.
>> Deci, atunci când declara ceva de genul asta, șir s, aceasta este de fapt -
se pare -
stele char.
Stea, desigur, înseamnă adresa, indicatorul aka.
Deci, este adresa de ceva.
Care este adresa?
>> Ei bine -
Eu sunt singurul care poate vedea foarte punct important Fac, sau cred
Fac.
Deci, string -
lucrul trist este ca eu am un monitor chiar acolo unde am
ar fi putut vedea asta.
>> În regulă, deci șirul s este ceea ce Am declarat anterior.
Dar se pare că, datorită unui mic magie în CS50 biblioteca, toate acestea
șir timp are literalmente fost stele char.
Stele înseamnă din nou pointer sau adresa.
Faptul că se flanchează Cuvântul caracter înseamnă că este
adresa unui personaj.
>> Deci, dacă se string este numit, și eu tip în H-E-L-L-O, propune acum ceea ce a obține
șir fost literalmente întoarce toate de data aceasta, chiar dacă ne-am mai
simplificat lumea?
Ce se obține șirul de fapt, reveni ca valoarea schimb?
>> 123 în acest caz, de exemplu.
Anterior am spus că se string pur și simplu returnează un șir, o secvență de
caractere.
Dar asta e un pic de o minciună albă.
Modul în care se string într-adevăr funcționează sub capota este ea devine o
șir de la utilizator.
Acesta plops caracterele el sau ea tipuri de memorie.
Se pune un zero backslash la sfârșitul dintre cei secvență de caractere.
>> Dar atunci ce se obține șirul literalmente reveni?
Se întoarce literalmente adresa primele bytes din RAM care
este folosit pentru putere.
Și se pare că doar prin revenirea o singură adresă a
primul caracter în șir, care este suficient pentru a găsi toate elementele de
șir.
>> Cu alte cuvinte, pentru a primi șir nu are să se întoarcă 123 și 124 și 125.
Aceasta nu trebuie să-mi dea un lung lista a tuturor octeți care
șir meu este folosind.
Deoarece unul, toate sunt spate în spate.
Și doi, bazat pe prima adresa, eu pot da seama unde se termină șirul.
Cum?
>> Caracterul nul special, backslash zero la sfârșitul.
Deci, cu alte cuvinte, dacă treci în jurul -
interiorul variabile -
adresa de un char, si va asumati că, la sfârșitul oricărui șir, orice
secvență de caractere, ca noi, oamenii, cred că de siruri de caractere, dacă presupuneți că
la sfârșitul oricărei astfel de string nu e un zero backslash, esti de aur.
Pentru că puteți găsi întotdeauna sfârșitul unui șir.
>> Acum, ceea ce este într-adevăr, atunci va pe în acest program?
De ce este acest program, compara-0.c, buggy?
Ce este, de fapt se compară?
Da?
>> STUDENT: [inaudibil].
>> DAVID MALAN: Exact.
Este compararea locații siruri de caractere.
Deci, dacă utilizatorul a introdus în Bună ziua dată, așa cum am făcut-o, memorie s-ar putea sfârși prin a
aratand ca aceasta.
Dacă atunci utilizatorul tipurile din Bună din nou, dar de apel ajunge din nou string, C este
nu deosebit de inteligent dacă nu vă învață să fie inteligent de scrierea de cod.
>> C -
și calculatoare în general -
dacă tastați în cuvântul salut din nou, stii ce ai de gând pentru a obține.
Esti doar mergi la a lua un al doilea tablou de memorie pe care, da, se întâmplă să fie
stocarea H-E-L-L-O și așa mai departe.
>> Se va arata la fel de noi, oamenii, dar această adresă
ar putea să nu fie 123.
S-ar putea doar atât întâmpla ca Sistemul de operare are unele disponibile
spațiu de exemplu la locație -
să spunem ceva arbitrar, ca aceasta este poziția 200.
Și aceasta este poziția 201.
Și aceasta este poziția 202.
Nu avem nici o idee unde e Va fi în memorie.
>> Dar ce înseamnă acest lucru este că ceea ce este O să fie depozitate în cele din urmă în s?
Numărul 123.
Ce se întâmplă să fie stocate în t, în acest exemplu arbitrar?
Numărul 200.
Și tot ceea ce înseamnă, atunci este evident, 123 nu este egal cu 200.
Și astfel, această condiție, dacă nu se evaluează la TRUE.
Deoarece șir obține este de folosind diferite bucăți de memorie de fiecare dată.
>> Acum putem vedea acest lucru din nou într-un alt exemplu.
Lasă-mă să merg mai departe și să se deschidă copie-0.c.
Eu susțin că acest exemplu se va încercați - dar nu - pentru a copia două șiruri
după cum urmează.
>> Am de gând să spun ceva pentru utilizator.
Am apoi merge pentru a obține o șir și îl numesc e.
Și acum, eu fac acest cec aici.
Am menționat acest lucru o înapoi în timp.
Dar când s-ar putea obține șir intoarce null, un alt caracter special, sau speciale
simbol Să zicem.
Dacă e din memorie.
>> De exemplu, dacă utilizatorul este într-adevăr fiind dificil și tipuri de atroce
numărul de caractere de la tastatură și hit-uri Enter.
În cazul în care numărul de caractere pur si simplu nu se poate se potrivesc în RAM pentru orice nebun
motiv, și se string s-ar putea foarte bine intoarce null.
>> Sau, dacă programul în sine este de a face o mulțime de alte lucruri și nu doar
nu suficientă memorie pentru șir get pentru a reuși, ar putea sfârși
până se întoarce null.
Dar să fim mai precis ca la ceea ce este aceasta.
Ce este e Tipul de date cu adevărat?
Stele char.
>> Deci, se dovedește acum că se pot dezlipi înapoi stratul de nul.
Se pare că, nul este - da, în mod evident un simbol special.
Dar ceea ce este cu adevarat?
Într-adevăr, null este doar un simbol pe care le oamenii folosesc pentru a reprezenta zero, la fel de bine.
>> Deci, autorii C, și calculatoare mai general, a decis ani în urmă
că, știi ce.
De ce nu ne asigurăm că nici un utilizator de date este niciodată, niciodată, niciodată
depozitate la zero pa?
De fapt, chiar și în exemplul mea arbitrară înainte, nu am începe numerotarea
bytes de la zero.
Am început de la o.
Pentru că știa că oamenii din lume au decis să-și rezerve zero
octet în memoria RAM cuiva ca ceva special.
>> Motivul fiind, oricând doriți să semnala că ceva a mers prost
cu privire la adrese, v-ați întors nul - altfel cunoscut sub numele de zero -
și pentru că știți că nu există nici o legitim de date la adresa de zero, în mod clar
care înseamnă o eroare.
Și de aceea noi, prin convenție, verificați pentru nul și retur ceva
ca unul din aceste cazuri.
>> Deci, dacă vom derula în jos acum, aceasta este doar apoi unele verificarea erorilor, doar în cazul în
ceva a mers prost cu [? cauțiune?]
totul și ieșiți din programul de prin întoarcerea mai devreme.
Această linie acum ar putea fi rescrisă deoarece acest lucru, ceea ce înseamnă ce?
Pe partea stângă, da-mi un alt pointer la un caracter, și îl numesc t.
Ce am depozitarea interiorul t, pe baza pe aceasta linie de cod?
>> Am stocarea o locație.
În special locație care a fost în s..
Deci, dacă utilizatorul a introdus în Bună ziua, și că primul salut se întâmplă să se încheie
aici, apoi 123 numărul este să vină înapoi de la a obține
șir și să fie depozitate -
așa cum am spus mai devreme -
în s..
>> Când Declar acum un alt indicator pentru un caracter și să-l t, ceea ce numărul este
literalmente de gând să se încheie până în t in functie de poveste?
Așa 123.
>> Deci, punct de vedere tehnic acum atât e și Nu sunt orientate spre exactă
aceleași bucăți de memorie.
Deci, observați ce am de gând să fac acum la demonstra că acest program este buggy.
>> În primul rând am de gând să pretind, cu un f imprimare, valorificarea
copie a șirului.
Apoi, am de gând să fac un pic de verificarea erorilor.
Am de gând să vă asigurați.
Să ne asigurăm că t șirul este la Cel mai mare decât zero, în lungime,
deci nu e un personaj acolo pentru a valorifica efectiv.
>> Și apoi s-ar putea aminti acest din exemplele precedente.
2 sus - care este în fișierul ctype.h.
T suportul zero, îmi dă zero Caracterul de t șir.
Și 2 sus că aceeași valoare, de Desigur, îl convertește în majuscule.
>> Deci intuitiv, aceasta a subliniat linie de cod este valorificarea prima
scrisoare în t.
Dar nu este valorificarea, intuitiv, prima literă din s..
Dar dacă te gândești înainte, ceea ce sunt eu pe cale de a vedea atunci când am rula acest program
și imprima atât în ​​original, e, și așa-numita copie, t?
>> Ei de fapt, va fi la fel.
Și de ce au de gând să fie la fel?
Sunt atât de indicare a exact același lucru.
Deci, hai sa facem acest lucru.
>> Face la zero copie.
Se compilează OK.
Permiteți-mi să ruleze la zero copie.
Lasă-mă să tastați ceva de genul salut în toate cu litere mici, apoi apăsați Enter.
Și susține că atât e originală și copia sunt într-adevăr identice.
>> Deci, ce sa întâmplat aici?
Lasă-mă retrag această imagine doar pentru a spune povestea într-un
mod ușor diferit.
Ce se întâmplă cu adevărat pe sub capota când declar ceva de genul
char pornire s, sau un șir s, Primesc un pointer -
care se întâmplă să fie de patru bytes în CS50 aparat
și într-o mulțime de calculatoare.
Și am de gând să numim această uri.
Și acest lucru are în prezent o valoare necunoscută.
>> Când declara o variabilă, dacă nu pune-te o valoare acolo, care
știe ce-i acolo.
Ar putea fi un secvență aleatoare de biți de la executarea precedent.
Așa că atunci când am, în linia mea de cod primesc șir, și apoi depozitați retur
valoarea s obține șir într-un fel -
Și vom în cele din urmă coaja de spate cum se lucrări de coarde, alocă cumva o
matrice care, probabil, arată un pic ca aceasta.
H-E-L-L-O, backslash zero.
>> Să presupunem că aceasta este adresa 123 doar prima consistenta.
Deci, se întoarce șir, în a subliniat linie de acolo, se întoarce
număr am spus, 123.
Deci, ce se întâmplă cu adevărat în interiorul e aici?
>> Ei bine, ce se întâmplă cu adevărat interiorul s este 123.
Dar sincer, eu sunt cam confuz de toate aceste adrese,
toate aceste numere arbitrare.
123, 124, 127.
Deci, haideți să simplifica de fapt lumea un pic.
>> Când vorbim despre indicii, sincer, să noi, oamenii, care naiba îi pasă unde
lucrurile sunt în memorie?
Care este complet arbitrar.
Se va depinde de modul în care mult RAM utilizatorul are.
Se va depinde de momentul în ziua rulați programul, probabil, și
ceea ce de intrare de utilizator îți dă.
Suntem locuință cu detalii neimportante.
>> Deci, hai sa abstract departe și spune că, atunci când rulați o linie de cod ca acest lucru,
char stele s devine retur valoarea șir GET.
De ce nu am loc doar trage ceea ce ține de asteptare un indicator ca și cum este
arătând spre ceva?
Deci, eu pretind că e sus există un indicator -
sub capota este o adresă.
Dar este doar subliniind primul octet în
șir care a fost returnat.
>> Dacă mă întorc acum la codul aici, ceea ce se întâmplă la această linie?
Ei bine, în această linie a subliniat acum, Sunt declararea aparent un alt
variabilă numită t.
Dar este, de asemenea, un pointer, așa că am de gând să-l atrage ca, in teorie, exact
aceeași cutie de dimensiuni.
Și am de gând să-i spunem t.
>> Și acum, dacă ne întoarcem la codul din nou, când am stoca e în interiorul t,
ce sunt punct de vedere tehnic punerea interiorul t?
Ei bine, punct de vedere tehnic, acest lucru a fost 123 numărul.
Deci, într-adevăr ar trebui să fie scris 123 numărul acolo.
Dar haideți să nivel superior ia.
t, dacă acesta este doar un pointer, intuitiv, este doar faptul că.
Asta-i tot ce-a fi stocate acolo.
>> Deci, acum, în ultimele rânduri interesante de cod, atunci când merg de fapt despre
valorificarea caracterul zero, în t, ce se întâmplă?
Ei bine, t suport zero, este acum îndreptat de ce caracter, probabil?
>> Se indică de ore.
Pentru că nu suport la zero -
amintesc, aceasta este sintaxa vechi. t suport zero, înseamnă doar dacă T este un șir, t
suport zero, înseamnă obținerea zero personaj în acea putere.
Deci, ceea ce înseamnă că într-adevăr se merge la această matrice -
si da, acest lucru ar putea fi 123, aceasta ar putea fi 124.
Dar totul e relativ, amintiți-vă.
Ori de câte ori vorbim despre o matrice, avem avantajul de a vorbi despre
Indicii relativi.
>> Iar acum putem presupune doar că t zero, suportul este H.
Deci, dacă am numi 2 de sus pe el, ceea ce e a face într-adevăr este valorificarea
h minuscule în majuscule H. Dar, desigur, ceea ce este s?
Se indică în același șir al naibii.
>> Deci, asta e tot ce sa întâmplat în acest cod până acum.
Deci, ce este atunci implicare?
Cum putem rezolva aceste două probleme?
Cum putem compara cu siruri de caractere reale?
>> Ei bine intuitiv, cum ar fi te duci despre compararea două
siruri de caractere pentru egalitate adevărat?
>> Ce înseamnă dacă două siruri de caractere sunt egale?
În mod clar nu ca adresele lor sunt egal în memorie, pentru că este o mică
nivel de detalii de implementare.
Toate caracterele sunt aceleași.
Deci, permiteți-mi să propun, și permiteți-mi să introducă în versiunea una dintre compare.c
aici, așa compara-1.c.
>> Permiteți-mi să propun că vom obține încă o indicatorul numit s, și magazin în ea
returna valoarea șir GET.
Să facem același lucru cu t.
Astfel încât nici unul dintre codul este diferit.
Am de gând să adăugați un pic mai verificarea erorilor acum.
Deci, acum că suntem un fel de peeling înapoi aceste straturi în CS50 de ce un șir
de fapt este, trebuie să fie mai mult anal despre a face sigur că nu abuza
Valorile invalide, cum ar fi nule.
>> Deci, eu sunt doar de gând să verifice.
Dacă s nu este egal cu zero și T nu egal nul, asta înseamnă că suntem bine.
Ia șir nu am greșit obținerea oricare dintre aceste siruri de caractere.
Și puteți ghici, probabil, acum, ce nu STR CMP probabil nu?
String comparație.
>> Deci, dacă ați programul in Java înainte, acest lucru este ca metoda egali în
clasa string.
Dar pentru cei dintre voi care nu au programate înainte,
aceasta este doar o funcție C.
Se întâmplă să vină într-o fișier numit string.h.
Asta în cazul în care este declarat.
>> Și string comparație -
Am uitat de fapt, utilizarea acestuia, dar nu conteaza asta.
Amintiti-va ca putem face om, se amestecă compara.
Și acest lucru se întâmplă pentru a aduce Linux manual programatori.
Și este, sincer, un pic criptic.
Dar eu pot vedea aici că, da.
Trebuie să includă string.h.
>> Și se spune aici în descriere, " Funcția de comparare șir compară
cele două șiruri S1 și S2. "Și S1 și S2 sunt aparent două
argumente trecut inch
Nu-mi amintesc cu adevărat ce const este, dar acum observa -
și este posibil să fi văzut deja acest lucru atunci când ai folosi paginile de manual, dacă
au toate -
că stele char este doar sinonim cu șir.
>> Deci, se compară cele două șiruri, S1 și S2, și returnează un număr întreg mai mic
mică sau egală cu sau mai mare decât zero dacă S1 este găsit, respectiv, să fie
mai puțin, sau potrivesc, sau să fie mai mare decât S2.
Asta e doar un mod foarte complex de a spune ca șir compara revine
zero dacă două șiruri sunt intuitiv identice, caracterul de
caracter pentru caracter.
>> Se returnează un număr negativ dacă s, în ordine alfabetică, ar trebui
să vină înainte de t.
Sau returnează un număr pozitiv, dacă s ar trebui să vină după t
în ordine alfabetică.
Deci, cu această funcție simplă, ar putea te, de exemplu, sortați o
grămadă de cuvinte?
>> Deci, în această nouă versiune, am de gând pentru a merge mai departe și de a face compare1.
Dot slash compara unul.
Voi tip de salut, în toate cazurile inferioară.
Am de gând să tastați în Hello în toate litere mici din nou.
Și din fericire acum își dă seama Am scris același lucru.
>> Între timp, dacă am introduce salut în jos caz și HELLO în majuscule și
le compara, am scris lucruri diferite.
Deoarece nu numai că sunt adresele diferite, dar suntem compararea
diferite personaje din nou și din nou.
>> Ei bine, să mergem și să stabilească un alte probleme acum.
Lasă-mă să deschid versiunea una din copie, care abordează acum
această problemă, după cum urmează.
Și aceasta o va arăta un pic mai complex.
Dar dacă te gândești la ceea ce problema am au nevoie pentru a rezolva, speram ca aceasta va fi
șterge într-o clipă acum.
>> Deci, această primă linie, char start t, în termeni de nespecialist ar putea cineva propune
ceea ce înseamnă aici această linie?
Char stele t, ce este că face?
>> Bun.
Creați un pointer la un loc în memorie.
Și lasă-mă să-l un pic rafina.
Declara o variabila care va stoca Adresa de unele char în memorie, doar
să fie un pic mai buna.
>> OK, deci acum pe partea dreapta, am nu a văzut unul dintre aceste funcții
înainte, malloc.
Dar ceea ce ar putea însemna asta?
Alocarea de memorie.
Alocare de memorie.
>> Deci, se pare că, până acum, ne- nu au avut într-adevăr un mod puternic de
cere sistemului de operare, da-mi ceva de memorie.
Mai degrabă, avem acum o funcție numită malloc care face exact acest lucru.
Chiar dacă acest lucru este un pic de o distragere a atenției chiar acum, observăm că în
între cele două paranteze este va fi doar un număr.
În cazul în care l-am scris în cauză mărci poate fi un număr.
>> Și că numărul înseamnă, da-mi 10 bytes.
Dă-mi 20 de bytes.
Dă-mi 100 de bytes.
Și malloc va face tot posibilul pentru a cere sistemul de operare -
Linux, în acest caz -
Hei, sunt de 100 de bytes de RAM disponibil?
Dacă este așa, le restituie bytes la mine prin revenind adresa care a
aceste bytes, poate?
Foarte primul.
>> Deci, aici - și aceasta este predominantă în C, în orice moment esti
de-a face cu adrese?
Sunteți aproape întotdeauna de-a face cu Primul astfel de adresa, indiferent de cât de mare
o bucată de memorie sunt în curs de dat inapoi, ca să spunem așa.
>> Deci, haideți să se arunca cu capul în aici.
Am încercat să aloce cât de multe bytes, mai exact?
Bine.
Lungime șir de e - Hai face un exemplu concret.
Dacă s este salut, H-E-L-L-O, ce-i Lungimea șir de e, în mod evident?
Deci, este cinci.
Dar fac un plus 1 pe care, de ce?
De ce vreau șase bytes în loc de cinci?
Caracter nul.
>> Nu vreau să plec de pe această caracter nul special.
Pentru că dacă am face o copie de Bună ziua și doar nu H-E-L-L-O, dar eu nu pun
că caracter special, computerul nu ar putea avea, din întâmplare, un backslash
Zero pentru mine.
Și așa, dacă am încercat să dau seama de lungimea copia, am putea crede că
este de 20 de caractere, sau un milion caractere dacă am doar nu se întâmplă
a lovit un zero backslash.
>> Deci, avem nevoie de șase octeți pentru a stoca H-E-L-L-O, backslash zero.
Și atunci acest lucru este doar pentru a fi super-anal.
Să presupunem că am uitat ce de marimea unui caracter este.
Ne tot spun că e un octet.
Și este de obicei.
În teorie, ar putea fi ceva diferite, pe un alt Mac sau un
diferit PC.
>> Deci, se pare că există acest operator numit sizeof că, dacă acesta trece
Numele de un tip de date - cum ar fi char, sau int sau float -
vă va spune, dinamic, câte bytes un caracter preia în acest
special de calculator.
>> Deci, acest lucru este eficient doar cum ar spune ori 1 sau
ori nimic.
Dar eu o fac doar pentru a fi super-anal, că doar în cazul în care un char diferă
pe computerul dumneavoastră față de a mea, în acest fel matematica este întotdeauna o să verific.
>> În cele din urmă, aici am verifica pentru nul, care este întotdeauna bună practică - din nou,
orice moment avem de-a face cu indicii.
Dacă malloc nu a fost în măsură să dea mi șase revedere - care este
puțin probabil, dar doar în cazul în care -
reveni unul imediat.
Și acum, mergeți mai departe și să copiați șir, după cum urmează.
Și acest lucru este sintaxa familiar, chiar dacă într-un rol diferit.
>> Am de gând să merg mai departe și a obține șirul lungime de e și îl stochează în n.
Am apoi merge la repeta de i este egal zero, până la și inclusiv n,
mai mare sau egală cu.
Astfel că la fiecare iterație, am pus Caracterul lea al s-lea în
Caracterul de t.
>> Deci, ce se întâmplă cu adevărat pe dedesubt capota aici?
Ei bine, dacă acest lucru, de exemplu, este s -
și am scris în cuvântul H-E-L-L-O și există un zero backslash.
Și din nou, acest lucru este s îndreptat aici.
Și aici, acum este t.
>> Și acest lucru se indică acum să o copie de memorie, nu?
Malloc mi-a dat un întreg bucată de memorie.
Nu știu inițial ce-i în oricare dintre aceste locații.
Așa că am de gând să mă gândesc la acestea ca o grămadă de semne de întrebare.
>> Dar, de îndată ce am început looping de la zero, pe sus prin lungimea s, t
suport zero și t suport 1 -
și îl voi pune acum pe deasupra capului -
t suport zero și s suport medie zero pe care am de gând să fie copierea
iterativă h în aici, E-L-L-O. În plus, pentru că am făcut plus
1, backslash zero.
>> Deci, acum, în caz de compara-1.c, în cele din urmă, dacă am imprima
capitalizare de t, ar trebui să ne vezi că este de neschimbat.
Lasă-mă să merg mai departe acum și de a face acest lucru.
Deci, asigurați-copy1.
Dot slash copy1.
Am de gând să tastați în salut, Enter.
Și acum observați, doar copia a fost capitalizate.
Pentru că într-adevăr avea două bucăți de memorie.
>> Din păcate, se poate face ceva destul de lucruri rele și destul de periculos aici.
Permiteți-mi trage un exemplu aici acum, care ne dă un exemplu de câteva
linii diferite.
Deci, doar intuitiv aici, prima linie de cod, int x stele, se declară
o variabilă numită x.
Și ceea ce este tipul de date de ce variabile?
Care este tipul de date de care variabile?
Că nu a fost Cliffhanger.
>> Tipul de date este steaua Int.
Deci, ce înseamnă asta? x va stoca adresa unui Int.
Simplu ca asta.
Y este de gând pentru a stoca adresa de un int.
Care este a treia linie din Codul faci acolo?
Este alocarea câte bytes, cel mai probabil?
Patru.
Datorită mărimii un int este în general, patru, malloc de patru dă
mi înapoi adresa de o bucată de memorie, primul de a căror octeți este
stocate acum în x.
>> Acum ne mișcăm un pic mai repede.
Steaua x înseamnă ce?
Aceasta înseamnă du-te la acea adresă și a pus ce numărul de acolo?
Pune numărul 42 acolo.
Star Y înseamnă du-te la ceea ce e la Y și a pus numărul 13 acolo.
>> Dar stai un minut.
Ce este în y în acest moment?
Care este adresa y depozitare?
Noi nu știm, nu?
Noi nu am folosi o dată atribuirea Operatorul implică y.
Deci, Y ca a declarat pe a doua linie a Codul este doar o valoare gunoi, o mare
semn de întrebare ca să spunem așa.
Acesta ar putea fi îndreptat aleatoriu a ceva în memorie, care
este în general prost.
>> Asa ca imediat ce am lovit acea linie acolo, star Y este egal cu 13, ceva rău,
ceva foarte rău este de aproximativ să se întâmple la Binky.
Deci, haideți să vedem ce se va termina întâmplă binky aici, în acest moment
sau cam asa arata.
>> [Redare video]
>> -Hei, Binky.
Trezește-te.
E timpul pentru distracție pointer.
>> -Ce-i asta?
Aflați mai multe despre indicii?
Oh, goodie.
>> -Ei bine, pentru a începe, cred că suntem avea nevoie de câteva indicii.
>> -OK.
Acest cod alocă două indicatoare care pot indica la întregi.
>> -Bine, bine, eu văd cele două indicii.
Dar acestea nu par a fi arătând spre nimic.
>> -Asta-i drept.
Inițial, indicii nu punctul de nimic.
Lucrurile pe care le indica sunt numite pointees, și de a le propune este o
etapă separată.
>> -Oh, dreapta, dreapta.
Știam că.
Cele pointees sunt separate.
Deci, cum a face tu aloca un pointee?
>> -OK.
Ei bine, acest cod alocă un nou întregi pointee, și această parte stabilește x
la punctul să-l.
>> -Hei, care arată mai bine.
Astfel încât să se facă ceva.
>> -OK.
Voi dereference indicatorul x pentru a stoca numărul 42 în pointee acesteia.
Pentru acest truc, am nevoie de magia mea bagheta de dereferencing.
>> -Ta bagheta magica de dereferencing?
Uh, asta e minunat.
>> -Aceasta este ceea ce Codul arata.
Am sa pun doar la numărul, și -
>> -Hei, uite.
Nu merge.
Deci, face o dereference pe x urmează săgeata pentru a accesa pointee sale.
În acest caz, pentru a stoca 42 acolo.
Hei, încercați să utilizați-l pentru a stoca numărul 13 prin cealaltă indicatorul, y.
>> -OK.
Voi merge doar aici la y și Obțineți numărul 13 înființat.
Și apoi să ia bagheta de dereferencing și chiar -
Oau!
>> -Oh, hei.
Că nu au de lucru.
Spune, Binky, nu cred dereferencing Y este o idee bună,
deoarece înființarea pointee este o etapă separată.
Și nu cred că am făcut-o vreodată.
>> -Hmm.
Bun punct.
>> -Da, am alocat y indicatorul.
Dar niciodată nu l-am setat la indica o pointee.
>> -Hmm.
Foarte atent.
>> -Hei, sunteți în căutarea bine acolo, Binky.
Poți să repari, astfel încât punctele y la fel ca și pointee x?
>> -Sigur.
Voi folosi bagheta magică de cesiune pointer.
>> -Asta va fi o problema ca înainte?
>> -Nu.
Acest lucru nu atinge pointees.
Se schimbă doar un pointer la punctul la același lucru ca un alt.
>> -Oh, văd.
Acum y puncte în același loc ca și x.
Așteaptă.
Acum y este fix.
Ea are o pointee.
Astfel, puteți încerca bagheta de dereferencing din nou
pentru a trimite peste 13 ani.
>> -OK.
Aici merge.
>> -Hei, uita-te la asta.
Acum dereferencing lucrări pe y.
Și pentru că indicii sunt de partajare să rețină pointee, ele
atât vezi 13.
>> -Da.
Partajarea.
Oricare ar fi.
Deci, vom schimba locul acum?
>> -Oh, uite.
Nu mai avem timp.
>> -Dar -
>> -Doar amintiți-vă trei Normele indicator.
Numărul unu, structura de bază este că aveți un pointer.
Și-l arată pe de o pointee.
Dar indicatorul și pointee sunt separate.
Și eroarea comun este de a înființat un pointer, dar a
uita la dat un pointee.
>> Numărul doi, indicatorul dereferencing începe la indicatorul si urmeaza sa
săgeată pentru a avea acces pointee acesteia.
După cum știm cu toții, aceasta funcționează numai dacă există este un pointee, care se întoarce la
Regula numărul unu.
>> Numărul trei, cesiune indicatorul se un pointer și modificările pe care să indice
același pointee ca un alt indicator.
Deci, după cesiune, cele două indicii vor
punct la același pointee.
Uneori, care este numit de partajare.
Și asta e tot ce există la acesta, într-adevăr.
Bye bye acum.
>> [END redare video]
>> DAVID MALAN: Deci, mai mult pe indicatori, mai mult pe Binky săptămâna viitoare.
Ne vedem luni.