>> [Muzikos grojimo]
>> Doug LLOYD: Pointeriai, čia mes.
Tai tikriausiai būti sunkiausia temą
kad mes kalbėti apie CS50.
O jei jūs skaitėte nieko apie rodykles
Prieš jums gali būti šiek tiek bauginanti vyksta į šį vaizdo įrašą.
Tai tiesa, kad patarimų Leidžiame jums galimybę
kad galbūt susukti gana blogai, kai esate
dirbant su kintamųjų ir duomenų, ir sukelia jūsų programa į avariją.
Bet jie tikrai tikrai naudinga ir jie leidžia mums tikrai puikus būdas
perduoti duomenis atgal ir atgal tarp funkcijų,
kad mes kitaip negalime daryti.
>> Ir taip, ko mes iš tikrųjų noriu padaryti čia yra traukinys
jums turėti gerą rodyklė drausmę, todėl kad jūs galite naudoti patarimų efektyviai
padaryti savo programas, kad daug geriau.
Kaip jau sakiau patarimų mums kitoks būdas perduoti duomenis tarp funkcijų.
Dabar, jei jūs prisimenate iš ankstesnė vaizdo, kai
mes kalbame apie kintamasis apimtis, jau minėjau,
kad visi duomenų, kad mes praeiti tarp funkcijos C yra perduodama pagal vertę.
Ir aš negali būti naudojama, kad draugyste, ką aš ten reiškė
buvo tai, kad mes perduodame kopijas duomenų.
Kai mes pereiname kintamąjį funkcija, mes ne nevaikštant kintamąjį
su funkcija, tiesa?
Mes artimųjų kopiją , kad duomenys, su funkcija.
Funkcija ką ji bus ir jis apskaičiuoja tam tikrą vertę,
o gal mes naudojame šią vertę kai ji suteikia jį atgal.
>> Ten buvo viena išimtis Ši taisyklė pravažiuojančių pagal vertę,
ir mes grįžti į tai, kas, kad yra šiek tiek vėliau šį vaizdo įrašą.
Jei mes naudojame patarimų, o ne naudojant kintamuosius,
arba, o ne naudojant kintamuosius patys ar jų kopijas kintamųjų,
dabar mes galime perduoti kintamuosius aplink tarp funkcijų kitokiu būdu.
Tai reiškia, kad jei mes darome vienų funkcijos pokyčiai,
kad pokyčiai bus iš tikrųjų imtis nesukeliantį kitokia funkcija.
Vėlgi, tai yra kažkas, kad mes negalėjome padaryti anksčiau,
ir jei jūs kada nors bandė apsikeitimo vertės dviejų kintamųjų funkcijos,
jūs pastebėjote šią problemą rūšiuoti šliaužti aukštyn, tiesa?
>> Jei norime apsikeitimo X ir Y, ir mes perduoti juos į funkciją, vadinamą apsikeitimo,
viduje funkcija apsikeitimo kintamieji padaryti keitimo vertybes.
Vienas tampa du, du tampa vienas, bet mes ne iš tikrųjų
nieko keisti originalo funkcija, į skambintojui.
Nes mes negalime, mes tik dirbti su jų kopijas.
Su rodyklėmis, nors mes galime iš tikrųjų perduoti X ir Y yra funkcija.
Ši funkcija gali padaryti kažkas su jais.
Ir tie kintamieji dydžiai realiai gali pasikeisti.
Taigi, kad gana pasikeitimas Mūsų gebėjimas dirbti su duomenimis.
>> Prieš mes pasinerti į patarimų, aš manau, kad verta
atsižvelgiant keletą minučių grįžti prie pagrindai čia.
Ir turėti ne kaip atrodo kompiuterio atmintyje darbai
nes šie du dalykai vyksta kad iš tikrųjų gana tarpusavyje.
Kaip Jūs tikriausiai žinote, Jūsų kompiuterinės sistemos
turite kietąjį diską arba gal kietojo disko,
kai byla saugojimo vietą rūšiuoti.
Tai paprastai kažkur kaimynystės 250 gigabaitų
kad gal iš terabaitų pora dabar.
Ir tai kur visi jūsų failai galiausiai gyventi,
net tada, kai kompiuteris yra išjungtas išjungti, galite pasukti jį atgal
ir jūs rasite savo failus ten vėl, kai jūs iš naujo paleisti sistemą.
Bet diskai, pavyzdžiui, kietajame diske HDD arba kietojo disko, SSD,
yra tik sandėliavimo patalpas.
>> Mes negalime iš tikrųjų nieko daryti su duomenys, kurie yra kietajame diske,
arba kietojo disko.
Tam, kad iš tikrųjų pakeisti duomenys arba perkelti jį aplink,
mes turime perkelti jį į RAM, laisvosios kreipties atminties.
Dabar RAM, jūs turite daug mažiau jūsų kompiuteryje.
Jums gali tekti kažkur kaimynystės 512 megabaitų
jei turite seną kompiuterį, į gal dviejų, keturių, aštuonių, 16,
galbūt net šiek tiek daugiau, GB RAM.
Taigi, kad daug mažesnė, bet tai kur visi iš lakiųjų duomenų egzistuoja.
Štai kur mes galime pakeisti dalykus.
Bet kai mes savo ruožtu mūsų kompiuterį išjungti, visi RAM duomenimis yra sunaikinta.
>> Štai kodėl mes turime turėti kietąjį diską už daugiau nuolatinę vietą jo,
taip, kad jis exists- jis būtų tikrai blogai, jei kiekvieną kartą mes
Paaiškėjo mūsų kompiuterį išjungti, kiekvienas failas mūsų sistemoje buvo atšauktas.
Taigi mes dirbame viduje RAM.
Ir kiekvieną kartą, kai mes kalbame apie atmintis, gana daug, kad CS50,
mes kalbame apie RAM, o ne kietajame diske.
>> Taigi, kai mes perkelti daiktus į atmintį, ji užima tam tikrą erdvę.
Visi duomenų tipų, kad mes dirbame su
imtis skiriasi sumos erdvės RAM.
Taigi kiekvieną kartą, kai kuriate sveikasis skaičius kintamasis keturių baitų atminties
yra atidėta RAM todėl jūs gali dirbti su tuo sveikojo skaičiaus.
Jūs galite paskelbti sveikasis skaičius, jį pakeisti, ją priskirti
kad vertė 10 tingų viena, taip toliau ir taip toliau.
Visa tai turi atsitikti RAM ir gausite keturi baitai
dirbti su už kiekvieną sveikasis skaičius, kad jūs sukuriate.
>> Kiekvienas simbolis sukurti gauna vieną baitą.
Tai tiesiog, kiek vietos yra reikia saugoti charakterį.
Kiekvienas plūdė, nekilnojamojo skaičius, gauna keturi baitai
nebent tai dvigubas tikslumo slankaus kablelio
skaičius, kuris leidžia jums tikslesnes ar daugiau skaitmenų
po kablelio neprarandant tikslumo,
kuri užima aštuonis baitųatminties.
Long long, tikrai dideli sveikieji skaičiai, Taip pat užtrukti iki aštuonių baitų atminties.
Kiek baitų atminties do įsipareigojimų imtis?
Na tegul įdėti kaištį šį klausimą dabar, bet mes grįžti į ją.
>> Taigi, atgal į šį atminties idėja kaip didelis masyvas baitų dydžio ląsteles.
Tai tikrai viskas yra, tai tik didžiulis masyvas ląstelių,
kaip bet kuris kitas masyvo, kad esate susipažinę su ir pamatyti,
išskyrus kiekvieną elementą yra vienas baitas pločio.
Ir kaip masyvą, kiekvienas elementas turi adresą.
Kiekvienas elementas masyve turi indeksą, ir mes
galima naudoti šio indekso padaryti vadinamieji laisvosios kreipties į masyvą.
Neturime pradėti nuo masyvo pradžioje,
kartoti per kiekvieną jo vienas elementas,
rasti tai, ko mes ieškome.
Galime tik pasakyti, noriu patekti į 15. elementas arba 100. elementas.
Ir jūs galite tiesiog pereiti į šio skaičiaus ir gauti naudą jūs ieškote.
>> Panašiai kiekvieną vietą atmintyje turi adresą.
Taigi jūsų atminties galia atrodo kažkas panašaus į tai.
Štai labai maža riekė atminties, tai yra 20 baitųatminties.
Pirmieji 20 baitų, nes mano kreipiasi ten apačioje
yra 0, 1, 2, 3, ir taip apie visą kelią iki 19.
Ir kai aš pareiškiu rodiklius ir kai aš pradedu dirbti su jais,
sistema vyksta nustatyti panaikinti kai man erdvė
Šiame atminties dirbti su mano kintamųjų.
Taigi, aš gali pasakyti, char c lygus kapitalą H. Ir kas nutiks?
Na sistema ketina atidėta man vieną baitą.
Šiuo atveju ji nusprendė baitų skaičių keturių, The adresu keturių baitų,
ir jis ketina laikyti laiškas kapitalas O ten man.
Jei aš tada sako int greitį riba lygi 65, tai
ketina atidėti keturių baitųatminties už mane.
Ir tai vyksta gydyti tiems keturių baitų kaip vieną vienetą
nes tai, ką mes dirbame su yra sveikas skaičius, čia.
Ir tai vyksta iki 65 laikyti ten.
>> Dabar jau aš rūšies sakau jums melą tiek,
teisus, nes mes žinome, kad Kompiuteriai dirbti dvejetainiu.
Jie nesupranta, nebūtinai ką kapitalo H
arba kas 65 yra, jie tik suprasti dvejetainius, nulių ir.
Ir taip faktiškai ką mes laikyti ten
yra ne raidė H ir numeris 65, o veikiau dvejetainiai atstovybės
dalį, kuri atrodo šiek tiek kažką panašaus į tai.
Ir visų pirma kontekstas kintamąjį,
jis nesiruošia tiesiog spjauti jį į, jis nesiruošia gydyti jį kaip vieną keturių
baitas riekė nebūtinai, tai tikrai vyksta
gydyti jį kaip keturis vienas baitas gabaliukus, kurios gali atrodyti kažką panašaus į tai.
Ir net tai ne visiškai teisinga arba,
nes kažkas vadinamas Baitų eiliškumas, kurį mes nesame
ketina patekti į dabar, bet Jei įdomu apie,
galite perskaityti apie mažai ir didelis Baitų eiliškumas.
Tačiau dėl šio argumento dėlei, už šio vaizdo sumetimais,
galime tik prielaidą, kad yra Faktas, kaip numeris 65 būtų
būti atstovaujama atminties kiekvieną sistemą,
nors tai nėra visiškai tiesa.
>> Bet tegul iš tikrųjų tiesiog gauti visiškai atsikratyti visų dvejetainės,
ir tiesiog galvoti apie kaip H ir 65, tai daug lengviau
galvoti apie tai, kaip kad kaip žmogus.
Visos teisės, todėl ji taip pat atrodo gal tiek atsitiktinai, kad I've- mano sistema
nedavė man baitų 5, 6, 7, ir 8 saugoti sveiką skaičių.
Yra Dėl šios priežasties, taip pat, kuris mes ne gauti į dabar, bet pakanka
pasakyti, kad tai, ką kompiuteris yra čia darai
tikriausiai geras žingsnis jos dalis.
Norėdami nesuteikia man atmintį, kad yra nebūtinai nugara prie nugaros.
Nors jis ketina tai padaryti dabar jei aš noriu gauti kitą eilutę,
vadinamas pavardė, ir aš noriu įdėti Lloyd ten.
Aš ruošiuosi reikia, kad tilptų vienas personažas, kiekvienas, kad laiškas yra
ketina reikalauti vieną simbolių, vienas baitas atmintį.
Taigi, jei galėčiau įdėti Lloyd į mano masyvo kaip tai aš esu gana gera eiti, tiesa?
Ko trūksta?
>> Atminkite, kad kiekvienas styginių mes dirbame In C baigiasi backslash nulis,
ir mes negalime praleisti, kad čia, arba.
Mums reikia atidėti vieną baitą atminties konstatuotina, kad todėl mes
žinoti, kada mūsų styginių baigėsi.
Taigi dar kartą ši tvarka kelio dalykų
atsiras atminties galia būti šiek tiek atsitiktinai,
bet ji iš tikrųjų yra, kaip Dauguma sistemų yra sukurta.
Norėdami juos išsirikiuoti kartotiniai iš keturių, dėl priežasčių, vėl
kad mes nereikia patekti į dabar.
Bet tai, todėl pakanka pasakyti, kad Po šių trijų eilučių kodo,
tai, kas atminties gali atrodyti.
Jei man reikia atminties vietas 4, 8, 12 ir laikyti savo duomenis,
Tai yra tai, ką mano atmintis gali atrodyti.
>> Ir tik būti ypač pedantiškas čia, kai
mes kalbame apie atminties adresai mes paprastai
padaryti naudojant šešioliktainius pastabomis.
Taigi, kodėl ne mes konvertuoti visus šiuos iš dešimtainės į šešioliktainį
tik todėl, kad yra visuotinai kaip mes vadiname atmintį.
Taigi užuot 0 per 19, ką mes turime, yra lygus nuliui
x nulio nulio x1 trys.
Tai yra 20 baitų atminties, kad mes yra ar mes ieškome šioje paveikslėlio
Štai čia.
>> Taigi visa tai, kas pasakyta, tegul žingsnį nuo atminties sekundę
ir atgal į rodykles.
Čia yra svarbiausia prisiminti
kaip mes pradėti dirbti su rodyklėmis.
Rodyklė nieko daugiau nei adresą.
Pasakysiu dar kartą, nes tai, kad svarbu,
rodyklė nieko daugiau nei adresą.
Pointeriai yra adresai į vietas atmintyje, kur kintamieji gyventi.
Žinant, kad jis tampa tikiuosi šiek tiek lengviau dirbti su jais.
Kitas dalykas, man patinka reikia padaryti, tai turi rūšiuoti
diagramas vizualiai atstovaujanti kas vyksta su įvairių linijų kodą.
Ir mes tai pora daryti kartų į rodykles,
ir kai mes kalbame apie dinamiška atminties paskirstymas, taip pat.
Nes manau, kad šie diagramos gali būti ypač naudinga.
>> Taigi, jei aš sakau, pavyzdžiui, int k mano kodas, kas vyksta?
Na ką iš esmės vyksta yra Gaunu atidėtos man atmintį,
bet nemanau net patinka galvoti apie tai, kaip, kad aš
patinka galvoti apie tai, kaip dėžutėje.
Turiu langelį ir tai spalvos žalia, nes aš
galite įdėti sveikieji žalios dėžės.
Jei tai buvo personažas man gali turėti mėlynas langelį.
Bet aš visada sakau, jei aš sukurti dėžutė, kuri gali turėti skaičiais
kad langelis spalvos žalia.
Ir aš nuolatinį žymeklis ir aš rašyti k ant jo pusės.
Taigi turiu langelį, pavadintą k į kurį galiu įdėti sveikieji skaičiai.
Taigi, kai aš sakau, int k, tai tai, kas vyksta mano galvoje.
Jei aš sakau K lygu penki, ką aš darau?
Na, aš išleisti penki langelyje, į dešinę.
Tai gana paprasta, jei Sakau int k sukurti langelį, pavadintą k.
Jei aš sakau k yra lygus 5, įdėti penkių į baudos aikštelę.
Tikimės, kad ne per daug šuolis.
Štai kur viskas eiti šiek mažai įdomi, nors.
Jei aš sakau int * pk, gerai, net jei aš neturiu žinote, kas tai būtinai reiškia,
tai aiškiai kažką daryti su sveikojo skaičiaus.
Taigi, aš ruošiuosi spalva šis langelis žalios ish,
Aš žinau, tai turiu kažką daryti su sveikasis skaičius,
bet tai ne pati sveikasis skaičius, nes tai int žvaigždė.
Yra kažkas šiek tiek skiriasi apie tai.
Taigi sveikas s dalyvauti, bet kitaip tai
ne per daug skiriasi nuo ką mes kalbame apie.
Tai dėžutė, jos gavo etiketę, jis dėvi etikečių PK,
ir tai galima laikyti int žvaigždės, kokia tai yra.
Jie turi kažką daryti su skaičiais, aiškiai.
Štai paskutinė eilutė nors.
Jei aš sakau PK = & K, Whoa, kas atsitiko, tiesa?
Taigi, šis atsitiktinių skaičių, atrodytų, atsitiktinė skaičius, gauna išmesti į baudos aikštelę ten.
Visa tai yra, yra Pk gauna K adresą.
Taigi, aš klijuoti kur k gyvena atmintyje, jos adresas, jos baitų adresas.
Viskas, ką aš darau yra aš sakau ši vertė yra tai, ką aš ruošiuosi
įdėti viduje mano dėžutė vadinamas pk.
Ir todėl, kad šie dalykai yra rodykles, ir todėl ieško
ne kaip nulinės x eilutę aštuoni nulis c septyni keturi aštuonių
du nulis tikriausiai nėra labai reikšmingas.
Kai mes paprastai įsivaizduoti patarimų, mes iš tikrųjų taip rodykles.
Pk suteikia mums informaciją turime rasti k atmintyje.
Taigi, iš esmės PK turi jame rodyklę.
Ir jei mes vaikščioti ilgis tos rodyklės, įsivaizduokite,
tai ką jūs galite vaikščioti, jei mes vaikščioti palei rodyklės ilgį,
pačiame Patarimas tos rodyklės, mes rasite atmintyje vietą
kur k gyvena.
Ir tai tikrai svarbu nes kai mes žinome, kur k gyvena,
mes galime pradėti dirbti su duomenų viduje, kad atminties vietoje.
Nors mes vis smulkutis šiek tiek prieš save dabar.
>> Taigi, kas yra žymeklis?
Rodyklė yra duomuo, kurio vertė yra atminties adresas.
Tai buvo, kad nulio x aštuoni nulis stuff vyksta, tai buvo atminties adresas.
Tai buvo atmintyje vietą.
Ir rodyklė tipas aprašoma natūra
Duomenų rasite kad atminties adresas.
Taigi ten INT žvaigždutė dalis dešinę.
Jei aš sekti, kad rodyklę, tai ketina veda mane į vietą.
Ir tai vieta, ką aš ras ten mano Pavyzdžiui,
yra žalia spalvos dėžutę.
Tai sveikas, tai ką aš ras, jei aš einu į tą adresą.
Duomenų tipas Kurių rodyklė aprašoma, kas
rasite tuo atminties adresą.
Taigi čia tikrai cool dalykas, nors.
Pointeriai leidžia mums perduoti kintamieji tarp funkcijų.
Ir iš tikrųjų perduoti kintamuosius ir neperduoda jų kopijas.
Nes jei mes tiksliai žinoti, kur atmintyje rasti kintamąjį,
mums nereikia padaryti kopiją tai, mes galime tiesiog eiti į tą vietą
ir dirbti su šiuo kintamuoju.
Taigi iš esmės rodyklės Rūšiuoti Make kompiuterinę aplinką
daug kaip ir realiame pasaulyje, į dešinę.
>> Taigi čia analogija.
Tarkime, kad turiu nešiojamąjį kompiuterį, teisė, ir tai visiškai pastabose.
Ir aš norėčiau, kad jūs ją atnaujinti.
Jūs esate funkcija, kuri Atnaujinimai pastabos, į dešinę.
Be to, kaip mes buvome darbo iki šiol, ką
atsitinka, yra jums imtis savo nešiojamojo kompiuterio, jums eiti į kopijavimo parduotuvėje,
jums padaryti Xerox kopiją kiekvienas Notepad puslapis.
Jūs palikti savo nešiojamą kompiuterį atgal ant mano stalo, kai baigsite,
jums eiti ir užbraukti dalykų mano Notepad, kad yra pasenę ar neteisinga,
ir tada jums perduoti atgal į man Xerox puslapiuose kamino
tai yra mano nešiojamojo kompiuterio replika su pakeitimai, kad jūs padaryti jį.
Ir tuo momentu, tai pas mane taip vizitine funkcija, kaip skambinančiojo,
nuspręsti imtis savo pastabas ir integruoti juos atgal į mano nešiojamojo kompiuterio.
Taigi ten yra daug žingsnių čia dalyvauja, į dešinę.
Kaip ar nebūtų geriau jei aš tiesiog pasakyti, ei, jūs galite
atnaujinti savo Notepad man ranka jums mano nešiojamojo kompiuterio,
ir jūs imtis dalykų ir tiesiog kirsti juos
ir atnaujinti savo pastabas mano nešiojamojo kompiuterio.
Ir tada man mano nešiojamojo kompiuterio atgal.
Tai tipo kas rodyklės leidžia mums daryti,
jie ši aplinka daug daugiau patinka, kaip mes dirbame iš tikrųjų.
>> Visos teisės taip, kad tai, ką rodyklė yra, pakalbėkime
apie tai, kaip patarimų dirbti C, o kaip mes galime pradėti su jais dirbti.
Taigi ten labai paprasta žymeklis C vadinamas null žymeklį.
Null rodyklė taškai nieko.
Tai tikriausiai atrodo, kad tai iš tikrųjų nėra labai naudingas dalykas,
bet kaip mes matome tiek vėliau, tai
kad tai niekinis žymeklis egzistuoja tikrai tikrai gali praversti.
Ir kiekvieną kartą, kai jums sukurti rodyklę ir jums nereikia nustatyti jo vertės immediately-
AN nustatymo pavyzdys jo vertė iš karto
bus pora skaidres atgal kur sakiau PK lygus & K,
PK gauna K adresą, kaip matysime, ką tai reiškia,
matysime, kaip kodas, kuris shortly- jei mes neturime nustatyti jo vertę kažką
prasmingas iš karto, Jūs visada turėtų
nustatyti savo žymiklį, kad rodytų į NULL.
Turėtumėte nustatyti, kad jis rodytų į nieką.
>> Tai labai skiriasi nuo tiesiog paliekant vertę, nes ji yra
ir tada pareiškimu, žymeklis, ir tik darant prielaidą,
tai niekinis, nes tai retai tiesa.
Taigi jūs visada turėtų nustatyti iš rodyklė vertė
nuliui, jei jūs neturite nustatyti jo vertę į kažką prasmingo nedelsiant.
Galite patikrinti, ar rodyklė vertės yra niekinis naudojant lygybės operatorius
(==), Kaip jūs palyginkite bet koks sveikasis skaičius vertės arba simbolių reikšmes (==)
taip pat.
Tai specialus tarsi konstanta Vertė, kurią galite naudoti norėdami išbandyti.
Taigi, tai buvo labai paprastas žymeklis, null žymeklis.
Kitas būdas sukurti rodyklė yra išgauti
kintamosios adresas Jūs jau sukurta,
ir tai padaryti naudojant ir operatorius adresas gavyba.
Kuris mes jau matėme anksčiau pirmoje schema pavyzdyje parodžiau.
Taigi, jei x yra kintamasis, kuriuo mes jau sukurta tipo sveikasis skaičius,
tada ir x yra rodyklė į sveikojo skaičiaus.
& x klausimus: pa- prisiminti, ir ketina išgauti iš dešinėje dalykas adresas.
O kadangi rodyklė yra tik adresas, nei & x yra rodyklė į sveikasis skaičius
kurių vertė yra kur atminties x gyvenimą.
Tai x adresas.
Taigi, & x yra x adresas.
Paimkime vieną žingsnį toliau ir prisijungti prie kažko
Aš užsiminiau ankstesniame vaizdo.
Jei aranžuotė yra dviviečiai masyvas, tada & aranž kvadratinių laikiklis i rodyklė
dvigubo.
GERAI.
ARR kvadratinių laikiklį Aš, kai ARR yra dviviečiai masyvas,
tada ARR kvadratinių laikiklis i i-asis elementas tą masyvą,
ir & ARR kvadratinių laikiklis i kur atminties i-tojo elemento ARR egzistuoja.
>> Taigi, kas yra iškyla čia?
Matricas pavadinimas, POVEIKIS visos šios dalykas,
yra tai, kad masyvo vardas iš tikrųjų pati rodyklė.
Jūs dirbu su rodyklėmis visi kartu
kiekvieną kartą, kai jūs naudojote masyvą.
Įsiminti iš Pavyzdžiui kintamojo taikymo sritį,
netoli vaizdo aš pateikti pabaigos pavyzdys, kai mes turime funkciją
vadinamas rinkinys int ir funkcija vadinama rinkinys masyvo.
Ir jūsų uždavinys nustatyti, ar ne, arba, kas
vertybės, kurias išspausdinti iš funkcijos pabaiga,
ties pagrindinės programos pabaigoje.
>> Jei prisimenate iš to Pavyzdžiui arba jei jūs stebėjo vaizdo įrašą,
žinote, kad kai jums-į skambutį rinkinys int efektyviai nieko nedaro.
Tačiau skambutis nustatyti masyvo daro.
Ir aš tarsi glossed kodėl tai buvo tuo metu, atveju.
Aš ką tik pasakė, gerai tai masyvas, tai ypatinga, žinote, ten yra priežastis.
Taip yra todėl, kad matrica s vardas tikrai tik rodyklė,
ir ten šis specialus kvadratinių laikiklis sintaksė, kad
kad viskas daug gražiau dirbti.
Ir jie ā idėją žymiklį daug mažiau bauginanti,
ir tai, kodėl jie tarsi iš pateiktos tokiu būdu.
Bet iš tikrųjų matricos yra tik rodyklės.
Ir štai kodėl kai mes padarė Array kaita,
kai mes išlaikė masyvą kaip parametras prie funkcijos arba kaip argumentas
prie funkcijos, masyvo turinys iš tikrųjų pasikeitė tiek callee
ir skambintojui.
Kuris kiekvienam kitos rūšies kintamasis matėme buvo ne tas atvejis.
Taigi, kad tiesiog kažkas palaikyti galvą, kai jūs dirbate su rodyklėmis,
yra tai, kad vardas masyvas iš tikrųjų rodyklė
į pirmojo elemento tos masyvo.
>> Gerai, kad dabar mes turime visa tai faktai, tegul nesustoti, tiesa.
Kodėl mums rūpi kur kažkas gyvena.
Na kaip ir sakiau, tai gana Naudinga žinoti, jei kažkas gyvena
todėl jūs galite eiti ten ir pakeiskite jį.
Su juo dirbti ir faktiškai turi dalykas, kad jūs
noriu padaryti, kad kintamasis įsigaliotų, o ne įsigalioti tam tikrą jo kopiją.
Tai vadinama dereferencing.
Mes einame į nuorodą ir mes pakeisti reikšmę ten.
Taigi, jei mes turime žymeklį ir ji vadinama PC, ir ji nurodo pobūdžio,
tada mes galime pasakyti * PC ir * PC yra pavadinimas, ką mes rasti, jei mes einame
į adresų vnt.
Ką mes surasime yra simbolis ir * PC, kaip mes vadiname tuos duomenis, kad
Location.
Taigi, mes galime pasakyti kažką panašaus * PC = D arba kažkas panašaus,
ir tai reiškia, kad bet kokia buvo atminties adresą kompiuterio,
kokia pobūdis anksčiau buvo ten, dabar D Jei sakytume * pc = D.
>> Taigi čia mes einame vėl su kai keistai C dalykai, į dešinę.
Taigi mes matėme * anksčiau kaip nors dalis duomenų tipą,
ir dabar jis naudojamas šiek tiek kitoks kontekstas
prieiti prie duomenų, esant vietą.
Žinau, kad tai šiek tiek klaidina ir kad iš tikrųjų dalis šios visumos
kaip, kodėl patarimų šią mitologiją aplink juos, kaip yra taip sudėtinga,
rūšies sintaksės problemą, sąžiningai.
Bet * yra naudojamas abiejų kontekste, tiek kaip dalis tipo pavadinimu,
ir mes pamatyti šiek tiek vėliau kažkas, taip pat.
Ir dabar yra dereference operatorius.
Taigi jis eina į nuorodą, jis pasiekia duomenis
tuo rodyklės vietą, ir leidžia manipuliuoti savo valia.
>> Dabar tai yra labai panašios į apsilankymą savo artimą, į dešinę.
Jei žinote, ką jūsų kaimynas gyvena, jūs
ne hanging out su savo kaimyne.
Jūs žinote, jūs atsitikti žinoti, kur jie gyvena,
bet tai nereiškia, kad, kad iki dorybė turėti šias žinias
Jūs bendrauja su jais.
Jei norite bendrauti su jais, jūs turite eiti į savo namus,
jūs turite eiti ten, kur jie gyvena.
Ir, kai jūs padaryti, kad galite bendrauti
su jais kaip jūs norėtumėte.
Ir panašiai su kintamųjų, Jums reikia eiti į savo adresą
jei norite bendrauti juos, galite ne tik žinoti adresą.
Ir kaip jūs einate į adresą yra naudoti *, The dereference operatorių.
Ką manote atsitinka jei mes pabandyti ir dereference
rodyklė kurio vertė yra niekinis?
Prisiminkite, kad null rodyklė nurodo nieko.
Taigi, jei jūs bandote ir dereference nieko arba eikite į adresų nieką,
Ką manote atsitiks?
Na, jei jūs atspėjote segmentavimas kaltės, norite būti teisus.
Jei bandysite ir dereference null žymeklis,
sergate segmentaciją kaltės. Bet palaukite,
Argi aš sakau, kad Jei esate nesiruošia
nustatyti savo vertę jūsų žymiklį į kažką prasmingo,
turėtumėte nustatytas nulis?
Aš ir iš tikrųjų segmentavimas kaltė yra rūšies gerą elgesį.
>> Ar jūs kada nors paskelbta kintamų ir nepriskirta savo vertę iš karto?
Taigi jūs tiesiog pasakyti int x; jūs neturite iš tikrųjų ją priskirti prie nieko
o vėliau ant jūsų kodas, atsispausdinti X vertę,
turintys dar nėra priskirti ją prie nieko.
Dažnai gausite nulis, bet kartais
gali kažkiek atsitiktinių skaičių ir Jūs neturite idėjos, kur ji atėjo iš.
Panašiai gali dalykus atsitikti su rodyklėmis.
Kai paskelbti rodyklę tarpinis junginys * Pk pavyzdžiui,
ir jums nereikia priskirti jį prie vertės, gausite keturi baitai atminties.
Nepriklausomai nuo keturių baitų atminties sistema gali
kad turi tam tikrą prasmingą reikšmę.
Ir ten galėjo būti kažkas jau ten, kad
nebereikalingas kita funkciją, todėl jums tereikia
išlikusius duomenis ten buvo.
>> Ką daryti, jei jūs bandėte daryti dereference kai adresą, kurį don't- ten buvo
jau baitų ir informacija ten, tai dabar yra jūsų rodyklę.
Jei bandysite ir dereference tą rodyklę, jums gali būti Messing su kai atminties
kad jūs neketino kad netvarka su juo visus.
Ir iš tiesų, galite tai padaryti kažkas tikrai sukrečiantys,
kaip sulaužyti kitą programą, arba nutraukti kitą funkciją,
ar kažką daryti kenksmingą kad Jūs neketino daryti ne visi.
Ir taip, tai kodėl tai tikrai gera idėja
nustatyti savo patarimų nuliui, jei jums nenustato juos kažką prasmingo.
Tai turbūt geriau ne pabaigos šios dienos savo programą
į avariją, tada ji daryti Kažkas, kad varžtai up
kita programa ar kita funkcija.
Tai elgesys yra turbūt net mažiau idealus ne tik kritimo.
Ir taip, tai kodėl tai tikrai geras įprotis
patekti į nustatyti savo patarimų nuliui, jei jūs neturite nustatyti juos
į prasmingą vertės iš karto, tai yra, vertės, kad jūs žinote,
ir kad jūs galite saugiai dereference.
>> Taigi leiskite grįžti dabar ir pažvelgti į bendrą sintaksė situaciją.
Jei aš sakau int * p ;, ką aš ką tik padariau?
Ką aš padariau tai.
Aš žinau, kad p reikšmė yra adresas nes visi rodyklės yra tik
adresai.
Galiu dereference p naudojant * operatorių.
Šiame kontekste Čia, labai Top prisiminti ir * yra dalis tipo.
Žiniasklaida * yra duomenų tipas.
Bet galiu dereference p naudojant * operatorių,
ir jei aš tai padaryti, jei aš einu į tą adresą, kas bus rasti šiuo adresu?
Aš rasite sveikasis skaičius.
Taigi int * p yra iš esmės sakydamas, p yra adresas.
Galiu dereference p ir jei Darau, rasite sveikasis skaičius
tuo atminties vietoje.
>> Gerai, kad aš pasakiau buvo dar vienas erzina dalykas žvaigždės
o čia kur, kad erzina dalykas, žvaigždės yra.
Ar jūs kada nors bandė deklaruoti keli kintamieji tos pačios rūšies
ant tos pačios eilutę kodo?
Taigi per sekundę, apsimesti, kad linija, kodas Aš iš tikrųjų turi ten žalia
ten nėra ir ji tiesiog teigia tarpinis junginys x, y, z ;.
Ką tai galėtų padaryti, tai iš tikrųjų sukurti trys sveikieji kintamieji už jus,
vienas vadinamas X, vienas vadinamas y ir vienas vadinamas z.
Tai būdas tai padaryti be turintys padalinti į tris eilutes.
>> Štai kur žvaigždės gauti erzina vėl, nors,
nes * yra iš tikrųjų dalis Abu tipo pavadinimas ir dalis
Kintamosios vardu.
Ir todėl, jei aš sakau, int * px, py, pz, ką aš faktiškai gauti yra rodyklė į sveikojo skaičiaus
vadinamas px ir du sveikieji skaičiai, PY ir pz.
Ir tai turbūt ne ką mes norime, kad tai nėra gerai.
>> Taigi, jei aš noriu sukurti keletą patarimų ant tos pačios linijos, tos pačios rūšies,
ir žvaigždės, kas man iš tikrųjų reikia reikia padaryti, tai pasakyti int * PA, PB * * vnt.
Dabar ką tik sakė, kad ir dabar sakau jums šį,
jūs tikriausiai niekada tai padaryti.
Ir tai tikriausiai geras dalykas sąžiningai, nes galite netyčia
praleisti žvaigždė, kažką panašaus.
Tai turbūt geriausia gal deklaruoti patarimų dėl atskirų linijų,
bet tai tik dar vienas iš tų erzinančių sintaksę
ką su žvaigždėmis, kad padaryti rodykles taip sunku dirbti.
Nes tai kaip tik tai sintaksinis netvarka turite dirbti per.
Su praktika ji tikrai tampa antra pobūdžio.
Aš vis dar klystame su juo dar po programavimo 10 metų,
todėl neturi būti nusiminusi, jei kas nors atsitiks jums, tai gana dažnas sąžiningai.
Tai tikrai rūšies iš sintaksę trūkumas.
>> Gerai, kad aš tipo pažadėjo kad mes naujo
klausimas, kaip didelis sąvoka yra eilutė.
Na, jei aš sakiau jums, kad eilutė, mes tikrai natūra
buvo melas jums visą laiką.
Nėra duomenų tipas vadinamas eilutė, ir iš tikrųjų aš
minėta tai vienas iš mūsų Ankstyviausi video apie duomenų tipus,
kad eilutė buvo duomenų tipas, buvo sukurta už jus CS50.h.
Turite #include CS50.h siekiant jį naudoti.
>> Na eilutė yra tikrai tik Prašymas kažką slapyvardis
vadinamas char * A Rodyklė pobūdžio.
Na patarimų, prisiminti, yra tik adresus.
Taigi, kas yra dydis baitais eilutę?
Na tai keturių arba aštuonių.
Ir priežastis sakau keturis ar aštuoni, nes ji iš tikrųjų
priklauso nuo sistemos, Jei naudojate CS50 IDE, char * yra char dydis
* Yra aštuoni, tai 64 bitų sistemos.
Kiekvienas atmintyje adresas yra 64 bitų ilgio.
Jei naudojate prietaisą CS50 arba naudojant 32 bitų mašina,
ir jūs girdėjote, kad terminas: 32-bitų mašina, kas yra 32 bitų mašina?
Na tai tiesiog reiškia, kad kiekvienas adresas atmintyje yra 32 bitų ilgio.
Ir taip 32 bitai yra keturi baitai.
Taigi char * yra keturios ar aštuonios baitų, priklausomai nuo jūsų sistemos.
Ir iš tiesų visi duomenų tipai, ir rodyklė į bet duomenų
įrašykite, nes visi rodyklės yra tik adresai, keturi ar aštuoni baitai.
Taigi leiskite peržiūrėti šį diagrama ir tegul sudaryti
Šis vaizdo įrašas su truputį pasimankštinti čia.
Taigi čia diagrama mes palikome ne su pačioje pradžioje vaizdo įrašo.
Taigi, kas vyksta dabar, jei aš sakau * PK = 35?
Taigi, ką tai reiškia, kai aš sakau, * PK = 35?
Paimkite sekundę.
* pk.
Be konteksto čia * yra dereference operatorius.
Taigi, kai dereference operatorius yra naudojamas,
mes einame į adresų atkreipė dėmesį į PK, ir mes pakeisti tai, ką mes matome.
Taigi * PK = 35 efektyviai daro tai paveikslėlyje.
Taigi tai iš esmės sintaksiškai identiška pasakęs k = 35.
>> Dar vienas.
Jei aš sakau int m, sukurti naujas kintamasis vadinamas m.
Nauja dėžutė, tai žalia dėžutė, nes jis ketina surengti sveikasis skaičius,
ir jis ženklinamas m.
Jei aš sakau m = 4, aš įdėti sveikasis skaičius į tą dėžutę.
Jei tarkim PK = & M, kaip veikia Ši diagrama pokyčiai?
PK = & M, tai jūs prisimenate ką & Operatorius daro arba yra vadinama?
Atminkite, kad ir keletas kintamojo pavadinimą yra kintamojo vardas adresą.
Taigi, ką mes pasakyti, PK gauna M adresą.
Ir taip efektyviai, kas atsitiks Diagramoje yra tai, kad PK nebegalėsite taškų
k, bet pažymi M.
>> Vėlgi patarimų yra labai sudėtinga dirbti su
ir jie imasi daug praktika, bet todėl,
jų gebėjimas leidžia perduoti duomenis tarp funkcijų
ir iš tikrųjų turi tie, pakeitimai įsigalios,
gauti savo galvą aplink yra tikrai svarbu.
Tai tikriausiai yra pats sudėtingiausias temą, mes aptarti CS50,
bet vertė, kuri jus gauti iš naudojant rodykles
gerokai viršija komplikacijų kad iš jų mokymasis.
Taigi linkiu jums geriausias Sėkmės sužinoti apie rodykles.
Aš Doug Lloyd, tai CS50.