[Powered by Google Translate] Puhutaanpa tietueet. Tietueet meille tapa ryhmittää joukko muuttujia yhdessä tulee mukava paketti. Se on luultavasti helpointa nähdä esimerkin heti, niin sanomme struct, avaamalla kihara ahdin, ja tässä struct, meillä on int ikä, char * nimi, ja se on siinä. Se voi tuntua oudolta kanssa puolipisteellä jälkeen kihara ahdin, mutta se on itse asiassa tarpeen tietueet. Mikä tahansa kelvollinen tyyppi voi mennä sisälle struct määritelmään. Täällä olemme käyttäneet int ja char * mutta voit myös käyttää erilaisia, ja esimerkiksi 100 osia tai jopa toisen struct. Kun käytät tietueet C, luot uusia ulos kokoelma muita tyyppejä. Täällä Teemme uudenlaisen pois kokonaisluvun ja char *. Kuten näemme myöhemmin, struct tyyppi on paljon tapoja vastaava muuntyyppisiä olet tottunut. Yleensä otan vertaamalla miten struct tyyppi on samanlainen kokonaisluku mukaan. Vaikka koodi kirjoitimme on voimassa C, se ei ole kovin hyödyllinen, ja sointi antaa meille varoituksen. Muistatko, kuinka tietueet ja sen ovat samanlaisia? No, me pohjimmiltaan vain sanoi int, joka ei ole kovin hyödyllistä linjaa. Joten oikeastaan ​​julistaa muuttuja tätä tyyppiä antamalla sille nimi ennen puolipiste. Soitamme muuttujan opiskelija. Nyt olemme julistettu muuttuja nimeltä opiskelija tyypin antaman struct. Miten pääsemme muuttujien sisällä struct? Teknisesti nimet näiden muuttujien jäseniä. Voit käyttää minkään jäsenenä opiskelija struct, lisäät piste muuttujan nimen, seuraa jäsenen nimi haluat. Joten tässä, vain 2 pätevä mahdollisuuksia ovat student.age ja student.name. Ja voimme tehdä jotain student.age = 12 ja student.name = opiskelija. Nyt mitä jos me halusimme tehdä toinen opiskelija? Saatat ajatella kopioida ja liittää nämä linjat ja muuttaa opiskelija opiskelija 2 tai jotain, ja joka toimii, mutta teknisesti, opiskelija ja opiskelija 2 eivät ole samaa tyyppiä. Katso, et voi liittää ne toisiinsa. Tämä johtuu siitä, että tähän mennessä sinun struct on anonyymi. Meidän täytyy antaa sille nimen. Voit tehdä, että lisäämme nimi struct jälkeen sana struct. opiskelija, seurasi määritelmä. Voimme silti heti julistaa muuttuja tyyppiä rakenteeseen sisältyvää opiskelija, kuten teimme aikaisemmin. Me kutsumme sitä S1 Antamalla struct nimi, Voimme nyt käyttää struct opiskelija lähes täsmälleen samalla tavalla me käyttäisimme int. Joten voimme julistaa muuttuja tyyppiä struct opiskelija, kuten struct opiskelija S2. Kuten taulukot, tietueet tarjoavat oikotien alustus syntaksi, joten voimme sanoa, struct opiskelija S2 vastaa vasen kihara ahdin 3, S2. Täällä, S2.age on 3, ja S2.name nostaa esiin S2. Ajattele kaikkia asioita voit tehdä int tyyppi ja useimmat niistä voit tehdä struct opiskelija tyyppi. Voimme käyttää struct opiskelija tyyppi funktion parametrin. Voimme käyttää struct opiskelija sisällä uuden struct. Meillä voi olla osoitin struct opiskelija. Voimme tehdä koko struct opiskelija. Struct opiskelija on tyyppiä aivan kuten int on tyyppiä. Voimme myös antaa S1 S2 koska molemmat ovat samaa tyyppiä, joten voimme tehdä S1 = S2. Mitä tapahtuu, jos teemme S1.age = 10? Onko S2 muutos ollenkaan? Jälleen ajatella tietueet yhtä säännöllinen kokonaislukuja. Jos me antaa joitakin int x joillekin int y, kuten X = Y ja sitten muuttaa X kuten X + +, ei Y muutu lainkaan? Y ei muutu tässä, ja siten ei myöskään S2 edellä. S2.age on vielä 3. Mutta huomaa, että kun osoitetaan yksi struct toiseen, kaikki osoittimet nimeävät edelleen sama asia, koska ne vain kopioitu. Jos et halua viitteitä jaettava, sinun täytyy manuaalisesti käsitellä sitä, ehkä malicking yhden korttelin muistia yhden osoittimia osoittamaan ja kopiointi dataa. Voisi olla ärsyttävää on kirjoittaa struct opiskelija kaikkialla. Käyttämällä tyyppi def, voimme tehdä tyyppi def struct ja me kutsumme sitä opiskelija. Nyt voimme käyttää oppilaan kaikkialla että käytimme käyttää struct opiskelija. Tämän tyyppinen def on nimetön struct ja kutsuu sitä opiskelija. Mutta jos me myös pitää opiskelijan tunniste sanan vieressä struct, kuten typedef struct opiskelija, voisimme käyttää molempia struct opiskelija ja opiskelija synonyymeina nyt. He eivät edes tarvitse olla sama nimi. Voisimme kirjoittaa def struct opiskelija Bob ja sitten rakenteeseen sisältyvää opiskelijoiden ja Bob olisi vaihdettavissa tyyppejä. Riippumatta def, Meidän tunnisteen vieressä rakenteeseen sisältyvää jos määritelmä struct on rekursiivinen. Esimerkiksi tyyppi def struct solmu ja se määritellään int Val ja se on osoitin, joka viittaa toiseen struct solmuun., kuten struct solmu * seuraavaksi. Ja sitten me kutsumme sitä solmuun. Tämä struct on rekursiivinen, koska määritelmän struct solmu sisältää sen sisällä osoittimen struct solmuun. Huomaa, että meidän on sanottava struct solmu * Seuraava sisällä määritelmän struct solmun, koska tyyppi def ole vielä valmis, jotta voimme yksinkertaistaa tätä vain solmuun * seuraavaksi. Saat lisätietoja tietueet vastaa tähän käsitellessään linkitettyjä listoja ja puita. Entä tietueet on tehtävä? Tämä on myös täysin pätevä. Meillä voisi olla mitätöidä func joka ottaa argumentiksi, opiskelijan s ja tekee jotain, että opiskelija. Ja sitten me voimme kulkea sitä opiskelija struct kuten niin. Func S1 entuudestaan. Struct käyttäytyy täsmälleen kuten kokonaisluku olisi, kun siirretään funktioon. Func saa kopion S1 ja niin ei voi muuttaa S1; pikemminkin vain kopio, joka tallennetaan S. Jos haluat, että toiminto voi muuttaa S1, func tulee ottaa opiskelija * S, ja sinun on läpäistävä S1 osoitteen, kuten niin. Opiskelija * S, func & S1. On toinenkin syy ohi osoite tähän. Mitä jos meidän struct sisälsi 100 kentät? Joka kerta ohitamme opiskelija func, meidän ohjelma tarvitsee kopioida kaikki nämä 100 kentät toi väite S, vaikka se ei koskaan käytä valtaosa niistä. Joten vaikka toi ei aio muuttaa opiskelija- jos voi silti olla arvokas ohi osoitteeseen. Okei, entä jos haluamme luoda osoitin struct? Voisimme tehdä jotain opiskelija * S vastaa malloc koko opiskelija. Huomaa, että koko toimii edelleen täällä. Joten miten me nyt käsiksi ikä jäsen Lohkon että S viittaa? Saatat ensin ajatella tehdä * S.age = 4, mutta tämä ei aivan toimi. Koska tämä todella tulkitaan * S.age suluissa = 4, joka ei edes kerätä, koska S ei ole struct tai pikemminkin osoittimen struct, joten piste ei toimi täällä. Voisimme tehdä (* S). Ikä = 4 mutta suluissa voi saada harmittaa ja sekava. Onneksi meillä on erityinen nuoli operaattori , joka näyttää S-> ikä = 4. Nämä 2 tapoja viitataan ikään vastaavat emmekä oikeastaan ​​koskaan tarvitse nuoli operaattori, mutta se tekee asiat näyttää mukavampaa. Koska S on osoitin jonkin lohkon muisti, joka sisältää struct, voit ajatella S> ikää seuraa osoitin nuoli ja napata iän jäsen. Joten miksi meidän pitäisi koskaan käyttää tietueet? Se on varmasti mahdollista saada pois vain primitiivinen kokonaislukuja, merkkiä, osoittimet ja vastaavat että olemme tottuneet; sen sijaan, S1 ja S2 ennen, olisimme voineet age1, age2, NAME1 ja NAME2 kaikki erillisissä muuttujia. Tämä on hieno vain 2 opiskelijaa, mutta mitä jos meillä olisi 10 niistä? Ja mitä jos sen sijaan vain 2 kenttää, opiskelija struct oli 100 kentät? GPA, kurssit, hiusten väri, sukupuoli, ja niin edelleen. Sen sijaan vain 10 tietueet, tarvitsemme 1000 eri muuttujia. Harkitse myös funktio joka vie että struct 100 kentät sen ainoa perustelu ja tulostaa kaikki kentät. Jos emme käytä struct, joka kerta me kutsumme tätä tehtävää, Meidän täytyy antaa lainkaan 100 muuttujat, ja jos meillä on 100 muuttujaa opiskelija 1, ja 100 muuttujaa opiskelija 2, Meidän täytyy olla varma ettemme vahingossa siirtää joitakin muuttujia opiskelija 1 ja jotkut muuttujat opiskelija 2. On mahdotonta tehdä, että erehdyksessä struct, koska kaikki 100 muuttujat sisältyvät yhdessä paketissa. Vain pari lopullisen toteaa: Jos olet ymmärtänyt kaiken tähän asti, hienoa. Loput video on vain täydellisyyden "vuoksi. Koska tietueet mahtuu kaikenlaista osoittimen, ne voivat myös pitää funktio-osoittimia. Jos olet perehtynyt olio-ohjelmointi, Tämä tarjoaa tavan käyttää tietueet ohjelmoida olio tyyliin. Lisää funktio-osoittimia muulloin. Myös, joskus voi olla 2 tietueet joiden määritelmät ovat riippuvaisia ​​toisistaan. Esimerkiksi meillä voisi olla struct, joka on määritelty osoittimen struct B, struct B * X, ja nyt voimme olla struct B joka on määritelty osoittimen on struct, struct * Y. Mutta tämä ei kerätä, koska struct B ei ole tuolloin, että struct on koottu. Ja jos me vaihtaa struct ja struct B, Sitten olimme vain jäädä sama ongelma; tällä kertaa, rakenteeseen sisältyvää ole olemassa. Voit ratkaista tämän, voimme kirjoittaa struct B; ennen määritelmän struct A. Tätä kutsutaan eteenpäin ilmoituksen. Tämä vain antaa kääntäjä tietää, että struct B on pätevä tyyppi, joka on täysin määritellään myöhemmin tai muualla. Nimeni on Rob Bowden, ja tämä on CS50. [CS50.TV]