[Powered by Google Translate] [Săptămâna 4, Continuare]
[David J. Malan - Universitatea Harvard]
[Acest lucru este CS50. - CS50.TV]
>> Acest lucru este CS50, iar acest lucru este sfârșitul a 4 săptămâni.
Deci, niște vești bune și niște vești proaste.
Nr prelegere luni, nici o problema stabilit săptămâna viitoare. [Elevi aplauze]
Nu te duci să-i placă în cazul în care acest lucru se va.
Dar noi nu avem acest loc miercurea viitoare,
și există, de asemenea, pe programa de curs 1 Vineri vinerea viitoare, astfel încât să putem rămâne pe pistă.
Dar totul va fi filmat, ca de obicei, astfel încât să nu vă faceți griji.
>> Iar cu privire la quiz 0 Ce vom face spre sfarsitul saptamanii
se publica pe pagina de start cs50.net cursului o explicație
de ce fel de așteptări ar trebui să aveți atunci când vine vorba de testul primul.
În general, aceasta va fi alegerea multiplă, adevărat-fals, răspuns scurt, probleme scurte de codare.
Nu te duci să fie de așteptat să pună în aplicare echivalente
de o problemă care le-ar vedea pe o PSET, pentru care aveți un calculator
și un depanator și cum ar fi, dar nu va fi mici probleme de codificare.
>> Și într-adevăr, cel mai bun ghid pentru a obține un sentiment de ceea ce CS50 teste sunt ca
este mergi la cs50.net, du-te la link-ul Quiz,
și puteți vedea în ultimii câțiva ani în valoare de chestionare.
Doar dau seama că curriculum-ul nu a fost întotdeauna aceeași de-a lungul anilor.
Uneori se adaugă, uneori scade,
așa că, dacă vedeți un subiect pe unul dintre cei vechi concursuri
că nu aveți nici o idee despre ce e vorba, e fie că am făcut-o acopere
sau că nu am o acopere.
Dar, în formă de comentarii, în această duminică, luni și marți
precum și un curs de nivel sesiune de reexaminare cu privire la noaptea de duminică -
timp și locație pentru a fi anunțate pe pagina cursului -
ai toate o oportunitate de a revizui cu semenii didactice de curs de
materiale pentru acest an, atât în ​​secțiune și ca o clasă complet,
și a celor va fi filmat, ca de obicei la fel de bine.
>> Bine. Deci, fără alte formalități, o comentariu la pass / fail și adăugați / drop.
Este posibil să fi văzut notițele mele noaptea trecută, și acest lucru este într-adevăr doar o asigurare suplimentară
că, dacă ești printre cei mai confortabil mod special sau undeva în între
și te simți un pic în peste cap,
dau seama că este într-adevăr destul de normal, și nu există o structură de sprijin amplu în loc,
dintre care unul orelor de serviciu au fost intenție privind îmbunătățirea tot mai mult pe e-mail meu noaptea trecută,
și dau seama de asemenea, că o opțiune ca pass / fail pentru o clasa ca aceasta
într-adevăr este menit ca un mecanism de a lua de pe marginea unui curs de acest fel,
astfel că din nou, dacă îți petreci cele 10, 15, 20 de ore
doar încercarea de a obține niște PSET să lucreze și să știi că ești 90-95% din drum acolo
dar nu puteți găsi unele bug naibii, într-un pass / fail model care e un fel de bine.
>> Ideea este că, cu acest mecanism poti sa te duci apoi să se concentreze pe alte psets dvs.
sau dormi sau ce este pe care doriți să se concentreze asupra.
Deci dau seama că aveți până la această marți vine - punct de vedere tehnic cincea luni,
dar e de o vacanță, așa că de marți vin - pentru a comuta de la pass / fail la versa gradate sau vice.
Și dacă ești într-adevăr pe marginea prăpastiei și se gândesc să abandoneze cu totul,
vă rugăm să-mi prinde după prelegere sau drop-mi un bilet.
Ne-ar plăcea să chat-ul, cel puțin înainte de a licita adio.
Bine. Așa că am început să iau roțile de formare de pe ultima oară.
În special, ne-am concentrat pe șir.
Șir este ceva care este declarat în bibliotecă CS50,
în special în acel fișier numit cs50.h pe care vom începe să se uite la această săptămână și viitoare.
Dar șirul este de fapt doar o simplificare a ceva
asta e un pic mai arcanely descris ca char *.
CHAR suntem familiarizați cu. E doar un singur caracter.
Dar, ca de luni * notat ce? >> [Elev] Un pointer.
Un pointer. Și ce e un pointer? >> [Elev] O adresă.
>> E ca o adresă, o locație în memorie.
Ce este o adresă sau o locație de memorie sau?
Din nou, toți dintre noi au laptop-uri cu un concert sau 2 GB de RAM, cel mai probabil în aceste zile,
și asta înseamnă că aveți un miliard de miliard de bytes sau 2 în valoare de memorie.
Și nu contează cu adevărat ceea ce se pare ca fizic,
dar ia pe credința că puteți numerota toate bytes individuale care laptop-ul propriu are -
acest lucru este octet 0, acest lucru este octet 1, acest lucru este octetul 2 miliarde de euro -
și că este exact ceea ce un calculator nu.
Când aloca spațiu pentru un singur caracter, de exemplu,
în mod evident trebuie să trăiască undeva în memoria computerului,
și poate că e de la numărul de octet 12345,
și că e undeva aici, în memoria computerului.
Și apoi adresa de caracterul este 12345.
>> Acum, în săptămâna 0, prin acum până în prezent, nu am cu adevărat păsat
în cazul în care lucrurile în memorie sunt stocate pentru că, de obicei, vom folosi simboluri,
variabile, și matrice pentru a obține de fapt, la datele noastre.
Dar, ca de luni și tot mai mult astăzi, acum ai de gând să aibă
toate capacitățile expresive mai cu programe de scris
pentru a manipula cu adevărat memoria unui computer cu toate acestea tu de cuviință,
pentru ambele scopuri bune și rele,
bug-uri fiind un rezultat foarte comun in acest moment in procesul de invatare chestia asta.
Dar ce înseamnă cu adevărat să fie un char *?
Să mergem mai departe înapoi la - și ne vom întoarce la Binky cum a promis astăzi.
Să mergem la un exemplu simplu aici.
Lasă-mă să salvați acest fișier ca compare.c, și lasă-mă să obține doar un cod șablon aici
includ așa stdio.h, permiteți-mi să dau, de asemenea, mă includ cs50.h. Voi mări acolo.
Permiteți-mi să încep scriu int principal, main (void), si acum vreau sa fac ceva de genul asta:
printf ("Dă-mi un șir:"), și apoi voi folosi e string se getString
pentru a obține un șir de utilizator, apoi am de gând să solicite utilizatorului pentru o alta.
("Dă-mi un alt șir:") și am de gând să-i ceară prin getString pentru a obține că.
Voi numi t t, deoarece vine dupa S și S este un nume frumos pentru un șir dacă e destul de generic.
Deci getString, iar acum vreau doar să fac o verificare bun-simț și am de gând să spun
în cazul în care (i == t), atunci mă duc să-i spun de utilizator printf ("Ai tastat același lucru \ n!");
mai am de gând să imprime ceva de genul ("Ai tastat ceva diferit \ n!")
sau orice propoziție va fi. Deci ceva de genul asta.
Apoi, ca de obicei, voi întoarce 0 ceea ce însemna doar ca nimic rau nu sa intamplat,
și am de gând să merg mai departe și compila si rula acest program.
>> Dar pe luni ne-am întâlnit acest program,
si de fapt s-au spus că nu este HELLO salutati nu este la revedere.
Comportamentul am vazut a fost un pic mai mult ca asta.
Lasă-mă să intru în directorul sursa mea, zoom in aici, și hai să facem comparație.
Compilat bine. Lasă-mă să fugi comparare. Dă-mi un șir: HELLO.
Dă-mi un alt șir: HELLO.
Ai tastat ceva diferit!
Ei bine, lasă-mă să încerc ceva mai simplu cum ar fi 50, 50. Ai tastat ceva diferit!
hi, hi. Deci în mod clar, ceva se întâmplă aici.
Dar ceea ce a fost explicația pentru ce?
Aparent, linia 12 este complet disfuncțional.
Care e problema fundamentală aici? Da. >> [Elev] Se compară adresele.
Da, exact. Este de fapt compararea adresele
în care HELLO HELLO și sunt stocate.
Nu e comparat scrisorile Bună, din nou și din nou,
pentru că ceea ce sa întâmplat cu adevărat, în tot acest timp am fost folosind getString -
Această tablă este din nou memoria calculatorului nostru,
și să spunem că eu numesc getString după ce a declarat o variabila.
Ce înseamnă memoria mea arata?
Să spunem că e arbitrar arata ca acest lucru. E un pătrat.
Și destul de mult orice moment, am atras o bucată de memorie pe ecran
daca e pe 32 de biți am fost desenând pătrate, cum ar fi acest lucru, deoarece, într-adevăr, în aparat,
un pointer, o adresă, este 32 de biți. E la fel ca un întreg.
Asta poate varia în funcție de sistemul informatic.
Aceia dintre voi care sunt vag familiarizat cu faptul că Mac-ul sau pe PC-ul este de 64 de biți,
că de fapt denotă că computerul este folosind 64-bit pointeri,
64-bit adrese, și printre upsides de care este computere
poate avea memorie RAM mult mai mult decât odinioară.
Pe scurt, înapoi în ziua când computerele utilizate numai 32 de biti
pentru a reprezenta adrese, cel mai mare număr de octeți ai putea reprezenta
în acest caz, a fost ceea ce în cazul în care aveți 32 de biți?
SO 4 miliarde de euro, drept, deoarece la 2 la 32 este de 4 miliarde de euro.
Acest număr a fost recurente în cursul.
>> Deci, dacă aveți doar 32 de biți, cel mai mare număr pe care puteți conta la este de aproximativ 4 miliarde de euro.
Dar asta a fost o limitare fundamentală de calculatoare până acum câțiva ani
pentru că dacă poate conta doar la fel de mare ca 4 miliarde de euro,
nu conteaza daca vei cumpara 8 GB de RAM sau chiar de 5 GB de RAM;
nu poți conta asa de mare, asa ca a fost inutil.
Ai putea accesa doar primele 3 sau 4 GB de memorie ale computerului dumneavoastră.
Asta e mai puțin de o problemă acum, și puteți cumpăra MacBook Pro și Dells
cu 8 GB de RAM sau chiar mai mult in aceste zile.
Dar dacă am aloca destul de simplu în acest program un pointer, un pointer numit s,
s-ar putea arata ca acest lucru pe ecran, deoarece într-adevăr, trebuie să ne coaja înapoi acest strat.
I a păstra șir spun, dar ca de luni, string este într-adevăr char *,
adresa unele caractere.
Așa că haideți să roata de formare, care întrerupe, deși vom continua utilizarea getString pentru acum.
Așa că m-am declarat lui, iar aceasta este o bucată de memorie, 32 biți.
Ce e aici, în memorie în mod implicit? >> [Elevului răspunsul neauzit]
Ce-i asta? >> [Elev] autogunoiere. >> Gunoi. Exact.
Dacă ați programator nu pun o valoare într-o variabilă, care știe ce este?
Uneori ai noroc si 0 al, care este un fel de o valoare frumos, curat default,
dar așa cum am văzut luni, uneori e un nonsens total,
un numar foarte mare pozitiv sau negativ, care a venit de unde?
Da. >> [Elev] Funcția înainte. Da >>.
>> De multe ori funcția pe care a fost numit înainte, deoarece aduc aminte,
cum suna funcții în memorie, acestea ocupă mai mult spațiu și mai de jos în sus,
și de îndată ce revine funcției, că memoria devine refolosite
de tipul următor, care este chemat, care utilizează aceeași felie dvs. de memorie.
Și dacă ați gunoi stânga există, valorile anterioare,
am putea confunda e ca având o anumită valoare atunci când într-adevăr nu am pus nimic acolo.
Deci, RAM nostru la acest moment arata ca acest lucru.
Acum, pe partea dreaptă a liniei 7 suntem de asteptare getString,
care am fost acum câteva săptămâni, dar ceea ce este cu adevărat getString face?
GetString scrise de personalul CS50 este un pic inteligent
în faptul că de îndată ce utilizatorul începe tastele tastare și hit-uri Enter,
GetString seama cum de multe taste au făcut lovitura de utilizare,
câte caractere am nevoie pentru a aloca memorie RAM pentru.
Și în cazul în care vine de la RAM, cine știe?
E undeva în calculatorul dvs. 2 GB sau fleacuri de memorie.
Dar să presupunem că calculatorul găsit spațiu pentru cuvantul HELLO chiar aici.
Cuvântul Am tastat fost H-E-L-L-O.
Și dacă am trage acest lucru ca pe o secvență de caractere, putem să o tragă ca asta.
Dar am nevoie să fac un lucru suplimentar. Ceea ce aparține la sfârșitul fiecărui șir în C?
Caracterul nul, pe care vom scrie ca \ 0.
E punct de vedere tehnic 0 număr, dar backslash face tot mai clar
că aceasta este literalmente numărul 0, întreg 0;
nu e, de exemplu, oferta-citatul 0 care v-ar tastați la tastatura.
Deci, acest lucru este HELLO.
>> Și ce-am spus, luni, că o funcție ca getString
este, de fapt întoarce toate aceste saptamani?
Nu e întoarce un șir pe sine pentru că nu au cu adevărat ceea ce înseamnă
deoarece siruri de caractere nu există. Sunt un fel de fabricatie în bibliotecă CS50.
Ce este de fapt un șir de caractere, mai tehnic? >> [Elev] E primul caracter.
Exact. E pur și simplu adresa primului caracter pe care utilizatorul tastat inch
Deci, dacă cuvântul meu HELLO sfârșește la 123 numărul de octet și apoi la numărul de octet 124,
125, 126, și așa mai departe, dacă aș numărul de octeți de doar mei de la 0 in sus,
ceea ce într-adevăr se întoarce getString este literalmente 123 numărul.
Deci, ceea ce se pune în 123 s este numărul nu, litera H, nu cuvântul HELLO,
pur și simplu adresa la care pot gasi prima scrisoare de HELLO.
Dar asta nu pare a fi suficient. Te-am rugat pentru un șir de caractere, nu un personaj.
Deci, cum putem sau computerul știu că ELLO tip de vin, împreună cu H?
Ce e un fel de acord avem? Da.
[Elev] Se tot spune sine pentru a găsi unele mai multe caractere. Exact >>.
>> E această convenție om-calculator, prin care, atunci când sunt de-a face cu siruri de caractere,
altfel cunoscut acum ca stelele char, pur și simplu trebuie să dau seama
în cazul în care sfârșitul fiecărui șir în viață este de fapt doar iterarea peste el, cu o buclă pentru,
o buclă în timp ce, indiferent, astfel încât atunci când veți găsi sfârșitul șirului
acum se poate deduce din faptul că, oh, tot cuvântul a fost HELLO.
Aceia dintre voi cu experienta in programare prealabilă ar putea cunoaște în Java
puteți apela doar lungimea și. în alte limbi puteți apela lungimea sau similar.
Asta pentru că într-o mulțime de limbi, mai ales lucrurile numit orientate-obiect de limbi,
lungimea de lucru este un fel de încapsulate în interiorul piesei de date în sine,
de mult cum am ID-uri încapsulate și numele și case în interiorul unui student de luni.
Dar C este mult mai mic nivel. Momentan nu sunt obiecte sau clase, în cazul în care ați auzit acești termeni înainte.
Tot ce trebuie este într-adevăr adrese de memorie.
Deci, aceasta este un fel de modul de modă veche de reprezentare a structurilor de date interesante.
Aveți o valoare de pornire ca adresa primului caracter
si apoi doar cateva convenție arbitrară că toată lumea este de acord să urmeze.
Deci, cum este lungimea șirului pusă în aplicare, ne-am propus?
Strlen, strlen, pe care unii dintre voi au folosit acum de câteva ori. E destul de simplu, nu?
E ca și cum 2 linii de cod.
E destul de mult pentru o buclă de un anumit fel, poate cu o variabilă locală suplimentară.
Dar strlen doar să ia un pointer și apoi începe căutarea pentru \ 0.
>> Și, de îndată ce se constată, aceasta poate returna numărul total de măsurile pe care le-a luat în șir.
Deci, putem deduce din ceea ce se întâmplă pe această viitoare.
Să presupunem că atunci Declar ca nu am făcut în linia 10.
Aceasta este o valoare gunoi. Cine știe la început?
Dar pe partea dreaptă a liniei de 10 am sunat din nou getString.
Cine știe dacă acest lucru se termină?
Să spunem că arbitrar sistemul de operare găsit spațiu pentru aceasta modalitate de aici.
I se întâmplă să tastați o coincidență H-E-L-L-O din nou,
și astfel încât să putem trage același tip de imagine.
Dar faptul că am redesenat această imagine este deliberată
pentru că este un. diferit HELLO decât acesta
Deci, aici, în această locație ar putea fi 456, aceasta este 457, și așa mai departe.
Deci, ceea ce se pune în cazul în care semnul de întrebare a fost odată?
În acest caz, 456.
Ne iau aceste numere arbitrar, pentru că într-adevăr, după ziua de azi
noi nu vom pasa atat de mult de ceea ce este adresa nimic.
Totul ne pasa este ca ne putem da seama adresa unele bucată de date cum ar fi HELLO.
>> Deci, într-adevăr ceea ce majoritatea oamenilor fac în informatică atunci când vorbim despre adresele de memorie
și vorbesc despre pointeri în mod specific,
mai degrabă decât deranjez imaginind 123 - cui îi pasă în cazul în care aceste lucruri este de fapt,
Știm doar că este la o adresa numerica -
am simplifica lumea și să spun doar că e indică faptul că la caracterul
și t indică spre acel caracter.
Și faptul că este o săgeată este destul de intenție
pentru că pur și simplu e acum este îndreptat la H și T este îndreptat la celălalt H
pentru că la sfârșitul zilei, nu contează ceea ce este adresa,
dar contează că avem capacitatea de a exprima acea adresa cu unele bucata de cod.
Noi nu am manipulat într-adevăr aceste adrese doar încă
așa că vom vedea unde putem intervin și sorta de face lucruri cu pointeri,
dar de acum, în linia 12 literalmente ceea ce valori ne compararea
în conformitate cu această poveste, în linia 12?
Ne spun este 123 egal egal cu 456? Și asta nu e cu siguranță cazul.
Și chiar conceptual, acest indicator este cu siguranta nu la fel ca aceasta
pentru ca te-a sunat de două ori getString, și getString nu încearcă să fie super-inteligent,
ea nu încearcă să realizeze, oh, ați tastat HELLO 5 minute în urmă;
permiteți-mi să vă dau indicatorul fel ca ți-am dat înainte,
se alocă doar o bucată nouă de memorie de fiecare dată când îl sun.
>> Deci, cum putem rezolva această problemă?
Dacă nivelul superior vreau să compare siruri de caractere Salut si Hello -
Nu-mi pasă de indicii - cum pot să mă duc despre a răspunde la întrebarea,
a utilizatorului tastați același lucru? Ce e necesar aici? Da.
[Elev] Utilizați o funcție. Am >> poate utiliza o funcție din cutie.
Pot utiliza o funcție numită strcmp, s-t-r-c-m-p,
doar versiunea prescurtată a spune șir comparare.
Și dacă vom merge în, de exemplu, comparati 2, care se numără printre fișe de azi,
Eu fac exact asta.
Am păstrat totul altceva același lucru de la linia 1 pe jos la 26 sau cam asa ceva,
și observați acum această parte a schimbat un pic.
Să ignorăm linia 28 pentru un moment și să se concentreze doar pe asta.
Ce am spus, luni, că str. comparare nu?
Se ocupa procesul de luare a 2 pointeri, S și T, în acest caz,
un fel de a pune practic degetul pe aceste 2 litere,
și ceea ce trebuie să facă este ceva ca o buclă în timp ce pentru o buclă sau,
și se spune sunt acestea la fel? Dacă este așa, se misca degetele sau indicii forward.
Sunt acestea același, aceeași acestea, acestea, aceeași
acestea același, acestea același? Și ooh, eu sunt la sfârșitul șir atât la S și T.
Nu am găsit nici contradicții. Da, aceste siruri de caractere sunt aceleași.
Și ce se compara str. retur, dacă 2 siruri de caractere sunt aceleași, aparent? Zero.
Deci 0 este bună, în acest caz, deoarece în cazul în care returnează -1 sau +1,
ceea ce înseamnă că e doar se întâmplă să vină înainte de t în ordine alfabetică sau după t.
Și de ce ar fi util să existe o funcție care vă spune ce șir vine înainte de
sau după într-un dicționar?
[Elev] Cauta. Cauta >> și sortare.
>> Astfel încât să puteți face lucruri cum ar fi binar de căutare sau de sortare cu bule sau fuziona sortare
în cazul în care aveți pentru a compara lucruri.
Astfel, acum am un fel de tăiat unele colțuri și doar a vorbit despre sortare
în contextul de numere, pentru că e frumos și ușor pentru a vorbi despre,
dar puteți compara cu siguranță siruri de caractere, mere si banane,
pentru că, dacă mere este cunoscut să vină înainte de banane, în mod similar,
vă puteți muta în jurul valorii de siruri de caractere in memorie la fel ca Rob a facut cu un fel de îmbinare în filme
și am făcut aici, pe scena, cu un fel de selecție, sortare inserarea, si sortare cu bule.
Deci, unde mai putem lua asta? Să încercăm asta.
Să fel de uitam ca lecție pentru un moment și încercați acum și copiați 1.c să facă următoarele.
În linia 21 Spun ceva de imprimare,
atunci eu sunt obtinerea unui șir de utilizator,
atunci eu sunt de verificare asta.
Noi nu am ajuns într-adevăr în acest obicei încă, dar hai sa facem acest lucru acum.
Să fapt, coaja de spate acest strat. Acest lucru este într-adevăr char *. Tipul ăsta este într-adevăr char *.
Deci, ce înseamnă să fi verificarea dacă e == NULL?
Se pare că, atunci când apelați o funcție cum ar fi getString
sau mai mult, în general, cere doar un calculator pentru a vă oferi unele de memorie,
ceva ar putea merge prost.
Ai putea fi nebun și să ceară de calculator pentru un terabyte de memorie
prin solicitarea de trilioane de bytes de memorie, care pur și simplu nu există în calculator,
dar funcțiile getString și alte nevoie de un mod de a striga la tine
dacă ați cerut prea mult.
Și modul getString face acest lucru este în cazul în care ați cerut mai multă memorie
decât este disponibil în calculator, chiar în cazul în care e probabilitatea super, super-redus
deoarece nici unul dintre noi nu sunt de gând să tastați un trilion de caractere și apoi apăsați Enter,
dar probabilitate redusă, deși ea poate fi, eu încă vreau să verificați pentru el doar în cazul în care,
și valoarea specială, care se întoarce getString, răspunsul, și alte funcții
în cazul în care ceva nu a mers bine este NULL în toate capacele.
>> Și ce este NULL? NULL doar așa se întâmplă să reprezinte un pointer. E adresa 0 de memorie.
Lumea a decis că arbitrar, în cazul în care acest lucru este memoria calculatorului meu - stii ce? -
am de gând să fure doar 1 octet de memorie de fiecare calculator, iar acest lucru este locația 0.
Mergem să-i dea o porecla de NULL, si vom promit
că nu vom pune de fapt, nu există date reale
pentru că avem nevoie de doar arbitrar o valoare deosebită, 0, alias NULL,
astfel încât să putem striga la utilizatori, dacă ceva nu merge bine.
În caz contrar, ar putea să nu știi nu înseamnă 0 pune ceva aici
sau înseamnă ceva nu a mers bine?
Trebuie să toții de acord că nu înseamnă nimic NULL a fost returnat,
nici o adresă reală a fost returnat.
Acum, aici, eu doar adoptarea convenției mea umană a mă voi întoarce de la 1 principală
în cazul în care ceva nu merge bine.
Asta pentru că convenției principal pentru retur este să returnați valoarea 0 în cazul în care buna,
1 sau o alta valoare, dacă rău.
Dar getString și orice funcție care se ocupă în declarațiile de memorie null daca ceva merge prost.
>> Bine. Deci, din păcate, linia 27, super-simplu deși este, nu pentru a copia complet șir.
De ce? Putem vedea asta după cum urmează.
Sunt susținând în linia 27 a fi a face o copie a lui și numindu-l T.
Deci, eu nu cer utilizatorului pentru 2 siruri de data asta, eu spun doar valoarea din s.
ar trebui să fie pus în t, de asemenea.
Deci, acum, doar pentru a demonstra cat de rupt acest lucru este, în linia 29 incoace ce fac?
În primul rând mă verifica dacă lungimea t este mai mare decât 0.
E un șir acolo. Utilizatorul tastat ceva inch
Ce este linia 32 face, aparent?
[Răspuns studentul nu pot fi auzite] Corect >>. Puteți să-l fel de deducă din ceea ce am spus se face.
Dar punct de vedere tehnic, ceea ce este aceasta face? t [0] reprezintă ceea ce?
[Elev] Caracterul zero. >> [Malan] Caracterul zero.
Sau, mai uman-cum ar fi, primul caracter în t, indiferent de faptul că este, H poate în acest caz.
Și toupper face ceea ce spune. Acesta valorifică caracterul zero din T și îl schimbă.
Deci, acest lucru înseamnă să ia caracterul zero din T, face majuscule,
și pune-l înapoi în același loc.
Deci, dacă am introduce salut cu litere mici, aceasta trebuie să se schimbe h litere mici la un H. de capital
Dar problema este că, în linii 35 și 36 ceea ce sunt pe cale să faceți este să imprime pentru noi e și t.
Și ce e banuiala ta?
Ce am de fapt de gând să văd dacă am scris în salut în toate litere mici?
Ce se va fi imprimat? >> [Elevului răspunsul neauzit] >> Ce e asta?
[Elev] Big H și restul mici. H >> mare si restul mici, pentru care, s sau t?
[Elev] Atât. Ambele >>. Exact. Deci, haideți să vedem ce se întâmplă pe aici.
>> Lasă-mă să mergeți mai departe și compila acest lucru. Acest lucru este Copy1, asa ca Copy1. Bine.
Zoom inch Lasă-mă să mergeți mai departe și a alerga Copy1, Enter, Spune ceva: salut cu litere mici.
Acesta capitalizate copia, dar capitalizată aparent originale, precum și,
pentru că ceea ce se întâmplă acum în această poveste?
În linia 27 nu pare a fi de fapt, copierea șir,
dar chiar dacă s-ar fi sperat că intuitiv pentru a fi cazul,
dacă te gândești la această imagine, ceea ce într-adevăr am făcut?
Jumătate din imagine este aceeași.
Așa că haideți să se rostogolească înapoi în timp, astfel încât t nu există încă în poveste.
S poate exista în poveste, dar hai să litere mici salut de data asta.
Așa că lasă-mă să stabilească ceea ce de fapt am tastat inch
În acest caz, aici avem h-e-L-L-o.
Ne vom trage ca o secvență de caractere, a pus linii de separare mele aici și-mi \ 0.
Deci, acest lucru este în cazul în care suntem, cât mai curând linia 1 prin 24-ish, da sau de a lua, s-au executat.
Aceasta este imaginea de memoria mea.
Când m-am ajunge la linia 27, ce se întâmplă?
La fel ca înainte, am obține un pointer, pe care voi trage ca acest pătrat.
Se numește T. Și ce e valoare în mod implicit? Cine știe? Unii gunoi valoare.
>> Deci, voi abstractă că la distanță ca un semn de întrebare.
Și, de îndată ce partea dreapta a liniei 27 execută, ceea ce mă pune în interiorul lui t?
Același lucru care e în s..
Deci, dacă am pentru un moment eliminarea acestei abstracție de săgeată și spunem,
oh, asta este sarcina adresa de memorie 123, când spui T devine e, punct și virgulă,
te pune literalmente 123 aici.
Acum, dacă am un fel de a simplifica lumea noastră din nou cu poze,
ce-ai făcut cu adevărat, se adaugă doar un alt săgeata în lumea ta
care este îndreptat de la t la șirul exact același.
Deci, atunci când, în linia 31 și 32 merg de fapt, despre schimbarea t [0],
ceea ce este t [0] aparent sinonim cu acum? s [0]
Deci, asta e tot ce se întâmplă.
Și chiar dacă acest tip de se simte un pic de nivel scăzut și secret
și acest fel de intuitiv, probabil, se simte ca acest lucru ar fi doar a lucrat -
Am făcut copii de lucruri înainte și doar a lucrat -
daca chiar crezi despre ceea ce este într-adevăr un șir de caractere, e un char *.
Ei bine, ce e asta? E adresa unele caractere.
Atunci poate că ar fi mai logic că, atunci când încercați să faceți ceva
super-aparent simplu ca asta, tot ce faci este copierea o adresă de memorie.
Tu nu faci de fapt nimic cu șirul în sine.
Deci, chiar dacă nu aveți nici o idee cum v-ar rezolva această problemă în cod,
la nivel înalt, conceptual, ce trebuie să facem, în scopul de a face TA copie a lui, aparent?
Da. >> [Elev] Dă-o locație nouă? Exact >>.
>> Avem nevoie de a da t-o locație de brand nou.
Avem nevoie de a crea cumva o lume în care vom obține o bucată nouă de memorie,
care doar de dragul claritate despre voi trage chiar mai jos de aceasta, dar nu este nevoie să fie acolo.
Dar aceasta trebuie să fie de aceeași dimensiune, asa ca voi trage aceste linii verticale în același loc.
E în regulă dacă asta e tot gunoiul inițial. Cine stie ce a fost acolo?
Dar pasul 1 se va trebui să fie-mi dea la fel de memorie de mult ca am nevoie de
pentru a se potrivi o copie a salut, apoi dau seama cum de a copia h aici, e aici,
L aici, și așa mai departe.
Dar acest lucru ar trebui să se simtă deja un pic evident, chiar dacă unele dintre detaliile sunt încă abstracte.
Pentru a copia acest șir în acest, e doar o buclă pentru sau o buclă în timp
sau ceva cu care ați devenit tot mai familiar.
Deci, haideți să încercăm asta. Lasă-mă să intru în copy2.c.
În copy2.c avem aproape același program, cu excepția pentru linia 27.
Se pare un complex pic, dar dacă l-am rupe în jos bucată cu bucată,
partea stângă este aceeași.
Char * t creează acest lucru în memorie, deși cu un semn de întrebare
pentru că nu avem nici o idee despre ceea ce este acolo în mod implicit.
Pe partea dreaptă vom introduce acum un nou funcția, malloc,
pentru memorie aloca, dă-mi de memorie,
și se pare că ia cât de multe argumente, cât de multe lucruri din interiorul paranteze?
Am auzit cârtirile de 1 și 2, dar este doar 1.
Nu e nici o virgulă, ceea ce înseamnă că e doar un lucru în interiorul paranteze.
Chiar dacă nu e paranteze alte, permiteți-mi să subliniez
ce e in interiorul paranteze ultraperiferice, și este această expresie:
(Strlen (s) + 1) * sizeof (char).
Deci, dacă am de fapt, cred că la asta, acest lucru se spune-mi dea lungimea lui.
De ce sunt eu, deși, adăugând 1 pe lungimea? >> [Elevului răspunsul neauzit]
Exact. Avem nevoie de spațiu pentru acest tip la coada, personajul sasea că nu are nici o semnificație în engleză
dar are semnificație specială programatic.
>> Deci, avem nevoie de un + 1 pentru că, din cauza strlen revine așteptările oamenilor de lungime,
salut sau 5, nu da caracterul nul suplimentar.
Asa ca am adăuga manual acest lucru cu + 1.
Și apoi asta, dimensiune * de (char), nu am văzut asta înainte.
Acest lucru nu este punct de vedere tehnic o funcție.
E un cuvânt cheie specială, care doar iti spune ce dimensiunea este de un anumit tip de date pe un calculator
deoarece, în realitate, unii dintre noi au 32-biți calculatoare.
Am un calculator destul de vechi la domiciliu, și-l folosește numai 32 de biți pentru a reprezenta indicii.
Și așa, dacă am făcut marimea unui tip de date, ar putea fi 32 de biți.
Dar dacă eu sunt, folosind computerul meu nou de lux, s-ar putea întoarce o valoare de 64 de biți
pentru ceva de genul o adresă.
Deci, în acest caz, doar pentru a fi în siguranță super, nu vom la ceva cod greu ca -
Ei bine, ceea ce este dimensiunea unui caracter în conformitate cu ceea ce am spus până acum?
Am destul de mult spus verbal că e 1 octet, și asta e destul de mult adevărat peste bord.
Dar, din nou, ipotezele tind să fie rău.
Acestea conduc la software-ul buggy dacă oamenii folosesc software-ul dvs. în moduri pe care nu intenționa.
Deci, haideți să abstract această distanță și doar mai generic spus
Am nevoie de asta bucăți de multe de memorie
și fiecare bucată de memorie ar trebui să fie echivalentă cu dimensiunea de un caracter,
care este, de fapt, egală cu 1, în acest caz, dar e un mod mai generic de scris-o.
Deci, dacă cuvântul este salut, cum de multe bytes se malloc alocă aparent pentru Alo?
[Elev] Șase. Șase >>. Exact cât mai multe semne de întrebare avem pe ecran.
Și apoi să ia o că acum bazată pe înțelegerea dumneavoastră de getString
ceea ce nu malloc intoarce probabil? >> [Elev] O adresă.
O adresă de ce? Din prima bucată de memorie.
>> Nu avem nici o idee despre ceea ce este acolo, deoarece un alt funcția
ar fi putut fi utilizați această memorie anterior.
Dar malloc, cum ar fi getString, returnează adresa primul octet de memorie
care le-a pus deoparte pentru tine.
Cu toate acestea, ceea ce nu face este sa completezi acest gol, cu un caracter nul backslash
deoarece se pare că aveți posibilitatea să utilizați malloc pentru a aloca nimic: Ints, siruri de caractere, tablouri,
flotoare, structuri studențești.
Aveți posibilitatea să utilizați malloc complet generic.
Ea nu-i pasă sau trebuie să știi ce te alocarea de memorie pentru.
Asa ca ar fi îndrăzneț pentru malloc pentru a pune un 0 \
la sfârșitul fiecărui segment de memorie este oferindu-vă
deoarece acest lucru \ 0 lucru este doar o convenție pentru șiruri.
Acesta nu este folosit pentru Ints, acesta nu este folosit pentru flotoare, nu este utilizat pentru studenți.
Și astfel am prins cu malloc este faptul că sarcina este în întregime pe tine programator
să ne amintim cât de multe bytes te alocate și să nu utilizeze niciodată o buclă de
sau o buclă în timp ce și du-te trecut granița de segment de memorie care le-ați primit.
Pune-un alt mod, de îndată ce aloca memorie,
nu poți cere sistemului de operare, oh, apropo, cât de mare a unui segment de memorie a fost asta?
Este în întregime până la tine să vă amintiți dacă aveți nevoie de acea valoare.
>> Deci, hai sa vedem cum am proceda pentru a utiliza această memorie.
În linia 28 și 29 de ce fac asta?
Doar totală bun-simț verificare.
Doar în cazul în care ceva nu a mers bine, am cerut o suma nebun de memorie
sau am atât de multe lucruri care rulează pe computerul care nu există pur și simplu nu este suficientă memorie,
ceva de genul asta, eu, cel puțin vreau pentru a verifica null.
În realitate, cele mai multe calculatoare va da iluzia că fiecare program
poate utiliza toate elementele de RAM-ul,
dar chiar și așa, dacă utilizatorul tipurile din unele lung șir nebun poate pentru că ești un tip rău
si ei de fapt, încearcă să se prăbușească de program sau de hack în ea,
doriți să cel puțin a verifica valoarea returnată de malloc și dacă acesta este egal cu zero.
Și dacă o face, hai să renunț tocmai acum pentru că nu știu ce să fac în acest caz.
Cum pot copia șir? Există câteva modalități de a face acest lucru.
Momentan nu sunt copia str. funcții în C, dar e super-simplu pentru noi să facem acest mod de modă veche.
>> În primul rând să-mi dau seama ce lungimea lui este.
Am fi putut pune acest lucru în buclă, ci am pus doar aici pentru claritate.
Deci, n stochează acum lungimea șirului original, care este aparent 5.
Apoi, în buclă meu pentru voi iterarea de la 0 la pana la N,
și pe fiecare iterație Pun s [i] in interiorul t [i].
Deci, asta e ceea ce am implicat cu degetele îndreptate mele 2 la siruri de caractere înainte.
În ceea ce acest lucru pentru bucla iterează de acest fel, am de gând să fie în copierea h aici,
E într-aici, am în aici, pentru că este e, asta este t.
Și apoi în cele din urmă, în linia 35 ce fac asta?
Am nevoie să vă asigurați că am încheie șirul T.
Și am făcut-o în acest fel să fie super explicite.
Dar propune, cineva, daca ai putea, un alt mod de a face acest lucru.
Nu am nevoie de linia 35. Există un alt mod de a face acest lucru.
Da. >> [Elevului răspunsul neauzit] >> Spune-o mai tare.
[Elev] Mai mic sau egal cu. Exact >>.
Am putea spune doar mai mic sau egal cu n, care, în general, a fost rău
deoarece aproape întotdeauna atunci când vom merge până la o sumă egală cu lucrul suntem de numărare
mergem un pas prea departe.
Dar tine minte, cât de mulți octeți am aloca?
Am alocat strlen de s, astfel încât 5 + 1 pentru un total de 6.
Deci, în acest caz, am putea face ceva de genul asta
astfel că suntem nu doar copierea salut, dar, de asemenea, 0 \, la sfârșitul foarte.
Alternativ, am putea folosi o funcție numită str. copiere, strcpy,
dar care nu ar fi distractiv aproape la fel de mult.
Dar asta e tot ce face sub capota.
Apoi în cele din urmă, vom face același lucru ca înainte.
Am valorifica t și apoi am susțin că originalul arata ca acest lucru și copia arată așa.
Așa că hai să încercăm asta acum. Lasă-mă să plec de aici. Asigurați-copy2. Vom mări și a alerga copy2.
Am de gând să tastați în salut cu litere mici, și într-adevăr mă litere mici salut ca originalul
dar de capital Buna ziua pentru copiere.
Dar nu am terminat încă. Am nevoie pentru a face un ultim lucru aici.
46 și 47 este în mod clar eliberarea de memorie, dar ce înseamnă asta de fapt?
Ce fac, crezi că, prin apel la linia 46 și linia 47?
Ce efect are avea asta? Da.
[Răspuns studentul nu pot fi auzite] >> Exact.
>> Sunteți spun doar sistemul de operare, hei, mulțumesc pentru această memorie.
Puteți folosi acum pentru altcineva.
Și aici e un exemplu perfect de valori de gunoi.
Am folosit asta de memorie pentru a scrie cuvântul salut in 2 locuri,
aici, aici, aici, și aici.
Deci, aceasta este h-e-L-am-o-\ 0.
Dar apoi m-am sunati la linia 46 și linia 47, și știi ce se întâmplă acolo, în termeni de imagine?
De fapt, stai, această imagine este vechi.
După ce vom face copie, tipul ăsta este, de fapt îndreptat aici,
așa că hai să scoateți numerele și doar abstract departe ca săgețile noastre din nou.
Ce se întâmplă în această imagine atunci când chem liber?
[Răspuns studentul nu pot fi auzite] >> Nici chiar.
Dacă aș suna gratuit de pe S și T - un fel de întrebare capcană - de această imagine nu se schimba deloc
pentru că de asteptare s și t asteptare spune doar sistemul de operare,
hei, puteți utiliza această memorie din nou, dar aceasta nu schimbă acest lucru să null
sau unele caracter special, aceasta nu schimbă acest lucru,
aceasta nu schimbă h sau e sau l sau l sau in oricare loc o pentru nimic altceva.
În ceea ce privește imaginea, de îndată ce voi numiți modificări gratuite, nimic.
Și în aceasta constă originea valorilor de gunoi pentru că dacă aș apoi mai târziu în acest program
cere sistemul de operare pentru mai multă memorie cu getString sau malloc sau ceva de genul asta
și sistemul de operare spune, sigur, am 12 bytes de memorie de doar eliberate,
utilizează acestea, ce ai de gând să fi predat?
Ai de gând să fie înmânat o bucată de memorie care ne-ar trage de obicei,
cu semne de întrebare, dar care sunt aceste semne de intrebare?
Ele se întâmplă să fie h-e-L-L-o, h-e-L-L-o.
Acestea sunt valorile noastre noi de gunoi, de îndată ce vă elibera acea memorie.
>> Există o implicație lumea reală aici.
Acest lucru se întâmplă pentru a face cu RAM, dar computerele dvs.
face de fapt acelasi lucru cu disc.
Vom vorbi despre asta, în special, cu un set de probleme în viitor, care se concentrează pe criminalistica.
Dar ce se întâmplă de fapt în cazul în care aveți unele fișiere financiare sensibile de pe desktop
sau unele JPEG sumare și îl trageți în coșul dvs. de gunoi,
ceea ce se întâmplă atunci când îl trageți în coșul de gunoi sau coșul de gunoi?
Știai ce vorbeam despre. [Râsete]
Ce se întâmplă atunci când v-ați târât că dovezile în coșul de reciclare sau cosul de gunoi?
[Răspuns studentul neauzit]
Ei bine, asa ca fiti atenti. Ce se întâmplă când faci asta?
Răspunsul scurt este nimic, nu?
Fișier vag sau sensibile este încă doar stând acolo undeva pe hard disk.
Cei mai mulți dintre noi, cel puțin au învățat pe calea cea grea de care aveți nevoie pentru a goli coșul dvs. de gunoi
sau coșul de reciclare pentru a șterge fișierele de fapt.
Și într-adevăr, atunci când faceți clic dreapta sau Control faceți clic pe gunoi dvs. poate
sau alegeți Fișier, Empty Trash sau orice altceva
si de fapt goli coșul de gunoi sau Recycle Bin, ceea ce se întâmplă de fapt atunci la această imagine?
Mai mult nimic. Deci, nimic nu se întâmplă de fapt pe disc.
>> Și dacă ne-am abate temporar și să scrie - Voi folosi doar partea din spate a acestui.
Deci, acum este povestea se schimba din memoria RAM, care este în cazul în care există programe
în timp ce le execută, la disc, care este în cazul în care acestea sunt depozitate pe termen lung
chiar și atunci când puterea se stinge, de acum - și ne vom întoarce la acest lucru în viitor -
Să prefacem că acest lucru reprezintă interiorul unitatea hard disk a computerului
deoarece înapoi în ziua în care au folosit pentru a fi discuri circulare, la fel ca dischetele.
Deci, dacă aveți unele sensibile de fișier Excel, s-ar putea dura până acest segment de memorie
pe discul calculatorului dumneavoastră, și eu desen doar 1s fel arbitrară și 0s.
Când glisați fișierul așa la gunoi sau poate recicla bin,
literalmente nu se întâmplă nimic, deoarece Apple și Microsoft au decis doar să
coș de gunoi și coșul de gunoi este de fapt doar un substituent temporar.
Poate că în cele din urmă sistemul de operare va goli pentru tine, dar de obicei, nu se face nimic,
cel puțin până când ești într-adevăr puțin spațiu.
>> Cu toate acestea, atunci când te duci la gunoi gol sau gol coșul de gunoi,
În mod similar, nu se întâmplă nimic la această imagine.
Tot ceea ce se întâmplă este în altă parte pe calculatorul dumneavoastră, există un fel de tabel.
E ca un fel de foaie de ieftin mic care spune că, să zicem, resume.doc,
CV-ul astfel încât într-un fișier Microsoft Word folosit pentru a trăi la locația 123 de pe hard disk,
nu în memorie și nu în memoria RAM, dar pe hard disk,
și viețile voastre schematice JPEG la 456, și dvs. de fișier Excel locuiește la 789 sau ori de câte ori.
Când ștergeți fișierele de golire, de fapt gunoi sau coșul de gunoi,
această imagine nu se schimba. 0s și 1s de pe hard disk nu pleca nicăieri.
Dar acest tabel, această bază de date mic de soiuri, se schimbă.
Când ștergeți CV-ul tau, este ca și cum fișierul este șters într-un anumit sens,
dar toate computerul nu se uita unde chestia aia traieste pe hard disk.
0s și 1s care compun CV-ul sau pe oricare dintre aceste alte fisiere sunt încă intacte.
>> Deci, dacă ai făcut asta accidental, există încă o probabilitate non-zero
pe care le puteți recupera datele folosind Norton Utilities sau unele software-ul comercial
Scopul a cărui în viață este de a găsi 0s și 1s, care au un fel de rămas orfani,
uitate aici, dar a plecat de aici, astfel încât să puteți obține datele înapoi.
Sau anchetatori criminaliști, cu poliția sau FBI-ul ar avea de fapt, un hard-disk
și uita de fapt, pentru modele de 0s și 1s care arata ca JPEG, arata ca fișiere Excel,
și a le recupera în acest fel, chiar dacă computerul le-a uitat acolo.
Deci, într-adevăr singura modalitate de a șterge datele, după cum vom discuta în viitor,
este să spele sau ștergeți fișierul sau hard disk de -
Nu puteți obține cu adevărat scăpa de 0s și 1s
pentru că altfel ai începe cu un hard disk gigabyte
și vei termina cu un hard-disk megabyte dacă în mod constant s-au ștergerea,
literal, 0s și 1s.
Deci, ce-ai face dacă într-adevăr a vrut să acopere urmele
și problema fundamentală este că există încă 0s și 1s de pe disc?
Văd pe cineva care le-ar gesticulând rupe fizic dispozitivul. Care va lucra.
[Râsete] Dar dacă asta e un fel de o soluție costisitoare, ceea ce ar fi mai rezonabil?
Da. >> [Elev] Overwrite ei. Overwrite >> le cu ce? >> [Elev] Alte date.
Alte date. Puteți suprascrie doar discul cu 0s sau 1s sau toate 0s, toate 1s.
>> Și asta e într-adevăr, ceea ce unii dintre software-ul face.
Poti cumpara software sau chiar obține software-ul liber,
și chiar a construit în Mac OS aceste zile, mai puțin în Windows,
este abilitatea de a șterge în siguranță.
De fapt, daca vrei sa administrat total acasă astăzi, dacă aveți un Mac și de a face acest lucru,
dacă ai niște lucruri în gunoi poate, puteți face Trash Secure Empty,
care face exact asta.
, Mai degrabă decât doar fișierele șterge de aici, ea nu șterge aici 0s și 1s,
mai degrabă, se schimbă-le pe toate, de exemplu, pentru a 0s și dot, dot, dot.
Deci, unul din psets dvs. viitoare vor fi de fapt de a recupera în mod intenționat date -
fotografii pe care le-am luat de oameni, locuri și lucruri, în campus
pentru care vom face o imagine medico-legală a unui card de memorie aparat de fotografiat digital,
care este exact aceeași idee - și va trebui să fie contestate pentru a găsi de fapt,
modelele care reprezintă JPEG de pe hard disk,
mai mult ca faptul că studentul a cărui fostul e-mail Am citit câteva săptămâni în urmă a avut
pentru a recupera fotografiile surorii sale.
De ce nu luăm o pauză de 5 minute aici, și vom regrupa cu mult pe memorie.
Deci, aici e în cazul în care lucrurile devin un pic de minte-îndoire, dar acesta este un pas foarte puternic
spre intelegerea aceasta tot mai mult.
Aici este un program numit pointers.c.
Este printre mostre de cod de astăzi.
Observați că în primele linii, 19 prin 22, tot ce facem este ceva de genul getString
și se întorc o adresă, stocarea acestuia în s..
De acum înainte pentru PSET chiar 3, dacă doriți, dar PSET 4 și pe
în cazul în care puteți începe să luați aceste roți de formare off-te,
nu există nici un motiv pentru a pretinde că există mai siruri de caractere.
E bine să înceapă cu siguranță doar că char *.
>> Ca o paranteza, în referințele on-line și în cărțile pe care le pot vedea de multe ori steaua de lângă variabila.
S-ar putea vedea chiar și spațiile de aproximativ ambele părți ale acestuia.
Toate acestea sunt corecte funcțional.
Pentru moment, însă, vom standardiza pe această abordare pentru a face super-clar
că char * este ca și cum spune indicatorul de caractere.
Acesta este tipul de date.
Și apoi numele variabilei este e în acest caz.
Deci, am ajuns un șir și am numit-o e.
Și apoi aici observați că fac de fapt, un pic de șmecherie.
Aceasta se numește pointer aritmetic, care este un fel de super-simplu.
Aceasta înseamnă doar să adăugați și să scad numere pentru pointeri.
Dar acest fapt funcționează.
Acest program afiseaza aparent sirul s 1 caracter pe linie, astfel încât rezultatul final -
Doar așa ne putem strica în cazul în care acest lucru se întâmplă, face pointeri, pointerii alerga, lasă-mă să zoom inch
Acum, lasă-mă să tip în ceva de genul și tipul HELLO Enter
și se imprimă un caracter pe fiecare rând.
Până la o secundă în urmă, ne-am fi făcut acest lucru cu notație suport pătrat.
Am avea o buclă și pentru ne-ar face printf de s [i] si vom face asta din nou și din nou și din nou
cu un backslash N, la sfârșitul fiecărui rând.
Dar acest program este diferit. Acest program se utilizează, literalmente, aritmetică.
Deci, ce se întâmplă aici?
Mai întâi de toate, înainte de a executa această buclă, chiar, ceea ce, doar pentru a fi clar, este de fapt e?
S este? >> [Elev] O adresă. O adresă >>.
>> Și e adresa, în caz de salut, primul caracter din acel cuvânt, care este h.
Deci s este, în acest exemplu particular, adresa de ore.
Deci, ce înseamnă să faci e + i?
Ei bine, am începe de la 0 în acest buclă pentru. Am făcut asta de multe ori.
I este de gând să meargă până la lungimea șirului, se pare.
Astfel, pe prima iterație a acestui bucla, i este evident 0.
Deci, această expresie se spune e + i -, mai degrabă, s-+0- care este, evident, doar e.
Deci, ce este * e aici?
Acum suntem cu stea într-un mod ușor diferit.
Lasă-mă să mergeți mai departe și de a scăpa de t, deoarece am terminat de vorbit despre t și copii ale lui.
Acum vrem doar să spun o poveste care implică uri.
Și astfel, în acest moment, după ce tipul de șir, lumea noastră pare destul de la fel ca înainte
cu doar e stocarea adresa de ore și mai mult, în general, arătând spre șirul de salut.
Dacă aș face acum o linie de genul * (e + i), să încercăm asta.
Deci, * (e + i). Lasă-mă să simplifice acest lucru, deoarece aceasta este 0, deci acest lucru este * (e +0).
Ei bine, așteptați un minut. Simplifica și mai mult. Acest lucru este * (e).
Ei bine, acum parantezele sunt un fel de prost, deci acum să facem la fel * e.
Deci, în prima iterație a acestui bucla, acea linie care este evidențiată, 26,
este destul de mult echivalent cu imprimarea asta.
Care este tipul de date de * e?
În acest context, deoarece steaua se întâmplă să fie alături de ea însăși s,
dar mai ales, pentru că nu mai suntem declară s,
nu avem de a crea o variabilă mai, nu e nici o mențiune de char * în linia 26,
nu există nici o mențiune a cuvântului cheie șir, suntem folosind doar o variabilă numită s,
se pare că acum stele are ușor diferite și, desigur, confuz sensul.
* E aici inseamna mergeți la adresa din S și de imprimare ceea ce este acolo.
Deci, este de aici, * s este - ca un fel de tobogane și Scări, urmați săgeata - aici.
Deci asta este * e.
>> Deci, ceea ce se imprimă pe prima iterație a buclei, în linia 26?
Am imprima% C, care este substituent pentru un caracter,
apoi o \ n pentru o nouă linie. * (E + i) unde i este 0 este doar asta.
Deci, ce char plasez in pentru c%? H.
În urmatoarea iteratie a buclei - puteți vedea, probabil, în cazul în care acest lucru se întâmplă -
urmatoarea iteratie i este evident 1, deci acest lucru înseamnă s +1,
si apoi acum am nevoie de paranteze, deoarece acum trebuie să spun stele
du-te la adresa de memorie e +1.
Ce este e? Să se rostogolească înapoi în timp și spun acest lucru săgeata acum nu este, de fapt ne face nici un favor.
Să-i mai precis spun că acest lucru este stocarea numărul 123
din cauza începutul acestui șir salut, aceasta este adresa 123, aceasta este de 124, și așa mai departe.
Deci, pe doua repetare când spun e +1, asta e cum ai spune 123 1,
altfel cunoscut sub numele de 124, astfel încât ceea ce se char imprimat pe doua repetare?
E la adresa de memorie 124.
Apoi, din nou +, 125, 126, 127, iar aceasta bucla din fericire se oprește înainte de a ajunge aici
pentru că eu sunt, folosind strlen pentru a vă asigura că nu contează prea mare.
Așa că prea este.
Din nou, aceasta este doar ca și cum am fi făcut-o săptămână în urmă.
Lasă-mă să-l scrie pe linia de mai jos, chiar dacă nu vrem să facem pe amândouă.
Acest lucru este identic acum la asta.
>> Deci, chiar daca s este un șir de caractere, așa cum am fost de asteptare pentru aceasta săptămâni, s este într-adevăr un char *.
Deci, dacă vrem să fim super-anal, e foarte buna pentru a scrie caracterul specific
la locația lea folosind aceste adrese numerice și acest operator stele,
dar sincer, acest lucru este doar atât de mult mai curat. Deci, acest lucru nu este rău.
Nici un motiv să nu mai faci linia 27 aici, dar 26 este funcțional aceeași,
și este funcțional aceeași pentru exact motivele pe care le-am discutat până acum.
Și, în fine, 29 este o practică bună doar.
Apelând gratuit de e înseamnă că acum te dai înapoi de memorie pe care ți-a dat getString
deoarece din nou, așa cum am menționat luni, getString de săptămâni
a fost introducerea unui bug în codul dumneavoastră.
Codul dvs. de săptămâni a avut pierderi de memorie
, prin care ați fost cerut getString pentru memorie, dar nu ați fost l dau înapoi.
Și care a fost ales în mod deliberat de către noi pedagogic
pentru că e prea mult să se gândească mai devreme.
Dar acum avem nevoie de mai mult simetrie.
Dacă vă întrebați de calculator pentru memorie, așa cum este cazul pentru getString,
cum este cazul aparent pentru malloc,
trebuie să vă acum pentru PSET 4 ulterior, de asemenea, gratuit orice astfel de memorie.
Observă acest lucru este diferit de a spune n int.
Nu aveți nevoie pentru a elibera acest lucru, deoarece nu ai sunat getString
si nu ai sunat malloc.
>> Și chiar dacă te-a sunat GetInt cum vom vedea în cele din urmă,
GetInt nu alocă memorie pentru tine, pentru că puteți trece de fapt în jurul valorii de numere întregi
și plutește și caractere doar modul în care le-am făcut de câteva săptămâni.
Siruri de caractere, deși, într-adevăr sunt speciale, deoarece acestea sunt concatenarea caractere multiple.
Deci, sunt doar diferite de caractere, pluteste si Ints și place.
Dar ne vom reveni la asta înainte de mult.
Orice întrebări Apoi, pe acest început de pointeri? Da.
[Întrebare elev neauzit]
Ah, întrebare foarte bună.
Unul dintre puținele lucruri C, de fapt nu pentru tine, care este convenabil,
este că cifrele pentru tine ceea ce este dimensiunea de tipul de date
și apoi face acest gen de multiplicare pentru tine.
Aceasta este lipsită de relevanță în cazul de caractere, deoarece aproape întotdeauna un caracter este 1 octet,
Deci, aceasta pur și simplu funcționează.
Dar de dragul discuției, dacă ai fi fost, de fapt imprimare numere întregi
și ați încercat să imprimați câteva valoarea lui, care a fost îndreptat la un număr întreg,
te în mod similar, nu ar trebui să facă + 4 * i, doar pentru că un int este de 4 octeți.
Aritmetică indicatorul înseamnă că C și compilatorul face tot ceea ce matematica pentru tine.
Tot ce trebuie să pasă de numărare în fel de simț umane. Da.
[Elev] Dacă declara un șir într-un pentru buclă, nu trebuie să-l elibereze mai târziu?
Bună întrebare.
>> Dacă ați declarat o în interiorul șir de bucla pentru, aveți nevoie să-l elibereze mai târziu?
Trebuie doar pentru a elibera memorie pe care le aloca cu getString sau cu malloc.
Deci, dacă ai spus ceva de genul - lasa-ma sa pun acoladele acum atât de tot codul este legată.
Dacă ai făcut ceva, deși buggily, ca aceasta, char * t = e,
nu aveți nevoie de t gratuite, deoarece t nu implică nici o mențiune de malloc sau getString.
Dacă în schimb ai făcut asta, getString, atunci da, va trebui să T gratuite.
Și, de fapt, singura ta șansă de a face acest lucru este acum în această buclă, pentru aceeași problemă a domeniului de aplicare
pe care le-am discutat în trecut.
În caz contrar, vei fi alocarea de memorie, alocarea de memorie, alocarea de memorie,
și la sfârșitul programului pentru că ești în afara de faptul că bucla,
T nu există, dar niciodată nu am spus sistemul de operare
ca nu ai nevoie de memorie mai.
Și înainte de mult timp, pentru PSET 4 sau 5 vă vom dota cu un program numit Valgrind,
care este similar în spirit pentru a GDB, în sensul că are oarecum de o interfață arcane,
dar scopul său în viață este să vă ajute.
Și Valgrind este un program care va fi în viitor căuta programele dvs.
In cautare de pierderi de memorie, fie din getString sau malloc,
pe care vom începe să utilizați tot mai mult cu cât ne oprim folosind biblioteca CS50 la fel de mult.
Avem în sfârșit avem acum un fel de vocabular și un fel de model mental în teorie
cu care să rezolve acest program rupt.
>> Deci, în acest program de spart, de swap franco interiorul de swap,
dar niciodată nu-l efectiv lucrate în principal din cauza principală a trecut în x și y, rechemare,
și acestea au fost în trecut de valori, ca să spunem așa.
Copii ale acestora s-au dat la schimb.
Până la sfârșitul anului de swap, a și b au fost într-adevăr schimbate,
dar, desigur, x și y, așa cum am discutat, luni, nu a fost.
Așa că am propun, în verde, aici, faptul că aceasta este de fapt soluția aici.
Și, de fapt, lasă-mă să mutați stele mei doar pentru a fi în concordanță
chiar dacă, din nou, funcțional acest lucru nu contează.
În săptămânile viitoare vom explica când și de ce contează.
Deci, în verde este acum o soluție.
Sincer, se pare o mulțime Messier, deoarece am toate aceste stele.
Permiteți-mi să subliniez un singur lucru.
Linia de sus aici, în cazul în care se spune int * int * a și b
fundamental este de a face același lucru ca și el are întotdeauna.
Se declară 2 argumente sau parametri, pentru a schimba,
prima, care este un pointer int numit-o,
al doilea, care este un pointer int b numit.
Singurul lucru care este nou în acest moment este faptul că există o stea acolo.
>> Ce înseamnă asta? A nu este un int, b nu este un int.
A este adresa unui int și b este adresa unui int diferit.
Aici jos, acest lucru este în cazul în care am admite C devine confuz.
Acum suntem cu o stea, dar are sens diferit în acest context.
Pentru ca noi nu suntem de declarare indicii ca suntem aici,
aici suntem dereferencing lucruri.
Deci punct de vedere tehnic, stele, în acest context, de prima linie, al doilea, și al treilea în interiorul a swap-ului
este operatorul dereference, ceea ce înseamnă doar du-te acolo.
Deci, la fel ca și degetul meu a urmat săgeată pentru a h,
* Un mijloc merge la acea adresă și pentru a găsi-mi int că e acolo.
* Mijloace b mergeți la adresa și dă-mi ce-i acolo.
Deci, haideți să aspira imaginea de luni acum, folosind o stivă de cadre,
cea de jos a, care va fi principala,
cel de sus din care va fi de swap,
astfel încât lumea noastră arată, la fel ca luni, la fel ca asta.
Aici este o bucată de memorie care principală este de gând să utilizați.
>> Retrag de la, luni, că programul a avut doar 2 variabile,
cea numita x și unul numit Y, și am pus numerele 1 și 2 acolo.
Acum, când eu numesc schimb cum am făcut-o luni,
anterior, atunci când am folosit versiunea rosie a acestui program, care arata ca acest lucru,
Am 2 parametri, a și b, și ceea ce am scrie aici și aici?
Doar 1 și 2, literalmente copii ale x și y.
Astăzi vom schimba asta.
Astăzi, în loc de a trece Ints a și b vom trece în 2 adrese.
Aceste adrese se întâmplă să indice Ints, dar aceste adrese nu sunt ele însele Ints.
Acestea sunt adrese. E ca o adresă poștală în loc.
Deci, acum, avem nevoie să mă dau doar un pic mai mult detalii pe ecran.
Aceasta este memoria calculatorului meu, așa cum a fost toată ziua.
Acum, avem nevoie de ceva arbitrar schema de numerotare.
Deci, hai să spunem, doar din întâmplare, că aceasta este adresa de memorie 123, 124.
Să spunem că aceasta este de 125, aceasta este 126, și așa mai departe, dar asta e cu totul arbitrar.
Avem nevoie doar de o schema de numerotare în memoria mea.
Așa că acum, când de fapt am trece în x și y, eu nu am de gând să treacă în x și y;
Am de gând să treacă în adresa poștală, ca să spunem așa, de x și y de
astfel încât ceea ce este stocat aici și aici nu este 1 și 2,
dar dacă puteți vedea textul meu mic, ceea ce devine trecut pe aici și aici?
[Răspuns studentul nu pot fi auzite] >> Exact. 123 se pune aici și 124 se pune aici.
>> Acum, pentru ca am folosit stea în acest fel prima linie foarte sus aici, la partea de sus,
programul meu știe doar că 123 și 124, chiar dacă ele sunt în mod evident numere întregi
că orice om ar putea observa, acestea ar trebui să fie interpretate ca adresele, adresele numerice.
Ei nu sunt în sine Ints, sunt adrese,
și asta pentru că am pus în mod explicit stele acolo.
Așa că acum, în linia mea primul, al doilea, și al treilea din codul actual, ceea ce se întâmplă aici?
Să atragă restul imaginii.
Tmp este la fel cum era pe luni. Special despre tmp nimic.
Acesta este doar un local 32 de biți variabilă, și în interiorul că am stocarea aparent valoarea * o.
Acum, dacă am spus tmp = o, ce s-ar mi-am pus aici? >> [Elev] 123.
123. Dar asta nu e ceea ce fac eu.
Spun tmp = * o. Mijloace stele du-te acolo.
Deci, aici este o, 123. Cum pot să merg acolo? Pretinde că e ca și cum o săgeată.
Ei bine, acolo este, 1. Deci, ce se depoziteaza in tmp, aparent? Doar 1.
Deci, cu alte cuvinte, este tmp * a *, un mijloc de du-te la adresa care este în prezent într-o,
care este aparent 123.
>> Bine, aici suntem la locația 123, văd numărul 1,
așa că am de gând să pună numărul 1 acolo.
Acum, ce să fac în linia 2, * o * b =?
Acesta este un pic mai implicat, deoarece acum ceea ce este o? E 123.
Deci, în cazul în care este o *? Chiar acolo unde am fost înainte. Merge atât de acolo. Bine.
Acum, în sfârșit, și apoi în cele din urmă acest lucru va începe să aibă sens, să sperăm,
* B inseamna ce e în b? 124. Așa că am nevoie pentru a merge acolo, care este 2.
Deci, ce mi-am pus unde?
2 merge aici, pentru că în * b * merge într-o. Așa că voi face asta.
Și puteți vedea deja, probabil, că suntem mult mai aproape
pentru rezolvarea acestei probleme prost, simplu în mod corect pentru prima dată
pentru că acum avem încă o amintire a ceea ce a fost x,
avem 2 copii, desigur, de Y,
dar acum spune line 3 * b.
Deci, aici e b. * Mijloace b du-te acolo. Deci, în cazul în care este locația 124?
E aparent aici. Deci, ce am pus aici? În mod evident, tmp.
Deci, acum fac asta. Deci am 1 și 2 aici aici.
Și acum ce despre toate astea, 123, 124, și 1?
De îndată ce se întoarce de swap, această memorie este la fel de bun ca pierdere
pentru ca imediat ce se întoarce de swap, sistemul de operare
este libertatea de a folosi ca memoria din nou în viitor.
Doar principal de memorie de la partea de jos a acestei stivei așa-numitei lipeste în jurul valorii de.
>> Și astfel avem în sfârșit avem acum o versiune de lucru.
Lasă-mă să intru în swap.c, și observați mai jos.
În partea de sus a programului mi-am schimbat prototipul meu de a fi int * int * a și b.
Deci, singurul lucru pe care mi-am schimbat pentru a merge de la roșu, care a fost rău, la verde, ceea ce e bine,
Se Am adaugat aceste stele azi.
Dar apoi aici, în sine, schimb am avut de a copia, lipi ceea ce a fost doar pe diapozitiv.
Am o stea aici, stea aici - care se potrivește cu prototip -
și apoi toate aceste lucruri au acum Stele, cu excepția pentru tmp
deoarece utilizarea o variabilă temporară, nu e nimic nou acolo.
Am nevoie doar de depozitare temporară pentru un int.
Deci, nu avem nevoie de o stea acolo.
Avem nevoie doar de stele, astfel încât să putem traversa acest fel a frontierei arbitrare
între aceste 2 cadre în memoria computerului meu.
Dar un lucru trebuie să se schimbe ultimul, și s-ar putea l-au zărit deja.
Ce alta linie este în mod evident diferită acum? >> [Elev] & x.
>> Da, deci 25 este ultima linie de cod am nevoie pentru a schimba pentru ca aceasta să funcționeze.
O săptămână în urmă și chiar pe linia 25 luni arata ca acest lucru, schimb de x și y,
și acest lucru a fost doar rupt pentru că dacă spui de swap (x, y)
vă oferă copii ale lui x și y pentru a face schimb, apoi se face ceva sa,
dar nu sunteți niciodată în schimbare, de fapt x și y în sine.
Deci, chiar dacă nu ați mai văzut înainte de acest personaj cu ampersand în cod,
să ia doar o presupunere. Ce face ampersand face, aparent?
[Elev] ia adresa. Ia >> adresa.
Deci, ampersand spune-mi dea adresa lui x.
Cine stie unde este? Se întâmplă să fie 123. Nu-mi pasă. Doar da-mi adresa lui x.
& Y înseamnă să-mi dai adresa lui y.
Și în acel moment povestea este în perfectă concordanță cu imaginea am desenat acum un moment.
>> Așa că am să recunosc indicii, cu siguranță, pentru mine, când am început să învăț acest lucru,
au fost cu siguranta una dintre cele mai dificile lucruri să-și încheie în jurul valorii de mintea mea.
Dar dau seama, mai ales ca am să continui să joci cu aceste tipuri de lucruri,
dacă îl rupe în jos la aceste fel de simplu super neinteresant intelectual probleme
de a muta doar în jurul valorii de numere, să se răspundă la o mulțime de confuzie cu pointeri
într-adevăr poate fi derivat din aceste mecanica foarte de bază.
Iată o adresă. Du-te acolo cu steaua.
Sau invers, aici e un ampersand. Figura ce este de fapt adresa.
Bine.
Deci, în cazul în care este în întregime acest memorie vine de la?
Am întocmit această imagine de câteva ori, și I a păstra promițătoare ne vom întoarce la ea,
dar aici este o reprezentare a memoriei computerului dvs.
asta e un pic mai mult de etichetat tabla noastră aici este.
Segmentul Textul de la partea de sus reprezintă ceea ce cu privire la programul tău?
[Răspuns studentul nu pot fi auzite] >> Ne pare rău? Spune din nou.
[Elev] real de program. Programul >> reală.
>> Deci, zăngănit 0s și 1s pe care le-ați compilat după ce a scris cod C și apoi rulează
si generarea de capete 0s și 1s până obtinerea ascuns acolo în memorie
pentru că atunci când faceți dublu clic o icoana de pe Mac sau PC
sau executați o comandă cum ar fi Mario la promptul dvs., 0s și 1s de pe disc
vor fi încărcate în memorie, astfel încât computerul poate le manipuleze
si le executa mai repede.
De date, astfel inițializată și de date neinițializate, nu vom vorbi mai mult despre cei,
dar acestea sunt doar variabile globale.
Inițializate înseamnă variabile globale pe care le-au dat valori;
neinitializata variabile globale înseamnă că nu a dat încă valori.
Apoi, există aceste variabile de mediu pe care le voi val complet mâna mea la,
dar ele sunt acolo și că lucrurile magazine, cum ar fi numele dvs. de utilizator
și alt fel de detalii de nivel inferior.
Dar juiciest piese de aspectul memoria ta este acest lucru numit stivă și heap.
Stivă din nou, să fie clar, este memoria care este folosit ori de câte ori funcții sunt numite,
ori de câte ori există variabile locale
și ori de câte ori sunt parametrii fiind trecut în jurul valorii de.
Toate acestea se întâmplă în stivă.
Heap nu am vorbit despre, dar ia o presupunere care utilizează heap.
Doar o bucată de memorie diferite.
Se întâmplă să fie trase aici, la partea de sus, dar asta e o convenție arbitrară pictural.
Cine a fost aparent cu ajutorul de memorie din heap de săptămâni?
E punct de vedere tehnic, dar tu în mod indirect. >> [Elev] getString.
GetString și malloc. Deci, aici e diferența fundamentală.
>> Știi în ultimele săptămâni că, dacă aveți nevoie de memorie, declara doar o variabila.
Dacă aveți nevoie de o mulțime de memorie, declara o matrice drept interiorul funcția.
Dar problema ne-am păstrat cu care se confruntă este dacă declarați variabile la nivel local în interiorul funcțiilor,
de îndată ce revine funcției, ce se întâmplă cu memoria și aceste variabile?
Doar un fel de nu mai e al tău, nu? Ea dispare doar un fel de punct de vedere conceptual.
E încă acolo fizic, evident, dar nu mai e dreptul dvs. de a utiliza.
Acest lucru este, evident, o problemă în cazul în care doriți să scrieți funcții în viața
că de fapt aloca memorie și nu-l dau inapoi imediat.
Cauza în punctul: scopul getString lui în viață este de a avea nici o idee în avans
cât de mare a unui șir am de gând să tastați de la tastatură,
dar trebuie sa fie capabil de a aloca memorie pentru a organiza David sau salut
sau un eseu întreg pe care utilizatorul ar putea fi tastat inch
Deci, getString a fost folosind malloc.
Malloc, prin urmare, trebuie să utilizați nu stiva;
în loc să-l folosește acest lucru numit heap.
Nu e nimic diferit despre memorie. Nu e mai rapid sau mai lent sau ceva de genul asta.
E doar fizic într-o locație diferită.
>> Dar regula este că memoria pe care se alocă pe heap
nu va fi luat de la tine până te sun - să ia o presupunere - gratuit.
În schimb, orice memorie vă întreb pentru stiva pe declarând doar o matrice
sau de declarare a unei variabile ca am facut de săptămâni,
care se încheie în mod implicit pe stiva.
Și care funcționează mare de 90% din timp, dar în acele ocazii rare
în cazul în care doriți să aloce memorie și păstrați-l în jurul valorii de,
atunci ai nevoie pentru a utiliza o funcție ca malloc.
Sau ne-am folosit o functie ca getString, care, la rândul său, folosește malloc.
Să vedem dacă acest lucru s-ar putea rupe în jos și apoi să ia o privire la Binky.
Vom reveni la faptul că, în viitor.
Aici este un program super-simplu că, în primele 2 linii ce face?
În limba engleză, ceea ce fac aceste primele 2 linii de cod face în interiorul principal?
[Răspuns studentul neauzit]
Atentă. Ea nu-mi dea adresa lui x sau y.
[Elev] dă indicii pentru a Ints. Bine >>. Dă-mi 2 pointeri la întregi.
Cu alte cuvinte, da-mi 2 bucati de memorie pe care am păstra desen astăzi,
chiar daca l-am sters acum, ca pătrate.
Dă-mi 2 bucati de memorie, unul numit x, y unul numit -
Am sunat mai devreme le-S și T - și ceea ce este tipul de care bucata de memorie?
Se va stoca o adresă.
Este de tip int *.
>> Deci, adresa unui int vor locui în cele din urmă în x,
adresa unui int vor locui în cele din urmă în y,
dar inițial, ceea ce este în interiorul lui x și y? Cine știe? Garbage valori.
Ea nu are nimic de-a face cu pointeri.
Dacă nu ne-am pus ceva acolo, cine stie ce e de fapt acolo?
Acum, x. Ce se întâmplă aici? Acest lucru este legit acum, deoarece x este un pointer. E un * int.
Asta înseamnă că eu pot pune în x adresa unor bucată de memorie.
Ce se malloc intoarce? Top, se întoarce adrese,
adresa primul octet într-o bucată întreagă de memorie.
Cât de multe bytes este acest aparent alocarea, de exemplu, în aparat?
Care este dimensiunea unui int? 4.
Dacă credeți că inapoi la saptamana 1, nu e foarte important să ne amintim întotdeauna că,
dar în acest caz e util să știi, 4 octeți.
Deci, acest lucru este alocarea pe heap 4 octeți
și este returnarea adresa primul pentru mine arbitrar.
Acum, ceea ce face x?
A * x = 42 este de a face ce?
Dacă la acest punct, în povestea avem x, care arata ca acest lucru cu o anumită valoare gunoi,
acest lucru este acum y cu o valoare gunoi, acum în linia 3 am alocat 4 octeți.
Această imagine în esență, arată așa.
Sau, mai precis, în cazul în care aceasta este adresa arbitrară 123, aceasta este ceea ce povestea noastră acum arata ca.
* X = 42 înseamnă acum ce? Asta înseamnă că mergeți la adresa 123 și a pus acolo numărul 42.
Nu am nevoie să atragă aceste linii, deoarece nu facem siruri de caractere.
>> Ar fi trebuit să-l pur și simplu scris ca aceasta, și doar de dragul demonstrației lui,
42 ca un fel de int ia o mulțime de spațiu, 4 octeți.
Deci, asta e ceea ce sa întâmplat acolo, dar există o problemă acum.
* Y = 13. Ce se va întâmpla aici?
Problema este y * în lumea noastră simplificată înseamnă doar du-te la adresa din y.
Ce e în y? E o valoare gunoi.
Deci, să presupunem că această valoare este 5551212 gunoi, ceva de genul ăsta nebun.
* Mijloace y du-te la adresa 5551212.
Asta e ca si cum aici. Ea nu există, de exemplu.
Deci * y devine 13 mijloace Am încercat să atrag aici 13. Ea nu exista.
Am depășit segmentul de tablă. Ce primesc?
Asta criptic segmentare vina mesaj deoarece am încercat să pun în memorie
o valoare ca 13 la un loc care nu există.
Restul programului ar putea sa functioneze bine, dar până în acel moment nu.
Deci, haideți să încercăm să spunem aceasta poveste.
Vom reveni la această dată am vorbit despre hex.
Să ne întoarcem la acest lucru și încheie cu acest lucru numit Binky,
care amintesc este un profesor de la Stanford ședinței la domiciliu joc cu claymation,
pentru a spune povestea exact același program.
E doar aproximativ 3 minute lungi. Aici avem Binky.
[Vorbitor de sex masculin în video] Hei Binky, trezește-te. E timpul pentru distracție indicatorul.
[Binky] Ce e asta? Aflați mai multe despre indicii? Ce bine!
[Vorbitor de sex masculin] Ei bine, pentru a începe, Cred că am de gând să nevoie de un cuplu indicii.
>> [Binky] Ok. Acest cod alocă 2 pointeri, care pot indica la întregi.
[Vorbitor de sex masculin] Ok. Ei bine, eu văd cele 2 indicii, dar acestea nu par să fie îndreptată spre nimic.
[Binky] Asta-i drept. Inițial, indicii nu indică nimic.
Lucrurile pe care le indica sunt numite pointees, și de a le sus este un pas separat.
[Vorbitor de sex masculin] Oh, corect, corect. Știam asta. Cele pointees sunt separate.
Er, asa cum a face tu aloce o pointee?
[Binky] Ok. Acest cod alocă o nouă pointee întreg, iar această parte stabilește x pentru a indica aceasta.
[Vorbitor de sex masculin] Hei, care arată mai bine.
Deci, face fac ceva. >> [Binky] Ok.
Voi dereference x indicatorul pentru a stoca numărul 42 în pointee său.
Pentru acest truc am nevoie de bagheta mea magică a dereferencing.
[Vorbitor de sex masculin] bagheta magică a dvs. dereferencing? Asta-i grozav.
[Binky] Aceasta este ceea ce pare a fi codul. Voi seta doar până numărul și ... [Popping sunetul]
[Vorbitor de sex masculin] Hei uite, acolo se duce.
Face acest lucru un dereference pe x urmează săgeata pentru a accesa pointee său,
în acest caz, pentru a stoca 42 acolo.
Hei, încercați să utilizați-l pentru a stoca numărul 13, prin indicatorul altă parte, y.
[Binky] Ok. Mă duc doar aici pentru a obține y și numărul 13 instituit
și apoi să ia bagheta de dereferencing și doar ... [Sunet zumzet] Whoa!
[Vorbitor de sex masculin] Oh hei, care nu au de lucru.
>> Spune, Binky, nu cred că dereferencing y este o idee bună
deoarece înființarea pointee este un pas separat
și nu cred că am făcut-o vreodată.
[Binky] Hmm, bun punct de.
[Vorbitor de sex masculin] Da. Am alocat y indicatorul dar nu-l setat pentru a indica o pointee.
[Binky] Hmm, foarte atent.
[Vorbitor de sex masculin] Hei, arăți bine acolo, Binky.
Poți să-l repari, astfel că punctele de y la fel ca pointee x? >> [Binky] Sigur.
Eu voi folosi bagheta mea magică de cesiune pointer.
[Vorbitor de sex masculin] este că va fi o problemă ca înainte?
[Binky] Nu, acest lucru nu atinge pointees.
Se schimbă doar un pointer pentru a indica acelasi lucru ca altul. [Popping sunetul]
[Vorbitor de sex masculin] Oh, văd. Acum puncte y la același loc ca și x.
Așa că așteptați. Acum, y este fixat. Ea are o pointee.
Astfel, puteți încerca bagheta dereferencing din nou pentru a trimite peste 13.
[Binky] Uh, bine. Aici merge. [Popping sunetul]
[Vorbitor de sex masculin] Hei, uită-te la asta. Dereferencing acum funcționează pe y.
Și, pentru că sunt indicii că unul comun pointee, amândoi se vedea 13.
[Binky] Da, de partajare. Oricare ar fi.
>> Deci, vom schimba locurile acum?
[Vorbitor de sex masculin] Oh uite, nu mai avem timp. >> [Binky] Dar -
[Vorbitor de sex masculin] Doar amintiți-vă cele 3 reguli pointer.
Numărul 1, structura de bază este că veți avea un pointer și-l arată pe la o pointee.
Dar indicatorul și pointee sunt separate, iar eroarea comună este de a crea un pointer
dar să uitați să-i dea o pointee.
Numărul 2, dereferencing indicatorul pornește de la indicatorul și urmează săgeata de peste
pentru a accesa pointee sale.
După cum știm cu toții, aceasta funcționează numai dacă există o pointee,
ce fel de se întoarce să se pronunțe cu numărul 1.
Numarul 3, cesiune indicatorul ia un pointer și schimbă-l
să indice pointee fel ca un alt indicator.
Deci, după cesiune, cele 2 indicii pentru a va indica pointee aceeași.
Uneori, asta se numește partajare.
>> Și asta e tot acolo este să-l cu adevărat. Pa-pa acum.
Acest lucru este Binky. Acest lucru este CS50. Ne vedem săptămâna viitoare. [Aplauze]
>> [CS50.TV]