[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]