1 00:00:00,000 --> 00:00:02,395 >> [MUSIC JOC] 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 Am lucrat cu numere întregi, am lucrat cu personaje, 5 00:00:08,880 --> 00:00:11,930 am lucrat flotoare, duble, siruri de caractere, și bools. 6 00:00:11,930 --> 00:00:14,870 Am epuizat destul de mult tot a [neauzit] tipuri care 7 00:00:14,870 --> 00:00:17,100 au fost disponibile pentru noi toți de-a lungul. 8 00:00:17,100 --> 00:00:19,430 Dar acum vrem să facem ceva mai mult. 9 00:00:19,430 --> 00:00:20,210 Cum facem asta? 10 00:00:20,210 --> 00:00:22,560 Cum putem crea diferite tipuri de date? 11 00:00:22,560 --> 00:00:26,130 Putem face acest lucru prin utilizarea de structuri. 12 00:00:26,130 --> 00:00:30,180 Deci, structuri ne permit să unifice variabile ale diferitelor tipuri 13 00:00:30,180 --> 00:00:34,810 într-un singur, nou tip variabilă, pe care le putem atribui propriul nume de tip. 14 00:00:34,810 --> 00:00:37,570 Aceasta este o foarte puternic lucru pentru a fi capabil să facă, 15 00:00:37,570 --> 00:00:40,900 pentru că putem acum de grup elemente ale diferitelor tipuri de date 16 00:00:40,900 --> 00:00:43,910 împreună care au o conexiune logică. 17 00:00:43,910 --> 00:00:46,440 Am fost în stare să facă acest lucru cu tablouri fel de, nu? 18 00:00:46,440 --> 00:00:49,540 Putem variabile de grup de același tip de date 19 00:00:49,540 --> 00:00:53,410 împreună într-o unitate mare de memorie, o matrice. 20 00:00:53,410 --> 00:00:56,660 >> Dar nu am fost în măsură să se amestecă up diferite tipuri de date împreună. 21 00:00:56,660 --> 00:01:02,610 Nu putem, spune, asociați un număr întreg, și un caracter, și un dublu toate 22 00:01:02,610 --> 00:01:05,330 în același lucru și numi asta o singură unitate. 23 00:01:05,330 --> 00:01:08,830 Dar cu structuri, sau frecvent menționate ca structs, 24 00:01:08,830 --> 00:01:09,585 am de fapt, poate. 25 00:01:09,585 --> 00:01:12,370 Deci, o structură este un fel de ca o variabilă de super. 26 00:01:12,370 --> 00:01:16,530 Este o variabilă care conține alte variabile interior. 27 00:01:16,530 --> 00:01:19,650 Deci, aici e un exemplu de o structură foarte simplă. 28 00:01:19,650 --> 00:01:23,380 Aceasta este ceea ce ar arata sintaxa ca să creeze o structură pentru o masina. 29 00:01:23,380 --> 00:01:25,250 Acum, să mergem prin sintaxa aici. 30 00:01:25,250 --> 00:01:27,400 Struct, asta e cuvinte cheie care indică 31 00:01:27,400 --> 00:01:30,270 că eu sunt crearea unui nou tip de date aici. 32 00:01:30,270 --> 00:01:33,860 În special, numele tipul de date este va fi masina struct, așa cum vom vedea. 33 00:01:33,860 --> 00:01:36,640 Dar acest lucru este un fel de vârf off compilatorului că această 34 00:01:36,640 --> 00:01:42,440 ca un grup de variabile care se întâmplă să fie considerate ca făcând parte din același tip 35 00:01:42,440 --> 00:01:44,010 Intr-un minut. 36 00:01:44,010 --> 00:01:46,340 >> Mașini, doar numele structurii. 37 00:01:46,340 --> 00:01:50,590 Din nou, tipul de date aici se întâmplă să fie masina struct, nu doar masina. 38 00:01:50,590 --> 00:01:53,060 Dar dacă aveți different-- dacă veți crea mai multe structs 39 00:01:53,060 --> 00:01:56,950 în același program, aveți nevoie pentru a distinge între struct și struct. 40 00:01:56,950 --> 00:02:00,140 Masina Deci struct, s-ar putea avea, de asemenea elev struct, de exemplu, 41 00:02:00,140 --> 00:02:01,790 în același program. 42 00:02:01,790 --> 00:02:05,980 Interioară a acolade sunt toate așa-numitele domenii, 43 00:02:05,980 --> 00:02:07,954 sau membri ai structurii. 44 00:02:07,954 --> 00:02:10,370 Deci, ce sunt unele dintre lucrurile care sunt inerente într-o mașină? 45 00:02:10,370 --> 00:02:15,270 Ei bine, de obicei, are un an, a un nume de model, și o plăcuță de înmatriculare, 46 00:02:15,270 --> 00:02:18,000 un contor de parcurs care are de obicei un numar de mile pe ea, 47 00:02:18,000 --> 00:02:19,225 și poate o dimensiune motor. 48 00:02:19,225 --> 00:02:23,570 Și, după cum puteți vedea, am amestecând întregi și caractere și duble. 49 00:02:23,570 --> 00:02:26,420 Ei toți vor fi parte a acestui nou tip de date. 50 00:02:26,420 --> 00:02:29,750 >> În cele din urmă, lucru finală trebuie să fac, nu uitați acest mic punct și virgulă 51 00:02:29,750 --> 00:02:30,290 la sfarsit. 52 00:02:30,290 --> 00:02:34,380 După ce am terminat de definirea structurii, avem nevoie pentru a pune un punct și virgulă la sfârșitul anului. 53 00:02:34,380 --> 00:02:37,325 Este un foarte frecvente sintactic greșeală, deoarece cu o funcție, 54 00:02:37,325 --> 00:02:40,200 de exemplu, ar trebui pur și simplu bretele buclat deschis, aproape bretele buclat. 55 00:02:40,200 --> 00:02:42,950 Tu nu pune un punct și virgulă la capăt de definiția unei funcții. 56 00:02:42,950 --> 00:02:46,430 Acest lucru arata ca o funcție definiție, dar nu este, 57 00:02:46,430 --> 00:02:49,653 și așa mai departe punct și virgulă acolo este doar un memento care vă 58 00:02:49,653 --> 00:02:52,440 Trebuie să-l pună acolo, deoarece compilatorul nu va altfel 59 00:02:52,440 --> 00:02:53,510 știu ce să fac cu ea. 60 00:02:53,510 --> 00:02:56,160 Este o eroare foarte frecvente pentru a face accidental 61 00:02:56,160 --> 00:02:58,570 atunci când sunteți definirea întâi structuri. 62 00:02:58,570 --> 00:02:59,500 >> BINE. 63 00:02:59,500 --> 00:03:02,824 Deci, ne definim, de obicei, structurile noastre la foarte de sus a programelor noastre 64 00:03:02,824 --> 00:03:05,490 pentru că ei, probabil, va pentru a fi utilizate de mai multe funcții. 65 00:03:05,490 --> 00:03:08,850 Noi nu vrem să definească o struct în interiorul unei funcții, 66 00:03:08,850 --> 00:03:12,110 pentru că atunci ne putem only-- Domeniul de aplicare a structurii într-adevăr 67 00:03:12,110 --> 00:03:13,790 există doar în interiorul acestei funcții. 68 00:03:13,790 --> 00:03:17,450 Probabil ne-ar dori pentru a defini o structură astfel încât să putem folosi în mai multe funcții, 69 00:03:17,450 --> 00:03:20,670 sau, poate, în mai multe fișierele care sunt legate împreună 70 00:03:20,670 --> 00:03:22,920 pentru a crea programul nostru unic. 71 00:03:22,920 --> 00:03:24,920 Uneori, de asemenea, în loc de definire a structurii 72 00:03:24,920 --> 00:03:27,961 la foarte de sus în cazul în care ați pus dumneavoastră lira include și lira ta definește, 73 00:03:27,961 --> 00:03:32,080 de exemplu, s-ar putea să le pună în fișiere punct h separate, pe care le apoi 74 00:03:32,080 --> 00:03:35,020 Pound includ tine. 75 00:03:35,020 --> 00:03:37,620 >> Deci avem structuri, dar acum avem nevoie pentru a obține în interiorul lor. 76 00:03:37,620 --> 00:03:39,800 Cum ajungem în interiorul o structură de acces 77 00:03:39,800 --> 00:03:43,530 aceste sub-variabile, aceste variabile că există în interiorul structurii? 78 00:03:43,530 --> 00:03:46,810 Ei bine, avem ceva numit operatorul punct, care ne permite 79 00:03:46,810 --> 00:03:50,990 pentru a accesa câmpurile structurii. 80 00:03:50,990 --> 00:03:55,490 Deci, de exemplu, să spunem că am declarat datele mele structura de tip undeva 81 00:03:55,490 --> 00:03:59,020 în partea de sus a programului meu, sau poate în un fișier punct h care le-am inclus lire. 82 00:03:59,020 --> 00:04:03,360 Dacă atunci vreau pentru a crea un nou variabilă de acest tip de date, pot să spun, 83 00:04:03,360 --> 00:04:06,260 masina struct, mașina mea, punct și virgulă. 84 00:04:06,260 --> 00:04:11,580 Așa cum am putea spune Int X, sau numele șir punct și virgulă. 85 00:04:11,580 --> 00:04:18,100 >> Tipul de date de aici este automobil struct, numele variabilei este masina mea, 86 00:04:18,100 --> 00:04:23,770 și apoi pot folosi operatorul punct de acces la diferite domenii ale masina mea. 87 00:04:23,770 --> 00:04:27,494 Deci, eu pot spune masina mea dot an este egal cu 2011. 88 00:04:27,494 --> 00:04:28,410 Asta e foarte bine. 89 00:04:28,410 --> 00:04:34,210 An, dacă vă amintiți, a fost definit ca un câmp întreg interiorul aceasta masina struct 90 00:04:34,210 --> 00:04:35,200 tip de date. 91 00:04:35,200 --> 00:04:39,966 Deci, orice variabilă a datelor auto struct tip, cum ar fi masina mea, pot spune masina mea 92 00:04:39,966 --> 00:04:44,030 Anul punct este egal și apoi atribuiți se o valoare întreagă, 2011. 93 00:04:44,030 --> 00:04:47,290 My placă dot masina este egal CS50. 94 00:04:47,290 --> 00:04:51,180 My carte dot kilometrajul este egal cu 50505 și virgulă. 95 00:04:51,180 --> 00:04:53,270 Toate acestea sunt foarte bine și asta e 96 00:04:53,270 --> 00:04:57,802 cum accesăm câmpuri ale structurii. 97 00:04:57,802 --> 00:05:00,260 Structuri, deși, nu au nevoie de care urmează să fie create pe stiva. 98 00:05:00,260 --> 00:05:02,950 La fel ca orice alte variabile, am le poate aloca dinamic. 99 00:05:02,950 --> 00:05:06,309 Dacă avem un program care ar putea fi generatoare de mai multe structuri, 100 00:05:06,309 --> 00:05:08,100 nu știm cât de multe vom avea nevoie de, 101 00:05:08,100 --> 00:05:10,800 atunci trebuie să dinamic aloca aceste structuri 102 00:05:10,800 --> 00:05:12,960 ca programul nostru se execută. 103 00:05:12,960 --> 00:05:16,600 Și așa, dacă vom pentru a accesa domenii de o structură în acest context, 104 00:05:16,600 --> 00:05:20,660 amintesc că trebuie mai întâi să dereference indicatorul la structura, 105 00:05:20,660 --> 00:05:24,810 și apoi o dată ne-am dereference pointer, atunci putem accesa câmpurile. 106 00:05:24,810 --> 00:05:26,830 Dacă avem doar un pointer la structura, 107 00:05:26,830 --> 00:05:32,120 nu putem spune pur și simplu câmp pointer punct numele și obține ceea ce căutăm. 108 00:05:32,120 --> 00:05:34,259 Există pas suplimentar de dereferencing. 109 00:05:34,259 --> 00:05:36,050 Deci, haideți să spunem că în loc de previous-- 110 00:05:36,050 --> 00:05:38,770 la fel ca exemplul anterior, în loc de declararea acesteia 111 00:05:38,770 --> 00:05:43,680 pe stiva, masina struct, mea auto, punct și virgulă, spun masina struct, 112 00:05:43,680 --> 00:05:48,020 stele, un pointer la un masina struct numit masina mea, 113 00:05:48,020 --> 00:05:51,250 este egal cu dimensiunea malloc de masina struct. 114 00:05:51,250 --> 00:05:54,950 Mărimea vom da seama cât de multe bytes noul tip de date ocupă. 115 00:05:54,950 --> 00:05:58,570 Nu aveți nevoie neapărat doar de a utiliza mărimea, latime, Int, sau char, sau orice 116 00:05:58,570 --> 00:05:59,715 din tipurile de date built-in. 117 00:05:59,715 --> 00:06:02,090 Compilatorul este destul de inteligent să dau seama cum de multe bytes 118 00:06:02,090 --> 00:06:04,170 sunt cerute de noua structură. 119 00:06:04,170 --> 00:06:09,610 Deci, m-am malloc o unitate de memorie suficient de mare pentru a deține o mașină struct, 120 00:06:09,610 --> 00:06:12,410 și I a lua un pointer înapoi la acel bloc de memorie, 121 00:06:12,410 --> 00:06:16,090 și că pointer este atribuit mașina mea. 122 00:06:16,090 --> 00:06:18,050 >> Acum, dacă vreau să acces domeniile de masina mea, 123 00:06:18,050 --> 00:06:22,615 Prima dereference masina mea folosind operatorul dereference, steaua 124 00:06:22,615 --> 00:06:26,620 pe care le-am văzut de la indicii video, iar apoi după ce am dereference, 125 00:06:26,620 --> 00:06:32,200 apoi m-am pot folosi operatorul punct de acces la diferite domenii ale masina mea. 126 00:06:32,200 --> 00:06:35,490 Stele mașina mea dot an este egal cu 2011. 127 00:06:35,490 --> 00:06:38,480 Care ar avea ca efect vrem în acest caz, 128 00:06:38,480 --> 00:06:41,960 pentru că ne-am dinamic alocat mașina mea. 129 00:06:41,960 --> 00:06:43,610 >> Asta e un fel de enervant, totuși, nu? 130 00:06:43,610 --> 00:06:44,818 Există un proces de 2 pași acum. 131 00:06:44,818 --> 00:06:47,460 Acum trebuie să dereference-- avem un operator de stele, 132 00:06:47,460 --> 00:06:48,910 și avem un operator de punct. 133 00:06:48,910 --> 00:06:51,660 Și, după cum s-ar putea aștepta, pentru că C programatori dragoste moduri scurte 134 00:06:51,660 --> 00:06:53,740 de a face lucruri, există o modalitate mai scurtă a face acest lucru. 135 00:06:53,740 --> 00:06:57,790 Nu există un alt operator de numit săgeată, ceea ce face acest proces mult mai ușor. 136 00:06:57,790 --> 00:07:00,750 Modul în care funcționează este săgeată IT primele dereferences 137 00:07:00,750 --> 00:07:03,560 indicatorul din stânga partea operatorului, 138 00:07:03,560 --> 00:07:06,620 și apoi, după ce a dereferentierea indicatorul din stânga, 139 00:07:06,620 --> 00:07:09,620 accesează câmpul din dreapta. 140 00:07:09,620 --> 00:07:14,170 Și astfel am avut anterior acest tip Star masina mea dot toate aceste lucruri, 141 00:07:14,170 --> 00:07:15,880 ca a existat o mulțime întâmplă acolo. 142 00:07:15,880 --> 00:07:22,040 Dar ceea ce putem face în schimb este astea-- mea săgeată masina an este egal cu 2,011. 143 00:07:22,040 --> 00:07:23,580 >> Din nou, ce se întâmplă aici? 144 00:07:23,580 --> 00:07:25,720 În primul rând, eu sunt dereferencing mașina mea. 145 00:07:25,720 --> 00:07:27,810 Care din nou, este un pointer aici. 146 00:07:27,810 --> 00:07:31,270 Apoi, după ce dereferentierea masina mea, am 147 00:07:31,270 --> 00:07:35,130 pot accesa apoi câmpurile an, placă, și kilometrajul 148 00:07:35,130 --> 00:07:40,020 la fel cum am putut inainte de a avea prima stele second-hand la dereference masina mea, 149 00:07:40,020 --> 00:07:42,020 și dot pentru a accesa câmpul. 150 00:07:42,020 --> 00:07:45,290 Astfel încât să puteți avea structuri, vă poate avea indicii de structuri, 151 00:07:45,290 --> 00:07:48,360 și aveți acces la căi domeniile de aceste structuri, 152 00:07:48,360 --> 00:07:52,600 dacă aveți indicii la le sau variabilele înșiși. 153 00:07:52,600 --> 00:07:57,640 Dot sau săgeată, în funcție de cum a fost declarat variabila. 154 00:07:57,640 --> 00:08:00,510 Sunt Doug Lloyd, aceasta este CS50. 155 00:08:00,510 --> 00:08:01,975