ZVOČNIK 1: Hi everyone. Mi se bomo, da bi začeli. Mislim, da ljudje še vedno potekajo biti filtriranja. Ampak v interesu časa, tako da bomo lahko dobili vidva ven na čas, bomo začeli. Torej, dobrodošli na CS50 Kviz 0 pregledu. Za tiste, ki še niso realizirani vendar, imate vprašanje, na sredo. Woo-hoo. Če še niste začeli študira ali še niso ugotovili, da le-ta obstaja še preteklih kvizi in vse informacije o tvoj kviz so na cs50.net/quizzes. Obstaja nekaj zelo dobrih stvari tam, preteklih kvizi od zadnjih 10 let, kot tudi informacije O tem kvizu in teme da bodo pokriti. Torej, začnimo. Torej bi vi spomnite, prvi dan v razredu Davida imel te svetilke na. Torej v bistvu, vse, kar gre pod pokrovom računalnika je narejeno v binarno. Binary pomeni to, kar zveni podobno, je 0 in 1 je. Ima dve vrednosti, ki lahko predstavljal. Torej, tako kot pri prvi dan oddelka ko je David prižgal luč Žarnica za zastopanje na ali 1, naš računalnik razume binarni kot 0 in 1 je, vklopite ali izklopite. Osnove Binary. Vsak kraj je predstavljen v osnovi dva. Tako da boste dodali 2 do 0 do 1 do 2 vso pot navzgor. Za izračun, kaj je tvoj binarni je decimalno, samo sledite tej enačbi Vrsta stvar. Če imate 1 v katerem koli od teh krajev, jo pomnožimo s koli utemeljiti, da je v, to sešteti, in dobiš decimalko. Torej, to je, kako šteješ do 5 v binarno. Tako kot tisto, kar smo počeli na zadnji slide, to je, kako bi jo predstavljata 1 do 5. Podobno, kot ste vi lahko dodate in odštevanje v decimalni ali osnovo 10, ali Res vsaka baza, na dodati in odštevanje v dvojiškem. Točno to, kar bi pričakovali, ko ste dodamo dve up, če je to enako, večjo od 1, nosiš 1, da bo 0, in to je dodatek na ta način, samo kot bi lahko pričakovali z rednim decimalno ali kateri koli drugi lokaciji. Cool. Torej, kot sem že rekel, vse, kar dogaja pod pokrovom našega računalnika poteka v 0 in 1 je, ali binarno. Torej, kako izraziti, na primer, črk ali številk ali znakov? In odgovor na to je ASCII. ASCII je preslikava med znaki ki bi ga običajno vidimo v Angleški jezik, tako kot je, je B, C je, podčrtaj, črtice in kaj takega. In zemljevidi, ki k vrednosti ASCII. ASCII vrednost je le številka, ki lahko razumemo z računalnikom. In ravno tako kot lahko to storite dodajanje in odštevanje s številkami, lahko to storite jih z vrednostmi ASCII. Torej, v tem primeru, kaj bo to izpisal? Ja, samo prostor C space B D. Kje je moja miška iti? Obvestilo lahko določite int na 65 let. In ko tiskate, da z uporabo odstotkov C, bo to razlagamo kot značaj in se bo izpisal A. Podobno lahko razglasi je kot char. In ko ga natisnete z uporabo odstotkov C, bo to razlagamo kot odstotkov D. In tako kot lahko dodate številko, lahko dodate znaki so Vrednosti ASCII, v tem primeru. Torej, malo kazalec za vsakogar. 5, kot niz, ne pravzaprav enaka 5. Torej, kako lahko pretvorite niz 5 na celo število 5? Vse ideje? Ja. Torej, če imamo 5 kot niz, lahko odštejemo 0. In da bomo, da nam 5. In podobno, če imamo 5, celo, dodajajo, da na vrvico 0. In to nam daje niz 5. Cool. Zdaj pa se spomni nazaj na predavanje tista, kjer smo se pogovarjali o algoritmih. Torej, kako dejansko želimo računalnik narediti zanimive stvari? Saj veš, samo dodajanje in odštevanjem številke in tiskanje stvari ni da je razburljivo. Ponavadi želimo naš računalnik v opravljanje neke vrste algoritem. Nekaj ​​malo bolj zapletena kot le navadno aritmetično. Algoritem je samo korak za korakom niz navodil za kako izvesti nekatere task-- tako kot recept. Morda se spomnite, prvi dan razred, kjer je David nam štetje sobo ljudi in koliko ljudi so bili v prostoru. Vi bi se lahko uporabila za štetje enega po enega. 1, 2, 3, 4. V tem primeru, linearni čas algoritem. Vendar je David predstavil algoritem za ste za štetje ljudi v sobi kjer vsakdo vstane, si rekel, da ti Številka na drugo osebo, dodati, da število navzgor, in ena oseba usede. In to ponovite. To je ena vrsta algoritma. Moremo analizirati, kako učinkovito an Algoritem temelji na to je čas delovanja. Ampak bomo govorili malo več o tem kasneje. Torej vsi algoritmi lahko tudi biti napisana v psevdokoda. Psevdokoda je samo angleško kot zapisa za zastopanje programski jezik. Na primer, če smo želeli vprašati uporabnika uganiti mojo najljubšo številko, smo morda psevdokoda kot take. Get a uporabniki uganiti. Če ugibanje pravilno, povej jim oni pravilna, sicer jim povej oni niso pravilne. In psevdokoda je tako zlahka predstavlja idejo ali algoritem. Torej, zdaj bomo morda želeli, da dejansko napisati to v jeziku, ki ga računalnik Morda razumevanje. Torej lahko pišemo našo psevdokoda in razlagajo, da je v izvorni kodi. Do sedaj, je izvorna koda držati do neke sintakse programski jezik. In sedaj, v CS50, ki smo jih uporabljam večinoma c. Torej, to je lahko vir koda za c. Kasneje v letu, boste ponoči prišli v stik z drugimi programskimi jezike, kot so PHP. Ali če se celo druge razrede, vas lahko storite Java, Python ali celo OCML. Toda v našem C programskem jeziku, to je kako bi lahko pišemo izvorno kodo psevdokoda algoritem, ki Pravkar sem opisal prej. Torej, kako je računalnik dejansko razumeti, da je? Kot sem že rekel, je le res razume ničel in enic. Torej, kako to dobiti od vira koda za nekaj, kar je lahko razumel? No, imamo nekaj imenovan prevajalnik. Če se spomnite nazaj v večini vaših psets, ste imeli neke vrste programa napisan v dot c datoteki. In potem bi tip make. Torej, kaj naj počne? Lahko napišete make, ki bo prevedel Program ker someone-- pisali svoj p niz; Verjetno David-- ustvarila make datoteke. In to pove, da bi vedeli, da se vaši prevajalnik, ki se imenuje Jek, da bo nato prevesti svoje izvorne kode, da nasprotuje koda, ki je ničel in enic da računalnik razume. Ampak malo kasneje, bomo šli bolj v globino okoli prevajalniki. Torej spomniti pset 0, where-- ja, Imate vprašanje? OBČINSTVO: [neslišno]? ZVOČNIK 1: Da. Mislim, da so dejansko mora biti na spletu. Ja. OBČINSTVO: Ali je kot [neslišno]? ZVOČNIK 1: Ne. So na cs50.net/quizzes. OBČINSTVO: Slash kvizi, poševnica 2013, poševnica 0 in kliknite skozi kvizi 2013 in kviz 0, pregledajo poglavje diapozitive. ZVOČNIK 1: Ja, tako da, če hočete, da ga potegnite navzgor in poiščemo na vaš lasten računalnik, da je v redu preveč. Ponoviš. OBČINSTVO: [neslišno]. ZVOČNIK 1: Ja, [neslišno] je slamnata spremenljivka. Oh, ja? OBČINSTVO: [neslišno]? SPEAKER 1: No, stavke niso na izpit. Žal mi je, njeno vprašanje je bilo, je bilo stavke na izpitu. In to ni. Torej pset 0, naj bi fantje so vse izvajali nekaj uporabo nič. In smo se naučili nekaj osnovnih programov gradniki uporabljajo praske. Tako da je lahko pogled na nekatere teh gradnikov ki sestavljajo program. Prvi je Boolean izraz. Logične izrazi so tisti, in 0 ali karkoli, kar ima dve možni vrednosti. V tem primeru, resnična ali neresnična, vklopiti ali izklopiti, in ja ali ne. Primer preprosta, zelo preprosta, Program, ki uporablja Boolean izraz tukaj. Torej, da bi za logičnih izrazov za bilo koristno, imamo logičnih operaterjev. To so subjekti, ki se lahko uporabljajo primerjati nekatere vrednote. Torej imamo in ali ni enako, manj od ali enaka, večja ali enako, in manj kot ali večja od. Ampak ti izvajalci niso zelo koristni če smo jih lahko združite v pogoji. Torej bi vi spomnite iz nič in iz vašega str določa, da smo imel pogoje. So v bistvu, kot vilice v logika vašega programa, ki izvaja odvisno ali pogoj je izpolnjen. Tako je eden od pogojev, ki smo jih imeli uporablja večkrat v tem tečaju je če drugega, če je, in drugega ni pogojev. Tukaj je primer, kako lahko uporabite to. Ali kdo ve razliko med samo z izjavami, če vse pot navzdol verzov, če drugega, če, in sicer v kombinaciji? Ja? OBČINSTVO: [neslišno]. ZVOČNIK 1: Točno tako. Torej, če bi imel, če do konca tega Tako, tudi če ta pogoj vrne true, bo še vedno nadaljuje testiranje naslednji dve. Ker je z ostalimi, če je, na drug izjava, če ena vrne true, drugi niso testirali. Vsa vprašanja glede tega? Cool. Torej boste uporabili, če-ostalo od na drug Izjava, če veš, da lahko le eden od teh primerov. Tako bomo vedeli, če je x manjši od 0, je zagotovo ne bo večji od 0. Naslednja, druga gradnik da smo se naučili, so zanke. Imamo tri vrste zank. Za zank, medtem zank, in ne, medtem ko zanke. In na splošno, ko sedite na napisati nekaj, boste morali odločiti, kateri od treh, ki jo želite uporabiti. Torej, kako bomo odločiti, katera? Smo na splošno uporabljajo za zanko, če vemo, kolikokrat želimo Ponovil skozi nekaj ali kolikokrat želimo opraviti nalogo. Mi uporabljamo medtem ko zanke, če bomo potrebovali nekaj pogoj, da bi bilo res, da teče. In jih uporabljamo storiti, medtem ko zelo podoben medtem, vendar želimo naše kode na vsaj enkrat. To storijo, ko, kar je v Opravilo bo Vedno se vsaj en čas. Ker je, z nekaj časa, ga ne morda sploh če pogoj ni izpolnjen. Vsa vprašanja s tem? Torej struktura zanke. Fantje so vse to videli. Ponastaviti ga. Imate nekakšno stanje. Tako, na primer, smo lahko inicializacijo kot na i je enak 0. i je manj kot 10. In i ++. Zelo enostavna, da smo storili. Za while, podobno, imate da imajo neko inicializacijo nekakšen pogoj, in nekakšen posodobitve. Tako bomo lahko izvajajo naše zanko tudi kot while uporabo tega. In podobno z opravkov, medtem ko zanke, morda imamo nekaj inicializacijo, izvršiti nekaj, posodobiti in Nato preverite stanje. Torej, zdaj deluje. Smo dal vse skupaj. Smo morda želeli napisati nekaj vrsta funkcije. Skupna funkcija, ki jo morda so že videli, je glavni. Glavno je funkcija. Ima vrsto donos, int. To je ime funkcije, glavni. In to je argument, argc in argv. Torej, glavno je samo funkcija. Druge funkcije, ki ste jih morda uporabljali, printf-- printf je function-- GetInt, toupper. Ampak to se zgodi, da so bili izvajajo za nas nekakšna knjižnica. Če vidva ne pozabite tudi Ta knjižnica CS50.h ali Standard I / O knjižnici. Ja, vprašanje? OBČINSTVO: Je glavni samo neločljivo vc? To počne nekako [neslišno]? ZVOČNIK 1: Vprašanje je, če glavni je neločljivo povezana c. In ja, vse funkcije imajo glavno funkcijo. To je nekako potrebno za računalnik vedeti, kje začeti teče kodo. OBČINSTVO: Torej ti ne bi [neslišno]? ZVOČNIK 1: Ne Še kakšno vprašanje? Cool. Torej, tako kot jo lahko uporabite funkcijo , ki je napisana za vas, lahko tudi vi napišete svoje funkcije. To je funkcija, da bi lahko nekdo Pisal izračunati količino iz q, npr. Obstaja vrsta donos tukaj, v tem primeru int, naše ime funkcije q in naše Seznam parametrov. In ne pozabite, da morate pisati podatke tip parametra, ki ga želite uporabite ali pa funkcija ne vedeti, kakšne vrste parameter naj se sprejemajo. Torej, v tem primeru želimo celo kot naš vložek. Torej, zakaj bi mi želeli uporabiti funkcije? First of all, super za organizacijo. Pomagajo razbiti kodo v bolj organizirano kose in da lažje branje. Poenostavitev. To je dobro za oblikovanje. Ko berete košček kode in glavna funkcija je res, res dolga, bi bilo težje razlog o tem, kaj se dogaja. Torej, če si razdeliti naloge, da bi bilo lažje brati. In ponovno-sposobnosti. Če imate kos kode, ki je pa imenuje ali teči večkrat, Namesto reportaža tega zakonika 10 krat v glavno funkcijo, boste morda želite znova uporabiti. In potem vsakič, ko boste morali uporabiti, da del kode, pokličite funkcijo. Torej, zdaj, če se spomnimo nazaj na nič, smo se pogovarjali tudi o nekaj konceptov, od katerih je ena navojev. Nit je koncept večkratnik zaporedja kodo izvršitve hkrati. Tako da mislim nazaj na prvi dan, ko je imel David vi računate off števila ljudje v prostoru. V bistvu, kaj se je dogajalo o je vsa vas je bila teče ločene teme. In te teme so prihajali skupaj da bi dobili neke vrste odgovor. Podobno je v nič, ko imate več sprites, boste morda imeti mačko in psa. In bi bilo istočasno upravljanjem lastnih scenarijev. To je primer navojev. In drugi koncept, ki je uvedena je bila nič dogodkov. In dogodki, ko več deli kodo komunicirajo med seboj. V Scratch, to je bilo, ko ste uporabili Nadzor oddaja in ko sem Prejemanje blokov. In tudi v Problem Set 4, bomo videli malo dogodkov, kot dobro. Vidva bi se lahko uporabili knjižnica Gevent. In tam je bila funkcija waitForClick v kateri ste čakali za uporabnika, da kliknete. In tvoj klik, v tem primeru bi bilo dogodek in čakati na klik je vaša obravnavo dogodkov. In tudi v celotnem prikazovati psets in delajo na vaših psets, si bi lahko prišli v stik z nekatere od teh ukazov. To je tisto, kar boste vnesli v svoj terminal okno ali karkoli okno , ki se prikaže na vašem g uredi s, v bistvu, smer računalnik. Tako na primer navaja LS Vsebina imenik. Naredite imenik ustvari novo mapo. CD, sprememba imenika. RM, odstrani, izbriše datoteko ali nekatere imenik. In nato odstranite imenik odstrani imenik. OBČINSTVO: [neslišno]? ZVOČNIK 1: Ja, seveda. Žal, je bilo vprašanje, če vas Predlagam, dajanje to na goljufija stanja. To bi lahko pomagalo. Če imate prostor, ga lahko dal na. Prav tako je dovolj le na splošno dobro zapomniti, ker če ga uporabljate boste morda želeli, da samo so ga zapomnil. To bo vaše življenje veliko lažje. Poskusil sem odgovoriti na vaše vprašanje? Torej sedaj, smo se pogovarjali malo Na kratko o knjižnicah. Toda dve glavni tisti, ki smo bili uporabi do sedaj v teku so Standard I / O in CS50. Kakšne stvari, ki so vključeni v standardni I / O knjižnici? Ja, tako daleč smo uporabili printf. V CS50, smo uporabili GetInt in GetString. In podatkovni tip Niz tudi zgodi je treba navesti v tem CS50 knjižnici. Pogovorila se bova malo bolj podrobno o tem kako knjižnice delujejo in kako jih interakcijo z ostalo kodo. Ampak to so dve glavni tisti, ki smo so prišli v stik z doslej Seveda. Tipi. Ti so dobri, da se spomnimo, koliko vsaka vrsta predstavlja ali kako veliko bajtov vsak tipa requires-- int, 4 bajte; char, 1 bajt. Float je 4 bajte. Kaj je dvojna? OBČINSTVO: [neslišno]. ZVOČNIK 1: Ja, tako float vendar dvojno velikost. Kaj pa dolgoročno? OBČINSTVO: [neslišno]. ZVOČNIK 1: OK. Kaj je dolgo? OBČINSTVO: [neslišno]. ZVOČNIK 1: Ja, dvojno int. Da. OBČINSTVO: [neslišno]. ZVOČNIK 1: Long [neslišno]. In potem dolgo dolgo je dvakrat da. OBČINSTVO: Ne, ne. Dokler je samo int. To je odvisno od arhitekture pred [neslišno] INT in imajo enako velikost. [Neslišno]. ZVOČNIK 1: Tako dolgo in int so enaki. In potem dolgo dolgo je dvojni int. Cool. In potem, kaj je zadnja vrsta? OBČINSTVO: Pointer. ZVOČNIK 1: Ja, zato smo se naučili malo o kazalci. In glede na to, kaj se kazalec kaže da-- njo bi lahko char zvezda ali int star-- to je vedno 4 bajte za kazalec. Vprašanja o tem? Ja? OBČINSTVO: [neslišno]? ZVOČNIK 1: Tako dolgo in int so tudi v tem CS50 napravo. OBČINSTVO: naprava popolnoma zamenljivi. ZVOČNIK 1: Ja. In potem dolgo dolgo je dvojni int. OBČINSTVO: To je 32 bit? ZVOČNIK 1: 32 bit, ja. OBČINSTVO: Torej [neslišno]? ZVOČNIK 1: Ja, če ne bo Izrecno navajamo, vas morala prevzeti 32 bit. OBČINSTVO: To bi bilo nekaj reči kot ob predpostavki, arhitektura kot aparata. 64 bit, samo stvari, ki spremembe so podolgovati in kazalci. Oba [neslišno]. ZVOČNIK 1: Da? OBČINSTVO: Vprašanje. Torej, na eni od praks kvizov, se sprašuje o nepodpisano notr. Torej, kako bi bilo, da se določi od notr [neslišno]? ZVOČNIK 1: unsigned v je tudi 4 bajtov. Toda kaj je drugačnega podpisana int in nepodpisani int? OBČINSTVO: [neslišno]. ZVOČNIK 1: Right. Eden lahko predstavljajo negativne vrednosti. Toda, kako to storiti? OBČINSTVO: [neslišno]. ZVOČNIK 1: Ja, to prihrani 1 bit, da predstavlja znak. Podpisana ima en bit, ki predstavlja znak. In nepodpisani preprosto vseh pozitivnih rezultatov. OBČINSTVO: OK. Torej pravite, da je dvojna dvakrat velikost plovca? ZVOČNIK 1: Double je dvakrat velikost plovca, ja. OBČINSTVO: Kako kazalec za dolgo dolgo [neslišno]? ZVOČNIK 1: Torej, vprašanje je, kako se kazalec na dolgi long-- Kako je to le štiri bajte kadar dolgo dolgo njegove 8 bajtov. Torej, ne pozabite, kaj je kazalec, bistvu na zelo osnovne vrednosti. OBČINSTVO: [neslišno]. ZVOČNIK 1: Ja, tako da kazalec je le pomnilnik. Torej ni pomembno, koliko prostora da kazalec kaže na. Potrebuje le 4 bajte slediti navedene pomnilniškem mestu. Še kakšno vprašanje? Cool. Torej, zadnja stvar, ki sem je standardni izhod. Moral bi jih pogosto uporabljate dovolj, da se lahko spomnite. Ampak to je, ko smo uporabili printf, npr. In imamo te ograde, ki so bili imenovani kode format. Torej odstotkov c char, odstotek i za int, in smo lahko uporabite tudi odstotni d. To je ista stvar. Toda, na splošno, v CS50 smo poskusite uporabiti odstotno i. Odstotkov f za likvidna sredstva. Odstotkov ld za dolgo dolgo in odstotkov je za niz. Podobno smo se s pomočjo nekaj od teh zaporedij pobega. Na primer, backslashem n za novo linijo. To je samo za takrat, ko ste formatiranje kodo za tisk f. Ja? OBČINSTVO: Kaj je odstotek d za? ZVOČNIK 1: Torej, vprašanje je tisto, kar je za odstotno d? Odstotkov d je za ints. Odstotek d in odstotka i sta enaka. OBČINSTVO: Kakšna je razlika med n poševnica nazaj in poševnica nazaj r? ZVOČNIK 1: Torej, vprašanje je, kaj je Razlika med zračnosti n in backlash r? Mislim ubežnimi r je-- OBČINSTVO: Torej Nagibnica r samo pomeni, vrne na začetek vrstice ne da bi se dejansko dogaja, da v novo vrstico. Torej, če tiskate backslashem r in si nazaj na začetek vrstice potem si natisnete več stvari, si prepisati stvari, ki je že na [Neslišno]. Ker n dejansko gre za novo linijo in gre na [neslišno]. ZVOČNIK 1: No, katera koli druga vprašanja? V redu. Jaz grem, da ga izroči off Dan, ki se bo nadaljevalo. [APLAVZ] DAN: Vse Prav. Torej bom govoril o drugi širok paleta idej iz razreda, ki so približno predstavnik dva tedna in začetek tritedenskega speljevanju z litjem, ki je le način zdravljenje vrednosti določene vrste, kot vrednost drugačne vrste. Tako da bomo lahko to storite s znakov za ints, plava na ints, in dolge hrepeni podvojilo. Vse te stvari se lahko uporablja kot načine zdravljenja nekaj številsko vrednost minus char kot nekatere druge številska vrednost. Torej obstaja nekaj vprašanj, s tem, od Seveda, ki pride, ko odda stvari, kot likvidna sredstva do ints. Tako da je to malo čudno. Imamo plovec, ki je 1,31. Mi ga pomnožite z 10.000. In potem smo ga natisnete kot notr. Kaj ta izhod? 10.000-krat 1.31. Torej, 13.000, je, da ugibati? OBČINSTVO: Mislim, da je 10.000. DAN: Torej sem jo pomnožimo s 10.000 preden sem jo litje. OBČINSTVO: Oh. Ne bi bilo eno 9 in nekateri 0 številke? DAN: Morda imate čudne cifre. Tako da, to je 1,3-krat 10.000. Torej, to je 13.000. In to extra weird-- OBČINSTVO: 13.100. DAN: 13.100. Hvala, Rob. In to extra weirdness-- to 9,9-- preprosto zato, ker ta litje končal zaokroževanja navzdol, kjer ne bi smel imeti. Ja. OBČINSTVO: casting zgodi Po kaj drugega? DAN: Torej, ker imam to v tisku, je Ali to množenje pred njim Ali to litje. OBČINSTVO: [neslišno]. DAN: Mislim, da bi vzbujalo prvič, ja, kar bi bilo 10.000. Kaj drugega? Cool. Torej, to je 13.099. Zakaj se to dogaja? Nenatančnost. Boje niso popolni. Ti lahko predstavljajo le številke, na določeno število pomembnih osebnosti. Torej, če želimo natisniti 8 SIG fige na to float, smo dobili neke vrste grdo videti številko. In to zato, ker 1.31 ne more natančno jih preprosto zastopa pristojnosti dveh v napravi. Tako se konča ob katerem uganiti, ki konča pri čemer je malo nizka. Smisla? OK. Zdaj, preklopi so drugačen način početje pogojni stavki, kjer vse skrbimo je ena spremenljivka. Torej, v tem konkretnem primeru, da smo dobili celo število od uporabnika. In potem gledava kaj to celo je. Domnevam, da je število od enega do štirih. To je tisto, kar iščeš. Torej vam preusmeritve ime spremenljivke. Potem ko nastavite primerov mogoče vrednosti bi lahko bila. Torej neki primer, pravijo, da je nizka. In potem si zlomil ven stanja stikala tako da ne nadaljujem. V naslednjem case-- tako velja dve leti in velja three-- če je zadeva dve pa le pade na Prva vrstica kode se vidi kot pri malimi tri, dokler ne vidi odmor. Torej razlog, da si dobil zadevo eno do Samo print nizka zato, ker I ima ta odmor tukaj. Če bi, recimo, prezreti to break-- če sem vrgel breakaway-- bi tiskanje nizek, nato pa bi natisniti na sredini, nato pa bi prekinil. Torej počitnice so pomemben del za preklop pogoje in morali bi biti tam. Vse primere, ki so izrecno navedene se shranijo na privzeto velja za stikala in jih je treba odda. PUBLIKA: Torej 1, 2, 3, in 4 bi n? DAN: Vrednosti, ki lahko n. Da. Ja? OBČINSTVO: Torej, če imate da [neslišno]? DAN: Ti bi natisniti nizka, in nato bi natisniti na sredini, in potem bi prekinil. OBČINSTVO: Zakaj bi ga natisnete middle if [neslišno]? DAN: Torej, vse, kar je v okviru postopka pred odmor spada. Torej velja eno print je pod primera ena, saj je to po tisk. Ja? OBČINSTVO: [neslišno]? DAN: Torej je ta številka le posebej vrednost, ki jo ta spremenljivka lahko, kajne? Ali to smiselno? Ja. OBČINSTVO: [neslišno]? DAN: Da bi primer dva natisnete srednja in nato prekinil. OBČINSTVO: [neslišno]? DAN: Mislim, da vsaka? Katere druge vrste podatkov lahko preklopite? OBČINSTVO: lahko preklapljate nad vsemi podatkovnimi tipi. Ampak to samo pomeni nič več kot znakov in ints in podobne stvari, ker če ste preklopu kazalec da ne res ni smiselno, preklopu obremenitvami, če je celo dajva vam, da se zaradi plavajočo vejico natančnosti, da ne bi res želite storiti, da vseeno. Torej precej, le ints in znakov in stvari, kot je ta. DAN: Ja, to je, če imate izrecna vrednote, da veste, mislim, da se lahko da je dejansko uporaben stikalo. Dobro? OK. Področje je območje, ki razglasi spremenljivka razširi. Torej, v tej mali kos kode imam, da bi bilo polno napak. In razlog je razglasila sem to int i v okviru področja uporabe tega za zanke. In potem skušam reference, ki i zunaj, da je za zanke področja. Torej v bistvu, lahko si misliš o obsegu kot vse, kar ste razglasi s znotraj sklopa zavitimi oklepaji le obstaja znotraj teh zavitimi oklepaji. In če ste poskusili uporabiti to spremenljivko zunaj teh zavitimi oklepaji, boste dobili napako od prevajalnika. Ja? OBČINSTVO: Torej, ta ne deluje? DAN: To ne deluje, ja. Strings. String char *. Oni so popolnoma enaki. So le kazalci na znake. In vse strune, ki jih imate se mora končati z backslashem nič, ki je pravkar c konvencija. To se imenuje NULL terminator. In NULL-- Kapital N, U kapital, kapital L, kapital jaz-- ni ista kot NULL terminator. To je kazalec. To je znak. So zelo različni. Se spomnite. To bo na kvizu, verjetno. Nisem še videl kviz. Ja? OBČINSTVO: Torej NULL je, recimo, kazalec? DAN: Da. OBČINSTVO: Kaj [neslišno]? DAN: Če, recimo, je malloc poklical, ko vas nimajo dovolj spomina, da bi dobili ne glede na velikost prosiš za, malloc bo vrnila NULL. To je, v bistvu, kadarkoli funkcija naj vrne kazalec, si morali preveriti pred NULL zato, ker NULL je precej good-- to je, nekako, smeti vrednost. To je nič, kolikor kazalci iti. Vsakič, ko pokličete funkcijo, ki vrne kazalec. Boste želeli preveriti, da se Prepričajte se, da je ta kazalec ni NULL ker NULL je zelo pogosta. To je neke vrste smeti zameno. Torej, če nekaj ni šlo v redu, samo vrnitev NULL namesto. OBČINSTVO: [neslišno]? DAN: Ja, in to je to. OBČINSTVO: [neslišno]? DAN: črkovati kot je ta. To je NULL terminator. To je majhna črka N-U-L-L, če ste ga črkovanje. OBČINSTVO: In sem šla nazaj in ga testirali. In če boste poskušali postaviti plavajočo vejico vrednost v stikalo, bo kričal na vas rekoč izjavo zahteva izraz od celega števila tipa. DAN: Takole. Ampak ja, kaj je bilo vprašanje znova? OBČINSTVO: [neslišno]? DAN: Torej kapital N, U kapital, kapital L, kapital L je dejanska c stvar. To je NULL kazalec in bo obravnavati le kot primer. Vam ne bo nikoli poskusil in črkovanja NULL značaj in videli, kateri koli drug način, kot to. Ja? OBČINSTVO: Torej se vračajo v char max ali nekaj v pojasnilih, kajne utelešajo isto funkcijo kot [neslišno]? OBČINSTVO: Torej se to nanaša vrnitvi zoglenel max iz getchar, ali karkoli že je? OBČINSTVO: Ja. OBČINSTVO: Ja, tako splošni izraz za vse tiste stvari, so kontrolne vrednosti. Tako kot se vračajo int max iz GetInt in char max iz getchar, je naj bi bila v redu, če te stvari se vračajo k nam, Nekaj ​​je šlo narobe. Kazalce, samo zgodi, da imajo to sentinel vrednost, da se vsi se dogovori. In to je stvar, ki jo vrne ko gredo stvari narobe. Torej char max je tisto, kar smo s pomočjo da predstavlja nekaj kot NULL ali getchar. OBČINSTVO: Torej, če ste testiranje getchar, lahko daš NULL? Bi bilo to pomembno? DAN: Nisi mogel preveriti NULL. Vi bi morali preveriti zoglenel max, ker vrne vrednost iz funkcije je značaj ni kazalec. Ja? OBČINSTVO: To vprašanje je za dolžino niza. Ali to vključuje NULL znak? DAN: Ne In to je pravzaprav, kako dolžina niza ve, da se ustavi, ker gre skozi vaš nabor znakov, dokler vidi NULL značaja. In potem je tako kot vse V redu, bom naredil. OBČINSTVO: [neslišno] pet? DAN: Pozdravljeni bi bilo pet. Yep. Torej, nizi so neprekinjeno bloki pomnilnika. Imajo takojšen dostop z besedami ime za niz in nato v Curly oporniki, ne glede na indeks želite iti da, oni so indeksirane od nič preko dolžina array minus 1. In oni, ki jih je vrsto razglasi stvar, ki ste shranjevanje v matrika, ime niza, in nato ne glede na velikost je ta niz. Torej je to char array dolžine šest da ima te vrednosti. Ja? OBČINSTVO: [neslišno]? DAN: Ja. OBČINSTVO: [neslišno]? DAN: Če imate, kaj se dogaja v matriki že. Torej, lahko bi to namesto določite kot, recimo, znak, ne glede na ime vašega Niz je prazna oklepaja enaka curly naramnicami H comma E comma L vejico L vejico O comma NULL znak in kodrasti brace. Da bi deloval tudi kot izjava. OBČINSTVO: [neslišno]? DAN: Potem morate imeti velikost že. OBČINSTVO: [neslišno]? DAN: Da. Vse Prav. Argumenti ukazne vrstice so način pridobivanje prispevek od uporabnika kot Glavni argumenti. Glavni traja dva argumenta. Število argumentov, da bi opravil po ukazni vrstici in a niz vektor ali nizov vseh argumentov. Torej, če, recimo, imenovano funkcijo kot dot od 1 prostor, 2 vesolja, tri, argc bi 4. In argv 0 bi pika ven. Argv1 bi 1. argv2 bi 2. argv3 bi 3, v tem konkretnem primeru. Ja? OBČINSTVO: [neslišno]? DAN: zadnji element v matriki ker matrika je dolžina argc plus eden argb, zadnji element je NULL kazalec. To je argc plus 1. Torej, v primeru, da sem rekel, bi argv 0 je pika ven. argv 1 je 1. argv2 je na 2. argv 3 3. argv 4, ki je ena večja kot argc bi NULL. In to je NULL kazalec. Da. In to zato, ker niz char zvezda je kazalec. Torej mora biti enakega tipa. Ja? OBČINSTVO: Dve vprašanji. Torej eno, kaj je razlika med Ta in drugi kot eno vrsto GetString v uporabniškem motorju? In drugič, je shranjena v vaš nedavni spomin? Torej podobno, bi GetString biti [neslišno]? DAN: Kje je shranjena? Ne vem, kje je shranjena. OBČINSTVO: Torej, pravzaprav, saj veš, kako vsaka funkcijo, ki jo imenujemo to argumenti so shranjeni v skladovnici? Torej argc in argv so argumenti za glavno in so na kupu, ali res tik nad tisto, kar misliš, da kot začetek dimnika. Kaj je bil drugi del na vprašanje? OBČINSTVO: Torej, kaj je [neslišno]? DAN: Ja, to je samo drugačen način pridobivanje vnos od uporabnika. Ta je nekoliko bolj učinkovit in je bolj priročen za skripte, ker vas komaj gredo argumente za svoj glavni funkcija, namesto da bi morali čakati za uporabnike, če nimate nobenih uporabnikom. OBČINSTVO: In ja, dobil strune bo [neslišno]. To bi shranite stvari, ki jih potrebujete. DAN: Ja? OBČINSTVO: [neslišno]? DAN: Da, argv 0 vedno vključuje dot poševnica funkcijskega klica. Ja? OBČINSTVO: [neslišno]? DAN: Ja, vsak od argumentov, ki so končalo znakom NULL, ker so so strune. OBČINSTVO: [neslišno]? DAN: Da, argv argc je NULL kazalec. OBČINSTVO: [neslišno]? DAN: Oh ja. Ja, oprosti. OBČINSTVO: Torej [neslišno]? DAN: Torej, vprašanje je, če bi imeli ukazni vrstici dot poševnica piko iz 1, 2, bi število ukazno vrstico argumenti dveh ali bi bilo tri? OBČINSTVO: Mislim, da ne važno. Jaz ponavadi rečem, oh, saj ni prenesel vsi argumenti v ukazni vrstici, kadar Očitno si poklical funkcijo. Torej, sem se nagibajo k glasno izključiti Funkcija v ukazni vrstici Argumenti čeprav je vključene v argv. DAN: Ampak, če je bilo na test-- yeah-- in tudi če rečeš kot argc enak 3, ste v varnem stanju. Ja? OBČINSTVO: [neslišno]? DAN: Mislim, da če bi namesto kliče to v argc in godalnih ARGV oklepajih vendar je ohranil iste vrste in je pravkar klicala jim nekaj drugega kot in b, bi to še vedno deluje? In da bi bilo še vedno dela, bi samo-- namesto uporabe argc-- ste jo uporabili, in b. Ja? OBČINSTVO: [neslišno]? DAN: Torej, vprašanje je GetString je dogaja, da shranite spomin na kupu ker GetString je char *. V njej so zbrani spomin na kup, saj poziva zdaj malloc v dejanski Izvajanje GetString. OK, se gibljejo na. Varnost. Tako, da je resnično varen, vam zanesti na noben ena in si dovolite nihče dostopa do katere koli vaših podatkov, ki je, zakaj vsakdo gradi svoje stroje, svoje operacijske sisteme, vse svoje Programi iz nič, in očitno ne priključite na vse druge stroje preko interneta. Torej računalniki so nezanesljivi. So v resnici. Moramo zaupati drugim ljudem. In ideja varnosti je, da si poskušajo omejiti količino zaupanje, ki ga potrebujejo. In eno od sredstev, to storite je s pomočjo kriptografije. Kriptografija se v bistvu imamo skrivnosti. Včasih moramo opraviti svoje skrivnosti skupaj z, recimo, internet ali druge stvari. In ne želimo ljudi poznati te skrivnosti. Tako smo šifriranje naše skrivnosti v način da upamo, da nihče ne more ugotoviti. Tako smo used-- po poteku tega class-- stvari, kot Cezarjeva šifra in [Neslišno], ki sta oba zelo, zelo negotove načini šifriranje stvari. Oni so enostavno, da ugotovimo, kaj in kakšne so vaše skrivnosti. Realnem svetu uporablja veliko več zapletenih shem šifriranja. In ne bomo dobili v veliko več kot to. Razhroščevanje. GDB je najboljši. Grem še enkrat poudariti to. Gdb ves čas vse Čas imate težave. Ukazi, ki so uporabni v GDB so odmor, ki se boste peljali bodisi linijo številko, ime funkcije, v bistvu kje v kodi želite ustaviti, in biti sposoben, da prevzame nadzor. Print traja spremenljivko in natisne karkoli, da spremenljivka je tole točka v izvedbi. Naslednja premakne izvedbo po enem koraku. In okrepiti ukrepe znotraj funkcije v izvedbi. Druge stvari vodijo, ki je, kako ste dejansko vodijo svojo kodo. Nadaljujte sprejme vse ukrepe, potrebne , da bi dobili na naslednjo točko lomljenja. In obstaja veliko, mnogi drugi. Jih poglej gor. Oni so super. Ja? OBČINSTVO: [neslišno]? DAN: Yes, ki je debugger. Torej debugger je program, ki vam omogoča, da debug vaš program. To ni program, ki najde hroščev za ti, čeprav to bi bilo super. In nazadnje je zame iskanje. Torej vrste iskanja, ki smo govorili pa v tem razredu so linearne iskanje, ki je samo, da pogledaš skozi vsako element iskalni prostor, ena element v času, dokler ne boste našli kaj iščete ali dokler ne pridete konec iskalni prostor, na katerem točka pravite, da ni bilo mogoče najti element, ki ste jih iskali. In to traja kvečjemu konstantno časa, ki je 0 1 in v najslabšem ravnega Čas, ki je 0 n. Binarno iskanje, kar potrebuje Umazan elementi. Greš do sredine vaših elementov, vidim, če element iščete je večja ali manjša od elementa da ste na sredini. To je večje, ste rekli, da je dno vaše iskanje je prostora Vaše Trenutna lokacija, srednji, in vnovičnem zagonu procesa. Če je manjša, videti si rekel, da za-- ja, kaj se dogaja? OBČINSTVO: [neslišno]? DAN: Da. Kakršnih koli vrste, ki se je učil pri razred je poštena igra za test. [Smeh] DAN: In dejstvo, da niste imeli to storiti za problem niz, je pošteno igra za preskus. OBČINSTVO: Lahko gremo nad njim, kako da-- DAN: bo, bo šla skozi. SPEAKER 2: dejanska koda [Neslišno] je na study.cs50.net. Torej, če pogledaš na problem prakse na strani z zlivanjem v study.cs50.net, da je koda za izvajanje zlivanjem. Torej vam ni treba izvajati nocoj sami. Ampak poskrbite, da boste razumeli, ne kot samo pamet. OBČINSTVO: [neslišno]? SPEAKER 2: stran merge sort na study.cs50.net, je praksa problem, da bom, če boste s klikom Problem, na koncu pa je rešitev, ki je za spajanje izvajanje vrste. Ampak poskrbite, da boste razumeli in ne samo to zapomniti ali kopirate navzdol. OBČINSTVO: In popolnoma veljaven problem za izpit bi bilo nekaj podobnega tukaj seznam. Kaj pomeni ta seznam izgledal po en korak izbore vrste ali vstavljanje sort ali karkoli. Ena polna ponovitev seznama. Torej, tudi če ne boste na koncu morali koda za njo, jo morate razumeti dovolj, da vem, kako to gre da se spreminja ta niz. DAN: To je to za mene. [APLAVZ] LUCAS: Hej vsem. Moje ime je Lucas. Bom govoril o rekurzije, vse so vrste, ki smo jih naučili, in Malo vseh kazalcev. OK? Torej, najprej, rekurzija. Kaj pomeni reči, da funkcija rekurzivno? OBČINSTVO: se klici. LUCAS: OK, se poziva, ja. Tako kot te slike, na primer. To je kot na sliki v notranjosti iz slike in tako naprej. Tako, na primer, lahko have-- kot Dan ki je govoril o binarnem iskanju. Eden od načinov, ki binarno iskanje je rekurzivna je dejstvo, da si poskuša najti številko. Torej greš na sredini. In potem se preveri, če so številke tam v levo in v desno. In potem, če ste izvedeli številka bo na levi strani, je enako stvar kot enkrat delaš iskanje vendar Samo na levi seznama. Torej, to je, kako se sliši kot da je rekurzivna. Torej, to je, zakaj imajo fantje rekurzivna rešitev za urejanje z zlivanjem. OK, tako da tukaj je primer. Torej, recimo, da želim, da izberejo vse številke od 1 do n. Lahko zavedaš, da je vsota n število n plus n minus 1 do 1. Ampak potem, če gledam n minus 1 plus n minus 2 plus 1, ki je enaka stvar se vztrajanju številke do n minus 1. Torej lahko rečem vsoto enako vsoti enak n plus vsoti n minus 1. Ali to smiselno? In jaz bi tudi nekaj drugega imenovana baza primer, ki je, da vsota števil do na nič, bi bilo nič. Torej takoj, ko pridem na številko nič, se ustavim štetje. Ali to smiselno? Torej, tukaj je primer, kako Ne morem izvajati to. Torej imam to funkcijo v nekaj. To traja celo število n. Torej, tukaj sem najprej preverite, če je n manjša ali enaka nič. Torej, če je manjša ali enaka nič, sem vrne nič, kar je naša osnovna. V nasprotnem primeru lahko samo vrne n plus vsota številk ena za n minus ena. Smisla? OK. Torej, tukaj je, kako izgleda. Imate vsoto 2 enakih 2 plus vsota 1. In nekateri od 1 je 1 plus vsota 0, ki je 0. Smisla? Torej, če pogledamo na kup vaše programa, to je tako, kot izgleda. Prvič, smo glavno funkcijo. In potem je glavna funkcija imenovana vsota 2. In potem vsota 2 reči, oh, vsota 2 enaka 2 plus vsoti enega. Torej dodam vsoto 1 do dimnika. In vsota 1 bo poklical vsoto 0, ki je prav tako dogaja, da se doda odvodnika. In nato vsako od teh tiste, ki so na vrhu drugega morali vrniti preden lahko ostale pa nadaljuj. Tako, na primer, tukaj, vsota 0, Najprej se bo vrnil 0. In nato izberite vsoto 1. Potem vsota 1 bo vrne 1 vsoti 2. In končno, vsota 2 se dogaja , da se vrnete na glavno 3. Ali to smiselno? To je zelo pomembno, da razumemo, kako Sveženj deluje in poskusite vidim, če je smiselno. OK, tako razvrščanje. Torej, zakaj je pomembno, sortiranje, Najprej? Zakaj bi morali skrbeti? Kdorkoli? Daj mi primer? Ja? OBČINSTVO: [neslišno]. LUCAS: Ja, v redu. Tako da lahko poiščete bolj učinkovito. To je dober način. Tako, na primer, imamo veliko stvari, pravzaprav, v naše življenje, da so razporejene. Na primer, slovarji. To je zelo pomembno, da imajo vse besede v nekakšnem da bomo lahko enostavno dostopate. Torej, to je, kaj je rekel. Iščete lahko bolj učinkovito. Pomislite, kako težko bi bilo, da imajo slovar, v katerem so besede v naključnem vrstnem redu. Boste morali pogledati, precej, vsak beseda, dokler ne najdete beseda, ki jo iščete. Če uporabljate Facebook, tudi, ko je gledate svojim prijateljem, da si boste videli, da Facebook dal vaš bližje prijatelj je na vrhu tistih, da vam ne govorim, da je veliko. Če greste vse do dna tvoj prijatelj seznam, boste videli ljudje, ki jih verjetno sploh ne ne pozabite, da ste s prijatelji. In to zato, ker Facebook vrst vaši prijatelji, ki temeljijo na tem, kako zapri ste z njimi. Tako organizacijo podatkov. Tudi Pokemon. Torej vidite, da je vse Pokemons imajo številke. In da je kot lahka način dostopanja do podatkov. OBČINSTVO: Dostop Pokemon. LUCAS: Ja. OBČINSTVO: [neslišno]. LUCAS: Yep. OK, tako da izbor sort. Izbira sort se dogaja, da izberete Najmanjši neprebrani vrednost seznama vsak Čas, v vsaki ponovitvi. To je nekako tako kot vrste, ki ga opravljate v tvoji glavi, ko ste poskušali razvrstiti seznam v roki. V bistvu, vse, kar morate storiti je, da si ogledate za najmanjše število. Ste jo dali v urejenem seznamu. In potem poglej za naslednjo manjšo številko. In potem vztrajati početje da in tako naprej. Torej, izbira sort je v bistvu si izberite vsakič najmanjši neprebrani vrednost. Put konec razporejene del seznama. In vztrajati početje to. Torej, kaj je hitro videli, kaj to izgleda. Torej, tukaj je urejeno in neprebrani seznam. Torej za razporejene po seznamu, je na začetku prazna. In potem se bom, da izberete Najmanjše število tukaj, ki je 2. Tako da sem dobil številko 2 in sem dal v sprednji seznama. In potem sem si za naslednjo manjšo Element, ki je 3. Zato sem ga dal na koncu od razvrščena seznama. In potem sem vztrajati početje to. Se mi zdi, 4 in ga dal na koncu. Najdi 5 in ga dal na koncu. In poglej, kako vse te čase, ki Pravim, da ga na koncu je, v bistvu, zamenjavo dveh vrednosti. OK? In potem zadnji, ki ste jo pravkar še eno komponento. Torej, to je že urejeno. OK, tako da vstavljanje sort. Insertion sort boš tudi da je stvar, ki je urejeno in neprebrani seznam. Edina stvar je, da vsakič, ko ste dodaja element razporejene Seznam, ki ste jo pravkar izbrali element, ki je pred nesortiranih seznama. In potem boste našli kaj Položaj je treba v sortiranega del seznama. Poglejmo, kaj je to tako To je bolj smiselno. Torej, najprej, na primer, sem poskušal vstaviti številko tri leta sortiranega del seznama. Torej seznam nima ničesar. Tako da sem lahko samo dal številko 3. Zdaj pa želim dodati številko 5 za sortiranega del seznama. Torej gledam na številko 5. Opazil sem, da je večja od 3. Zato vem, da mora biti po 3. Zato sem dal 3 in 5. Potem hočem vstaviti številko 2. Opažam, da je številka 2 dejansko trajala nato tako 3 in 5. Torej, sem dejansko moral dati vse Tako v začetku seznama. Torej moram, vrsta, prestavite vse elementi razvrščeni seznamu, tako da lahko da bi naredili prostor za številko 2. Potem sem videl številko 6. Vidim, da bi morala biti po 5. Zato sem ga dal tja. In končno, gledam na številko 4. In opazil sem, da bi morala biti med 3 in 5. In potem sem ga tam in premik vsi drugi elementi. Smisla? Bubble Sort. Torej bubble sort je v bistvu tisto, kar ste bo do-- ga imenujemo bubble sort, ker greš skozi list-- je dejansko bolje, če sem samo pokazati Želite to-- in ti boš za primerjavo sosednjih številk. In boste zamenjali svoj pozicije, če oni ne v pravem zaporedju. Torej v bistvu, kaj se dogaja, da zgodi, je tukaj, na primer, imate 8 in 6. Veste, da bo razvrščenega.Vse red dejansko 6 in 5, kajne? Torej boste zamenjali naročila. Potem sem videl 8 in 4 tukaj. In sem naredil isto. Spet zamenjali. In končno, 2 in 8. Jaz jih tudi zamenjali. To se imenuje Bubble Sort saj po vsaka od teh iteracij, pravzaprav, največje število na seznamu dobi vse Tako na koncu seznama. Ali to smiselno? Ker ohranja jo zamenjala in ga prestaviti na desno. OK, tako da je to druga ponovitev. To bi bilo isto. Jaz bom eno zamenjavo in nato zadnja. Sem, da ni zamenjave in Seznam je razvrščen. Torej, v Bubble Razvrsti, smo v bistvu vodi gre skozi seznam in zamenjavo stvari, dokler nisem opazil, da nisem naredil morebitne zamenjave početje to ponovitev, ki pomeni, da je seznam že razporejene. Smisla? Pogovorimo se malo o čas teče. Torej vi spomnite Big O, Omega in Theta? Ja? OK, kaj je Big O, najprej? OBČINSTVO: [neslišno]. LUCAS: Ja, se imenuje najslabša runtime, kar samo pomeni, da je koliko ste pričakovali program vzeti teči. Tako kot v smislu o-- V tem case-- n. Število elementov v Seznam v najslabšem primeru. Podobno, v najslabšem možnem primeru. Torej za Bubble Razvrsti, na primer, Imamo velik O iz n kvadrat. Zakaj imamo to? Zakaj je Bubble Sort Big O n kvadrat? OBČINSTVO: [neslišno]. LUCAS: Ja, tako da bo v najslabšem primeru bo da bom moral narediti n iteracij. Tako vsako ponovitev, se bo prinašajo največji element na koncu seznama. Torej v najslabšem primeru je, da imam narediti to stvar n krat. In za vsako od teh časih, moram narediti n zamenjav, ker imam za primerjavo vsaka dva elementa. Torej, to je, zakaj je n kvadrat ker je n krat n. Potem, izbira vrste je tudi n kvadratni ker je za vsako ponovitev, moram poglej vsakega posameznega elementa v seznamu. In potem najti najmanjši, kar pomeni, da moram odmisliti n elementov. In moram storiti, da N-krat, ker Moram izbrati vse n elementov. Vstavljanje sortiranje tudi n kvadratni ker najslabšem primeru bo biti, enega, moram vstaviti n številke, kajne? Torej, jaz že vem, da bom da imajo n iteracij. Toda za vsako od teh številk, če bi imel pogled na vse številke v razporejene seznam in mu dal vso pot v spredaj, bo to n kvadratni ker bo n krat n znova. Smisla? Kaj pa omega? OBČINSTVO: [neslišno]. LUCAS: To je najboljši možni scenarij. Torej, to je kot, v veliko krat za sortiranje, najboljši scenarij je ko je seznam že razvrščeni. Tako da ne boste res storiti ničesar. Bubble Sort ima najboljše scenarij n. Ali vi veste, zakaj? OBČINSTVO: [neslišno]. LUCAS: Ja, če si beležite ali je imel podatki obrok nobene zamenjave ali Ne, če imate kaj takega nastavljena na velja, če je bila ponovitev, če Seznam je že urejeno, v bistvu, kaj se bo zgodilo, se bom poskusite zamenjati vsake dve sosednji elementi. Bom videl, da ni zamenjave. In sem vrnil takoj. Torej to pomeni, da sem moral iti skozi seznam naenkrat. Torej je n, ker sem videti v n elementov. Zakaj izbor sort n kvadrat? Ja, tudi če je seznam urejen, za vsaka ponovitev izbora vrste, I izbrati najmanjši element. To pomeni, da moram ven pogledati na vseh elementov razvrščeni seznam in našli minimalno za vsako ponovitev. Ali to smiselno? In vstavljanje Meč je N, ker v Primer, ki sem poskušal vstaviti številke in vse številke, ko sem poskusite, da jih vstavite, vidim, da so so v pravilnem položaju. Nimam iti preveriti vse druge številke v nesortiranih seznamu. In zato bo n. Smisla? In kaj je teta? OBČINSTVO: [neslišno]. LUCAS: Kaj mi je? Reci še enkrat. OBČINSTVO: [neslišno]. LUCAS: Točno tako. Tako lahko vidite, da je le izbor shranjeni v zlivanjem imajo thetas. In to zato, ker imate samo theta če sta enaka, tako velik O in omega. OK. In končno, z zlivanjem nahaja v log n. In potem, kot je Dan je rekel, zlivanjem je podobno na enak način, da vam binarno iskanje. Tako boste dobili seznam. In boš prepolovil. In potem jih prerežemo v manjših polovici. In potem jih združiti. Vi se spomnite, kajne? OK, kot je govoril. OK, kazalci. Torej, kaj je kazalec? OBČINSTVO: [neslišno]. LUCAS: naslov. OK. Vem, da je David kaže kup videi Binky in stvari, ki kažejo seboj. Ampak mi je všeč, da razmišljajo kazalcev kot zgolj naslov. Torej je spremenljivka, ki se dogaja za shranjevanje naslov. Torej, to je samo ta posebna spremenljivka da je štiri bajte. Ne pozabite, da je kazalec na karkoli je vedno štiri bajte za našo 32-bitni stroj tako velja aparat. In to je le mesto spremenljivke znotraj nje. OK, tako da je ta spomin, v bistvu. Torej vsak blok pomnilnika dejansko ima nalepka, ki je naslov slotty spomin. To pomeni, da lahko imam kazalec kaže na koli od teh naslovov. Torej razlog, zakaj bomo uporabili kazalce je če moram zapomniti lokacijo da je posebna spremenljivka pomnilnika. In vi se spomnite, da je eden od tistih, ki primerov je bilo, če sem imel funkcijo če imam dejansko vam želim swap za reals, sem dejansko poslati kazalec. Ni spremenljivka. Se vi spomnite tega? Razlika between-- kaj je ime? Kliče po vrednosti in kliče s sklicevanjem, kajne? OK, ja. Torej klic po vrednosti. Ko preprosto pošljete spremenljivko delovali ste samo pošiljanje vrednost. Torej ste dejansko pošiljanje kopija spremenljivke. In tvoj program ne briga pa če ista spremenljivka dejansko naredi kopijo. In poklical po referenčni pomeni, da Jaz sem pravzaprav pošlje kopijo Kazalec na spremenljivko. Torej to pomeni, da bom poslala položaj te spremenljivke. Torej, občutek imam lokacijo spremenljivka, ko kličem funkcijo s kazalci, sem lahko dejansko spreminjanje podatkov, ki je bil v glavni. Smisla? Kljub temu, da je kazalec kopija, kazalec ima še vedno pravi naslov za spremenljivka, ki želim spremeniti. Smisla? Torej ustvarjanje kazalcev. Ne pozabite, da kazalec še vedno tip, ki je kazala na in zvezdo. In potem si dal ime. Torej, ne pozabite, da ko imate karkoli zvezda, je kot kazalec na da ne glede na variable tip, ki ga je imela. Torej, tukaj v zvezdo, na primer, je kazalec in število. In potem char zvezda je kazalec char zvezda in tako naprej. Ja? OBČINSTVO: Kaj pa, če imamo kazalec n zvezda x. Vem, da ustvari kazalec na x. Ali tudi razglasi x celo število? LUCAS: OK, tako da, ko ste rekli n zvezda x, niste ustvarili kazalec spremenljivka x. Ste ustvarili kazalec imenovan x. OBČINSTVO: [neslišno]. LUCAS: Torej, ko rečem n zvezdicami x, sem rekel, hej, v spomin, da bom dobili eno od teh treh poljih. In jaz bom rekel, da je ta se bo x, ki je bo kazalec. In kaj zanimivega o kazalci je, da rečemo, da imajo 4 bajte za 32-bitni stroj. In razlog za to je, ker 4 bajti 32-bitov. In stroji, ki so 64 bitov dejansko imajo ptičarji naslove da so 64 bitov dolga. Torej samo pomeni, da je velikost naslovi v stroju je drugačna. Torej sklicev in Dereferenciranje. Obstajata dva operaterja, ki vi bi morali zapomniti. Prvi je ampersand. Drugi je zvezda. Ne zbunjeni z zvezdo in to STAR, saj se spomnite, da je v V tem primeru imate n zvezdo. To je kot celotno stvar skupaj. Ni n prostora zvezda. Torej to pomeni, da je to tip. Ne pozabite, da če imate spremenljiva zvezda, si govorimo o tipu. Ko imate samo zvezdo in nato ime spremenljivke, to pomeni, da ste Dereferenciranje kazalec, ki pomeni, da gledate kazalec, iskanju naslova je kaže, da, grem na ta naslov, in gledaš kadarkoli imaš tam. Povedal sem svoje študente, da ko imate zvezda, bi morali razmišljati, da je kratica vsebine. Torej, če imate kazalec in ga storiti zvezdicami kazalec, je vsebina kazalca. Torej, greš na vse, kar je na srečo kaže na in pogled na konstantni vsebnosti. In ampersand je enaka stvar kot naslov. Torej, če imam spremenljivko je-- všeč, dajva pravijo, da sem int enaka 3-- če želim, da bi našli naslov, ki spremenljivka pomnilnika, lahko sem samo narediti ampersand. Torej, to je naslov. Smisla? Torej, tukaj je primer. To manjka int b in c int. Torej int enaka 3, pomeni, da Jaz grem v spomin. In bom najti režo in dal številko 3 tukaj. In potem int b enaka 4. Bom naredil enako. Pojdi na spomin in dal številko 4 v enem od polj. In int enaka 5. Najti drugo škatlo in dal številko 5. Torej, kaj je ta vrstica počel? n zvezda pa je enak znak pove a. Torej, najprej, n zvezda letno. Kaj počne? OBČINSTVO: [neslišno]. LUCAS: Ja, tako n zvezda pa, prvič, izjavlja, kazalec pa se imenuje. In potem je dodelitev vrednosti da kazalec biti naslov. Torej ampersand. Potem, če naredim zvezda Pb, kaj je zvezda pb? Oh, žal mi je. To je prav tako manjka. n zvezda pb. Mislim zvezda pc. Tako mi je žal. To je ista stvar. Ampak zdaj sem dobra ar ustvarja kazalec da b in nato kazalec na c. Ja? OBČINSTVO: [neslišno]? LUCAS: Da. Torej, če greš v spominu in greš polje, ki je označevalec za letno, ste dejansko dogaja, da glej tudi naslov. OK? Ja? OBČINSTVO: [neslišno]? LUCAS: Ja, kazalec naslov. Nikoli ne pozabite, da je. To je kot najpomembnejši del o kazalca. Tam je shranjevanje in naslov do neke spremenljivke. Kaj drugega? Še kakšno vprašanje? OK. Torej ptičarji in Arrays. Ne pozabite, da ko sem naredil int matriko 3, v bistvu, kaj počnem, je, da sem, vrsta o razglasitvi na kazalec. Torej matrika je nekako kot kazalce na poseben prostor v pomnilniku, v kateri sem namenila tri reže za cela števila. Ali to smiselno? Torej, ko sem naredil int matriko 3, kar sem delaš, v bistvu, ustvarja tri reže v spomin. Tako da sem samo najti tri reže v spomin. Torej, če naredim, potem zvezda niza, jo bistvu pomeni vsebino matrike, kar pomeni, da izbrišete kazalec, grem v tem mestu, ki je kazala, da, in sem dal številko ena. In potem, če bom zvezda niz plus 1, to je isto, kot počne niz nosilce eden, ki samo pomeni, grem mesto, ki ga je gledala. In potem naredi plus 1 me premakne za eno mesto. Zato sem šel na ta položaj, pravzaprav, in dal številko dve. In potem, na koncu, ko sem naredil matrika plus 2, grem tja, kjer kazalno Array je na. In potem sem se premaknete na pomnilniških blokov. In potem sem dal številko tri tukaj. Ja? OBČINSTVO: Torej zvezda matrika je preprosto izgovorite zelo prvo točko. In lahko dodate 1, samo zato, ker smo šele zares na to, da je prvi naslov. LUCAS: Ja. Zakaj, na primer, pravijo niz 0, matrika 1 in matrika 2? Pravim, zakaj počneš 0, 1, 2, 3 namesto 1, 2, 3? Eden od razlogov za to je, one, računalnik programerji raje začel šteto od 0. Dva je zato, ker ko boste to storili niz 0, to je isto, kot počne niz plus 0, kar pomeni, da gre za to stališče, in jaz ne preskočite vse pomnilniške bloke. Torej se ne premaknem vse pomnilniške bloke. Ja? OBČINSTVO: [neslišno]? LUCAS: Torej ona sprašuje, kaj je Razlika med tem to, ali gre malloc. Ena od razlik je, da int matrika 3 je ustvarjanje niz na kupu. In ko sem naredil malloc ga, ustvarja na kup. Ali to smiselno? Torej, kako malloc dejansko deluje? Torej, zakaj sploh potrebujemo uporabljati malloc? Vaš prevajalnik vrsta osebnosti iz vse spremenljivke, ki jih je deklarirano. In ustvarja prostor za vse da bi jih v sklad. Torej vse vaše spremenljivke gredo da je nekje v kupu. Torej, tukaj je okoljske spremenljivke. Torej v bistvu, prostor za tiste spremenljivke, v pomnilniku, se razporedi na zbere čas. Torej to pomeni, da je vaš računalnik poznati vseh teh spremenljivk vnaprej. Ne vedeti, kaj je vrednost boš dal v njih. Vendar je treba vedeti, kako pomnilnika, kar potrebujete. Ampak zdaj recimo, da, na primer, ste ustvarili vrsto ali ob niz, ki ste ob od uporabnika. Ti ne veš, kako dolgo niz se bo, na primer. Tako da ne vem točno, koliko pomnilniških blokov vam dodeliti, kajne? Tako da ne res smiselno vam povedati, dal 100 znakov. In kaj potem, če uporabnik piše 150? Boš se zajebali. Torej v bistvu, ne morete biti prepričani o tem, kako pomnilnika morate dodeliti ko prevede program. Pravkar ste vedeli, da na čas delovanja. Torej, to je, zakaj imate kup. Torej kup se dogaja, da imajo spomin da ste razporejanje med trajanje programskega teka. Torej v bistvu, ko boste to storili malloc, kaj delaš se pri dodeljevanju pomnilnika runtime, kar pomeni, da ste odločanju pravico v tistem trenutku, ki vas bi moral imeti ta spomin. Torej, to je, ko ste ga dodeljevanja. Ali to smiselno? Torej, ne pozabite, kup ima spremenljivk ki so proizvedena prevajanju. In potem heap ima spremenljivk ki so nastala kot greš s funkcije malloc, npr. OBČINSTVO: [neslišno]? LUCAS: Torej GetString je Poklicala bom malloc. Mi govorimo o funkcije malloc in Pojasnil bom GetString. Torej malloc je ista stvar kot dodeljevanje pomnilnika. Tako se dogaja, da dodeli spomin na kup. In to se dogaja, da se vrnete kazalec če je bila ta spomin je bila dodeljena na. Torej, ko do-- Tukaj Primer-- n zvezda kazalec. In potem kazalec enak malloc velikost palčne prenosov 10. Jaz ustvarjanje kazalec. In potem sem dodeljevanje da kazalec vrednost kazalca, da malloc me daje. Torej jaz vprašam malloc lahko dodeli prostor za 10 števil. To je to, kar govori. In malloc mi vrača kazalec na to mesto. Smisla? OK. I In GetString je, v bistvu, gre pokličete funkcije malloc, tako da lahko dodeli pomnilnika med delovanjem. Vedno se spomnite, da preverite null ker malloc se dogaja, da se vrnete null če to ni mogoče dodeliti pomnilnika. Recimo, da vas za smešno količino pomnilnika. Računalnik se ne bo lahko veliko dodeliti to. Torej malloc je le, da bo , da se vrnete null. Torej vedno ne pozabite preveriti, če Kazalec, ki ga je dobil od funkcije malloc nična ali ne, ker če je, boste morda se Dereferenciranje kazalec in povzroči neželene napak. In končno, ne pozabite vašega prostega pomnilnika. Malloc ustvarja spomin na kup. In boste morali sprostiti pomnilnik pred zaključkom programa. OK, to je vse za mano. Žal mi je, Rob. Hvala. [APLAVZ] LUCAS: Vsa zadnja vprašanja Pred Rob prihaja? Ne? Ja? OBČINSTVO: nisem videl tale online. Si ga še dodal? LUCAS: Mislim, da je Dave nalaganjem kmalu. DAVE: To bomo objavili. LUCAS: To bo online. OBČINSTVO: To je odvisno. LUCAS: To se dogaja? OK. Ja? OBČINSTVO: [neslišno]? LUCAS: Yes, morate osvoboditi vse pomnilnika, ki je dal v kup. OBČINSTVO: [neslišno]? LUCAS: Da. Vsak čas, da imate malloc kulture, morate imeti kulturo brezplačno ko prenehate uporabljati to spremenljivko. Torej malloc in brezplačno, so vedno skupaj. Njihovi najboljši prijatelji. Ja. Rob? ROB: Grem hitro. In bo tudi video postavi. Imam mic naprej. OK, tako da teden pet stvari. Prva stvar, ki jo imamo, je kup. Torej, ne pozabite, da obstaja samo en kup Okvir po aktivnem klicu funkcije. Bomo videli, da je v sekundi. In prav spomnim, kaj pravzaprav gre v vsakem dimnik okvirju se bodo lokalne spremenljivke naših funkcij, argumenti, ki so opravili v naši funkcije, skupaj z nekaj druge stvari, ki jih v resnici ne treba skrbeti. Torej, tukaj je primer programa, kjer obvestilo, glavno je printfing vrnitev Vrednost foo 4. foo je le, da bo vrnil Vrednost bar 4 vejico 6. In bar se dogaja, da določi nekatere lokalne spremenljivka n enak 4 krat 6. In se nato vrne n. Tako da je pogled na kup ves dejanska ponovitev tega programa. Tako da je dno naše dimnika. Ne pozabite, da je sklad odrašča. Tako na dnu naše skladovnice, smo imajo sveženj okvir za glavno. Ko se program zažene, glavna se vedno dogaja, da je na Spodnji del našega dimnika. In kaj je v naših kup okvir za glavno? Torej, čeprav ne obstajajo lokalna spremenljivke na glavno, kot sem rekel prej, smo argc in RGV ob nastopu prostora znotraj glavnega dimnika okvirja. Torej, glavna bo zdaj klic funkcije foo. In to pomeni, da foo bo dobili svoj sveženj okvir. Torej, zdaj smo znotraj Funkcija foo. In kaj je potrebno, da gredo v Foo je kup frame? No, foo je argumenta n. In je n enak 4, ker to je tisto Glavno je mimo kot argument foo je. Torej, zdaj foo bo poklical bar. Kaj je bar dogaja, da imajo v notranjosti svoje "dimnik okvirja? To je x enak 4 y enaka šest. To še ni vse, da bomo imeli v dimnik okvir zato, ker bar ima tudi lokalno spremenljivo n. In n bomo nastavljena enaka 24. Torej, zdaj bar se vrača n. Torej je bar vrača 24 do foo kup okvir. In ker bar je zdaj vrača, da pomeni, da smo živahen stack frame za bar off dimnika. Tako da vse spomin, da je bil bar uporabljate, je zdaj off dimnika. Zdaj, foo se tudi dogaja, vrniti 24 na glavno. Torej sedaj, da foo se vrača, spomin da foo je uporabljal v svojem ' Sveženj Okvir je tudi odšel. In zdaj, glavna bo klic printf. Torej printf je samo še ena funkcija. Ko smo klic printf, da se dogaja, da je en kup okvir za printf klic funkcije. Kaj se peljemo printf? To je tisto, kar se dogaja, da gredo na dimnik okvir. Vsaj, da smo mimo da odstotkov i n poševnica nazaj in argument 24. Morda bi morali bolj je kup frame printf če se zgodi, da se z uporabo nekaterih lokalne spremenljivke. Ne vemo. Ampak vse to gre v printf-ih kup okvir. To se dogaja, da se izvršitev printf. Potem printf je naredil. To se bo vrnil. Končno, glavni je. Glavni bo vrnil. In potem je naš program dela. Ja? OBČINSTVO: Ali ste videli [neslišno] Argumenti [neslišno] parametri? ROB: Torej je subtilna razlika Med argumenti in parametrov. In res, v skupnem govorijo, ljudje samo jih pomešajo ves čas. Vendar parametri so formalnega poimenovati stvari. Torej argc in argv so parametri za glavno. Argumenti so tisto, kar dejansko prehaja v tiste parametre. Tako da, ko sem poklical foo od 4, 4 je argument sem mimo v. In n parametrov, znotraj foo, bo na vrednost 4. od 4 je bil argument. OBČINSTVO: [neslišno]? ROB: n je lokalna spremenljivka v bar. n je še vedno lokalna, da foo, vendar je parameter za foo. To ni lokalna spremenljivka. Ja? OBČINSTVO: [neslišno]? ROB: foo je samo kliče bar in vrača ne glede bar donose. OBČINSTVO: [neslišno]? ROB: Ja, samo da vidim, multiple kup okvirjev. Ja? OBČINSTVO: Zakaj je bila imenovana foo Pred printf? ROB: Zakaj je bila imenovana foo pred printf? Tako da bi lahko imel namesto tega narediti nekaj kot int x enak foo od 4 in nato natisnjena x. Toda namesto, da kombinirajo funkcijo zbuja argument printf. Ampak obvestilo, da ne moremo dejansko izvedete klic printf, dokler ne bomo ugotovimo, kaj foo dne 4. je. Torej bomo oceniti to. In šele, ko je to storjeno bodo da pridejo nazaj in oceniti to. Ja? OBČINSTVO: Ker tako bar [neslišno] vrednost, zakaj nimamo [neslišno]? ROB: So popolnoma morala biti int. Da ni bil ujet več več prelazov. Torej mora biti int bar in INT foo saj tako tistih se vračajo cela. Nična le, če jih ne bo Za vrnitev dejanske vrednosti. Ja? OBČINSTVO: Če ste imeli vrstico zgoraj donos, [neslišno]? ROB: linija nad zameno? OBČINSTVO: Ja. Všeč mi je, če si printf in [neslišno] je dvakrat bi natisniti? ROB: Torej znotraj foo? Če bi imeli printf tukaj? OBČINSTVO: Ja. ROB: Torej, če bi imeli pravico printf tu bi natisniti enkrat. Ker smo se kliče foo enkrat desno tu, potem bomo zadeli printf. Potem bomo poklical bar. In potem bo foo vrniti. In to je to. Mi samo kdaj naleteli printf enkrat. Ja? OBČINSTVO: [neslišno] printf kliče foo, ker smo prvi kliče printf in potem vrtaš argumenti. ROB: Torej, v teoriji, ni printf kliče foo? Torej ni. Samo da da c se bo izvršitev te stvari je, preden smo lahko pokličete funkcijo, vse argumente funkciji morali v celoti oceniti. Torej je to popolnoma ocenili? Ja, to je le niz. To je samo vrednost. Potem smo popolnoma oceniti to. Ko je to storjeno, sedaj vse njegove trditve so ocenjevali. In zdaj lahko naredimo pokličete printf. Ja? OBČINSTVO: Eno vprašanje. Če imate funkcijo void, mora imate povratni podpičje? ROB: Saj ne povratni podpičje če imate funkcijo nična. OK. Torej, zdaj nekateri kup stvari. Torej kup je, kako bomo obravnavali z dinamično upravljanje pomnilnika. In to neposredno v nasprotju z Sveženj, ki bi imenovali samodejna upravljanje pomnilnika. Tako na kupu, nikoli res da se ukvarjajo s tem, kako lokalne spremenljivke se potiska in izstrelil off vse ti konzoli okvirji in vse te stvari. Vam ni treba skrbeti za to. To je avtomatski. Torej kup je ročna. In [neslišno] prihaja iz teh funkcij malloc in brezplačno. Torej, tukaj je drug program. Vse, kar delamo, je mallocing število. Mi smo jo shranite v zvezdicami x. Seveda, moramo preveriti da vidim, če je x null. Potem bomo šele določiti, kaj x se kaže, da bi 50. Tiskanje, kaj x kaľe, print x in nato brezplačno x. Torej, kako se to dejansko dogaja, da poiščete če se ozremo na naš dimnika in kup? Torej bomo spet začeli. Dno našega dimnika kot prej. Ne pozabite, da tebi kup neposredno nasprotuje stack? Torej bomo imeli top našega kup tam. Torej dnu naše skladovnice, imamo naš kup okvir za glavno. Ima prostor za argc, argv, in smo Zdaj imajo lokalne spremenljivke x, ki je int zvezda. Torej bomo Ponovil preko tega programa. Prva stvar, ki jo imamo, je klic funkcije malloc. Torej delamo poklicati funkcije malloc. Malloc je funkcija. To se dogaja, da bi dobili sveženj okvir. Kaj se peljemo do malloc? To se dogaja, da gredo notri dimnika okvirja. Smo mimo velikosti n, ki je 4. Tako, da se prenese funkcije malloc. Kaj malloc storiti? To nam zagrabi nekaj prostora na kup. Tako smo šli na kup. In bomo, da zgrabite 4 bajte iz kopice. Torej daj, da samovoljno naslov. 0x123 Pretvarjaj se, da je naslov, ki je na kupu. Torej, kaj je dejansko v notranjosti, ki regija spomina na naslov Ox123? Garbage. Zato nismo ničesar shranjeni v njem. Torej, kolikor vemo, je je lahko karkoli. Ne bi smeli domnevati, da je nič. To je najbolj verjetno ni nič. Torej, zdaj malloc vrne. In kaj storiti, ko malloc vrne? Postavili smo, kaj se vrne. Smo postavili x enake, kar da se vrača. Torej, kaj se vrača? To se vrača 0x123 ker je to naslov bloka pomnilnika, ki ji Pravkar dodeljena v kup. Torej vrniti 0x123 x se zdaj dogaja, da se določi enako 0x123, ki slikovno, smo pogosto pripravijo kot x, ki ima dejanski puščica kaže na tem bloku. Vendar je x le shranjevanju ta naslov. Sedaj moramo preveriti, če je x null. To ni nič. Se pretvarjamo, da to malloc uspelo. Torej, zdaj zvezda x enak 50. Torej zvezda spominja, to pomeni, pojdi na ta naslov. Torej 0x123 bomo pojdi na ta naslov. Tako, da nas pripelje do tja. Kaj delamo na tem naslovu? Mi shranjevanje 50. Torej, po tej progi, da je kaj Stvari se bodo izgledal. Torej, zdaj je ni več smeti tam gor. Zdaj vemo, da je 50, da Zlasti zato, ker naslov smo jo nastavite na to. OK? Torej, zdaj bomo natisniti f. Torej, najprej bomo natisniti zvezda x. Torej, kaj je zvezda x? Again, zvezda x pomeni, pojdite na stvar, ki se kaže na x. Torej x je shranjevanje 0x123 Pojdi na tem. Smo dobili 50. Tako, da natisnete f. In to pomeni, da se bo tiskanje 50. In potem, da se vrne. In potem imamo drugo printf. Zdaj smo odstotkov p. Če še niste opazili, da je kako tiskate kazalec. Torej imamo odstotno i, odstotek f, in vse tiste že. Torej odstotkov p, natisnite kazalec. Torej x kazalec. Torej, če bomo za tiskanje x sebi, smo tiskanje, kar je dejansko v notranjosti x, ki je 0x123 Torej prva print f se bo tiskanje 50. Drugi tiskanja f se dogaja natisniti 0x123 Ja? OBČINSTVO: Ali uporabljate odstotkov x natisniti kazalec? ROB: Torej ne uporabljate odstotkov x natisniti kazalec? Torej si lahko, vendar odstotka x je le, na splošno, za podobno, če imate nekaj število in želite natisniti je kot šestnajstiško. To je samo, kako to narediš. Ker bi odstotka d natisniti kot decimalko. To je, smo dobili odstotkov d. i samo število. odstotkov p je posebej kazalce. Torej x kazalec. Želimo uporabiti odstotkov str. Ampak odstotkov x mogel delati. Ja? OBČINSTVO: [neslišno]? ROB: Ja. Vsaj za to, da sem call-- pa se ga ne vključi v igro. Vendar ta dva argumenti so nujno znotraj tega dimnik okvirja skupaj z vsemi lokalnimi spremenljivkami printf se zgodi, da se z uporabo. In potem naslednji klic printf zdaj Notranjost printf kup okvirja odstotkov p n poševnica nazaj in karkoli vrednost x je, ki je 0x123. Ja? OBČINSTVO: [neslišno]? ROB: Vse bo natisniti nekaj da je videti takole. OBČINSTVO: [neslišno]. ROB: Torej, jo natisne v naslovni obliki. Izgleda, da je naslov. Ja? OBČINSTVO: [neslišno]? ROB: Zakaj je kaj? OBČINSTVO: [neslišno]? ROB: Zakaj je ta kazalec 4 bajte? Torej obstaja cel kup od 0 let pred to. Tako da je res 0x0000000123. 64-bitni sistem, bi bilo cel kup več ničel. Ja? OBČINSTVO: [neslišno]. ROB: Torej, najprej printf bo print-- OBČINSTVO: [neslišno]. ROB: Ja, to se dogaja, da natisnete kaj x kaľe. Star pravi, kaj je to , kar kaže, da. Zgrabi. Torej, kaj je to kaže na? 50. Zgrabi. To je tisto, kar bomo natisniti. Ker naslednjič, smo samo tiskanje x sebi. Kaj je notri f? 0x123. OK. In potem, končno, imamo brezplačno. Kaj se peljemo do brezplačnega? Smo mimo x. Ta čas sem dejansko prikaže je v dimnik okvirju. Tako da smo mimo vrednosti 0x123 osvoboditi. Torej, zdaj prost ve, vse v redu, Moram iti do kopice in brez, da spomin. To je ne uporabljate več, kaj je na naslovu 0x123. Torej prost bo javnost da iz kup. Sedaj naš kup je spet prazna. Nimamo spomin razpoka. Zdaj bo brezplačno vrne. Obvestilo, da x je še 0x123. Ampak to zdaj ni veljavna spomin. Ne smemo več razrešimo x. Ja? OBČINSTVO: Je vrnitev 0 odveč? ROB: Je returen 0 odveč? Da. Pravkar smo se, da zato, ker imamo vrnitev eno za zrak. Torej, to je kot, ja, omogoča vključujejo vrnitev 0. Ja? OBČINSTVO: [neslišno]? ROB: Torej, po prostih x, kaj se zgodi, če skušamo dereference kazalca? Možno je, da gre nič narobe. Možno je, da bomo še vedno dobili 50. Možno je tudi, da je ta spomin Zdaj se uporablja za nekaj drugega. Torej je nedefinirana vedenje. In ohlapno pomeni ničesar se lahko zgodi. Ja? OBČINSTVO: [neslišno]? ROB: No, torej, če ga dodelite x na nekaj drugega. Torej, če prav tu smo rekli x enaka malloc nekaj else-- velikost malloc event-- potem, da je prvotna blok spomina ni osvobodil. In smo uradno jo izgubila. Da je pomnilnika. Izgubili smo vse reference na ta blok pomnilnika. Tako da ni tako lahko kdaj osvobodi. OK, tako da potem vrne 0 sredstvo storiti. V redu, torej kup overflow. Kaj je ideja tukaj? Torej, ne pozabite, heap gre dol. Stack gre gor. Torej, to je bil primer iz predavanj, Mislim, da, kjer je glavno le, da bo klic te funkcije foo, kar se dogaja sam poklical rekurzivno več in znova. Torej kup okvirji bodo delujejo povsem enako. Torej, bomo začeli z glavno kot spodnji dimnik okvirja. Potem glavna bo poklical foo, ki se dogaja, da bi dobili sveženj okvir. Potem foo bo poklical foo Ponovno, ki bo dobil en sveženj okvir. In potem še enkrat in še enkrat in še enkrat, in spet, dokler na koncu, tečemo v kup. Torej, to je, kako bomo dobili kup overflow. In na tej točki, boste SEG napako. Ali boš res seg napake pred ta točka, ampak ja. OBČINSTVO: Je jedro smetišče Enako kot uvodnih napake? ROB: Torej boste videli segmentacije Jedro kriv dampinški. Dobiš posmrtne ostanke, kadar si SEG napako. In je kot smetišče vseh Vsebina vašega trenutnega pomnilniku , ki jih lahko poskusite in prepoznajo zakaj SEG očitati. Ja? OBČINSTVO: [neslišno]? ROB: Torej segmentacija napak sredstvo tam je kup overflow. Torej ni nujno. Napaka segmentacija pomeni, da ste ganljiv spomin na nek način ne bi smeli biti. Torej, eden od načinov, da se dogaja, je, ko je ti kup overflow, začnemo ganljivo spomin na način, ki ne bi smeli biti. Ja? OBČINSTVO: [neslišno]? ROB: Torej znotraj neskončno zanko. Všeč mi je, da je to kot rekurzivni neskončno zanke in tako smo dobili še en Sveženj okvir vsakič. Vendar le znotraj rednega infinite medtem one-- dobro, kaj sploh je ne natisne F-- nekaj storiti. Karkoli. Mi ne bomo dobili en sveženj okvir. Mi smo šele tekoč, da loopinga preko tega enotnega pouka. Sveženj ne narašča. To je dejstvo, da je vsak rekurzivno Klic se nam daje sveženj okvir. Zato smo dobili prekoračitev. Ja? OBČINSTVO: Torej, če si rekel, da bi dobili while zanko in nato [neslišno]? ROB: Torej, če znotraj while je bil printf, še vedno bi ne seg krivda. Nisem želite zamenjati stvari. To bi zanka. Ti bi dobili en sam kup okvir za printf. Potem bi printf vrniti. Potem pa spet bi zanko. Ti bi dobili en sam kup okvir za printf. To bi vrnil. Enotni kup okvir. Tako da ne boste dobili to neskončno kopičijo žetonov okvirje. OBČINSTVO: [neslišno]? ROB: Da. Tako da je ta kup overflow zgodi ker nobeden od teh klici na foo se vračajo. Torej, če se bomo vrnili, potem bi zgubil žetonov okvirje. In potem ne bi kup overflow. In to je razlog, zakaj morate osnovni primer za vaše osebne funkcije. Ja? OBČINSTVO: Ali je možna velikost in kup za kup isti za vsi programi? ROB: Približno. Je možna velikost dimnika in kup enaka za vse programe? Grobo. Obstaja nekaj naključnost za kjer se začne konzoli in kjer je kup začne. Če se zgodi, da imajo cel kup globalne spremenljivke in stvari, boste morda vzeti nekaj prostora za vaš kup. 64-bitni sistem, boste skoraj imajo neskončno spomin. Obstaja samo toliko. Med 32-bitno in 64-bitno, da je pomembna razlika. Boš dobil celo veliko več kup in kup prostora na 64-bitni sistem, ker je le več naslovov, ki jih lahko uporabite. Ampak na individualni sistem, se bo je približno enaka količina dimnika in kup prostora. V redu. Torej, zadnja stvar, ki je kompilacija. Torej bi morali vedeti, ta proces. Obstajajo štiri velike korake. Torej, prvi naj bi enostavno zapomniti. Predobdelava. To ima predpono pre v njej. Torej, gre pred vsem ostalim. Stvar za zapomniti je hash. Tako definira hash hash in vključuje v vseh tistih. Tisti, ki so vse pre-procesor direktive. To so stvari, ki so pre-procesor skrbi. Torej, kaj pre-procesor storiti? To je res neumno stvar. Vse to je mogoče, so vse te kopiranje in cut in paste operacije. Torej hash vključuje standardni i0 dot h. Kaj je to početje? To je oprijemalne standardni I0 dot h datoteko in jo prilepite v zgornji kjerkoli se pravi hash vključuje standardna i0 dot h. In vsak hash opredeliti, da smo jih videli, kaj se da delaš? Njena kopiranje vrednost tega hash definirano je opredeljena kot in lepljenje, da kjerkoli ste s pomočjo vrednosti. Torej Predprocesor samo ne zares Operacije, ki temeljijo preprosta besedila. To počne nič pametnega. Torej, vse ostalo je bolj zapletena. Torej sedaj, da je Predprocesor done, smo dejansko zbere. Torej, kaj zbiranju pomeni? Sedaj gremo z oznako C na zbirniku. Ja? OBČINSTVO: [neslišno]? ROB: Ja, smo jo ujeli, da je. Torej sestavljanje. Gremo od c do montaže. Torej je to dejansko spremeni jezik. Se zbiranje pomeni da se iz višji ravni jezika, da jezika na nižji ravni. In c je jezik visoke ravni v primerjavi z montažo. Kakšna je montaža? Njeni navodila, ki so precej veliko, je za vaš CPU. Ampak računalnik še vedno ne Ne razumem montažo. To samo razume tiste ničle. Torej je naslednji korak, montaža, ki nas pripelje iz teh navodil, ki vaš CPU razume in dejansko jih prevaja, da tisti in ničel. Torej C za montažo v binarno. Vendar nimam še izvršljiv. Tako da mislim knjižnice CS50. Smo vam z binarno to CS50 knjižnica, ki ima GetString in GetInt in vse to. Vendar CS50 library-- v in itself-- ni izvedljiva. To nima glavno funkcijo. To je samo kup binarno ki jih lahko uporabite. Tako povezovanje je, kako združiti vse teh različnih binarnih datotek v dejansko izvedljivo. One, ki jih lahko vnesete dot poševnica piko ven. Torej, to je, da datoteka, ki vas zapisal, - ne glede na vaš program je-- Ceaser dot c. Toda zdaj se je zbrala navzdol, da binarno. Torej Ceaser dot o. In to je naš CS50 knjižnice binarno. In oni so se združili v enotno izvršljiv. Ja? OBČINSTVO: [neslišno]? ROB: Torej, najprej vključuje, ne pozabite, hash vključuje dejansko pre-procesor korak. Ampak to je ločeno. Če ne uporabljate nobene funkcije, ki so izven vašega eno datoteko potem, no, da vam ni treba povezati vse saj imaš vse. To je dejal, printf, ki naj bi bil povezan. Če boste kdaj uporabiti printf, da je nekaj da je treba povezati v ker niste napisali, da je. In, v resnici, printf je samodejno povezani. Saj veste, kako v ukazni vrstici ali ko tipkanjem, da boste videli, da imajo dash l CS50, ki ima povezavo v knjižnici CS50? Printf, in podobne stvari, ki se dogaja da se povežejo samodejno. Katera koli druga vprašanja o ničemer? OBČINSTVO: [neslišno]? ROB: Povezovanje? Imamo cel kup različnih binarnih datotek. To je kanonično primer ki jih uporabljamo, je CS50 knjižnico. Smo zbrani in vam na binarni za to CS50 knjižnico. Želite uporabljati GetString v vašem programu. Torej greš in uporabite GetString. Vendar brez mojega binarno kodo za GetString, ko zbere kodo navzdol, ne moreš dejansko zagnati vaš Program ker GetString String je še ni bila popolnoma določena. To je samo takrat, ko boste povezali v moji binarno ki vsebuje GetString, da je zdaj vse Dobro, sem lahko dejansko izvršiti GetString. Moja vloga popolna. In ne morem teči to. Ja? OBČINSTVO: Ali vezno pretvorbo binarni izvršljiv? Torej, tudi če nimate drugega knjižnice, ne bi bilo še vedno potrebno prevesti [neslišno]? ROB: Torej izvedljiva je še vedno v binarno. To je samo združuje v celoto kup binarnih datotek. OBČINSTVO: Najlepša hvala. ROB: Ni problema. Še kakšno vprašanje? Drugače, smo vse pripravili. V redu. Hvala. [APLAVZ] OBČINSTVO: Hvala. ROB: Ja.