[Powered by Google Translate] [4 teden, Nadaljevanje] [David J. Malan - Harvard University] [To je CS50. - CS50.TV] To je CS50, in to je konec tedna 4. Torej nekaj dobrih novic in nekaj slabih novic. Brez predavanja v ponedeljek, ni problema določiti naslednji teden. [Študenti navijajo] Saj ne bo všeč, kam to pelje. Ampak imamo to namesto naslednjo sredo, in tam je tudi po predmetniku 1 predavanju petek naslednji petek, tako da lahko ostanejo na pravi poti. Vendar se bo vse posnel kot ponavadi, tako da ne skrbi. In glede na kvizu 0, kaj bomo storili proti koncu tedna se objavijo na domači strani teku je cs50.net pojasnilo za kakšno pravo ne bi smeli imeti, ko gre za prvi kviz. Na splošno bo več izbire, true-false, kratek odgovor, kratki kodiranje težave. Ne boš se pričakuje, da bo izvajanje enakovredno problem, ki bi ga vidite na pset, za katerega imate računalnik in razhroščevalnik in podobno, vendar pa bo mala kodiranje težave. In res najboljši vodnik, da bi dobili občutek, kaj CS50 kvizi so kot je, pojdite na cs50.net, pojdite na kvizi povezavo, in si lahko ogledate v zadnjih nekaj letih vredno kvizov. Zavedajte se, da je učni načrt ni bil vedno enak v preteklih letih. Včasih smo dodali, včasih odštevati, tako da, če boste videli nekaj temo na eni od tistih starih kvize da nimate pojma, kaj je govoril, da je bodisi, da smo si ga pokriva ali da nismo pokriti. Toda v obliki ocen, to nedeljo, ponedeljek in torek pa tudi seveda po vsej seji o pregledu v nedeljo zvečer - čas in kraj, da se objavi na spletni strani seveda je - da imajo vsi priložnost, da pregledamo z učnimi teku je štipendistov Material za letošnje leto, in sicer v delu, in kot cel razred, in bodo tisti posnet kot ponavadi, pa tudi. V redu. Torej, brez odlašanja, ena pripomba o ustreznosti / neustreznosti in dodajte / padec. Morda ste videli moje zapiske sinoči, in to je res samo nekaj dodatnih pozavarovalnih da, če ste med tistimi, še posebej manj udobno ali nekje vmes in imate občutek, samo malo čez glavo, zavedajo, da je res čisto normalno, in tam je ogromno podporne strukture v mestu, od katerih delovni čas so nameravali o izboljšanju vse več na moj e-poštni sinoči, in spoznali tudi, da je možnost, kot je / neustreznosti za razred, kot je ta Res je mišljena kot mehanizem, da sprejmejo robu off iz predmeta, kot je ta, tako da še enkrat, če ste preživeli te 10, 15, 20 ur samo poskušam dobiti nekaj pset za delo in veste, da ste 90-95% poti tja vendar ne morete najti nekaj prekleto napako, v / neustreznosti modela, ki je nekako v redu. Ideja je, da s tem mehanizmom, lahko pa gre poudarek na vaših drugih psets ali spi ali karkoli že je, da želite, da se osredotoči na. Torej zavedaš, da ste do tega prihaja torek - tehnično 5. ponedeljek, ampak to je praznik, tako da to prihaja torek - prehod od prelaza / ne stopenjske ali obratno. In če si res na prepad in se v mislih spuščanje v celoti, prosim ulov po predavanju ali mi poąljete. Radi bi vsaj klepet, preden ponudbo poslovi. V redu. Tako smo začeli jemati za usposabljanje kolesa off zadnjem času. Predvsem smo se osredotočili na vrvico. Niz je nekaj, kar je deklarirano v knjižnici CS50, posebej v datoteko, imenovano cs50.h ki jih bomo začeli iskati v tem tednu in dostavo. Toda niz je res samo nekaj poenostavitev To je malo več arcanely opisali kot char *. Char smo seznanjeni. To je samo en znak. Ampak * označena kot v ponedeljek kaj? >> [Študent] kazalec. Kazalec. In kaj je kazalec? >> [Študent] naslov. To je kot naslov, lokacija v pomnilniku. Kaj je naslov ali lokacijo ali spomin? Spet imamo vsi prenosniki s koncertom ali 2 GB RAM-a, najverjetneje v teh dneh, in to pomeni, da imate milijardo ali 2 v vrednosti milijardo bajtov pomnilnika. In to sploh ni važno, kaj je fizično izgleda, vendar se o veri, ki jih lahko oštevilčite vse posamezne bajte, da svoj prenosni računalnik ima - To je bajt 0, to je bajt 1, to je bajt 2 milijard EUR - in to je točno to, kar računalnik ne. Ko dodelitev prostora za en znak, na primer, je očitno mora nekje živeti v spomin računalnika, in morda je na številki 12345 bajtov, in da je nekje tukaj v spomin računalnika. In potem naslov tega učinka je 12345. Zdaj, v tednu 0 do zdaj tako daleč, da smo v resnici ne skrbijo kjer so stvari, shranjene v pomnilniku, saj se običajno uporabljajo simboli, spremenljivke, in nizi dejansko dobil na naših podatkov. Ampak kot v ponedeljek in vse več je danes, ste zdaj dogaja, da imajo vse bolj izrazite sposobnosti za pisanje programov da res manipulira z računalnikom spomin pa se vam zdi primerno, tako za dobre namene in slabih, napake pa zelo pogost rezultat na tej točki učenja te stvari. Toda kaj to v resnici pomeni, da je char *? Pojdimo nazaj - in se bomo vrnili k Binky, kot je obljubil danes. Pojdimo na preprost primer tukaj. Naj shrani sliko kot compare.c, in dovolite mi dobili nekaj predlogo kodo tukaj Tako so stdio.h, dovolite mi, da tudi sam vključujejo cs50.h. Jaz bom tam povečavo. Naj začnem pisati glavni int, glavne (ničen), zdaj pa želim narediti nekako takole: printf ("Daj mi niz:"), nato pa bom uporabil niza s gets GetString da bi dobili niz od uporabnika, nato pa bom vprašal si za drugo. ("Daj mi še niz:") in bom od njih zahteva, da se prek GetString to. Poklical bom to t, saj ne prihaja po tem, ko je in s je lepo ime za niz, če je precej splošen. Torej GetString, zdaj pa želim narediti sanity check in bom rekel if (i == t), potem bom samo povedal, da si printf ("Vnesli enako \ n!"); pa bom izpisal nekaj podobnega ("ste vnesli nekaj drugega! \ n") ali karkoli se bo stavka bo. Torej nekaj takega. Potem pa kot ponavadi, se bom vrnil 0, ki je pomenil le, da ni nič slabega zgodilo, in bom, da gredo naprej in Prevedite in poženite ta program. Ampak v ponedeljek sva tekla ta program, in so bili dejansko povedal, da ni HELLO Pozdravljeni in adijo ni poslovila. Obnašanje smo videli, je bilo malo več kot to. Naj grem v mojo izvornega imenika povečaj tukaj, dajmo narediti primerjavo. Zbrani v redu. Naj teče primerjati. Daj mi niz: Pozdravljeni. Daj mi še eno zahtevo: Pozdravljeni. Ste vnesli nekaj drugega! No, naj jaz poskusim nekaj enostavnejša kot 50, 50 let. Ste vnesli nekaj drugega! hi, hi. Torej je jasno, kaj se dogaja tukaj. Ampak kaj je razlaga, zakaj? Očitno je linija 12 je popolnoma disfunkcionalna. Kaj je temeljni problem tukaj? Ja. >> [Študent] To primerjavo naslove. Ja, točno tako. To je pravzaprav primerjali naslove , v katerem so shranjeni in HELLO Pozdravljeni. Ni primerjave s črkama HELLO znova in znova, zato, ker je tisto, kar se je res zgodilo, ves ta čas smo bili z GetString - Ta tabla je spet našega računalnika pomnilnika, in recimo, da sem poklical GetString po razglasitvi spremenljivke s. Kaj pa moj spomin videti? Naj povem, da je samovoljno izgleda takole. To je kvadrat. In precej kadarkoli sem narisal košček spomina na zaslonu če je 32 bitov sem bila risba kvadratov, kot je ta, ker seveda v napravo, kazalec, naslov, je 32 bitov. To je enako kot pri notr. To je lahko različen glede na računalniški sistem. Tisti, ki so vsaj bežno seznanjen z dejstvom, da je vaš Mac ali PC je 64 bitov, ki dejansko pomeni, da je vaš računalnik uporablja 64-bitne kazalce, 64-bitne naslove, in med upsides, da je v vaši računalniki Lahko imajo veliko več RAM-a, kot minulih dni. Skratka, nazaj v dan, ko računalniki uporablja le 32 bitov za zastopanje naslovov, lahko največje število bajtov, ki ga predstavljate v tem primeru je bilo kaj, če imate 32 bitov? Torej 4 milijarde EUR, prav, ker 2 do 32 znaša 4 milijarde EUR. Ta številka je bila ponovitev v teku. Torej, če imate samo 32 bitov, kar je najvišja številka lahko računate, da je približno 4 milijarde. Toda to je bilo temeljno omejitev računalnikov do pred nekaj leti ker če se lahko štejejo le v višini 4 milijarde EUR, ni važno, če ste kupili 8 GB RAM-a ali celo 5 GB RAM-a; ne moreš računati, da so visoke, tako da je bilo zaman. Lahko samo do prve 3 ali 4 GB pomnilnika računalnika. To je manj vprašanje zdaj, in lahko kupite MacBook Pros in Dells z 8 GB RAM-a ali celo več teh dneh. Ampak, če sem namenijo preprosto v tem programu kazalec, kazalec se imenuje i, je lahko videti takole na zaslonu, saj res moramo nazaj lupino tej plasti. Držim rekel niz, ampak kot ponedeljek, niz je res char * naslov neke značaja. Dajmo torej, da se usposabljanje kolesa off, čeprav bomo še naprej uporabljali GetString za zdaj. Tako sem prijavljeni s, in to je kos pomnilnika, 32 bitov. Kaj je tukaj v spomin na privzeto? >> [Neslišno študentski odziv] Kaj je to? >> [Študent] Garbage. >> Garbage. Točno tako. Če ste programer ne dajo vrednosti v spremenljivko, ki ve, kaj je to? Včasih boste dobili srečo in da je 0, kar je nekako lepo, čisto privzete vrednosti, ampak kot smo videli v ponedeljek, včasih je popoln nesmisel, nekateri res velik pozitivno ali negativno število, ki je prišel od kje? Ja. >> [Študent] Funkcija prej. >> Ja. Pogosto je funkcija, ki se imenuje dobil prej, saj se spomnite, kot praviš funkcije v spominu, da zavzamejo več prostora od spodaj navzgor, in takoj, ko se vrne, dobi ponovno, da spomin z moškimi, ki dobi poimenovanje, ki je s svojim isti kos pomnilnika. In če ste levi smeti tam, prejšnje vrednosti, lahko bi zamenjali S imajo neko vrednost, če res nismo ničesar dal tja. Torej, naša RAM v tem trenutku izgleda. Sedaj na desni strani proge 7 smo kličeš GetString, ki smo jih zdaj počne nekaj tednov, vendar kaj GetString res delaš? GetString napisal CS50 osebja je malo inteligentni v tem, da takoj, ko uporabnik začne tipkanje tipke in zadetki Enter, GetString številke, koliko tipkanja naredil uporabnik, hit koliko znakov moram dodeliti pomnilnika za. In če to RAM prihaja, kdo ve? To je nekje na 2 GB računalnika ali drugih malenkosti spomina. Vendar pa si predstavljajmo, da je računalnik najti prostor za besedo HELLO tukaj. Beseda sem tipkal je H-E-L-L-O. In če potegnemo to kot zaporedje znakov, bi jih lahko pripravi takole. Ampak moram storiti, 1 dodatno stvar. Kaj spada na koncu vsakega niza v C? Null lik, ki smo ga napisali v \ 0. To je tehnično številka 0, vendar poševnico naredi vse jasnejši da je to dobesedno število 0, je celo število 0; ni, na primer, citiram, konec citata 0, da bi vpišete na tipkovnici. Torej, to je Pozdravljeni. In kaj smo rekli v ponedeljek, da deluje kot GetString je dejansko vrnil vse te tedne? To se ne vrne niz, ki sama po sebi, saj ne res so se torej ker strune ne obstajajo. Oni so neke vrste izdelavo v CS50 knjižnici. Kaj je res niz, bolj tehnično? >> [Študent] To je prvi znak. Točno tako. To je čisto preprosto naslov prvega znaka, da si vtipka Torej, če je moja beseda HELLO ga konča pri bajti 123 številko, potem pa na številko 124 bajtov, 125, 126 in tako naprej, če sem številne moje bajte od 0 gor, kaj res GetString se vrača dobesedno številka 123. Torej, kdo bo dal vs je številka 123, ne črka H, ​​ni beseda HALO, preprosto naslov, na katerem je mogoče najti prvo črko Pozdravljeni. Toda to ne zdi dovolj. Vprašal sem te za niz in ne znak. Torej, kako bomo vedeli, ali je računalnik, ki Ello nekako prišel skupaj s H? Kaj je vrsta pogodbe, kar imamo? Ja. [Študent] Drži se govori, da bi našli nekaj več znakov. >> Točno tako. Tam je ta človek-računalnik, s katerim konvencija, ko se ukvarjajo s strunami, sicer znano že kot char zvezd, preprosto morali ugotoviti, kjer je konec vsakega niza v življenju, ki jih res samo ponavljanjem nad njo z za zanke, while zanko, karkoli, tako da, ko je bil konec niza Zdaj lahko sklepala, oh, cela beseda je bila Pozdravljeni. Tisti, ki ste se s predhodnim izkušenj pri načrtovanju morda ve v Javi lahko samo pokličite. dolžina in tudi v drugih jezikih, lahko pokličete dolžino ali podobno. To je zato, ker v veliko jezikov, še posebej stvari, ki se imenuje objektno usmerjenih jezikov, dolžina nekaj, kar je nekako Encapsulated notranjosti kosa podatke sam, toliko, kot smo Encapsulated ID in imena hiš in stanovanj v notranjosti, da je študent v ponedeljek. Ampak C je precej nižja raven. Ni predmete ali razrede, če ste slišali te besede prej. Vse, kar morate res pomnilniške naslove. Torej, to je nekako staromoden način predstavljajo zanimive podatkovne strukture. Imate začetno vrednost, kot je naslov prvega znaka in potem samo nekateri samovoljni dogovor, da se vsi strinjamo, da jim sledijo. Torej, kako je dolžina niza izvaja, pa predlagamo? Strlen, strlen, ki ste nekateri zdaj uporablja nekajkrat. To je zelo preprosto, kajne? Je kot 2 vrstic kode. To je precej za zanko neke vrste, morda z dodatnimi lokalne spremenljivke. Ampak strlen mora samo sprejeti kazalec in nato začne iskati \ 0. In takoj, ko ga najde, se lahko vrne skupno število korakov, ki jih je bilo sprejetih v nizu. Tako lahko sklepamo iz tega, kar se dogaja naprej. Recimo, potem izjavljam, t, kot sem naredil v vrstico 10. To je nekaj smeti vrednost. Kdo ve, na prvi pogled? Toda na desni strani črte 10 kličem GetString znova. Kdo ve, če je to konča? Naj povem, da samovoljno operacijski sistem najti prostor za to pot tukaj. Slučajno sem po naključju tip H-E-L-L-O znova in tako lahko potegnemo enake slike. Toda dejstvo, da sem novo razdelila to sliko je namerno ker je to drugačna HELLO od tega. Torej, tukaj je lahko to mesto 456, to je 457, in tako naprej. Torej, kaj naj dobi, kjer je bil nekoč vprašaj? V tem primeru 456. Mi smo pobral te številke samovoljno, ker res danes po mi ne bo mar, kaj je naslov, je vse. Vse nas skrbi, je, da lahko ugotovimo, naslov neki kos podatkov, kot Pozdravljeni. Torej, res tisto, kar večina ljudi v računalništvu, ko govorimo o pomnilniških naslovov in govori o kazalci posebej, ne trudi ugotoviti, 123 - koga briga, če je ta stvar sploh je, Vemo samo, da je na neki številčni naslov - poenostavimo svet in samo rečem, da je to kaže na značaj in ne kaže na to značaja. In dejstvo, da je puščica je povsem namerno ker dobesedno zdaj je obrnjen na uro in t kaže na drugi H saj na koncu dneva, to ni važno, kaj je naslov, vendar pa glede na to, da imamo možnost, da izrazijo ta naslov z nekaj del kode. Nismo res manipulira teh naslovov samo še tako da bomo videli, kje bomo lahko interject in nekako stvari s kazalci, vendar za zdaj 12 v skladu dobesedno katere vrednosti smo primerjali v skladu s to zgodbo v vrstici 12? Mi smo rekli, je enaka višini 123 456? In to zagotovo ne velja. In celo pojmovno, ta kazalec vsekakor ni isto kot to ker si poklical GetString dvakrat, in GetString ne poskuša biti super pameten, ne poskuša uresničiti, oh, ki ste ga vnesli HELLO 5 min; Naj vam dam enako kot kazalec sem ti dal prej, je samo dodeli novo kos pomnilnika, vsakič, ko ga pokličete. Torej, kako bomo rešili ta problem? Če višja stopnja želim primerjati nize Pozdravljeni in HELLO - Me ne zanima kazalci - kako naj grem o odgovoru na vprašanje, si uporabnik vnesite isto stvar? Kaj je treba tu? Ja. [Študent] Uporabite funkcijo. >> Morem uporabiti funkcijo iz škatle. Lahko uporabite funkcijo imenovano strcmp, s-t-r-c-m-p, samo skrajšano različico rekel niz rezultatov. In če gremo v, na primer, primerjati 2, ki je med zapiski današnjih Jaz storiti točno to. Obdržal sem vse, kar je ostalo od iste črte na 1 do 26 ali tako, in zdaj opazil ta del se je spremenila le malo. Naj prezreti linijo 28 za trenutek in se osredotočiti samo na to. Kaj smo rekli, da je ponedeljek str primerjati ne? Skrbi proces sprejemanja 2 kazalce, s in t, v tem primeru, nekako tako rekoč uvrstila prstom na tiste 2 črk in kaj je treba storiti, je nekaj podobnega, medtem ko zanke ali za zanke, in pravi, da je to isto? Če je tako, se premika prste, ali kazalce naprej. Ali so ti isti, ti isti, to isto, ti isti, to isto? In oh, sem na koncu niza, tako na s in t. Nisem našel nobenega protislovja. Ja, ti nizi so enake. In kaj str primerjavo donosov, če 2 niza sta enaka, očitno? Zero. Torej, 0 je dobro v tem primeru, ker če se vrne -1 ali 1, to pomeni, da je slučajno prišel pred t po abecedi ali po t. In zakaj bi bilo koristno imeti funkcijo, ki vam pove, kateri niz prihaja do ali po v slovarju? [Študent] iskanja. Iskanje >> in razvrščanju. Tako lahko narediš stvari, kot binarno iskanje ali mehurček razvrstite ali zlivanjem , kjer boste morali primerjati stvari. Tako daleč smo že vrsto zmanjšanje nekaterih kotičke in samo govorili o razvrščanju v okviru številk, ker je lepo in enostavno govoriti, vendar lahko zagotovo primerjati nize, jabolka in banane, ker če je jabolko znano, da pridejo do banan, podobno, lahko premikate po nize v spomin, tako kot Rob naredil z neke združevanje v videoposnetku in smo tukaj na odru z izbiro vrste, vstavljanja vrste, in mehurček razvrstite. Torej, kam bomo lahko to? Poskusimo tole. Naj nekako pozabili, da je lekcija za trenutek in poskusite zdaj, in kopiranje 1.c storiti naslednje. 21 V skladu pravim tiskanje nekaj, potem grem niz od uporabnika, potem bom to v redu. Nismo zares prišel v to navado še ni, vendar naj zdaj to. Poglejmo resnici Odlepite tej plasti. To je res char *. Ta tip je res char *. Torej, kaj to pomeni, da se preveri, če ih == NULL? Izkazalo se je, da če pokličete funkcijo kot GetString ali bolj na splošno samo od računalnika, da vam nekaj pomnilnika, kaj bi lahko šlo narobe. Lahko bi bilo noro in prosi računalnik za terabajt pomnilnika ga prosi za miljard bajtov pomnilnika, ki ga preprosto ne obstajajo v računalniku, ampak GetString in druge funkcije potrebujejo nek način kričati na vas če ste zahtevali preveč. In tako GetString pa je to, če ste zahtevali več pomnilnika kot je na voljo v računalniku, tudi če je to zelo, zelo majhna verjetnost ker nihče od nas ne bodo vnesite bilijon znakov in nato pritisnite tipko Enter, vendar majhna verjetnost, čeprav je morda, jaz še vedno želim, da preverite to samo v primeru, in posebno vrednost, ki GetString, odgovor, in druge funkcije vrne če je kaj narobe, je NULL v vseh kape. In kaj je NULL? NULL prav tako se zgodi, da predstavlja kazalec. To je pomnilniški naslov 0. Svet je odločil, da samovoljno, če je to moj računalnik pomnilnik - veste kaj? - bomo ukradli samo 1 bajt pomnilnika vsakega računalnika, in to je mesto 0. Gremo mu dala vzdevek NULL, in bomo obljubljajo da ne bomo nikoli dejansko dal pravih podatkov ni saj smo samo arbitrarno potrebujejo posebno vrednost, 0, alias NULL, tako da bomo lahko kričati na uporabnike, če gre kaj narobe. V nasprotnem primeru morda ne vedo, ne pomeni, 0 dal nekaj tukaj ali to pomeni, kaj je šlo narobe? Moramo se vsi strinjamo, da NULL pomeni nič, je bila vrnjena, nima dejanskega naslova, je bila vrnjena. Zdaj, tukaj sem samo svoje ljudi sprejetju konvencije o vrnem 1 od glavnega če gre kaj narobe. To je zato, ker vrnitev konvencija glavnih je, da se vrnete 0, če je dober, 1 ali kakšno drugo vrednost, če je slabo. Toda GetString in vsako nalogo, ki se ukvarja v spomin vrne null, če gre kaj narobe. Ok. Torej, žal, linija 27, super enostavno, čeprav je popolnoma ne kopirajte niz. Zakaj? To lahko vidimo na naslednji način. Jaz sem trdila v skladu 27, da se kar kopijo s in pozval, da t. Torej, jaz ne sprašuje uporabnika za 2 strun tokrat, pravim samo vrednost v ih treba vzpostaviti tudi t. Torej, zdaj samo pokazati, kako napačno je to v skladu 29 dalje, kaj počnem? Najprej sem preverjanje, če je dolžina večja od t 0. Nekaj ​​niz tam. Vtipkali nekaj palcev Kaj je linija 32 početje, na videz? [Neslišno študentski odziv] >> desno. Lahko nekako izhajati iz tega, kar sem rekel, da to počne. Ampak tehnično, kaj je to delaš? t [0] pomeni kaj? [Študent] znak 0.. >> [Malan] znak 0.. Ali pa bolj človeški, kot so, prvi znak na t, karkoli že to je, H morda v tem primeru. In toupper ne, kaj piše. To izkorišča na 0. značaj ton in ga spremeni. Torej to pomeni, da je 0. značaj t, bi bilo veliko začetnico, in ga spravil nazaj v istem mestu. Torej, če sem tip zdravo z malimi črkami, je treba to spremeniti male črke h na kapitalski H. Ampak problem je, da v vrsticah 35 in 36, kar sem storil je izpisal nam s in t. In kaj je tvoja slutnja? Kaj bom dejansko dogaja, da vidim, če sem tipkal v zdravo v vseh male? Kaj se dogaja, da se natisne? >> [Neslišno študentski odziv] >> Kaj je to? [Študent] Big H in ostale majhne. >> Veliki H, ostalo majhno, za katera je ali ne? [Študent] Oboje. >> Oboje. Točno tako. Torej, poglejmo, kaj se tu dogaja. Naj gredo naprej in zbira to. To je copy1, zato poskrbite copy1. V redu. Zoom noter Naj gredo naprej in zagon copy1, Enter Reci nekaj: Pozdravi z malimi tiskanimi črkami. To začetnico kopijo, vendar je očitno kapitalizirana izvirniku, kot tudi, ker tisto, kar se zdaj dogaja v tej zgodbi? 27 V skladu mi dejansko ne zdi, da kopirate niz, vendar pa bi čeprav ste intuitivno upali, da bo v primeru, Če menite, da o tej sliki kaj so res sem naredil? Polovica slike je enaka. Torej roll nazaj v čas, tako da ne še ne obstaja v zgodbi. S prisotna v zgodbi, ampak kaj je zdravo male tokrat. Torej, naj določi, kaj sem dejansko vtipka V tem primeru imamo tukaj h-e-l-L-o. Mi bomo pripraviti kot zaporedje znakov, dal moje separator linij tu in moja \ 0. Torej, to je, če smo takoj linije 1 do 24-ish, gor ali dol, so usmrtili. To je slika mojega spomina. Ko pridem v skladu 27, kaj se zgodi? Tako kot prej, sem dobil kazalec, ki ga bom kot pripravo tega trga. To se imenuje t. In kaj je njena vrednost privzeto? Kdo ve? Nekatere smeti vrednost. Torej bom abstraktna, da stran, kot vprašajem. In takoj, ko je desna stran vrstice 27 izvaja, kaj sem dajanje znotraj t? Ista stvar, ki je v s. Torej, če se za trenutek odstraniti to abstrakcijo puščice in rečemo, Oh, to je spomin obremenitev naslov 123, ko rečeš ne dobi s, podpičje, ste dobesedno dajanje 123 tukaj. Zdaj, če smo nekako poenostaviti naš svet spet s slikami, kaj ste res storili, je pravkar dodali še eno puščico na vašem svetu , ki je usmerjen od t isti točen niz. Torej, če je v skladu 31 in 32 sem dejansko šel o spreminjanju t [0] kaj je t [0] očitno sinonim za zdaj? s [0] Tako, da je vse, kar se dogaja. In čeprav je ta vrsta počuti malo nizka stopnja in arcane in to nekako zdi, kot bi morda intuitivno to so samo delali - Naredil sem kopije stvari prej in je samo delal - če ste dejansko pomisli, kaj niz res, da je char *. Torej, kaj je to? To je naslov nekega učinka. Potem je to morda še bolj smiselno, da ko boste poskušali narediti nekaj super videz preprosto, kot je ta, vse, kar delaš, je kopiranje pomnilnika naslov. Ti si dejansko ne počne nič z vrvico sam. Torej, tudi če nimate pojma, kako bi lahko rešili ta problem v kodi, visoki ravni, konceptualno, kaj moramo storiti, da bi TA prepis s, očitno? Ja. >> [Študent] Daj novo lokacijo? >> Točno tako. Moramo dati T a povsem novo lokacijo. Moramo nekako ustvariti svet, v katerem smo dobili nov kos pomnilnika, ki samo zaradi večje preglednosti bom pripraviti tik pod to, pač pa mu ni treba biti tam. Vendar pa mora biti enake velikosti, tako da bom pripravi te navpične črte na istem mestu. To je v redu, če je to vse smeti na začetku. Kdo ve, kaj je bilo tam? Ampak korak 1 se bo moral, da bi me dal toliko pomnilnika, kot rabim namestiti kopijo zdravo, nato ugotovimo, kako kopirati h tu e tukaj, sem tukaj in tako naprej. Vendar bi to že počutim malo jasno, čeprav nekatere podrobnosti še vedno abstraktna. Če želite kopirati ta niz v to, da je samo za zanke ali while zanko ali kaj podobnega, s katerim ste postali vse bolj pozna. Torej, kaj je poskusiti. Naj gredo v copy2.c. V copy2.c imamo skoraj enak program, razen za linijo 27. Videti je malo zapleteno, ampak če ga razgradi košček za koščkom, Na levi strani je isto. Char * t ustvari ta stvar v spominu, čeprav z vprašajem saj ne vemo, kaj je tam privzeto. Na desni strani smo zdaj uvaja novo funkcijo, malloc, za dodelitev pomnilnika, da mi spomin, in je očitno potrebno, koliko argumentov, koliko stvari znotraj oklepajev? Slišal sem mrmljanje po 1 in 2, vendar pa je le 1. Ni vejica, kar pomeni, da je samo 1 stvar v oklepajih. Kljub temu, da je drugi oklepajev, naj poudari kaj je v najbolj oddaljenih oklepaju, in to je to izraz: (Strlen (s) + 1) * sizeof (char). Torej, če bi dejansko mislijo to skozi, to je rekel, da mi, koliko je. Zakaj sem, čeprav, dodaja 1 na dolžino? >> [Neslišno študentski odziv] Točno tako. Potrebujemo prostor za tega fanta na repu, 6. znakov, ki nima pomena English vendar pa imajo poseben programski pomen. Torej potrebujemo + 1 za to, ker strlen vrne človeško pričakovanj dolžine, Pozdravljeni ali 5, se vam ne daje dodatne značaj null. Tako sem ročno dodati to z + 1. In potem to * velikost (char), nismo videli že prej. To ni tehnično funkcijo. To je posebna ključna beseda, ki samo vam pove, kaj je velikost nekega tipa podatkov na računalniku ker v resnici, nekateri od nas ima 32-bitne računalnike. Imam precej star računalnik doma, in to šele uporablja 32 bitov za zastopanje kazalca. In tako, če sem velikost vrsto podatkov, je lahko 32 bitov. Ampak, če sem z mojo novo fancy računalnik, lahko pridem nazaj v vrednosti 64 bitov Za kaj takega naslova. Torej, v tem primeru samo, da je zelo varno, da mi ne bo težko nekaj podobnega kode - No, kaj je velikost char glede na tisto, kar smo rekli tako daleč? Smo precej dejal, verbalno, da je 1 bajt, in to je res precej čez krov. Ampak še enkrat, predpostavke ponavadi slabo. Slednji vodijo k Otroški voziček programske opreme, če ljudje uporabljajo programsko opremo na način, da ni nameraval. Torej, kaj je abstraktna to stran, samo bolj generično reči Rabim to veliko kose pomnilnika in bi vsak kos pomnilnika je enaka velikosti značaja, ki je v bistvu enaka 1 v tem primeru, ampak to je bolj splošen način pisanja. Torej, če je beseda zdravo, koliko bajtov se malloc očitno dodeliti halo? [Študent] Šest. >> Šest. Točno toliko, kot smo vprałaje na zaslonu. In nato ugibati zdaj temelji na razumevanju GetString kaj malloc verjetno vrnil? >> [Študent] naslov. Naslov kaj? Od 1. kos pomnilnika. Ne vemo, kaj je tam zato, ker nekatere druge funkcije bi bilo mogoče z uporabo te spomin prej. Ampak malloc, kot GetString, vrne naslov prvega bajta pomnilnika da je v prahi za vas. Vendar, kaj ne storiti je, da izpolnite ta slepega z znakom poševnice nazaj null ker se je izkazalo, lahko uporabite malloc dodeliti vse: ints, nizi, nizi, plava, študentske strukture. Lahko uporabite malloc povsem generičen. Ne skrbi, ali pa mora vedeti, kaj dodeljevanju pomnilnika za. Zato bi bilo drzno za knjižnične funkcije malloc postaviti \ 0 Na koncu vsakega kos pomnilnika, vas bo to daje ker je to \ 0 stvar je samo dogovor za godala. To se ne uporablja za ints, se ne uporablja za plovila, se ne more uporabiti za študente. In tako kavelj z knjižnične funkcije malloc je, da je breme popolnoma na vas programer da se spomnimo, koliko bajtov se dodeli in kdaj ne uporabljajo za zanko ali pa zanke in šel mimo meje kos pomnilnika, ki smo vam jih dali. Povedano drugače, kakor hitro dodeliti pomnilnika, ne morete zahtevati od operacijskega sistema, oh, mimogrede, kako velik kos pomnilnika, je bilo to? To je povsem odvisno od vas, da se spomnite, če boste morali to vrednost. Torej, poglejmo, kako nadaljevati uporabo te spomin. V skladu 28 in 29, zakaj počnem to? Samo skupaj Razum pregled. Samo v primeru, gre kaj narobe, sem prosil za nekaj norega količino pomnilnika ali sem toliko stvari, ki se izvajajo na računalniku, da enostavno ni dovolj pomnilnika, nekaj takega sem vsaj želeli preveriti za nično. V resnici, bo večina računalnikov vam iluzijo, da vsak program Lahko uporabite celoto vašega RAM-a, ampak kljub temu, če uporabnik vnese v nekaj norega dolg niz morda zato, ker si slab človek in oni so dejansko poskuša crash vaš program ali kramp v to, želite vsaj preveri vrnjeno vrednost knjižnične funkcije malloc in ali je enaka nič. In če ne, kaj je pravkar nehal prav zdaj, ker ne vem, kaj naj naredim v tem primeru. Kako kopiram niz? Tukaj je nekaj načinov, da to storijo. Obstajajo str kopiranje funkcij v C, vendar je super enostavno za nas, da to stori na staromoden način. Najprej naj ugotovimo, kaj je dolžina s je. Lahko bi dal to v zanko, ampak sem ga dal ven zaradi jasnosti. Torej sedaj n shrani dolžino prvotne niza, ki je očitno 5. Potem pa po mojem za zanko bom ponavljanjem od 0 do n o, in na vsaki ponovitvi bom dal s [i] v t [i]. Tako da je tisto, kar je pomenilo z mojimi prsti kazali na 2 strune prej. Ker je ta zanka se ponovi, kot je ta, da bom lahko kopirate h na tukaj, e na tu, sem na tem mestu, ker je to govorite, to je t. In potem končno, v vrstici 35 zakaj počnem to? Moram poskrbeti, da bom končal niz t. In sem ga na ta način, da je zelo jasna. Toda predlagam, nekoga, če bi lahko, na drugačen način to. Res ne potrebujejo linijo 35. Obstaja še en način, da to storijo. Ja. >> [Neslišno študentski odziv] >> Povej naglas. [Študent] Manj kot ali enaka. >> Točno tako. Mi lahko samo povem, manjša ali enaka n, ki je bil na splošno slabo ker skoraj vedno, ko gremo na enako stvar, ki smo si za štetje gremo 1 korak predaleč. Ampak zapomni si, koliko bajtov smo dodelijo? Smo namenili za strlen s, 5 + 1, torej za skupno 6. Torej, v tem primeru bi lahko naredil kaj takega tako da smo kopiranje ne le zdravo, ampak tudi \ 0 na samem koncu. Druga možnost je, da uporabite funkcijo imenovano str kopija, strcpy, vendar to ne bi bilo skoraj tako zabavno. Ampak to je vse, kar počne pod pokrovom. Potem končno, delamo isto kot prej. Sem izkoristil t, nato pa trdim, da je prvotna izgleda tako, in izgleda, da je kopija. Torej, kaj je zdaj to poskusil. Pusti me tukaj. Naredite copy2. Bomo povečanje in zagon copy2. Grem, da tip v zdravo z malimi črkami, in res sem dobil male zdravo kot izvirnik ampak glavno Pozdravljeni za kopijo. Ampak jaz nisem naredil še. Moram narediti še nekaj 1 tukaj. 46 in 47, je jasno sprostiti spomin, toda kaj to pravzaprav pomeni? Kaj počnem, misliš, da s pozivom linijo 46 in linijo 47? Kakšen učinek ima to? Ja. [Neslišno študentski odziv] >> Točno tako. Vi ste samo govoril operacijski sistem, hej, hvala za ta spomin. Sedaj lahko uporabite za nekoga drugega. In tu je odličen primer za smeti vrednosti. Pravkar sem se uporablja ta spomin zapisati besedo Pozdravljeni v 2 prostorih, tukaj, tukaj, tukaj in tukaj. Torej, to je h-e-l-l-o-\ 0. Potem pa sem poklical linijo 46 in linijo 47, in veš, kaj se tam dogaja, glede na sliki? Pravzaprav, počakaj, ta slika je stara. Ko naredimo kopijo, ta tip je dejansko kaže tukaj, tako da je odstranitev številke in samo abstraktna stran kot naše puščice znova. Kaj se bo zgodilo na tej sliki, ko sem pokličete na brezplačno? [Neslišno študentski odziv] >> Niti. Če pokličem na brezplačno S in T - nekakšen trik vprašanje - ta slika ne spremeni sploh ker kliče s in t kliče samo pove, operacijski sistem, hej, lahko uporabite ta spomin še enkrat, ampak to ne spremeni na null ali kakšen poseben znak, to ne spremeni tega, to ne spremeni h ali E ali l ali l ali Ö v vsakem mestu na karkoli drugega. Glede na sliko, takoj pokličite brezplačno, nič sprememb. In v tem je izvor smeti vrednosti, ker če bom kasneje v tem programu vprašajte operacijski sistem za več pomnilnika s GetString ali malloc ali kaj podobnega in operacijski sistem pravi, seveda, imam 12 bitov pomnilnika tako razbremenila, Uporabite jih, kaj se dogaja, da se predali? Ti boš, da se izroči kos pomnilnika, ki bi običajno pripravi z vprašaji, ampak kaj so ti vprašljiva? Se zgodi, da bo h-e-l-l-o, h-e-l-l-o. To so naši novi smetarska vrednosti takoj, ko se sprostite, da je spomin. Tam je resnični svet posledice tu. To se zgodi storiti z RAM-a, ampak si računalnike dejansko storijo enako stvar z diska. Bomo govorili o tem, zlasti s prihodnjo problem, ki se osredotoča na forenzike. Toda kaj se dejansko zgodi, če imate nekaj občutljivo finančno sliko na namizju ali nekaj površno JPEG in jo povlecite v koš, kaj se zgodi, ko jo povlecite v koš ali v koš? Vedela si, kaj sem govoril. [Smeh] Kaj se zgodi, ko ste vlekli teh dokazov v koš ali koša? [Neslišno študentski odziv] No, tako previden. Kaj se zgodi, ko si to naredil? Kratek odgovor je nič, kajne? Sketchy ali občutljive datoteka je še vedno sedel tam nekje na trdem disku. Večina nas je vsaj naučili na težji način, da morate izprazniti koš ali koš za dejansko brisanje datotek. In res, ko desno kliknite ali Control in kliknite na koš se lahko ali izberite Datoteka, Empty Trash ali karkoli in ti dejansko izpraznite koša ali koš, kaj se dejansko dogaja potem te slike? Več nič. Torej, nič se dejansko dogaja na disku. In če bomo le začasno Zastraniti in pisati - bom samo na zadnjo stran tega. Torej, zdaj zgodba se spreminja iz RAM-a, ki je, če obstajajo programi ko ste jih izvaja, na disk, ki je, če so shranjeni dolgoročno tudi takrat, ko moč ugasne, za zdaj - in se bomo vrnili na to v prihodnosti - kaj je samo pretvarjal, da je to trdi disk notranjosti računalnika ker je nazaj v dan, so nekoč okrogle diske, podobno kot diskete. Torej, če imate nekaj občutljivo datoteko Excel, lahko traja ta kos pomnilnika na disku računalnika, in sem samo risbo enako samovoljno 1s in 0s. Ko povlečete datoteko, kot je ta v koš ali pa lahko koš, dobesedno nič ne zgodi zato, ker so Apple in Microsoft je pravkar odločila, koša in koš je res samo začasno ogrado. Morda bo sčasoma OS jo izpraznite zate, vendar je običajno, da ne stori ničesar, vsaj dokler ste res zmanjkuje prostora. Vendar, ko greš na prazen koš ali s praznim košem, Podobno se nič ne zgodi, da te slike. Vse, kar se dogaja drugje na vašem računalniku, je neke vrste tabele. To je nekako kot malo stanja goljufija, ki pravi, da je, recimo, resume.doc, tako da svoj življenjepis v datoteko programa Microsoft Word, ki se uporablja za živi na voljo 123 na trdem disku, ni v spomin in ne v RAM-a na trdem disku, in vaše skicirana JPEG živi na 456 in vaš Excel datotek živi na 789 ali kamorkoli. Ko izbrišete datoteke, ki jih dejansko praznjenje smeti ali koš, Ta slika ne spremeni. The 0s in 1s na trdem disku, ne gredo nikamor. Ampak ta miza, ta mala zbirka sort, ne spremembe. Ko izbrišete svoj življenjepis, je, kot da je datoteka izbrisana v nekem smislu, ampak vse se računalnik ne pozabite, če se ta stvar živi na trdem disku. The 0s in 1s, da sestavite svoj življenjepis ali katero koli od teh drugih datotek, so še vedno nedotaknjene. Torej, če ste to naredili po nesreči, še vedno ni nič verjetnost da lahko povračilo vaše podatke z Norton Utilities ali kakšno poslovno programsko opremo katerih namen v življenju je, da je bil 0s in 1s, da so neke vrste sirota, pozabil sem pa pustil tukaj, tako da lahko dobite podatke nazaj. Ali bi forenzični preiskovalci s policijo in FBI dejansko lahko trdi disk in dejansko iščejo vzorce 0s in 1s, ki izgleda kot JPEG, izgledajo kot Excelove datoteke, in izterja jim na ta način, tudi če je računalnik pozabil tam. Zato je edini način, res izbrisati podatke, saj bomo razpravljali v prihodnosti, je za čiščenje ali izbrisati datoteko ali trdi disk - Saj ne morem znebiti 0s in 1s ker drugače boš začel z GB trdega diska in boš na koncu z megabajt trdega diska, če ste nenehno bilo brisanje dobesedno 0s in 1s. Torej, kaj bi naredil, če si res želel zakriti sledi in temeljni problem je, da je še vedno 0 in 1s na disku? Vidim nekoga, ki bi jo z rokami opletajočega fizično prekinil napravo. To bo delovalo. [Smeh] Ampak če je to neke vrste drage rešitve, kaj bi bilo bolj smiselno? Ja. >> [Študent] jih prepisati. >> Prepiši jih s čim? >> [Študent] Drugi podatki. Ostali podatki. Lahko samo prepisati disk z 0s ali 1S ali vse 0s, vse 1s. In to je tisto, kar res nekaj programske opreme, ne. Lahko kupite programsko opremo ali celo brezplačno programsko opremo, in celo vgrajena v operacijski sistem Mac OS teh dneh, manj pa v operacijskem sistemu Windows, je sposobnost za varno brisanje. Pravzaprav, če želite, da vsi vodijo domov danes, če imate Mac in to, če imaš lahko nekatere stvari v koš, lahko to storite Secure Empty Trash, ki počne točno to. Namesto da samo brisanje datotek, tukaj se ne zbriše 0s in 1s tukaj, ne, samo spreminja vse tako, na primer, 0 in pika, pika, pika. Tako bo eden od vaših prihodnjih psets dejansko namenoma povrnitev podatkov - Fotografije, ki smo ga sprejeti ljudi, krajev in stvari na univerzi za katere bomo pripravili izvedensko sliko pomnilnika digitalnega fotoaparata kartice , ki je popolnoma enaka ideja - in ne boste imeli, da bi izpodbijala dejansko najti vzorci, ki predstavljajo JPEG na trdem disku, podobno kot to bivšega študenta, čigar e-naslov sem prebral pred nekaj tedni naredil obnoviti svoje sestre fotografije. Zakaj ne vzamemo 5-minutni odmor tukaj, pa bomo združil z več pomnilnika. Torej, tukaj je, če se stvari malo um-upogibni, vendar je to zelo močan korak k razumevanju tega vse več. Tukaj je program, imenovan pointers.c. To je med današnjim vzorčne kode. Obvestilo, da je v prvih nekaj vrstic, 19 do 22, vsi delamo, je nekaj podobnega GetString in vračanje naslov, jo shranite v ih. Odslej za pset celo 3, če želite, vendar pset 4 in na kjer boste lahko začeli jemati te vrste usposabljanja koles od sebe, ni nobenega razloga, da se pretvarjamo, da strune obstaja več. Vsekakor je prav, da to šele začetek pravi char *. Naj omenim, da v spletnih referenc in v knjigah lahko pogosto videli zvezdo poleg spremenljivke. Morda boste celo videli prostore okoli obeh straneh. Vse to so funkcionalno pravilna. Za zdaj, čeprav bomo standardizirali podlagi tega pristopa, da bi zelo jasno da char *, je, kot pravi značaj kazalec. To je vrsta podatkov. In potem je ime spremenljivke je v tej zadevi. Tako smo gotten niz in smo poimenovali s. In potem tukaj opazil, da sem dejansko delal malo trikov. To se imenuje aritmetično kazalec, ki je neke vrste super enostavno. To samo pomeni, dodajajo ali odvzemajo številke kazalca. Ampak to dejansko deluje. Ta program je očitno natisne v nizu s 1 znak na vrstico, kot da je končni rezultat - Samo tako bomo lahko pokvari, če se to dogaja, da napotke, teči napotke, naj povečate palca Zdaj pa mi tip nekaj podobnega HELLO in vrsta vnesite in se natisne 1 znak na vrstico. Do pred sekundo, bi bile to storili s kvadratno notacijo nosilec. Morali bi za zanko in bi naredil printf of s [i] in sva še enkrat in še enkrat in še enkrat z poševnice nazaj n na koncu vsake vrstice. Vendar pa je ta program drugačen. Ta program se uporablja, dobesedno, računanje. Torej, kaj se dogaja tukaj? Najprej, preden se ta zanka izvede še kaj, samo, da je jasno, je, je pravzaprav? S to? >> [Študent] naslov. >> Naslov. In to je naslov, v primeru hello, prvi znak v tej besedi, ki je h. Tako je, je v tem posebnem primeru je naslov h. Torej, kaj to pomeni, da naredimo + i? No, jaz se začne pri 0 V ta zanka. Naredili smo, da veliko krat. Sem, da bo šel do dolžine niza, očitno. Torej na prvi ponovitvi te zanke, i je seveda 0. Torej, ta izraz je rekel i + i - raje se s +0--to je seveda samo s. Torej, kaj je * e tukaj? Zdaj smo z zvezdo na nekoliko drugačen način. Naj gredo naprej in se znebite t ker smo storili govorimo o t in kopij je. Zdaj smo samo želim, da povem zgodbo, ki vključuje s. In tako se v tem trenutku, potem ko so tipa string, naš svet izgleda precej kot je to storila pred s samo s shranjevanjem naslov uro in bolj na splošno kaže na niz zdravo. Če bi sedaj naredil podobno vrstico * (i + i), poskusimo to. Tako * (i + i). Naj poenostavitev zaradi tega, ker je to 0, tako da je to * (y 0). No, počakaj malo. Poenostavite naprej. To je * (ov). No, zdaj so oklepaji malo butast, sedaj pa si pač * i. Torej, v prvi ponovitvi te zanke, da črto, ki je poudarila, 26, je precej enakovredna tiskanje to. Kaj je podatkovni tip * i? V zvezi s tem, ker je zvezda zgodi, da se ob ih sam, še bolj pa, ker smo se več ne razglasitvi s, ne bomo ustvariti spremenljivko več, ni omembe char * v skladu 26, ni omenjen niz ključnih besed, smo samo z imenom spremenljivke y, Izkazalo se je sedaj zvezda nekoliko drugače, in sicer, zmedeno pomen. * S tu pomeni pojdi na naslov vs in tiskanje, kar je tam. Torej je tu, * s - nekako kot Chutes in lestve, sledite puščico - tukaj. Torej, to je * e. Torej, kaj dobi natisnjena na prvi ponovitvi te zanke v skladu 26? Sem izpisal% C, kar je ogrado za znak, Nato \ n za novo linijo. * (I + i), kjer je i 0 je samo to. Torej, kaj zna moram postaviti v za% c? H. V naslednjem ponovitev zanke - boste verjetno videli, kam to pelje - naslednja ponovitev i je seveda 1, to pomeni, da je 1, nato pa zdaj mi potrebujemo oklepajev, ker zdaj zvezda mora pisati pojdite na naslov pomnilnika ih +1. Kaj je s? Naj roll nazaj v čas, da si to puščica sedaj dejansko ne gre nam vse usluge. Naj je še posebej povedati, da je to shranjevanje številko 123 ker začetek tega niza Pozdravljeni, to je naslov 123, to je 124, in tako naprej. Torej, na drugi ponovitvi, ko sem rekel S 1, ki je, kot pravi, 123 1, drugače poznan kot 124, tako da kaj dobi znak je natisnjen na drugo ponovitev? E na 124 pomnilniškega naslova. Potem pa spet +, 125, 126, 127, in to zanko na srečo ustavi, preden smo prišli sem ker sem z strlen se prepričajte, da jaz ne šteje previsoka. Tako, da je to preveč. Tudi to je tako, kot če bi to storili pred tednom dni. Naj jo napišite na črto spodaj, čeprav ne želimo storiti oboje. To je enako zdaj to. Torej, čeprav je je niz, kot smo ga že kliče več tednov, je res char *. Torej, če želimo, da bo super analno, to je res primerno, da napišete poseben značaj na lokaciji i uporabi te številske naslove in to zvezdicami operaterja, vendar odkrito povedano, to je samo toliko čistejši. Torej, to ni slabo. Ni razloga za ustavitev dela linijo 27 tukaj, ampak 26 je funkcionalno enaka, in to je funkcionalno enaka natanko razlogov, ki smo jih do sedaj razpravljamo. In nenazadnje, 29 je le dobra praksa. Klicanje brez-ih pomeni, da zdaj ti vrača spomin, ki ti je dal GetString ker še enkrat, kot sem že omenil v ponedeljek, GetString tedne je bila uvedba napako v kodi. Vaša koda za tedne je imel spomin razpoka , s katerim ste se sprašuje GetString za spomin, vendar še nikoli niste bili jo vrniti. In da je bil namerno izbrali mi pedagoško ker je le preveč razmišljati že na začetku. Sedaj pa potrebujemo več simetrije. Če vprašate računalnik za spomin, kot je to veljalo za GetString, kot je v primeru očitno za knjižnične funkcije malloc, morate zdaj pset 4 naprej tudi brez takšen spomin. Obvestilo je drugačen od rekel int n. Ni vam treba sprostiti, ker nisi poklical GetString in nisi poklical malloc. In tudi če si klical GetInt kot bomo sčasoma videli, GetInt ne dodeljuje pomnilnik za vas, saj lahko dejansko prenesti okoli celih in plava in nabora znakov samo način smo počeli že več tednov. Strune, čeprav so nekaj posebnega, saj res oni podaljšek več znakov. Torej, oni so samo drugačna od znakov in plovcev in ints in podobno. Ampak bomo prišli nazaj, da kmalu. Vsa vprašanja v zvezi s tem potem začetku kazalcev? Ja. [Neslišno študentski vprašanje] Ah, zelo dobro vprašanje. Ena izmed redkih stvari, C, v resnici počne, za vas, ki je priročno, Številke je za vas kakšne velikosti je podatkovni tip nato pa, da je vrsta razmnoževanja za vas. To je pomembno v primeru znakov, saj je skoraj vedno znak je 1 bajt, tako da to preprosto deluje. Toda zaradi razprave, če bi dejansko tiskanje števil in ti so poskušali natisniti nekaj je vrednost, ki je kazal na celo število se prav tako ne bi bilo treba storiti + 4 * i samo zato, ker int je 4 bajte. Kazalec Aritmetična pomeni, da prevajalnik C in storiti vse, da se matematika za vas. Vse, kar morate skrbeti je štetje v nekakšno človeškem smislu. Ja. [Študent] Če ugotovi niz notranjost za zanke, imaš, da ga osvobodi kasneje? Dobro vprašanje. Če ste prijavljeni niz notranjost za zanke, se boste morali sprostiti kasneje? Morate le, da sprostite pomnilnik, ki ga dodeli z GetString ali knjižnične funkcije malloc. Torej, če si rekel kaj takega - naj povem zavitih oklepajih zdaj tako povezan vse kode. Če si naredil nekaj, čeprav je buggily, kot je ta, char * t = y, vam ni potrebno, ker brez t t ne vključuje nobene omembe knjižnične funkcije malloc ali GetString. Če, nasprotno, da si to, GetString, potem je odgovor pritrdilen, bi morali brez t. In v resnici, tvoja edina priložnost, da to, da je zdaj znotraj te zanke za isto vprašanje področja , ki smo jih obravnavali v preteklosti. V nasprotnem primeru bi se lahko dodeljevanje pomnilnika, dodeljevanje pomnilnika, dodeljevanje pomnilnika, in na koncu programa, ker ste izven te zanke, Ne, ne obstaja, ampak nikoli povedal operacijski sistem da vam ni treba, da je spomin več. In kmalu za pset 4 ali 5, vas bomo opremili s programom, imenovanim Valgrind, , ki je podoben duh v gdb, da je ni dobil nekoliko starodavnega vmesnik, ampak je njen namen v življenju je, da vam pomaga. In Valgrind je program, ki bo v prihodnosti iskati svoje programe išče spomin razpoka, bodisi od GetString ali malloc, ki jih bomo začeli uporabljati še toliko bolj, kot smo prenehali uporabljati CS50 knjižnice toliko. Končno smo zdaj nekako besedišča in vrsta duševnih modela v teoriji , s katerimi bi rešili ta zlomljeno program. Torej, v tem programu, lomljeni, swap deluje znotraj zamenjave, vendar dejansko nikoli ni delal v glavnem zato, ker glavna sprejet x in y, odpoklic, in so bili tisti, sprejet v vrednosti, ki jih, tako rekoč. Kopije njimi je bila dana, da bi zamenjali. Do konca zamenjave, je bilo res in b izmenjanih seveda pa je x in y, kot smo razpravljali v ponedeljek, ni bilo. Torej, jaz predlagam v zeleni tukaj, da je to pravzaprav rešitev tukaj. In dejansko, mi premakniti moje zvezde, samo da je v skladu čeprav, spet, funkcionalno to ni važno. V prihodnjih tednih bomo razložili, kdaj in zakaj je ne zadeva. Torej, v zeleni barvi, zdaj je rešitev. Odkrito povedano, je videti cel kup umazani, ker imam vse te zvezde. Naj opozoriti na eno stvar. V zgornji vrstici tukaj, kjer piše int * int * in b je v osnovi počne isto stvar, kot je vedno. To je razglasila 2 argumentov ali parametrov, da bi zamenjali, prvi, ki je int kazalec pozval, 2. ki je int kazalec imenovano b. Edina stvar, ki je nova v tem trenutku, je dejstvo, da je zvezda tam. Kaj to pomeni? Ni int b ni int. Je naslov notr in b je naslov drugega notr. Tukaj, to je, če priznam, C postane zmedeno. Zdaj smo z zvezdo, vendar ima drugačen pomen v tem kontekstu. Ker nismo razglasitvi kazalce, kot smo tukaj, Tukaj smo Dereferenciranje stvari. Torej, tehnično, je zvezda v tem okviru prvega, drugi in tretji liniji notranjost zamenjave se dereference subjekta, ki pomeni le tja. Torej, tako kot moj prst slediti puščico na uro, * Sredstvo pojdi na ta naslov in mi najdi int, da je tam. * B pomeni, pojdite na naslov in mimo mene, kaj je tam. Torej izvlečete slike iz ponedeljek zdaj uporabljajo sveženj okvirjev, dno od katerih se bo glavni, zgornja od katerih se bo zamenjave, tako da je naš svet je videti, tako kot v ponedeljek, kot je ta. Tukaj je kos pomnilnika, glavna bo uporabil. Spomnimo se, da je od ponedeljka program, samo je 2 spremenljivk, ena se imenuje x in y 1, imenovan, in sem dal številke od 1 in 2 obstaja. Zdaj, ko sem poklical zamenjati, kot sem storil v ponedeljek, prej, ko sem uporabil rdečo različico tega programa, ki izgleda tako, Imam 2 parametrov, A in B, in kaj pišemo tukaj in tukaj? Samo 1 in 2, dobesedno kopije x in y. Danes spremeniti. Danes namesto potujejo ints in b bomo mimo v 2 naslovov. Ti naslovi se zgodi, da kaže na ints, vendar ti naslovi niso sami ints. So naslovi. To je kot poštni naslov namesto tega. Torej, zdaj moramo samo dam malo več podrobnosti na zaslonu. To je moj računalnik spomin, kot je bilo ves dan. Zdaj moramo nekaj samovoljno oštevilčenja sistema. Torej, kaj je pravkar rekel, samo po naključju, da je to pomnilniški naslov, 123, 124. Recimo, da je to 125, to je 126, in tako naprej, ampak to je povsem samovoljno. Potrebujemo samo nekaj številk shemo v mojem spominu. Torej, zdaj, ko sem dejansko preide v X in Y, ne bom, da preide v x in y; Grem mimo v poštnem naslovu, tako rekoč od x in y tako da to, kar se shrani tukaj in tukaj ni 1 in 2, če pa si lahko ogledate mojo majhno besedilo, dobi tisto, kar sprejet v tukaj in tukaj? [Neslišno študentski odziv] >> Točno tako. 123 gets tukaj in 124 dal postaviti dobi tukaj. Zdaj, ker sem uporabil zvezdo v tem zelo prvi način zasedba tukaj na vrhu, moj program samo ve, da je 123 in 124, čeprav je to seveda cela da bi vsak človek opazil, jih je treba razlagati tako, da naslove, numerične naslove. Niso same po sebi ints, oni so naslovi, in to zato, ker sem eksplicitno zvezde tam. Torej, zdaj v svojem prvem, drugi in tretji vrsti dejanske kode Kaj se dogaja tukaj? Naj pripravijo ostale slike. NTU je tako kot je bilo v ponedeljek. Nič posebnega tmp. To je samo lokalna spremenljivka 32 bitov, in notranjost, da sem očitno shranjevanje vrednosti *. Zdaj, če sem rekel tmp =, kaj bi jaz dal tukaj? >> [Študent] 123. 123. Ampak to ni tisto, kar počnem. Pravim tmp = *. Star način tja. Torej, tukaj je, 123. Kako do tja? Pretvarjaj se, kot da je puščica. No, to je to, 1. Torej, kaj gets shranjeni v tmp, očitno? Samo 1. Torej, z drugimi besedami, je tmp * a *, sredstvo pojdite na naslov, ki je trenutno v, ki je očitno 123. V redu, tukaj smo na lokaciji 123, vidim številko 1 tako da bom dal številko 1 tam. No, kaj naj storim v vrstici 2 * = * b? Tole je malo bolj vključeni, ker, kaj je zdaj? To je 123. Tako * je kje? Točno tam, kjer sem bil prej. Torej pojdi tja. Ok. Zdaj, na koncu in se na koncu bo to začelo smisla, upajmo, * B pomeni, kaj je v B? 124. Torej moram iti tja, kar je 2. Torej, kaj sem dal kam? 2 gre v tem mestu, ker * b * gre v. Torej bom naredil. In lahko že videli, morda, da smo toliko bolj k reševanju tega neumnega, preprost problem pravilno prvič ker zdaj imamo še vedno spominjam, kaj je bilo x, imamo 2 kopije, priznam, y, ampak vrstica 3 zdaj pravi * b. Torej, tukaj je b. * B sredstvo tja. Torej, kje je lokacija 124? To je pravzaprav tu. Torej, kaj sem dal tu? Očitno je, da tmp. Zdaj sem to storiti. Torej imam tukaj in 1 2 tukaj. In kaj o vsem tem, je 123, je 124 in 1? Takoj po zamenjavi donosov, ta spomin je tako dober, kot izgubljeno ker kakor hitro zamenljivih vračanja, operacijski sistem je prost za uporabo tega spomina tudi v prihodnje. Samo spomin je glavni na dnu tega ti dimnika palice okoli. In tako smo zdaj končno delujočo različico. Naj gredo v swap.c in opazili naslednje. Na vrhu programa sem spremenil moj prototip za int * int * in b. Torej, edina stvar, ki sem spremenila, da gredo iz rdečega, ki je bila slaba, zeleno, kar je dobro, Dodal sem se te zvezde danes. Ampak potem sem dol v sam zamenjal sem moral kopirati, prilepiti, kar je bilo ravno na diapozitivu. Imam zvezdo tukaj, tukaj zvezda - ki se ujema prototip - in potem vse te stvari zdaj zvezde, razen tmp ker uporaba začasne spremenljivke, ni nič novega. Potrebujem samo začasno skladiščenje za notr. Torej ne potrebujemo zvezdo tam. Potrebujemo samo zvezdo, tako da bomo lahko čez te vrste samovoljno meje med temi 2 posnetkov v spomin mojega računalnika. Ampak ena stvar je treba spremeniti, in ti so morda zagledali že. Kakšna druga vrstica je očitno zdaj drugače? >> [Študent] in x. Ja, 25 je zadnja vrstica kode moram spremeniti, za to delo. Pred tednom dni in še v ponedeljek, linija 25 izgledala tako, zamenjajte X in Y, in je bil to samo zato, ker pokvarjen, če boste rekli swap (x, y) dajete kopije x in y, da bi zamenjali, potem počne svoje stvari, vendar si ni nikoli dejansko spreminja x in y sam. Torej, tudi če še niste videli ta znak pred s Znak za v kodo, vzemite odgovor. Kaj Znak za to očitno? [Študent] meni naslov. >> Meni naslov. Torej, znak pove, je rekel, da mi naslov x. Kdo ve, kje je? To se zgodi, da bo 123. Me ne zanima. Daj mi naslov x. & Y pomeni, da mi naslov y. In na tej točki se zgodba je popolnoma v skladu s sliko smo narisal pred nekaj trenutki. Torej bom priznam kazalci, seveda za mene, ko sem začel učenje tega, so zagotovo ena izmed najtežjih stvari za zavijanje okoli moje misli. Toda zavedati, še posebej, ko smo igrali z tovrstnimi stvarmi, če ga razčleniti na ti super enostavno nekakšno intelektualno nezanimiva težave za malo gibljejo okoli številke, odgovor na veliko zmede s kazalci Res je mogoče izpeljati iz teh zelo osnovne mehanike. Tukaj je naslov. Pojdi tja z zvezdico. Ali obratno, tukaj je znak pove. Ugotoviti, kaj je pravzaprav naslov. V redu. Torej, če je vse to prihaja iz spomina? Mi smo sestavljeni to sliko nekaj časa, in jaz vztrajati obeta se bomo vrnili k njim, ampak tu je zastopanje spomin računalnika To je malo več označen kot naš tablo tukaj. Besedilo odsek na vrhu predstavlja, kaj v zvezi s svojim programom? [Neslišno študentski odziv] >> Oprosti? Ponovi. [Študent] pravi program. >> Dejanski program. Torej 0s in 1s, da ste pripravljeni po pisanju C kodo in nato teče Jek in pridobivanje ustvarjanje 0s in 1s do konca pritegnjen je v spomin ker ko boste dvakrat kliknite na ikono na vašem Mac ali PC ali pa zaženite ukaz kot Mario na vaš poziv, vaš 0s in 1s iz diska se naloži v pomnilnik, tako da lahko računalnik njimi manipulirajo in jih izvaja hitreje. Torej initialized podatkov in nezaceto podatkov ne bomo veliko govorili o tistih, ampak to so samo globalne spremenljivke. Inicializiran pomeni globalnih spremenljivk, ki jih je dal vrednosti; nezaceto pomeni globalnih spremenljivk, ki jih še ni dala vrednosti. Potem je tu še ti spremenljivke okolja, ki bom popolnoma Wave roko na, vendar so tam in da shranjuje stvari, kot so vaše uporabniško ime in druga vrsta manjših podrobnostih ravni. Toda juiciest kosov postavitev tvoj spomin je ta stvar imenovano kup in kup. Kup še enkrat, mora biti jasno, je spomin, ki je uporabljena, kadar se imenujejo funkcije, ko so lokalne spremenljivke in vedno, kadar obstajajo parametri kroži. Vse to se dogaja v sklad. Kup nismo govorili, pa predvidevate, ki uporablja kup. Samo drug kos pomnilnika. To se zgodi, da se potegne na vrhu, toda to je poljubno slikovno konvencije. Kdo je bil očitno uporablja pomnilnik iz kup tedne? To je tehnično ti pa posredno. >> [Študent] GetString. GetString in malloc. Torej, tukaj je bistvena razlika. Veš, v zadnjih nekaj tednih, če potrebujete spomin, samo ugotovi spremenljivko. Če potrebujete veliko pomnilnika, razglasi niz pravice znotraj svojega delovanja. Ampak problem, ki smo jih hrani sooča je, če ugotovi, spremenljivke lokalno znotraj funkcije, takoj, ko se vrne, kaj se dogaja v spominu in teh spremenljivk? Samo ena vrsta ni več tvoja, kajne? To je preprosto izginil nekako konceptualno. To je še vedno fizično obstaja, seveda, ampak to ni več vaša pravica za uporabo. To je seveda problematično, če želite napisati funkcij v življenju ki dejansko dodeliti pomnilnika in je ne dam nazaj takoj. Zadeva točke: Namen GetString v življenju je, da nimam pojma, vnaprej kako velik niz jo bom s tipom na tipkovnici, vendar je dobil, da bi lahko dodelitev pomnilnika, da imajo Davida ali hello ali celo naloga, da bi lahko uporabnik vtipka Torej GetString je bil z malloc. Malloc Zato je treba uporabo ne sveženj; namesto tega pa se je s to stvarjo, imenovano kup. Nič ni drugačnega pomnilnika. To ni hitreje ali počasneje ali kaj podobnega. To je samo fizično na drugi lokaciji. Toda pravilo je, da je spomin, ki je razdeljena na kupu nikoli ne bomo vzeli od vas, dokler ne boste klic - predvidevate - brezplačno. Nasprotno, vsak spomin prosite za na kup le za razglasitev niz ali razglasitvi spremenljivke, kot smo počeli nekaj tednov, da privzeto konča na kupu. In to tovarna velik 90% časa, ampak na tiste redke priložnosti če želite dodeliti pomnilnika in ga hranite v okolici, potem boste morali uporabiti funkcijo kot knjižnične funkcije malloc. Ali smo uporabili funkcijo kot GetString, ki spet uporablja malloc. Poglejmo, če bi to lahko pokvari in nato pokukati na Binky. Pridemo nazaj, da tudi v prihodnje. Tukaj je super preprost program, ki je v prvih 2 vrstic, kaj? V angleščini, kaj pa ti prvi 2 vrstic kode narediti znotraj main? [Neslišno študentski odziv] Previdno. Ne daj mi naslov x ali y. [Študent] daje napotke za ints. Dobro >>. Daj mi 2 napotke na cela števila. Z drugimi besedami, daj mi 2 kose pomnilnika, da sem danes vodijo risbo, čeprav sem ga izbrisali zdaj, ko kvadratov. Dajte mi 2 kose pomnilnika, 1 x pozval, ena imenovana y - Poklical sem jih prej s in t - in kaj je tip ta kos pomnilnika? To se dogaja, da shranite naslov. To je tipa int *. Tako bo naslov notr na koncu živeli v x, naslov notr bo na koncu živeli v y, ampak najprej, kaj je notri x in y? Kdo ve? Garbage vrednosti. To nima nič opraviti s kazalci. Če nismo dal nekaj, kdo ve, kaj se je dejansko tam? Zdaj x. Kaj se dogaja tukaj? To je zakonit zdaj, ker je x kazalec. To je int *. Torej to pomeni, da bom lahko dal v x naslov neke kos pomnilnika. Kaj malloc vrne? Odlično, se vrne naslove, naslov prvega bajta v celoti kos pomnilnika. Koliko zlogov je to očitno razporeditev, na primer v napravo? Kakšna je velikost notr? 4. Če menite, da nazaj v 1 tednu, to ni zelo pomembno, da se vedno spomnim, da vendar v tem primeru je koristno vedeti, 4 bajte. Torej, to je dodeljevanje na kup 4 bajte in to je vračanje naslov prvega do mene samovoljno. Zdaj, kaj je x delaš? * X = 42 počne kaj? Če na tej točki v zgodbi imamo x, ki je videti takole z nekaj smeti vrednosti, to je zdaj y z nekaj smeti vrednosti, ki je zdaj v 3. vrstici sem dodeljena 4 bajte. Ta slika bistvu izgleda tako. Ali natančneje, če je to samovoljno naslov 123, to je tisto, kar naša zgodba sedaj izgleda. * X = 42 zdaj pomeni kaj? To pomeni, da gredo na naslovu 123, in to število 42 tam. Ne rabim, da pripravi te vrstice, ker mi ne gre niti. Moral bi samo napisal takole, in samo zaradi demonstracijskega je, 42 kot int vrste zavzema veliko prostora, 4 bajte. Tako da je tisto, kar se je zgodilo, vendar pa je problem zdaj. * Y = 13. Kaj se bo zgodilo tukaj? Problem je * y v našem svetu poenostavljeno pomeni samo, pojdite na naslov v y. Kaj je v y? To je nekaj smeti vrednost. Torej, kaj je domnevati, da smeti vrednost je 5551212, nekaj noro všeč. * Y sredstva šla za reševanje 5551212. To je všeč tukaj. To ne obstaja, na primer. Tako * y dobi 13 pomeni, da sem poskušal oblikovati 13 tukaj. To ne obstaja. Sem presegla segment tabli. Kaj dobim? To skrivnostno sporočilo segmentacije krivda, ker sem poskušal dati v spomin vrednost kot 13 na mestu, ki ne obstaja. Preostali del programa bo delovalo v redu, ampak do takrat pa ne. Torej, kaj je poskušal povedati to zgodbo. Vrnili se bomo v tem, ko smo govorili o hex. Vrnimo se k temu, in sklene s to stvarjo, imenovano Binky, ki odpoklic je profesor na Stanfordu sedel doma igrajo z claymation, povedati zgodbo o povsem isti program. To je le približno 3 minut. Tukaj imamo Binky. [Moški govornik na videu] Hej Binky, zbudi se. Čas je za zabavo kazalca. [Binky] Kaj je to? Več o kazalci? Oh, vrlina! [Moški govorec] No, za začetek, mislim, da bomo potrebovali nekaj nasvetov. [Binky] Ok. Ta koda razdeli 2 kazalce, ki lahko opozorijo na cela števila. [Moški govorec] Ok. No, vidim 2 kazalci, vendar se ne zdi, da je treba poudariti, da nič. [Binky] Tako je prav. Sprva kazalci ne kažejo ničesar. Stvari, ki jih kažejo, da so ti pointees in njihovo vzpostavitvijo, je ločen korak. [Moški govorec] Oh, v redu, v redu. Vedel sem, da je. V pointees sta ločena. Hm, tako da kako dodeliti pointee? [Binky] Ok. Ta koda dodeli novo celo število pointee, in ta del določa x opozoriti na to. [Moški govorec] Ej, to izgleda bolje. Zato bi bilo nekaj narediti. >> [Binky] Ok. Jaz bom dereference kazalca x shranite številko 42 v svojem pointee. Za ta trik bom potreboval mojo čarobno palico Dereferenciranje. [Moški govorec] Vaš čarobno palico za Dereferenciranje? To je super. [Binky] To je tisto, kar koda izgleda. Jaz bom ustanovil številko in ... [Živahen zvok] [Moški govorec] Hej, poglej, tam gre. Tako početje dereference na naslednji način x arrow dostop do svojega pointee, v tem primeru za shranjevanje 42 tam. Hej, poskusite z uporabo shranite številko 13 po drugi kazalec, y. [Binky] Ok. Jaz bom šel tja do y in dobil številko 13, ustanovljen in nato z palico Dereferenciranje in ... [Brenčanje zvok] Vau! [Moški govorec] Oh, hej, to ni delovalo. Recimo, Binky, jaz ne mislim, Dereferenciranje y je dobra ideja ker vzpostavitev pointee je ločen korak in jaz ne mislim, da smo ga sploh je. [Binky] Hm, dobra točka. [Moški govorec] Ja. Smo namenili kazalca y, vendar mi nikoli ne nastavite tako, da pokažete na pointee. [Binky] Hmm, zelo pazljiv. [Moški govorec] Hej, ti si videti dobro tam, Binky. Ali lahko to popravimo tako, da y opozarja na istem pointee kot x? >> [Binky] Seveda. Uporabil bom svojo čarobno palico naloge kazalca. [Moški govorec] je, da bo problem, kot prej? [Binky] No, to ne dotikajte pointees. Prav tako se spreminja 1 kazalec, ki kaže na isto stvar kot drugi. [Živahen zvok] [Moški govorec] Oh, vidim. Zdaj y opozarja na istem mestu kot x. Torej, počakajte. Zdaj je določen y. Ima pointee. Tako lahko poskusite palico Dereferenciranje ponovno poslati 13 več. [Binky] Uh, v redu. Tukaj gre. [Živahen zvok] [Moški govorec] Hej, poglej si tole. Zdaj Dereferenciranje dela na y. In ker so kazalci v skupni rabi, da je ena pointee, ki jih tako videli 13. [Binky] Ja, souporaba. Karkoli. Torej bomo izbrati kraje zdaj? [Moški govorec] Oh poglej, zmanjkalo nam je časa. >> [Binky] Ampak - [Moški govorec] Samo spomnite 3 kazalec pravila. Številka 1, osnovna struktura je, da imate kazalec, in poudarja več na pointee. Toda kazalec in pointee ločena in pogosta napaka je, da se vzpostavi kazalec ampak, da bi pozabili, da ga pointee. Številka 2, kazalec Dereferenciranje začne s kazalcem in sledi svojemu puščico nad dostop do svojega pointee. Kot vsi vemo, je to deluje le, če je pointee, katere vrste vrne odločiti številko 1. Številka 3, kazalec naloga traja en kazalec in ga spremeni točko na isti pointee kot drugi kazalec. Torej, po prenosu, bodo kazalci kažejo na 2 iste pointee. Včasih se to imenuje delitev. In to je vse kar je z njo res. Adijo zdaj. To je Binky. To je CS50. Vidimo se naslednji teden. [Aplavz] [CS50.TV]