>> [Predvaja glasba]
>> Doug LLOYD: ptičarji, tukaj smo.
To je verjetno, da najtežje temo
da govorimo o v CS50.
In če ste prebrali kaj o kazalci
preden vas bo morda malo zastrašujoče dogaja v tem videu.
Res je, da kazalci Se vam omogočajo sposobnost
da morda zajebal precej slabo, ko ste
delo s spremenljivkami, in podatkov, in povzroča vaš program crash.
Ampak oni so dejansko res uporabno in so nam res odličen način omogoči
prenesti podatke nazaj in tja med funkcijami,
da smo drugače ne more storiti.
>> In kaj smo v resnici želite storiti, tukaj je vlak
da imaš dober kazalec disciplino, tako da lahko učinkovito uporabljati kazalce
da bo svoje programe, da je veliko bolje.
Kot sem rekel kazalci nam drugačen način, da prenese podatke med funkcijami.
Zdaj, če se spomnimo iz prejšnji video, ko
smo govorili o spremenljivka področje, sem omenil
da so vsi podatki, ki se peljemo med Funkcije v C je po vrednosti.
In morda ne bom uporabil, da Izraz, kaj sem mislil tam
je bila, da smo se mimo kopije podatkov.
Ko se peljemo spremenljivko v funkciji smo dejansko ne gre za spremenljivko
na funkcijo, kajne?
Mi smo mimo kopijo da so podatki na funkcijo.
Funkcija počne tisto, kar ga bo in izračunava nekaj vrednosti,
in morda bomo uporabili, da je vrednost ko ga vrača.
>> Tam je bila ena izjema to pravilo prenosa po vrednosti,
in bomo prišli nazaj na tisto, ki je malo kasneje v tem videu.
Če bomo namesto tega uporabiti kazalce z uporabo spremenljivk,
ali namesto z uporabo spremenljivk sami ali kopije spremenljivk,
bomo lahko sedaj mimo spremenljivk okrog med funkcijami na drugačen način.
To pomeni, da če naredimo sprememba v eno funkcijo,
ta sprememba bo dejansko vzeti vpliva na drugačno funkcijo.
Tudi to je nekaj, kar nismo mogli storiti že prej,
in če ste že kdaj poskusili, da bi zamenjali vrednost dveh spremenljivk v funkciji,
da ste opazili ta problem nekako plazeče gor, kajne?
>> Če želimo, da bi zamenjali X in Y, in smo da gredo na funkcijo imenovano swap,
notranjost funkcijo zamenjave spremenljivke storiti menjalne vrednosti.
Ena postane dve, dve postane ena, vendar ne bomo dejansko
ničesar spremeniti v izvirniku Funkcija v klicatelja.
Ker ne moremo, smo samo delo s kopijami njimi.
S kazalci, čeprav smo lahko dejansko prenese X in Y na funkcijo.
To funkcijo lahko storite kaj z njimi.
In tiste spremenljivke vrednosti dejansko lahko spremenite.
Tako da je precej spremenila naša sposobnost za delo s podatki.
>> Preden se spustimo v kazalci, mislim, da je vredno
ob nekaj minut do iti nazaj k osnovam tukaj.
In si oglejte, kako računalniških pomnilnih dela
ker ti dve temi se dogaja dejansko precej povezana.
Kot verjetno veste, na vašem računalniškem sistemu
imate trdi disk ali morda SSD,
nekakšna lokacijo za shranjevanje datotek.
To je ponavadi nekje v soseski 250 gigabajtov
da morda nekaj terabajtov zdaj.
In to je, če vse vaše Datoteke končno živeti,
tudi ko je vaš računalnik zaustavite off, lahko vklopite
in boste našli vaše datoteke obstajajo znova, ko boste ponovno zagnati sistem.
Vendar diskov, kot trdi disk, diskov HDD ali SSD, SSD,
so le prostor za shranjevanje.
>> Mi dejansko ne morejo storiti ničesar s Podatki, ki so na trdem disku,
ali v trdnem stanju pogon.
Da bi dejansko spremenili podatkov ali pa ga premikate,
moramo, da se premaknete RAM, bralno-pisalnega pomnilnika.
Zdaj RAM, imate veliko manj v vašem računalniku.
Morda imate nekje v soseski 512 megabajtov
če imate starejši računalnik, da morda dve, štiri, osem, 16,
morda celo malo več gigabajtov pomnilnika.
Torej, to je veliko manjši, vendar je to kjer vsi hlapnih podatkov obstaja.
To je, če bomo lahko spremenili stvari.
Toda, ko zavijemo naš računalnik izklopite, vsi podatki v RAM uniči.
>> Torej, to je, zakaj moramo imeti trdi disk za bolj trajno lokacijo nje,
tako da je exists- da bi res slabo, če bi vsakič, ko smo
obrnil naš računalnik off, vsak Datoteka v našem sistemu je bilo izbrisano.
Torej delamo znotraj RAM.
In vsakič, ko govorimo o spomin, precej, v CS50,
govorimo o RAM, ne trdega diska.
>> Torej, ko smo premakniti stvari v spomin, da prevzame določeno količino prostora.
Vse vrste podatkov, ki smo delali z
zavzamejo drugačni Zneski prostora v RAM.
Torej, vsakič, ko boste ustvarili celo spremenljivi, štiri bajte spomina
so v prahi v RAM, tako vas lahko dela s tem celo število.
Lahko razglasi celo število, spremeniti, ga dodelite
v vrednosti 10 poveča za z enim, tako naprej in tako naprej.
Vse, kar se mora zgoditi v RAM, in dobiš štiri bajte
delati za vsak celo, da si ustvarite.
>> Vsak pismenko ustvariti dobi en bajt.
To je samo, koliko prostora je potrebno shraniti značaj.
Vsak float, pravi številko, dobi štiri bajte
razen če gre za dvojni natančnosti s plavajočo vejico
Številka, ki vam omogoča, da imajo natančnejše ali več cifer
decimalno vejico brez izgube natančnosti,
ki traja do osem bajtov pomnilnika.
Dolgi hrepeni, res velika cela števila, tudi do osem bajtov pomnilnika.
Koliko bajtov pomnilnika ne strune traja?
No, kaj je dal pin na to vprašanje za zdaj, ampak bomo prišli nazaj na to.
>> Torej nazaj na to idejo spominu kot velik nabor Byte velikih celic.
To je res vse, kar je, da je samo ogromna množica celic,
tako kot katera koli druga polja, ki ste seznanjeni z in glej,
razen vsakega elementa je en bajt širok.
In tako kot matriko, Vsak element ima naslov.
Vsak element matrike ima indeks, in smo
Lahko uporabite to kazalo storiti tako imenovane random access na paleto.
Nimamo začeti na začetek matrike,
Ponovil skozi vsak posamezen element Pogodbe,
da bi našli tisto, kar iščete.
Lahko samo rečem, želim priti do 15. element ali 100. element.
In lahko samo prenese na to številko in dobili vrednost, ki jo iščete.
>> Prav vsaka lokacija V spominu ima naslov.
Torej vaš spomin morda izgledala nekako takole.
Tukaj je zelo majhen kos pomnilnik, to je 20 bajtov pomnilnika.
Prvih 20 bajtov, ker moj Obravnava je na dnu
sta 0, 1, 2, 3, in zato na vse tja do 19.
In ko Izjavljam spremenljivk in Ko začnem delati z njimi,
Sistem bo nastavljena prahi nekaj prostora za mene
v tem pomnilniku za delo z mojimi spremenljivk.
Torej lahko rečem, char c enak kapital H. In kaj se bo zgodilo?
No, sistem se bo prahi za mene en bajt.
V tem primeru se je odločila bajt številko štiri, bajt na naslovu štiri,
in to se dogaja, da shranite črka H tam za mene.
Če sem nato rekel, int hitrost Meja je enak 65, to je
bo razveljavilo štiri bajtov pomnilnika za mene.
In to se dogaja za zdravljenje tistih, štiri bajte kot eno enoto
kajti to, kar delamo s je celo število tukaj.
In to se dogaja, da shranite 65 tam.
>> Zdaj je že, da sem nekako Vam povem malo laž,
prav, saj vemo, da računalniki delo v binarno.
Oni ne razumejo nujno, kaj je kapital H
ali kaj 65 pomeni, da so le razumejo binarni, ničel in enic.
In tako pravzaprav kaj smo shranjevanje tja
ni črka H in številko 65, ampak binarne predstavitve
Pogodbe, ki je videti malo kaj takega.
In zlasti v kontekst celoštevilski spremenljivki,
to ne dogaja, da ga pljuvaš v, to ne dogaja, da ga obravnavajo kot enega štirih
bajt kos nujno, to je dejansko dogaja
da ga obravnavajo kot štiri en bajt koščkih, ki bi izgledala nekako takole.
In tudi to ni čisto res, bodisi,
zaradi nečesa, kar se imenuje vrstnega reda zlogov, ki nismo
tekoč priti v zdaj, ampak če ste radovedni,
si lahko preberete gor na malo in velik vrstnega reda zlogov.
Ampak zaradi tega argumenta, zavoljo tega videa,
kaj je samo domnevati, da je, v Dejstvo, kako številko 65 bi
zastopana v spomin na vsakem sistemu,
čeprav to ni čisto res.
>> Ampak kaj je pravzaprav šele zaslužiti znebite vseh binarno celoti,
in samo pomislite, kot je H in 65, to je veliko lažje
razmišljati o tem, kot da kot človeško bitje.
Vse je v redu, tako da se zdi tudi morda malo random da I've- moj sistem
me ni dala bajtov 5, 6, 7, in 8 za shranjevanje celo število.
Obstaja razlog za to, preveč, kar ne bomo dobili v tem trenutku, ampak zadostuje,
to pomeni, da tisto, kar računalnik počne tukaj
je verjetno dobra poteza, na svoji strani.
Da mi ne daje spomin, ki je nujno na hrbtni strani.
Čeprav se dogaja, da to storite zdaj če želim, da bi dobili še en niz,
imenuje priimek, in želim, postaviti Lloyd tam.
Bom potreboval, da se prilega eno značaj, vsako pismo, ki je
dogaja, da zahtevajo enega lik, en bajt pomnilnika.
Torej, če sem lahko dal Lloyd v mojo paleto kot je ta, da sem kar dobro iti, kajne?
Kaj manjka?
>> Ne pozabite, da je vsak niz delamo z v C konča s poševnico ničelno,
in ne moremo izpustiti, da je tukaj, bodisi.
Moramo prahi en bajt spomina ugotovil, da, zato smo
vedo, kdaj je naš niz končal.
Torej, spet ta dogovor o načinu, kako stvari
pojavljajo v spominom biti malo naključno,
vendar je v resnici, kako večina sistemi so zasnovani.
Da jih line up na večkratnikih štirih razlogov, spet
da nam ni potrebno priti v prav zdaj.
Ampak to, da je dovolj, da rečemo, da Po teh treh vrstic kode,
To je tisto, kar bi spomin izgledal.
Če moram spominskih lokacij 4, 8 in 12, da imajo moje podatke,
To je tisto, kar bi moj spomin izgledal.
>> In samo še zlasti Pedantan tukaj, ko
govorimo o spominu naslovi ponavadi
počne s pomočjo šestnajstiških zapiske.
Torej, zakaj ne bomo spremeniti vse te od decimalko do šestnajstiškem zapisu
samo zato, ker je to na splošno kako smo se nanašajo na spomin.
Torej, namesto da bi 0 skozi 19, kar imamo, je nič
x nič skozi ničelno x1 tri.
Tisti, ki so 20 bajtov pomnilnika, ki smo so ali pa gledaš na to sliko
točno tukaj.
>> Torej, vse to pa je dejal, kaj je korak stran od pomnilnika za sekundo
in nazaj na kazalcev.
Tu je najbolj pomembno, stvar, da se spomnimo
kot smo začeli delati s kazalci.
Kazalec je nič več kot naslovom.
Jaz bom še enkrat, ker pravijo, to je, da je pomembno,
kazalec ni nič več kot naslovom.
Kazalci so naslove lokacij v spomin, kjer spremenljivke živeti.
Vedoč, da postane upajmo malo lažje delati z njimi.
Druga stvar, ki mi je všeč storiti je, da imajo neke
diagramov vizualno predstavlja, kaj je dogaja z različnimi vrstic kode.
In bomo to nekaj storiti krat v kazalcev,
in ko govorimo o dinamični dodeljevanje pomnilnika, kot dobro.
Ker mislim, da so ti načrti je lahko še posebej koristno.
>> Torej, če rečem, na primer, int k v moji kodi, kaj se dogaja?
No, kaj se v bistvu dogaja se Dobivam pomnilnika v prahi za mene,
ampak sploh ne želi razmišljati o tem, kot da sem
želeli, da razmišljajo o tem, kot škatla.
Imam škatlo in to je obarvana zeleno, ker sem
lahko dal celih zelenih poljih.
Če je bil znak sem morda modro polje.
Ampak jaz vedno pravim, če sem ustvariti polje, ki lahko ima cela števila
da box je obarvana zeleno.
In vzamem stalno marker in pišem k ob strani njej.
Torej imam škatlo, imenovano k, v katero sem lahko dal cela.
Torej, ko sem rekel, int k, ki je kaj se dogaja v moji glavi.
Če rečem, k je enako pet, kaj počnem?
No, jaz sem dajanje pet v polje, desno.
To je precej preprosta, če Pravim int k, ustvarite polje imenovano k.
Če rečem, k je enak 5, dal pet v polje.
Upajmo, da ni preveč preskok.
Tukaj je, če stvari gredo malo zanimivo, čeprav.
Če rečem, int * pk, pa tudi če ne bom vem, kaj je to nujno pomeni,
to je očitno dobil nekaj opraviti s celo število.
Tako da bom za barvanje to polje zeleno-ish,
Vem, da je dobil nekaj storiti s celo število,
vendar to ni celo sam, ker je int zvezda.
Nekaj ​​je nekoliko razlikujejo o tem.
Torej vpleteni celo je, sicer pa je to
ni preveč drugačna od kaj smo govoriš.
To je polje, svoje dobil oznako, to je nosil PK etiket,
in je sposoben gospodarstva int zvezde, ne glede na tiste, ki so.
Imajo nekaj storiti s števil, jasno.
Tukaj je zadnja vrstica, čeprav.
Če rečem, pk = & k, vau, kaj se je zgodilo, kajne?
Torej, to naključno število, na videz naključno Številka, gets vrže v polje tam.
Vse to pomeni, da je pk dobi naslov k.
Tako da sem z vztrajanjem, kjer k živi v spominu, njegov naslov, naslov njene bajte.
Vse kar delam je, jaz pravim ta vrednost je tisto, kar bom
postaviti znotraj mojega polje imenovano PK.
In ker so te stvari kazalci, in ker je videti
v nizu podobnega ničelni x osem nič c sedem štiri osem
dva nič je verjetno ni zelo pomembno.
Ko smo na splošno vizualizirati kazalci, smo dejansko storijo kot kazalci.
Pk nam daje informacije moramo najti k v pomnilniku.
Torej v bistvu pk ima puščico v njem.
In če hodimo dolžino te puščice, si predstavljajte,
to je nekaj, kar lahko hodi naprej, če bomo hodi vzdolž puščice
v sam vrh tega puščice smo našli lokacijo v pomnilniku
kjer je k živi.
In to je res pomembno ker ko vemo, kje k živi,
bomo lahko začeli delati s podatki Notranjost tega pomnilnika.
Čeprav smo dobili poskočno bit pred sebe za zdaj.
>> Torej, kaj je kazalec?
Kazalec je podatek, katerega vrednost je pomnilniški naslov.
To je bil, da nič x osem nič stuff se dogaja, da je pomnilniški naslov.
So bili v pomnilniku lokacijo.
In tip kazalca opisuje vrsto
podatkov boste našli na da je pomnilniški naslov.
Torej je del prav int zvezda.
Če bi sledili temu puščico, je dogaja, da me pripelje na lokacijo.
In da je ta lokacija, kaj sem bodo tam našli v mojem primeru,
je zeleno obarvan polje.
To je celo, da je kaj sem boste našli, če grem na ta naslov.
Podatkovni tip kazalec opisuje, kaj
boste našli na tej pomnilniški naslov.
Torej, tukaj je res kul stvar, čeprav.
Kazalci nam omogočajo, da prenese spremenljivke med funkcijami.
In dejansko prenese spremenljivk in ne prenese njihove kopije.
Ker, če vemo, kje v spominu, da bi našli spremenljivko,
ne bomo morali narediti kopijo to smo lahko samo pojdi na tej lokaciji
in delo s to spremenljivko.
Torej, v bistvu kazalci vrste za narediti računalniško okolje
veliko več, kot v resničnem svetu, kajne.
>> Torej, tukaj je analogija.
Recimo, da imam prenosnik, desno, in je poln not.
In želim si, da ga dopolni.
Ste funkcija, ki posodobitve ugotavlja, desno.
Na poti smo bili delajo tako daleč, kaj
zgodi se boste sprejeli moj prenosni računalnik, boš šel v trgovino kopiranja,
vam bom lahko fotokopira vsaka stran od računalnika.
Boste zapustiti svoj prenosnik nazaj na moji mizi, ko ste končali,
boš šel in prečrtati stvari v moji notebook, da so zastareli ali narobe,
in potem boste preide nazaj me Snop Xerox strani
da je replika svoj zvezek z spremembe, ki ste jih vanjo.
In na tej točki, da je do mene, kot funkcija kliče, kot klicatelja,
da se odloči, da bo svoje zapiske in jih vključiti nazaj v svoj zvezek.
Torej, tam je veliko stopnic vključen tukaj, kajne.
Kot ne bi bilo bolje če sem samo rekel, hej, lahko
posodobiti svoj prenosni računalnik za mi, roko ti moj prenosni računalnik,
in vzameš stvari in dobesedno prečkati jih ven
in posodobiti svoje zapiske v svoj zvezek.
In potem mi je dal svoj prenosnik nazaj.
To je nekako tisto, kazalci nam omogočajo, da storiti,
dajo to okolje veliko bolj všeč, kako delujemo v resnici.
>> Vse je v redu, da je kaj kazalec se, kaj je govoril
o tem, kako kazalci delo v C, in kako lahko začnemo delati z njimi.
Torej je zelo preprost kazalec v C se imenuje null kazalec.
Null kazalec kaže na nič.
To verjetno se zdi, kot da je pravzaprav ni zelo uporabna stvar,
ampak kot bomo videli Malo kasneje, je dejstvo,
da ta null kazalec obstaja dejansko res lahko pridejo v priročni.
In vsakič, ko ustvarite kazalec, in ne nastavite svojo vrednost immediately-
Primer določanja njegova vrednost takoj
bo par diapozitive nazaj kjer sem rekel pk enaka & K,
pk dobi naslov K, kot je bomo videli, kaj to pomeni,
bomo videli, kako kodo, ki shortly- če ne nastavite njegovo vrednost na nečem
takoj smiselna, morate vedno
nastavite kazalec, da kaže na null.
Morate nastaviti, da kaže na nič.
>> To je zelo drugačen od Samo zaustavi vrednost, kot je
in nato razglasitev kazalec in samo ob predpostavki,
je nična, ker je to le redko res.
Torej bi morali vedno nastavite vrednost kazalca
NULL če ne nastavite njegovo vrednost da takoj nekaj smiselnega.
Lahko preverite, ali je vrednost kazalca v je nična pomočjo operaterja enakosti
(==), Tako kot vi primerjate koli celo število vrednosti ali vrednosti znakov s (==)
kot dobro.
To je posebna vrsta konstantna Vrednost, ki jo lahko uporabite za testiranje.
Tako da je to zelo preprost kazalec je null kazalec.
Drug način za ustvarjanje kazalec je citat
naslov spremenljivke ste že ustvarili,
in to storite z uporabo & Operater ekstrakcija naslov.
Ki smo že prej videli v prvem primeru diagramu sem pokazal.
Torej, če je x spremenljivka, ki smo jih že ustvarili tipa celo število,
potem je x kazalec na celo število.
& x za- spomnite, in se bo citat naslov stvar na desni strani.
In ker je kazalec je samo naslov, kot & x kazalec na celo število
katerih vrednost je, če v spomin x življenju.
To je x je naslov.
Torej & x je naslov x.
Oglejmo to en korak naprej in povezati z nečim
Sem se pojavi v predhodnem video.
Če arr je niz dvojic, nato & arr oglati oklepaj i kazalec
za dvojno.
V REDU.
arr peto nosilec I, če arr je niz dvojic,
potem arr peto nosilec i element i-tega niza,
in & arr peto nosilec i je, če v pomnilnik element i-th ARR obstaja.
>> Torej, kaj je posledice tukaj?
Nizi ime, posledice to celotno stvar,
je, da je ime matrika je dejansko sam kazalec.
Ste delali s kazalci vse skupaj
vsak čas, ki ste ga uporabili matriko.
Ne pozabite na primer na spremenljivo področje,
blizu konca video I predstavi Primer kjer imamo funkcijo
imenovani set int in Funkcija se imenuje niz niz.
In vaš izziv za določanje ali ne, ali kaj
vrednote, ki jih tiskani ven Konec funkcije
Na koncu glavnega programa.
>> Če se spomnite iz te primer ali če ste gledal video,
ste vedeli, da ko vam-poziv k set int dejansko ne naredi ničesar.
Toda klic nastavljena matrika počne.
In nekako sem prezrli zakaj da je bila že v času.
Pravkar sem rekel, tudi to je niz, to je posebnega, saj veš, da je to razlog.
Razlog za to je, da je matrika je ime je res samo kazalec,
in tam je ta posebna oglati oklepaj sintakso, ki
bi stvari veliko lepše delati.
In da je ideja o kazalec veliko manj zastrašujoče,
in da je, zakaj oni so nekako od predstavljeni na ta način.
Ampak res nizi so samo kazalci.
In zato, ko smo naredili spremembo matriki,
ko smo opravili vrsto kot parameter na funkcijo ali kot argument
do funkcije, vsebina matrike dejansko spremenilo v obeh callee
in klicatelja.
Ki je za vse druge vrste spremenljivka smo videli, ni bilo tako.
Torej, to je samo nekaj, da bo v misel, ko delate s kazalci,
je, da se v imenu Niz dejansko kazalec
s prvim elementom tega niza.
>> OK, tako da zdaj imamo vse te dejstva, dajmo nadaljuj, desno.
Zakaj nam je mar kjer je nekaj živi.
No, kot sem rekel, da je precej koristno vedeti, kje kaj živi
tako da lahko greš tja in jo spremenite.
Delo z njim in dejansko imajo stvar, ki vas
želite storiti v tem spremenljivo vzletno učinkom, in ne učinkuje na neki kopijo tega.
To se imenuje Dereferenciranje.
Gremo na reference in smo spremenili vrednost tam.
Torej, če imamo kazalec in se imenuje pc, in to kaže na značaj,
potem lahko rečemo * pc in * pc je ime, kaj bomo našli, če bomo šli
na naslov pc.
Kaj bomo našli tam je znak in * pc je, kako smo se nanašajo na podatke na tem
lokacija.
Torej bi lahko rekli nekaj podobnega * pc = D ali nekaj takega,
in to pomeni, da ne glede na je na pomnilniški naslov pc,
ne glede na karakter je bil prej tam je zdaj D, če rečemo * pc = D.
>> Torej, tukaj smo spet tam z nekaj čudnega C stvari, kajne.
Tako smo videli * prej kot nekako del podatkovnega tipa,
in zdaj je v uporabi v nekoliko drugačen kontekst
za dostop do podatkov na lokaciji.
Vem, da je malo zmedeno in da je pravzaprav del te celote
kot so, zakaj imajo kazalci to mitologijo okoli njih, saj so tako kompleksna,
je nekako problem sintakso, pošteno.
Toda * se uporablja v obeh kontekstih tako kot del imena tipa,
in bomo videli malo kasneje nekaj drugega, preveč.
In zdaj je Operater dereference.
Torej gre za referenco, da dostopi do podatkov
na mestu kazalca, in vam omogoča, da manipulira po svoji volji.
>> Zdaj je to zelo podobna obiščete svojega bližnjega, kajne.
Če veste, kaj je tvoj sosed živi, ​​ste
Ne družim s svojo sosedo.
Veste, da se zgodi, da vedeti, kje živijo,
vendar to ne pomeni, da ga krepost, ki imajo to znanje
ste v stiku z njimi.
Če želite interakcijo z njimi, moraš iti na svojo hišo,
moraš iti tja, kjer živijo.
In ko boste to storili, potem lahko sodelujete
z njimi, tako kot si jo želeli.
In prav s spremenljivkami, boste morali iti na njihov naslov
če želite, da jih interakcijo, ne moreš vedeti naslov.
In kako greš na naslov, je za uporabo *, operaterja razrešimo.
Kaj misliš, da se zgodi če bomo poskušali dereference
kazalec, katerega vrednost je nična?
Spomnimo se, da je null kazalec kaže na nič.
Torej, če ste poskušali in dereference nič ali pojdite na naslov nič,
Kaj misliš, da se zgodi?
No, če ste uganili segmentacija napaka, bi bilo prav.
Če poskusite in dereference null kazalec,
trpite za segmentacijo kriv. Toda počakaj,
ni vam povem, da če ne greš
da nastavite vrednost vašega kazalec na nekaj pomembnega,
morate nastaviti na ničlo?
Sem storil in dejansko segmentacija krivda je nekako dobro vedenje.
>> Ali ste že kdaj izjavil spremenljivko in ni takoj dodeli svojo vrednost?
Torej si pravkar rekel int x; ne boste pravzaprav ga dodelite karkoli
in potem kasneje v kodi, tiskate vrednost x,
ob še vedno ne je dodeljena karkoli.
Pogosto boste dobili nič, ampak včasih si
morda dobili nekaj naključno število, in nimate pojma, od kod je prišel.
Podobno lahko stvari zgodilo s kazalci.
Ko ste razglasi kazalec int * pk npr
in ga ne dodelite vrednost, dobiš štiri bajte, za spomin.
Ne glede na štirih bajtov pomnilniški sistem lahko
ugotovili, da imajo neko smiselno vrednost.
In bi lahko prišlo do nekaj, kar je že tam, da
z drugo, ni več potreben funkcijo, tako da boste morali
glede na podatke, je bil tam.
>> Kaj pa, če ste poskusili narediti razrešimo nekateri naslov, ki ste don't- ni bilo
že bajti in informacije tam, ki je zdaj v vašem kazalec.
Če poskusite in dereference tega kazalca, vas bo morda zajebavam z nekaj pomnilnika
da si ne namerava da igraš z njim vse.
In v resnici lahko storite nekaj res uničujoče,
kot prekinil drug program, ali prekinil drugo funkcijo,
ali narediti nekaj zlonamerno da niste nameravate storiti na vseh.
In tako, da je razlog, zakaj je pravzaprav dobra ideja
da nastavite vaše napotke na nič, če vas jih ne nastavljen na nekaj smiselnega.
To je verjetno bolje Na konec dneva za vaš program
crash potem za to, da stori Nekaj, kar polomi
drug program ali drugo funkcijo.
To vedenje je verjetno še manj idealen kot samo treskav.
In tako, da je razlog, zakaj je pravzaprav dobra navada
priti v nastavitvi kazalce NULL, če jih ne nastavite
pomembnejšega vrednosti takoj, da vrednost, da veste
in da lahko VARNO dereference.
>> Torej, kaj je prišel nazaj, zdaj in si oglejte na celotno sintakso razmer.
Če rečem, int * p ;, kaj sem naredil?
Kaj sem naredil je to.
Vem, da je vrednost p je naslov ker vsi kazalci so pravkar
naslovi.
Ne morem dereference p pomočjo operaterja *.
V zvezi s tem tu, na zelo top odpoklic * je del tipa.
Int * je podatkovni tip.
Ampak ne morem dereference p pomočjo operatorja *,
in če sem to storiti, če grem na ta naslov, kaj bom našel na tem naslovu?
Našel bom celo število.
Torej int * p je v bistvu rekoč, p je naslov.
Ne morem dereference p in če Delam, se mi zdi celo
pri tem pomnilniškem mestu.
>> OK, zato sem rekel, da je ena nadležna stvar z zvezdami
in tukaj je, če se to nadležno stvar, z zvezdami je.
Ste že kdaj poskusili, da razglasi več spremenljivk istega tipa
na isti liniji kodo?
Torej, za sekundo, se pretvarjamo, da je linija, koda pravzaprav imam tam v zeleno
ne obstaja in to samo pravi int x, y, z ;.
Kaj, da bi naredil je pravzaprav ustvarjanje tri cela spremenljivke za vas,
ena imenovana x, ena imenovana y, in ena imenovana z.
To je način, da to storite brez ob razdeliti na tri vrstice.
>> Tukaj je, kjer dobite zvezdice siten spet, čeprav,
ker je * je pravzaprav del tako ime tipa in delu
spremenljivke imena.
In tako, če rečem, int * px, py, pz, kaj sem dejansko dobili, je kazalec na celo število
imenuje px in dve celi števili, py in pz.
In to je verjetno tisto, kar ni želimo, da to ni dobro.
>> Torej, če želim ustvariti več kazalcev na isti liniji, istega tipa,
in zvezde, kar sem dejansko potrebujejo storiti, je rekel, int * pa * pb, * pc.
Zdaj ko je pravkar rekel, da je in zdaj ti to pove,
vam verjetno ne bo nikoli to storite.
In to je verjetno dobra stvar pošteno, ker ste morda nehote
izpustite zvezdo, nekaj takega.
To je verjetno najbolje, da morda razglasi kazalci na posameznih linijah,
ampak to je samo še ena nadležnih sintakse
stvari z zvezdami, ki omogočajo kazalci tako težko delati.
Ker je samo to skladenjska nered moraš delati skozi.
Z vajo se to zgodi res postala druga narava.
Še vedno delamo napake, s tem še vedno Po programiranju za obdobje 10 let,
tako ne razburjaj se, če se kaj zgodi za vas, je precej pogosta pošteno.
To je res nekako napaka v sintaksi.
>> OK, tako da sem nekako obljubil da bi ponovno
koncept, kako velika je niz.
No, če sem ti rekel, da je niz, ki smo jih res nekako
lagal, da vas ves čas.
Ni podatkovni tip se imenuje niz, ki v bistvu sem
to je omenila v eni od naših Prve posnetke na podatkovnih tipov,
da niz je bil tip podatkov, ki je bil ustvarjen za vas v CS50.h.
Moraš #include CS50.h, da bi ga uporabljali.
>> No niz je res samo vzdevek za nekaj
imenuje char *, A kazalec na znak.
No kazalci, odpoklic, so le naslovi.
Torej, kaj je velikost v bajtih niz?
No, to je štiri ali osem.
In razlog, zakaj sem rekel, štiri ali osem je zato, ker je dejansko
odvisno od sistema, Če uporabljate CS50 ide, char * je velikost char
* Je osem, to je 64-bitni sistem.
Vsak naslov v pomnilniku je 64 bitov dolgo.
Če uporabljate CS50 aparata ali z uporabo katerega koli 32-bitni stroj,
in ste slišali, da je čas 32-bit stroj, kar je 32-bitni stroj?
No, to samo pomeni, da je vsak naslov pomnilnika je 32 bitov.
In tako 32 bitov je štiri bajte.
Torej char * je štiri ali osem bajtov odvisno od vašega sistema.
In res vse vrste podatkov, in kazalec do vseh podatkov,
tip, saj so vsi kazalci le naslovi, štiri ali osem bajtov.
Tako da je ponovno to diagram in kaj je sklepanje
ta video z malo vaje tukaj.
Torej, tukaj je diagram smo končali s na samem začetku videa.
Torej, kaj se zgodi zdaj, če rečem * PK = 35?
Torej, kaj to pomeni, če rečem, * pk = 35?
Vzemite si trenutek.
* pk.
V zvezi s tem tukaj, * je Operater dereference.
Torej, ko je dereference Operater se uporablja,
gremo na naslov izpostavil PK, in spremenimo, kar smo našli.
Torej * pk = 35 učinkovito to stori na sliki.
Torej, to je v bistvu skladenjsko identična, da imajo omenjeni k = 35.
>> Še en.
Če rečem, int m, lahko izdelam nova spremenljivka imenovan m.
Nova škatla, to je zeleno polje, ker to se dogaja, da imajo celo število,
in je to označeno m.
Če rečem, m = 4, I Put celo v tem polju.
Če recimo pk = & m, kako deluje Ta diagram sprememba?
Pk = & m, ali se spomnite, kaj je In operater ne, ali se imenuje?
Ne pozabite, da & neko ime spremenljivke je naslov imenu spremenljivke.
Torej, kaj smo govoriš, je pk dobi naslov m.
In tako dejansko kaj zgodi, diagram je, da PK ni daljše točke
do k, vendar opozarja, da m.
>> Spet kazalci so zelo težavno delo z
in so se veliko praksa, ampak zato, ker
njihove sposobnosti, da vam omogoči prenesti podatke med funkcijami
in dejansko imajo tisti, Spremembe bodo začele veljati,
dobili svojo glavo okoli je res pomembno.
Verjetno je najbolj zapleten temo smo razpravljali v CS50,
vendar pa vrednost, ki vas dobili od pomočjo nasvetov
daleč odtehta komplikacij ki prihajajo iz njih učenje.
Torej vam želim najboljše sreče spoznavanje kazalci.
Sem Doug Lloyd, to je CS50.