>> [Glazbom]
>> Doug LLOYD: pointeri, ovdje smo.
To je vjerojatno će biti najteža tema
da govorimo o u CS50.
A ako ste pročitali ništa o pokazivače
prije nego što bi moglo biti malo zastrašujuće ide u ovaj video.
Istina je da upućuje ne dopuštaju vam mogućnost
da možda zeznuti prilično loše kada ste
rad s varijablama, i podataka, i uzrokuje vaš program za sudar.
Ali oni su zapravo jako korisni a oni nam doista sjajan način omogućuju
proći podatke natrag i naprijed između funkcija,
da smo na neki drugi način ne može učiniti.
>> I tako ono što mi stvarno želim učiniti ovdje je vlak
da imaju dobar pokazivač discipline, pa koje mogu učinkovito koristiti naputke
kako bi svoje programe koji puno bolje.
Kao što sam rekao naputke daju nam drugačije način da prođe podataka između funkcija.
Sada, ako se sjećate iz ranije videa, kada
smo razgovarali o varijabla opseg, što sam spomenuo
da su svi podaci koje prolazimo između funkcije u C donosi vrijednost.
A ja ne mogu imati koristi koje pojam, ono što sam mislio tamo
je da smo prolazeći kopije podataka.
Kada prolazimo varijablu na funkciju, nismo zapravo prolazi varijablu
na funkciju, zar ne?
Mi prolazi kopiju da su podaci u funkciji.
Funkcija čini ono što hoće a izračunava neku vrijednost,
a možda mi koristimo tu vrijednost kada ga vraća.
>> Tu je jedna iznimka ovo pravilo prolazi vrijednosti,
a mi ćemo se vratiti na ono koje je malo kasnije u ovom videu.
Ako koristimo pokazivače umjesto korištenja varijabli,
ili umjesto korištenja varijable sami ili kopije varijabli,
sada možemo proći varijable oko između funkcije u jedan drugačiji način.
To znači da, ako ćemo napraviti promjena u jednoj funkciji,
ta promjena zapravo će potrajati učinak na različite funkcije.
Opet, to je nešto što nismo mogli učiniti ranije,
a ako ste ikad pokušali mijenjati vrijednost dviju varijabli u funkciji,
ste primijetili ovaj problem vrsta puzanje gore, zar ne?
>> Ako želimo mijenjati X i Y, i tako ćemo proći ih na funkciju zove swap,
unutar funkcije swap varijable napraviti razmjenu vrijednosti.
Jedan postaje dva, dva postaje jedan, ali mi zapravo ne
promijeniti ništa u izvorniku funkcija, u pozivatelja.
Budući da ne možemo, mi smo samo rad s kopijama njima.
S pokazivače ipak, možemo zapravo prolaze X i Y u funkciji.
To je funkcija može učiniti nešto s njima.
A oni varijable vrijednosti zapravo može promijeniti.
Dakle, to je dosta promjena u naša sposobnost za rad s podacima.
>> Prije nego što zaronite u pokazivače, mislim da je vrijedno
uzimanje nekoliko minuta da povratak na osnove ovdje.
A imaju pogled na tome memoriju računala radovi
jer su te dvije teme idu zapravo biti prilično povezani.
Kao što vjerojatno znate, na vašem računalnom sustavu
imate hard disk ili možda SSD disk,
neka vrsta mjesta za pohranu datoteka.
To je obično negdje u susjedstvu 250 gigabajta
da možda par terabajta sada.
I to je mjesto gdje svi tvoj Datoteke u konačnici živjeti,
čak i kada je računalo pričepiti off, možete ga ponovno uključite
i naći ćete vaše datoteke su tu opet kad ponovno pokrenuti sustav.
No, diskovi, poput tvrdog diska, HDD ili SSD disk, SSD,
samo prostor za pohranu.
>> Mi zapravo ne može ništa učiniti s podatak da je u tvrdom disku,
ili u statičkom disku.
Kako bi zapravo promijenili Podaci ili kretati,
moramo ga premjestiti na RAM, memorija s izravnim pristupom.
Sada RAM-a, imate mnogo manje u vaše računalo.
Vi svibanj imati negdje u susjedstvu 512 megabajta
Ako imate starije računalo, da možda dva, četiri, osam, 16,
možda čak i malo više gigabajta RAM-a.
Dakle, to je puno manji, ali to je gdje su svi hlapljivih podataka postoji.
To je mjesto gdje možemo promijeniti stvari.
No, kad smo okrenuti naše računalo isključeno, sve podatke u RAM-a je uništeno.
>> Dakle, to je razlog zašto moramo imati tvrdi disk za više trajno mjesto njega,
tako da exists- to bi biti jako loše ako svaki put smo
Okrenuo naše računalo isključeno, svaki file u našem sustavu je izbrisan.
Dakle, radimo u RAM.
I svaki put kad govorimo o memorije, prilično mnogo, u CS50,
govorimo o RAM, a ne tvrdi disk.
>> Dakle, kad smo premjestiti stvari u memoriju, zauzima određenu količinu prostora.
Sve vrste podataka koje smo radili s
zauzimaju različita količine prostora u RAM.
Dakle, svaki put ste stvorili cijeli broj promjenjive, četiri bajta memorije
su izdvojena u RAM pa vas može raditi s tim cijeli broj.
Možete proglasiti cijeli broj, to promijeniti, dodijeliti
na vrijednost 10 povisuje jednim, tako dalje i tako dalje.
Sve što treba da se desi u RAM-a, a vi dobiti četiri bajta
raditi za svakoga broj koji ste stvorili.
>> Svaka ti lik stvoriti dobiva jedan bajt.
To je samo koliko prostora je potrebno pohraniti znaka.
Svaki float, pravi broj, dobiva četiri bajta
osim ako je bračni precizni pomičnim zarezom
broj, koji Vam omogućuje ima preciznije ili više brojeva
nakon decimalne točke bez gubitka preciznosti,
koji zauzimaju osam bajtova memorije.
Duge žudi, stvarno velika cijeli brojevi, Također zauzimaju osam bajtova memorije.
Koliko bajta memorije Ne žice zauzimaju?
Pa neka je staviti iglu u tom pitanju za sada, ali ćemo se vratiti na njega.
>> Dakle, natrag na ovu ideju sjećanja kao veliki niz stanica byte veličine.
To je stvarno sve to, to je Samo veliki niz stanica,
baš kao i bilo koji drugi niz koji ste upoznati sa i vidjeti,
osim svaki element je širok jedan bajt.
I baš kao niz, svaki element ima adresu.
Svaki element niza ima indeks, i tako ćemo
Možete koristiti taj indeks za napraviti tzv izravnim pristupom na nizu.
Mi ne moramo početi na početak niza,
ponoviti kroz svaku pojedini element istih,
pronaći ono što tražite.
Mi samo možemo reći, ja želim doći do 15. Element ili 100. elementa.
A ti samo može proći u tom broju i dobiti vrijednost koju tražite.
>> Slično svako mjesto u memoriji ima adresu.
Dakle, vaša memorijska možda izgledati nešto poput ovoga.
Evo vrlo mali komad memorije, ovaj je 20 bajta memorije.
Prvih 20 bajtova, jer moje obraća tamo na dnu
su 0, 1, 2, 3, i tako na sve na putu do 19.
A kad kažem varijable i kad počnem raditi s njima,
sustav će se postaviti na stranu neki prostor za mene
u ovoj memoriji raditi sa svojim varijablama.
Dakle, mogao bih reći, char c jednak kapital H. A što će se dogoditi?
Pa sustav će odvojeno za mene jedan bajt.
U ovom slučaju to je izabrao byte broj četiri, bajt na adresi četiri,
i to će pohraniti Pismo kapital H tamo za mene.
Ako sam tada rekao brzinu int Granica jednak 65, to je
će izdvojiti četiri bajta memorije za mene.
I to će tretirati one četiri bajta kao cjelinu
jer ono što radimo s je cijeli broj ovdje.
I to će se pohraniti 65 tamo.
>> Sada već sam vrsta govorim vam malo laži,
pravo, jer znamo da Računala rade u binarnom.
Oni ne razumiju nužno ono kapital H
ili što je 65, što je samo razumiju binarni, nula i jedinica.
I tako zapravo ono smo pohranjivanje tamo
Nije slovo H, a broj 65, nego binarni prikazi
istih, što izgleda Malo nešto ovako.
A posebno u kontekst cjelobrojna varijabla,
to ne ide samo pljuvati u, to ne ide da ga tretiraju kao jedan četiri
bajt komad nužno, to je zapravo događa
da ga tretiraju kao četiri jedan byte komadima, što bi moglo izgledati nešto poput ovoga.
Pa čak i to nije u potpunosti točan,
zbog nečega što se zove endianness, koje nismo
će ući sada, ali ako ste znatiželjni o,
možete pročitati na malo i velika endianness.
No, zbog ovog argumenta, zbog ovog videa,
neka je samo pretpostaviti da je u Činjenica kako je broj 65 bi
biti zastupljeni u memorije na svakom sustavu,
iako to nije posve točno.
>> Ali neka je zapravo samo dobiti osloboditi od svih binarnom cijelosti,
i samo misliti o kao H i 65, to je puno lakše
razmišljati o tome kao da kao ljudsko biće.
U redu, možda tako da se također čini Malo slučajnim koji I've- moj sustav
nije mi dati bajtova 5, 6, 7, i 8 pohraniti cijeli broj.
Postoji razlog za to, previše, što nećemo ući odmah, ali dovoljan
je reći da ono što je Računalo se radi ovdje
Vjerojatno je dobar potez na svom dijelu.
Da ne daj mi memoriju koja je nužno natrag na leđa.
Iako će to učiniti sada ako želim dobiti još jedan niz,
zove prezime, a ja želim staviti Lloyd tamo.
Idem morati stati jedan lik, svako pismo koje je
će zahtijevati jedan lik, jedan bajt memorije.
Dakle, ako sam mogao staviti Lloyd u moju lepezu ovako ja sam prilično dobar to ići, zar ne?
Što nedostaje?
>> Zapamtite da je svaki niz radimo s u C završava s obrnute kose crte nula,
i ne možemo izostaviti da je ovdje bilo.
Moramo izdvojiti jedan bajt memorije držati to tako da
znam kad je završio naš niz.
Dakle, opet ovaj aranžman Puta stvari
pojavljuju se u memoriji moći biti malo slučajan,
ali zapravo je, kako većina sustavi su dizajnirani.
Da ih se postroje na multiplama četiri, iz razloga ponovno
da mi ne trebaju ući odmah.
No to, kako je dovoljno reći da je Nakon tih triju linija koda,
to je ono što memorije može izgledati.
Ako trebam memorijskih mjesta 4, 8 i 12 držati svoje podatke,
to je ono što mi je memorija može izgledati.
>> I samo biti osobito pedantan ovdje, kad
govorimo o memoriji Adrese obično
učiniti pomoću heksadecimalni zapisima.
Pa zašto ne bismo pretvoriti sve te od decimalnog do heksadecimalni zapis
Samo zato što je općenito kako smo se odnose na memoriju.
Dakle, umjesto da bude 0 do 19, što imamo nula
x nula kroz nula x1 tri.
Oni su 20 bajta memorije koje smo su ili gledamo na ovoj slici
upravo ovdje.
>> Dakle, sve to se, rekao je, neka je korak dalje od sjećanja na trenutak
i natrag upućuje.
Ovdje je najvažniji stvar za zapamtiti
kao što smo početi raditi s pokazivača.
Pokazivač ništa više od adrese.
Ja ću ga opet, jer kažu to je to važno,
pokazivač ništa više od adrese.
Upućuje se obraća mjestima u memoriji gdje se varijable žive.
Znajući da ona postaje nadamo se malo lakše raditi s njima.
Još jedna stvar koju volim učiniti je da se vrsta
dijagrama vizualno predstavlja ono što je događa s različitih linija koda.
A mi ćemo to učiniti par puta u pokazivača,
a kad govorimo o dinamičnom dodjela memorije, kao dobro.
Zato mislim da su ovi dijagrami može biti osobito korisno.
>> Dakle, ako ja kažem npr int k u mom kodu, što se događa?
Pa što u osnovi se događa je Dobivam memorije izdvojiti za mene,
ali ja čak ne vole razmišljam o tome kao da sam
vole razmišljati o tome kao okvir.
Imam kutiju i to je boje zelena jer sam
može staviti cijelim brojevima u zelenim kutijama.
Ako je to bio znak da može imati plavu kutiju.
Ali ja uvijek kažem, ako sam stvara kutija koja se može održati prirodna broja
ta kutija je zelene boje.
I ja se stalni marker i pišem k na strani njega.
Dakle, imam kutiju zove k, u koje mogu staviti integers.
Dakle, kad kažem int k, to je što se događa u mojoj glavi.
Ako kažem k jednako pet, što ja radim?
Pa, ja sam stavljajući pet u kutiji, zar ne.
To je prilično jednostavan, ako Kažem int k, stvoriti okvir zove k.
Ako kažem k jednak 5, stavi pet u okvir.
Nadam se da nije previše skok.
Evo gdje se stvari ići Malo zanimljiva ipak.
Ako kažem int * PK, pa čak i ako ja ne Znaš što to znači nužno,
jasno je dobio nešto učiniti s cjelobrojnim.
Tako ću u boji ovaj okvir zeleno-ish,
Znam da ima nešto učiniti s cijeli broj,
ali to nije sama cijeli broj, zato što je int zvijezda.
Ima nešto malo drugačije o tome.
Dakle, cijeli je uključen, ali inače je
ne previše različit od ono što smo razgovarali o tome.
To je okvir, njegova je dobio oznaku, to nosi oznaku PK,
i to je sposoban za držanje int zvijezde, sve što oni jesu.
Oni imaju neke veze s integers, jasno.
Evo zadnji redak ipak.
Ako kažem PK = & K, stoj, što se upravo dogodilo, zar ne?
Dakle, ovaj slučajni broj, naizgled slučajni broj, dobiva bačen u kutiju tamo.
Sve što je, je pk dobiva adresu k.
Tako sam zabada gdje je k živi u memoriji, njegovu adresu, adresu njegove bajtova.
Sve što radim je ja govorim da je vrijednost što ću
staviti u moje kutije zove PK.
A budući da su te stvari naputke, a zbog izgleda
na žici kao nula x osam nula c sedam četiri i osam
dva nula je vjerojatno nije vrlo značajna.
Kad mi općenito vizualizirati naputke, mi zapravo učiniti što upućuje.
Pk nam daje podatke moramo pronaći k u memoriji.
Tako je u osnovi pk ima strelicu u njega.
I ako živimo duljinu te strelice, zamislite
to je nešto što može hodati na, ako prošetati duž strelice,
na samom vrhu tog strelice smo naći će mjesto u memoriji
gdje je k živi.
A to je jako važno jer jednom znamo gdje je k živi,
možemo početi raditi s podacima unutar tog memorije položaja.
Iako smo dobili na Teeny malo ispred sebe, za sada.
>> Dakle, ono što je pokazivač?
Pokazivač je predmet čije podatke vrijednost je memorija adresa.
To je to nula x osam nula stuff događa, da je sjećanje adresu.
To je mjesto u memoriji.
A tip pokazivač opisuje vrstu
podataka ćete naći na da memorija adresa.
Tako da je dio pravu int zvijezda.
Ako pratim tu strelicu, to je će me dovesti do mjesta.
A to mjesto, što sam naći će tamo u mom primjeru,
je zelene boje kutija.
To je cijeli broj, to je ono što naći ako odem na tu adresu.
Vrsta podataka od pokazivač opisuje što
naći ćete na toj memorijske adrese.
Dakle ovdje je stvarno super stvar ipak.
Upućuje nam omogućiti da prođe varijable među funkcijama.
A zapravo prolaze varijable i ne prođe kopije njih.
Jer ako znamo točno gdje u memoriju naći varijablu,
ne trebamo napraviti kopiju to, možemo samo ići na to mjesto
i raditi s tom varijablom.
Dakle, u biti upućuje vrsta od napravite konfiguracija
mnogo više kao u stvarnom svijetu, zar ne.
>> Dakle ovdje je analogija.
Recimo da imam bilježnicu, pravo, a to je puna nota.
I ja bih da ga ažurirati.
Vi ste funkcija koja ažuriranja bilješke, u pravu.
Na putu smo bili raditi do sada, što
dogodi se da ćete uzeti moju bilježnicu, vi ćete ići u dućan kopiranja,
ćete napraviti Xerox kopiju svaka stranica u bilježnici.
Vi ćete ostaviti moju bilježnicu natrag na mom stolu kada završite,
ćete ići i precrtati stvari u mom prijenosnik koji su zastarjeli ili u krivu,
a onda ćete proći natrag mi snop Xerox stranica
to je replika moje bilježnice sa promjene koje ste napravili za njega.
I u tom trenutku, to je do mene kao funkcija poziv, kao pozivatelja,
odlučiti da se vaše bilješke i integrirati ih natrag u moju bilježnicu.
Dakle, postoji mnogo koraka uključena ovdje, u redu.
Kao ne bi bilo bolje ako sam samo reći, hej, možete li
ažurirati svoju bilježnicu za mi, ruku ti moju bilježnicu,
i uzeti stvari i doslovce ih precrtati
i ažurirati svoje bilješke u moju bilježnicu.
I onda mi dati moju bilježnicu natrag.
To je vrsta ono upućuje nam omogućiti da radimo,
oni čine ovo okruženje puno više kao način djelujemo u stvarnosti.
>> U redu, tako da je ono što pokazivač se, razgovarajmo
o tome naputke radi u C, a kako možemo početi raditi s njima.
Dakle, tu je vrlo jednostavan pokazivač u C zove nulta pokazivač.
U null pokazivač ukazuje na ništa.
To je vjerojatno izgleda kao da je zapravo vrlo korisna stvar,
ali kao što ćemo vidjeti Malo kasnije, činjenica
da je ovaj null pointer postoji zapravo stvarno može doći u ruci.
I kad god stvoriti pokazivač, te ne postavite vrijednost immediately-
primjer postavljanja njegova vrijednost odmah
biti će par slajdova natrag gdje sam rekao PK jednak & K,
PK dobiva adresu K-a, kao što je vidjet ćemo što to znači,
vidjet ćemo kako se kod koji shortly- Ako ne postavite vrijednost na nešto
smisla odmah uvijek biste trebali
postavite pokazivač ukazati na nulu.
Trebali biste ga postaviti ukazati na ništa.
>> To je vrlo različit od samo ostavljajući vrijednosti kao što je to
a zatim progla pokazivač i samo uz pretpostavku
to je nula, jer to je rijetko istina.
Dakle, uvijek biste trebali postaviti vrijednost pokazivač
na null ako ne postavite vrijednost nešto smisleno odmah.
Možete provjeriti je li vrijednost pokazivač u null pomoću operatora jednakosti
(==), Baš kao što usporediti bilo koji cijeli broj vrijednosti ili karakter vrijednosti koriste (==)
kao.
To je posebna vrsta konstante Vrijednost koju možete koristiti za testiranje.
Tako da je vrlo jednostavan pokazivač, nul pokazivač.
Drugi način za stvaranje pointer je izdvojiti
adresa varijable ste već stvorili,
i radite to pomoću & ekstrakciju adresa operatera.
Što smo već ranije vidjeli u prvom dijagramu primjer sam pokazao.
Dakle, ako je x varijabla koje smo već stvorio tipa integer,
tada & x pointer na cijeli broj.
& x pi- sjećam, i ide za izdvajanje adresu stvar na desnoj strani.
A budući pokazivač je samo adresa, nego & x pointer na cijeli broj
čija je vrijednost u kojoj je u memoriju x životima.
To je X-pošte.
Tako i x je adresa x.
Uzmimo ovaj jedan korak dalje i povezati s nečim
Sam aludirao u prethodnom videu.
Ako ARR je niz parovima, a zatim & arr uglata zagrada i je pokazivač
za dvostruko.
U REDU.
ARR uglata zagrada i, ako ARR je niz parovima,
onda ARR uglata zagrada i je i-th element tog niza,
i & ARR uglata zagrada i gdje je u memorije i-th element ARR postoji.
>> Dakle, što je implikacija ovdje?
Polja Ime, implikacija ovog cijelu stvar,
da je ime dobio je niz zapravo sama pokazivač.
Vi ste radili s pokazivače duž
svaki put kad ste koristili niz.
Sjeti se iz primjera na varijablu opsegu,
pri kraju videa sam predstaviti primjer gdje imamo funkciju
nazvao skup int a funkcija zove skup polje.
I vaš izazov kako bi se utvrdilo da li ili ne, ili što
vrijednosti koje smo ispisati kraj funkcije,
na kraju glavnog programa.
>> Ako se sjećate iz tog primjera ili ako ste gledali video,
znate da kad vas-poziv na Skup int učinkovito ne radi ništa.
Ali poziv postaviti niz radi.
I ja sam nekako premazani više zašto kako je to bio slučaj u to vrijeme.
Samo sam rekao, i to je niz, što je posebna, znate, postoji razlog.
Razlog tome je što je niz Ime je zapravo samo pokazivač,
i tu je ta posebna uglata zagrada sintaksa da
bi stvari puno ljepše raditi.
I oni čine ideju o pokazivač puno manje zastrašujuće,
i to je razlog zašto oni su vrsta od predstavili na taj način.
Ali stvarno polja su samo naputke.
I zato, kada smo napravio promjenu u nizu,
kad smo prošli niz kao parametar u funkciji ili kao argument
u funkciju, sadržaj polja zapravo promijenilo u oba pozivani
a pozivatelja.
Što je za svaku drugu vrstu varijabla smo vidjeli nije bio slučaj.
Dakle, to je samo nešto što treba imati na smeta kada radite s pokazivača,
je da je ime od Niz zapravo pokazivač
na prvi element tog polja.
>> U redu, tako da sada imamo sve ove činjenice, idemo dalje, u pravu.
Zašto mi je stalo gdje se nešto živi.
Pa kao što sam rekao, to je prilično korisno je znati gdje se nešto živi
tako da možete ići tamo i to promijeniti.
Radite s njim i zapravo imaju stvar koja vas
želite učiniti s tim promjenjivim stupiti na snagu, a ne stupaju na snagu na nekoj kopiji njega.
To se zove dereferencing.
Idemo na reference i mijenjamo vrijednost tamo.
Dakle, ako imamo pokazivač i to se zove kom, a to ukazuje na karakter,
onda možemo reći * kom i * kom je naziv što ćemo naći ako ćemo ići
na adresu pc.
Ono što ćete naći je karakter i * kom je kako smo se odnose na podatke na koje
položaj.
Tako bismo mogli reći nešto poput * kom = D ili nešto slično,
a to znači da sve što bio na memorijsku adresu računala,
ono lik je prethodno tamo je sada D, ako kažemo * PC = D.
>> Dakle, ovdje mi ići opet s neki čudan C stvari, u pravu.
Tako smo vidjeli ranije * kao nekako dio vrsti podataka,
a sada je koristi u malo drugačiji kontekst
pristup podacima na mjestu.
Znam da je malo konfuzno i to je zapravo dio ove cjeline
Kao, zašto upućuje imati ovu mitologiju oko njih kao da složen,
je vrsta problema sintakse, iskreno.
Ali * se koristi u oba konteksta, i kao dio imena tipa,
pa ćemo vidjeti malo kasnije nešto drugo, previše.
A sada je dereference operatora.
Tako to ide u referenci, To pristupa podacima
na mjestu pokazivača, i omogućuje vam da ga manipulirati po volji.
>> Sada je to vrlo slično posjetite svog susjeda, zar ne.
Ako znate što je vaš susjed živi, ​​ti si
ne visi sa svojim susjedom.
Znate li slučajno znaju gdje žive,
ali to ne znači da je Vrlina ima to znanje
vi ste u interakciji s njima.
Ako želite komunicirati s njima, morate ići na njihove kuće,
morate ići na kojoj žive.
A nakon što učiniti, onda možete komunicirati
s njima baš kao što bi željeli.
A isto tako s varijablama, morate ići na njihovu adresu
Ako ih želite komunicirati, ne možete samo znate adresu.
A način idete na adresu se koristiti *, operator dereference.
Što mislite događa ako ćemo pokušati dereference
pokazivač čija vrijednost je null?
Sjetite se da je null pokazivač ukazuje na ništa.
Dakle, ako ste probati i dereference ništa ili otići na adresu ništa,
Što mislite se događa?
Pa, ako ste pogodili segmentacija kvara, ti bi biti u pravu.
Ako probati i dereference null pointer,
ste pretrpjeli segmentaciju kvara. Ali čekajte,
nije vam kažem, da je ako ne ide
postaviti svoju vrijednost svoje pokazivač na nešto smisleno,
trebate postaviti na nulu?
Ja sam i zapravo segmentacija greška je vrsta dobrog ponašanja.
>> Jeste li ikada proglasio varijablu i Ne dodjeljuje svoju vrijednost odmah?
Dakle, samo reći int x; vi ne zapravo dodijeliti bilo
a onda kasnije u kodu, vam ispisati vrijednost x,
što još uvijek ne ga dodijeljena ništa.
Često ćete dobiti nula, ali ponekad
možda dobiti neki slučajni broj, a nemate pojma gdje je došao iz.
Isto mogu stvari dogoditi s pokazivače.
Kada proglasiti pokazivač int * pk npr
a vi to ne dodijeliti vrijednost, Možete dobiti četiri bajta za pamćenje.
Bez obzira na četiri bajta Memorija sustav može
Smatraju da su neke smislene vrijednosti.
A tu je moglo biti nešto već postoji da su
više nije potreban netko drugi funkcija, tako da samo
god podaci bio tamo.
>> Što ako ste pokušali učiniti dereference Neki adresu koju don't- bilo
Već bajtova i informacije u postoji, to je sada u vašem pokazivač.
Ako probati i dereference tom pokazivač, možda se petljaju s nekim memorije
da ne namjerava igrati s njom sve.
A u stvari si mogao učiniti nešto stvarno poražavajući,
kao i slomiti drugi program, ili break drugu funkciju,
ili učiniti nešto da zlonamjerni ne namjerava učiniti na sve.
I tako to je razlog zašto je zapravo dobra ideja
postaviti svoje pokazivače na nulu, ako vas nemojte ih postavite na nešto smisleno.
To je vjerojatno bolje Na kraj dana za vaš program
sudar onda za to učiniti Nešto što vijci gore
drugi program ili drugi funkcija.
To ponašanje je vjerojatno i manje idealnim ne samo pad.
I tako to je razlog zašto je zapravo dobra navika
ući postaviti svoje pokazivače na nulu, ako ih ne postavite
na smislene vrijednosti Odmah, vrijednost da znate
i da sigurno može i dereference.
>> Tako ćemo se vratiti sada i pogledati u ukupnom sintaksu situacije.
Ako kažem int * p ;, što sam upravo učinio?
Ono što sam učinio je to.
Znam vrijednost p je adresa jer sve upućuje samo
adrese.
Mogu dereference p Uporaba *.
U tom kontekstu, ovdje, na samom Top podsjetiti * dio je tipa.
Int * je tip podataka.
Ali ja mogu dereference p pomoću operatora *,
a ako sam to učiniti, ako odem na tu adresu, što ću naći na toj adresi?
Ja ću naći cijeli broj.
Dakle, int * p osnovi govoreći: p adresa.
Ja mogu dereference p a ako Ja, ja ću naći cijeli broj
u tom memorijskom mjestu.
>> U redu, tako sam rekao da je bio još jedan smeta što sa zvijezdama
i ovdje gdje da smeta što je sa zvijezdama.
Jeste li ikad pokušali proglasiti više varijabli istog tipa
na istoj liniji koda?
Tako je za sekundu, pretvarati da je linija, kod sam zapravo tamo u zelenom
ne postoji, a to samo govori int x, y, z ;.
Što bi to značilo je zapravo stvoriti tri cjelobrojne varijable za vas,
jedan se zove x, jedan se zove y, a jedna se zove z.
To je način da to učinite bez moraju podijeliti na tri linije.
>> Evo gdje zvijezde doći opet neugodno iako,
jer * je zapravo dio oba imena tipa i dio
varijabilne imena.
I tako, ako kažem int * px, py, pz, što sam zapravo dobili je pokazivač na cijeli broj
zove px i dva prirodna broja, py i pz.
A to vjerojatno nije ono što želimo, to nije dobro.
>> Dakle, ako želim stvoriti više pokazivače na istoj liniji, iste vrste,
i zvijezde, što zapravo treba učiniti je reći int * godišnje, * pb, * kom.
Sada nakon što je upravo rekao da a sada ti ovo govorim,
vjerojatno nikad neće to učiniti.
I to je vjerojatno dobra stvar iskreno, jer možda slučajno
izostavi zvijezda, tako nešto.
To je vjerojatno najbolje da možda proglasiti naputke o pojedinim linijama,
ali to je samo još jedan od onih dosadnih sintakse
stvari sa zvijezdama koje čine upućuje tako teško raditi.
Budući da je samo ovaj sintaktička nered morate raditi putem.
Sa praksi to radi stvarno postati druga priroda.
Ja još uvijek griješe s njim dalje Nakon programiranja za 10 godina,
pa nemojte se ljutiti ako se nešto dogodi vama, to je prilično uobičajeno iskreno.
To je zapravo vrsta mana od sintakse.
>> U redu pa sam vrsta obećao da bi ponovno
pojam koliko je velika je niz.
Pa ako sam vam rekao da je string, mi smo zapravo vrsta
lagao da vas cijelo vrijeme.
Nema tip podataka naziva string, i zapravo sam
spomenuo u jednom od naših Najraniji video prilozi na tipove podataka,
da je niz je vrsta podataka koji je stvoren za vas u CS50.h.
Morate #include CS50.h kako bi ga koristiti.
>> Pa string je zapravo samo alias za nešto
zove char *, A pokazivač na karakter.
Pa naputke, podsjetimo, samo bavi.
Dakle, što je veličina u bajtovima u nizu?
Pa to je četiri ili osam.
A razlog kažem četiri ili osam je zbog toga zapravo
ovisi o sustavu, Ako koristite CS50 IDE, char * je veličina char
* Je osam, to je 64-bitni sustav.
Svaka adresa u memoriji je 64 bita dugo.
Ako koristite CS50 aparata ili pomoću bilo kojeg 32-bitni stroj,
a vi ste čuli da je pojam 32-bitni stroj, što je 32-bitni stroj?
Pa to samo znači da je svaki adresa u memoriji je 32 bita dugo.
I tako 32 bita je četiri bajta.
Tako char * je četiri ili osam bajtova ovisno o vašem sustavu.
I doista bilo vrste podataka, a pokazivač na bilo podataka
upisati, jer sve upućuje samo adrese, četiri ili osam bajtova.
Tako ćemo ponovno ovu dijagram i neka je zaključiti
ovaj video s malo vježbe ovdje.
Dakle ovdje je dijagram smo stali s na samom početku videa.
Dakle, ono što se događa sada, ako ja kažem * PK = 35?
Dakle, što to znači kad kažem, * PK = 35?
Uzmite trenutak.
* pk.
U kontekstu ovdje, * je dereference operatora.
Dakle, kada je dereference Operater koristi,
idemo na adresu ukazao na PK, a mijenjamo ono što smo pronašli.
Dakle * PK = 35 učinkovito to čini na slici.
Dakle, to je u osnovi sintaktički identična da su, rekao je k = 35.
>> Još jedan.
Ako kažem int m, ja stvaram nova varijabla zove m.
Novi okvir, to je zelena kutija, jer to će držati cijeli broj,
i to s oznakom m.
Ako kažem m = 4, stavio sam broj u taj okvir.
Ako recimo PK = & m, kako se ovo dijagram promjene?
PK = & m, sjećate li se što je & Operater radi ili se zove?
Sjeti se da & neko ime varijable je adresa u ime varijable.
Dakle, ono što si rekao je PK dobiva adresu m.
I tako učinkovito što dogodi Dijagram je da pk više ne bodove
za k, ali ukazuje na m.
>> Opet pokazivače su vrlo lukav raditi
i oni uzeti puno praksu, ali zbog
njihove sposobnosti da vam omogućiti proći podataka između funkcija
a zapravo su oni promjene stupaju na snagu,
uzimajući glavu oko je doista važno.
Vjerojatno je najsloženiji Tema smo razgovarali u CS50,
ali vrijednost te da je dobiti od korištenja upućuje
daleko premašuje komplikacija koji dolaze iz njih učiti.
Dakle, želim vam najbolje sreća učenje o pokazivače.
Ja sam Doug Lloyd, ovo je CS50.