DAVID MALAN: Rendben, szívesen vissza. Ez CS50. Ez a kezdete a hét hét. Szóval ez már egy ideje, így azt gondoltam, hogy hogy egy forgószél túra, ahol abbahagyta, és ahol mi vagyunk most megy. Tehát ez a dolog itt lehet, hogy okozott némi szorongás először. De remélhetőleg, akkor kezd hozzászokik, hogy ez mit jelöl itt - csillag képviselő mutató, amely csak mi, több laikus szempontból? Szóval ez egy cím. Szóval ez a címe valami a memóriában. És elkezdtünk húzza vissza a rétegek Néhány héttel ezelőtt, a dolgok, mint GetString és más hasonló funkciók egész idő alatt már visszatérő címét dolgok a memóriában, mint a címét az első karakter bizonyos sorrendben. Így is bevezette valgrind, amely akkor elkezdi használni ezt a problémát állítva, különösen a következő probléma meg is. És valgrind mit értünk? Ellenőrzi a memóriavesztés, és is ellenőrzi visszaélés memóriát. Ez, bizonyos valószínűséggel, érzékeli, ha A kód fog érinteni memória hogy egyszerűen nem. Tehát nem feltétlenül a szivárgást, de ha túlmutatnak határain egyes tömb, és a ténylegesen megtett valgrind és rávenni, hogy a viselkedését, miközben valgrind fut a program belül futó, akkor kapsz üzenetek, mint ez - "érvénytelen írnak 4-es méretű, "ami, felidézni egy-két héttel ezelőtt azt jelentette, hogy volt véletlenül mint egy int túl messze határain túl egy tömb. És így 4-es méretű itt azt jelenti, a méret az adott int. Tehát hogy megnyugtató, hogy az a tény, valgrind kimeneti, a formátum is, csak kegyetlen. Nagyon nehéz átlátni a rendetlenség az érdekes információkat. Szóval, mit tettünk itt csak részlet néhány több pár érdekes vonalak. De észre, hogy 80%-a az valgrind kimenet lesz egy kis figyelemelterelés. Csak nézd minták, mint ezek - érvénytelen jobb, érvénytelen olvasni, 40 bájt és egyes blokkok száma egyértelműen elveszett, kulcsszavak ilyesmi. És mit fog remélhetőleg látni egy kis egyfajta nyoma, hogy mi működik a hiba valójában be Ebben az esetben is, milyen sorban a kód volt a hiba nyilvánvalóan? 26 nevű fájlt memory.c, ami A példában játszottak abban az időben. Tehát valószínűleg nem a malloc. Valószínűleg az én kódot. Szóval majd meglátjuk ezt újra és ismét nemsokára. Tehát scanf, ez jött fel egy Pár formák eddig. Láttuk sscanf röviden. Olyan volt, mintha a több Ön fejest ugrott a felkészülés a teszt. És scanf valójában mi a CS50 könyvtár használta alatt Hood jó ideje, hogy hogy adatokat kér a felhasználótól. Például, ha áttérni a CS50 készülék itt, hadd nyit egy Például ma, hogy hívják scanf-0.c És ez végtelenül egyszerű. Ez csak néhány sornyi kódot. De ez azt mutatja, hogy tényleg getInt dolgozott egész ebben az időben. Ebben a programban itt, a 16. sorban Figyelje meg, hogy kijelentem, int. Tehát nem mutató, semmi mágikus ott, csak egy int. Aztán a 17. sorban, azt kéri a felhasználó egy számot, kérem. Aztán késő 18, azt használja scanf itt. És én meg, olyan, mint printf, hogy várom idézet Unquote százalék i. Tehát százalék i, persze, jelöli egy int. De észre, mi a második érv, hogy a scanf. Hogyan jellemezné a második érvelés után a vessző? Mi ez? Ez a cím az x. Tehát ez hasznos, mert azáltal, hogy scanf a címét x, mit amelyek képessé teszik ezt a funkciót, hogy nem? Nem csak ott, hanem az, amit? Készíts egy változás is. Mert akkor ott, ez a fajta mint egy térkép, hogy a hely a memóriában. És mindaddig, amíg az Ön által megadott scanf vagy minden funkció olyan térképet, amely funkció ott, és nem csak a nézd meg az értéket, de ez is át az értékeket, ami hasznos, ha a célja az életben, hogy scanf szkennelés adatokat kér a felhasználótól, különösen a billentyűzetről. És a f jelöli formázott, mint printf, a f jelöli a formázott karakterláncot szeretne nyomtatni. Tehát röviden, ez a sor 18 egyszerűen azt mondja, próbálja olvasni egy int a felhasználó billentyűzet és tárolja belsejében x, a bármi cím x lesz élni. És akkor végül, a 19 csak azt mondja, köszönöm a int, ebben az esetben. Hadd megy előre, és ezt. Tehát, hogy scanf 0-ra. Hadd menjek előre, és nagyításhoz Megyek, és futtassa ezt pont perjel scanf 0-ra. Szám, kérem? 50.. Köszönöm a 50. Tehát ez nagyon egyszerű. Most mi van az nem csinál? Ez nem csinál egy csomó hiba ellenőrzése. Például, ha nem működnek együtt, és nem írja be a számot, de a ehelyett írok valamit, mint a "hello," ez csak furcsa. És az egyik dolog, a CS50 könyvtár már csinál nekünk egy kis idő, hogy reprompting és reprompting. Az Újra kifejezés visszahívás volt cs50.c, és ez az oka annak, hogy a getInt A CS50 könyvtár valójában egy egész csomó sor hosszú, mert mi vagyunk ellenőrzi a buta dolgok, mint ez. Vajon a felhasználó nem ad minket, sőt, egy int? Vajon ő ad nekünk valamit mint az ABC szerinti rendezést? Ha igen, szeretnénk észlelni ezt, és kiabálni őket. De a dolgok sokkal érdekesebb ebben a következő példában. Ha elmegyek scanf-1.c, mi az, dolog, hogy alapvetően megváltozott A következő példa? Én vagyok a char *, persze, helyett int. Szóval ez azért érdekes, mert char * emlékszem, tényleg csak a ugyanaz, mint a szöveg. Olyan érzés, mint lehet, hogy ez egy szuper egyszerű végrehajtása getString. De én hámozott vissza a réteg A CS50 könyvtár, úgyhogy hívja a char * most. Lássuk, hol, ha bárhol, mi baj. Line 17 - Megint mondom, kérek valamit, ebben az esetben egy string. Majd a következő sorban, hívom scanf, újra, így ez a formátum kód de ezúttal százalék s. És akkor ez az idő, én vagyok így ez puffer. Most veszi észre, nem vagyok a a jel. De miért van az, hogy az valószínűleg rendben itt? Mert ami buffer már? Ez már a mutató. Ez már egy címet. És nézzük ezt a szót "megzavarja" Hadd csak ez s, például az, hogy egyszerűség. De én nevezte puffer, mert Általánosságban elmondható, programozás, ha van egy darab memória, amely egy sor igazán csak az, hogy lehet, hogy ez egy puffer. Ez egy olyan hely az adatok tárolására. Hasonló a dolgokat, mint a YouTube, amikor ők pufferelés, hogy úgy mondjam, hogy a csak azt jelenti, hogy ez le bitet az interneten, és tárolja azokat egy helyi tömb helyi darab memória, így hogy meg lehet nézni, hogy később nem az ugró vagy lóg Ön lejátszása közben. Szóval van egy probléma, bár, mert én mondom scanf, várnak húr a felhasználó. Itt a címét egy darab memóriát. Tedd, hogy a húr van. Miért van az, hogy a kötött adjon mi baj, igaz? Mi ez? Vagyok szabad hozzáférés azt a részét, a memória? Tudod, én nem tudom. Mivel a puffer inicializálása valamit? Nem igazán. És ez az, amit mi már hívás egy szemetes értéket, amely nem formális szót. Ez csak azt jelenti, hogy fogalmunk sincs, mi bitek belül van a négy byte Én felosztása a puffer. Nem hívott malloc. Én biztosan nem hívott getString. Szóval, ki tudja, mi az valójában belső puffer? És mégis azt mondta scanf vakon, ott és tedd, amit a felhasználó beírt. Tehát mi okozhat a kódunk, ha elindul? Valószínűleg segfault. Talán nem, de valószínűleg a segfault. És azt mondom, lehet, hogy nem, mert néha igen, néha nem kap a segfault. Néha egyszerűen csak szerencsés, de ez azonban lesz egy hiba a programban. Hadd megy előre, és lefordításával. Fogom csinálni a régi iskola módon. Így csattanással kötőjel 0, scanf-1, scanf-1.c, Enter. Hoppá, túl öreg iskola. Lássuk. Hol megyek? Ó, char * buffer. Ó, köszönöm - Mentés, OK - nagyon régi iskolában. Rendben, ez már egy ideje. Szóval már csak mentette a fájlt, miután teszi, hogy az ideiglenes változtatni egy perce. És most már össze is kézzel csenget. És most megyek előre és fuss scanf-1, Enter. Karakterlánc kérem. Majd írja be "hello". És most, itt, ahol, őszintén szólva, printf tud egy kicsit bosszantó. Ez valójában nem fog segfault ebben az esetben. Printf egy kicsit különleges, mert ez annyira szuper elterjedt, hogy lényegében printf csinál nekünk egy szívességet, és felismerve, ez nem érvényes pointer. Hadd vegye fel magam, hogy csak nyomtatni out zárójelben null, még bár ez nem feltétlenül, amit mi magunk várható. Tehát nem igazán könnyen váltanak ki segfault ezzel, de egyértelműen ez a nem az a viselkedés, amit akartam. Szóval mi az egyszerű megoldás? Nos, scanf-2, hadd javasoljuk, hogy ahelyett, hogy valójában csak egy kiosztása char *, hadd legyek egy kicsit okosabb a ezt, és hadd osztja puffer mint egy sorozata 16 karakter. Így meg tudom csinálni ezt egy pár módon. Én is teljesen használni malloc. De én vissza a két hétig, amikor Csak kellett egy csomó karakter. Ez csak egy tömb. Hadd inkább újra puffer hogy egy sor 16 karakter. És most, amikor elmegyek puffer - és ez az, amit mi nem beszélni a héten két - de kezelésére tömb bár ez a cím. Technikailag, mint láttuk, ők egy kicsit más. De scanf nem bánja, ha adsz meg a nevét egy sor, mert amit Clang fog tenni nekünk alapvetően kezeli a nevét, hogy a tömb, mint a címe darab 16 bájt. Tehát ez jobb. Ez azt jelenti, most, hogy remélhetőleg tegye a következőket. Hadd kicsinyíteni egy pillanatra, és megcsináljuk scanf-2 összeállított OK. Most hadd ne lett perjel scanf-2. Karakterlánc kérem. "Hello." És ez úgy tűnt, működik ebben az időben. De valaki javasolni a forgatókönyvet amely lehet, hogy nem mindig működik? Igen? Valami hosszabb, mint 16 karakter. És tényleg, mi lehet egy kicsit pontosabb. Valami hosszabb, mint 15 karakter, mert tényleg meg kell szem előtt tartani , amire szükségünk van, hogy a backslash nulla hallgatólagosan a végén a húr, amely félre scanf általában vigyázni számunkra. Hadd ilyesmit - Néha csak hagyja így. OK, így már jelenleg indukált szegmentációs hiba. Miért? Mert gépelt, hogy több mint 15 karakterek, és így most már tényleg megérintette memória, hogy én valóban nem kellett volna. Szóval, ami igazán a megoldás itt? Nos, mi van, ha szükségünk van egy hosszabb szöveg? Nos, lehet, hogy 32 bájt. Nos, mi van, ha ez nem elég hosszú? Mit szólnál 64 byte? Mi van, ha ez nem elég hosszú? Mit szólnál 128 vagy 200 bájt? Ami igazán a megoldás itt a Általános esetben, ha nem tudjuk a előre, amit a felhasználó fog gépelni? Ez csak elég nagy fájdalom a csacsi, hogy őszinte legyek, ezért a CS50 könyvtár néhány tucat sornyi kód együttes végrehajtása GetString karakterláncot úgy, hogy mi nem kell tudni előre, mi a felhasználó fog beírni. Különösen, ha megnézi vissza cs50.c két héttel ezelőtt, akkor megjelenik hogy getString valójában nem scanf nem használhatja ezen a módon. Inkább olvas egy karakter egy időben. Mivel az egyetlen jó dolog olvasás egy karakter tudunk biztosítani magunkat, hogy mindig legalább egy char. Én is csak egy char kijelentem, majd vegye Ezen igazán baba lépéseket csak olvasni egy karakter egy időt a billentyűzeten. És akkor mit fog látni getString tesz, minden alkalommal, amikor elfogy a, mondjuk 16 byte memóriát, használ malloc vagy unokatestvére annak, hogy Több memória másolás a régi memóriát az új, majd a csúszó mentén, szerzés egy karaktert egy időben, és amikor elfogy, hogy a darab memória, dobja el, megragadja egy nagyobb darab memória, másolatok régi új, és megismétli. És ez valóban a fájdalom, hogy ténylegesen végre valami olyan egyszerű, mint kapok be a felhasználó. Így használhatja scanf. Használhatja más hasonló funkciók. És sok a tankönyvek és az online példák, de ezek mind téve a problémák, mint ez. És végül, kapok egy segfault a fajta idegesítő. Ez nem jó, a felhasználó számára. De a legrosszabb esetben, mit alapvetõen tedd kód veszélyeztetett? Valamilyen támadás, esetleg. Beszéltünk egy ilyen támadást - túláradó a verem. De általában, ha szabad túlcsordulás a puffer, mint tettük azt a Néhány héttel ezelőtt, és csak írásban több, mint "hello" a verem, akkor valóban átveszi, potenciálisan a számítógép, vagy legalább kap az adatok nem a tiéd. Tehát röviden, ezért van a képzés kerekek. De most kezd levenni, mint a programok már nem kell, szükségszerűen, adatokat kér a felhasználótól. De abban az esetben a problémát meg hat, A bemenet jön egy hatalmas szótár fájl 150 néhány furcsa ezer szónál. Szóval nem kell aggódni a felhasználó tetszőleges bemenet. Adunk néhány feltételezés az a fájl. Bármilyen kérdése van, vagy mutatók scanf vagy felhasználói általában? Rendben, egy gyors pillantást, majd egy záró témát két héttel ezelőtt. És ez volt ez a fogalom a struct. Nem mintha - ezt a fogalmat a struct, ami volt? Mit struct tenni értünk? Határozza meg - Tessék? Határozza meg a változó típusát. Tehát egyfajta. Mi tulajdonképpen ötvözi két témát. Tehát typedef, emlékeztetni arra, hogy mi is kijelentik egyfajta saját, mint a szinonimája, mint a karakterlánc char *. De a typedef struct és, mi is létre igazán saját adatszerkezeteket. Például, ha visszamegyek a gedit itt egy pillanatra, és megy előre is valami hasonlót, hadd mentse ezt, mondjuk, structs.c átmenetileg, Elmegyek , hogy menjen előre, és egy olyan standardio.h, int main semmis. És akkor itt, tegyük fel, hogy azt akarom, írni egy programot, amely tárolja több diák több házak, például. Szóval, ez olyan, mint egy registrarial adatbázis valamilyen. Tehát, ha szüksége van a név az egyik diák, én lehet csinálni valamit, mint char * name, és én ilyesmit - valójában, vegyünk a CS50 könyvtár csak egy pillanatra, hogy ez a kicsit egyszerűbb, így kölcsönözhetnek a több tucat sornyi kódot. És nézzük csak tartsa egyszerű. Majd tartsa string, és most getString. Tehát azt állítom, most, hogy már tárolt a nevét néhány diák, és a ház a Néhány diák, csak a változó mint mi, és az első héten. De tegyük fel, most szeretnék támogatni több diák. Rendben, én ösztönök kell tennünk karakterlánc name2, kap getString, string house2 lesz getString. És akkor a harmadik diák, lássuk név3 getString. Rendben, ez remélhetőleg feltűnő Ön, mint a fajta ostoba, mert ez a folyamat valóban nem lesz a vége, és ez csak úgy hogy a kód a valósnál és ami még rosszabb és rosszabb lesz. De ezt is megoldotta a héten kettő. Milyen volt a viszonylag tiszta megoldás amikor már több változó a Ugyanezeket az adatokat típus, mind összefügg egymással, de mi nem akarjuk, hogy ez szörnyű rendetlenség A hasonló nevű változó? Mit csinálunk helyette? Szóval azt hiszem, hallottam egy pár helyen. Volt egy tömb. Ha azt szeretné, több példányban valamit, miért nem tiszta ez az egész , és csak azt mondom, hogy nekem nevű tömböt neveket? És most, most kemény 3-as kód. Aztán adj még egy tömb hívott házak, és hagyd, hogy a most nehéz 3-as kód. És én már masszívan kitakarította a rendetlenség, hogy én csak teremtett. Nos, én még mindig nehéz kódolású 3, de még a 3 is dinamikusan jönnek a felhasználó vagy argv, vagy hasonlók. Szóval ez már tisztább. De mi bosszantó ez, hogy Most, bár a név valahogy alapvetően a egy diák háza - ez egy diák, hogy igazán szeretné, hogy képviselje - Most már két tömböt, amely párhuzamos abban az értelemben, hogy ők a azonos méretű, és neveket konzol 0 feltehetően térképek házak konzol 0, és neveket konzol 1 térképek a házak konzol 1. Más szóval, hogy a diák él hogy a ház, és hogy más diák lakik a másik házban. De biztosan ez lehet tenni, még tisztábban. Nos, lehet, sőt. És hadd menjen előre, és nyitott fel structs.h, és akkor látja ezt az ötletet itt. Figyeljük meg, hogy én is használtam typedef, ahogy utalt az imént, hogy állapítsa meg a saját adattípus. De én is ezzel a másik kulcsszó nevezett struktúra, ami nekem egy új adatstruktúra. És ez adatstruktúra azt állítják megy hogy a két dolog belsejében ez - egy string nevű nevet, és egy string nevű házat. És a neve fogok adni ez az adat struktúra megy hogy hívják diák. Nevezhetném, amit csak akarok, de szemantikailag teszi értelme számomra a fejemben. Tehát most, ha nyit egy jobb változat A program elkezdtem írni ott, hadd lépjünk a csúcsra. És van néhány sornyi kódot itt, de hadd összpontosítani a a pillanatban az egyik. Már kijelentette, állandó úgynevezett diák és kemény kódolású 3 most. De most, észre, hogy tiszta a kód kezd kap. A vonal 22, kijelentem tömb diákok. És észre, hogy a diákok látszólag most egy adattípust. Mivel a tetején ezt a fájlt, észre Én már bele, hogy header fájlt hogy húztam fel, csak egy perce. És header fájlt egyszerűen volt Ez a meghatározás egy diák. Tehát most, amit létre saját egyéni adatok írja, hogy a szerzők a C év ezelőtt nem gondol előre. De nem gond. Én lehet, hogy én magam. Tehát ez egy tömb nevű diákok, Minden amelynek tagjai egy diák struktúrát. És azt akarom, a három említett a tömbben. És most mi a többit a program nem? Kellett valami, egy kicsit önkényes. Így az online 24-től, Azt hajtogat 0-3. Én majd felkéri a felhasználót a a hallgató nevét. Aztán használjon getString, mint korábban. Aztán kérje a hallgató házába, és tudom használni getString, mint korábban. De vegyük észre - némileg új darab szintaxis - Még mindig index az i-edik diák, de hogyan jutok el a konkrét adatok területén belül a struktúra? Nos, mi úgy tűnik, a új darab szintaxis? Ez csak a pont operátor. Már nem igazán láttam ilyet. Láttad azt a Pset öt, ha már lebukott a már a bitmap kép. De a dot csak azt jelenti, belül a struct vagy több területen, hogy pont név, vagy adj dot házat. Ez azt jelenti, menj be a struct és kap az egyes területeken. Mit jelent a többi a program nem? Ez még nem minden, hogy szexi. Figyeljük meg, hogy én hajtogat 0-3 ismét és hozzon létre egy angol kifejezés, mint olyan, és így az ilyen, és egy ilyen ház, átadva dot nevét Az i-edik diák és ház is. És akkor végül, most kezdjük, hogy anális erről, most, hogy tisztában azzal, mi malloc és egyéb funkciókat mindezt alkalommal. Miért kell szabadítani a két név és a ház, bár én Nem hívja malloc? GetString volt. És ez volt a piszkos kis titka néhány hét, de van getString már szivárog memória az egész hely minden félévben eddig. És valgrand majd végül mutatják ezt velünk. De ez nem egy nagy dolog, mert tudom, , hogy én is csak szabad a nevét és a ház, hiába, hogy szuper, szuper biztonságos, azt kell csinál valami hiba ellenőrzés itt. Mi az ösztöneid mondom? Mire kell hogy ellenőrzik mielőtt szabad, ami a string, amely más néven a char *? Én tényleg ellenőrzik, ha a diákok konzol i pont neve nem egyenlő null. Akkor lesz baj, hogy menjen előre és ingyenes hogy a mutató, és azonos vagy más egy is. Ha a tanulók konzol i dot ház nem egyenlő null, ezt most megvédi szemben a sarokban ügyben, amelyben GetString visszatér valami ilyesmi null. És láttunk egy perce printf majd megvédeni minket itt csak azt null, ami fog nézni furcsa. De legalább nem fog segfault, mint láttuk. Nos, hadd tegye egy másik dolog itt. Struktúrák-0 egyfajta ostoba programot mert én meg ezeket az adatokat, majd a ez elveszett, ha a program véget ér. De hadd menjek előre, és erre a célra. Engedjék meg, hogy a terminál ablak egy kicsit nagyobb. Engedjék meg, hogy struktúrákat-1, amely egy új változata a. Én nagyítani egy kicsit. És most hadd futni dot slash Struktúrák-1. Student neve - David Mather, csináljuk Rob Kirkland, lássuk Lauren Leverett. Milyen érdekes most felhívás - és én csak azt tudom, mert Én írtam a programot - van egy kép most a jelenlegi elnevezésű könyvtárat students.csv. Néhányan lehet, hogy láttam ezeket a valós világban. Mi az a CSV fájlt? Vesszővel elválasztott értékek. Ez a fajta, mint a szegény ember verziója egy Excel fájl. Ez egy tábla a sorok és oszlopok meg tudja nyitni a programot, mint az Excel, vagy számok egy Mac. És ha kinyitom ezt a fájlt itt gedit, felhívás - a számok nincsenek ott. Ez csak gedit mondja nekem sorszámok. Figyeljük meg az első sorban a fájl David és Mather. A következő sor Rob vessző Kirkland. A harmadik vonal Lauren vessző Leverett. Szóval, mit hoztam létre? Már most írt egy C program hatékonyan tud generálni táblázatok meg lehet nyitni a program, mint például az Excel. Nem olyan vonzó egy adathalmaz, de ha sokkal nagyobb darabokat adatokat, amit valóban szeretne manipulálni, és grafikonok, valamint a tetszik, ez talán az egyik módja, hogy az adatok. Sőt, CSVs valóban szuper gyakori csak tárolására egyszerű adat - Yahoo Finance, például, ha kap tőzsdei keresztül az úgynevezett API, az ingyenes szolgáltatás, amely lehetővé teszi, hogy kap a jelenlegi up-to-the-date állomány idézi a cégek, adja az adatokat vissza a szuper egyszerű CSV formátumban. Szóval hogyan tesszük ezt? Hát észre, a legtöbb a program majdnem ugyanaz. De észre itt, ahelyett, print A diákok ki, on line 35 tovább, azt állítom, hogy én vagyok a megtakarítás diákok a lemezre, így a mentés egy fájlba. Így észre én nyilvánított FILE * - Most, ez a fajta anomália a C Bármilyen okból, FILE minden sapkák, ami nem olyan, mint a legtöbb más adattípusok C-ben, de ez a beépített adattípus, FILE *. És én nyilvánított mutató egy fájlba, az, hogy hogyan lehet gondolni, hogy az. fopen: nyitott fájlt. Milyen fájlt akarsz megnyitni? Szeretnék nyitni egy fájlt, amit majd önkényesen hívás students.csv. Tudtam hívni, hogy amit csak akarok. És akkor egy tipp. Mit jelent a második argumentum az fopen valószínűleg azt jelenti? Jobb, w az írás, lehetne lesz r olvasni. Van egy hozzáfűzés, ha hozzáadni kívánt sorokat, és nem felülírja az egészet. De én csak azt szeretném, hogy létrehozza ezt a fájlt egyszer, úgyhogy használni quote unquote w. És tudom, hogy csak olvastam a dokumentáció, vagy a man oldalt. Ha a fájl nem null - más szóval, ha semmi baj nincs - hadd hatunk végig tanulók 0-3. És most észre, hogy van valami alig észrevehetően eltérő a line 41 itt. Ez nem printf. Ez fprintf a fájlok printf. Így fog írni a fájlba. Melyik fájlt? Akinek mutató megadott az első érv. Aztán meg a format string. Aztán meg, hogy milyen szöveg akarunk csatlakoztassa az első százalékos s, és majd egy másik változót vagy a második százalék s. Ezután zárjuk a fájlt fclose. Mint én szabad a memória, mint korábban, de Menjek vissza, és adjunk hozzá Néhány ellenőrzi null. És ennyi. fopen, fprintf, fclose ad nekem képes létrehozni szöveges fájlokat. Most, akkor látni probléma meg öt, amely magában foglalja a képeket, akkor használja bináris fájlok helyett. De alapvetően az ötlet ugyanaz, még akkor is, ha a funkció azt is megtudhatod hogy egy kicsit más. Tehát forgószél túra, de akkor kap is ismeri fájl I/O-- be-és kimenet - a Pset öt. És bármilyen kérdése van az kezdeti alapokat itt? Igen? Mi van, ha megpróbálja kiszabadítani a null érték? Azt hiszem, hacsak nem szabad ütött kicsit több felhasználóbarát, akkor potenciálisan segfault. Halad null rossz, mert nem hisz szabadon zavar, hogy ellenőrizze az Ön számára, mivel ez potenciálisan a hulladék Az idő, hogy ezt maga a mindenki a világon. Jó kérdés, mégis. Rendben, így ez a fajta lesz minket egy érdekes téma. A téma a probléma meg Ötös kriminalisztika. Legalábbis ez a része a megoldásokat. Törvényszéki általában utal, hogy a helyreállítási információ, hogy lehet, Lehet, hogy nem törölték szándékosan. És azt gondoltam, hogy egy gyors ízelítőt, hogy mi is történik valójában az összes ezúttal alatt Hood a számítógép. Például, ha van benne a laptop vagy az asztali számítógépen a merevlemez, ez akár egy mechanikus eszköz, amely valóban forog - ott kerek dolgokat az úgynevezett tálak úgy néz nagyon tetszik, amit most volt a képernyőn van, mégis ez inkább a régi iskolában. Ez egy három-és egy-fél hüvelyk merevlemez. És három és fél hüvelyk utal a az a dolog, ha telepíti egy számítógép. Sokan közületek srácok a laptopok már van szilárdtest-meghajtók és SSD, amelyek nem tartalmaz mozgó alkatrészeket. Ők inkább RAM-ot és kevesebb, mint a ezek a mechanikus eszközök. De az ötlet még mindig ugyanaz, Természetesen, mint azok a probléma meg öt. És ha úgy gondolja, van most egy merevlemezt jelenti, hogy egy kör, amely Én felhívni így itt. Amikor létrehoz egy fájlt a számítógépen, hogy ez egy SSD, vagy Ebben az esetben egy régebbi iskola merevlemez, ez a fájl tartalmazza több bit. Tegyük fel, hogy ez a 0 és 1, egy csomó 0s és 1s. Szóval ez az egész merevlemezt. Ez nyilvánvalóan egy nagyon nagy fájlt. És ez a fel a 0s és 1s abban része a fizikai tál. Nos, mi az, hogy a fizikai része? Nos, kiderült, hogy a merevlemezen, legalább egy ilyen típusú, van ezek az apró kis mágneses részecskéket. És lényegében az Északi-és a déli pólus nekik, hogy ha viszont egy ilyen mágneses részecskék Ily módon, ha azt mondják, hogy ez ami 1. És ha ez fejjel lefelé délre észak, lehet mondani, hogy ez ami 0-ra. Így a valós fizikai világban, ez hogyan jelenthet valamit bináris állapotot a 0 és a 1. Szóval ez az egész egy fájl. Van egy csomó mágneses részecskék, amelyek az így vagy Ily módon, ami minták A 0s és 1s. De kiderül, amikor elment egy fájlt, néhány információt tárolja külön. Tehát ez egy kis asztal, a könyvtár, hogy úgy mondjam. És én hívom az oszlop nevét, Hívom ezt az oszlopot helyre. És azt fogom mondani, feltételezni ez az én folytatódik. My resume.doc tárolja a helyre, mondjuk 123. Én mindig megy ez a szám. De elég annyit mondani, hogy csakúgy, mint a RAM-ban, akkor egy merevlemez ez egy gigabyte vagy 200 GB vagy egy terabájt, és akkor száma az összes bájt. Lehet szám Minden darabokat 8 bit. Ezért mondom, hogy ez a Van hely 123. Tehát ez a könyvtár belsejében az operációs rendszer megjegyzi, hogy a önéletrajz a következő helyen: 123.. De ez lesz érdekes, ha töröl egy fájlt. Így például - és szerencsére, a legtöbb a világ fogott erre -, hogy mi történik, ha húzza a fájlt a Mac OS Kuka , vagy a Windows Recycle Bin? Mi a célja ennek, hogy? Ez nyilvánvalóan, hogy megszabaduljon a fájlt, de mit jelent a cselekmény fogd és csökken be a szemetet, vagy a Recycle Bin csinál a számítógépen? Abszolút semmi, tényleg. Olyan ez, mint egy mappát. Ez egy különleges mappa, az biztos. De vajon ez tényleg törli a fájlt? Nos, nem, mert néhányan talán volt, mint, ó fenébe, hogy nem azt jelenti, hogy ezt tegyük. Szóval kattintson duplán a Trash, vagy Lomtár. Már kidugta a környéken, és már vissza A fájl csak húzással onnan. Tehát egyértelműen, ez nem feltétlenül törli azt. OK, te okosabb. Tudod, hogy csak húzza be a Trash, vagy Lomtár nem jelenti azt, akkor ürítse ki a szemetet. Szóval menj fel a menüt, és azt mondod Empty Trash vagy Lomtár ürítése. Akkor mi lesz? Igen, ezért törlésre inkább. De minden, ami történik ez. A számítógép elfelejti, hol resume.doc volt. De mi nem változott látszólag a képen? A bitek a 0s és 1s, hogy állítják, A helyszínen néhány fizikai szempontból a hardver. Ők mindig ott vannak. Ez csak a számítógép elfelejtette, mik azok. Szóval ez lényegében felszabadította a fájl bit úgy, hogy újra fel lehet használni. De amíg még több kép, és fájlokat, és a több fájl lesz valószínűségi azok 0s és 1s, a mágneses részecskéket, kap újra, fejjel vagy jobb oldalon felfelé, a egyéb fájlokat, 0s és 1s. Szóval van ez az ablak az idő. És ez nem a kiszámítható hosszú, de tényleg. Ez attól függ, mekkora a merevlemez meghajtót, és hogy hány kép van, és milyen gyorsan újakat. De ez idő-ablak alatt amely a fájl még mindig tökéletesen hasznosítható. Tehát, ha valaha is használni programok, mint a McAfee vagy Norton hogy megpróbálja visszaállítani adatokat, az összes csinálnak próbál vissza az úgynevezett könyvtár kitalálni, ahol a fájl volt. És néha Norton és azt mondja, fájl 93%-ban újrahasznosítható. Nos, mit jelent ez? Ez csak azt jelenti, hogy az egyéb fájl véletlenül végül a, mondjuk, ezeket a biteket ki az eredeti fájl. Tehát mi tulajdonképpen szó visszaszerzés adat? Nos, ha nincs valami hasonló Norton előre telepítve a számítógépre, A legjobb, amit tehetünk, néha meg A teljes merevlemezt keresnek minták bit. És az egyik témája a probléma meg öt az, hogy megkeresi a felel meg a merevlemez, a törvényszéki kép egy compact flash kártya a digitális fényképezőgép, keresi a 0s 1s és jellemzően, mivel nagy valószínűség képviselik kezdete egy JPEG képet. És ti is vissza a képek feltételezve, ha látom, ezt a mintát a bit a törvényszéki képet, nagy a valószínűsége, hogy a védjegyek kezdetét a JPEG. És ha látom ugyanazt a mintát újra, hogy valószínűleg kezdetét a másik JPEG, és egy másik JPEG, JPEG és egy másik. És ez tipikusan milyen adat visszaszerzés fog működni. Mi a jó a JPEG még ha A fájlformátum is némileg komplex, az elején minden olyan fájl valójában meglehetősen azonosítható és egyszerű, mint látni fogjuk, ha már nem tette meg. Szóval vessünk egy közelebbi pillantást alatt a motorháztetőt, hogy pontosan mi volt folyik, és amit ezek a 0-ák és 1-esek van, hogy egy kicsit több a összefüggésben ez különösen nagy kihívást jelent. [VIDEÓ LEJÁTSZÁS] -Ahol a számítógép tárolja a legtöbb Az állandó adatokat. Ehhez az adatok utazik RAM valamint a szoftver, azt jelzi, hogy elmondja a merevlemez, hogyan kell tárolni az adatokat. A merevlemez áramkörök fordítás ezeket a jeleket a feszültség ingadozások. Ezek viszont ellenőrzik a merevlemez mozgó alkatrészek, néhány a néhány mozgó alkatrészek maradt a modern számítógép. Egyes jelek vezérlésére motor amely forog fémmel bevont tálak. Az adatok ténylegesen tárolt ezeken a tálak. Más jelek mozgassa az írási / olvasási fejek olvasni, vagy írni az adatokat a tálak. Ez a gép olyan pontosak, hogy az emberi haj nem is adja át az fej és forgó tálak. Mégis, minden működik félelmetes sebességgel. [END VIDEÓ LEJÁTSZÁS] DAVID MALAN: Nagyítás egy kicsit mélyebb most mi van valójában a tálak. [VIDEÓ LEJÁTSZÁS] -Nézzük meg, amit most látott lassított. Ha a rövid impulzus villamos küldött az író / olvasó fej, ha fejtetőre egy kis elektromágneses számára egy töredéke a második. A mágnes létrehoz egy mezőt, amely megváltoztatja a polaritását egy apró, pici részét a fém részecskék, amelyek kabát minden tál felület. A minta sorozat ezen apró, feltöltött területek a lemezen jelentése egy egyetlen bit adatokat a bináris szám rendszer által használt számítógépek. Most, ha a jelenlegi küldi egyik módja keresztül az író / olvasó fej, a terület polarizált az egyik irányba. Ha az aktuális kerül elküldésre ellenkező irányba, a polarizáció megfordul. Hogy kap az adatok le a merevlemezt? Csak visszafordítani a folyamatot. Így a részecskék a lemezen hogy mindig a legfrissebb, a író / olvasó fej mozog. Össze millió ilyen mágnesezett szegmensek és van egy fájl. Most, a darab egyetlen fájl szétszórva az egész egy meghajtó tálak, olyan, mint a rendetlenség A papírok az asztalon. Tehát egy speciális extra fájlt nyilvántartja Az hol van. Nem szeretném, ha volna valami ilyesmi? [END VIDEÓ LEJÁTSZÁS] DAVID MALAN: OK, talán nem. Szóval hány a srácok nőtt fel ezeket? OK, így egyre kevesebb kezet minden évben. De örülök, hogy te legalább ismerős velük, mert ez és a saját könyv demo sajnos halnak nagyon lassú halál itt közismertek. De ez az, amit én, legalábbis, vissza középiskolában, használt felhasználás mentést. És csodálatos volt, mert lehet tárolni 1.4 megabájt on az adott lemezt. És ez volt a nagy sűrűségű verzió, ahogy azt a HD, amely ami azt jelenti, mielőtt a mai HD videók. Szabványos sűrűség 800 kilobyte. És előtte voltak 400 kilobájtos lemezek. És előtte voltak 5 és 1/4 os lemezek, amelyek igazán floppy, és egy kicsit szélesebb és magasabb mint ezek a dolgok itt. De valóban látni az úgynevezett floppy szempontból ezeket a lemezeket. És funkcionálisan, ők valójában nagyon hasonló a merevlemezek az at legalábbis ez a fajta. Ismét SSD újabb számítógépek a munka egy kicsit másképp. De ha mozog a kis fém fület, akkor valóban látni egy kicsit süti, vagy tál. Nem fémből, mint ez. Ez valójában néhány olcsóbb műanyag. És akkor milyen kígyózik is. És te kurva, csak letörölni néhány bitek száma vagy mágneses részecskék az ezen a lemezen. Így szerencsére, nincs rajta semmi. Ha ez dolog az úton -, és fedjük a szemét, és azok a szomszéd - akkor csak ilyen húzni ezt az egész hüvely ki, mint ezt. De van egy kis tavaszi, ezért Tudatában a szemed. Tehát most már tényleg egy floppy lemezen. És mi figyelemre méltó ebben az, hogy, amennyire csak ez egy kis léptékű ábrázolása egy nagyobb merevlemez, ezek a dolgok szuper, szuper egyszerű. Ha csipetnyi alján, most, hogy az hogy a fém dolog nem stimmel, és húzza őket nyitva, ami van két darab nemez és az úgynevezett floppy disk egy darab fém a belseje. És ott megy a fele a lemez tartalmát. Ott megy egy másik fele. De ez minden, ami forgott benne a számítógép a múlt. És ismét, hogy ezt a szempontból, mekkora a legtöbb merevlemezek manapság? 500 GB, a terabájt, talán egy asztali számítógép, 2 terabájt, 3 terabájt, 4 terabájt, igaz? Ez egy megabájt, ide vagy oda, ami nem is illik a tipikus MP3 már ezekben a napokban, vagy valamilyen hasonló zenei fájlt. Így egy kis emlék ma, és is, hogy segítsen kontextusba milyen fogunk vesz biztosra most probléma meg öt. Tehát azok a tiéd tartani. Hadd átmenet, ahol lesz kiadások a következő Pset is. Tehát már most meg ezt az oldalt, - ó, pár bejelentések gyorsan. Ezen a pénteken, ha szeretne csatlakozni CS50 ebédre, megy a szokásos helyen, cs50.net/rsvp. És a projekt végső - így egy a tananyag, már írt a végleges projekt specifikáció már. Ismerd fel, hogy ez nem jelenti azt, ez miatt különösen hamarosan. Ez írt, tényleg, csak azért, hogy srácok rágondolok. És valóban, a szuper jelentős százalékos lesz leküzdése végső projektek anyagot, hogy nem is ütött, hogy az osztályban, de már a jövő héten. Közlemény azonban, hogy a spec kéri néhány különböző összetevői végleges projekt. Az első néhány hét, egy pre-javaslat egy szép alkalmi e-mail A TF elmondani neki, vagy mi te gondolkodtam a projekt, és Nem elkötelezettség. Javaslat lesz az adott elkötelezettség, mondván, itt, ez az, amit Szeretnék csinálni a projektet. Mit gondolsz? Túl nagy? Túl kicsi? Ez kezelhető? És látod a spec a részletekért. Pár héttel azután, hogy az az állapot, jelentést, amely egy hasonlóan alkalmi e-mail a TF mondani, hogy milyen messze van a végső projekt megvalósítása, majd a A CS50 Hackathon melyet mindenki felkérést kap, ami lehet egy esemény 20:00 egy este 07:00-ig AM másnap reggel. Pizza, ahogy én is említettem a héten nulla, wil szolgálnak fel 09:00, Kínai étel 01:00. És ha még mindig ébren 5:00, akkor elviszi IHOP reggelire. Tehát az egyik Hackathon annál élmények az osztályban. Akkor a végrehajtás miatt, és akkor az éghajlati CS50 Vásár. További részletek az összes ilyen az elkövetkező hetekben. De térjünk vissza valamit old school - ismét egy tömb. Így egy sor jó volt, mert megoldja probléma, mint láttuk, csak egy pillanattal ezelőtt a diákok struktúrák Kicsit ki a kezéből, ha szeretné, hogy a hallgató egy, két diák, diák három diák dot dot dot, néhány tetszőleges számú diák. Tehát tömbök, néhány héttel ezelőtt, lecsapott a és megoldani minden problémánk, hogy nem tudván előre, hogy sok mindent bizonyos típusú is érdemes. És láttam, hogy a struktúrákat segíthet tovább szervezzük kódot, és folyamatosan fogalmilag hasonló tulajdonságokkal, mint például a nevét és a ház, valamint, hogy mi kezelni őket, mint egy szervezet, belső amelynek vannak kisebb darabokra. De tömbök van néhány hátránya. Melyek azok a hátrányok már találkozott A tömbök eddig? Mi ez? Rögzített méret - így annak ellenére, hogy lehet, hogy képes a memóriát egy tömb, ha tudja, hogy hány diák van, hogy hány karakter van a felhasználó, ha egyszer már kiutalt a tömb, amit a fajta festett magát egy sarokban. Mert nem lehet be új elemeket a közepén egy tömb. Nem lehet beszúrni több elemet végén egy tömb. Tényleg, kénytelenek létrehozása teljesen új tömb, ahogy már említettük, másolás a régi az új. És ismét, ez a fejfájás, GetString foglalkozik az Ön számára. De ismétlem, ha nem is be valamit a közepén a tömb ha az arány nem teljesen töltve. Például, ha ez a tömb mérete itt hat csak öt dolog benne, Nos, akkor most tack valamit rá a végén. De mi van, ha szeretnénk beszúrni valamit a közepén a tömb, bár lehet, hogy öt a hatból, ami benne van? Nos, mit teszünk, ha már az összes Az emberi önkéntesek színpadon hét múlt? Ha akartuk, hogy itt valaki, vagy ezek az emberek, hogyan kell mozogni a módon, vagy ezek az emberek, hogyan kell mozogni a megtervezésében, és vált drága. A változó az emberek belsejében egy array végül összeadjuk és költségszámítás nekünk időt, ezért sok a mi n négyzetes futó időkben behelyezés sort, a Például, a legrosszabb esetben. Tehát tömbök nagy, de van, hogy előre tudni, hogy milyen nagy szeretné őket. Tehát OK, itt a megoldás. Ha nem tudja előre, hogy hány diákok Talán van, és tudom, hogy egyszer Döntök, bár én megragadt, hogy az sok diák, miért nem én csak mindig osztják kétszer annyi helyet mint én is hiszem, szükségem van? Ez nem a megfelelő megoldás? Reálisan, nem hiszem, hogy mi vagyunk lesz szükség több mint 50 hely A tömb egy közepes méretű osztály, úgyhogy csak felhajt. Csinálok 100 nyílások a tömbben, csak azért, hogy nem feltétlenül kap a hallgatók száma elvárom, hogy hogy néhány közepes méretű osztályban. Akkor miért nem csak a kerek, és osztja több memória, jellemzően egy tömb mint azt gondolja, talán még szükség? Mi ez az egyszerű pushback hogy ezt az ötletet? Te csak pazarlás memória. Szó szerint minden programot írsz, akkor A talán a kétszer annyi memóriát valóban szükség van. És ez csak nem úgy, mint egy különösen elegáns megoldás. Sőt, ez csak csökkenti a valószínűsége, hogy a probléma. Ha véletlenül van egy népszerű kurzus egy szemeszter, és van 101 diákok, a program továbbra is alapvetően szembe ugyanezzel a kérdéssel. Így szerencsére, van egy megoldás, hogy ez ad minden problémát formában adatstruktúrák, amelyek bonyolultabb, mint azok, láttunk eddig. Ez, azt állítják, a láncolt lista. Ez a lista a szám - 9., 17., 22., 26., és 34. - , amelyek kapcsolódnak egymáshoz útján Az, amit én készült a nyíl. Más szóval, ha azt akartam, hogy képviselje egy sor, nem tudtam csinálni valami ilyesmi. És teszem ezt a felső csak egy pillanat. Tudtam csinálni - hello, rendben. Készenlét. Új számítógép itt, tiszta - Rendben van. Tehát, ha már ezek a számok tömb - 9., 17., 22., 26., 24 - nem feltétlenül arányos. Rendben, itt van a sor - oh my god. Rendben, itt van a tömb. Ó, Istenem. [Nevetés] DAVID MALAN: mintha. Ez túl sok erőfeszítést, hogy menjen vissza és rögzíteni, hogy, így - 26.. Tehát itt van ez a sor 9., 17., 22., 26., és 34.. Azoknak, láthatjuk a kínos hiba, amit most tett, ott van. Szóval azt állítják, hogy ez a nagyon hatékony megoldás. Már kiosztott annyi ints mint Szükségem van - egy, kettő, három, négy, öt, vagy hat - és én majd tárolja a számokat belül a tömb. De tegyük fel, akkor azt a beszúrni kívánt érték, mint a 8-as szám? Nos, hova megy? Tegyük fel, hogy szeretné szúrni több, mint 20. Nos, hova megy? Valahol a közepén, vagy a szám 35 mennie kell valahol a végén. De én vagyok a hely. És így ez egy alapvető kihívás A tömbök ez a megoldás. Azt állította, egy perce, getString megoldja ezt a problémát. Ha szeretné szúrni a hatodik számot ebbe a tömb, ami legalább egy megoldás is esik vissza, az biztos, , mint mi a getString? Mi ez? Nos, hogy a nagyobb, könnyebb mondani, mint megtenni. Nem feltétlenül, hogy a tömb nagyobb, de mit tehetünk? Készíts egy új tömböt, ami nagyobb, mérete 6, esetleg 10-es méret, ha akarjuk hogy előre a dolgok, majd másolja A régi az új tömb, majd szabad a régi tömb. De mi a működési idő Most, hogy a folyamat? Ez elég nagy O n, mivel a másolás fog kerülni néhány egység idő, így nem annyira ideális, ha kell hozzárendel egy új tömböt, ami megy fogyasztani kétszer annyi memória átmenetileg. Másolás régi új - Úgy értem, ez csak egy fejfájás, amely az, hogy ismét, hogy miért írtam GetString az Ön számára. Szóval mit is csinálunk helyette? Nos, mi van, ha az adatstruktúra valójában hiányosságok benne? Tegyük fel, hogy én pihenni a cél, amelyek összefüggő darabokban a memóriát, ahol a 9 közvetlen közelében 17, ami közvetlenül a 22, és így tovább. És tegyük fel, hogy lehet több mint 9 itt RAM, és 17 is itt a RAM, és 22 is itt a RAM-ban. Más szóval, nem kell őket még vissza vissza többé. Csak meg kell valahogy menet a tűt egyes rendszereken keresztül ezeket a számokat, vagy az egyes Ezen csomópontok, hívjuk a téglalapok ahogy már készült őket, hogy emlékszem, hogyan lehet eljutni az utolsó az ilyen csomópont az első. Tehát mi a programozási konstrukció láttuk egészen a közelmúltban, amit végre, hogy a menet, vagy húzott itt, amit lehet végre a nyilak? Tehát mutatók, igaz? Ha osztja nem csak egy int, de a csomópont - és node, most értem tartályba. És vizuálisan, úgy értem egy téglalapot. Tehát egy csomópont nyilvánvalóan szüksége van tartalmaz két érték - Az int is, és aztán, jelentette az alsó felét a téglalap, elegendő hely egy int. Tehát csak előre gondolkodás itt, milyen nagy ez a csomópont, a konténer-e? Hány byte az int? Feltehetően 4, ha ez ugyanaz, mint a szokásos. És akkor, hogy hány bájt a mutató? 4.. Szóval ez a tartály, vagy a csomópont, az lesz egy 8 bájtos struktúra. Ja, és ez egy szerencsés egybeesés, hogy Mi csak be ezt a fogalmat a egy struct vagy C struktúrát. Tehát azt állítom, hogy szeretnék, hogy egy lépést felé a kifinomultabb végrehajtása számok listája, a láncolt lista a számok, azt kell tennie, kicsit több gondolkodás elöl és Kijelentem, nem csak egy int, de a struktúra hogy fogom hívni, hagyományosan Itt, csomópont. Nevezhetnénk, amit csak akarunk, de csomópont lesz a sok tematikus A dolog, amit kezdeni most. Belül, hogy a csomópont egy int n. És akkor ez a szintaxis, egy kicsit furcsa első ránézésre - struct node * mellett. Nos képszerűen, mi ez? Ez az alsó fele A téglalap láttunk csak egy perce. De miért is mondok struct node * szemben a csak node *? Mert ha ez mutató mutat egy másik node, ez csak a Egy csomópont címét. Ez egyezik azzal, amit tárgyalt a mutatók eddig. De miért, ha azt állítom, ez a struktúra néven csomópont, akkor azt kell mondanom, struktúra node idebent? Pontosan. Ez egyfajta ostoba valóság a C. A typedef, hogy úgy mondjam, még nem történt meg. C szuper szó. Így hangzik a kódot felső lefelé, balról jobbra. És addig, amíg eléri, hogy a pontosvessző lényeg, tudod mit nem léteznek adattípus? Node, idézet idézet vége csomópont. Hanem azért, mert a nagyobb bőbeszédű nyilatkozat Én az első sorban - typedef struct csomópont - mert ez volt előbb, mielőtt a zárójelek, ez a fajta, mint pre-nevelése csenget, te Tudod mit, adj egy struct nevű struct csomópont. Őszintén szólva, én nem szeretem a dolgokat hív struct csomópont, csomópont struktúra minden az egész az én kódot. De én csak akkor használja, egyszer csak belül, így tudok hatékonyan létrehoz egyfajta körkörös hivatkozást, nem a mutató magamnak önmagában, hanem a mutató másik azonos típusú. Így kiderül, hogy egy adatstruktúra mint ez, van egy pár műveleteket lehet érdekes számunkra. Talán szeretné szúrni egy lista, mint ez. Azt érdemes törölni Egy ilyen lista. Azt érdemes keresni a listát a érték, vagy általánosabban, áthalad. És áthalad csak egy divatos módon mondván, kezdődik a bal és helyezze át az összes az utat a jobb. És vegyük észre, még ezzel a valamivel több kifinomult adatstruktúra, legyen én javaslom, hogy lehet kölcsönözni néhány az ötleteket az elmúlt két hétben, és végre egy funkciót nevű keresés, mint ez. Ez lesz igaz értéket ad vissza, vagy hamis, jelezve, igen vagy nem, n értéke a listában. A második érv a mutató hogy maga a lista, így egy mutató egy csomópont. Minden fogom majd tennie, hogy kijelentik, átmeneti változót. Hívjuk meg PTR megállapodás szerint, a mutató. És rendelje megegyezik a a lista elején. És most észre a while ciklus. Mindaddig, amíg a mutató nem azonos null, megyek, hogy ellenőrizze. Az egérmutató n egyenlő n, amit elfogadott? És egy pillanat - új darab szintaxis. Mi nyíl hirtelen? Igen? Pontosan. Tehát mivel a néhány perccel ezelőtt használt a pont jelölés eléréséhez valamit belsejében egy a struct, ha a változó még nem a struktúra , hanem egy mutató a struct, Szerencsére egy darab szintaxist végül teszi logikus. A nyíl azt jelenti, hogy kövesse a mutatót, mint a mi nyilak általában azt jelenti, képszerűen, és menj a adatmező belül. Tehát nyíl ugyanaz, mint a dot, de akkor használja, ha van egy mutató. Tehát csak bedugni, majd ha az n terület belül a struct nevű mutató egyenlő értéke n, vissza igaz. Ellenkező esetben ez a sor itt - mutató egyenlő mutató a következő. Szóval mi ez csinál, értesítés, ha én vagyok jelenleg mutatott a struct tartalmazó 9 és 9 nem a számot Keresem - hiszem, keresek n értéke 50 - Fogom frissíteni a mutató átmeneti hogy nem pont ebben a csomópont már, de a mutató nyílra, amely megy, hogy nekem itt. Nos, rájöttem, egy forgószél bevezetés. Szerdán, akkor ténylegesen ezt néhány ember és néhány további kód lassabb ütemben. De észre, mi ma már az adatok bonyolultabb struktúrákat, hogy a mi algoritmusok kap a hatékonyabb, amely lesz szükséges a Pset hat, amikor betölteni, ismét az 150000 szavak, de szükség van erre hatékonyan, és ideális esetben, hozzon létre egy program fut, a felhasználók nem lineáris, négyzetes n nem, de állandó idő, az ideális. Találkozunk szerdán. SPEAKER: A következő CS50, David elfelejti alapeset. DAVID MALAN: És ez hogyan küld szöveges üzenetek C. Mi a - [KÜLÖNBÖZŐ szöveges üzenet Értesítési hangok]