[THEMA MUZIEK] SPEAKER 1: Hallo, iedereen. Welkom terug bij sectie. Mooie dag out-- dat is waarom, ik ben zeker, zijn er slechts vier van jullie hier en niet onze gebruikelijke verpakking. Ik heb dit weekend ziek geweest. Dus ik heb geen Starburst voor jullie. En ik kan beginnen hoesten verschrikkelijk in deze. Dus gewoon geduld met mij. Ik ga echt proberen en krijgen door middel van deze eerste, echter, voordat ik een hoestaanval. Maar gewoon gemakkelijk op mij een weinig bit-- dat is alles wat ik vraag. Dus onze agenda voor today-- slechts een reminder-- uw quiz is volgende week. Ik zei toch dat dit vorige week dus het niet je zou overrompelen. Dus ik u eraan te herinneren opnieuw. Volgende week van je quiz. Daartoe volgende week sectie zal veel meer zijn van-- Ik zal proberen en te werken in sommige beoordeling. Dus als jullie konden help me out door het sturen van mij dingen die u comfortabel bent met, dat u zich zorgen over maakt, onderwerpen die u wilt voor mij te dekken, dat zou geweldig zijn. Dus ik kan proberen en werken ze in onze rubriek volgende week of stuur je extra materiaal of prep dat je niet elders zou kunnen krijgen. Yeah! Meer mensen komen! Ik dacht, ik heb dat slecht laatste doen week, dat niemand wil om terug te komen? Ik ben bang. Zodat de andere drie dingen dat we gaan dan gaan zijn redirection, file I / O, en dan pointers en dynamisch geheugen. Ik weet zeker dat je al super enthousiast over pointers-- ieders favoriete onderwerp, zo eenvoudig te begrijpen. Ik weet zeker dat jullie allemaal, toch? Dus eerst iets anders, redirection-- dit is eigenlijk gewoon een manier om te bepalen hoe u invoert dingen in uw programma, hoe je uitgang dingen vanuit uw programma. De belangrijkste manieren waarop jullie zijn interactie met het is gewoon via standaard uit met uw print screen hier. Maar er zijn manieren om pipe-- zoals we hier zien is een van onze words-- soort van pijp die informatie of dat gegevens in een bestand van een bestand. Het is gewoon verschillende manieren van het krijgen van dingen in uw programma en uit uw programma, in plaats van ze gewoon af te drukken om dit scherm of het invoeren van de dingen vanaf de opdrachtregel. Dus eerst een weinig groter dan dakje. Dus output-- het gewoon print de uitgang naar een bestand in plaats van uw scherm. Dus als je iets dat gedrukt had "Hallo, wereld!" naar het scherm, als je het in plaats daarvan te output.text, dat creëert dit bestand genaamd output.text. En wanneer u het opent, zal het zeggen: "Hallo, wereld!" in daar. Dit kan super handig zijn als je een ton van fouten eigenlijk, zoals we zien in deze. Als je twee dakje doen, het zal afdrukken van de foutmeldingen. Dus als je een probleem met compileren, het heeft veel fouten en je bent vast te lopen in het proberen om door te bladeren in je command line door alle hen, je kan ze gewoon af te drukken naar een bestand, openstellen van dat bestand, zodat u kan via hen makkelijker scrollen. Ik eigenlijk gebruikt dat de veel toen ik het debuggen mijn 181 psets voor machine learning. Zo kan super nuttig zijn later. Het is ook handig als je een programma dat misschien is het genereren van een bibliotheek of het genereren van een aantal set van snaren, en je moeten in staat zijn om te zien dat het is goed te genereren van hen. Dit is de manier om dat te doen. Dus als je ze wilt afdrukken naar een bestand, je kunnen ze gemakkelijker te onderzoeken, toch? Versus proberen te scrollen via je command line. En dan een ding om op te merken dat met alleen de grotere dan dakje, als je schrijft naar een bestand dat al exists-- dus alsof we liepen dit de eerste tijd, zetten we het aan output.text, en dan hadden we een tweede programma dat dit afgedrukt als programma twee en deed een groter dan tot output.text, het zal overschrijven dat-- zo overschrijven wat er ooit in dat bestand om mee te beginnen. Dus als je wilt toevoegen naar een bestand, zoals we hier zien, je gewoon twee groter dan tekenen. En het zal toevoegen aan het. Het zal deze niet vervangen. Dus als je nodig hebt om meerdere draaien programma's en de aard van de te houden bijhouden wat ze allemaal terug te keren naar u in een bestand, dat is een manier om het te doen. Als je niet kan schelen wat er in uw dossier en het is mogen worden overschreven, u kunt gewoon gebruik maken van een enkele groter dan. Is dat zinvol voor iedereen? Publiek: Net dot slash hallo groter dan uitgang dot tekst, zoals twee keer, het zal gewoon alleen laten zien op de output dot tekst een tweede tijd-- SPEAKER 1: Recht. Dus het zou eigenlijk gewoon helemaal overschrijven wat er was om mee te beginnen. Als dit bestand hier, de output.text al bestaat, in feite alles wat je belt dat weer met een enkele grotere dan kun je gewoon denken zo als het vervangen van het bestand. Net als wanneer je het opslaan van een Word document en je opslaan als, en je blijft met dezelfde naam, en het volledig overschreven het-- dit is hetzelfde soort dingen. Iemand nog vragen over gewoon uitvoeren naar een bestand? Awesome. Zo duidelijk, als je achteruit de pijl richting, kan het ingang doen. Dus als jullie hadden zoals Caesar of Visioneer en je moest invoeren iets, je een command line argument had die daadwerkelijk ingang het. Dit is een andere manier om dat te doen. Dus in plaats van te wachten voor een opdrachtprompt zoals wanneer je gevraagd om je bericht Caesar of Visioneer, als je een tekstbestand gehad dat uw bericht gehad, je kon gewoon typ het in dat. Dus als deze waren als dot slash Caesar 3 minder dan pijl tekst invoeren, die is uw boodschap, dat zou lopen prima. Wanneer uw Caesar programma eigenlijk gevraagd om input van de gebruiker, zou het al omdat u hebt getypt in dit bestand. Dat is gewoon een andere manier. Net een omgekeerde van output-- gewoon input voor uw gegevens. En dan de laatste is pijp. Dus deze is wel cool. Omdat het u toestaat om neemt de uitgang van een programma en zet het als input voor een ander programma. Ik weet niet of iemand van jullie gespeeld met het ontcijferen dat CS50 zou kunnen hebben u gegeven, maar het zou kunt u een aantal monster nemen bestand, typt u deze in uw codering, en dan vanaf daar typt dat in uw decryptie om ervoor te zorgen dat het bleek hetzelfde. Dus het is een soort van drie-weg loop. Ga ervoor. PUBLIEK: Als een programma meerdere ingangen heeft, is er een manier om het te vertellen welke ingang het tekstbestand of de uitgang voor gebruiken? SPEAKER 1: Het heeft meerdere ingangen. Wat ook het bestandssysteem van uw input-- wanneer het vragen om input die eerste keer, het is ga ervan uit, denk ik, het is ga pijp in het gehele bestand. Dus als je meerdere ingangen, je bent gaat worden leidingen in meerdere bestanden. Dus als je vraagt ​​voor berichten drie keer in de code, je gaat om te zetten in drie verschillende bestanden. En het wordt gek. En je moet niet te zorgen over dat moment. Maar dat is het idee. Dus ja, pijp is gewoon output van één programma gebruikt inbreng in het andere. Iedereen goed daar? Cool. OK. Je zult waarschijnlijk niet te veel te doen met het. Maar je moet begrijpen manieren waarop u kunt dit gebruiken. En er zijn een aantal zaken die je zou willen om het te gebruiken. Dus file I / O- Ik weet wat je bent saying-- we gewend aan het lezen van en schriftelijk aan ons scherm er, dat is standaard in en standaard uit. En dat is wat jullie zijn geweest gedaan sinds het begin van de les hier. Maar je kunt ook bestanden lezen en schrijven, dat is alles wat file I / O- dus bestand input, uitgang is alles waar het voor staat. Dus dit betekent in feite dat kunt u uw gegevens nu opslaan. Als je gewoon afdrukken op de scherm, is het in principe weg, toch? Zodra je maakt "Hallo wereld "en run" Hello world " het drukt "Hello world" op het scherm. Maar je kunt niet echt doen niets mee van daar. Als u op te slaan in een tekstbestand bestand, dan plotseling je hebt deze gegevens die jij mag te manipuleren of zet het in een bestand, of zet het in een programma later. Een van de redenen waarom we dit doen is gewoon als een manier om gegevens op te slaan voor later gebruik. Ik heb een paar stappen hier gewoon wandelen door standaard I / O. In stap één, u nodig hebt om een ​​referentie te creëren het bestand met caps FILE ster file. Zodat creëert een aanwijzer naar een bestand. Dus dan wil je om het te openen. En je zegt, letterlijk, gewoon bestand is gelijk aan fopen. En dit gaat om een ​​terug pointer naar het bestand dat je net hebt geopend. Ik zag een paar van jullie jongens op kantooruren. Maar een van de dingen is remember-- pointers kunnen sommige adres of null, toch? Als we ooit een geval waarin iets kan null terugkeren, wat hebben we te doen voordat we ooit gebruiken? We moeten om te controleren of het is null of niet, toch? Omdat sommigen van jullie misschien hebben gehad het probleem waar wat object werd teruggegeven inch breakout was null. U hebt geprobeerd om te presteren een functie op. En uw computer website verweten. Right? Ik wed dat een paar van jullie kan dat probleem hebben gehad. Dus met fopen, zal fopen ofwel terugkeren een pointer naar het bestand of als er iets misgaat, het gaat om null terug. Zodat je altijd moet controleren dat niet nul is teruggekeerd voordat u probeert om iets anders te doen. Dit is als een standaard paradigma dat je gaat hier nodig hebt. Als er ooit een kans dat iets kon null terug, controleren om ervoor te zorgen dat het niet voordat u verder gaat. Anders, je gaat om mooie locatie fouten te krijgen. En niemand vindt het leuk om te gaan met deze. Dus als we hier zien, het eerste argument is gewoon het pad naar het bestand. Als dat bestand niet bestaat, het gaat om dat bestand te maken. En het is gewoon leeg te zijn. En dan het tweede argument is de modus die u wilt. Willen we lezen van deze afbeelding? Wilt u schrijven vanuit het? Wilt u toevoegen? Dus eigenlijk wat ik net said-- als het bestand niet bestaat en je probeert te lezen uit het, het gaat om een ​​fout te gooien. Als het bestand name-- leuk vinden als file.text nog niet bestaat en u wilt schrijven het zal het creëren een leeg bestand genaamd file.text voor u. En als je wilt toevoegen, je moet hetzelfde doen. Heeft dat zin? Als je probeert te lezen uit een bestand dat nog niet bestaat, het zal een fout te gooien. Anders zal hij het bestand aan te maken voor u doen wat u wilt. Cool. Nu kunnen we lezen uit het bestand. En dit is gewoon een soort van gaan door de verschillende functies die we hebben voor file I / O. Dit zal zijn noodzakelijk in deze week PSET, als ik me goed herinner. Ja, absoluut zal noodzakelijk in deze week pset. Dus fgetc geeft het volgende teken. fgets net terug van een regel tekst. Het zal iets omhoog terug naar een nieuwe regel en het zal breken. Dus fread leest een zekere aantal bytes en plaatsen ze in een array, welke is iets wat je zou kunnen wilt doen met re-omvang-- kan nuttig zijn. Hoeveel mensen hebben gelezen de PSET spec, trouwens? OK. [Onverstaanbaar] SPEAKER 1: OK. Prima. Zeker lezen dat-- het is een leuke pset. U krijgt om een ​​verwijderde geheugen terug kaart-- echt spannend als het werkt. Maar zeker, begint te lezen dat. Kom met me praten als je hebben vragen over. OK, dus zoals ik al zei, fread leest een aantal bytes. Dat is een willekeurig nummer dat je gaat stellen. En dan fseek net beweegt een bepaalde positie. Dus misschien heb je niet schelen de volgende 10 bytes. Je wil gewoon om vooruit te spoelen. Je hoeft niet de zorg over hen. U wilt lezen vanaf byte 11. fseek kun je dat doen. Zodat het u toestaat om selectief te zijn over wat je leest. Omdat fgetc, fgets en fread gelezen vanaf een bepaalde plaats in het dossier. Een manier om na te denken over dit is als dit is onze file, wanneer u voor het eerst opent, je hebt deze positie in bestand die begint bij het begin. Wanneer u belt fgetc, fgetf of fread, Het gaat om te beginnen uit deze positie marker. Laten we zeggen dat je gewoon wilt lezen Dit stuk van het geheugen hier. Je kunt niet zomaar roepen. Je hebt hier dan te zoeken en lees dan vanaf daar of gelezen, krijgt, of getc, afhankelijk van wat je wilt. Dus zoek gewoon kunt u skip gedeelten van het geheugen. En dat is het enige Zo kun je dingen overslaan zonder ze te lezen in uw buffer. Is dat zinvol voor iedereen? Uiteraard is er nog een veel parallelle hier-- onze output of invoer omleiding, je hebt lezen en schrijven. Dus fputc gewoon schrijft een karakter in het bestand. fputs schrijft een lijn. Fprintf drukt een opgemaakte uitvoer. Dus als je tabs, of ruimte, of wat al niet. En dan schrijft fwrite sommige reeks bytes naar een bestand. Zodat dit dezelfde manier fwrite en fread zijn analoog opposites-- fgets, fputs, en Vervolgens fputc en fgetc-- veel van gekke, snelle dingen. Gewoon een soort van houden deze handy-- je hebt verschillende tijden waar misschien wilt u gewoon één karakter per keer. Misschien wil je een hele lijn. Met uw woordenboek pset-- die is in twee psets, Ik geloof, geven wij u een hele woordenboek in een tekstformaat die heeft elk woord gescheiden door een lijn. Dus als je wilde om te lezen in één woord per keer, wat zou je gebruiken als je dit leest en ze zijn allemaal gescheiden op nieuwe lijnen, en je wil gewoon een woord op een moment? Publiek: fgets SPEAKER 1: Recht. Fgets-- want dat keert terug wat er op één regel. En als elk woord is zijn eigen lijn, kunnen we fgets gebruiken. Cool. Is dat zinvol, iedereen? Cool? Ja, we gaan om te krijgen het leuke gedeelte met pointers zeer binnenkort, waar u krijgen om wat wiskunde te doen. En het zal geweldig zijn. Laatste step-- uw bestand te sluiten. Met zo veel dingen hier, een van paradigma is als het kan terugkeren null, controleren op null. Als je iets te openen, zou je beter sluiten. OK, dus je bent nog niet klaar tot je gedaan tenzij u deze heeft afgesloten. Zoiets als het is nog niet voorbij totdat de dikke dame zingt. Dat is hetzelfde als het sluiten van het bestand. Zoals het hier, zegt enkel te herhalen, altijd Open je bestand voordat je bent lezen of schrijven naar het. En altijd sluiten als je het hebt geopend. Oké? Cool. Dus hier is een voorbeeld. Dus tiny-- Ik weet niet of je jongens kunnen zien dat heel goed. Konden we verhogen de helderheid of andere manier. Laat me eigenlijk dit doen als ik kan. OK, jullie kunnen niet echt zie dat helemaal niet, kunt u? OK, we gaan dit doen, dan. [Onverstaanbaar] Ik neem aan dat dit is veel beter te zien. Kan iedereen zien waar mijn muis ging is de vraag? Ah, daar is het is-- wat worstelt! OK. In principe moet jullie soort hebben van een idee van wat dit doet. Het is niet perfect. Maar ik heb liever uitleggen dan besteden meer tijd proberen om het goed te formatteren. Kortom, zoals je hier ziet, we beginnen met het bestand geopend. En we hebben een aantal databasebestand dat we zijn opening die zegt dat het onze studenten. En we gaan schrijven. Dus natuurlijk, terug null. Dus hebben we om te controleren op null. En dan als het niet null, gaan we door. En zoals je ziet, we zijn doorlussen hier. Er zijn studenten. Studenten is hash gedefinieerd als drie. En wat we doen is dat we zijn het afdrukken van het bestand, toch? Dus wat moeten we afdrukken van onze bestand? Publiek: De scores die in de matrix? SPEAKER 1: Ja. De scores die in de array-- precies. Dus we zijn het openen van deze database-bestand, dat Ik neem aan dat een soort cijferlijst database. En we zijn gewoon uit te printen van de scores van elke leerling naar dat bestand. Cool? Goed. Awesome. OK. Laten we terug to-- Publiek: Ik heb een snelle vraag. Is de printf niet in de lus? Dat is gewoon in de if-lus? SPEAKER 1: Nee, het is in de lus. Ik kan niet goed zien mijn muis omhoog hier. Dus ik heb moeite om formaat dat goed. Deze beugel moet worden gegaan. Het moet hier beneden. Dit is wat er in je lus. Er. Nu is het mooi. Dus dat is hoe het zou moeten be-- behalve voor die laatste beugel dat ik ontslagen. OK. Is dat zinvol voor iedereen? OK. We gaan om verder te gaan naar het volgende ding then-- die, in feite, je gaat nodig hebben om de code te zien. Dus ik ga gewoon kopieert dat meer dan nu. OK. Dus ik ga je laten zien jullie deze code. En ik wil dat je om te proberen en figuur komen wat het verondersteld wordt te doen. Dus gegeven dat-- een minuut of zo te nemen. Proberen erachter te komen wat er aan de hand hier. Het even welke ideeën? We weten dat we op zijn minst twee argumenten in de command line, toch? Ik neem aan dat een van die gaat worden dat [onverstaanbaar] van ons programma is en dan iets anders. Want als [onverstaanbaar] is minder dan twee, schreeuwen we naar hen. Right? En uit het gebruik, het lijkt erop dat het gaat om een ​​soort van bestand zijn. We het allemaal eens met dat? Dus nu, wat is de lus aan het doen? Wat gaat het door? Publiek: Alle bestanden. SPEAKER 1: Precies. Het gaat door alle bestanden die we hebben ingevoerd daar. Dus voor elk bestand, het het openstellen van een stukje tekst daar. Het openstellen van dat bestand. Right? En het is het lezen van het. Natuurlijk, te controleren of hij null. En dan is het af te drukken. Als het null, het is gewoon ons te vertellen dat is niet een bestand dat bestaat. Want vergeet niet, met Lees ons dossier heeft te bestaan. Right? Met schrijven en append, je kunt wegkomen met het. Maar met lezen, ons dossier heeft te bestaan. En als het bestaat, wat doen we hier? Laten we beginnen gewoon hier. Wat is dit doen-- dit eerste teken. Wat doet het? Hij krijgt één teken, toch? Dus wat is dit? Het wordt het eerste teken. Iedereen weet EOF? Publiek: Einde van het bestand? SPEAKER 1: Einde van file-- precies. Dus het gaat om te gaan door het hele bestand, toch? En dan dat het gaat om te werken door krijgt elke volgende karakter. Right? En wat doet het? Publiek: Putting dat in-- SPEAKER 1: putchar prints aan uw screensaver. [Onverstaanbaar] het karakter. En dan als het [onverstaanbaar] zal dit het bestand te sluiten. Publiek: Denk je niet een [nodig? anders? ?] SPEAKER 1: Niet per se. Ik bedoel, het is een soort van impliciete in deze. Omdat deze retourneert, maar, mits als dit niet deze te vangen, ben je prima. Ik bedoel het is waarschijnlijk goed oefenen om een ​​anders te doen. Maar een andere is niet altijd noodzakelijk vooral als je iets hebt als een terugkeer, die betekent dat in dit geval als het vangt het, je programma gaat eindigen en het zal nooit naar dit. Het is meer voor het geval dat je bent niet noodzakelijkerwijs iets terug. Want als dit niet was iets terug, het zou betekenen dat als dit waar zou zijn, de rest zou nog draaien. En in dat geval moet u zou willen een valse. Als het terug te keren, en van uw programma einde, Een andere is het niet noodzakelijk alle de tijd, afhankelijk van de context. Jacob, heb je een vraag? Publiek: Ja. Dus doet fgetc het volgende karakter te krijgen? Hoe werkt het karakter te verhogen? SPEAKER 1: Ja. Dus fgetc krijgt het volgende teken. U kunt hierbij denken aan het als C ++ in een zin. Publiek: Dus wat was EOF? SPEAKER 1: EOF is het einde van het bestand. Het is gewoon een marker die u laat weten dat je aan het einde van het bestand. Dus dit gaat om af te drukken om uw standaard uit. En dan gaat sluiten het bestand wanneer het klaar is. En dan laten we naar het volgende bestand, toch? Dus over het algemeen, wat heeft dit programma doen? [Onverstaanbaar] SPEAKER 1: Ja. Hij drukt gewoon alles daar. Dus als jullie ooit heb gebruikt CAT en vervolgens de naam van sommige file-- Ik weet niet of iemand van jullie dat ooit gedaan op uw terminal. Maar als je ooit gebruik maken van de command CAT-- C-A-T-- en dan wat dan ook bestand je hebt er-- het print het uit aan uw terminal, die kan zijn super handig voor sommige dingen. Ik gebruik het veel. Is dat zinvol voor iedereen? Cool? OK dus je taak now-- hetzij door zelf of met de mensen om u krijge is om gewoon te schrijven een eenvoudig programma dat zal gewoon schrijven "Hallo, wereld!" uit naar een bestand. [Onverstaanbaar] [Onverstaanbaar] SPEAKER 1: Ik was als, deed Ik doe dat slecht afgelopen week? Ik wist niet dat het zo erg was. Ik ben blij dat u allen hier bent. Het maakt me echt blij. Ik ben een meisje van eenvoudige genoegens. Ik net als toen mijn sectie bijwoont. Dus ik ben net begonnen met deze voor jullie, zodat we samen kunnen coderen. Ik hou niet van het zetten iedereen op ter plaatse, tenzij je wilt zijn. Publiek: voor de quiz, doen we hebben om een ​​programma te schrijven? SPEAKER 1: U kunt gevraagd worden om schrijf eenvoudige programma's met de hand. Yup. Publiek: De quiz is volgende week, toch? SPEAKER 1: De quiz is volgende week woensdag. Dat betekent dat er een mooie [? CSE?] indeling party achteraf, die betekent dat je je scores te krijgen terug dat nacht-- op welk moment? Wie weet? Maar het zal die nacht zijn. Prima. Hoe gaan we dit willen beginnen? Ik geef je een hint-- begint met dit. Publiek: Je moet een bestand te openen. SPEAKER 1: Ja. Dus wat wil je dit noemen? Wil je gewoon om het te noemen "bestand"? Laten we maken het u gemakkelijk. Dus fopen-- wat is onze output test gaat worden? Noem het "Hallo." En wat is onze mode? Wat moeten we doen om dit bestand? Publiek: Lees. Schrijven. SPEAKER 1: We schrijven naar het. Lovely. OK, dus we hebben nu dit bestand. Wat moeten we doen? Publiek: Controleer of het is null. SPEAKER 1: Controleer of het is precies null--. Dat is wat ik graag horen. Dat moet automatisch zijn, vooral vrij veel vanaf dit punt. Als je segfaulting, u waarschijnlijk beginnen niet controleren op null ergens. Negen van de tien keer, dat is gaat om uw fout te zijn. Dus als je gewoon zou kunnen krijgen in de gewoonte, altijd controleren of het null, je leven gaat worden mooi en easy-- of makkelijker. Dus check om te zien of het is null. Dus als het niet null, die is wat de knal gelijk means-- niet null-- deze geldig is. Wat willen we doen? We willen gewoon afdrukken naar dat bestand, toch? Dus wat gaan we gebruiken? Publiek: Fprintf SPEAKER 1: Fprintf-- mooi. En fprintf duurt twee arguments-- waar het gaat en wat we willen gedrukt. Dus wat is het eerste? Waar gaat het naartoe? Publiek: Bestand. SPEAKER 1: Het gaat naar bestand. En wat willen we gedrukt? "Hallo, wereld!" Prima. We hebben nog een laatste thing-- een andere grote paradigma hier. Publiek: Sluiten. SPEAKER 1: Sluiten. Daar ga je. Publiek: Is dit het gebeuren als het bestand is null? SPEAKER 1: Nee, dit is als het niet null. PUBLIEK: Oh, als het niet-- OK. Voor de fopen en vervolgens de twee argumenten die naar binnen gaan, wat doet het eerste argument betekenen weer? SPEAKER 1: Het argument is evenals de naam van het bestand die u wilt gaan. Dus na dit loopt, zou je hebben een aantal bestand genaamd "hello" dat "Hallo, wereld" had binnen het. Dat is alles. Alleen de naam. Publiek: En omdat het schrijven, de bestand hoeft niet te bestaan. Is dat wat je zegt? SPEAKER 1: Recht. Precies. Als "Hello" als een bestand bestaat nog niet, het is gaan naar een bestand met de naam te maken Hello "en schrijf het voor je. PUBLIEK: Als je vertelt het programma om een ​​brief aan het bestand, waarom schrijf je "file" in plaats van de naam van het bestand en fprintf-- SPEAKER 1: Omdat in dit geval, we hebben dat grote FILE-- alle in caps-- ster, bestand. Dus het is een verwijzing naar het bestand dat je het over hebt. Dit is de manier waarop we alleen verwijzen naar het. Dus in dit geval, je kan bedenken file-- aha, kunnen we dit-- bestand hier gebruiken verwijst naar de opening van "Hello" en ze te laten schrijven. Publiek: Kunnen we een "Hello" plaats [? van slechts?] f-bestand? SPEAKER 1: Nee, want "Hello" moet open en beschrijfbaar te zijn. Bestand hier is als een aanduiding die OK zegt, we hebben deze file-- hello-- dat we naar kijken. Het is geopend. En we gaan schrijven. Als je gewoon gebruik maken van "Hello", dat is ingekapseld in. Dus het gaat flippen. Ik bedoel, je zou kunnen hebben genoemd. Je zou het bestand hebben gedaan, ster, "Hello", gelijk aan dat. Maar het hele punt is dat je hebben behoefte aan een bestand ster pointer om kunnen deze functies. Publiek: Kun je bestand, ster, file, "Hello" of heb je te zetten bestand ster, file door het? SPEAKER 1: Je zou doen bestand, ster, "Hallo." U kunt dit wijzigen in welke naam je wilt. Het is volkomen willekeurig wat die naam is. Je kunt het noemen wat dan ook. Noem het vliegende spaghetti, als je wilde. Publiek: Wat is de "w" tussen aanhalingstekens voor? SPEAKER 1: De "w" is gewoon de mode. Dus we schrijven naar dit bestand. Iedereen goed? Duidelijk? Ja. Publiek: Dus als het schrijft dit file, waar vinden we dan dat bestand? SPEAKER 1: Het zal in dezelfde directory die je op dat moment bent. Als je in pset drie en u dit, lopen binnen uw pset drie map gaat worden Dit bestand genaamd "Hallo." Cool? Iedereen goed? Ik heb het gevoel alsof je alles het krijgen van het, dat is geweldig. OK. Dus terug naar mijn dia show-- Ik hou als de dingen werken. OK, pointers-- Zijn jullie opgewonden? Pointers zijn geweldig. Ze nemen een klein beetje om je hoofd wikkelen rond. Dit is mijn tweede jaar onderwijs pointers. En ik denk dat ik het eindelijk. Dus als je moeite, het is OK. Zoals ik al eerder zei, tekeningen te maken helpt veel met dingen in het CS, zo veel als ik denk dat mensen de neiging te denken oh, we zijn op een computer. We moeten gewoon code. No-- tekeningen te maken zal je echt helpen. En ik u aanmoedigen om boren in uw kleuter kant en brengen kleurpotloden of markers en draw. Want het zal u helpen. En als je me ziet op kantooruren, I zal de uitvoering rond stapels papier met pennen tekenen dingen uit. Dus vooral pointers-- tekeningen maken. En ik weet zeker dat we daadwerkelijk gaan zijn enkele foto's trekken hier ook. Dus jullie allemaal om Binky te zien, deze coole claymation ding. En we denken dat het is echt grappig wanneer hij explodeert in een bos van stukken. Het is wat comic relief voor de klas. C [onverstaanbaar] deze grote capaciteit kunnen geheugen controleren. En het is een van de dingen die echt maakt het zo'n krachtige taal. Maar met grote kracht komt grote verantwoordelijkheid. En gekke dingen kunnen gebeuren als je niet oppast. Dus wanneer u gebruik maakt pointers, je wilt maken ervoor dat je echt begrijpt precies wat je aan het doen bent. Hopelijk is het volgende stukje de tijd zal je helpen echt te begrijpen wijzers, hoe ze te gebruiken, en hoe ze te manipuleren. Dus memory-- Ik weet zeker dat we hebben eerder gezien dit diagram. Dus dit is gewoon een simpel schema van hoe de dingen zouden kunnen worden opgeslagen geheugen. Zodat u in principe hebben deze grote arrays van één byte blokken is wat we hebben hier-- lichte stappen telkens met één. Dit is in hex [onverstaanbaar] dus acht-bit blokken. En elk blok wordt geassocieerd met enkele hexadecimaal adres. Dus als je ooit de 0x, dat is gewoon het noteren dat het een hexadecimaal adres. U kunt ervan uitgaan dat betekent sommige adres in het geheugen. We hebben het over geheugenadressen wanneer je ziet hexadecimaal. We hebben integers zijn variabelen praalwagens zijn variabelen die op te slaan. Dus ints store ints. Praalwagens winkel drijft. Dus hebben we ook pointers die winkel geheugenadressen. Dat is een soort van mapping. Pointers zijn uitsluitend voor geheugenadressen. Dus dat is net als uw type er. Het apparaat is 32 bits, hetgeen betekent dat je geheugen adres is vier bytes. Dus elke pointer die je hebt gaat ook zijn vier bytes. Of anders als het vier bytes, geheugen is vier bytes. Pointers store geheugen. Daarom, ze zijn vier bytes. Cool-- wil gewoon dat versterken. U dient deze comic nu krijgen. Ik weet niet hoeveel van jullie zijn xkcd fans, maar ik hou van xkcd. Het is geweldig. Prima. Dus het creëren pointers-- zoals ik al zei, het is vrijwel net iets anders willen. Je hebt een type. Je hebt een naam. Right? Dat is wat we daar hebben. [? Hex?] Ster betekent dat het een pointer, en dan wat je ook wilt noemen. Dus het type vertegenwoordigt wat u kunt opslaan. Oké? Op dezelfde manier als we integers doen, we weten dat we een int opslaan daar. Met een pointer, het heeft een geheugen adres. Maar wat het betekent dat-- is hier is waar een tekening zal van pas komen. Dus in dit geval, we hebben sommige value-- laten we zeggen vier. Vier is op het adres één. OK? Dit eerste betekent hier dat het een pointer 2x. Right? Het is wat wijzer x. x kan iets zijn, wat dan ook. Wat x is-- zeggen x is vier. Het gaat om het op te slaan geheugenadres hier. Dus int, ster, x-- dit is een ander slot in memory-- wie weet wat dit is. Maar het gaat hier een adres op te slaan. Dus dit like-- zou in dit geval dan ook, wordt opgeslagen 0x1-- wat er opgeslagen is op het adres dat onze pointer bevat, moet overeenkomen met wat wij hebben aangewezen. Dus op 0x1, in dit geval, dit is x. Dit kan alleen ooit een int terwijl we met behulp van deze. Evenzo, als we andere 1y, wat adres wordt opgeslagen met een y een char-- hetzelfde met z zijn. Op dezelfde manier, wanneer je proberen te doen inTX gelijk 0,4, het zal je schreeuwt en zijn als geen, je zei dat je een int wilde. Dit wordt verondersteld een int. Stop met het proberen om er een vlotter maken. Dus laten we de dingen zijn wat ze willen zijn. Laat dingen zelf. Zo groot ding is gewoon ongeacht het type pointer het is, dat is het enige wat je kunt daar op te slaan. OK? Met de praktijk, net als bij vorige week, alles lijkt echt een soort van abstract. We gaan wat oefening doen. Het zou logischer zijn. Dus verwijzen en dereferencing-- het is echt belangrijk om deze recht te krijgen. Ik heb nog steeds te vernieuwen zo nu en dan. En ik heb zoiets van wachten, die men wil ik? Dus de ampersand daadwerkelijk zal geven u de verwijzing of het adres van. Dus het adres in terugkeert geheugen waarvan waarde wordt opgeslagen. Dus het gaat om daadwerkelijk terug te keren naar je een hexadecimale, terwijl dereferentie het er werkelijk gaande is om u de gegevens dat wordt opgeslagen. OK? Dus we gaan kijken naar een voorbeeld heel snel, of eigenlijk volgende. OK. Dus we moeten echt denken goed na over dit. Dus hier hebben we een aantal integer x. Ik ga proberen en trek deze uit om het beste van mijn kunnen. Dus we gaan naar dit slot x hebben. En het is het opslaan van vijf. Zijn adres is 0x4. Cool? Allemaal goed. Dus nu hebben we deze pointer. Het was meer dan hier. En de ampersand geeft ons het adres van iets. Dus, in dit geval is het adres van x. Wat is het adres van x? 04 en deze wijzer is op 0x08. Cool? Zo kunt u denken aan deze wijzer, 04, wijst hier net voorbij. En ze pointers genoemd want naarmate we meer in deze, je gaat zien wijzen naar dingen. En een blok verwijzing naar een andere blok zal veel meer zin te maken. Dus hier zijn twee. En dan hebben we een aantal blad, dat what-- 0x0c. En het gaat om dereferentie onze pointer. Dus wat het zegt is OK, hier is onze pointer. De waarde slaat is 0x04, En wat het is te zeggen is ga naar dit adres en vertel me wat er in zit. Dus dat is effectief wat deze pijl aan het doen is. Je kunt denken aan dit als je ster. Dus OK, als we ster doen, betekent het volgen. Ga naar dit adres. En dat is eigenlijk gewoon volgende deze pijl om dit geheugen brok. En geef ons wat er in zit, dat is 5. Het is de reden waarom onze kopie is gelijk aan 5. Heeft dat zin? Is er iemand die me nodig hebben om te gaan door dat opnieuw, of langzamer? Wil je dat ik ga door het nog een keer? OK. We gaan het weer opnieuw te tekenen. Wanneer we beginnen, we het allemaal eens dat we hebben sommige brok van het geheugen dat is een variabele x dat we gelijk aan 5. Wij hebben geen controle over waar het in het geheugen. Dus deze plek is gewoon willekeurig toegewezen. Goed daar? OK. Vervolgens initialiseren we een pointer naar een int. Dat is waarom het is toegestaan ​​om te wijzen op x want we hebben een int in hier. We hebben nog een brok van geheugen omdat deze pointer is een variabele net als iets anders. Het is willekeurig toegewezen wat ruimte in het geheugen. En wat het slaat is het adres van x. Ampersand betekent het adres van x. Dus wat is het adres van x? Publiek: Het is zero-- SPEAKER 1: 0x04. Dus then-- laatste. We hebben een aantal copy-- weer gewoon een andere variabele. Dus laten toewijzen enkele willekeurige plaats. En we dereferentie onze pointer. De ster betekent ga naar de adres opgeslagen in mijn pointer. Vertel me wat er is. Dus het adres opgeslagen in onze pointer is 0x04. Dus gaan we naar dat adres. Het wijst naar dat adres. Wat zit er in dit geheugen blok? Het is een vijf. Dus dat is wat we onze kopie toe te wijzen. Iedereen goed? Cool. Again-- foto. Dus het bijhouden van de waarden hier-- ik ben zal laten jullie denken over dit. We kunnen nog een foto te trekken. Maar ik wil u om te proberen en reden door deze op uw eigen voor een minuut. Omdat ze niet geven ons een voorbeeld adres, Ik ga gewoon ampersand x-- doen die moeten helpen te rijden naar huis. Ampersand betekent adres. Dus in de eerste iedereen gaan met de eerste lijn. Sommige x set's five-- sommige willekeurige sleuf in het geheugen. Int ster pointer is gelijk aan het adres van x, toch? Int ster pointer creëert dit blok, noemt het wijzer, en wijst deze toe aan het adres van x. Ik ben slecht in ampersands. Nu wat we doen is dat we zeggen OK, dereferentie onze pointer. Dus we gaan OK, wat er in onze pointer? Het is ampersand x. Ga naar ampersand x en ken het. Dus nu wordt ampersand x gaat worden 35. Dus eigenlijk, als je dereferentie, ga je op OK. Je gaat om te tekenen foto's als deze. Je gaat om te tekenen uw pijlen dan waar het is. Dus, ga naar deze sleuf in het geheugen en ofwel geef mij die waarde terug, of wijzigen. In dit geval, omdat we op deze waarde, we zijn toe te wijzen aan zijn 35. Overwegende dat in de laatste één, als u merkt, we werden toewijzen wat was in hier om iets anders. Dus ze hebben deze geweldige tafel. Het is niet zo slecht. Jullie werken. Ik ga het uit te tekenen op het bord. We gaan het samen invullen, OK? Dus pak wat papier, grab een partner, beginnen met werken. Ik ga naar een te krijgen groter stuk van krijt. Omdat het gaat om een ​​stuk te zijn. OK. PROFESSOR: OK. Laten we beginnen met de eerste rij. We zullen er starten, dan jullie kan misschien werken door middel van wat meer. OK. a is gelijk aan b keer c dus wat is een? Het is geen strikvraag, dat beloof ik. STUDENT: 4 maal 5. PROFESSOR: 4 maal 5. 20. Dus wat is b? STUDENT: 4. PROFESSOR: en C? STUDENT: 5. PROFESSOR: 5. En dan is dit gewoon gaan worden ampersand a, ampersand b, ampersand c, toch? Niet slecht. Het is eenvoudig genoeg. OK. Dus de volgende. A gelijk is aan een keer c, indien iedereen was onbekend met dat. Is iedereen vertrouwd met de tijd gelijk? OK, dit alles means-- dit afkorting voor een gelijk een keer c. Je kunt het ook doen met verdeeldheid, met toevoeging met aftrekken. Je kunt doen een gelijken, of een plus evenaart c : een gelijk een plus c, a minus gelijk c zou een gelijk een min c. Het is gewoon syntactische suiker. Dus, in dit geval, a gelijk aan een keer c zou ons wat te geven? Nogmaals, niet een strikvraag. STUDENT: 100. PROFESSOR: 100. Heeft iets anders veranderen? Nee Misschien dat ik eindelijk beter bij mijn ampersands. STUDENT: OK, sorry, hoe heb je 100? PROFESSOR: OK. Dus gelijk aan een c keer, dus een maal c. STUDENT: Oh, je bent met behulp van een voor de previous-- PROFESSOR: Ja. Dus dit zijn onze meest recente waarden. Dit zijn wat je zou moeten zijn gebruik als we naar beneden te verplaatsen, op OK. Dus, b is het enige wat veranderen, toch? Dus laten we in al het andere vullen. B. Wat is b zal worden? Om te zijn of niet te zijn. Dus wat is dit? Wat is de ster pa aan het doen? STUDENT: Code naar de locatie van pa. STUDENT: Nee, niet helemaal. Dus dit is een d referentie. STUDENT: Dus b is handed waarde van pa. PROFESSOR: Ja, dus pa is het adres van een, toch? Dus het zegt ga naar waar een is opgeslagen en geef het die waarde. Dus wat is b? STUDENT: 100. PROFESSOR: 100. Perfect. OK, dus pc is wat er aan het veranderen. Al het andere blijft hetzelfde. Wat is pc gaat worden? Eenvoudige opdracht. Pc is gelijk aan pa, en wat is pa? STUDENT: Ampersand een. PROFESSOR: Perfect. Nu komen we interessant. OK, laten we breken deze af. Ten eerste, wat is b keer c, want dat is het makkelijke gedeelte van deze, toch? B maal C is-- STUDENT: 500. PROFESSOR: Ja, dus wat dit doet, als de star pb, wat aan het veranderen? STUDENT: Wat zit er in the-- Hoogleraar: Wat zit er in b? STUDENT: Wat zit er in de ruimte dat pb wijst. PROFESSOR: En pb wijst to-- STUDENT: B. PROFESSOR: B. Dus de enige ding veranderen is b, rechts. Dus b tijden c, 500. Dus dat is wat nu verandert. Cool. Lovely. Jullie doen het uitstekend. Oké, het breken van deze naar beneden. C is aan het veranderen, toch? Zo kunnen we in al het andere vullen. Laten we eens kijken. OK. We weten dat c gaat het worden product van twee getallen, toch? Welke twee getallen, hoewel? STUDENT: A en C? PROFESSOR: Dus een is goed voor de eerste. Dus we d verwijzingen p van een, toch? P van een puntensysteem om een, dus we weten dat dit gaat om 100 keer wat? Keer wat doet pc wijs? Wijst op een. Dus 100 maal 100 is 10.000. Is dat zinvol? Cool. Loodjes, jongens, laatste rij. OK. Wat is hier het veranderen? STUDENT: A. PROFESSOR: A. Perfect, dus al het andere kan hetzelfde blijven. OK. En wat is een? Dus het is een keer wat? Dit is ster pb. Dus ster pb betekent hier is pb, pb punten b. STUDENT: 500. PROFESSOR: 500. Dus hebben we 500 keer 100. Dat is 50.000. Oef! Kijk naar die. STUDENT: Waarom hebben we de & C voor de last-- PROFESSOR: Sorry. STUDENT: Oh, OK. PROFESSOR: Mijn slecht. Veel schrijven. Iedereen goed? Niet slecht, toch? Duurt alleen een beetje terwijl doorwerken. Als je het af te breken, begrijpen wat elk onderdeel verwijst to-- als met alles wat het is, yes-- af te breken naar de kleine problemen en vervolgens recombineren, en je kunt een aantal geweldige dingen te doen. Er zijn de antwoorden, maar we deden dat. Pointer rekenkunde. Ah. Mijn handen zijn allemaal krijtachtige. Dus het optellen of aftrekken int past de aanwijzer door de grootte van het type pointer. Weet je nog hoe elk type heeft een ander formaat? Dus als een dubbele of een lange lange wil acht en int is vier maar char is één. Dus wat je wilt doen is-- één ding om te onthouden is alleen dat hoeveel uw pointer waarde daadwerkelijk verandert zal afhangen van de type pointer is. Iedereen goed met dit? Kan ik wist het? We zijn goed? Awesome. Dus als we wat wijzer dat-- dit gaat be-- ik ben ga het een int pointer maken. Slaat dit. Als je zou wijzer zeggen plus één, wat het gaat doen is dat het gaat om te werken door de grootte van een int want dat is de type pointer is. Met C, is alles zeer strenge en gereguleerd. De int pointer zal werken door de ruimte int zou nemen. Een int is vier bytes. Dus wat zou dit veranderen in? Je bent gewoon het toevoegen van vier op dit. Nu je wijzer zou be-- OK. Dus als het een char en we deden pointer plus één, wat zou het zijn nu? Als het started-- doen alsof we started-- nu is het 0x08. Laten we nu zeggen dat dit een char pointer, en voegden we een. Wat zou er veranderen aan? Hoeveel bytes is een char? Publiek: One. SPEAKER 1: One. Publiek: Dus 0x09. SPEAKER 1: Dus het zou zijn negen. Dus gewoon iets om te onthouden. Net wanneer je een toe te voegen, het is niet het toevoegen van één tenzij het een char. Het toevoegen van hoeveel bytes van het type dat is, dat is waarom we hebben deze vergelijking hier. Dus het is int keer zo groot van het type pointer. Dus we hebben hier het voorbeeld. y werd toegewezen aan die waarde, 0x4, toen we y plus gelijk aan één. Wat er in zit, wat is x, niet verandert. Wat wel verandert is wat er in y. Het adres opgeslagen in y bijgewerkt door vier omdat er vier bytes per int en het is een int pointer. Prima. Dus nu hebben we een andere oefening. Dus de vraag is wat er zal worden afgedrukt. Het even welke ideeën? Publiek: Het aantal personages in gelukkige kat? SPEAKER 1: Precies. Dus graag met je string. Krijgt iedereen dat? Willen we er doorheen lopen? Ja, OK. Dus wat we hebben hier-- I dit zoals zo veel meer. Ik hoef niet te [Onverstaanbaar] belachelijk. Dus hebben we onze reeks hier, tevreden kat. Lovely. We hebben een aantal teller die we zijn het bijhouden van. Dus hebben we een aantal char * pointer die net is gelijk str stellen. Wat dit doet is dat het het toewijzen van een aantal pointer aan het begin van je string. Want ik weet zeker dat, als het werd in collegezaal genoemd, We hebben u dit gegeven kerels datatype genaamd string. Maar echt snaren zijn slechts een array van-- als char *. Het is een pointer naar een stel tekens die aangrenzend zijn in het geheugen. Dus dit zet het gewoon gelijk aan elke string is geïdentificeerd door waar het eerste teken is. Dus dit is gewoon de instelling een bepaald punt gelijk aan het begin van de string. Iedereen goed daar? Cool. Dus dit is dereferentie onze pointer. Dus het is eigenlijk gaat geef ons wat waarde in hier, in onze reeks die we over praten. En we zijn zo lang als zeggen het is niet null terminator. Dus blijven gaan totdat je aan het einde van de string. Update uw muisaanwijzer op een rijtje. Dus r, zal het eigenlijk werken door een elke keer, want dit is een char, de char *. Dus het gaat om door te gaan. Het gaat om te werken. Dus de eerste keer dat dit wordt uitgevoerd, het gaat om hier op h. Het gaat om te werken. Het zal een een te zijn. Het zal een p, y, en zo verder en zo voort. We zullen teller updaten. Wanneer het einde is bereikt, gewoon drukt hoe ver het is geworden. Ja. Publiek: Dus Het telt de ruimte als een, toch? OK. SPEAKER 1: denk het wel. Is dat een question-- Publiek: [onverstaanbaar]. SPEAKER 1: Geen zorgen. Dat ik dat doen. Oké, dus een ding dat ik begrijpen dat met een array, kunt u ook behandelen als een pointer omdat arrays zijn slechts continue spots geheugen. Dus u kunt het te behandelen op dezelfde manier. Je kunt ze manipuleren met pointers, ook. Dus in plaats van het doen van, in dit geval de analoge ding zou matrix 0 gelijk aan 1. Maar op dezelfde manier een string wordt bepaald de start waar het eerste teken is, een array wordt bepaald door waarbij het eerste element. Omdat we weten, we zijn gegarandeerd, dat deze zullen continu beschouwd geheugenblokken. Dat is wat ons in staat stelt om dit te doen. We weten dat ze continu geheugenblokken. Dus in dit geval, door dereferentie gewoon array, die ons vertelt, OK, ga dan naar de start van array, die hier is. Zo kunt u instellen dat gelijk is aan één. En in dit geval, wat de array type is, als je het vernieuwt door een, dat is net als het updaten het naar de volgende index. U kunt dat doen omdat je weten wat er in uw array. Hij weet dus hoe veel te update uw wijzer door, welk adres om het zo te werken dat je bij het volgende slot. Dus dit is gewoon een andere manier van schrijfmatrix 0 gelijk is aan 1, serie 1 gelijk is aan 2, array beugel 2 is gelijk aan 3. Het is gewoon een andere manier over na te denken. Omdat ze voortdurend blokken in het geheugen, U kunt verwijzen naar hen beide door de array notation-- die ik persoonlijk vinden easier-- maar misschien je nodig hebt om het te manipuleren strikt door geheugenadressen. En dit is de manier waarop je dat zou doen. Soort meer van als een cool ding je zou kunnen doen versus misschien niet iets wat je bent daadwerkelijk gaan implementeren. Ik gebruik het in 61. Jullie waarschijnlijk niet nodig zorgen te maken over het te veel. Maar als je geïnteresseerd bent, nemen 61 volgend jaar. We zitten in de laatste loodjes jongens. Ik weet het, het is lang. Dynamic Memory Allocation-- dus we weten dat één dingen toen we spraken tijdens onze eerste deel samen, we keken naar een swap functie waarbij het buiten de reikwijdte van onze belangrijkste functie. En we waren op doorreis in deze waarden die effectief waren kopieën. En zodra swap klaar uitvoeren, het is gewoon liet een stapel. Vergeet niet, we hebben een stack frame voor swap. Laat en die waarden verlaten met het. En weg waren ze. We konden niets doen met hen en we waren triestig want we kunnen niet onze waarden te wisselen. Maar met C, zoals ik al zei, je hebben veel macht over het geheugen. Dus wat je kunt doen is dat je kunt dingen wijzen op de hoop hier dat zal daar blijven tot je ze anders vertellen. Ze zijn als goede kinderen. Ze blijven daar. Ze niet vertrekken. Ze zullen daar blijven tot je als, OK, je weg kan gaan. Overwegende dat dingen op de stapel, who-- ze zijn als stoute kinderen. Ze zullen gewoon weglopen wanneer je wilt om daar te zijn en dan zijn ze weg. Je kunt ze niet terug te krijgen. Dus de hoop is-- wij gaan praten over malloc en gratis, die Ik weet zeker dat jullie gehoord in collegezalen. En dat is eigenlijk een manier als zeer persistent data hebben. Dus u kunt de gegevens met rond zo lang als je wilt. Mhm. Publiek: Kunt u hoop te definiëren en te stapelen? Zijn ze willen plaatsen om dingen te zetten? SPEAKER 1: Dus ze zijn principe gewoon-- ze de manier verwijzen we gewoon naar het geheugen. Dus hoop is gewoon plaatst waar geheugen wordt dynamisch toegewezen, terwijl stack verwijst meer frames stapelen die meer centraal in de functies die daadwerkelijk worden uitgevoerd. Je hoeft niet echt controle. Het grote verschil, je hebt controle over de hoop als je wilt. Je hebt minder controle over de stapel. De stapel is afhankelijk van de functies die worden uitgevoerd, en de volgorde waarin zij lopen, en hoe de dingen worden geretourneerd. Overwegende dat met de hoop, zoals we zullen zien, kun je zeggen, OK, ik wil deze waarde te zijn rond totdat ik je vertellen anders. Het is niet toegestaan ​​om zich te ontdoen van het. Het is niet toegestaan ​​om het te negeren. Je gaat om het rond te houden voor zo lang als ik je vertellen. U krijgt om de baas te zijn in de hoop, terwijl de stack-- misschien als je zoals finagle je weg kunt u de baas zijn. Maar niet helemaal. En het is eigenlijk gewoon geheugen. Het is gewoon verschillende manieren verwijzen naar het geheugen. Cool. Dus met dat, hoe de controle van uw geheugen. Het is met malloc, die je gaat krijgen om te gebruiken. Dus het is gewoon kort voor het toewijzen van geheugen. Dat is alles wat het is. Er is een heleboel andere leuke functies alloc aan het eind, en ze staan ​​voor verschillende dingen. Dus als je opslag nodig hebt dat moet om uw huidige functie langer meegaat dan zo dat wanneer uw huidige functie loopt weg, je nog steeds de gegevens die u kreeg van het, u wilt malloc gebruiken. Dat zal het initialiseren op de heap. En zoals ik al zei en bewaar zeggen, dat je het daar te houden totdat je het anders vertellen, dat is het belangrijkste hier. Dus een ding om op te merken, en dat is meestal echt belangrijk, dat deze sizeof is super handig om te gebruiken omdat afhankelijk van het type van machine je draait, kan variërende hoeveelheden hebben van het geheugen dat het duurt. Zodat u altijd wilt gebruiken grootte van zo dat je machine afhankelijke niet bent, zodat uw code zal draaien op een machine. En dat is slechts een deel van het schrijven van goede code. Als het werkt op een machine, maar geen van de anderen, hoe nuttig was uw programma? Dus wil je altijd ervoor te zorgen en te gebruiken sizeof. Publiek: Dus is dat als de grootte van 10 inch [onverstaanbaar]? SPEAKER 1: Dit is de grootte van 10 ints. ja. Dus grootte van ints zal terugkeren hoeveel kost een int nemen. Of grootte van char, hoe kost een char take. En dan hoeveel blokken van dat wil je? Dus in dit geval willen we iets dat we 10 ints te kunnen opslaan. En het zal onafhankelijk werken van de machine, dat is cool. Dus hoeveel bytes zal dat je eigenlijk geven? Quick wiskunde. Publiek: 40. SPEAKER 1: 40. Precies. Dus een ander groot ding. Pointer of malloc kan null terugkeren. Dus nogmaals, altijd controleren zien of het null geretourneerd voordat je probeert iets te doen met het. Als je het probeert en dereferentie Deze wijzer nu, het is gewoon te segfault want je ging en probeerde aan te raken null wanneer je niet zou moeten hebben. Dus altijd controleren op null. Nogmaals, kan alles wat je doet. Het is misschien null terug. Het zal null terug als je een van beide uit de ruimte, of om welke reden Het liep in sommige geheugen bug. Het soms gewoon null geretourneerd. Dus je hoeft alleen te controleren op het. Dat is alles wat deze dia zegt. En dan wat we hebben hier is een oproep om te bevrijden. Dus op dezelfde manier als je opent u een bestand moet u een bestand sluit, als je malloc geheugen, je moet je bevrijden dat geheugen. En jullie zullen krijgen om echt leuke dingen te doen. En er is een programma dat u kunt uitvoeren om zien of je ooit lekkende geheugen. Maar je wilt niet het geheugen lekken. Het is echt slecht. Gewoon verknoeien dingen. Het is slecht te doen, net als de programmering wijs voor design efficiency. Maar het is ook gewoon een soort van slecht voor uw computer. Dus gewoon gratis dingen als je ze malloc. Jullie zien hier de symmetrieën. Super simpel. Gewoon gratis en dan wat je wijzer, ongeacht de naam van aanwijzer is, en het zal zorg dragen voor het vrijmaken van het voor u. Cool. Dan hebben we dit. Dus we gaan gewoon wandeling door dit programma. En dan jullie gedaan. Dus [onverstaanbaar] gewoon main. Dus hebben we een aantal int * pointer. Dus hebben we een pointer dat gaat om ints houden. En hoeveel ints gaat het om vast te houden? Eentje maar. Grootte van een int. We controleren om te zien of pointer is ongeldig omdat het is, we willen zeggen doe niets. Het is slecht. Dus een fout van een afdruk geheugen, het vaakst terugkeert 1, zoals jullie gewend zijn. En dan hebben we hier, we dereferentie onze pointer. Dus dat betekent dat we gaan om te slaan iets ter plaatse aan ons. Int * pointer, of malloc, geeft de adres van waar het opzij zetten dit geheugen voor u. Dus het is eigenlijk waardoor u like-- als je na te denken over een stelletje huizen in een buurt dat u wilt zetten uw meubels in, malloc is als OK, krijg je naar drie huis. En dat je het geeft het adres van het huis drie. Dus dit nu, dit wijzer slaat een adres, slaat het adres van uw huis. * Ptr middelen, OK, ik ben in mijn huis. Cool. Ik moet wat integer te krijgen. Dus je vraagt ​​iemand om u nu te geven meubels. Zo krijg je een aantal int. En het zet het in je pointer waar het wijst. En dan is het gewoon afdrukken out, u hebt ingevoerd waar. En nogmaals, de referentie. Dus dit is als je naar deze aan te pakken en je zag wat er was. Cool? En dan natuurlijk bevrijden we ons wijzer. Vergeet niet om de aanwijzer te bevrijden. Vergeet niet om te controleren op null. Vergeet niet om de aanwijzer te bevrijden. Je hebt twee dingen die je herinneren van dit, of dat je moet onthouden. Ja. Publiek: [onverstaanbaar] stuff als dat, de char * s. Hoe komt het dat we nooit vrij die? SPEAKER 1: Hm? Publiek: Zijn die als snaren? Je zei snaren zijn net als char * s, toch? Dus waarom niet wij gratis strings? SPEAKER 1: U alleen gratis als je mallocing. PUBLIEK: Oh, als je mallocing. SPEAKER 1: Dus malloc en vrij zijn twee dingen dat je altijd bij elkaar zouden moeten hebben. f open f dicht, twee dingen je samen zou moeten hebben. In beide gevallen, controleren op null. Ja. Publiek: Dus gratis is gewoon waardoor iets anders er na opslaan dit programma heeft het gebruikt? SPEAKER 1: Het is gewoon te zeggen, OK, ik ben klaar met dit. U hoeft niet om het rond te houden. Anders zal uw computer gewoon graag proberen en daar te houden. En dan can't-- je het draait in het geheugen problemen later. Je wilt altijd te bevrijden omdat het vertelt je computer, OK, ik ben gedaan met deze spot geheugen. U kunt het terug hebben voor mij om later te gebruiken. Cool? Ja. Publiek: Dus gebruikten we de% d net omdat een dubbel dat komt terug, of waarom is-- [onverstaanbaar]. Publiek: Kunt u% i gebruiken? SPEAKER 1: U kunt gebruik maken van% i. Op het laatste moment nog vragen? Ga je gang. Publiek: Ik heb net een snelle vraag. Dus de ptr variabele, that's-- achtig, met de int * ptr = malloc, Dat is gewoon zeggen dat het wijst naar een plek in memory-- SPEAKER 1: Wilt u [onverstaanbaar]? Publiek: --that is de grootte van-- nee, het is OK. Maar het is gewoon te wijzen op een plaats in geheugen dat is net als vier bytes. SPEAKER 1: Recht. Dus malloc de grootte van int zegt: OK, ik ga om te gaan vandoor, vinden vier bytes van het geheugen voor u. Wanneer hij vaststelt dat de vier bytes van geheugen, geeft je het adres terug waar het begint, en dat is wat opgeslagen in pointer, of ptr. Goed. Jullie kijken minder verward dan de meeste mensen als ik het over wijzer, dus ik voel me vrij goed op dit moment. Prima. Zoals altijd, moet jullie allemaal gekregen uw pset2 kwaliteiten door nu. Ik weet dat er sommige wankel geweest dingen waar het zegt, formule niet geldig of zoiets. Als je krijgt dat allemaal je cijfers zijn geldig op mijn kant. Dus ik kan je sturen screenshots van je cijfers. Laat me gewoon zo goed als je weet ontbreekt elke kwaliteiten of iets lijkt niet zinvol. Kom naar mij. Ik ben super trots op je geweest jongens al, dus ga zo door. En hebben een goede rest van uw week. Ik weet zeker dat ik wat zie van u op kantooruren.