[Tema Muzica] SPEAKER 1: Bună, toată lumea. Bine ați revenit la pct. Zi frumoasă out-- motiv pentru care, eu sunt Sigur, există doar patru dintre voi aici și nu pachet noastră obișnuită. Am fost bolnav în acest weekend. Deci, eu nu am accelerare pentru voi. Și am putea începe tuse teribil de-a lungul asta. Deci, doar să poarte cu mine. Am de gând să încerc într-adevăr și trece prin aceasta în primul rând, deși, înainte de a avea un atac de tuse. Ci doar să fie ușor pe mine o mic bit-- asta e tot ce cer. Deci, agenda noastră pentru today-- doar o reminder-- testul este săptămâna viitoare. Ți-am spus acest lucru săptămâna trecută așa că nu v-ar prinde cu garda jos. Așa că eu sunt amintindu-vă din nou. De săptămâna viitoare testul dumneavoastră. În acest scop, săptămâna viitoare secțiune va fi mult mai de-- Voi încerca și să lucreze într-un comentariu. Deci, dacă voi putea ajută-mă de mine trimiterea lucruri pe care esti confortabil cu, că ești îngrijorat, subiecte pe care doriți pentru mă pentru a acoperi, ar fi grozav. Așa că am putea încerca și să le lucreze în secțiunea noastră de săptămâna viitoare sau va trimite un material în plus prep care ar putea să nu ajunge în altă parte. Da! Mai multe persoane vin! M-am gândit, am făcut asta prost trecut săptămână, că nimeni nu vrea să se întoarcă? Mi-e frică. Deci, celelalte trei lucruri că vom trece peste sunt redirecționare, dosar I / O, și apoi indicii și memorie dinamică. Sunt sigur că ești super incantat despre pointers-- subiect favorit tuturor, atât de simplu de înțeles. Sunt sigur că voi toți înțeles, nu? Deci, primul lucruri în primul rând, redirection-- aceasta este de fapt doar un mod pentru a controla modul în care de intrare lucruri în programul dumneavoastră, cum te lucrurile de ieșire din program. Principalele modalități că voi au fost interactiunea cu el este doar prin faptul standard de cu ecran de imprimare aici. Dar există modalități de a pipe-- așa cum vedem aici este unul dintre natură nostru words-- de țeavă care informații sau că datele într-un fișier dintr-un fișier. E doar moduri diferite de asistent lucruri în programul dumneavoastră și în afară de programul tău, în loc de doar le imprimați la acest ecran sau introducerea lucruri de la linia de comandă. Deci, în primul rând unul este mic mai mare decât caret. Deci, output-- se imprimă doar de ieșire într-un fișier în loc de ecran. Deci, dacă ați avut ceva care imprimat "Bună ziua, lume!" la ecran, dacă l-ai pus în schimb la output.text, că creează acest fișier numit output.text. Și atunci când o deschideți, va spune "Bună ziua, lume!" acolo. Acest lucru poate fi foarte util dacă aveți o tona de erori de fapt, așa cum vom vedea în asta. Dacă veți face doi caret, va imprima mesaje de eroare. Deci, dacă aveți o problemă cu compilarea, ea are o multime de erori si vei primi împotmolit în încercarea pentru a derula în linia de comandă prin toate acestea, puteți doar le imprimați într-un fișier, deschide acest fișier, astfel încât să poate parcurge mai ușor. De fapt, am folosit ca un lot atunci când am fost depanare mele de 181 de psets pentru masina de învățare. Astfel că poate fi foarte util mai târziu. Este de asemenea util dacă aveți un program de că poate este generatoare de o bibliotecă sau generează un anumit set de siruri de caractere, și tu trebuie să poată vedea că e le generatoare în mod corespunzător. Acesta este modul de a face acest lucru. Deci, dacă le imprimați la un fișier, să le poată examina mai ușor, nu? Față de încercarea de a defila prin linia de comandă. Și apoi un lucru de reținut este că, cu cât este mai mare doar decât caret, dacă sunteți scris pentru un fișier care deja exists-- așa cum ar fi dacă am alergat aceasta prima timp, l-am pus la output.text, iar apoi am avut un al doilea program că imprimat acest lucru ca program de doi și a făcut un mai mare decât la output.text, se va suprascrie that-- astfel suprascrie ceea ce a fost vreodată în acest fișier pentru a începe cu. Deci, dacă doriți să adăugați la un fișier, așa cum vedem aici, faci doar două mai mare decât semne. Și se va adăuga la ea. Ea nu se va suprascrie. Deci, dacă aveți nevoie pentru a rula multiple programe și un fel de a menține evidența a ceea ce toate acestea sunt revenind la tine într-un fișier, asta e un mod de a face acest lucru. În cazul în care nu-mi pasă ce e în dosarul tău și este permis să fie suprascrise, puteți folosi doar un singur mare decât. Asta face sens pentru toată lumea? Audiența: Ca punct slash salut mai mare decât textul ieșire punct, cum ar fi de două ori, acesta va arăta doar pe ieșire dot textului un al doilea time-- SPEAKER 1: Corect. Deci, aceasta ar fi de fapt doar complet suprascrie ceea ce a fost acolo de la început. Dacă acest fișier Aici, output.text deja există, în principiu, orice te sun care din nou cu un singur mare decât vă puteți gândi doar de ea cum ca ea înlocuiește fișierul. Ca și atunci când sunteți de economisire o Word documente și tu nu salvați ca, și vă păstrați același nume, și se suprascrie complet it-- aceasta este acelasi tip de lucru. Oricine are întrebări cu privire la doar scoate într-un fișier? Minunat. Deci, în mod evident, dacă inversa săgeată de direcție, se poate face intrare. Așa că, atunci când voi avea ca Caesar sau Visioneer și a trebuit să intrare ceva, ai avut un argument în linia de comandă că de fapt aceasta intrare. Acesta este un alt mod de a face acest lucru. Deci, în loc de așteptare pentru o linie de comandă, ca atunci când ai cerut pentru dumneavoastră mesaj în Cezar sau Visioneer, dacă ați avut un fișier text care a avut mesajul dvs., ai putea pur și simplu să scrieți în asta. Deci, dacă acest lucru ar fi ca punct slash Caesar 3 mai puțin de sageata introducere a textului, care este mesajul dumneavoastră, că ar fi foarte bine. Când programul Caesar de fapt a cerut pentru intrare de la utilizator, aceasta ar avea deja că care le-ați scris în acest dosar. Asta e doar un alt mod. Doar un revers al output-- doar de intrare pentru date. Și atunci ultima este țeavă. Deci, asta e destul de cool. Pentru că vă permite să ia ieșirea una Programul și pune-l ca de intrare la un alt program. Nu știu dacă vreunul dintre voi a jucat cu descifra care ar putea avea CS50 ai dat, dar ar vă permit să luați o probă fișier, introduceți-l în criptare ta, și apoi de acolo de tip că în decriptarea ta pentru a vă asigura că s-au dovedit la fel. Deci e un fel de trei-un fel de buclă. Du-te pentru ea. Audiența: Dacă un program are mai multe intrări, există o modalitate de a spune ceea ce de intrare pentru a utiliza fișierul text sau de ieșire pentru? SPEAKER 1: Ea are mai multe intrări. Oricare ar fi fișier input-- când este faptul de intrare care prima dată, e de gând să-și asume, cred, e O să țeavă în întregul dosar. Deci, dacă aveți mai multe intrări, ești va fi de conducte în mai multe fișiere. Deci, dacă ceri mesaje de trei ori în codul dvs., ai de gând să fi punerea în trei dosare diferite. Și devine nebun. Și nu ar trebui să aibă la vă faceți griji despre asta acum. Dar asta e ideea. Deci da, țeavă de ieșire este doar unul Programul folosește de intrare în cealaltă. Toată lumea bine acolo? Rece. OK. Tu, probabil, nu va avea de a face prea mult cu ea. Dar ar trebui să înțeleagă moduri în care puteți folosi acest. Și există unele cazuri care ați putea dori să-l folosească. Deci, fișier I / O- știu de ce ești saying-- suntem obișnuiți să citesc de la și scris ecran noastră acolo, care este standard și standard de afară. Și asta e ceea ce voi ați fost face încă de la începutul clasei aici. Dar puteți, de asemenea, citi și scrie fișiere, care este tot fișier I / O- atat de fișier de intrare, de ieșire este tot ce reprezintă. Deci, acest lucru înseamnă în esență că puteți stoca datele dumneavoastră acum. Când doar imprima la ecran, este practic plecat, nu? De îndată ce ați face "Hello lume "și a alerga" Hello World " se imprimă "Hello World" pe ecran. Dar nu poți face într-adevăr nimic cu ea de acolo. Dacă stocați într-un text fișier, apoi dintr-o dată aveți aceste date pe care îl permis pentru a manipula sau pune-l într-un fișier, sau pune-l într-un program mai târziu. Unul dintre motivele de ce am face acest lucru este doar ca o modalitate de a stoca date pentru o utilizare ulterioară. Eu am o pereche de pași aici doar de mers pe jos prin standardul I / O. În prima etapă, voi nevoie pentru a crea o referință la dosar cu toate capace Fișier stele. Deci, care creează un pointer la un fișier. Deci, atunci vrei să-l deschidă. Și tu spui, literalmente, doar fișier este egal cu fopen. Și acest lucru se întâmplă pentru a reveni un pointer la fișierul pe care tocmai ați deschis. Am văzut o pereche de tine Cei de la ore de birou. Dar unul dintre lucrurile Este indicii amintește- pot fi unii adresa sau nul, nu? Dacă avem vreodată un caz în care ceva se poate intoarce null, ce avem de făcut înainte de a le folosi vreodată? Avem nevoie pentru a verifica dacă e nula sau nu, corect? Pentru că unii dintre voi ar fi putut avea problema în cazul în care orice obiect era întors în Breakout a fost nul. Ați încercat să efectuați o anumită funcție pe ea. Și site-ul computer defect. Dreapta? Pun pariu că o pereche de tine ar fi putut avea această problemă. Deci, cu fopen, fopen fie va returnează un pointer la dosar, sau în cazul în care ceva nu merge bine, se va intoarce null. Deci, ai mereu nevoie pentru a verifica că aceasta nu a revenit nul înainte de a încerca să faci nimic altceva. Aceasta este ca o paradigmă standard de care ai de gând să nevoie aici. Dacă există vreodată o șansă care ceva ar putea reveni nul, verificați pentru a vă asigura că nu înainte de a continua. În caz contrar, te duci pentru a obține defecte site-ul minunat. Și nu-i place să se ocupe cu cele. Deci, după cum vedem aici, primul argument este doar calea către fișierul. În cazul în care fișierul nu există, se va crea acest fișier. Și este doar de gând să fie gol. Și apoi al doilea argument este modul pe care doriți. Nu vrem să citească din acest fișier? Vrei să scrie de la ea? Vrei să adăugați? Deci, de fapt, ceea ce tocmai am said-- dacă fișierul nu există și sunteți încercarea de a citi de la ea, o să arunce o eroare. Dacă fișierul name-- place dacă file.text nu există încă si doriti sa scrie pentru ea, va crea un fișier gol numit file.text pentru tine. Și dacă vreți să adăugați, tu ar trebui să facă același lucru. Asta face sens? Dacă sunteți încercarea de a citi de la un fișier care nu există încă, aceasta va arunca o eroare. În caz contrar, se va crea fișierul pentru ai face ceea ce vrei să-l. Rece. Acum putem citi din fișierul. Și acesta este doar un fel de a merge prin diferitele funcții pe care o avem pentru dosar I / O. Această voință să fie necesară în PSET această săptămână, dacă îmi amintesc corect. Da, absolut va fi necesar în PSET această săptămână. Deci, fgetc returnează următorul caracter. fgets returnează doar o linie de text. Acesta va reveni nimic până la o nouă linie, si se va rupe. Deci, fread citește o anumită Numărul de bytes și locuri le într-o matrice, care este ceva ce s-ar putea vrei sa faci cu re-size-- ar putea fi util. Câți oameni au citit spec PSET, apropo? OK. [Inaudibil] SPEAKER 1: OK. Bine. Categoric citit that-- este un PSET distractiv. Ai pentru a recupera o memorie șters card-- cu adevarat interesant atunci când aceasta funcționează. Dar cu siguranta, începe citirea asta. Vino să vorbești cu mine, dacă Aveti intrebari despre ea. OK, așa cum spuneam, fread citeste un anumit număr de bytes. Asta e un numar arbitrar care ai de gând să se stabilească. Și apoi fseek doar se mută într-o anumită poziție. Deci, poate că nu-mi pasă despre următorii 10 octeți. Vrei doar să treceți. Tu nu le pasă de cei. Vrei să citiți începând de la 11 octet. fseek vă permite să faceți asta. Deci, vă permite să fie selectiv despre ceea ce citesc. Pentru că fgetc, fgets, și fread citit dintr-un loc anume în fișierul. Un mod de a gândi despre acest lucru este în cazul în care acest lucru este dosarul nostru, atunci când îl deschideți în primul rând, aveți această poziție în fișier care începe de la început. Ori de câte ori te sun fgetc, fgetf, sau fread, este de gând să înceapă de la acest marker poziție. Să spunem că vrei doar să citească această bucată de memorie pe aici. Nu poți suna. Trebuie să caute aici și apoi citit de acolo sau cititi, devine, sau getc, în funcție de ceea ce doriți. Deci, caută doar vă permite să skip porțiuni de memorie. Și asta e singura Astfel, puteți sări peste lucruri fără să le citească în tampon ta. Asta face sens pentru toată lumea? În mod evident, există o mulțime de here-- paralel redirecționare noastră ieșire, sau intrare, ai citit și ești scrie. Deci, fputc doar scrie un caracter în fișierul. fputs scrie o linie. Fprintf imprimă o ieșire formatat. Deci, dacă aveți file, sau spațiu, sau fleacuri. Și apoi fwrite scrie ceva matrice de octeți într-un fișier. Deci, aceasta este la fel fwrite și fread sunt analoage fgets opposites--, fputs, și apoi o mulțime fputc și fgetc-- , lucrurile rapide de nebun. Doar un fel de a menține această handy-- veți avea momente diferite în cazul în care poate vrei doar un caracter la un moment dat. Poate vrei o linie întreagă. Cu pset-- dumneavoastră în dicționarul care este în două psets, Eu cred că, vă oferim un întreg Dicționar într-un format de text care are fiecare cuvânt separate printr-o linie. Deci, dacă ai vrut să citească într-un cuvânt la un moment dat, ceea ce ar putea să vă folosiți dacă sunteți de lectură și toate acestea sunt separate pe linii noi, si doriti doar un singur cuvânt la un moment dat? Audiența: fgets SPEAKER 1: Corect. Fgets-- pentru că se întoarce tot ce este pe o singură linie. Și dacă fiecare cuvânt este sa linie proprie, putem folosi fgets. Rece. Asta face sens, toată lumea? Rece? Da, vom ajunge la partea distractivă cu indicii foarte curând, în cazul în care ajunge pentru a face unele matematica. Și va fi grozav. Ultima step-- închide dosarul. Cu atât de multe lucruri aici, una dintre paradigmele noastre este dacă se poate întoarce nul, verificați pentru nul. Dacă deschideți ceva, ar fi bine să-l închidă. OK, deci tu nu ai terminat până ce ești făcut dacă nu le-ați închis. Un fel de nu sa terminat până la doamna grăsime cântă. Asta e ca și cum închiderea fișierului. Așa cum se spune aici, doar să reiterez, mereu deschide fișierul înainte de a te citește sau scrie-l. Și întotdeauna se închide dacă le-ați deschis. În regulă? Rece. Deci, aici este un exemplu. Deci, tiny-- Nu știu dacă baieti poate observa că foarte bine. Dacă am putea crește luminozitatea într-un fel. Lasă-mă să fac acest lucru de fapt, dacă pot. OK, voi nu poate într-adevăr poate vedea că, la toate, puteți? OK, vom face asta, atunci. [Inaudibil] Presupun că acest lucru este mult mai bine pentru a vedea. Poate cineva sa-mi vezi unde mouse-ul a mers este problema? Ah, acolo este-- ce luptă! OK. Practic, voi ar trebui să aibă natură de o idee a ceea ce aceasta face. Nu e perfect. Dar aș mai degrabă explica decât cheltui mai mult timp încercând să-l formatați în mod corespunzător. Practic, după cum vedeți aici, vom începe cu fișier deschis. Și avem niște fișier de bază de date care suntem deschidere care spune că e studenții noștri. Și vom scrie la ea. Deci, desigur, intoarce null. Așa că trebuie să verificați nul. Și apoi, dacă nu e nul, vom trece prin. Și, după cum vedeți, suntem looping pe aici. Există studenți. Elevii se hash definit ca trei. Și ceea ce facem noi este că sunt imprimarea la dosar, nu? Deci, ce ne imprimarea la dosarul nostru? Audiența: Scorurile care sunt în matrice? SPEAKER 1: Da. Scorurile care se află în array-- exact. Deci, vom deschide această fișier bază de date, care Presupun că este un fel de baze de date note. Și noi suntem doar imprimând înscris de fiecare elev în acest dosar. Rece? Bun. Minunat. OK. Să ne întoarcem sa-- Audiența: Am o întrebare rapidă. Este printf nu în bucla for? Asta e doar în cazul în care bucla? SPEAKER 1: Nu, e în bucla for. Eu nu pot vedea mouse-ul meu foarte bine aici. Așa că eu sunt luptă pentru a format în mod corespunzător. Acest suport trebuie să fie plecat. Ar trebui să fie aici. Aceasta este ceea ce se află într-voastră de buclă. Acolo. Acum e destul de. Deci, asta e modul în care ar trebui să be-- cu excepția pentru că ultima categorie de care am respins. OK. Asta face sens pentru toată lumea? OK. Ne vom deplasa pe la urmatorul lucru then-- care, de fapt, ai de gând nevoie pentru a vedea cod. Deci, eu sunt doar de gând să copiați că peste chiar acum. OK. Așa că am de gând să-ți arăt voi acest cod. Și vreau să încercați și figura ceea ce se presupune a face. Deci, având în vedere that-- ia un minut sau cam asa ceva. Încercați și dau seama ce se întâmplă aici. Orice idei? Știm că avem cel puțin două argumente în linia de comandă, nu? Presupun dintre care unul va fi care [inaudibil] a programului nostru este și apoi altceva. Pentru că dacă [inaudibil] este mai puțin mult de două, ne-am tipa la ei. Dreapta? Și de la utilizarea, se pare ca aceasta va fi un fel de fișier. Suntem cu toții de acord cu asta? Deci, acum, ce e bucla faci? Ce mai faci prin intermediul? Audiența: Toate fișierele. SPEAKER 1: Exact. Se trece prin toate fișierele pe care le-am intrare acolo. Deci, pentru fiecare dosar, e deschiderea unele șir acolo. Se deschide acel fișier. Dreapta? Și se citește de la ea. Desigur, verifica daca este nul. Și apoi e de imprimare. Dacă e nul, e doar spunându-ne că nu este un fișier care există. Pentru că minte, cu citiți fișierul nostru trebuie să existe. Dreapta? Cu scriere și adăugați, puteți obține departe cu ea. Dar cu citit, fișierul nostru trebuie să existe. Și apoi, dacă aceasta există, ce facem aici? Să începem de aici. Ce-i asta do-- acest prim caracter. Ce face el? El devine un personaj, nu? Deci, ce este aceasta face? Este din ce in primul caracter. Oricine știe EOF? Audiența: Sfârșitul de fișier? SPEAKER 1: Sfârșitul file-- exact. Asa ca va trece prin întregul dosar, nu? Și apoi o să actualizați de asistent fiecare personaj ulterior. Dreapta? Și ce o face? Audiența: Punerea care in-- SPEAKER 1: printuri putchar pentru screensaver. [Inaudibil] caracterul. Și apoi când [inaudibil] aceasta va închide dosarul. Audiența: Nu ai nevoie de un [? altceva? ?] SPEAKER 1: Nu neapărat. Adică, e un fel de implicat în acest sens. Deoarece acest întoarce, deși, atâta timp ca acest lucru nu prinde acest lucru, ești bine. Vreau să spun că e probabil bine practica de a face o altfel. Dar un altceva nu este întotdeauna este necesar în special dacă aveți ceva ca o întoarcere, care înseamnă că, în acest caz, în cazul în care capturile ea, programul se va termina și niciodată nu va ajunge la asta. E mai mult pentru cazul în care sunteți nu neapărat întoarcerea ceva. Pentru că dacă acest lucru nu a fost revenind nimic, aceasta ar însemna că în cazul în care acest lucru ar fi adevărat, restul ar rula în continuare. Și în acest caz, ar vrea un fals. În cazul în care se întoarce, și se încheie programul dumneavoastră, o altfel nu este necesar tot timp, în funcție de context. Jacob, ai avea o întrebare? Audiența: Da. Deci, nu fgetc obține caracterul următor? Cum crește caracterul? SPEAKER 1: Da. Deci, fgetc devine următorul caracter. Vă puteți gândi la ea ca C ++ într-un sens. Audiența: Deci, ce a fost EOF? SPEAKER 1: EOF este sfârșitul de fișier. E doar un marker care vă permite să știți ca esti la sfârșitul fișierului. Deci, acest lucru se întâmplă pentru a imprima standard de ieșire. Și apoi o să închidă fișierul când e gata. Și apoi să mergem la fișierul următor, nu? Deci, în general, ceea ce face acest program face? [Inaudibil] SPEAKER 1: Da. Pur și simplu imprimă tot acolo. Deci, CAT dacă voi au folosit vreodată și apoi numele unui file-- Nu știu dacă vreunul dintre voi aveți făcut vreodată că pe terminalul dumneavoastră. Dar, dacă folosiți vreodată comandă CAT-- C-A-T-- și apoi orice fișier aveți there---l afiseaza-l la terminalul, care poate fi foarte la îndemână pentru unele lucruri. Am o mulțime folosi. Asta face sens pentru toată lumea? Rece? OK deci sarcina dumneavoastră now-- fie prin tine sau cu cei din jur Tu-- este de a scrie doar un simplu program care va scrie doar "Bună ziua, lume!" la un fișier. [Inaudibil] [Inaudibil] SPEAKER 1: am fost ca, nu- Eu fac că săptămâna trecută prost? Eu nu cred că a fost așa de rău. Mă bucur că ești aici. Este într-adevăr mă face fericit. Sunt o fată de plăceri simple. Îmi place doar atunci când pct meu participă. Așa că eu sunt doar obtinerea acestui început de voi astfel încât să putem cod împreună. Nu-mi place inscrie oricine de pe la fața locului cu excepția cazului în care doriți să fie. Audiența: Pentru testul, face trebuie să scrie un program? SPEAKER 1: Vi se poate cere să a scrie programe simple de mână. Da. Audiența: testul este săptămâna viitoare, nu? SPEAKER 1: testul este miercurea viitoare. Asta înseamnă că este un minunat [? CSE?] clasificare partid după aceea, care înseamnă că veți obține scoruri dvs. înapoi că night-- la ce oră? Cine știe? Dar va fi acea noapte. Bine. Cum vrem să pornim acest lucru? Am să vă dau un hint-- începe cu aceasta. Audiența: Trebuie să deschideți un fișier. SPEAKER 1: Da. Deci, ce vrei pentru a apela acest lucru? Vrei doar să-l numesc "dosar"? Să face mai ușor. Deci, ce e fopen-- nostru încercare de ieșire va fi? Spune-i "Bună ziua". Și ceea ce este modul nostru? Ce facem în acest dosar? Audiența: Citiți. Scrierea. SPEAKER 1: Vă scriem pentru ea. Lovely. OK, deci avem acest fișier acum. Ce trebuie să facem? Audiența: Verificați dacă este nul. SPEAKER 1: Verificați dacă este null-- exact. Asta îmi place să aud. Asta ar trebui să fie automată, în special destul de mult din acest punct de pe. Dacă începeți segfaulting, probabil că nu a verifica pentru nul undeva. De nouă ori din zece, e Va fi eroare dumneavoastră. Deci, dacă ați putea obține doar în obicei, verificați întotdeauna dacă e nul, viața ta va fi frumos și easy-- sau mai usor. Deci, verificați pentru a vedea dacă e nul. Deci, dacă nu e nul, care este ceea ce este egal cu Bang-ului means-- nu null-- este valabil. Ce vrem să facem? Vrem doar să le imprimați la acel fișier, nu? Deci, ce vom folosi? Audiența: fprintf SPEAKER 1: minunat Fprintf--. Și fprintf nevoie de doi arguments-- în cazul în care este de gând și ceea ce ne dorim imprimate. Deci, care e primul? În cazul în care se merge? Audiența: File. SPEAKER 1: Se va la dosar. Și ce ne dorim tipărite? "Bună ziua, lume!" Bine. Avem o ultimă thing-- un alt mare paradigmă aici. Audiența: Închide. SPEAKER 1: Închide. Acolo te duci. Audiența: Este acest lucru se întâmplă dacă fișierul este nul? SPEAKER 1: Nu, acest lucru este în cazul în care nu e nul. Audiența: Oh, dacă e not-- OK. Pentru fopen și apoi două argumente care merg în interiorul, ce primul argument medie din nou? SPEAKER 1: Argumentul este la fel ca numele fișierului pe care doriți să ajungeți. Deci, după ce aceasta ruleaza, v-ar au unele fișier numit "hello" care a avut "Bună ziua, lume", în cadrul acestuia. Asta e tot. Doar numele. Audiența: Și din moment ce este scris, fișier nu trebuie să existe deja. Este că ceea ce ai spus? SPEAKER 1: Corect. Exact. În cazul în care "Hello" ca un fișier nu există încă, e va crea un fișier numit Buna ziua "și scrie pentru el pentru tine. Audiența: Când spui Programul a scris la dosar, de ce ai scrie "dosar" în loc de numele fișierului și fprintf-- SPEAKER 1: Pentru că în acest caz, avem că FILE-- mare tot în stele caps--, fișier. Deci, este un pointer la dosar că vorbești. Acesta este modul în care ne-am referi la ea. Deci, în acest caz, pot gândi la aha file--, putem folosi asta: fișier aici se referă la deschiderea "Hello" și anunțându-l scrie. Audiența: Putem pune un "Hello" în schimb [? de doar?] f dosar? SPEAKER 1: Nu, pentru că "Hello" trebuie să fie deschis și inscriptibil. Fișier aici este ca un indicator care spune OK, ne-am au această hello-- file-- care ne uitam la. Acesta a fost deschis. Și vom scrie la ea. Dacă tocmai ați folosi "Bună ziua", care este încapsulat în el. Deci, o să sperii. Adică, ai putea fi numit-o. Ai fi putut face dosar, stele, "Hello", este echivalent cu cel. Dar ideea este că nevoie de un pointer stea fișier în ordine pentru a putea utiliza aceste funcții. Audiența: Ai putea să faci fișier, stele, dosar, "Hello" sau aveți de a pune stele fișier, fișier de aceasta? SPEAKER 1: Ai putea face dosar, stea, "Hello". Puteți schimba acest lucru indiferent de numele pe care doriți. E complet arbitrară ceea ce acest nume este. Puteți numi nimic. Nume ea zboară spaghete, dacă vrei. Audiența: Ce este "W" in ghilimele pentru? SPEAKER 1: "W" este doar modul. Deci ne scriem pentru acest fișier. Toată lumea bine? Clar? Da. Audiența: Deci, atunci când scrie acest fișier, unde ne apoi găsi acel fișier? SPEAKER 1: Va fi în aceeași director că ești prezent în. Dacă sunteți în PSET trei și aveți acest lucru, în termen de PSET ta trei dosar va fi acest fișier numit "Hello". Rece? Toată lumea bine? Mă simt ca și cum ești asistent aceasta, care este mare. OK. Deci, înapoi la show-- meu diapozitiv Îmi place când lucrurile funcționează. OK, pointers-- Sunteti voi entuziasmat? Indicii sunt mari. Ei iau un pic să-și încheie în jurul valorii de cap. Acesta este al doilea meu an indicii de predare. Și cred că în cele din urmă prins. Așa că, dacă lupta, e OK. Așa cum am spus mai înainte, poze cu desen ajută foarte mult cu lucruri în CS, la fel de mult ca și cred că oamenii au tendința de să se gândească oh, suntem la un calculator. Ar trebui doar cod. Imagini de desen No-- te va ajuta cu adevărat. Și eu într-adevăr, va incurajam sa robinet în partea ta kindergartner și scoate creioane colorate sau markere și egalitate. Pentru că vă va ajuta. Și dacă mă vezi la orele de birou, am va fi transportă în jurul valorii de teancuri de hârtie cu pixuri desen lucrurile. Deci, în special cu pointers-- deseneze. Și eu sunt sigur că vom fapt de gând să fi desen cateva poze aici. Deci, voi Trebuie ca toți să vadă Binky, acest lucru claymation cool. Și credem că e foarte amuzant, atunci când el explodează într-o grămadă de piese. E un comic de clasă. C [inaudibil] această capacitate mare a putea controla memorie. Si este unul din lucrurile pe care într-adevăr face un astfel de limbaj puternic. Dar cu o mare putere vine o mare responsabilitate. Și lucruri nebunești se poate intampla dacă nu ești atent. Deci, atunci când utilizați indicii, doriți să faceți sigur că ați înțeles într-adevăr exact ceea ce faci. Să sperăm că următoarea pic de timp va ajuta să înțelegeți cu adevărat indicii, cum să le folosească, și cum să le manipuleze. Deci, memory-- Sunt sigur că ne-am văzut această diagramă înainte. Deci, aceasta este doar o simplă schemă de se pare ca lucrurile s-ar putea fi stocate memorie. Deci, va trebui, practic acestea tablouri imense de blocuri unul octet este ceea ce avem here-- ușoară trepte de câte unul de fiecare dată. Acest lucru este în hex [inaudibil] astfel încât blocuri de opt biți. Și fiecare bloc este asociată cu unele adresa hexazecimal. Deci, dacă vedeți vreodată 0x, că doar notating că este o adresă hexazecimală. Puteți să își asume acest lucru înseamnă unii adresa în memorie. Vorbim despre adresele de memorie ori de câte ori te văd hexazecimal. Avem int sunt variabile, flotoare sunt variabile care stochează. Deci, int magazin int. Magazin flotoare plutește. Deci, avem, de asemenea, indicii că adresele de memorie magazin. Asta e un fel de cartografiere. Indicii sunt exclusiv pentru adresele de memorie. Deci, asta e ca și cum tipul de acolo. Aparatul este de 32 de biți, ceea ce înseamnă că adresa dvs. de memorie este de patru bytes. Deci, orice pointer-vă că aveți este, de asemenea, va fi de patru bytes. Sau dacă e de patru bytes, de memorie este de patru bytes. Indicii de memorie magazin. De aceea, sunt patru bytes. Cool-- vreau doar pentru a consolida asta. Ar trebui să obțineți acest comic acum. Nu știu câți dintre voi sunt fani xkcd, dar îmi place xkcd. E minunat. Bine. Deci, crearea de pointers-- după cum am spus, e destul de mult la fel ca orice altceva. Ai un tip. Ai un nume. Dreapta? Asta e ceea ce avem acolo. [? Hex?] Stele înseamnă că este un pointer, și apoi ce vrei să-i spunem. Deci, tipul reprezintă ceea ce se poate stoca. În regulă? În același mod în care, dacă facem int, știm că suntem stocarea unui int acolo. Cu un pointer, ea deține o adresă de memorie. Dar ce înseamnă that-- aici e în cazul în care un desen va veni la îndemână. Deci, în acest caz, avem unele value-- să zicem patru. Patru este la adresa una. OK? Aceasta prima una înseamnă aici că este un pointer 2x. Dreapta? E un pointer de x. X poate fi ceva, orice. Oricare ar fi x este-- spune x este de patru. Se va stoca adresa de memorie aici. Deci, int, stele, X- acest lucru este un alt slot de la memory-- cine știe ce e asta. Dar va pentru a stoca o adresă aici. Deci, acest lucru ar fi like-- în acest caz, Oricare ar fi, sunt stocate la 0x1-- orice este stocat la adresa pe care pointer noastră deține, trebuie să se potrivească cu ceea ce am desemnat. Deci, la 0x1, în acest caz, aceasta este de x. Acest lucru poate fi doar o vreodată int în timp ce utilizați acest lucru. În mod similar, dacă avem un alt 1y, indiferent de adresă este stocată cu un y are să fie un fel lucru char-- cu z. În același mod, ori de câte ori încercați și de a face INTx este egal cu 0,4, este de gând să țipe la tine și să fie ca nu, ai spus că vrei un int. Acest lucru se presupune a fi un int. Nu mai încerca să-l facă un flotor. Deci, lasa lucrurile sa fie ceea ce vor să fie. Să lucrurile să fie ei înșiși. Deci, mare lucru este doar indiferent de tipul de pointer aceasta este, că e singurul lucru pe care il pot stoca acolo. OK? Cu practica, ca și în cazul Săptămâna trecută, tot pare într-adevăr un fel de abstract. Noi o să facem unele practici. Acesta ar trebui să facă mai mult sens. Deci, referire și dereferencing-- e foarte important pentru a obține aceste drept. Mai am pentru a actualiza fiecare acum și apoi. Și eu sunt la fel ca așteptare, pe care o vreau? Deci, ampersand va da de fapt vă de referință sau adresa de. Deci, se întoarce adresa din de memorie de care variabila este stocat. Deci, o să se întoarcă de fapt pentru tine un hexazecimal, întrucât dereferencing aceasta este, de fapt de gând să vă dau datele care sunt stocate acolo. OK? Deci ne vom uita la un exemplu foarte repede, sau de fapt, următorul. OK. Deci, trebuie să ne gândim cu adevărat cu grijă despre asta. Deci, aici avem unele număr întreg de x. Am de gând să încerc și să tragă aceasta la cele mai bune de abilitățile mele. Deci, vom avea acest slot de x. Și e stocarea cinci. Adresa sa este 0x4. Rece? Toate bune. Deci, acum avem acest indicator. A fost aici. Și ampersand ne dă adresa de ceva. Așa că, în acest caz, este adresa de x. Care este adresa lui x? 04-- și acest indicator este la 0x08. Rece? Deci, vă puteți gândi despre acest pointer, 04, doar punctele aici. Și ei numesc indicii pentru că așa cum obține mai mult în acest lucru, te duci sa vezi ce indică spre lucrurile. Și un bloc arătând spre un alt bloc va face mult mai mult sens. Deci, aici sunt două. Și apoi avem o copie, care este 0x0C what--. Și o să dereference indicatorul nostru. Deci, ceea ce se spune este OK, aici e indicatorul nostru. Valoarea pe care o stochează este 0x04, Și ce se spune este să mergeți la această adresă și spune-mi ce e în ea. Așa că e eficient ceea ce acest sageata face. Vă puteți gândi la asta ca steaua ta. Deci, OK, atunci când facem stea, înseamnă urmeze. Du-te la această adresă. Și asta e de fapt doar în urma acest săgeată pentru această bucată de memorie. Și să ne dea ce e în ea, care este de 5. De aceea copie noastră este egal cu 5. Asta face sens? Are cineva nevoie de mine pentru a merge prin că din nou, sau mai încet? Vrei să mergi prin aceasta încă o dată? OK. Noi o să-l aspira din nou. Când vom începe, suntem cu toții de acord că trebuie unele bucată de memorie care este o variabilă x că ne-am stabilit egală cu 5. Noi nu controlăm în cazul în care acesta este în memorie. Deci, acest loc este doar atribuit în mod arbitrar. Bine acolo? OK. Apoi am inițializa un pointer la un int. De aceea este permis să indice x pentru că avem o int aici. Avem o altă bucată de memorie, deoarece acest indicator este o variabilă la fel ca orice altceva. Este atribuit în mod arbitrar un spațiu în memorie. Și ceea ce se stochează este adresa de x. Ampersand înseamnă adresa de x. Deci, ce este adresa lui x? Audiența: E zero-- SPEAKER 1: 0x04. Deci, then-- ultima. Avem din nou unele copy-- doar o altă variabilă. Așa că haideți să atribuie un loc arbitrar. Și ne-am dereference indicatorul nostru. Vedeta înseamnă Du-te la adresă stocată în pointer mea. Spune-mi ce-i acolo. Deci adresa stocat în pointer nostru este de 0x04. Așa că mergem la acea adresă. Este arătând spre acea adresa. Ce e în interiorul acestui bloc de memorie? Este un cinci. Deci, asta e ceea ce ne-am atribui copie nostru. Toată lumea bine? Rece. Poze Again--. Deci, de urmărire a sumelor here-- eu sunt de gând să lase voi gândi la asta. Putem trage o altă imagine. Dar vreau să încercați și rațiune prin acest lucru pe cont propriu timp de un minut. Din moment ce ei nu au dat ne o adresă exemplu, Mă duc să fac X- ampersand care ar trebui să ajute l conduce acasă. Ampersand înseamnă adresă. Deci, în primul unul, toată lumea du-te cu prima linie. Unele x set de five-- unele Slot aleatoriu în memorie. Pointer stea int este egal la adresa lui x, nu? Int pointer stea creează acest bloc, numește pointer, și-l atribuie adresa de x. Sunt groaznic la ampersand. Acum ce facem este să spunem OK, dereference indicatorul nostru. Deci, vom merge OK, ce e în indicatorul nostru? E ampersand de x. Du-te la ampersand x și realocați-l. Deci, acum, ampersand X va fi de 35. Deci, practic, dacă sunteți dereferencing, te duci OK. Vei fi de desen imagini de acest gen. Vei fi de desen sagetile peste acolo unde este. Deci, du-te la acest slot în memorie și fie da-mi că valoarea înapoi, sau să modifice o. În acest caz, pentru că suntem la acest valoare, suntem o atribuire să fie de 35. Întrucât în ​​ultimul unul, dacă observați, noi au fost atribuirea ceea ce a fost aici pentru altceva. Deci, ei au acest tabel minunat. Nu e așa de rău. Voi lucra pe ea. Am de gând să-l scoată de pe placa. Noi o să-l completați împreună, bine? Deci, apuca unele de hârtie, apuca un partener, începe să lucreze. Am de gând pentru a obține o bucată mare de cretă. Pentru că va fi o mulțime. OK. PROFESOR: OK. Să începem cu primul rând. Vom începe acolo, atunci voi poate lucra poate prin ceva mai mult. OK. un egal ori b c astfel încât ceea ce este o? Nu este o întrebare capcană, promit. STUDENT: 4 ori 5. PROFESORUL: 4 ori 5. 20. Deci, ce e b? STUDENT: 4. PROFESORUL: Și c? STUDENT: 5. PROFESOR: 5. Și apoi acest lucru este doar de gând să fi ampersand o, ampersand b, ampersand C, nu? Nu-i rău. E destul de simplu. OK. Deci, pe următoarea. Un egal ori și c, în cazul în care oricine a fost familiarizat cu asta. Este de toată lumea familiar cu vremurile egal? OK, toate acestea means-- acest lucru este prescurtare pentru un egal de ori c. Puteți, de asemenea, o face cu diviziune, cu plus, cu scădere. Puteți face un egal la egal, sau un plus este egal cu c înseamnă o este egal cu un plus c, un minus egal c ar fi un egal un minus c. E doar zahăr sintactic. Așa că, în acest caz, o este egal cu ori și C-ne ce ar da? Din nou, nu o întrebare capcană. STUDENT: 100. PROFESOR: 100. Are ceva se schimbe? Nu. Poate că va obține în final, mai bine la ampersand mele. STUDENT: OK, îmi pare rău, cum ai ajuns la 100? PROFESOR: OK. Deci o este egal cu o ori c, astfel încât ori și c. STUDENT: Oh, pe care îl utilizați o pentru previous-- PROFESOR: Da. Deci, acestea sunt valorile noastre cele mai recente. Acestea sunt ceea ce ar trebui să fie folosind ca ne-am deplasa în jos, OK. Așa că, b este singurul lucru schimbare, nu? Deci, haideți să completați în orice altceva. B. Ce este b va fi? Pentru a fi sau a nu fi. Deci, ce este aceasta face? Care este steaua pa faci? STUDENT: Cod la locul de pa. STUDENT: Nu, nu chiar. Deci, aceasta este o referință d. STUDENT: Deci b este valoarea mână de pa. PROFESORUL: Da, așa este pa adresa unui, nu? Deci, se spune du-te unde a este stocate și dau acea valoare. Deci, ce este b? STUDENT: 100. PROFESOR: 100. Perfect. OK, deci PC-ul este ceea ce se schimbă. Orice altceva rămâne la fel. Ce este PC-ul va fi? Cesiune simplu. PC-ul este egal cu pa, pa și ceea ce este? STUDENT: ampersand o. PROFESOR: Perfect. Acum ne apropiem de interesant. OK, hai sparge asta jos. În primul rând, ceea ce este ori b c, pentru că asta e partea cea mai ușoară de asta, nu? Ori B C este-- STUDENT: 500. PROFESORUL: Da, așa ceea ce face aceasta, Dacă e pb stele, ce se schimbă? STUDENT: Ce este în the-- PROFESORUL: Ce e în b? STUDENT: Ce este în spațiul care pb indică spre. PROFESORUL: Și Pb indică sa-- STUDENT: B. PROFESORUL: B. Deci singura lucru schimbare este b, dreptate. Deci, b ori c, 500. Deci, asta e ceea ce se schimbă acum. Rece. Lovely. Voi fac mare. Bine, de rupere asta jos. C se schimbă, nu? Astfel încât să putem umple în orice altceva. Să vedem. OK. Știm că c este de gând să fie produs de două numere, nu? Care sunt cele două numere, totuși? STUDENT: A și C? PROFESORUL: Deci o este drept pentru prima. Deci ne d corelarea p de o, nu? P de a puncte la un astfel știm că aceasta va fi de 100 de ori ce? Ori ceea ce le face PC-ul la punct? Indică o. Deci 100 de ori 100 este de 10.000. Are care face sens? Rece. Casa de întindere, băieți, ultimul rând. OK. Ce se schimbă aici? STUDENT: A. PROFESORUL: A. Perfect, așa orice altceva poate rămâne la fel. OK. Și ceea ce este o? Deci e ori ce? Acest lucru este pb stele. Deci, pb stea înseamnă aici e pb, puncte de Pb la b. STUDENT: 500. PROFESOR: 500. Deci avem 500 de ori 100. Asta e 50.000. Uau! Uită-te la asta. STUDENT: De ce avem & C pentru last-- PROFESOR: Îmi pare rău. STUDENT: Oh, OK. PROFESORUL: Greșeala mea. O mulțime de scris. Toată lumea bine? Nu prea rău, nu? Doar nevoie de un pic în timp ce la locul de muncă prin intermediul. Dacă îl rupe în jos, înțeleg ce fiecare parte se referă sa-- ca cu tot ceea ce este, yes-- se descompun la micul Probleme și apoi recombina, și poți să faci unele lucruri minunat. Nu sunt răspunsuri, dar am făcut asta. Pointer aritmetică. Ah. Mâinile mele sunt toate calcaroase. Deci, adăugarea sau scăderea int reglează indicatorul în funcție de mărimea tipului de pointer. Amintiți-vă cât de fiecare tip are o dimensiune diferită? Deci, ca un dublu sau un lung lung este opt și int este de patru, dar char este una. Deci, ce vrei să faci este-- un singur lucru să-și amintească este doar cât de mult ta Valoarea indicatorului se schimbă de fapt va depinde, pe de tip de pointer este. Toată lumea buna cu aceasta? Pot să-l ștergeți? Suntem bine? Minunat. Deci, dacă avem unele pointer that-- acest lucru se întâmplă pentru că sunt be-- gând să-l un pointer int face. Se stochează acest lucru. Dacă ar fi să spui pointer plus unu, ceea ce va face este că va actualiza prin dimensiunea unei int pentru că asta e tip de pointer este. Cu C, totul este foarte strict și reglementată. Int indicatorul se va actualiza prin cantitatea de spațiu int-ar lua. Un int este de patru bytes. Deci, ce s-ar transforma acest lucru în? Ești pur și simplu adăugarea de patru într-o formă acest lucru. Acum, indicatorul ar be-- OK. Deci, dacă a fost un char si am facut pointer plus unu, ceea ce ar fi acum? În cazul în care started-- pretinde noi started-- acum este 0x08. Să spunem acum că aceasta a fost o char pointer, și am adăugat unul. Ce s-ar schimba la? Cât de multe bytes este un char? Audiența: One. SPEAKER 1: One. Audiența: Deci, 0x09. SPEAKER 1: Deci, ar fi nouă. Deci, doar ceva să-și amintească. Doar atunci când adăugați o, nu e adăugarea unui excepția cazului în care este un char. Este adaugand cate octeți tipul că este, care este motivul pentru care ne-am această ecuație aici. Deci e ori int de dimensiunea de tipul de indicator. Deci, avem exemplul de aici. y a fost însărcinată această valoare, 0x4, când am făcut y plus este egal cu unu. Ce e în ea, ceea ce este în x, nu se schimba. Ce face schimbare este ceea ce este în y. Adresa stocate în y actualizat cu patru pentru că există patru octeti într-un int și este un pointer int. Bine. Deci, acum avem un alt exercițiu. Deci, întrebarea este ce se va imprima. Orice idei? Audiența: numărul de de caractere din pisica fericita? SPEAKER 1: Exact. Deci, ca cu șirul. Are toată lumea asta? Nu vrem să umblăm prin ea? Da, OK. Deci, ceea ce avem here-- I ca aceasta atât de mult mai mult. Nu trebuie să [Neauzit] ridicol. Deci avem șir aici, cat de fericit. Lovely. Avem unele contor care suntem urmarirea. Deci, avem unele char * pointer că doar este setat egal cu Str. Ce face acest lucru este e atribuirea unele pointer la începutul șir ta. Pentru că sunt sigur, ca aceasta a fost menționat în curs, v-am dat voi prezenta tip de date numit șir. Dar de fapt sunt doar siruri de caractere o serie de-- ca char *. Este un pointer la o grămadă de personaje care sunt contigue din memorie. Deci, acest lucru pur și simplu stabilește egală cu orice șir este identificate prin unde primul caracter este. Deci, aceasta este doar setarea un moment dat egală cu începutul șirului. Toată lumea bine acolo? Rece. Deci, aceasta este dereferencing pointer nostru. Deci, este de fapt de gând să să ne dea o valoare aici, în șir noastră că vorbim despre. Și noi spunem la fel de mult timp ca nu e terminator nul. Deci, continua să mergi până când veți obține la sfârșitul șirului. Actualizați indicatorul de unul. Deci, r, acesta va fi actualizat efectiv de către unul de fiecare dată pentru că acest lucru este un char, char *. Asa ca va trece prin. O să actualizeze. Deci, prima dată în acest ruleaza, aceasta va fi aici la ore. O să actualizeze. Va fi un un. Va fi un p, y, și așa mai departe și așa mai departe. Vom actualiza contra. Când se ajunge la sfârșitul anului acesta, doar imprimă cât de departe este ajuns. Da. Audiența: Deci, conteaza spațiul ca unul, nu? OK. SPEAKER 1: Gândiți-vă așa. Este că o question-- Audiența: [inaudibil]. SPEAKER 1: Nu vă faceți griji. Această fac asta. În regulă, deci un singur lucru să înțeleagă este faptul că, cu o serie, puteți, de asemenea, o trata ca un pointer deoarece matrice sunt doar pete continue de memorie. Astfel încât să puteți trata în același mod. Aveți posibilitatea să le manipula cu indicii, de asemenea. Deci, în loc de a face, în acest caz, un lucru analog ar fi matrice 0 este egal cu 1. Dar, în același mod în care un șir este determinată de la începutul unde primul caracter este, o matrice este determinat de în cazul în care primul element este. Pentru că știm, suntem garantat, că acestea vor fi continuu blocuri de memorie. Asta e ceea ce ne permite să facem acest lucru. Știm că sunt continuu blocuri de memorie. Deci, în acest caz, prin dereferencing doar matrice, care ne spune, OK, du-te la începutul matrice dvs., care este aici. Astfel încât să puteți seta egală cu unu. Și în acest caz, indiferent de matrice dvs. tip este, atunci cand actualizare de unul, asta e la fel ca actualizarea l la indicele următor. Puteți face acest lucru pentru că Știi ce e în matrice ta. Așa că știe cât de mult a actualiza indicatorul de, ce adresă să-l atât de actualizare ca esti la slotul urmator. Deci, aceasta este doar un alt mod a scris matrice 0 este egal cu 1, matrice 1 este egal cu 2, matrice Suport 2 este egal cu 3. E doar un alt mod de a gândi despre asta. Pentru că ei sunt continue blocuri în memorie, puteți face referire la ele, fie prin matrice notation-- pe care eu personal găsi easier-- dar poate aveți nevoie pentru a manipula strict de adrese de memorie. Și acesta este modul în care s-ar face asta. Un fel de mult ca și cum o atribut atractiv ai putea face versus poate nu ceva de care ești de fapt de gând să pună în aplicare. Sa-l folosesc la 61. Voi probabil nu au nevoie să vă faceți griji despre asta prea mult. Dar daca esti interesat, ia 61 anul viitor. Suntem în cei de acasă elastice. Știu, e lung. Dinamic de memorie Allocation-- astfel știm că o de lucruri, atunci când am vorbit în timpul prima noastră pct împreună, ne-am uitat la un swap funcție unde a fost în afara domeniului de aplicare al funcției nostru principal. Și am fost asociate în aceste valori care au fost în mod eficient de exemplare. Și o dată de swap terminat de executare, a lăsat doar o stivă. Amintiți-vă, avem o stivă cadru pentru swap. Se lasă și pe cei Valorile pleca cu ea. Și ei au plecat. Nu am putut face nimic cu ei și am fost trist pentru că nu putem schimba valorile noastre. Dar cu C, așa cum am menționat, aveți au o mulțime de putere asupra memoriei. Deci, ce puteți face este de a putea aloca lucrurile pe grămada de aici că va rămâne acolo până la le spui altfel. Sunt ca niște copii buni. Ei stau acolo. Ei nu pleca. Vor sta acolo până când sunteți cum ar fi, OK, poti sa te duci departe. Întrucât lucruri pe stiva, who-- ei sunt ca niște copii obraznici. Vor rula doar departe atunci când doriți să fie acolo și apoi au plecat. Nu-i poți lua înapoi. Deci, heap este-- vom vorbesc despre malloc și gratuit, care Sunt sigur că voi auzit în curs. Și asta e de fapt un fel pentru a avea date foarte persistente. Astfel încât puteți să vă păstrați datele în jurul valorii de atâta timp cât doriți. MHM. Audiența: Poți să definiți heap si stiva? Sunt le place locuri pentru a pune lucrurile? SPEAKER 1: Deci sunt practic doar-- sunt modul în care ne vom referi doar la memorie. Deci, heap este doar locuri unde de memorie este alocată dinamic, întrucât stivă se referă mai mult pentru a stiva de cadre care sunt mult mai central în funcții care sunt de fapt rulează. Nu aveți într-adevăr de control. Diferența mare, aveți control pe heap, dacă doriți să. Ai mai putin control asupra stiva. Stiva depinde de Funcțiile pe care se execută, și ordinea în care acestea sunt a alerga, și modul în care sunt returnate lucrurile. Întrucât cu grămada, ca vom vedea, vă pot spune, OK, vreau această valoare să fie în jurul valorii de până când am să-ți spun altfel. Nu vi se permite să scape de ea. Nu ai voie să-l trece peste. Ai de gând să-l păstrați în jurul valorii de pentru atâta timp cât am să-ți spun. Ai de a fi șeful în heap, întrucât stack-- poate, dacă ca finagle-ți de drum poti fi seful. Dar nu destul. Și este într-adevăr doar amintire. E moduri diferite locații de referindu-se la memorie. Rece. Deci, cu care, cum să controla memoria. E cu malloc, care ai de gând pentru a obține pentru a utiliza. Deci, e doar pe termen scurt pentru alocare de memorie. Asta e tot ce este. Există o grămadă de alte rece Funcțiile care au aloc la sfârșitul anului, și ei stau pentru lucruri diferite. Deci, atunci când aveți nevoie de stocare care are nevoie pentru a dura mai mult decât funcția actuală atât de că, atunci când actuala ta Funcția fuge, aveți în continuare datele pe care le luat de la ea, pe care doriți să utilizați malloc. Că vom inițializa pe heap. Și așa cum am spus și să păstreze spune, să-ți ții acolo până când o spun altfel, care este cel mai important lucru aici. Deci, un singur lucru pentru a observa și care este de obicei foarte important, este faptul că această sizeof este foarte util să se utilizeze pentru că în funcție de tipul de mașină rulați, acesta poate avea valori diferite de memorie care este nevoie. Deci, vrei mereu să utilizeze dimensiunea de astfel că nu ești dependent de mașină, astfel încât codul va rula pe orice mașină. Și asta e doar o parte de a scrie cod bun. Dacă funcționează pe o mașină, dar nu oricare dintre celelalte, cât de utilă a fost programul tău? Deci, vrei mereu să asigurați-vă și de a folosi sizeof. Audiența: Deci, este faptul că alții dimensiunea de 10 inch [inaudibil]? SPEAKER 1: Aceasta este dimensiunea de 10 int. Da. Deci, dimensiunea de int se va întoarce cât de mult o int ia. Sau mărimea char, cum de mult nu o ia char. Și atunci cum de multe blocuri de care vrei? Deci, în acest caz, vrem ceva pe care le poate stoca 10 int la. Și va funcționa indiferent de mașini, care este rece. Deci, cât de multe bytes va că de fapt dai? Matematica rapid. Audiența: 40. SPEAKER 1: 40. Exact. Deci, un alt mare lucru. Pointer sau malloc poate intoarce null. Deci, din nou, verificați întotdeauna la a vedea dacă acesta a revenit nul înainte de a încerca și de a face ceva cu ea. Dacă încercați și dereference acest pointer acum, este doar de gând să segfault pentru că te-ai dus și a încercat pentru a atinge null, atunci când nu ar trebui să aibă. Deci, verificați întotdeauna pentru nul. Din nou, tot ce se poate face. S-ar putea intoarce null. Va intoarce null daca esti ori din spațiu, sau pentru orice motiv ea a fugit în unele bug memorie. Uneori doar returneaza null. Deci, trebuie doar să verificați pentru ea. Asta e tot ce acest diapozitiv spune. Și atunci ce ne-am aici este o chemare pentru a elibera. Deci, în același mod în care, dacă deschide un fișier, trebuie să închizi un fișier, dacă memoria malloc, tu trebuie să te elibereze acea memorie. Și voi primi de a face lucruri foarte misto. Și există un program, puteți rula la vezi dacă ești vreodată scurgeri de memorie. Dar nu vrei să se scurgă de memorie. E foarte rău. Doar mizerie lucrurile. E rău să faci la fel ca programare înțelept pentru eficiență proiectare. Dar este, de asemenea, doar un fel de rău pentru calculatorul dumneavoastră. Lucrurile așa doar gratuite atunci când le malloc. Voi vedea simetriile aici. Super-simplu. Doar liberă și apoi se indiferent de indicatorul, indiferent de denumirea indicatorul este, și ea va avea grijă de eliberându-l pentru tine. Rece. Apoi, avem asta. Deci, noi suntem doar de gând să plimbare prin acest program. Și apoi voi sunt efectuate. Deci, [inaudibil] doar principal. Deci, avem unele int * pointer. Deci, avem un pointer care va ține int. Și câți int este de gând să dețină? Doar unul. Marimea unui int. Vom verifica pentru a vedea dacă pointer este nul, deoarece este, vrem să spunem nu fac nimic. E de rău. Așa că am imprima o eroare din memorie, cel mai adesea se întoarcă 1, ca voi sunt obisnuiti. Și apoi avem aici, dereference indicatorul nostru. Asta înseamnă că vom stoca ceva la o locație dată la noi. Int * pointer, sau malloc, returnează adresa în cazul în care anularea acestei memorie pentru tine. Deci, este practic oferindu-vă like-- dacă gândiți-vă o grămadă de case într-un cartier pe care doriți să puneți în mobilier, malloc este ca OK, veți obține pentru a merge la casa trei. Și vă oferă Adresa de casa trei. Deci, acest drept acum, acest Magazine pointer o adresă, stochează adresa de casa ta. * mijloace ptr, OK, eu sunt la casa mea. Rece. Am nevoie pentru a obține niște întreg. Deci tu ceri pe cineva pentru a vă oferi mobilier de acum. Astfel încât să obțineți niște int. Și îl pune în indicatorul în cazul în care se indică spre. Și apoi doar printuri afară, ați introdus oriunde. Și din nou, de referință. Deci, aceasta este ca și cum te-ai dus la aceasta adresa și ați văzut ce a fost acolo. Rece? Și apoi, desigur, ne-am elibera indicatorul nostru. Nu uita pentru a elibera indicatorul. Nu uitați să verificați pentru nul. Nu uita pentru a elibera indicatorul. Aveți două lucruri pe care le amintesc de la aceasta, sau că trebuie să vă amintiți. Da. Audiența: [inaudibil] chestii cum ar fi faptul că, char * s. Cum de nu ne-am elibera pe cei? SPEAKER 1: Hm? Audiența: Sunt cei ca siruri de caractere? Ai spus siruri de caractere sunt la fel ca char * s, corect? Deci, de ce nu ne-am desprindă siruri de caractere? SPEAKER 1: numai să vă gratuit dacă ești mallocing. Audiența: Oh, dacă ești mallocing. SPEAKER 1: Deci malloc și gratuit sunt două lucruri că ar trebui să aveți mereu împreună. f, aproape f deschis, două lucruri ar trebui să aveți împreună. În aceste două cazuri, verificați pentru nul. Da. Audiența: Deci, liber este doar permițând altceva să fie stocate acolo după acest program a folosit-o? SPEAKER 1: E doar că, OK, am terminat cu asta. Nu aveți nevoie să-l păstrați în jurul valorii. În caz contrar, computerul va La fel ca încercați și păstrați-l acolo. Și apoi can't-- ruleaza în probleme de memorie mai târziu. Întotdeauna vrei să-l elibereze pentru că se spune computerul, OK, eu sunt terminat cu acest loc de memorie. Puteți să-l avea din nou pentru mine de a utiliza mai târziu. Rece? Da. Audiența: Deci, am folosit% d locații deoarece un dublu care se mai întoarce, sau de ce este-- [inaudibil]. Audiența: Poti folosi% i? SPEAKER 1: Puteți folosi% i. Orice întrebări de ultim minut? Dă-i drumul. Audiența: Am o întrebare rapidă. Deci, variabila PTR, that's-- cum ar fi, cu int * ptr = malloc, care este doar că e arătând spre un loc în memory-- SPEAKER 1: Vrei [inaudibil]? Audiența: acea experiență a lui mărime de-- nu, e în regulă. Dar e doar arătând spre un loc în de memorie care e la fel ca patru bytes. SPEAKER 1: Corect. Deci, malloc dimensiunea de int spune: OK, am de gând să merg fugi, găsi patru bytes de memorie pentru tine. Atunci când constată că patru bytes de memorie ea, vă dă înapoi adresa de unde începe, și asta e ceea ce stocat în pointer, sau ptr. Bun. Voi uiti mai puțin confuz decât majoritatea oamenii când vorbesc despre pointer, așa mă simt destul de bine acum. Bine. Ca întotdeauna, voi ar trebui să aibă tot primit notele pset2 până acum. Știu că au existat unele subred lucrurile în cazul în care se spune, formula nu este validă sau ceva. Dacă primiți asta, tot de notele tale sunt valabile pe partea mea. Deci, te pot trimite capturi de ecran din notele. Doar lasă-mă să știu la fel de bine daca esti orice lipsă de clase sau ceva nu pare să aibă sens. Vino la mine. Am fost foarte mândru de tine baieti deja, așa că ține pasul. Și au o odihnă bună a săptămânii. Sunt sigur că voi vedea ceva de tine la ore de birou.