>> DAVID Malan: Pozdrav, i dobrodošli natrag u CS50.
Dakle, ovo je kraj četiri tjedna.
Samo jedna najava prvog.
Dakle, tzv peti je ponedjeljak dolazi do idućeg ponedjeljka.
Ovo je prilika za promjenu iz SAT / UNSAT na slovo razreda, odnosno od
Pismo stupnja SAT / UNSAT.
Dosadno, taj proces ne zahtijeva potpis, jer morate ispuniti
iz jednog od tih ružičastih dodati / pad forme.
>> Zbog tehnički, SAT / UNSAT verzija i verzija pismo stupnja
imaju različite brojeve katalog.
No, nije velika stvar.
Samo dođi do mene ili Rob ili Lauren u bilo kojem trenutku.
Ili nam e-mail ako nemate kakav papirologije morate danas, a mi
će svakako pomoći da se skrb da prije ponedjeljka.
>> U redu, tako da danas -
zapravo, ima malo odjeka.
Možemo li mi ton dolje malo?
OK.
Tako danas, uvodimo temu poznat kao pokazivače.
I moram priznati da je to jedna od složenije teme koje smo skloni
pokrivaju u ovoj klasi, ili stvarno bilo uvodni tečaj koji koristi C.
>> Ali uzeti moj riječ za to, pogotovo ako je vaš um osjeća malo više savijena
i danas u tjednima koji dolaze.
To nije predstavnik li dobivanje bilo još gore, na to znači samo to da je
to je posebno sofisticirani topic Obećajem da, prije nekoliko tjedana
stoga, će činiti sve previše upadljivo jednostavno u retrospektivi.
>> Još uvijek se sjećam do danas.
Sjedio sam u Elliott blagovaonice, sjedi pored moje TF Nishat Mehta,
koji je bio stanovnik Elliott kuće.
I iz nekog razloga, to Tema stisne.
Koji je reći da sam i ja borili s njim za neki iznos od vrijeme, ali sam
ću sve od sebe kako bi se izbjegli takvi Borba s temom koja u konačnici
je vrlo moćan.
>> U stvari, jedna je od tema razgovarat ćemo o u tjednima koji dolaze je da
sigurnosti, a kako možete zapravo iskorištavaju strojeva na načine
koje nisu bile namijenjene.
I one su obično eksploatacije Rezultat bugova, pogrešaka koje smo
ljudi čine po ne razumijevanju nekih temeljne provedbu
Detaljnije putem programa koje su napravili.
>> Sada bi se to čini sve više user friendly, mislio sam da bih igrati 10
Drugi pregled malo Claymation lik zove Binky koji je doveo do
Život je jedna prijateljica na Stanfordu, Profesor Nick Parlante.
Dakle, dopustite mi da vam to teaser od Binky ovdje.
>> [Video reprodukciju]
>> -Hej, Binky.
Probudite se.
Vrijeme je za zabavu pokazivač.
>> -Što je to?
Doznajte više o pokazivače?
Oh, goodie.
>> [END video reprodukciju]
>> DAVID Malan: To je Stanford računalne znanosti.
Dakle, više o tome doći.
>> [PLJESAK]
>> DAVID Malan: Žao nam je, Nick.
>> Dakle podsjetiti da smo zadnji put završila na ovo je stvarno uzbudljivo alpinista
pri čemu je ova funkcija jednostavno ne rade.
Barem intuitivno, osjećala kao i to bi trebalo raditi.
Jednostavno zamjene vrijednosti po dva cijela broja.
Ali sjećam da kad smo ispisati izvorne vrijednosti u glavnom, jedan i
dvojica, oni su još uvijek jedna te dvije, a ne dvije i.
>> Pa neka mi zapravo prebacivanje preko aparata.
I sam napisao gore malo kostura koda u napredovati ovdje, gdje ja tvrdim da je x
će biti 1, y će se 2..
I onda ispisati oba svoja Vrijednosti ispis s f.
>> I onda tvrditi da je ovdje ćemo ih zamijeniti.
Ostavio sam prazno mjesto za nas ovdje na ispunite danas u samo trenutak.
Zatim, Ja ću tvrditi da dvije varijable su zamijenili.
Onda ću za ispis ih opet.
I tako, nadamo se, trebao bih vidjeti 1, 2.
2, 1.
To je super jednostavno Cilj upravo sada.
>> Pa kako ćemo ići oko zamjene dvije varijable?
Pa ako ja predlažem da se ovdje ta šalice možda predstavlja memorije na računalu.
To je nekoliko ugriza, ovo je još nekoliko zalogaja.
Jesmo li volonter Dođi gore i mix nam nešto za piće, ako je poznato?
Dođi gore.
Koje je tvoje ime?
>> JESS: Jess.
>> DAVID Malan: Jess?
Dođi gore, Jess.
Ako vam ne smeta, moramo staviti Google Glass na vas tako da možemo
besmrtnim to.
OK, stakla.
Snimanje videa.
I OK, mi smo dobro ići s Jess ovdje.
U redu.
Drago mi je.
>> Dakle, ono što želim učiniti ovdje - ako mogu, vrlo brzo -
Samo toči nam pola čaše naranče soka i pola čaše mlijeka,
predstavlja učinkovito brojeve 1 u jednu šalicu i 2 u drugom šalicu.
>> Ovo će biti dobra snimka.
>> JESS: Žao nam je.
>> DAVID Malan: Ne, ne.
To je u redu.
Nica.
U redu, tako da imamo četiri bajta vrijedno soka od naranče.
Mi ćemo ga zvali vrijednost 1.
Sada još četiri bajta vrijedan mlijeka.
Hoće li to nazvati vrijednost 2.
Tako da x i y, respektivno.
>> U redu, tako da sada ako je zadatak pri ruci - za vas, Jess, ispred svih
vaših kolega -
je da se zamijene vrijednosti xiy takve da želimo sok od naranče u
druga šalice i mlijeko u ovom kupu, kako se Možda ste - prije nego što zapravo učiniti
je - ići oko radiš ovo?
>> OK, mudra odluka.
Tako vam je potrebno malo više memorije.
Tako ćemo dodijeliti privremena šalice, ako hoćete.
A sada nastaviti da zamijene xiy.
>> Izvrsno.
Dakle, vrlo dobro učinio.
Hvala vam puno, Jess.
Izvolite.
Malo suvenir.
>> U redu, tako očito, super jednostavna ideja.
Potpuno intuitivno da nam treba malo više prostora za pohranu - u ovom obliku,
Šalica - da li smo doista želite zamijeniti ove dvije varijable.
Tako ćemo učiniti upravo to.
Ovdje gore u sredini gdje ja tvrdim da sam će se raditi neke zamjene, ja ću
ići naprijed i proglasiti temp.
I ja ću ga postaviti jednako, recimo, x.
>> Onda ću promijeniti vrijednost x baš kao Jess je ovdje s
mlijeko i sok od naranče bude jednak y.
A ja ću se promijeniti y biti jednaki da ne x, jer sada mi bi se
zaglavi u krug, nego temp.
Gdje sam privremeno - ili gdje Jess privremeno staviti sok od naranče
prije nego što je prepiše da šalicu s mlijekom.
>> Pa neka mi sada ići naprijed i učiniti to.
To se zove noswap.c.
I sad neka mi pokrenuti nikakvu zamjenu.
I doista vidim, ako sam proširiti Prozor malo, da
x je 1, y je 2.
, A zatim je x 2, y je 1.
>> No, podsjetiti da je u ponedjeljak smo stvari malo drugačije čemu sam
umjesto da provodi pomagač funkciju, ako hoćete, to je zapravo nevažeće.
Nazvao sam ga zamijeniti.
Dao sam ga dva parametra, a ja sam pozvao ih i ja ih zvali b.
>> Iskreno, ja bi ih nazvati x i y.
Nema ništa zaustavljanja ja u tome.
No ja bih rekao da je tada malo dvosmisleno.
Jer podsjetimo za ponedjeljak da smo tvrdio da su ti parametri bili
kopije vrijednosti prošli u.
Tako da se samo zeza s vašim Um, mislim, ako koristite
točno iste varijable.
>> Tako sam, umjesto ćemo ih nazvati i b, samo za jasnoću.
No, mogli bismo ih nazvati najviše sve što želimo.
I ja ću kopirati i zalijepiti djelotvorno ovaj broj od gore
dolje u ovdje.
Jer sam vidjela da to radi.
Tako da je u prilično dobrom stanju.
A ja ću promijeniti moj x, na mom x da, moj y B i Y za moj b.
>> Dakle, drugim riječima, točno ista logika.
Točno istu stvar da je Jess.
A onda je jedna stvar moram napraviti do Ovdje, naravno, to je sada pozvati
funkcija, ili nazovite tu funkciju.
Dakle, ja ću nazvati ovu funkciju s dva ulaza, xiy, a hit Spremi.
>> U redu, tako fundamentalno ista stvar.
Zapravo, vjerojatno sam napravio program nepotrebno komplicira
piše funkciju koja je samo uzimajući oko šest linija koda, dok sam
prethodno provedene to je u samo tri.
>> Zato mi dopustite da ići naprijed i sada remake ovaj, ne bi swap.
U redu, ja sam zeznuo ovdje.
To bi trebao biti greška koja možda vidi sve najčešće kao vaš
Programi se složeniji.
No, tu je lako srediti.
Dopustite mi da pomicanje natrag ovdje.
>> A što je prva pogreška vidim?
Implicitni deklaraciju.
Što to obično znače?
Oh, zaboravio sam na prototip.
Zaboravio sam naučiti da je prevodilac swapa će postojati, iako je
ne postoji na samom početku programa.
Dakle, ja sam samo htio reći void, swap, int, int b, zarez.
>> Dakle, ja ne idem na to reimplement.
Ali sada prikazuje ono što je ovdje dolje.
I obavijest, odsustvo-zarezom ovdje, što nije nužno ako
provedbi.
>> Pa neka mi preurediti ovo, ne čine swap.
Puno boljem stanju.
Trčanje nema zamjenu.
I k vragu.
Sada smo tamo gdje smo bili u ponedjeljak, gdje se stvar ne zamijene.
>> A ono što je intuitivno objašnjenje zašto je to tako?
Da?
>> STUDENT: [nečujno].
>> DAVID Malan: Točno.
Pa i b su kopije xiy.
A u stvari, svaki put kad sam bio raspisivanje funkciju tako daleko da
prolazi varijable kao Ints -
kao zamjena se očekuje ovdje -
ti dečki su u prolazu primjeraka.
>> Sada to znači da je potrebno malo vremena, djelić sekunde, za
računalu za kopiranje bitova iz jednog varijabla u komadićima drugi.
Ali to nije tako velika stvar.
No, oni su ipak kopija.
>> I tako sada, u kontekstu zamjene, Ja sam u stvari uspješno
A i B mijenjaju.
U stvari, idemo napraviti brzi razum provjeriti.
Ispis f je% ja, nova linija.
I neka je plug-in.
Sada ćemo napraviti istu stvar sa b.
I neka je napraviti istu stvar ovdje.
>> A sada, neka mi kopirati te iste linije opet na dnu funkcije
nakon mojih tri linije zanimljiva mogao izvršiti, a
ispisati i B opet.
Dakle, sada ćemo napraviti ovo, da nema zamjenu.
Dopustite mi da se terminal prozor malo jači, tako da možemo vidjeti
više od toga odjednom.
>> I pokrenuti nikakvu zamjenu.
x je 1, y je 2. a je 1, b je 2.
, A zatim, je 2, b je 1.
Dakle, to je rad, baš kao i Jess Ovdje je unutar swapa.
Ali, naravno, to što nema učinka o varijabli u glavno.
>> Tako smo vidjeli trik kojim smo mogla popraviti, zar ne?
Kada ste suočeni s ovom djelokrugu rada problem, možete se i samo punt i učiniti x.
i imat kakvu varijable umjesto?
>> Mogli bi ih globalno.
Stavite ih na samom vrhu datoteke kao što smo učinili, čak u igri od 15 godina.
Koristimo globalnu varijablu.
No, u kontekstu u igri 15, je razumno imati globalni
varijabla predstavlja ploču, jer Ukupnost 15.c je sve
o provedbi tu igru.
To je ono što datoteka postoji učiniti.
>> No, u ovom slučaju ovdje, ja sam pozivanje funkcije zamjenu.
Želim da zamijene dvije varijable.
I to bi trebalo početi osjećati samo traljav ako je rješenje za sve naše
problemi kad smo izvoditi u okviru Pitanja je da je globalna.
Zbog vrlo brzo naš program će postati prilično nered.
I mi to učinio vrlo rijetko Kao rezultat toga u 15.c.
>> No, ispostavilo se da postoji bolji način uopce.
Dopustite mi da se zapravo vratiti i izbrisati ispisivati ​​P-a, samo kako bi se pojednostavio ovaj kod.
I neka mi predložiti da To je, doista, je loše.
Ali, ako sam umjesto toga dodajte u nekim zvijezdicama i zvijezde, umjesto da sam može pretvoriti ovo
funkcija u jednu koja je zapravo operativni.
>> Dakle, neka mi se vratiti ovdje i priznajem govoreći Zvjezdica je uvijek teško,
pa ću reći zvijezde.
Ja ću samo uživajte u onome što taj jedan.
U redu.
A sada, što ću učiniti umjesto toga?
>> Dakle, prije svega, ja ću navesti da umjesto donošenjem int u
Zamijeni funkciju, da sam umjesto ide reći int zvijezdu.
Sada, što pokazuju star?
To je pojam od pokazivača tom Binky, Claymation karakter, bio je
pozivajući se na trenutak prije.
>> Dakle, ako kažemo int zvijezdu, značenje to je sada da se ne događa da se
donesen po vrijednosti.
To neće biti kopiran u.
Umjesto toga, adresa je će biti donesen u.
>> Dakle podsjetiti da unutar vašeg računala je cijela hrpa memorije, inače
poznat kao RAM.
A to je samo RAM cijela hrpa bajtova.
Dakle, ako vaš Mac ili računalo ima dva gigabajta, imate 2
milijardi bajtova memorije.
>> Sada neka je samo pretpostaviti da je samo držati stvari lijepo i uredno, smo
dodijeliti adresu -
broj -
svakom bajtu RAM-u računala.
Prvi bajt tih dviju milijarde dolara je, prema broju nula.
Sljedeći je bajt broj jedan, broj dva, skroz gore, dot dot
dot, na oko 2 milijarde.
>> Tako možete broj bajtova memorije u računalu.
Dakle, pretpostavimo da je to ono podrazumijevamo pod adresu.
Pa kad vidim int zvijezda A, što se događa biti donesen u zamjeni je sada
adresa.
Nije njegova vrijednost, ali bez obzira na njegov poštanska Adresa je, da tako kažemo -
Njegov položaj u RAM.
>> Ai za b, idem reći istu stvar.
Interesi, star, b.
Kao na stranu, tehnički zvijezde mogao ići i na drugim mjestima.
No, mi ćemo standardizirati na zvijezde bića tik uz tip podataka.
>> Dakle swap potpis sada znači, daj mi adresa int, a poziv
koje adresu.
I daj mi još jednu adresu int i poziv da b adresa.
>> Ali sada mi je kod ovdje se mora promijeniti.
Jer ako ja izjavljujem int temp -
koji je još uvijek tipa int -
ali ja pohraniti u to, kakvu vrijednost?
Da se razumijemo, ja sam stavljajući u kod kao što je napisano u ovom trenutku?
>> Ja sam stavljajući lokaciju u.
Ali mi nije stalo Mjesto je sada, zar ne?
Temperatura postoji samo Jess 'treću šalicu postojala, za koju svrhu?
Za spremanje vrijednosti.
Mlijeko ili sok od naranče.
Nije zapravo pohraniti adresu bilo koji od tih stvari, koje osjeća
malo besmisleno u ovom stvarnom svjetskom kontekstu svejedno.
>> Pa stvarno, ono što želim staviti u temp nije adresa, ali
sadržaj.
Dakle, ako je broj kao što je 123, to je 123. bajt memorije koja jednostavno
se događa da se zauzimaju, da je vrijednost u se događa da se okupator.
>> Ako želim ići na tu adresu, Moram reći oznaÄŤili.
Isto tako, ako bih se promijeniti ono što je na adresu, mogu promijeniti
to za početak.
Ako želite pohraniti u ono što je po Mjesto s onim što je na mjestu
na B, star b zvijezda.
>> Tako je u kratkom, čak i ako to nije dosta tone u još - i ja ne bih očekivati
da bi tako brzo -
shvatiti da sve što radim je prefiksa ove zvijezde mojih varijabli,
izreka ne zgrabite vrijednosti.
Ne promijenite vrijednosti.
No, umjesto toga, idite na tim adresama i dobiti vrijednost.
Idi na toj adresi i promjeni vrijednost tamo.
>> Pa sad neka mi pomicanje natrag do vrha, Samo kako bi riješili ovaj redak ovdje, na
promjenu prototip kako bi se slagala.
Ali ja sada morati napraviti jednu drugu stvar.
Intuitivno, ako sam promijenio vrste argumenata koji Swap očekuje,
Što još trebam promijeniti u mom kodu?
>> Kad sam poziv swap.
Jer upravo sada, ono što ja I prolazeći da zamijene dalje?
Vrijednost x i vrijednost y ili mlijeko i sok od naranče.
Ali ja ne želim to učiniti.
I umjesto da žele proći u što?
Mjesto xi mjesto y.
Koje su njihove poštanske adrese, da se tako izrazim.
>> Pa za to, postoji znak za struju.
Ampersand vrsta zvuči kao adresu.
pa n, znak za struju, adresa od x i y adresu.
Tako da je namjerno koje koristimo Kada zovete znakove za funkciju,
i zvijezde, kada proglašenja i kada provedbu funkciju.
>> A sjetite se samo ampersand adresa operatora, kao i zvijezda
tamo operatera -
ili, točnije, dereference operatera.
Dakle, to je puno riječi samo reći da je sada, nadamo se, swap ide
biti točna.
>> Dopustite mi da ići naprijed i učiniti -
neka je zapravo preimenovati datoteku, da ne ovaj program još uvijek se zove nema zamjena.
Tvrdim da ćemo ga zovu swap.c sada.
Tako bi, zamijeniti.
Dot, slash, zamijeniti.
>> A sada doista, x je 1, y je 2.
, A zatim, x je 2, y je jedan.
Pa ćemo vidjeti ako mi to ne može učiniti malo drugačije, kao što je
ovdje događa.
Prvo, neka mi uvećanje na našim crtanje ekran ovdje.
I neka mi predloži za trenutak - a kad crtam ovdje će se zrcale
tamo sada - neka mi predložiti da Ovdje je cijela hrpa memorije, ili
RAM, unutar moje računalo.
>> I to će biti broj ugriza, recimo, jednom.
To će biti broj 2 bajta.
I ja ću napraviti cijelu hrpu više, i onda hrpa točkica točkica točkica na
pokazuju da postoji 2 milijarde od tih stvari.
4, 5, i tako dalje.
>> Dakle, tu su prvih pet bajtova od mog računala memorije.
U redu?
Vrlo malo od 2 milijarde eura.
Ali sada ću predložiti sljedeće.
Ja ću predložiti da se ide na x pohraniti broj 1, a imat će
pohraniti broj dva.
I neka mi sada ići naprijed i predstavlja ove vrijednosti, kao što slijedi.
>> Učinimo to na sljedeći način.
Daj mi samo jednu sekundu.
Jedan drugi.
OK.
Želim da ovo malo -
hajdemo to učiniti opet.
Inače ću te korištenjem Isti brojevi, nenamjerno,
više puta.
>> Dakle, samo tako možemo imati različite brojeve pričati o, nazovimo to bajt
broj 123, 124, 125, 126, i dot dot dot.
I neka mi sada tvrditi da ću se stavi vrijednost 1 ovdje, a onda se vrijednost 2
Ovdje, inače poznat kao xiy.
Dakle, to samo tako dogodi da ovo je x, ovo y.
>> I baš neki Slučajnost, računalo, operativni sustav,
dogodilo staviti x na mjestu broj 123.
I y završio na 124. mjestu -
k vragu.
Trebao sam to popraviti.
O, čovječe, ja stvarno želite učiniti?
Da, želim popraviti i b pravilno o ovom danas.
Nažalost, novi u ovome.
>> 127, 131, a ja ne želim da se to složeno, ali zašto sam promijeniti
Brojevi tamo?
Zato želim da se Ints zapravo biti četiri bajta.
Tako ćemo biti super analnog o tome.
Tako da, ako se dogodi da se jedan obratio 123, 2 će biti na adresu
127, jer to je samo 4 pozdravili daleko.
To je sve.
I mi ćemo zaboraviti na sve druge adrese u svijetu.
>> Tako je, na mjestu x 123, y je na mjestu 127.
I sad, što to zapravo sam želite učiniti?
Kad sam poziv zamjenu sada, što je zapravo događa?
Pa, kad sam nazvati zamjenu, ja sam prolaze adresa x i y adresu.
Tako na primjer, ako se ta dva komada papira sada predstavljaju dvije
Argumenti i b za swap, ono što sam ja će pisati o prvom od njih,
što ću nazvati nazivaju?
>> Točno, 123.
Dakle, to ja tvrdim je.
Ovaj je parametar.
Ja sam stavljajući adresu x unutra.
>> Što je to?
>> Ne, ne.
To je u redu.
Ipak dobra, još uvijek dobra.
Tako je to.
A sada na drugom komadu papira, ovo će biti b, a što sam ja
će se pisati na ovaj komad papira?
127.
>> Dakle, jedina stvar koja se promijenila od Naša prethodna govori o ovoj priči je,
nego doslovno 1 i 2, ja sam proći će u 123. i 127..
A ja sad idem staviti ovih iznutra ove kutije, u redu?
Tako da je crna kutija sada predstavlja zamjena funkcija.
>> U međuvremenu, neka se sada netko implementirati funkciju swapa.
Bi li netko ovdje željeli volontirati?
Dođi gore.
Koje je tvoje ime?
Charlie.
U redu, Charlie.
Dođi gore.
>> Dakle, Charlie će igrati Uloga naše crne kutije.
I Charlie, ono što bih želio da učinite Sada se provesti zamjenu na takav način
da je, s obzirom na te dvije adrese, da su zapravo ide
za promjenu vrijednosti.
I ja ću šaptati u uho kako pokrenuti TV ovdje.
>> Dakle, ići naprijed, a ti si crna kutija.
Doći tamo.
Koje vrijednosti vidiš za te Koje vrijednosti vidiš za b?
>> CHARLIE: je 123, a b 127.
>> DAVID Malan: OK, točno.
Sada pauzirati postoji samo na trenutak.
Prva stvar koju će učiniti sada, prema kod - što
I sada ću podići na zaslonu -
koja će se izdvojiti malo malo memorije zove temp.
Dakle, ja ću ići naprijed i vam taj memorije.
>> Dakle, ovo će biti treća varijabla da ste dostupni
što se zove temp.
A što ćeš pisati na temp komad papira?
>> CHARLIE: pokazivače, zar ne?
>> DAVID Malan: OK, ali ne nužno upućuje.
Dakle linija koda da sam istaknuta na desnoj strani,
počnimo postoji.
Piše zvijezda.
Dakle, trenutno spremanje broj 123.
I samo intuitivno, što nije star 123 znači?
>> Ali specifično, ako je 123, star znači što?
Vrijednost.
Ili više ležerno, otići tamo.
Pa neka mi predlažemo da, držeći u tvoja ruka, ići naprijed i liječenje koje
kao da je to karta.
I sami hoda preko računalo ' memorije, te nas pronaći ono što je
na mjestu 123.
Točno.
>> Tako vidimo na mjestu 123 je ono, očito?
U redu, tako što je vrijednost sada si ti će se staviti u temp?
Točno.
Pa ići naprijed i učiniti.
I napisati broj 1 na komad Rad koji trenutno pod nazivom temp.
>> A sada sljedeći korak koji idete za provedbu
će biti ono.
Pa, na desnoj strani Sljedeći linija koda je star b. B, od
Tečaj, pohranjuje adrese.
To adrese 127.
Star b znači ono, usput govoreći?
>> Idi na tom mjestu.
Dakle, ići naprijed i nas pronaći ono što je na mjestu 127.
OK.
Naravno, na mjestu 127, još uvijek je vrijednost 2.
Dakle, ono što se sada ideš u dućan što god je na poziciji u?
Dakle, zvijezda sredstvo ide na mjesto u.
Koje je mjesto?
>> Točno.
Pa sad, ako želite promijeniti ono što je na tom mjestu -
Ja ću ići naprijed i pokrenuti gumice su ovdje.
A sada ga vratiti na četkicu.
Koji broj ideš pisati u tom prazan okvir sada?
>> Točno.
Dakle, ova linija koda, da bude jasno - neka ja pauziram ono Charlie radi i
naglasiti ovdje, ono što je upravo učinio je pisati u taj okvir, na mjestu 123
vrijednost koja je prethodno na b.
I tako smo sada provodi doista ova druga linija koda.
>> Sada, nažalost, postoji još jedan redak preostalo.
Sada ono što je u temp, doslovno?
Očito je broj jedan.
To nije adresa.
To je samo broj, vrsta varijabilni od jednog tjedna.
>> I sad kad kažeš b zvijezda, to znači da ići na adresu b, što je od
Tečaj ovdje.
Dakle, kad jednom doći -
Ja ću ići naprijed i izbrisati ono što je zapravo postoji - a što si ti
će pisati sada, na licu mjesta 127?
>> CHARLIE: Temp, koji je jedan.
>> DAVID Malan: temp, što je jedan.
A što se događa s temp na kraju?
Pa, mi zapravo ne znamo.
Mi zapravo ne zanima.
Svaki put smo implementirali funkciju do sada, sve lokalne varijable imate
su doista lokalni.
I oni samo nestati.
Oni su vraćene od strane operativnog Sustav kraju.
>> Dakle, činjenica da još uvijek ima temp Vrijednost 1 je vrsta od temelja
nezanimljiv nama.
U redu, tako da pljesak ako smo mogli za Charlieja.
Vrlo dobro učinio.
>> U redu, tako da ono više ne to znači da možemo napraviti?
Tako ispada da smo bili govori nekoliko bijelih laži
za neko vrijeme.
Doista, ispada da se niz, sve ovo vrijeme, zapravo i nije
slijed znakova po sebi.
To je vrsta koja intuitivno.
>> No, tehnički gledano, struna Vrsta podataka koje smo proglasili unutar
CS50 knjižnica pojednostaviti svijet za prvih nekoliko tjedana klase.
Ono što je stvarno je niz adresa lika negdje u RAM-u.
String je zapravo broj, kao što je 123. ili 127, što se događa s demarkiraju
gdje je string počinje u memorije računala.
>> Ali, to ne predstavlja string, sama po sebi, sama po sebi.
I možemo vidjeti ovo što slijedi.
Dopustite mi da ide naprijed i otvaraju Neki kod koji je među
današnji izvorni kod primjera.
I ja ću ići naprijed i otvorite do, recimo, usporedite-0.c.
Ovo je buggy program koji će koji će se provoditi na sljedeći način.
>> Prvo.
Ja ću reći nešto.
Onda ću ići naprijed i dobiti niz od korisnika
u toj sljedeći redak.
Onda ću ga opet reći.
Onda ću dobiti još jednu string od korisnika.
>> I napomena, ja sam prikazati jedan od žice u varijablu e, i
jedan od tih nizova u varijablu naziva t.
A sada ću tvrditi, vrlo razumnoj mjeri, da, ako je jednaka jednaka t,
žice su isti.
Možete upisati istu stvar.
Inače, žica nije ista stvar.
>> Uostalom, ako unosimo dva Ints, dva znakovi, dva kola, dva u parovima, bilo koje od
vrste podataka koje smo razgovarali o Do sada ih je usporediti -
podsjetiti da je vrlo jasno, a prije da ne to učiniti, jer
jedan znak jednakosti je, naravno, operator pridruživanja.
Dakle, da bi se bug.
>> Mi koristimo jednak znak jednakosti, što je uistinu uspoređuje
stvari za istinske ravnopravnosti.
Ali ja tvrdim je to lud.
Ako sam ići naprijed i napraviti usporedbu nulu, a onda ne dot slash usporedite nulu.
I sam upisati, recimo, bok.
A onda ćemo pozdraviti ponovno.
Doslovno ista stvar, računalo tvrdi sam upisali različite stvari.
>> Sada možda sam samo krivo upisao nešto.
Ja ću upisati ime mi ovaj put.
Mislim, halo.
Pozdrav.
To je drugačije svaki put.
>> Pa, zašto je to?
Što se doista događa ispod haube?
Pa, što se zapravo događa ispod napa je string zatim
Ja upisali u tom prvi put za primjer Riječ je zdravo, naravno.
Ali ako mi predstavlja to ispod napa, podsjetiti da je
struna na polje.
I mi rekao koliko u prošlosti.
>> Dakle, ako sam skrenuti na taj niz kao što je ovaj, ja sam će predstavljati nešto sasvim
slično onome što smo maloprije.
I tu je zapravo nešto Posebna ovdje.
Što smo se utvrdilo je, na na kraju svakog niza?
Da, backslash nuli, pa se Samo način prikazivanja,
Doslovno, 00000000.
Osam 0 bita u nizu.
>> Ne znam, iskreno, ono što je nakon toga.
To je samo hrpa više RAM-a unutar moje računalo.
Ali ovo polje.
Razgovarali smo o tome prije nego polja.
A mi obično govorimo o nizovima kao location nula,
zatim jedan, a zatim dva.
No, to je samo za praktičnost.
I to je sasvim relativna.
>> Kad ste zapravo uzimajući memorije na Računalo, što je, naravno, bilo
2 milijarde neki čudni bajtova, potencijalno.
Pa stvarno ispod poklopca motora, sve ovo vrijeme, da.
Ovo bi moglo biti jako dobro nosač nuli.
Ali ako kopati još dublje ispod napa, to je stvarno
obratiti broj 123.
Ovo je adresa 124.
Ovo je adresa 125.
>> I nisam zeznuti ovaj put.
To su sada jedna bajtova Osim iz kojeg razloga?
Koliko je velik znak?
Char je samo jedan bajt.
Int je obično četiri bajta.
Dakle, to je razlog zašto sam napravio to 123, 127, 131 i tako dalje.
Sada mogu zadržati matematike jednostavnije i baš to plus jedan.
A ovo je sada ono što se stvarno događa na ispod haube.
>> Dakle, kada se proglasi ovako nešto, string s, to je zapravo -
ispada -
char star.
Star je, naravno, znači da adresa, zvani pointer.
Dakle, to je nešto adresu.
Što je adresa?
>> Pa -
Ja sam jedini koji mogu vidjeti vrlo Bitna stvar sam što, ili mislite
Ja izmišljam.
Dakle string -
Tužno je što imam monitor tamo gdje sam
mogli su vidjeti da je.
>> U redu, tako da je ono što je string Ja proglasio ranije.
No, ispostavilo se, zahvaljujući nešto Čarolija u CS50 knjižnici, sve to
Vrijeme string je doslovno bio znak zvjezdice.
Zvijezda opet znači pokazivač ili adresa.
Činjenica da je to bočni Riječ znak znači da je
adresa lika.
>> Dakle, ako se string zove, i tipkam u H-E-L-L-O, sada predlažemo ono što je mogao
string doslovce vraća sve ovaj put, iako mi smo prilično
pojednostavni svijet?
Što se zapravo string vrati kao povratnu vrijednost?
>> 123 u ovom slučaju, na primjer.
Mi smo ranije rekli da su dobili niz jednostavno vraća niz, slijed
likovi.
Ali to je malo bijele laži.
Način dobili string stvarno radi ispod poklopca motora nalazi se dobiva
string od korisnika.
To plops likovi koji on ili ona vrsta u memoriji.
To stavlja obrnute kose nulu na kraju od onih koji niz znakova.
>> Ali što onda ne bi string Doslovno se vratiti?
To doslovno vraća adresu Prvi bajt u RAM koji
to se koristi za tu snagu.
I ispada da je samo po povratku jednu adresu
Prvi znak u nizu, koji je dovoljni za pronalaženje sveukupnost
string.
>> Drugim riječima, dobili string nema vratiti 123 i 124 i 125.
To ne mora mi dati vremena Popis svih bajtova koji
moj string koristi.
Jer jednom, oni su svi natrag na leđa.
I dvije, temelji se na prvom obraćanju, sam mogu shvatiti gdje završava string.
Kako?
>> Posebna null karakter, obrnute kose nula na kraju.
Dakle, drugim riječima, ako se što prođe oko -
unutar varijabli -
adresa char, i preuzimate da je na kraju svakog niza, bilo
slijed znakova što mi ljudi sjetiti žice, ako pretpostavimo da
na kraju svakog takvog niza postoji backslash nulu, ti si zlatna.
Jer uvijek možete pronaći kraj niza.
>> Sada ono što je stvarno onda ide u ovom programu?
Zašto je ovaj program, usporedite-0.c, lud?
Što se zapravo u usporedbi?
Da?
>> STUDENT: [nečujno].
>> DAVID Malan: Točno.
To je usporedbom mjesta od žice.
Dakle, ako je korisnik upisali u jednom Pozdrav, kao što sam učinio, memorije može završiti
upravo kao što je ovaj.
Ako korisnik onda upiše Bok opet, ali pozivom dobili niz opet, c
nije posebno pametan, osim ako vas naučiti je biti pametan pisanjem koda.
>> C -
i računala općenitije -
Ako upišete u riječi Bok opet, znaš što ćeš dobiti.
Ti si idući u dobiti drugi niz memorije koja, da, dogodi se
spremanje H-E-l-L-O i tako dalje.
>> To će izgledati isto nama ljudima, ali ta adresa
možda neće biti 123.
To može samo tako dogoditi da operativni sustav ima neke dostupno
prostor za primjer, na mjestu -
recimo nešto proizvoljno, Mjesto kao što je to 200.
A to je 201 Mjesto.
A to je 202 Mjesto.
Nemamo pojma gdje je koja je će biti u sjećanju.
>> No, što to znači da je ono što je će biti pohranjen u konačnici u S?
Broj 123.
Što će biti pohranjeni u t, u ovom primjeru proizvoljne?
Broj 200.
I sve to znači onda je očito, 123 nije jednak 200.
I tako to, ako uvjet nije true.
Budući da se string koristi različite komadi memorije svaki put.
>> Sada možemo vidjeti opet U drugom primjeru.
Dopustite mi da ići naprijed i otvoriti copy-0.c.
Tvrdim da je ovaj primjer će probati - ali ne uspijevaju - za kopiranje dvije žice
na sljedeći način.
>> Ja ću reći nešto za korisnika.
I onda ću dobiti string i pozvati ga je.
I sad, ja sam to provjeriti ovdje.
Spomenuli smo tu, dok leđa.
No, kada bi dobili povratnu null string, drugi posebni znak, ili posebna
Simbol recimo.
Ako je iz memorije.
>> Na primjer, ako korisnik stvarno biti teško i vrste grozomornim
Broj znakova po tipkovnica i hitovi Enter.
Ako je broj znakova Jednostavno ne mogu stane u RAM-u za sve što luda
Razlog, i dobili niz might vrlo dobro se vratiti null.
>> Ili, ako vaš program sama radi puno o drugim stvarima, a tu je samo
nije dovoljno memorije za string dobili uspjeti, to bi moglo završiti
se vraća null.
No, budimo precizniji kao što je to.
Što je S je vrsta podataka Stvarno?
Char star.
>> Tako ispada sada možemo kore Vratit sloj null.
Ispada, null je - da, očito poseban simbol.
No što je to zapravo?
Stvarno, null je samo simbol koji smo ljudi koriste za zastupanje nulu kao dobro.
>> Dakle autorima C i računala općenitije, odlučio godina
da, znate što.
Zašto ne bismo osigurali da nijedan korisnik Podaci se nikada, nikada, nikada
pohranjeni na nulu bye?
U stvari, čak iu mom primjeru proizvoljne prije, nisam pokrenuti numeriranje
bajtova na nulu.
Počela sam na jedan.
Zato što sam znao da su ljudi u svijetu su odlučili zadržati nulu
oktet u svačije RAM nešto posebno.
>> Razlog je, kada god želite signalizira da nešto pođe po zlu
s obzirom na adrese, što se vratio null - inače poznat kao nula -
i zato što znaju da ne postoji čitljiv podataka, na adresi nula, jasno
to znači da je greška.
I to je razlog zašto smo, po konvenciji, provjerite za ništave i povratak nečemu
kao jedan u tim slučajevima.
>> Dakle, ako smo pomicali prema dolje sada, to je samo onda neka pogreška provjere, samo u slučaju
nešto je pošlo po zlu s [? jamčevinu?]
zajedno i izađite iz programa po povratku ranije.
Ova linija je sada mogao biti prepisivati jer, što znači što?
Na lijevoj strani, daj mi još jedan pointer na niz znakova, a zovemo je t.
Što sam ja pohranu unutar t, sa sjedištem Na ovoj jednoj liniji koda?
>> Ja sam pohranu mjesto.
Naime Mjesto koji je u s..
Dakle, ako je korisnik upisali u bok, a da je prva pozdraviti dogodi završiti
Ovdje se, dakle broj 123 je će se vratiti iz dobiti
nanizati i biti pohranjeni -
kao što smo ranije rekli -
u sekundama.
>> Kad sam sada izjavljujem drugi pokazivač char i to nazvati t, što je broj
doslovno će završiti u t prema priči?
Dakle 123.
>> Dakle, tehnički i sada je i t se upućuju na točno
Isti komade memorije.
Dakle, primijetite ono što ću učiniti sada dokazati da je ovaj program je lud.
>> Prvo ću tvrditi, s print f, kapitaliziranje
Kopija nizu.
Tada ću učiniti nešto provjere pogreške.
Ja ću biti sigurni.
Budimo sigurni da string t je na Barem veći od nule u duljini,
tako da postoji neki lik postoji da zapravo kapitalizirati.
>> A onda možda sjetiti ove iz prethodnih primjera.
2 gornji - koja je u ctype.h datoteku.
T nosač zero mi daje nulu karakter niza t.
A 2 gornja te iste vrijednosti, od Tečaj, pretvara se u velika slova.
>> Dakle, intuitivno, to istaknuo liniju koda je kapitaliziranje prvi
Pismo ut.
Ali to nije kapitaliziranje, intuitivno, prvo slovo u sekundama.
No ako ste mislili unaprijed, što sam ja da vide kad sam pokrenuti ovaj program
i ispisati i izvornika, s i tzv kopiranje, t?
>> Oni zapravo će biti isti.
I zašto su oni će biti isti?
Oni su oboje upućuju na točno istu stvar.
Tako ćemo učiniti.
>> Napravite kopije nulu.
Ona izrađuje OK.
Dopustite mi da vodim kopiranja nulu.
Dopustite mi upisati nešto poput halo u sve su mala slova onda pritisnite Enter.
I ona tvrdi da su i izvornik i i kopiranje su doista jednaki.
>> Dakle, ono što se doista dogodilo ovdje?
Dopustite mi da ponovno iscrtavanje ovu sliku jednostavno ispričati priču u
malo drugačiji način.
Ono što se zapravo događa ispod napa kad sam proglasiti nešto poput
char početak s, ili string s, Ja sam uzimajući pokazivač -
koji se dogoditi da se četiri bajta u CS50 aparata
i puno računala.
A ja ću nazvati tu s..
A to trenutno ima neka nepoznata vrijednost.
>> Kada deklarirati varijablu, osim ako Stavite se vrijednost postoji, tko
zna što je tamo.
To bi mogao biti neki slučajni slijed bita od prethodne izvedbe.
Dakle, kada sam, u mojoj liniji koda ništa dobiti string, a zatim pohraniti povratak
vrijednost u sekundama dobili niz nekako -
a mi ćemo na kraju guliti natrag kako bi niz djela, nekako izdvaja
Niz koji je vjerojatno izgleda malo kao što je ovaj.
H-E-L-L-O, backslash nula.
>> Pretpostavimo da je to adresa 123 samo prva dosljednost.
Tako se vraća string, u istaknuta linija postoji, ona se vraća
Broj mi je rekao, 123.
Dakle, što se doista događa unutar je ovdje?
>> Pa, što se doista događa Unutrašnjost je s 123.
Ali iskreno, ja sam uzimajući malo zbunjena svim tim adresama,
sve ove slučajni brojevi.
123, 124, 127.
Dakle, neka je zapravo pojednostavljenje svijet malo.
>> Kada govorimo o pokazivače, iskreno, da nama ljudima, tko je pakao brine gdje je
stvari su se u sjećanju?
To je posve proizvoljna.
To će ovisiti o tome koliko RAM-a ima user.
To će ovisiti o tome kada u danu pokrenete program, možda, i
ono ulazna vam daje upute.
Mi smo stan na nebitnim detaljima.
>> Tako ćemo sažetak daleko i reći da, kada pokrenuti liniju koda kao što je ovaj,
char je star dobiva povratak Vrijednost dobili niz.
Zašto ne bismo umjesto toga samo privući ono što smo zadržati poziv pokazivač kao da ga je
pokazujući na nešto?
Dakle, ja tvrdim da je do sada je pokazivač -
ispod poklopca motora je adresa.
No, to je samo ukazuje na prvi bajt u
niz koji je vraćen.
>> Ako ja sada vratiti u kod ovdje, ono što se događa na ovoj liniji?
Pa, u ovom označene linije sada, Ja sam očito jedan proglašenja
varijabla zove t.
Ali to je također pointer, pa ću ga privući što, u teoriji, točnije
iste veličine kutije.
I ja ću ga nazvati t.
>> I sad ako se vratimo na koda ponovno, kad sam pohraniti i unutar t,
ono što sam ja tehnički stavljajući unutar t?
Pa tehnički, to je broj 123.
Pa stvarno sam trebao pisati broj 123 tamo.
Ali neka je to viša razina.
t, ako je samo pokazivač, intuitivno, je upravo to.
To je sve što je što pohranjene tamo.
>> Tako sada u posljednjih zanimljive linije koda, kada sam zapravo ići o
kapitaliziranje nula karakter ut, što se događa?
Pa, t nosač nula sada pokazuje na ono lik, valjda?
>> To ukazuje na h.
Zbog t nosač nuli -
Podsjetimo, ovo je stara sintakse. t nosač zero samo znači, ako je string t, t
Nosač nula znači dobivanje nuli lik u toj snazi.
Dakle, što to zapravo znači je otići na ovom polju -
i da, to bi moglo biti 123, to bi moglo biti 124.
Ali to je sve relativno, sjećam.
Kad govorimo o niz, imamo Prednost pričaju
relativne indeksi.
>> I tako sada možemo samo pretpostavljati da je nula t nosač je h.
Dakle, ako ja zovem 2 gornja na njega, kako je to Stvarno se radi kapitaliziranje
h mala u velika slova H. Ali, naravno, ono što je e?
To ukazuje na isto prokleto nizu.
>> Dakle, ovo je sve što je bio događa u ovom kodu dosad.
Pa što je onda dublji smisao?
Kako ćemo riješiti ta dva problema?
Kako ćemo usporediti s aktualnim žice?
>> Pa intuitivno, kako bi se idete o uspoređujući dva
žice za istinske ravnopravnosti?
>> Što to znači, ako dvije žice su jednaki?
Očito se ne da njihove adrese Jednaki u sjećanju, jer to je niska
Razina provedbe detalja.
Svi znakovi su isti.
Pa neka mi predlažemo, a neka me upoznati u verziji jedne od compare.c
ovdje, pa usporedite-1.c.
>> Dopustite mi predlažemo da smo još uvijek dobiti Pokazivač pozvao je i dućan u to
vrati vrijednost dobili niz.
Idemo napraviti istu stvar sa t.
Dakle, nitko od koda je drugačiji.
Ja ću dodati malo više pogrešaka provjeru sada.
Dakle, sada kad smo vrsta piling natrag ovaj slojeva u CS50 onoga string
zapravo, moramo biti više analni o tome da ne zlorabe
nevažeći vrijednosti kao što su null.
>> Dakle, samo ću provjeriti.
Ako je ne jednak null, a ne t jednako null, to znači da smo OK.
Get string nije zeznuti dobivanje bilo koji od tih nizova.
A možda možete pogoditi sada, ono što nema STR CMP prilici učiniti?
Gudački usporedbu.
>> Dakle, ako ste program u java prije, ovo je kao na jednak način u
string klasa.
No, za one od vas koji nisu programirati prije,
ovo je samo c funkcija.
To se događa da se u file zove string.h.
To je mjesto gdje je proglašena.
>> I string usporedbu -
Ja zapravo zaboraviti njegove uporabe, Ali pustimo to.
Podsjetimo da možemo napraviti Čovjek, promiješajte usporedbu.
A to će dovesti do Linux programera za upotrebu.
I to je, iskreno, pomalo zagonetno.
Ali vidim da se ovdje, da.
Moram se uključiti string.h.
>> I ovdje piše pod opisom " string usporediti funkcija uspoređuje
dvije žice S1 i S2. "I S1 i S2 su očito dvije
Argumenti prošlo u.
Ja stvarno ne sjećam što const, ali sada primjetiti -
a možda ste to već vidjeli kad je što ste koristiti stranice man ako
imati sve -
da je zvijezda znak je samo sinonim s nizom.
>> Dakle, to uspoređuje dvije žice, S1 i S2, te ga vraća cijeli broj manje
od ili jednak ili veći od nule ako S1 se nalazi, odnosno, da se
manji od ili odgovaraju ili biti veća od S2.
To je samo vrlo složen način govoreći: da string usporedbu vraća
nula ako dvije žice su intuitivno identični, znak za
znak za karaktera.
>> To vraća negativan broj ako je e, po abecednom redu, trebalo
doći prije t.
Ili vraća pozitivan broj ako e je trebao doći nakon t
abecedi.
Dakle, s ovom jednostavnom funkcijom, mogli li, primjerice, sortirati
cijela hrpa riječi?
>> Pa u ovoj novoj verziji, idem ići naprijed i učiniti compare1.
Dot slash usporediti jedan.
Ja ću upisati hello na svim malim slovima.
Ja ću upisati Pozdrav u svim malim slovima ponovno.
I srećom sada shvaća Ja upisali istu stvar.
>> U međuvremenu, ako sam upisati hello na manji slučaj i HELLO u gornjem slučaju i
usporediti ih, ja upisali različite stvari.
Jer ne samo da su adrese drugačija, ali mi usporedbe
različiti likovi opet i opet.
>> Pa idemo i popraviti jedan Drugi problem je sada.
Dopustite mi da otvaraju verziju jednog od primjerak, koji se sada bavi
ovo pitanje na sljedeći način.
A ova će izgledati malo složeniji.
Ali ako mislite o tome što smo problema potrebno riješiti, nadam se da će ovo biti
jasno je u samo trenutak sada.
>> Dakle, ovaj prvi redak, znak start t, u Laički rečeno može netko predložiti
što ovaj redak ovdje znači?
Char star t, što je to radiš?
>> Dobro.
Stvaranje pokazivač za neke mjesto u memoriji.
I neka mi ga poboljšati malo.
Objavite varijable koje će pohraniti adresa neki znak u memoriju, jednostavno
da se malo više pravilno.
>> U redu, tako da sada na desnoj strani, sam nikada nije vidio jednu od tih funkcija
prije, malloc.
No, što bi to značilo?
Raspodjela memorije.
Dodjela memorije.
>> Tako ispada, do sada, mi su zapravo i nije imala snažan način
traži operativni sustav, dajte mi neke memorije.
Umjesto toga, sada imamo funkciju pod nazivom malloc koji radi upravo to.
Iako je to malo odvraćanje pozornosti upravo sada, primijetiti da je u
između dva zagradama je Upravo će to biti broj.
Gdje sam upisali u pitanju ocjene može biti broj.
>> A taj broj znači, daj mi 10 bajtova.
Daj mi 20 bajtova.
Dajte mi 100 bajtova.
I malloc će učiniti sve da pitati operativni sustav -
Linux, u ovom slučaju -
hej, njihovi su 100 bajtova RAM na raspolaganju?
Ako je tako, vrati one bajtova mi je vraća adresu od čega u
ti bajtova, možda?
Vrlo prvi.
>> Tako i ovdje - i to je dominantna u C, svaki put kad ste
bave adrese?
Vi ste gotovo uvijek bave Prvi takav adresa, bez obzira koliko velika
komad memorije da su se vrati, da se tako izrazim.
>> Tako ćemo roniti ovdje.
Ja sam pokušava izdvojiti kako mnogi bajtova, točno?
Pa.
Gudački duljina s - neka je napraviti konkretan primjer.
Ako je s hello, H-E-L-L-O, što je string duljine s, očito?
Dakle, to je pet.
Ali ja radim plus jedan na to, zašto?
Zašto želim šest bajtova umjesto pet?
Null karakter.
>> Ne želim otići s ovog Posebna null karakter.
Jer ako sam napraviti kopiju Pozdrav i Upravo to H-E-L-L-O, ali ja ne stavi
da je posebni znak, računalo ne bi mogli imati, slučajno, obrnute kose
nuli tu za mene.
I tako, ako ja pokušavam shvatiti duljina kopija, ja mislim da bi moglo
to je 20 znakova, odnosno milijun znakova ako sam nikada nije dogodilo
pogoditi backslash nulu.
>> Dakle, trebamo šest bajtova za pohranu H-E-L-L-O, backslash nula.
A onda je to samo da se super anal.
Pretpostavimo da sam zaboraviti ono veličina char je.
Mi držati govore da je jedan bajt.
I to obično biva.
U teoriji, to bi moglo biti nešto različite, na drugom Mac ili
različita računala.
>> Tako ispada da postoji taj operator zove sizeof da ako prođe ga je
Ime tipu podataka - kao što je char ili int, float ili -
to će vam reći, dinamično, koliko je bajtova char zauzima na to
određenom računalu.
>> Dakle, ovo je praktički samo kao što je rekao jedan puta ili
puta baš ništa.
Ali ja sam to samo da bi se super analni, da je samo u slučaju znak razlikuje
na vašem računalu u odnosu rudnika, na taj način matematike uvijek ide na check out.
>> Konačno, ovdje dolje sam provjeriti null, što je uvijek dobra praksa - opet,
svaki put kad imamo posla s pokazivačima.
Ako malloc nije bio u mogućnosti dati mi šest pozdravili - što je
vjerojatno, ali samo u slučaju -
jedan odmah vratiti.
A sada, samo naprijed i kopirajte string kako slijedi.
A to je poznato sintakse, doduše u drugoj ulozi.
>> Ja ću ići naprijed i dobiti niz duljina-ih i pohraniti ga u n.
I onda ću ponoviti na jednak i nula do i uključujući N,
veća od ili jednaka.
Tako da na svakoj iteraciji, stavim ith karakter s U-ti
karakter t.
>> Dakle, ono što se zapravo događa ispod napa ovdje?
Pa ako je to, na primjer, je s -
i sam utipkao riječ H-E-L-L-O a tu je obrnuta kosa crta nula.
I opet, ovo je ukazujući ovdje.
I ovdje je t.
>> A to se pokazuje sada kopija sjećanja, zar ne?
Malloc mi je dao cijelo komad memorije.
Ne znam što je inicijalno u bilo kojem od tih mjesta.
Dakle, ja ću misliti na njih kao cijela hrpa upitnicima.
>> No, čim sam početak petlje od nule na gore kroz duljine s, t
Nosač nula i t nosač 1 -
i ja ću staviti ovo sada na nadzemne -
t nosač nula i nosač s nula znači da ću biti kopiranje
iterativno h ovdje, E-L-L-O. Plus, jer sam plus
1, backslash nuli.
>> Tako sada u slučaju Usporedba-1.c, Na kraju, ako sam ispis
kapitalizacija t, trebali bismo vidjeti da je nepromijenjeno.
Dopustite mi sada ići naprijed i učiniti.
Tako bi copy1.
Dot slash copy1.
Ja ću upisati Pozdrav, Enter.
A sada primjetiti, samo kopiju je kapitaliziraju.
Budući da sam doista imaju dva komadi memorije.
>> Nažalost, možete napraviti neke prilično loše i prilično opasne stvari ovdje.
Dopustite mi podići primjer ovdje sada, koji nam daje primjer nekoliko
različite linije.
Dakle, samo intuitivno ovdje, prva linija koda, int x star, je proglašenje
varijabla zove x.
A što je tip podataka te varijable?
Koji je tip podataka te varijable?
To nije roman u nastavcima.
>> Je tip podataka int zvijezda.
Dakle, što to znači? x volje pohraniti adresu int.
Jednostavan je to.
Y će se pohraniti adresa int.
Što je treći redak koda radiš tu?
To je dodjelom koliko bajtova, najvjerojatnije?
Četiri.
Zbog veličine int je uglavnom četiri, malloc od četiri daje
vratim adresu sitna memorije, prva čijih je bajtova
pohranjeni sada u X.
>> Sada idemo malo brže.
Star x znači što?
To znači ići na tu adresu i staviti ono broj ima?
Stavio broj 42 tamo.
Star y znači ići na ono što je na y i stavio broj 13 tamo.
>> Ali čekaj malo.
Što je u y u ovom trenutku?
Ono što je adresa y pohranjuju?
Mi ne znamo, zar ne?
Mi nikada nisu odjednom koristiti raspored Operator uključuje y.
Dakle, imat kad su objavljene na drugoj liniji Kod je samo neko smeće vrijednost, big
Upitnik se tako izrazim.
To bi mogao biti pokazuje slučajno na što u memoriji, koji
uglavnom loše.
>> Dakle, čim smo pogodak tu liniju postoji, Zvijezda y jednako je 13, nešto loše,
nešto jako loše se o se dogoditi da Binky.
Tako ćemo vidjeti što će se završiti događa se ovdje, u ovom Binky minutu
ili tako izgleda.
>> [Video reprodukciju]
>> -Hej, Binky.
Probudite se.
Vrijeme je za zabavu pokazivač.
>> -Što je to?
Doznajte više o pokazivače?
Oh, goodie.
>> -Pa, za početak, mislim da smo Trebat će par savjeta.
>> -U redu.
Ovaj kod izdvaja dva pokazivače što može ukazivati ​​na cijelih brojeva.
>> -U redu, dobro, vidim dva naputke.
Ali, oni ne činiti se biti ukazujući na ništa.
>> -To je točno.
U početku, to ne upućuje ukazuju na ništa.
Ono što oni ukazuju na nazivaju pointees, te ih se postava
odvojeni korak.
>> -Oh, desno, desno.
Znao sam da je.
U pointees su odvojeni.
Pa kako se izdvojiti pointee?
>> -U redu.
Pa, ovaj broj dodjeljuje novi prirodni brojevi pointee, a taj dio postavlja x
ukazati na njega.
>> -Hej, da izgleda bolje.
Tako bi se nešto učiniti.
>> -U redu.
Ja ću dereference x pokazivač za pohranu broj 42 u svoj pointee.
Za ovaj trik, ja ću morati svoju magiju štapić od dereferencing.
>> -Tvoj čarobni štapić od dereferencing?
Uh, to je super.
>> -To je ono što kod izgleda.
Ja ću samo postaviti broj, i -
>> -Hej, gledaj.
Tu ide.
Dakle, radi se o dereference x slijedi Strelica za pristup svoje pointee.
U tom slučaju, za pohranu 42 unutra.
Hej, pokušajte ga koristiti za spremanje broja 13 kroz drugi pokazivač, y.
>> -U redu.
Ja ću ići preko ovdje da y i dobiti broj 13 postavili.
A onda se na štapić za dereferencing i samo -
stani!
>> -Oh, hej.
To nije posao.
Recimo, Binky, ne mislim dereferencing y je dobra ideja,
zbog postavljanja pointee je zasebna korak.
A ja ne vjerujem da ćemo ikada to učinio.
>> -Hmm.
Dobro pitanje.
>> -Da, mi izdvojila pokazivača y.
Ali mi nikada ga postaviti na ukazuju na pointee.
>> -Hmm.
Vrlo pažljiv.
>> -Hej, vi ste u potrazi dobro tamo, Binky.
Može li se to popraviti, tako da je y boda na isto pointee kao X?
>> -Naravno.
Ja ću koristiti svoj čarobni štapić od pokazivač zadatak.
>> -Je li to će biti Problem kao prije?
>> -Ne.
To ne dirajte pointees.
To samo mijenja jedan pokazivač ukazati na istu stvar kao i drugi.
>> -Oh, vidim.
Sada imat ukazuje na istom mjestu kao i x..
Dakle, pričekajte.
Sada y je fiksna.
Ima pointee.
Tako možete isprobati štapić od dereferencing opet
poslati 13 više.
>> -U redu.
Ovdje ide.
>> -Hej, vidi ovo.
Sada dereferencing radove na y.
I zato što su pokazivače dijeljenja da je jedan pointee, oni
i vidjeti 13.
>> -Da.
Dijeljenje.
Što god.
Tako ćemo prebaciti mjesta sada?
>> -O, gledaj.
Nemamo vremena.
>> -Ali -
>> -Sjeti se samo tri pokazivač pravila.
Broj jedan, osnovna struktura je da imate pokazivač.
A to ukazuje na to pointee.
No, pokazivač i pointee su odvojene.
I uobičajena pogreška je postavili pokazivač, ali se
zaboravite dati pointee.
>> Broj dva, pokazivač počinje dereferencing na pokazivač, a slijedi njegova
Strelica tijekom pristupiti njegovu pointee.
Kao što svi znamo, to radi samo ako postoji je pointee, koja dobiva natrag
Pravilo broj jedan.
>> Broj tri, pokazivač zadatak traje jedan pokazivač i promjene koje bi ukazivale na
Isto pointee kao još jedan pokazivač.
Dakle, nakon dodjele, dva pokazivače će
ukazuju na istu pointee.
Ponekad se to zove dijeljenje.
I to je sve što je na njega, stvarno.
Bye bye sada.
>> [END video reprodukciju]
>> DAVID Malan: Pa više na pokazivače, više na Binky sljedeći tjedan.
Vidimo se u ponedjeljak.