1 00:00:00,000 --> 00:00:02,395 >> [MUSIC SPILLE] 2 00:00:02,395 --> 00:00:05,750 3 00:00:05,750 --> 00:00:06,506 >> DOUG LLOYD: OK. 4 00:00:06,506 --> 00:00:08,880 Vi har jobbet med heltall, vi har jobbet med tegn, 5 00:00:08,880 --> 00:00:11,930 vi har jobbet flyter, dobbeltrom, strenger, og bools. 6 00:00:11,930 --> 00:00:14,870 Vi har brukt ganske mye alle av de [uhørbart] typer som 7 00:00:14,870 --> 00:00:17,100 har vært tilgjengelig for oss alle sammen. 8 00:00:17,100 --> 00:00:19,430 Men nå ønsker vi å gjøre noe mer. 9 00:00:19,430 --> 00:00:20,210 Hvordan gjør vi det? 10 00:00:20,210 --> 00:00:22,560 Hvordan skaper vi forskjellige datatyper? 11 00:00:22,560 --> 00:00:26,130 Vi kan gjøre det ved hjelp av strukturer. 12 00:00:26,130 --> 00:00:30,180 Så strukturer tillate oss å forene variabler av forskjellige typer 13 00:00:30,180 --> 00:00:34,810 i en enkelt, ny variabel type, som vi kan tildele sin egen type navn. 14 00:00:34,810 --> 00:00:37,570 Dette er en veldig sterk ting å være i stand til å gjøre, 15 00:00:37,570 --> 00:00:40,900 fordi vi kan nå gruppe elementer av forskjellige datatyper 16 00:00:40,900 --> 00:00:43,910 sammen som har en logisk sammenheng. 17 00:00:43,910 --> 00:00:46,440 Vi har vært i stand til å gjøre dette med matriser liksom, ikke sant? 18 00:00:46,440 --> 00:00:49,540 Vi kan gruppere variabler av samme datatype 19 00:00:49,540 --> 00:00:53,410 sammen i en stor enhet av hukommelse, en matrise. 20 00:00:53,410 --> 00:00:56,660 >> Men vi har ikke vært i stand til å blande opp ulike datatyper sammen. 21 00:00:56,660 --> 00:01:02,610 Vi kan ikke, si, pare et heltall, og en karakter, og en dobbel alle 22 00:01:02,610 --> 00:01:05,330 i det samme og kalle det en enkelt enhet. 23 00:01:05,330 --> 00:01:08,830 Men med strukturer, eller ofte referert til som structs, 24 00:01:08,830 --> 00:01:09,585 vi faktisk kan. 25 00:01:09,585 --> 00:01:12,370 Så en struktur er liksom som en super variabel. 26 00:01:12,370 --> 00:01:16,530 Det er en variabel som inneholder andre variabler inne i den. 27 00:01:16,530 --> 00:01:19,650 Så her er et eksempel på en meget enkel konstruksjon. 28 00:01:19,650 --> 00:01:23,380 Dette er hva syntaksen ville se ønsker å lage en konstruksjon for en bil. 29 00:01:23,380 --> 00:01:25,250 Nå, la oss gå gjennom syntaksen her. 30 00:01:25,250 --> 00:01:27,400 Struct, er at søkeord som indikerer 31 00:01:27,400 --> 00:01:30,270 at jeg oppretter en ny datatype her. 32 00:01:30,270 --> 00:01:33,860 Spesielt er den datatype navn kommer til å være struct bil, så vi får se. 33 00:01:33,860 --> 00:01:36,640 Men dette er den type spiss av til kompilatoren at denne 34 00:01:36,640 --> 00:01:42,440 som en gruppe av variabler som går for å bli betraktet som en del av den samme typen 35 00:01:42,440 --> 00:01:44,010 om et øyeblikk. 36 00:01:44,010 --> 00:01:46,340 >> Biler, bare navnet på strukturen. 37 00:01:46,340 --> 00:01:50,590 Igjen blir datatypen her kommer å være struct bil, ikke bare bil. 38 00:01:50,590 --> 00:01:53,060 Men hvis du har different-- Hvis du oppretter flere structs 39 00:01:53,060 --> 00:01:56,950 i det samme programmet, må du skille mellom struct og struct. 40 00:01:56,950 --> 00:02:00,140 Så struct bil, kan jeg også ha struct student, f.eks 41 00:02:00,140 --> 00:02:01,790 i samme program. 42 00:02:01,790 --> 00:02:05,980 Innsiden av klammeparentes er alle av de såkalte felt 43 00:02:05,980 --> 00:02:07,954 eller medlemmer av strukturen. 44 00:02:07,954 --> 00:02:10,370 Så hva er noen av tingene som er iboende i en bil? 45 00:02:10,370 --> 00:02:15,270 Vel, har det vanligvis et år, har et modellnavn, og en lisens plate, 46 00:02:15,270 --> 00:02:18,000 en kilometerteller som vanligvis har noen antall miles på den, 47 00:02:18,000 --> 00:02:19,225 og kanskje en motorstørrelse. 48 00:02:19,225 --> 00:02:23,570 Og som du kan se, jeg blande opp heltall og tegn og dobler. 49 00:02:23,570 --> 00:02:26,420 De kommer alle til å være del av denne nye datatype. 50 00:02:26,420 --> 00:02:29,750 >> Til slutt, den siste tingen jeg må gjøre, ikke glem denne lille semikolon 51 00:02:29,750 --> 00:02:30,290 I slutten. 52 00:02:30,290 --> 00:02:34,380 Etter at vi er ferdig med å definere strukturen, vi trenger å sette et semikolon på slutten. 53 00:02:34,380 --> 00:02:37,325 Det er en veldig vanlig syntaktisk feil, fordi med en funksjon, 54 00:02:37,325 --> 00:02:40,200 for eksempel, ville du bare ha åpen klammeparentes, tett krøllete brace. 55 00:02:40,200 --> 00:02:42,950 Du trenger ikke sette et semikolon på enden av en funksjonsdefinisjon. 56 00:02:42,950 --> 00:02:46,430 Dette ser ut som en funksjon definisjon, men det er ikke, 57 00:02:46,430 --> 00:02:49,653 og så semikolon der er bare en påminnelse om at du 58 00:02:49,653 --> 00:02:52,440 trenger å sette den der, fordi kompilatoren ellers ikke vil 59 00:02:52,440 --> 00:02:53,510 vet hva de skal gjøre med det. 60 00:02:53,510 --> 00:02:56,160 Det er en veldig vanlig feil uhell gjøre 61 00:02:56,160 --> 00:02:58,570 når du først definere strukturer. 62 00:02:58,570 --> 00:02:59,500 >> OK. 63 00:02:59,500 --> 00:03:02,824 Så vi vanligvis definerer våre strukturer på toppen av våre programmer 64 00:03:02,824 --> 00:03:05,490 fordi de sannsynligvis kommer å bli brukt av flere funksjoner. 65 00:03:05,490 --> 00:03:08,850 Vi ønsker ikke å definere en konstruere inne i en funksjon, 66 00:03:08,850 --> 00:03:12,110 fordi da kan vi only-- den Omfanget av strukturen virkelig 67 00:03:12,110 --> 00:03:13,790 kun eksisterer inne i den funksjonen. 68 00:03:13,790 --> 00:03:17,450 Vi ville trolig vil definere en struktur slik at vi kan bruke det i flere funksjoner, 69 00:03:17,450 --> 00:03:20,670 eller kanskje i multiple filer som er knyttet sammen 70 00:03:20,670 --> 00:03:22,920 å lage vår eneste program. 71 00:03:22,920 --> 00:03:24,920 Noen ganger også i stedet for å definere strukturen 72 00:03:24,920 --> 00:03:27,961 helt på toppen hvor du setter din pound inkluderer og din pund definerer, 73 00:03:27,961 --> 00:03:32,080 for eksempel, kan du sette dem i separate dot h-filer, som du deretter 74 00:03:32,080 --> 00:03:35,020 pund inkluderer selv. 75 00:03:35,020 --> 00:03:37,620 >> Så vi har strukturer, men nå vi trenger for å komme på innsiden av dem. 76 00:03:37,620 --> 00:03:39,800 Hvordan får vi innsiden av en struktur for å få tilgang 77 00:03:39,800 --> 00:03:43,530 disse sub-variabler, disse variablene som eksisterer inne i strukturen? 78 00:03:43,530 --> 00:03:46,810 Vel, har vi noe som heter prikken operatør, noe som gir oss 79 00:03:46,810 --> 00:03:50,990 for å få tilgang til felt av strukturen. 80 00:03:50,990 --> 00:03:55,490 Så for eksempel, la oss si at jeg har erklært mine strukturdata skriver et sted 81 00:03:55,490 --> 00:03:59,020 på toppen av min program, eller kanskje i en prikk h fil som jeg har pund inkludert. 82 00:03:59,020 --> 00:04:03,360 Hvis jeg da ønsker å opprette en ny variabel av den datatypen, kan jeg si, 83 00:04:03,360 --> 00:04:06,260 struct bil, bilen min, semikolon. 84 00:04:06,260 --> 00:04:11,580 Akkurat som jeg kunne si int x, eller string name semikolon. 85 00:04:11,580 --> 00:04:18,100 >> Datatypen her er struct bil, navnet på variabelen er bilen min, 86 00:04:18,100 --> 00:04:23,770 og da kan jeg bruke dot operatøren få tilgang til de ulike feltene i bilen min. 87 00:04:23,770 --> 00:04:27,494 Så jeg kan si bilen min dot år tilsvarer 2011. 88 00:04:27,494 --> 00:04:28,410 Det er helt greit. 89 00:04:28,410 --> 00:04:34,210 År, hvis du husker, ble definert som en heltallsfelt innsiden av denne struct bil 90 00:04:34,210 --> 00:04:35,200 datatype. 91 00:04:35,200 --> 00:04:39,966 Så noen variable av struct bilen data type, slik som bilen min, kan jeg si bilen min 92 00:04:39,966 --> 00:04:44,030 dot år lik og deretter tildele det noen heltall 2011. 93 00:04:44,030 --> 00:04:47,290 Min bil dot plate lik CS50. 94 00:04:47,290 --> 00:04:51,180 Kortet mitt dot kilometerteller tilsvarer 50505 semikolon. 95 00:04:51,180 --> 00:04:53,270 Alle disse er helt greit, og det er 96 00:04:53,270 --> 00:04:57,802 hvordan vi får tilgang til felt av strukturen. 97 00:04:57,802 --> 00:05:00,260 Strukturer, men ikke trenger skal opprettes på stakken. 98 00:05:00,260 --> 00:05:02,950 Akkurat som alle andre variable, vi kan dynamisk tildele dem. 99 00:05:02,950 --> 00:05:06,309 Hvis vi har et program som kan generere mange strukturer, 100 00:05:06,309 --> 00:05:08,100 Vi vet ikke hvor mange vi kommer til å trenge, 101 00:05:08,100 --> 00:05:10,800 da må vi dynamisk fordele disse strukturene 102 00:05:10,800 --> 00:05:12,960 som vårt program er i gang. 103 00:05:12,960 --> 00:05:16,600 Og så hvis vi kommer til å få tilgang til felt av en struktur i den sammenheng, 104 00:05:16,600 --> 00:05:20,660 tilbakekalling at vi først må dereference pekeren til strukturen, 105 00:05:20,660 --> 00:05:24,810 og deretter en gang vi dereference den pekeren, så vi kan få tilgang til feltene. 106 00:05:24,810 --> 00:05:26,830 Hvis vi bare har en Peker til strukturen, 107 00:05:26,830 --> 00:05:32,120 Vi kan ikke bare si pekeren dot-feltet navngi og få det vi leter etter. 108 00:05:32,120 --> 00:05:34,259 Det er ekstra trinn av dereferencing. 109 00:05:34,259 --> 00:05:36,050 Så la oss si at i stedet for den previous-- 110 00:05:36,050 --> 00:05:38,770 akkurat som forrige eksempel, i stedet for å erklære det 111 00:05:38,770 --> 00:05:43,680 på stakken, struct bilen min bil, semikolon, sier jeg struct bil, 112 00:05:43,680 --> 00:05:48,020 stjerne, en peker til en struct bilen heter bilen min, 113 00:05:48,020 --> 00:05:51,250 tilsvarer malloc størrelsen struct bil. 114 00:05:51,250 --> 00:05:54,950 Størrelsen vil vi finne ut hvor mange byte den nye datatypen tar opp. 115 00:05:54,950 --> 00:05:58,570 Du trenger ikke nødvendigvis bare trenger å bruke Størrelsen, bredde, int eller røye, eller en hvilken som helst 116 00:05:58,570 --> 00:05:59,715 av de innebygde datatyper. 117 00:05:59,715 --> 00:06:02,090 Kompilatoren er smart nok å finne ut hvor mange bytes 118 00:06:02,090 --> 00:06:04,170 kreves av den nye strukturen. 119 00:06:04,170 --> 00:06:09,610 Så jeg malloc meg en enhet av minne stor nok til å holde en struct bil, 120 00:06:09,610 --> 00:06:12,410 og jeg får en peker tilbake I tillegg minneblokk, 121 00:06:12,410 --> 00:06:16,090 og at pekeren er tildelt til bilen min. 122 00:06:16,090 --> 00:06:18,050 >> Nå, hvis jeg ønsker å få tilgang til innen bilen min, 123 00:06:18,050 --> 00:06:22,615 Jeg først deferanseoperasjon bilen min hjelp den dereferanseoperator, stjerne 124 00:06:22,615 --> 00:06:26,620 som vi har sett fra de pekere videoer, og deretter etter at jeg dereference, 125 00:06:26,620 --> 00:06:32,200 Da kan jeg bruke dot operatøren få tilgang til de ulike feltene i bilen min. 126 00:06:32,200 --> 00:06:35,490 Stjerners bilen min dot år tilsvarer 2011. 127 00:06:35,490 --> 00:06:38,480 Det ville ha effekt Vi vil i dette tilfellet 128 00:06:38,480 --> 00:06:41,960 fordi vi har dynamisk bevilget bilen min. 129 00:06:41,960 --> 00:06:43,610 >> Det er litt irriterende, skjønt, ikke sant? 130 00:06:43,610 --> 00:06:44,818 Det er en to-trinns prosess nå. 131 00:06:44,818 --> 00:06:47,460 Nå må vi dereference-- vi har en stjerne operatør, 132 00:06:47,460 --> 00:06:48,910 og vi har en prikk operatør. 133 00:06:48,910 --> 00:06:51,660 Og som du kanskje forventer, fordi C-programmerere elsker kortere måter 134 00:06:51,660 --> 00:06:53,740 å gjøre ting, er det en kortere vei til å gjøre dette. 135 00:06:53,740 --> 00:06:57,790 Det er en annen operatør som heter pil, noe som gjør denne fremgangsmåten mye enklere. 136 00:06:57,790 --> 00:07:00,750 Måten pil fungerer er det første dereferences 137 00:07:00,750 --> 00:07:03,560 pekeren til venstre siden av førerhuset, 138 00:07:03,560 --> 00:07:06,620 og så, etter å ha dereferenced pekeren til venstre, 139 00:07:06,620 --> 00:07:09,620 det tilgang til feltet til høyre. 140 00:07:09,620 --> 00:07:14,170 Og så tidligere hadde vi denne typen av Star bilen min dot alt dette, 141 00:07:14,170 --> 00:07:15,880 som det var mye å gå på der. 142 00:07:15,880 --> 00:07:22,040 Men det vi kan i stedet gjøre er dette-- min bil pil år tilsvarer 2 011. 143 00:07:22,040 --> 00:07:23,580 >> Igjen, hva er det som skjer her? 144 00:07:23,580 --> 00:07:25,720 Først, jeg dereferencing bilen min. 145 00:07:25,720 --> 00:07:27,810 Som igjen er en peker her. 146 00:07:27,810 --> 00:07:31,270 Deretter, etter å ha dereferenced bilen min, jeg 147 00:07:31,270 --> 00:07:35,130 Deretter kan du få tilgang til feltene år, plate, og kilometerteller 148 00:07:35,130 --> 00:07:40,020 akkurat som jeg kunne før etter først å ha brukte stjerne til deferanseoperasjon bilen min, 149 00:07:40,020 --> 00:07:42,020 og prikk å få tilgang til feltet. 150 00:07:42,020 --> 00:07:45,290 Så du kan ha strukturer, du kan ha pekere til strukturer, 151 00:07:45,290 --> 00:07:48,360 og du har måter å få tilgang til felt av disse strukturer, 152 00:07:48,360 --> 00:07:52,600 om du har pekere til dem eller variablene selv. 153 00:07:52,600 --> 00:07:57,640 Dot eller pil, avhengig hvordan variabelen ble erklært. 154 00:07:57,640 --> 00:08:00,510 Jeg er Doug Lloyd, dette er CS50. 155 00:08:00,510 --> 00:08:01,975