[Musiikkia] DOUG Lloyd: Osoittimet, tässä me olemme. Tämä on todennäköisesti aio olla vaikein aihe että puhumme CS50. Ja jos olet lukenut mitään viitteitä ennen saatat olla hieman uhkaava menee tämän videon. On totta viitteitä sallimme mahdollisuuden kenties tyriä aika pahasti kun olet kanssa muuttujia, ja tiedot, ja aiheuttaa ohjelman kaatumisen. Mutta he todella todella hyödyllinen ja ne auttavat meitä todella hyvä tapa siirtää tiedot takaisin ja edestakaisin välillä toimintoja, että emme muuten pysty tekemään. Ja niin mitä me todella halua tehdä tässä juna sinun on hyvä osoitin kuria, niin että voit käyttää osoittimia tehokkaasti tehdä ohjelmia niin paljon parempi. Kuten sanoin viitteitä antaa meille eri tapa siirtää dataa toimintoja. Nyt jos muistatte aikaisemmin video, kun puhuimme kiikaritähtäimellä, mainitsin että kaikki tiedot, jotka ohitamme välillä toiminnot C ohi arvo. Ja en ehkä ole käyttänyt, että termi, mitä tarkoitin siellä oli se, että olemme ohimennen kopioita tietojen. Kun välitämme muuttujan funktio, emme oikeastaan ​​kulkee muuttuja toiminnon, eikö? Olemme kulkee kopio että datan funktio. Toiminto tekee mitä se tulee ja se laskee jotain arvoa, ja ehkä käytämme että arvo kun se antaa sen takaisin. Siellä oli yksi poikkeus tämä sääntö ohi arvon, ja tulemme takaisin, mitä se on vähän myöhemmin tämän videon. Jos käytämme viitteitä sijaan käyttää muuttujia, tai sen sijasta käyttää muuttujien itse tai kopioita muuttujien, voimme nyt kulkea muuttujat ympärillä välillä toimii eri tavalla. Tämä tarkoittaa, että jos teemme muutos yksi toiminto, että muutos todella ottaa vaikutus eri toimintoa. Tämäkin on asia, emme voineet tehdä aikaisemmin, ja jos olet koskaan yrittänyt vaihtaa arvo kaksi muuttujaa funktion, olet huomannut tämän ongelman eräänlainen noususuunnassa, eikö? Jos haluamme vaihtaa X ja Y, ja me siirtää ne toiminto nimeltään swap, sisällä toiminto vaihtaa muuttujat tehdä vaihto arvot. Yksi tulee kaksi, kaksi tulee yksi, mutta emme oikeastaan muuttaa mitään alkuperäisessä toiminto, että soittaja. Koska emme voi, emme vain työskentelee jäljennökset. Osoittimet kuitenkin, voimme todella siirtää X ja Y funktio. Tämä toiminto voidaan tehdä jotain heidän kanssaan. Ja niitä muuttujia arvojen voi todella muuttaa. Joten se on aivan muutos kykymme työskennellä tiedot. Ennen kuin sukeltaa osoittimet, mielestäni se kannattaa kun muutaman minuutin palata perusasioihin täällä. Ja katsoa, ​​miten tietokoneen muistiin työt koska nämä kaksi aihetta ovat menossa todella olla melko toisiinsa. Kuten ehkä tiedätte, tietokoneen järjestelmässä sinulla on kovalevy tai ehkä Solid State Drive jonkinlainen tiedostojen tallennuspaikka. Se on yleensä jossain naapurustossa 250 gigatavua ja ehkä pari teratavua nyt. Ja se on silloin, kun kaikki tiedostoja lopulta elää, vaikka tietokone on pois pois, voit ottaa sen takaisin ja löydät tiedostot ovat siellä uudelleen, kun järjestelmä käynnistetään uudelleen. Mutta levyasemat, kuten kiintolevyn, HDD, tai Solid State Drive, SSD, ovat vain säilytystilaa. Emme voi oikeastaan ​​tehdä mitään datan, joka on kiintolevy, tai SSD-aseman. Jotta todella muuttaa tietoja tai siirtää sen ympärillä, meidän on siirtää sen RAM, random access memory. Nyt RAM, sinulla on paljon vähemmän tietokoneessa. Saatat olla jossain naapurustossa 512 megatavua jos sinulla on vanhempi tietokone, ja ehkä kaksi, neljä, kahdeksan, 16, mahdollisesti jopa hieman enemmän, gigatavua RAM-muistia. Niin, että on paljon pienempi, mutta se on jossa kaikki haihtuvat tietojen olemassa. Siellä voimme muuttaa asioita. Mutta kun me käännämme tietokoneesta virta, kaikki tiedot RAM tuhoutuu. Joten siksi meidän on kiintolevylle entistä pysyvää sijainnin se, niin, että se exists- se olisi todella huono, jos joka kerta käänsimme tietokoneesta virta, joka tiedosto järjestelmäämme on häivytetty. Joten teemme sisällä muistia. Ja joka kerta kun puhumme muisti, aika paljon, vuonna CS50, puhumme RAM, ei kiintolevyn. Joten kun siirrymme asiat muistiin, se vie jonkin verran tilaa. Kaikki tietotyyppejä että olemme työskennelleet ryhtyä eri määriä tilaa RAM. Joten aina luoda kokonaisluku muuttuja, neljä tavua muistia on varattu RAM joten sinun voi työskennellä että kokonaisluku. Voit julistaa kokonaisluku, muuttaa sitä, määrittää sen arvoon 10 kasvatetaan yhdellä, niin edelleen ja niin edelleen. Kaikki mitä tarvitsee tapahtua RAM, ja saat neljä tavua työskennellä jokaisen kokonaisluku, jonka luot. Jokainen merkki sinua luoda saa yhden tavun. Se on vain, kuinka paljon tilaa on varastointiin tarvitaan merkki. Jokainen kellua, todellinen numero, saa neljä tavua ellei se kaksinkertainen tarkkuuden liukuluku numero, jonka avulla voit on tarkempien ja numeroa desimaalipilkun jälkeen menettämättä tarkkuus, joka kestää jopa kahdeksan tavua muistia. Pitkä pitkät, todella iso kokonaislukuja, myös kahdeksan tavua muistia. Montako tavua muistia do jouset ryhtyä? No katsotaanpa laittaa tappi tähän kysymykseen nyt, mutta me palata siihen. Joten takaisin tämän ajatuksen muistia iso joukko tavun kokoinen soluja. Se on todella kaikki se on, se on vain valtava joukko soluja, kuten muutkin array, joka olet perehtynyt ja nähdä, paitsi jokainen elementti on yksi tavu leveä. Ja aivan kuten array, jokainen elementti on osoite. Jokainen elementti array on indeksi, ja me voi käyttää tätä indeksiä tehdä ns random access array. Meillä ei tarvitse aloittaa alussa array, kerrata läpi jokaisen yksittäinen tekijä sen, löytää mitä etsimme. Voimme vain sanoa, haluan päästä 15. elementti tai 100. elementti. Ja voit vain kulkea, että määrä ja saada arvon etsit. Samoin jokainen sijainti muistiin on osoite. Joten muisti saattaa näyttää suunnilleen tältä. Tässä hyvin pieni kimpale muisti, tämä on 20 tavua muistia. Ensimmäiset 20 tavua koska minun käsitellään siellä alareunassa ovat 0, 1, 2, 3, ja niin alusta loppuun jopa 19. Ja kun minä julistaa muuttujia ja kun käynnistän työskennellä heidän kanssaan, järjestelmä tulee asettaa syrjään tilaa minulle Tässä muistissa töihin minun muuttujia. Niin voisin sanoa, nieriää C vastaa pääoman H. Ja mitä tulee tapahtumaan? Hyvin järjestelmä on menossa varattu minulle yhden tavun. Tällöin se valitsi tavu numero neljä, tavun osoitteessa neljä, ja se tulee säilyttää kirjain pääoma H siellä minua. Jos siis minä sanon int nopeus raja vastaa 65, se on aikoo varata neljä tavua muistia minulle. Ja se tulee kohdella neljä tavua yhtenä yksikkönä koska mitä pyrimme jossa on kokonaisluku täällä. Ja se tulee säilyttää 65 siellä. Nyt jo olen sellainen kerron hieman valhe, oikea, koska tiedämme, että tietokoneet työ binary. He eivät ymmärrä, välttämättä mitä pääoma H on tai mitä 65 on, ne vain ymmärtää binary, nollia ja ykkösiä. Ja niin todella mitä olemme tallentaminen siellä ei ole kirjain H ja numero 65, vaan binääriesitykset sen, joka näyttää vähän jotain tällaista. Ja erityisesti yhteydessä kokonaisluku muuttujan, se ei tule vain sylkeä se, se ei tule kohdella sitä yhtenä neljästä tavu kimpale välttämättä, se todella tapahtuu kohdella sitä kuten neljä yhden tavun paloina, mikä saattaa näyttää tältä. Ja vaikka tämä ei ole täysin totta joko, koska jotain kutsutaan endianness, joka emme ole menossa päästä nyt, mutta jos olet utelias, voit lukea siitä pikku ja iso endianness. Mutta vuoksi tämän väitteen, vuoksi tämän videon, Haluan vain olettaa, että on, on Itse asiassa, miten numero 65 olisi oltava edustettuina muisti kaikissa järjestelmissä, vaikka se ei ole täysin totta. Mutta katsotaanpa oikeastaan ​​vain saada eroon kaikista binary kokonaan, ja ajattele kuin H ja 65, se on paljon helpompaa ajatella sitä kuten että ihmisenä. Selvä, joten se vaikuttaa myös ehkä vähän satunnainen että I've- minun järjestelmä ei antanut minulle tavua 5, 6, 7, ja 8 tallentaa kokonaisluku. On syytä, liian, joka emme pääse juuri nyt, mutta riittää todeta, että mitä tietokone tekee täällä on luultavasti hyvä liikkua sen osa. Ei anna minulle muisti, joka on välttämättä peräkkäin. Vaikka se aikoo tehdä sen nyt jos haluan saada toisen merkkijonon, nimeltään sukunimi, ja haluan laittaa Lloyd siellä. Aion täytyy sovittaa yhteen merkki, jokaisen kirjaimen, joka on menossa vaatia yhden merkki, yhden tavun muistia. Joten jos voisin laittaa Lloyd minun array näin olen melko hyvä mennä, eikö? Mitä puuttuu? Muista, että jokainen merkkijono työskentelemme jossa C päättyy kenoviivaan nolla, emmekä voi jättää että tässä joko. Meidän täytyy varata yhden tavun muistia pitää, että niin me tietää, milloin meidän merkkijono on päättynyt. Joten tämän järjestelyn siitä, miten asiat näkyvät muistissa voimin olla hieman satunnainen, mutta se todella on, miten useimmat järjestelmät on suunniteltu. Linja niitä ylös kerrannaisina neljän syistä uudelleen että meidän ei tarvitse päästä juuri nyt. Mutta tämä, niin riittää, kun todetaan, että Kun nämä kolme riviä koodia, tämä on mitä muisti voisi näyttää. Jos tarvitsen muistipaikkaa 4, 8, ja 12 pitää tietoni, tämä on mitä minun muisti voisi näyttää. Ja vain olla erityisen pikkutarkka täällä, kun puhumme muistia osoitteet me yleensä se käyttää heksadesimaali merkintöjä. Joten miksi emme muuntaa kaikki nämä alkaen desimaalin on heksadesimaalilukuja vain koska se on yleensä kuinka puhumme muistiin. Joten sen sijaan, että 0 kautta 19, mitä meillä on nolla X nollasta nolla x1 kolme. Ne ovat 20 tavua muistia että me ovat tai me tarkastelemme tässä kuvassa Juuri täällä. Joten kaikki tämä on sanottu, katsotaanpa askel poispäin muisti toisen ja takaisin viitteitä. Tässä on tärkein asia muistaa kuten me alkaa työskennellä viitteitä. Osoitin ei ole mitään enemmän kuin osoite. Minä sanon sen uudelleen, koska se on niin tärkeää, osoitin ei ole mitään enemmän kuin osoite. Osoittimet ovat osoitteet paikkoihin muistiin jossa muuttujat elää. Tietäen, että se tulee toivottavasti hieman helpompi työskennellä heidän kanssaan. Toinen asia, josta pidän tehdä, on olla eräänlainen kaavioita visuaalisesti edustavat mitä tapahtuu eri riviä koodia. Ja teemme tämän pari kertoja osoittimia, ja kun puhumme dynaaminen muistin jakamista samoin. Koska mielestäni nämä kaaviot voi olla erityisen hyödyllistä. Joten jos sanon esimerkiksi int k minun koodi, mitä tapahtuu? No mitä pohjimmiltaan tapahtuu on Saan muisti varattu minulle, mutta en edes pidä ajattele sitä niin, minä haluan ajatella sitä kuin laatikko. Minulla on laatikko ja se on värillinen vihreä koska olen voi laittaa kokonaislukuja vihreät laatikot. Jos se oli merkki I voi olla sininen laatikko. Mutta olen aina sanoa, jos Luon laatikko, johon mahtuu kokonaislukuja että laatikko on värillinen vihreä. Ja otan pysyvä merkki ja minä kirjoitan k puolella se. Joten minulla on laatikko nimeltä K, johon voin laittaa kokonaislukuja. Joten kun sanon int k, joka on mitä tapahtuu päähäni. Jos sanon k on viisi, mitä teen? No, Laitan viisi ruutuun, oikea. Tämä on melko yksinkertainen, jos Sanon int k, luo laatikko kutsutaan k. Jos sanon k on 5, laittaa viisi syöttöä. Toivottavasti se ei ole liian paljon harppaus. Tässä kun asiat menevät vähän mielenkiintoinen kuitenkin. Jos sanon int * PK, no vaikka en tiedä, mitä tämä merkitsee väistämättä, Se on selvästi jotain tekemistä kokonaisluku. Joten aion väri pienennä vihreä-ish, Tiedän, että se on jotain tehdä kokonaisluku, mutta se ei ole kokonaisluku itse, koska se on int tähden. Siinä on jotain hieman Eri siitä. Joten kokonaisluku on mukana, mutta muuten se on ei liian erilainen mitä puhuimme. Se on laatikko, sen sai etiketti, se on päällään etiketti PK, ja se on pystyttävä pitämään int tähdet, mitä ne ovat. Heillä on jotain tekemistä kanssa kokonaislukuja, selvästi. Tässä on viimeinen kuitenkin. Jos sanon PK = & K, huh, mitä juuri tapahtui, eikö? Joten tämä satunnaisluku, sattumanvaraiselta numero, saa heittää laatikkoon siellä. Kaikki tämä on, on pk saa osoite k. Joten olen kiinni missä k asuu muistissa, sen osoitteen, osoite sen tavua. Kaikki Mulla on sanon että arvo on mitä aion laittaa sisälle minun laatikko kutsutaan PK. Ja koska nämä asiat ovat osoittimia, ja koska etsivät klo merkkijono kuin nolla x kahdeksan nolla C seitsemän neljä kahdeksan kaksi nolla on luultavasti ei ole kovin mielekästä. Kun me yleensä visualisoida osoittimia, me todella tehdä niin osoittimia. Pk antaa meille tiedot Meidän täytyy löytää k muistiin. Joten periaatteessa PK on nuoli sen. Ja jos me kävelemään pituus Kyseisen nuoli, kuvitella se on jotain, voit kävellä, jos me kävellä pitkin nuolen, aivan kärjen että nuoli, me löytävät sijainti muistiin jossa k asuu. Ja se on todella tärkeää sillä kun tiedämme missä k asuu, voimme alkaa työskennellä tiedot sisällä että muistipaikka. Vaikka saamme pikkuinen bitti ennen itseämme nyt. Joten mikä on osoitin? Osoitin on tietoerä jonka arvo on muisti osoite. Se oli, että nolla x kahdeksan nolla jutut tekeillä, että oli muisti osoite. Se oli paikalla muistissa. Ja tyypin osoitin kuvaa sellaista Tietojen löydät että muisti osoite. Joten siellä int tähti osa oikealla. Jos seuraan että nuoli, se on menossa saavat minut sijainti. Ja että sijainti, mitä minä löytävät siellä minun esimerkki, on vihreitä laatikko. Se on kokonaisluku, se mitä minä löytävät jos menen kyseiseen osoitteeseen. Tietotyyppi osoitin kertoo, mitä löydät tuohon muisti osoite. Joten tässä on todella cool juttu kuitenkin. Osoittimet avulla voimme kulkea muuttujia välillä toimintoja. Ja todella siirtää muuttujia eikä siirtää niistä kopiot. Koska jos me tiedämme tarkalleen missä muistissa löytää muuttujan, meidän ei tarvitse tehdä kopion se, voimme vain mennä kyseiseen paikkaan ja työskennellä että vaihteleva. Joten pohjimmiltaan viitteitä järjestä Make tietokoneympäristössä paljon enemmän kuin todellisessa maailmassa, oikea. Joten tässä on analogisesti. Oletetaan, että minulla on muistikirja, oikealle, ja se on täynnä muistiinpanoja. Ja haluaisin voit päivittää sen. Olet toiminto päivitykset toteaa, oikea. Tavalla olemme olleet työskentelee toistaiseksi, mitä tapahtuu on otatte minun muistikirjan, siirryt kopion tallentaa, voit tehdä Xerox kopio jokaisen sivun muistikirjan. Sinun jättää minun kannettavan takaisin pöydälleni kun olet valmis, voit mennä ja yliviivaa asioita minun muistikirja, jotka ovat vanhentuneita tai väärin, ja sitten voit siirtää takaisin minua pino Xerox sivuja että on kopio minun muistikirjan muutokset että olet tehnyt sen. Ja siinä vaiheessa, se on jopa minua kutsuvan toiminto, kuten soittajan, päättää ottaa muistiinpanoja ja integroida ne takaisin kannettavassa. Joten siellä on paljon portaita mukana tässä, juuri. Kuten eikö olisi parempi jos minä vain sanoa, hei, voitko päivittää muistikirja minulle, käden minun notebook, ja otat asioita ja kirjaimellisesti ylittää ne pois ja päivitän muistiinpanoja kannettavassa. Ja sitten antaa minulle kannettavan takaisin. Sellainen mitä viitteitä jotta voisimme tehdä, he tekevät tässä ympäristössä paljon enemmän kuin miten toimimme todellisuudessa. Hyvä niin sitähän osoitin, Puhutaanpa miten viitteitä toimivat C, ja miten voimme alkaa työskennellä heidän kanssaan. Joten on hyvin yksinkertainen osoitin C kutsutaan nollaosoittimen. Null osoitin osoittaa mitään. Tämä todennäköisesti näyttää se on oikeastaan ​​ole kovin hyödyllinen asia, mutta kuten näemme vähän myöhemmin, siihen että tämä nollaosoittimen olemassa oikeastaan ​​todella voi tulla kätevä. Ja kun luot osoitin, ja et määritä sen arvo immediately- esimerkki, jossa sen arvo heti on pari liukuu takaisin jossa totesin, pk vastaa & K, PK saa K: n osoitteen, kuten näemme, mitä se tarkoittaa, näemme miten koodia että shortly- jos emme aseta sen arvoksi jotain mielekäs heti, sinun pitäisi aina aseta osoitin osoittamaan null. Sinun tulisi asettaa sen osoittamaan mitään. Se on hyvin erilainen kuin juuri lähdössä arvokas, koska ja sitten julistamisesta osoitin ja vain olettaen se null koska se on harvoin totta. Joten sinun tulisi aina asettaa arvon osoittimen null jos et aseta sen arvo jotain mielekästä välittömästi. Voit tarkistaa, onko osoittimen arvo on null käyttäen yhtäsuuruusoperaattorin (==), Kuten sinäkin vertailla tahansa kokonaisluku arvot tai merkki arvoja (==) yhtä hyvin. Se on erityinen eräänlainen jatkuva arvo, jota voit käyttää testata. Joten se oli hyvin yksinkertainen osoitin, nollaosoittimen. Toinen tapa luoda osoitin on purkaa osoitteen muuttujan olet jo luonut, ja voit tehdä tämän käyttäen & operaattori osoite louhinta. Joka olemme jo nähneet aiemmin Ensimmäisessä kaaviossa esimerkiksi näytin. Joten jos x on muuttuja, joka olemme jo luonut tyypin kokonaisluku, sitten ja x on osoitin kokonaisluku. & X is- muistaa, ja aikoo poimia osoite asia oikealla. Ja koska osoitin on vain osoite, kuin ja x on osoitin kokonaisluku joiden arvo on, jos muistissa X elämässään. Se on X: n osoite. Joten ja x on osoite x. Otetaanpa tämä yksi askel edelleen ja muodostaa jotain Viittasin vuonna ennen videon. Jos sov on joukko kaksinkertaistuu, sitten & Sov hakasulje i on osoitin kaksinkertainen. OK. sov hakasulje i, jos sov on joukko kaksinkertaistuu, sitten sov hakasulje i on i: nnen elementin, joka jono, ja & sov hakasulkeen i on missä muisti i: nnen elementin ARR olemassa. Niin mitä vaikutuksia täällä? Taulukot nimi, implisiittisesti Tämän koko juttu, on, että matriisi nimi on todella itse osoitin. Olet työstänyt osoittimilla koko ajan aina, kun olet käyttänyt erilaisia. Muista esimerkistä on kiikaritähtäimellä, loppupuolella videota esittämään Esimerkiksi jos meillä on funktio kutsutaan joukko int ja toiminto nimeltään joukko array. Ja haaste määrittää onko, tai mitä arvot, joita me tulostetaan loppuun toiminnon lopussa pääohjelma. Jos muistatte tästä esimerkki tai jos olet katsonut videon, te tiedätte, että kun teille-puhelun sarja int tehokkaasti ei tee mitään. Mutta asettamiseen array tekee. Ja minä tavallaan tasapaksuja miksi näin oli tuolloin. Sanoin vain, hyvin se on array, se on erityinen, tiedätte, on olemassa syy. Syynä on se, että matriisi: n nimi on oikeastaan ​​vain osoitin, ja on tämä erityinen hakasulje syntaksin tehdä asioita paljon mukavampi työskennellä. Ja he tekevät ajatus osoitin paljon vähemmän uhkaava, ja siksi ne ovat tavallaan on esitetty näin. Mutta oikeasti paneelit ovat vain viitteitä. Ja siksi kun me teki muutoksen array, kun ohitimme array parametri toiminnon tai argumenttina toiminnon, sisältö taulukon todella muuttunut molemmissa callee ja soittaja. Joka sillä kaikki muu muuttuja näimme ei tapahtunut. Niin, että on vain jotain pitää mielessä, kun olet työskennellyt osoittimia, on, että nimi array todella osoitin on ensimmäinen osa, joka array. OK joten nyt meillä on kaikki nämä tosiasiat, nyt pitää käynnissä, oikea. Miksi me välitämme jossa jotain asuu. No kuten sanoin, se on melko hyödyllistä tietää, missä jotain asuu niin voit mennä sinne ja muuttaa sitä. Työskennellä sen kanssa ja todella on asia, että te haluavat tehdä muuttujan tulevat voimaan, eikä päivästä joitakin kopio. Tätä kutsutaan dereferencing. Menemme viite ja muutamme arvoa siellä. Joten jos meillä on osoitin ja sitä kutsutaan PC, ja se osoittaa merkin, niin voimme sanoa * PC ja * PC on nimi mitä löydämme jos menemme osoitteeseen PC. Mitä me löydämme on luonteeltaan ja * PC on, miten puhumme tietojen että Sijainti. Jotta voisimme sanoa jotain * PC = D tai jotain, ja se tarkoittaa, että mitä tahansa oli muistiosoite PC, mitä hahmo oli aiemmin siellä on nyt D, jos sanomme * pc = D. Joten tässä sitä taas ollaan kanssa outoja C juttuja, oikea. Joten olemme nähneet * aiemmin olevan jotenkin osa tiedoista tyyppi, ja nyt se käytetään hieman eri asiayhteydessä käyttää tietoja paikassa. Tiedän, että se vähän sekava ja se on itse asiassa osa tätä koko kuten, miksi viitteet on tämä mytologia ympärillään olevan niin monimutkainen, on eräänlainen syntaksin ongelma, rehellisesti. Mutta * on käyttää molemmissa yhteyksissä, molemmat osana tyypin nimi, ja näemme hieman myöhemmin muutakin. Ja nyt on dereference operaattori. Niin se menee viittaus, se sisäänkäyntien tiedot paikassa osoittimen, ja voit manipuloida sitä mieleisekseen. Nyt tämä on hyvin samankaltainen vierailevat naapuri, oikea. Jos tiedät mitä naapuri asuu, olet ei hengailua lähimmäistäsi. Tiedät satut tiedä, missä he asuvat, mutta se ei tarkoita, että nojalla ottaa tätä tietoa olet vuorovaikutuksessa niiden kanssa. Jos haluat olla vuorovaikutuksessa niiden kanssa, sinun täytyy mennä heidän talonsa, sinun täytyy mennä missä he asuvat. Ja kun teette sen, niin voit olla vuorovaikutuksessa niitä aivan kuin haluat. Ja samalla tavoin muuttujia, sinun täytyy mennä heidän osoitteensa jos haluat vuorovaikutuksessa niitä, et voi vain tiedä osoitetta. Ja miten voit mennä osoitteeseen on käyttää *, dereference operaattori. Mitä mieltä olet tapahtuu jos yritämme ja dereference osoitin, jonka arvo on nolla? Muista, että null osoitin osoittaa mitään. Joten jos yrität ja dereference mitään tai mennä osoitteeseen mitään, mitä luulet tapahtuu? No jos arvasit segmentointi vika, olisit oikeassa. Jos yrität dereference nollaosoittimen, sinulla segmentointi vika. Mutta odota, ei minä sanon teille, että jos et tule asettaa arvoa Osoitin jotain merkityksellistä, sinun pitäisi asettaa nollaksi? Tein ja todella segmentointi vika on eräänlainen hyvän käytöksen. Oletko koskaan julistettu muuttuva ja ei määritetty sen arvo välittömästi? Joten sanoit int x; et todella antaa sen mitään ja sitten myöhemmin koodissa, tulostamaan x arvo, ottaa vielä liitetään se mitään. Usein saat nolla, mutta joskus saattaa saada joitakin satunnaisia ​​numero, ja sinulla ei ole aavistustakaan mistä se tuli. Samoin voi asiat tapahtua viitteitä. Kun julistaa osoitin int * PK esimerkiksi, ja et määritä sen arvo, saat neljä tavua muistia. Riippumatta neljä tavua muisti järjestelmä voi toteavat, että on joitakin mielekkäitä arvoa. Ja on saattanut olla jotain jo olemassa, että ei enää tarvita toisen toiminto, joten sinun täytyy vain mitä tietoja oli siellä. Mitä jos olet yrittänyt tehdä dereference jotkut osoite, että olet älä-oli jo tavua ja tietoa siellä, se on nyt teidän osoitin. Jos yrität dereference että osoitin, saatat olla Messing kanssa jonkin verran muistia että ette aio sotkea kaiken. Ja itse asiassa voisi tehdä jotain todella tuhoisia, kuten murtaa toinen ohjelma, tai rikkoa toinen toiminto, tai tehdä jotain ilkeä että et aio tehdä ollenkaan. Ja niin siksi se on todella hyvä idea asettaa viitteitä null jos älä aseta ne jotain merkityksellistä. Se on luultavasti parempi Päivän päätteeksi oman ohjelman kaatumisen sitten se tehdä jotain, joka mokaa toisesta ohjelmasta tai toiminnon. Tämä käyttäytyminen on todennäköisesti vielä vähemmän ihanteellinen kuin vain kaatuu. Ja niin siksi se on todella hyvä tapa päästä asettaa viitteitä null jos et aseta niitä mielekkääseen arvo heti, arvo että tiedät ja että voit turvallisesti dereference. Joten tulla takaisin nyt ja katsomaan klo yleinen syntaksi tilanteen. Jos sanon int * p ;, mitä minä olen juuri tehnyt? Mitä olen tehnyt on tämä. Tiedän arvo p on osoite koska kaikki osoittimet ovat vain osoitteet. Voin dereference p käyttäen * operaattori. Tässä yhteydessä tässä, aivan Top muistaa * on osa tyypin. Int * on tietotyyppi. Mutta voin dereference p käyttäen * operaattori, ja jos teen niin, jos menen kyseiseen osoitteeseen, mitä löydän tähän osoitteeseen? Löydän kokonaisluku. Joten int * p on pohjimmiltaan sanomalla, p on osoite. Voin dereference p ja jos En, aion löytää kokonaisluku klo että muistipaikka. OK joten sanoin oli toinen Harmillista tähdet ja täällä on, jos se Harmillista tähtien kanssa on. Oletko koskaan yrittänyt julistaa useita muuttujia samantyyppisiä samalla rivillä koodia? Niin toisen, teeskennellä, että linja, koodi Minulla on oikeastaan ​​siellä vihreä ei ole olemassa ja se vain kertoo int x, y, z ;. Mitä se tehdä, on itse luoda kolme kokonaisluku muuttujat sinulle, yksi nimeltään X, yksi nimeltään y, ja yksi nimeltään z. Se on tapa tehdä se ilman ottaa jakaa päälle kolme riviä. Tässä missä tähteä saada ärsyttävää uudelleen vaikka, koska * on itse asiassa osa Sekä tyypin nimi ja osa muuttujan nimi. Joten jos sanon int * px, py, pz, mitä itse saada on osoitin kokonaisluku nimeltään px ja kaksi kokonaislukua, py ja pz. Ja se on luultavasti ole mitä Haluamme, että ei ole hyvä. Joten jos haluan luoda useita viitteitä samalla rivillä, samaa tyyppiä, ja tähdet, mitä todella tarvitsevat tehdä, on sanoa int * pa, * pb, * PC. Nyt ottaa sanoi juuri, että ja nyt kerron tämän, luultavasti koskaan tee tätä. Ja se on luultavasti hyvä asia rehellisesti, sillä saatat vahingossa jättää tähti, jotain. Se on luultavasti parasta ehkä julistaa vinkin eri radoille, mutta se on vain toinen niitä harmittaa syntaksin asioita tähdet, jotka tekevät viitteitä niin vaikea työskennellä. Koska se on juuri tämä syntaktinen sotku sinun täytyy työskennellä kautta. Käytäntöä se todella tulee toinen luonto. Olen edelleen tehdä virheitä se silti ohjelmoinnin jälkeen 10 vuotta, joten älä hätäänny jos jotain tapahtuu teille, se on melko yleinen rehellisesti. Se on todella sellainen virhe on syntaksin. OK joten olen sellainen luvattujen että olisimme uudelleen käsite kuinka suuri on merkkijono. No jos olen kertonut sinulle, että string, olemme todella sellainen valehdellut sinulle koko ajan. Ei ole tietoa tyyppi nimeltään merkkijono, ja itse olen mainitsi tämän yksi meidän aikaisintaan videoita tietotyypit, merkkijonon oli tietotyyppi joka luotiin sinulle CS50.h. Sinun täytyy #include CS50.h voidakseen käyttää sitä. No merkkijono on oikeastaan ​​vain alias jotain nimeltään char *, Osoitin merkki. No osoittimia, muistaa, ovat vain osoitteet. Joten mikä on koko tavuina merkkijonon? No se on neljä tai kahdeksan. Ja syy sanon neljä tai kahdeksan johtuu siitä, että itse asiassa riippuu järjestelmän, jos käytät CS50 ide, char * on koko char * On kahdeksan, se on 64-bittinen järjestelmä. Jokainen osoite muistissa on 64 bittiä pitkä. Jos käytät CS50 laitetta tai millä tahansa 32-bittinen kone, ja olet kuullut että termi 32-bittinen kone, mikä on 32-bittinen kone? No se vain tarkoittaa, että jokainen osoite muistissa on 32 bittiä pitkä. Ja niin 32 bittiä on neljä tavua. Joten char * on neljä tai kahdeksan tavua riippuen järjestelmään. Ja todellakin kaikki tietotyypit, ja osoitin tietoja tyyppi, koska kaikki osoittimet ovat vain osoitteet, neljä tai kahdeksan tavua. Joten uudelleen tämän kaavio ja nyt tehdä tämä video vähän liikuntaa täällä. Joten tässä on kaavio lähdimme pois aivan alussa videon. Mitä tapahtuu nyt, jos sanon * pk = 35? Mitä se tarkoittaa, kun sanon, * pk = 35? Ota toinen. * PK. Vuonna yhteydessä täällä, * on dereference operaattori. Joten kun dereference operaattori on käytetty, menemme osoite viittasivat PK, ja me muutumme mitä löydämme. Joten * PK = 35 tehokkaasti tekee tämän kuvan. Joten se on periaatteessa syntaktisesti identtinen ja ottaa sanoi k = 35. Vielä yksi. Jos sanon int m, luon uusi muuttuja nimeltä m. Uusi laatikko, se on vihreän laatikon koska se tulee pitää kokonaisluku, ja se on merkitty m. Jos sanon m = 4, laitoin kokonaisluku tuohon laatikkoon. Jos vaikkapa PK = & m, miten Tässä kaaviossa muutos? Pk = & m, Muistatteko mitä & Operaattori tekee tai kutsutaan? Muista, että & jotkut muuttujan nimi on osoite muuttujan nimi. Joten mitä sanomme on PK saa osoitteen m. Ja niin tehokkaasti, mitä tapahtuu kaavio on, että PK ei enää viittaa k, mutta pistettä m. Jälleen osoittimet ovat hyvin hankala työskennellä ja he ottavat paljon käytäntö, mutta koska kykynsä avulla voit välittää dataa toimintojen ja todella on ne Muutokset tulevat voimaan, saada pään ympäri on todella tärkeää. Se todennäköisesti on kaikkein monimutkainen Uutta me keskustelemme CS50, mutta arvo, jota saada käyttämästä osoittimia paljon suurempi komplikaatioiden jotka tulevat opetteleminen. Joten toivotan teille parasta onni oppia viitteitä. Olen Doug Lloyd, tämä on CS50.