1 00:00:00,000 --> 00:00:02,395 >> [MUZYKI] 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 Pracowaliśmy z liczb całkowitych, Pracowaliśmy z postaciami, 5 00:00:08,880 --> 00:00:11,930 Pracowaliśmy pływaków, dwuosobowe, łańcuchy i bools. 6 00:00:11,930 --> 00:00:14,870 Byliśmy wyczerpani prawie wszystkie z [niesłyszalne] typów, które 7 00:00:14,870 --> 00:00:17,100 były dostępne dla nas wszystkich razem. 8 00:00:17,100 --> 00:00:19,430 Ale teraz chcemy zrobić coś więcej. 9 00:00:19,430 --> 00:00:20,210 Jak mamy to zrobić? 10 00:00:20,210 --> 00:00:22,560 W jaki sposób możemy tworzyć różne typy danych? 11 00:00:22,560 --> 00:00:26,130 Możemy to zrobić za pomocą struktur. 12 00:00:26,130 --> 00:00:30,180 Więc struktur pozwoli nam zjednoczyć zmienne różnych typów 13 00:00:30,180 --> 00:00:34,810 w jeden nowy typ zmiennej, które możemy przypisać własną nazwę typu. 14 00:00:34,810 --> 00:00:37,570 To jest naprawdę silna rzeczą, aby być w stanie zrobić, 15 00:00:37,570 --> 00:00:40,900 dlatego, że może teraz grupy elementy różnych typów danych 16 00:00:40,900 --> 00:00:43,910 razem, że ma logicznego związku. 17 00:00:43,910 --> 00:00:46,440 Byliśmy w stanie to zrobić z tablicami rodzaju, prawda? 18 00:00:46,440 --> 00:00:49,540 Możemy zmienne grupy tego samego typu 19 00:00:49,540 --> 00:00:53,410 wspólnie w dużym urządzeniu pamięci, tablicy. 20 00:00:53,410 --> 00:00:56,660 >> Ale nie udało się mieszać różnych typów danych razem. 21 00:00:56,660 --> 00:01:02,610 Nie możemy, mówią, powiązać liczbę całkowitą, i charakter, i podwójną wszystkie 22 00:01:02,610 --> 00:01:05,330 w samej rzeczy i nazwać jednym urządzeniu. 23 00:01:05,330 --> 00:01:08,830 Ale ze struktur, lub często nazywane elemencie, 24 00:01:08,830 --> 00:01:09,585 rzeczywiście możliwe. 25 00:01:09,585 --> 00:01:12,370 Tak więc struktura jest rodzajem jakby zmiennej Super. 26 00:01:12,370 --> 00:01:16,530 Jest to zmienna, która zawiera inne zmienne w jej wnętrzu. 27 00:01:16,530 --> 00:01:19,650 Więc tutaj jest przykład bardzo prosta konstrukcja. 28 00:01:19,650 --> 00:01:23,380 To jest to, co składnia będzie jak na utworzenie struktury samochodu. 29 00:01:23,380 --> 00:01:25,250 Teraz idziemy przez składni tutaj. 30 00:01:25,250 --> 00:01:27,400 Struct, że to słowo kluczowe, które wskazuje, 31 00:01:27,400 --> 00:01:30,270 że tworzę nowy typ danych tutaj. 32 00:01:30,270 --> 00:01:33,860 W szczególności, nazwa typu danych jest będzie struktura samochodu, jak zobaczymy. 33 00:01:33,860 --> 00:01:36,640 Ale to jest coś w rodzaju końcówki się do kompilatora, że ​​ta 34 00:01:36,640 --> 00:01:42,440 jako grupy zmiennych, który ma należy uznać za część tego samego typu 35 00:01:42,440 --> 00:01:44,010 w minutę. 36 00:01:44,010 --> 00:01:46,340 >> Samochody, tylko nazwa struktury. 37 00:01:46,340 --> 00:01:50,590 Ponownie, typ danych tu się dzieje Samochód będzie struktura, nie tylko samochód. 38 00:01:50,590 --> 00:01:53,060 Ale jeśli masz different-- W przypadku tworzenia wielu konstrukcjom 39 00:01:53,060 --> 00:01:56,950 w tym samym programie, należy rozróżnić struktury i struktury. 40 00:01:56,950 --> 00:02:00,140 Tak więc struktura samochodu, może ja też mam Student struktura, na przykład, 41 00:02:00,140 --> 00:02:01,790 w tym samym programie. 42 00:02:01,790 --> 00:02:05,980 Wewnątrz nawiasy są wszystkich tak zwanych polach 43 00:02:05,980 --> 00:02:07,954 lub członkowie struktury. 44 00:02:07,954 --> 00:02:10,370 Więc co to tylko niektóre z rzeczy, które są nieodłączne w samochodzie? 45 00:02:10,370 --> 00:02:15,270 Cóż, to zwykle ma rok, jest nazwę modelu oraz tablic rejestracyjnych, 46 00:02:15,270 --> 00:02:18,000 drogomierz, że zazwyczaj ma niektóre liczba mil na jej temat, 47 00:02:18,000 --> 00:02:19,225 a może i pojemności silnika. 48 00:02:19,225 --> 00:02:23,570 I jak widać, jestem mieszania liczby całkowite i znaków i dwuosobowe. 49 00:02:23,570 --> 00:02:26,420 Oni wszystko będzie część tego nowego typu danych. 50 00:02:26,420 --> 00:02:29,750 >> Ostatni wreszcie coś muszę zrobić, nie zapomnij, ten mały średnik 51 00:02:29,750 --> 00:02:30,290 na końcu. 52 00:02:30,290 --> 00:02:34,380 Po zakończeniu definiowania mamy strukturę, musimy postawić średnik na końcu. 53 00:02:34,380 --> 00:02:37,325 Jest to bardzo często składniowej błąd, ponieważ z funkcji, 54 00:02:37,325 --> 00:02:40,200 na przykład, to po prostu trzeba otwarty nawias klamrowy, blisko nawias klamrowy. 55 00:02:40,200 --> 00:02:42,950 Nie postawić średnik u koniec definicji funkcji. 56 00:02:42,950 --> 00:02:46,430 To wygląda jak funkcja definicja, ale to nie jest, 57 00:02:46,430 --> 00:02:49,653 i tak średnik nie jest tylko przypomnienie, że cię 58 00:02:49,653 --> 00:02:52,440 Należy umieścić go tam, bo kompilator nie będzie inaczej 59 00:02:52,440 --> 00:02:53,510 wiesz co z nim zrobić. 60 00:02:53,510 --> 00:02:56,160 Jest to bardzo częsty błąd przypadkowo zrobić 61 00:02:56,160 --> 00:02:58,570 kiedy pierwszy definiowania struktury. 62 00:02:58,570 --> 00:02:59,500 >> OK. 63 00:02:59,500 --> 00:03:02,824 Więc zwykle definiują nasze struktury na samym szczycie z naszych programów 64 00:03:02,824 --> 00:03:05,490 ponieważ są one prawdopodobnie będzie być używana przez wiele funkcji. 65 00:03:05,490 --> 00:03:08,850 Nie chcemy, aby zdefiniować struct wewnątrz funkcji, 66 00:03:08,850 --> 00:03:12,110 bo wtedy możemy only-- Zakres struktury naprawdę 67 00:03:12,110 --> 00:03:13,790 istnieje tylko wewnątrz tej funkcji. 68 00:03:13,790 --> 00:03:17,450 Chcemy prawdopodobnie chcesz zdefiniować strukturę więc możemy używać go w wielu funkcji, 69 00:03:17,450 --> 00:03:20,670 a może w wielu Pliki, które są ze sobą powiązane 70 00:03:20,670 --> 00:03:22,920 aby stworzyć jeden program. 71 00:03:22,920 --> 00:03:24,920 Czasami też, zamiast zdefiniowania struktury 72 00:03:24,920 --> 00:03:27,961 na samym szczycie, gdzie można umieścić Obejmuje a funta funt określa, 73 00:03:27,961 --> 00:03:32,080 na przykład, można umieścić je w Kropka h oddzielne pliki, które następnie 74 00:03:32,080 --> 00:03:35,020 funt to samemu. 75 00:03:35,020 --> 00:03:37,620 >> Więc mamy struktur, ale teraz Musimy dostać się do środka z nich. 76 00:03:37,620 --> 00:03:39,800 W jaki sposób możemy uzyskać wewnątrz struktura dostępu 77 00:03:39,800 --> 00:03:43,530 te zmienne, sub-tych zmiennych które występują wewnątrz struktury? 78 00:03:43,530 --> 00:03:46,810 Cóż, mamy coś, co nazywa operator kropki, które pozwala nam 79 00:03:46,810 --> 00:03:50,990 Aby uzyskać dostęp do pola tej struktury. 80 00:03:50,990 --> 00:03:55,490 Tak na przykład, powiedzmy, że mam oświadczył Struktura wpisać moje dane gdzieś 81 00:03:55,490 --> 00:03:59,020 na szczycie mojego programu, a może w plik dot h, że mam funta włączone. 82 00:03:59,020 --> 00:04:03,360 Jeżeli więc Ja chcę stworzyć nowy Zmienna tego typu danych, można powiedzieć, 83 00:04:03,360 --> 00:04:06,260 Samochód struct, mój samochód, średnik. 84 00:04:06,260 --> 00:04:11,580 Tak jak mógłbym powiedzieć int x, lub nazwa ciąg średnik. 85 00:04:11,580 --> 00:04:18,100 >> Typ danych tutaj jest struktura samochodu, nazwa zmiennej jest mój samochód, 86 00:04:18,100 --> 00:04:23,770 a następnie można użyć operatora kropki dostęp do różnych dziedzin mojego samochodu. 87 00:04:23,770 --> 00:04:27,494 Więc mogę powiedzieć, mój samochód Kropka roku wynosi 2011. 88 00:04:27,494 --> 00:04:28,410 To jest całkowicie w porządku. 89 00:04:28,410 --> 00:04:34,210 Roku, jeśli przypomnieć, został określony jako całkowita pola wewnątrz tej struktury samochodu 90 00:04:34,210 --> 00:04:35,200 typ danych. 91 00:04:35,200 --> 00:04:39,966 Tak więc każda zmienna danych struct samochodu typu, takich jak mój samochód, mogę powiedzieć, mój samochód 92 00:04:39,966 --> 00:04:44,030 Kropka roku równa, a następnie przypisać to jakaś wartość całkowita 2011. 93 00:04:44,030 --> 00:04:47,290 Mój samochód dot płyta równa CS50. 94 00:04:47,290 --> 00:04:51,180 Moja karta kropka licznik kilometrów wynosi 50505 średnik. 95 00:04:51,180 --> 00:04:53,270 Wszystkie te są perfekcyjnie i to 96 00:04:53,270 --> 00:04:57,802 jak uzyskać dostęp do Pola konstrukcji. 97 00:04:57,802 --> 00:05:00,260 Struktury, choć nie muszą zostać utworzony na stos. 98 00:05:00,260 --> 00:05:02,950 Podobnie jak wszelkie inne zmienne, możemy mogą dynamicznie przydzielać im. 99 00:05:02,950 --> 00:05:06,309 Jeżeli mamy program, który może generować wiele struktur, 100 00:05:06,309 --> 00:05:08,100 nie wiemy, jak wiele będziemy potrzebować, 101 00:05:08,100 --> 00:05:10,800 to musimy dynamicznie rozdysponowaniu tych struktur 102 00:05:10,800 --> 00:05:12,960 a nasz program jest uruchomiony. 103 00:05:12,960 --> 00:05:16,600 I tak, jeśli chcemy, aby uzyskać dostęp do pola struktury w tym kontekście, 104 00:05:16,600 --> 00:05:20,660 Przypomnijmy, że najpierw musimy dereference wskaźnik do struktury, 105 00:05:20,660 --> 00:05:24,810 a następnie gdy już dereference wskaźnik, to możemy przejść do pola. 106 00:05:24,810 --> 00:05:26,830 Jeśli mamy tylko wskaźnik do struktury, 107 00:05:26,830 --> 00:05:32,120 nie możemy po prostu powiedzieć pole wskaźnik dot imię i dostać to, czego szukamy. 108 00:05:32,120 --> 00:05:34,259 Jest to dodatkowy krok od wyłuskania. 109 00:05:34,259 --> 00:05:36,050 Więc powiedzmy, że Zamiast previous-- 110 00:05:36,050 --> 00:05:38,770 podobnie jak w poprzednim przykładzie, zamiast deklarowania 111 00:05:38,770 --> 00:05:43,680 na stos, struct samochód, mój Samochód, średnik, mówię struct samochód, 112 00:05:43,680 --> 00:05:48,020 gwiazda, wskaźnikiem do struct samochodu zadzwonił do mojego samochodu, 113 00:05:48,020 --> 00:05:51,250 równa malloc rozmiar struct samochodu. 114 00:05:51,250 --> 00:05:54,950 Rozmiar będziemy dowiedzieć się, jak wiele bajty nowy typ danych zajmuje. 115 00:05:54,950 --> 00:05:58,570 Nie musisz koniecznie używać tylko wielkość, szerokość, int lub char, lub którykolwiek 116 00:05:58,570 --> 00:05:59,715 z wbudowanych typów danych. 117 00:05:59,715 --> 00:06:02,090 Kompilator jest wystarczająco inteligentny, dowiedzieć się, jak wiele bajtów 118 00:06:02,090 --> 00:06:04,170 są wymagane przez nową strukturę. 119 00:06:04,170 --> 00:06:09,610 Więc malloc sobie jednostkę pamięci wystarczająco duże, aby utrzymać samochód struct, 120 00:06:09,610 --> 00:06:12,410 i uzyskać wskaźnik powrotem do tego bloku pamięci 121 00:06:12,410 --> 00:06:16,090 i że wskaźnik jest przypisany do mojego samochodu. 122 00:06:16,090 --> 00:06:18,050 >> Teraz, jeśli chcę, aby uzyskać dostęp pola z mojego samochodu, 123 00:06:18,050 --> 00:06:22,615 Pierwszy raz dereference mojego samochodu za pomocą operator wyłuskiwania, gwiazda 124 00:06:22,615 --> 00:06:26,620 które widzieliśmy od wskaźników filmy, a następnie po I dereference, 125 00:06:26,620 --> 00:06:32,200 to mogę użyć operatora kropki dostęp do różnych dziedzin mojego samochodu. 126 00:06:32,200 --> 00:06:35,490 Gwiazda mojego samochodu kropka roku wynosi 2011. 127 00:06:35,490 --> 00:06:38,480 To spowodowałoby Chcemy w tym przypadku, 128 00:06:38,480 --> 00:06:41,960 bo mamy dynamicznie przydzielone mój samochód. 129 00:06:41,960 --> 00:06:43,610 >> To trochę irytujące, prawda? 130 00:06:43,610 --> 00:06:44,818 Jest to proces 2-stopniowy teraz. 131 00:06:44,818 --> 00:06:47,460 Teraz musimy dereference-- mamy operatora gwiazdy, 132 00:06:47,460 --> 00:06:48,910 i mamy operatora kropki. 133 00:06:48,910 --> 00:06:51,660 I jak można się spodziewać, ponieważ Programiści C kocham krótsze drogi 134 00:06:51,660 --> 00:06:53,740 robić rzeczy, nie jest krótszy sposób to zrobić. 135 00:06:53,740 --> 00:06:57,790 Nie ma innego operatora o nazwie strzałka, co sprawia, że ​​ten proces o wiele łatwiejsze. 136 00:06:57,790 --> 00:07:00,750 Sposób strzałka działa jest najpierw dereferences 137 00:07:00,750 --> 00:07:03,560 wskaźnik lewej stronie operatora 138 00:07:03,560 --> 00:07:06,620 a następnie, po dereferencjonowane wskaźnik po lewej stronie, 139 00:07:06,620 --> 00:07:09,620 to uzyskuje dostęp do pola po prawej stronie. 140 00:07:09,620 --> 00:07:14,170 I tak wcześniej mieliśmy tego rodzaju Star mój samochód dot wszystkie rzeczy, 141 00:07:14,170 --> 00:07:15,880 jak było dużo dzieje. 142 00:07:15,880 --> 00:07:22,040 Ale zamiast tego, co możemy zrobić, to this-- mój samochód strzałka roku wynosi 2011. 143 00:07:22,040 --> 00:07:23,580 >> Ponownie, co się tutaj dzieje? 144 00:07:23,580 --> 00:07:25,720 Po pierwsze, jestem dereferencji mój samochód. 145 00:07:25,720 --> 00:07:27,810 Co znowu, jest wskaźnikiem tutaj. 146 00:07:27,810 --> 00:07:31,270 Następnie po dereferencjonowane mój samochód, 147 00:07:31,270 --> 00:07:35,130 Można wtedy uzyskać dostęp do pól roku, płyta, i licznik kilometrów 148 00:07:35,130 --> 00:07:40,020 jak mogłem przed uprzednim Używane gwiazda dereference mojego samochodu, 149 00:07:40,020 --> 00:07:42,020 a dot aby uzyskać dostęp do pola. 150 00:07:42,020 --> 00:07:45,290 Więc możesz mieć struktury, można mogą mieć wskaźniki do struktur, 151 00:07:45,290 --> 00:07:48,360 i masz sposoby na dostęp pola tych struktur, 152 00:07:48,360 --> 00:07:52,600 czy masz wskaźniki do je lub same zmienne. 153 00:07:52,600 --> 00:07:57,640 Dot lub strzałka, w zależności od jak zmienna została zadeklarowana. 154 00:07:57,640 --> 00:08:00,510 Jestem Doug Lloyd, to CS50. 155 00:08:00,510 --> 00:08:01,975