1 00:00:00,000 --> 00:00:02,395 >> [Predvaja glasba] 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 Mi smo delali s števil, smo delali z znaki, 5 00:00:08,880 --> 00:00:11,930 smo delali boje, podvoji, godala in bools. 6 00:00:11,930 --> 00:00:14,870 Zal, da smo izčrpali veliko vse od [neslišno] tipov, ki 7 00:00:14,870 --> 00:00:17,100 so bile na voljo za vse nas skupaj. 8 00:00:17,100 --> 00:00:19,430 Zdaj pa smo želeli narediti nekaj več. 9 00:00:19,430 --> 00:00:20,210 Kako to storimo? 10 00:00:20,210 --> 00:00:22,560 Kako ustvariti različne vrste podatkov? 11 00:00:22,560 --> 00:00:26,130 Mi lahko to storite z uporabo struktur. 12 00:00:26,130 --> 00:00:30,180 Torej strukture nam omogočajo, da bi poenotili spremenljivke različnih vrst 13 00:00:30,180 --> 00:00:34,810 v enem samem, novi vrsta spremenljivke, ki jih lahko dodelite svojo lastno ime tipa. 14 00:00:34,810 --> 00:00:37,570 To je zelo močan stvar, da bi lahko naredil, 15 00:00:37,570 --> 00:00:40,900 saj smo lahko zdaj skupina elementi različnih podatkovnih tipov 16 00:00:40,900 --> 00:00:43,910 skupaj, da imajo logično povezavo. 17 00:00:43,910 --> 00:00:46,440 Smo bili sposobni to storiti z nizi nekako, kajne? 18 00:00:46,440 --> 00:00:49,540 Mi lahko spremenljivke skupine istega tipa podatkov 19 00:00:49,540 --> 00:00:53,410 skupaj v velikem enoti spomina, matrike. 20 00:00:53,410 --> 00:00:56,660 >> Vendar nismo bili sposobni, da se pomešajo up različne vrste podatkov skupaj. 21 00:00:56,660 --> 00:01:02,610 Ne moremo, pravijo, seznaniti celo število, in značaj, in dvojna vse 22 00:01:02,610 --> 00:01:05,330 V isto stvar in klic, da eno enoto. 23 00:01:05,330 --> 00:01:08,830 Ampak s strukturami, ali pogosto imenujejo konstruktov, 24 00:01:08,830 --> 00:01:09,585 smo dejansko lahko. 25 00:01:09,585 --> 00:01:12,370 Torej struktura je nekako podobnega super spremenljivko. 26 00:01:12,370 --> 00:01:16,530 To je spremenljivka, ki vsebuje druge spremenljivke znotraj nje. 27 00:01:16,530 --> 00:01:19,650 Torej, tukaj je primer zelo preprosta struktura. 28 00:01:19,650 --> 00:01:23,380 To je tisto, kar bi sintaksa videti želel ustvariti strukturo za avto. 29 00:01:23,380 --> 00:01:25,250 Zdaj pa pojdimo skozi sintakso tukaj. 30 00:01:25,250 --> 00:01:27,400 Struct, da je ključna beseda, ki označuje 31 00:01:27,400 --> 00:01:30,270 da sem ustvariti nov podatkovni tip tukaj. 32 00:01:30,270 --> 00:01:33,860 Še posebej, ime podatkovnega tipa je bo struct avto, kot bomo videli. 33 00:01:33,860 --> 00:01:36,640 Ampak to je neke vrste konice off prevajalniku, da ta 34 00:01:36,640 --> 00:01:42,440 kot skupina spremenljivk, ki se dogaja šteje za del istega tipa 35 00:01:42,440 --> 00:01:44,010 v minuto. 36 00:01:44,010 --> 00:01:46,340 >> Avtomobili, samo ime strukture. 37 00:01:46,340 --> 00:01:50,590 Again, podatkovni tip tukaj se dogaja biti struct avtomobila, ne le avtomobilov. 38 00:01:50,590 --> 00:01:53,060 Toda, če imate different-- če ste ustvarili več konstruktov 39 00:01:53,060 --> 00:01:56,950 v istem programu, morate razlikovati med struct in struct. 40 00:01:56,950 --> 00:02:00,140 Torej struct avto, jaz bi tudi Struct študent, na primer, 41 00:02:00,140 --> 00:02:01,790 v istem programu. 42 00:02:01,790 --> 00:02:05,980 Znotraj zavitih oklepajih so vsi ti polja 43 00:02:05,980 --> 00:02:07,954 ali člani strukture. 44 00:02:07,954 --> 00:02:10,370 Torej, kaj so nekatere od stvari, ki so neločljivo povezana v avtu? 45 00:02:10,370 --> 00:02:15,270 No, to je običajno eno leto, je ime modela, in registrske tablice, 46 00:02:15,270 --> 00:02:18,000 števec prevožene razdalje, ki ima navadno nekatere število kilometrov na njej, 47 00:02:18,000 --> 00:02:19,225 in morda velikostjo motorja. 48 00:02:19,225 --> 00:02:23,570 In kot vidite, sem mešanje navzgor števili in znaki in dvojice. 49 00:02:23,570 --> 00:02:26,420 Oni vse bo del te nove vrste podatkov. 50 00:02:26,420 --> 00:02:29,750 >> Končno, končno stvar moram storiti, Ne pozabite, to malo podpičje 51 00:02:29,750 --> 00:02:30,290 na koncu. 52 00:02:30,290 --> 00:02:34,380 Ko smo končali opredeljuje strukturo, moramo postaviti podpičje na koncu. 53 00:02:34,380 --> 00:02:37,325 To je zelo pogosta sintaktične napaka, ker s funkcijo, 54 00:02:37,325 --> 00:02:40,200 na primer, bi morali open kodrasti naramnicami, blizu kodrasti brace. 55 00:02:40,200 --> 00:02:42,950 Ne boste dal podpičje Na konec definicijo funkcije. 56 00:02:42,950 --> 00:02:46,430 To izgleda kot funkcijo opredelitev, vendar je ni, 57 00:02:46,430 --> 00:02:49,653 in tako podpičje tam je le opozorilo, da vas 58 00:02:49,653 --> 00:02:52,440 morali postaviti tam, ker prevajalnik bo sicer ne 59 00:02:52,440 --> 00:02:53,510 vedo, kaj storiti z njim. 60 00:02:53,510 --> 00:02:56,160 To je zelo pogosta napaka nenamerno narediti 61 00:02:56,160 --> 00:02:58,570 ko ste prvič opredeljevanju strukture. 62 00:02:58,570 --> 00:02:59,500 >> V REDU. 63 00:02:59,500 --> 00:03:02,824 Torej smo ponavadi opredeljujejo naše strukture na samem vrhu naših programov 64 00:03:02,824 --> 00:03:05,490 ker oni verjetno bo da se z več funkcijami uporablja. 65 00:03:05,490 --> 00:03:08,850 Nočemo, da določite Struct znotraj funkcije, 66 00:03:08,850 --> 00:03:12,110 ker potem bomo lahko only-- Obseg strukturi res 67 00:03:12,110 --> 00:03:13,790 obstaja samo znotraj te funkcije. 68 00:03:13,790 --> 00:03:17,450 Mi bi verjetno želeli opredeliti strukturo tako da ga lahko uporabljamo na več funkcij, 69 00:03:17,450 --> 00:03:20,670 ali pa morda v mnogokratnik datoteke, ki so vezani skupaj 70 00:03:20,670 --> 00:03:22,920 ustvariti našega enotnega programa. 71 00:03:22,920 --> 00:03:24,920 Včasih tudi namesto definiranja strukturo 72 00:03:24,920 --> 00:03:27,961 na samem vrhu, kjer ste postavili vašo pound vključuje in vaše funt opredeljuje, 73 00:03:27,961 --> 00:03:32,080 na primer, bi si jih dal v ločene dot h datoteke, ki vas nato 74 00:03:32,080 --> 00:03:35,020 funt vključujejo sami. 75 00:03:35,020 --> 00:03:37,620 >> Torej imamo strukture, zdaj pa moramo dobiti znotraj njih. 76 00:03:37,620 --> 00:03:39,800 Kako pridemo v notranjosti struktura dostop 77 00:03:39,800 --> 00:03:43,530 ti sub-spremenljivke, te spremenljivke da obstaja znotraj strukture? 78 00:03:43,530 --> 00:03:46,810 No, imamo nekaj, kar ti operator pika, ki nam omogoča, 79 00:03:46,810 --> 00:03:50,990 dostop do polja strukture. 80 00:03:50,990 --> 00:03:55,490 Tako, na primer, recimo, da sem izjavil moji podatki tipske nekje 81 00:03:55,490 --> 00:03:59,020 Na vrhu mojega programa, ali pa v pika h Datoteka da sem funt vključeni. 82 00:03:59,020 --> 00:04:03,360 Če pa želim ustvariti novo spremenljivka tega tipa podatkov, lahko rečem, 83 00:04:03,360 --> 00:04:06,260 struct avto, moj avto, podpičje. 84 00:04:06,260 --> 00:04:11,580 Tako kot lahko rečem int x, ali ime niz podpičje. 85 00:04:11,580 --> 00:04:18,100 >> Podatkovni tip tukaj je struct avto, ime spremenljivke je moj avto, 86 00:04:18,100 --> 00:04:23,770 in potem sem lahko uporabite operaterja dot dostop do različnih področja mojem avtu. 87 00:04:23,770 --> 00:04:27,494 Torej lahko rečem, moj avto dot leto je enako 2011. 88 00:04:27,494 --> 00:04:28,410 To je popolnoma v redu. 89 00:04:28,410 --> 00:04:34,210 Leto, če se spomnim, je bila opredeljena kot celo polje znotraj tega struct avtomobila 90 00:04:34,210 --> 00:04:35,200 podatkovni tip. 91 00:04:35,200 --> 00:04:39,966 Torej vsaka spremenljivka podatkov struct avtomobila tip, kot je moj avto, lahko rečem, moj avto 92 00:04:39,966 --> 00:04:44,030 dot leto je enako, in nato določite da nekateri celo vrednost 2011. 93 00:04:44,030 --> 00:04:47,290 Moj avto dot tablica enaka CS50. 94 00:04:47,290 --> 00:04:51,180 Moja kartica pika števec kilometrov enaka 50505 podpičjem. 95 00:04:51,180 --> 00:04:53,270 Vsi ti so popolnoma v redu in da je 96 00:04:53,270 --> 00:04:57,802 kako dostopati do področja strukture. 97 00:04:57,802 --> 00:05:00,260 Strukture, čeprav ne potrebujejo mora biti narejena na stack. 98 00:05:00,260 --> 00:05:02,950 Tako kot vse druge spremenljivke, smo jih dinamično mogoče dodeliti. 99 00:05:02,950 --> 00:05:06,309 Če imamo program, ki bi lahko se ustvarja veliko struktur, 100 00:05:06,309 --> 00:05:08,100 ne vemo, koliko bomo potrebovali, 101 00:05:08,100 --> 00:05:10,800 potem moramo dinamično dodeliti teh struktur 102 00:05:10,800 --> 00:05:12,960 kot naš program teče. 103 00:05:12,960 --> 00:05:16,600 In tako, če bomo za dostop do področja strukture v zvezi s tem, 104 00:05:16,600 --> 00:05:20,660 Odpoklic, da moramo najprej dereference kazalec na strukturo, 105 00:05:20,660 --> 00:05:24,810 in potem ko smo dereference kazalec, potem bomo lahko dostopate do polja. 106 00:05:24,810 --> 00:05:26,830 Če imamo le kazalec na strukturo, 107 00:05:26,830 --> 00:05:32,120 ne moremo samo reči kazalec dot polje ime in dobili tisto, kar smo iskali. 108 00:05:32,120 --> 00:05:34,259 Tam je dodaten korak Dereferenciranje. 109 00:05:34,259 --> 00:05:36,050 Torej, recimo, da namesto previous-- 110 00:05:36,050 --> 00:05:38,770 tako kot v prejšnjem primeru, namesto da bi jo razglaša 111 00:05:38,770 --> 00:05:43,680 na sklad, struct avto, moj avto, podpičje, povem struct avto, 112 00:05:43,680 --> 00:05:48,020 zvezda, kazalec na struct car poklical moj avto, 113 00:05:48,020 --> 00:05:51,250 enaka malloc velikost struct avtomobila. 114 00:05:51,250 --> 00:05:54,950 Velikost bomo ugotoviti, koliko bajti vaš nov podatkovni tip prevzame. 115 00:05:54,950 --> 00:05:58,570 Vam ni treba uporabljati nujno samo velikost, širino, int ali char, ali kateri koli 116 00:05:58,570 --> 00:05:59,715 od vgrajenih podatkovnih tipov. 117 00:05:59,715 --> 00:06:02,090 Prevajalnik je dovolj pameten, da ugotovimo, koliko bajtov 118 00:06:02,090 --> 00:06:04,170 ki so potrebne za vaše novo strukturo. 119 00:06:04,170 --> 00:06:09,610 Tako sem malloc sam enoto pomnilnika dovolj velika, da imajo struct avto, 120 00:06:09,610 --> 00:06:12,410 in dobim kazalec nazaj v tem bloku spomina, 121 00:06:12,410 --> 00:06:16,090 in da kazalec je dodeljena moj avto. 122 00:06:16,090 --> 00:06:18,050 >> Zdaj pa, če želim dostop polja za moj avto, 123 00:06:18,050 --> 00:06:22,615 Najprej sem dereference mojem avtu uporabo upravljavec dereference, zvezda 124 00:06:22,615 --> 00:06:26,620 da smo videli od kazalcev video posnetkov, nato pa po I ciljne datoteke, 125 00:06:26,620 --> 00:06:32,200 potem sem lahko uporabite operaterja dot dostop do različnih področja mojem avtu. 126 00:06:32,200 --> 00:06:35,490 Star avto dot leto je enako 2011. 127 00:06:35,490 --> 00:06:38,480 To bi imelo za posledico želimo v tem primeru, 128 00:06:38,480 --> 00:06:41,960 Ker smo dinamično dodeljena moj avto. 129 00:06:41,960 --> 00:06:43,610 >> To je vrsta siten, čeprav, kajne? 130 00:06:43,610 --> 00:06:44,818 Tam je postopek zdaj 2-korak. 131 00:06:44,818 --> 00:06:47,460 Zdaj moramo dereference-- imamo operaterja zvezda, 132 00:06:47,460 --> 00:06:48,910 in imamo operaterja dot. 133 00:06:48,910 --> 00:06:51,660 In kot bi lahko pričakovali, saj Programerji C radi krajše poti 134 00:06:51,660 --> 00:06:53,740 za stvari, obstaja krajša pot, da to storijo. 135 00:06:53,740 --> 00:06:57,790 Obstaja pa še ena operator imenuje puščica, zaradi česar je ta proces veliko lažje. 136 00:06:57,790 --> 00:07:00,750 Način puščica deluje, Najprej je dereferences 137 00:07:00,750 --> 00:07:03,560 kazalec na levi strani operaterja, 138 00:07:03,560 --> 00:07:06,620 in nato, potem ko dereferenced kazalec na levi strani, 139 00:07:06,620 --> 00:07:09,620 je dostopi polje na desni. 140 00:07:09,620 --> 00:07:14,170 In tako že prej smo imeli to vrsto Star moj avto dot vse te stvari, 141 00:07:14,170 --> 00:07:15,880 kot je bilo veliko dogaja tam. 142 00:07:15,880 --> 00:07:22,040 Toda kaj lahko namesto tega storiti, je this-- moj avto arrow leto je enako 2011. 143 00:07:22,040 --> 00:07:23,580 >> Še enkrat, kaj se dogaja tukaj? 144 00:07:23,580 --> 00:07:25,720 Najprej sem Dereferenciranje moj avto. 145 00:07:25,720 --> 00:07:27,810 Ki je spet, je kazalec tukaj. 146 00:07:27,810 --> 00:07:31,270 Potem, ko ima dereferenced moj avto, sem 147 00:07:31,270 --> 00:07:35,130 Nato lahko dostopate do polja leto, tablice in števec kilometrov 148 00:07:35,130 --> 00:07:40,020 tako kot sem lahko, preden prvič Rabljeni zvezda dereference moj avto, 149 00:07:40,020 --> 00:07:42,020 in dot za dostop do polja. 150 00:07:42,020 --> 00:07:45,290 Tako da lahko imate strukture, ki jih lahko napotke struktur, 151 00:07:45,290 --> 00:07:48,360 in imate načine dostopanja polja teh struktur, 152 00:07:48,360 --> 00:07:52,600 ali imate napotke za jih ali spremenljivke sami. 153 00:07:52,600 --> 00:07:57,640 Pika ali puščica, odvisno kako je spremenljivka deklarirana. 154 00:07:57,640 --> 00:08:00,510 Sem Doug Lloyd, to je CS50. 155 00:08:00,510 --> 00:08:01,975