1 00:00:00,000 --> 00:00:03,395 >> [MUZYKI] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 David J. MALAN: To jest jak obecnie studentem pierwszego roku seminarium. 4 00:00:13,280 --> 00:00:14,060 OK. 5 00:00:14,060 --> 00:00:15,024 Tak bardzo deszczowo się. 6 00:00:15,024 --> 00:00:17,690 Prowadzi to się stało w środy, ale bardziej okazja 7 00:00:17,690 --> 00:00:18,700 na pytania dziś. 8 00:00:18,700 --> 00:00:22,210 Zacznijmy więc od rzeczywistości z filmu na chwilę. 9 00:00:22,210 --> 00:00:24,560 Ale zaczniemy wspaniale jak zawsze. 10 00:00:24,560 --> 00:00:28,000 >> Jest CS50, a to jest koniec tygodnia 4. 11 00:00:28,000 --> 00:00:30,820 Więc jeśli kiedykolwiek widziałeś TV lub w którym film 12 00:00:30,820 --> 00:00:34,690 tam niektórzy eksperci komputerowe i policja, ani FBI, lub niektórych agencji 13 00:00:34,690 --> 00:00:36,930 próbuje złapać niektóre przeciwnik, dobrze, masz 14 00:00:36,930 --> 00:00:40,850 Prawdopodobnie słyszałeś wyrażenie "wzmocnienia" przy czym, że technika jakoś 15 00:00:40,850 --> 00:00:44,750 magicznie przybliża nieskończoność daleko, aby zobaczyć przestępców 16 00:00:44,750 --> 00:00:48,640 tożsamości lub numer rejestracyjny nawet w połysku lustrem 17 00:00:48,640 --> 00:00:50,390 lub błysk czyimś oku. 18 00:00:50,390 --> 00:00:55,196 Więc rzeczywiście, rzućmy okiem na kilka takich scen z Hollywood. 19 00:00:55,196 --> 00:00:55,862 [ODTWARZANIE] 20 00:00:55,862 --> 00:00:59,243 -Ok, Teraz przejdźmy dobre spojrzenie na ciebie. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Trzymaj to. 23 00:01:07,415 --> 00:01:08,267 Uruchom że z powrotem. 24 00:01:08,267 --> 00:01:09,121 >> -Poczekaj minutkę. 25 00:01:09,121 --> 00:01:11,300 Idź w prawo. 26 00:01:11,300 --> 00:01:12,209 >> -Nie, Zamrażać, że. 27 00:01:12,209 --> 00:01:12,750 -Pełny ekran. 28 00:01:12,750 --> 00:01:13,558 -ok, Zamrażać, że. 29 00:01:13,558 --> 00:01:14,820 -Tighten Się na tym, dobrze? 30 00:01:14,820 --> 00:01:16,530 -vector Się na tym Facet przez tylne koło. 31 00:01:16,530 --> 00:01:19,400 -zoom Się tu, na tym miejscu. 32 00:01:19,400 --> 00:01:22,846 -Z Odpowiedniego sprzętu, zdjęcie może być powiększona i naostrzone. 33 00:01:22,846 --> 00:01:24,065 -Co to? 34 00:01:24,065 --> 00:01:25,600 -To Program poprawy. 35 00:01:25,600 --> 00:01:26,860 -Możesz Jasne, że się jakieś? 36 00:01:26,860 --> 00:01:27,890 -Nie Wiem. 37 00:01:27,890 --> 00:01:29,050 Miejmy poprawić go. 38 00:01:29,050 --> 00:01:31,575 >> -Enhance A6 sekcja. 39 00:01:31,575 --> 00:01:33,642 >> -I Wzmocnione szczegół, and-- Myślę, że 40 00:01:33,642 --> 00:01:35,433 wystarczy, aby zwiększyć, zwolnić go do mojego ekranu. 41 00:01:35,433 --> 00:01:37,080 -I Wzmocnione odbicie w oku. 42 00:01:37,080 --> 00:01:38,830 >> -Niech To uruchomić to przez Funkcje poprawy obrazu. 43 00:01:38,830 --> 00:01:40,100 -Edgar Można poprawić to? 44 00:01:40,100 --> 00:01:41,875 >> -Wytrzymać. 45 00:01:41,875 --> 00:01:44,010 >> -I've Pracuje w tej refleksji. 46 00:01:44,010 --> 00:01:44,995 >> Odbicie -Someone jest. 47 00:01:44,995 --> 00:01:45,495 -Reflection. 48 00:01:45,495 --> 00:01:47,399 -Jest Odbiciem twarzy mężczyzny. 49 00:01:47,399 --> 00:01:48,065 -The Refleksji. 50 00:01:48,065 --> 00:01:48,981 -Jest Odbiciem. 51 00:01:48,981 --> 00:01:50,600 -zoom Się na lustrze. 52 00:01:50,600 --> 00:01:52,712 -Można Zobaczyć odbicie. 53 00:01:52,712 --> 00:01:54,350 -Czy Można poprawić wizerunek stąd? 54 00:01:54,350 --> 00:01:55,370 -Czy Można zwiększyć go tutaj? 55 00:01:55,370 --> 00:01:56,210 -Czy Można zwiększyć go? 56 00:01:56,210 --> 00:01:56,900 Można zwiększyć go? 57 00:01:56,900 --> 00:01:57,870 >> -Czy Możemy poprawić to? 58 00:01:57,870 --> 00:01:58,717 >> -Czy Można zwiększyć go? 59 00:01:58,717 --> 00:02:00,050 -Hold Na sekundę, ja poprawić. 60 00:02:00,050 --> 00:02:00,924 -zoom Się do drzwi. 61 00:02:00,924 --> 00:02:01,700 -Times 10. 62 00:02:01,700 --> 00:02:02,586 -zoom. 63 00:02:02,586 --> 00:02:03,490 Przesuwanie znaczników w. 64 00:02:03,490 --> 00:02:03,990 -Jeszcze. 65 00:02:03,990 --> 00:02:04,690 -wait, Stop. 66 00:02:04,690 --> 00:02:05,190 Przestań. 67 00:02:05,190 --> 00:02:05,970 -Pause Go. 68 00:02:05,970 --> 00:02:09,460 -Rotate Nam 75 stopni wokół pionu, proszę. 69 00:02:09,460 --> 00:02:10,962 Przestań. 70 00:02:10,962 --> 00:02:14,040 Wróć do strony o drzwi, znowu. 71 00:02:14,040 --> 00:02:15,860 >> -Got Jest wzmacniacz obrazu, który może bitmapy? 72 00:02:15,860 --> 00:02:18,776 >> Hej, może uda nam się skorzystać z Pradeep Metoda Sen zobaczyć w okna. 73 00:02:18,776 --> 00:02:20,372 -To Oprogramowanie jest stan wiedzy. 74 00:02:20,372 --> 00:02:21,845 >> -The Wartość własna jest wyłączony. 75 00:02:21,845 --> 00:02:24,300 >> -Z Prawa Połączenie algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> -Jest Podjęta likwidacja algorytmy do następnego poziomu, 77 00:02:26,755 --> 00:02:28,730 i mogę ich używać do zwiększenia zdjecia. 78 00:02:28,730 --> 00:02:31,286 >> -lock Się i powiększyć osi. 79 00:02:31,286 --> 00:02:32,560 >> -Enhance. 80 00:02:32,560 --> 00:02:33,100 >> -Enhance. 81 00:02:33,100 --> 00:02:33,600 >> -Enhance. 82 00:02:33,600 --> 00:02:34,960 -Freeze I wzmocnić. 83 00:02:34,960 --> 00:02:37,180 >> [Zakończyć odtwarzanie] 84 00:02:37,180 --> 00:02:41,160 >> David J. MALAN: Dobrze, więc wszystkie z nich są rzeczywiście słowa. 85 00:02:41,160 --> 00:02:44,450 Oni po prostu nawleczone razem w sposób, że nie jest to faktycznie sensowne. 86 00:02:44,450 --> 00:02:48,400 I, w rzeczywistości, CS50 i kursy podoba ma tendencję do ruiny wiele TV i filmów 87 00:02:48,400 --> 00:02:48,900 dla Ciebie. 88 00:02:48,900 --> 00:02:52,330 Bo kiedy tych ekspertów komputerowych są wyliczać terminy i mówiąc 89 00:02:52,330 --> 00:02:56,860 fantazyjne rzeczy jak wektory własne, a oś z, 90 00:02:56,860 --> 00:02:59,572 i wielu innych rzeczywiście warunki bardziej techniczne, 91 00:02:59,572 --> 00:03:02,030 oni naprawdę tylko sznurka słowa razem zbyt często. 92 00:03:02,030 --> 00:03:05,020 Jest to, że jedna z naszych nadziei jest to, że, jako efekt uboczny kursów inwentaryzacyjne 93 00:03:05,020 --> 00:03:08,245 takie jak ten, będzie więcej ludzi w Świat rzeczywiście być w stanie zważyć 94 00:03:08,245 --> 00:03:12,040 i po prostu bardzo nieznacznie wpływać na Jakość i dokładność tych filmów? 95 00:03:12,040 --> 00:03:14,350 >> W rzeczywistości, rzućmy okiem na rzeczywistość. 96 00:03:14,350 --> 00:03:18,070 Więc tutaj jest zdjęcie pracownicy Maryjo, jeden z naszych kolegów nauczania. 97 00:03:18,070 --> 00:03:20,050 I przypuszczam, że jest podejrzany o czymś. 98 00:03:20,050 --> 00:03:23,730 A jednak istnieje promyk niektóre z dowodów w oku, 99 00:03:23,730 --> 00:03:25,480 lub w odbicie jej okularów. 100 00:03:25,480 --> 00:03:30,760 Cóż, jeśli robimy dokładnie tak, jak na filmach Proponuję, w którym możemy powiększać i "poprawić", 101 00:03:30,760 --> 00:03:34,080 jest to, jak wiele informacji w twarz Maryi 102 00:03:34,080 --> 00:03:36,795 podczas robienia zdjęcia z tej oryginalnej rozdzielczości. 103 00:03:36,795 --> 00:03:39,120 >> I rzeczywiście, można zobaczyć te kropki. 104 00:03:39,120 --> 00:03:41,900 I to są, jakie są zwane pikseli, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 która jest tylko plac zwykle to jest punkt, który tworzy obraz. 106 00:03:45,740 --> 00:03:49,200 I z powrotem w dzień, a właściwie nawet dziś niektóre z dzisiejszych telewizorów LED 107 00:03:49,200 --> 00:03:51,950 Telewizory LCD lub, jeśli masz jeden w swoim pokoju lub w domu, 108 00:03:51,950 --> 00:03:55,100 jeśli go się bardzo blisko niej, a zwłaszcza jeśli jest to nieco starszy telewizor, 109 00:03:55,100 --> 00:03:58,760 prawdopodobnie można nawet zobaczyć te kropki i to, co tworzą zdjęcie. 110 00:03:58,760 --> 00:04:00,980 >> I nie ma więcej informacje niż to. 111 00:04:00,980 --> 00:04:05,400 Moglibyśmy "poprawić", w tym sensie, wygładzanie rzeczy nad i rodzaj 112 00:04:05,400 --> 00:04:09,040 wywodząc rodzaju, jakby co Kolor powinien być obok oka Maryi 113 00:04:09,040 --> 00:04:10,910 tak, że nie jest w rzeczywistości tak piksele. 114 00:04:10,910 --> 00:04:14,510 Ale jeśli Ciągle powiększanie, nie jest złym facetem w jej oku. 115 00:04:14,510 --> 00:04:16,600 Jak to wszystko Informacje mamy. 116 00:04:16,600 --> 00:04:18,920 Nie można tworzyć Informacje z niczego. 117 00:04:18,920 --> 00:04:20,790 Jest tylko skończony Liczba bitów tam. 118 00:04:20,790 --> 00:04:22,873 >> Więc Problem Set 4, gdzie masz okazję 119 00:04:22,873 --> 00:04:24,580 bawić się z tego rodzaju świata. 120 00:04:24,580 --> 00:04:27,610 W Problem Set 4, będziesz odkrywać świat grafiki i kryminalistyki, 121 00:04:27,610 --> 00:04:30,870 i rzeczywiście napisać kod które odzyskuje utracone obrazy. 122 00:04:30,870 --> 00:04:33,510 Musisz napisać kod, który manipuluje istniejących obrazów 123 00:04:33,510 --> 00:04:36,120 i ostatecznie zrozumieć, co jest dzieje się pod maską. 124 00:04:36,120 --> 00:04:38,540 >> I, jak się okazuje, to faktycznie Nie wszystko, co skomplikowane. 125 00:04:38,540 --> 00:04:41,320 Na przykład, jeśli chcemy stanowią buźkę gdzie 126 00:04:41,320 --> 00:04:44,160 z tych czarnych pikseli, czy te czarne kropki, 127 00:04:44,160 --> 00:04:47,230 Cóż, może po prostu reprezentują je jako naprawdę bitmapy. 128 00:04:47,230 --> 00:04:50,040 A jeśli nie słyszał, że bitmapy wyraz, być może 129 00:04:50,040 --> 00:04:52,330 teraz zaczyna się zrobić trochę więcej sensu dzisiaj. 130 00:04:52,330 --> 00:04:53,580 >> Wiemy już, co nieco jest. 131 00:04:53,580 --> 00:04:54,160 To jest 0 lub 1. 132 00:04:54,160 --> 00:04:56,201 A mapa jest po prostu coś, jak kawałek papieru 133 00:04:56,201 --> 00:04:59,180 który daje wskazówki i ma Może siatki xiy współrzędne. 134 00:04:59,180 --> 00:05:00,540 Więc o to bitmapy. 135 00:05:00,540 --> 00:05:03,680 Jest to mapa bitów przy czym 1 jest wyraźnie 136 00:05:03,680 --> 00:05:07,857 będzie reprezentować biały piksel, a 0 zamierza reprezentować czarny piksel. 137 00:05:07,857 --> 00:05:09,440 Ale czy na pewno obrócić go wokół. 138 00:05:09,440 --> 00:05:11,648 To naprawdę nie ma znaczenia, tak długo, jak jesteśmy konsekwentni. 139 00:05:11,648 --> 00:05:15,570 A oto, jak w binary-- wewnątrz z pamięci komputera, a nawet wewnątrz 140 00:05:15,570 --> 00:05:18,160 pliku na dysku twardym drive-- można przechowywać 141 00:05:18,160 --> 00:05:20,240 najprostszych emotikon twarz. 142 00:05:20,240 --> 00:05:23,990 Ale co mamy, oczywiście, brakuje na tym zdjęciu? 143 00:05:23,990 --> 00:05:24,610 Kolor, prawda? 144 00:05:24,610 --> 00:05:28,220 Jest to oczywiste, następnym krokiem lub poprawa poprawić to z koloru. 145 00:05:28,220 --> 00:05:32,230 Tak niestety się tylko jeden bit 0 lub 1, można było stanowią kolor. 146 00:05:32,230 --> 00:05:36,100 To może być czerwony lub niebieski, lub czarne lub białe, lub zielony lub różowy, 147 00:05:36,100 --> 00:05:37,420 lub jakiekolwiek pary kolorów. 148 00:05:37,420 --> 00:05:40,860 Ale dla uproszczenia, będziemy po prostu założyć, czarny i biały. 149 00:05:40,860 --> 00:05:45,930 >> Więc co trzeba zrobić, logicznie, jeśli chcą wprowadzić kolor na zdjęciu? 150 00:05:45,930 --> 00:05:49,080 Co mamy robić? 151 00:05:49,080 --> 00:05:51,900 Podobnie jak w przypadku czynnikiem ograniczającym tutaj jest to, że za pomocą jednego bitu można tylko 152 00:05:51,900 --> 00:05:55,977 stanowią dwa stany 0 lub 1, biały lub czarnym, co chcesz zrobić? 153 00:05:55,977 --> 00:05:56,810 Publiczność: Więcej danych. 154 00:05:56,810 --> 00:05:58,813 David J. MALAN: Więcej bity, yeah więcej danych, więcej bitów. 155 00:05:58,813 --> 00:06:01,440 I rzeczywiście, to jest dokładnie, jak kolorowe obrazy są reprezentowane. 156 00:06:01,440 --> 00:06:05,120 Zamiast używać jednego bitowe 0 lub 1 dla każdego piksela, każda kropka, 157 00:06:05,120 --> 00:06:06,170 po prostu korzystać z wielu. 158 00:06:06,170 --> 00:06:09,660 Może używać 8, być może, bardziej używać 24, i rzeczywiście, w Problem Set 159 00:06:09,660 --> 00:06:13,300 4, można grać z pliku format, który wykorzystuje 24 bity zwykle. 160 00:06:13,300 --> 00:06:15,430 >> Ale większość z was pewnie zaznajomieni z plików JPEG. 161 00:06:15,430 --> 00:06:17,460 Jeśli kiedykolwiek podjęte zdjęcie w telefonie, 162 00:06:17,460 --> 00:06:20,360 lub przesłane lub widział coś na Facebook lub Flickr, dowolna liczba 163 00:06:20,360 --> 00:06:24,882 stron internetowych opartych na fotografii, masz prawdopodobnie widział obrazu JPEG wcześniej. 164 00:06:24,882 --> 00:06:27,840 I jak się okazuje, jest to plik Format będziemy używać w pset 4, 165 00:06:27,840 --> 00:06:30,340 w którym masz zamiar muszą odzyskać zdjęcia 166 00:06:30,340 --> 00:06:35,160 że przypadkowo usunięte z uszkodzona karta pamięci w aparacie, 167 00:06:35,160 --> 00:06:35,800 Jeśli będziesz. 168 00:06:35,800 --> 00:06:38,490 >> I okazuje się, że nawet JPEG jest dość sophisticated-- 169 00:06:38,490 --> 00:06:40,906 jest to o wiele bardziej wyrafinowane niż czarno-białe kropki 170 00:06:40,906 --> 00:06:44,480 widzieliśmy przed chwilą, bo nie ma Algorytmy naprawdę fantazyjne, że 171 00:06:44,480 --> 00:06:47,410 są wykorzystywane do kompresji JPEG, więc że można mieć naprawdę ładne, 172 00:06:47,410 --> 00:06:49,832 jakość obrazu, ale przy użyciu stosunkowo niewiele bitów. 173 00:06:49,832 --> 00:06:51,790 I wrócimy do kompresji niebawem. 174 00:06:51,790 --> 00:06:56,280 Okazuje się, że pierwszy trzy bajty w image-- JPEG 175 00:06:56,280 --> 00:07:02,750 bez względu na to, co już zrobione zdjęcie of-- są wartości 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> Innymi słowy, jeśli tylko zobaczyć, że wzorzec bitów, 177 00:07:05,990 --> 00:07:09,180 reprezentowane tu trzy bajtów, czyli w sumie 24 bity, 178 00:07:09,180 --> 00:07:13,810 z dużym prawdopodobieństwem można wywnioskować, że patrzysz na niego to pierwsze trzy 179 00:07:13,810 --> 00:07:15,230 bajtów w formacie JPEG. 180 00:07:15,230 --> 00:07:18,040 I to jest to, co jest znane jak podpisania JPEG. 181 00:07:18,040 --> 00:07:20,540 Wiele formatów plików tam mają tendencję do początku 182 00:07:20,540 --> 00:07:23,735 pewne wzory 0 i 1, tak, że Windows i Mac OS i iOS, 183 00:07:23,735 --> 00:07:28,272 i Android wiedzieć, jaki rodzaj pliku, że są, oprócz tzw pliku 184 00:07:28,272 --> 00:07:29,730 Rozszerzenie, że wiele plików. 185 00:07:29,730 --> 00:07:32,590 Jeśli .jpg, to kolejny trop do komputera. 186 00:07:32,590 --> 00:07:35,310 >> Więc niech teraz popatrz na to trochę bardziej technicznie. 187 00:07:35,310 --> 00:07:37,390 Wiemy, że po przecinku System jest od 0 do 9. 188 00:07:37,390 --> 00:07:38,740 Wiemy binarny jest 0 i 1. 189 00:07:38,740 --> 00:07:41,842 A jeśli uważasz, że powrót do pset 0, musieliśmy zmagać się z, 190 00:07:41,842 --> 00:07:43,800 na trochę, coś nazywa szesnastkowy, 191 00:07:43,800 --> 00:07:47,320 gdzie masz 16 cyfr, zamiast 10 lub zamiast 2. 192 00:07:47,320 --> 00:07:50,405 A te cyfry, zgodnie z konwencją, wynosi od 0 do 9, a następnie 193 00:07:50,405 --> 00:07:55,040 do f, gdzie f reprezentuje co liczba dziesiętna, podobnie jak szybkie rozsądek 194 00:07:55,040 --> 00:07:56,640 sprawdzić? 195 00:07:56,640 --> 00:07:57,610 Tak więc, 15. 196 00:07:57,610 --> 00:08:01,390 I musi reprezentować 10, po prostu charakter zamówienia, że ​​dałem. 197 00:08:01,390 --> 00:08:04,350 To tylko arbitralna konwencja, ale to dość standardowe. 198 00:08:04,350 --> 00:08:06,870 >> Więc jeśli spojrzymy na ten wzór trzech bytes-- niech 199 00:08:06,870 --> 00:08:09,620 po prostu zacząć patrzeć na to w sposób zgodny z tym, jak 200 00:08:09,620 --> 00:08:12,450 naukowcy generalnie komputerowe patrzeć i myśleć o plikach. 201 00:08:12,450 --> 00:08:15,580 Można oczywiście myśleć o Pliki w 0s i 1s, i po przecinku, 202 00:08:15,580 --> 00:08:19,340 ale w rzeczywistości, mamy tendencję do uruchomienia program lub częściej hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 z powrotem z pset 0. 204 00:08:20,760 --> 00:08:25,857 Więc pozwól mi zaproponować, 255, 216 i 255 są tylko te wzorce 0 i 1. 205 00:08:25,857 --> 00:08:28,440 I można to sprawdzić, jeśli chcesz zrobić matematyki od tygodnia 0. 206 00:08:28,440 --> 00:08:30,810 Ale teraz, po prostu założyć, że jest to rzeczywiście prawidłowe. 207 00:08:30,810 --> 00:08:33,850 Właśnie przepisany trzy po przecinku numery jak trzech wartości binarnych. 208 00:08:33,850 --> 00:08:36,100 Teraz to, co mam zamiar zrobić, to wystarczy dodać spacje, 209 00:08:36,100 --> 00:08:37,266 właśnie ze względu na czytelność jest. 210 00:08:37,266 --> 00:08:39,940 Oraz informacja, jestem po prostu przenieść rzeczy od siebie. 211 00:08:39,940 --> 00:08:43,090 Tak więc przed, po, przed, po. 212 00:08:43,090 --> 00:08:46,180 Robię nic ciekawego inne niż tylko rozprzestrzeniania rzeczy tak 213 00:08:46,180 --> 00:08:50,380 że zawiadomienie każdy zestaw ośmiu Bity jest dwa zestawy czterech bitów. 214 00:08:50,380 --> 00:08:54,920 Jest to przydatne, ponieważ szesnastkowym Szczególnie modne 215 00:08:54,920 --> 00:09:00,930 ponieważ każdy szesnastkowy 0 do f, a dokładniej od 0 do 15, 216 00:09:00,930 --> 00:09:03,430 można przedstawić z dokładnie czterech bitów. 217 00:09:03,430 --> 00:09:07,960 Innymi słowy, w systemie szesnastkowym, jeśli Ciebie chcą reprezentować 0, to tylko 0000, 218 00:09:07,960 --> 00:09:08,780 cztery zera. 219 00:09:08,780 --> 00:09:13,997 A jeśli chcesz do reprezentowania 15, to 1111, które to cztery bity. 220 00:09:13,997 --> 00:09:16,080 A jeśli nie matematyka, jeśli jest to miejsce, te, 221 00:09:16,080 --> 00:09:18,210 jest to miejsce, 16s, że zamierza dać you-- 222 00:09:18,210 --> 00:09:19,960 raczej, że będzie to-- przykro, binarnie, 223 00:09:19,960 --> 00:09:23,660 że zamierza dać 15, te miejsce, Dwójki miejsce, czwórki i ósemki miejsce. 224 00:09:23,660 --> 00:09:26,821 Więc pozwól mi zaproponować, że Zestaw czterech bitów w lewo 225 00:09:26,821 --> 00:09:28,070 jest to, co mamy zamiar zadzwonić f. 226 00:09:28,070 --> 00:09:30,110 To największa liczba ty może reprezentować cztery bity. 227 00:09:30,110 --> 00:09:33,300 I już wiemy z szesnastkowy, f jest największą cyfrą w systemie szesnastkowym. 228 00:09:33,300 --> 00:09:36,020 Mamy kolejną f istnieje, dwa więcej tam. 229 00:09:36,020 --> 00:09:38,980 A teraz, po prostu wziąć na wiarę że zrobiłem prawo matematyczne 230 00:09:38,980 --> 00:09:41,890 i że lewa połowa z tych bitów, 1101, 231 00:09:41,890 --> 00:09:43,980 to samo jak d, w zapisie szesnastkowym. 232 00:09:43,980 --> 00:09:46,490 I prawa ręka, 1000, znajduje się zaledwie 8. 233 00:09:46,490 --> 00:09:48,140 >> I że łatwo zrozumieć, prawda? 234 00:09:48,140 --> 00:09:51,670 8 represents-- ma rację ósemki pod tym miejscu. 235 00:09:51,670 --> 00:09:56,040 Mamy więc w kolumnie jeden ósemki i nic w czworakach, dwójkami lub jedynek. 236 00:09:56,040 --> 00:09:59,830 Więc teraz bardziej konwencjonalnie, ludzie mają tendencję pisać cyfry szesnastkowe jak ten, 237 00:09:59,830 --> 00:10:03,000 po prostu squish je razem, i wtedy poprzedzić je 0x. 238 00:10:03,000 --> 00:10:05,920 Oznacza to nic innego, wizualną wskazówkę do human-- 239 00:10:05,920 --> 00:10:10,350 Nadchodzi value-- szesnastkowym, ponieważ to nie może być inaczej oczywiste. 240 00:10:10,350 --> 00:10:13,629 >> To znaczy, ostatecznie, że wzór z zer i jedynek, 241 00:10:13,629 --> 00:10:16,170 lub wzór szesnastkowym cyfry równoważnie, że jesteś 242 00:10:16,170 --> 00:10:18,990 zamiar zacząć szukać Zestaw 4 w Problem jest this-- 243 00:10:18,990 --> 00:10:22,120 i problem Zestaw 4 specyfikacja będzie chodzić Ci przez to bardziej detail-- 244 00:10:22,120 --> 00:10:25,344 ale uświadomić sobie, jak rodzaj tajemnej jako może to wyglądać na pierwszy rzut oka, 245 00:10:25,344 --> 00:10:27,010 masz zamiar rozpocząć widząc to dużo. 246 00:10:27,010 --> 00:10:30,320 A w rzeczywistości, nawet w GDB, debugger wprowadziliśmy w poniedziałek 247 00:10:30,320 --> 00:10:35,440 i Dan wprowadza w pset 3, będzie często pokazać wartości szesnastkowe 248 00:10:35,440 --> 00:10:39,910 tylko dlatego, że są bardziej konwencjonalne niż dziesiętny lub binarny 249 00:10:39,910 --> 00:10:41,157 świecie komputerów. 250 00:10:41,157 --> 00:10:42,490 Teraz umieścić to w kontekście. 251 00:10:42,490 --> 00:10:48,040 Wiele można o tym pamiętać tu zdjęcie, które pochodzi od czego? 252 00:10:48,040 --> 00:10:51,240 Vista, więc nawet wcześniej niż że Windows XP nie to debiut. 253 00:10:51,240 --> 00:10:52,620 Więc to jest piękny krajobraz. 254 00:10:52,620 --> 00:10:55,940 I rzeczywiście, gdy rozglądamy online-- Myślę, że jest to artykuł Wikipedia, 255 00:10:55,940 --> 00:11:00,110 w którym ktoś bardzo niezwykle wyszedł znaleźć to miejsce w świecie skonfigurować 256 00:11:00,110 --> 00:11:02,240 jego lub jej aparat w właśnie prawo place-- 257 00:11:02,240 --> 00:11:06,510 i to dzisiaj wygląda like-- ale jest to dokładnie to samo ustawienie. 258 00:11:06,510 --> 00:11:10,060 Ten obraz, choć znajduje się w pliku Format nazywa bitmapy, b, m, p. 259 00:11:10,060 --> 00:11:12,910 I mamy zamiar zrobić super, Szybki rzut oka na to, co to znaczy. 260 00:11:12,910 --> 00:11:17,770 >> Ale bitmapy jest po prostu inny sposób reprezentujących obrazy wciąż przy pikseli 261 00:11:17,770 --> 00:11:19,580 w 0 i 1, ostatecznie. 262 00:11:19,580 --> 00:11:23,282 Ale w mgnieniu oka, to ma bardziej interesujące podpis 263 00:11:23,282 --> 00:11:24,490 na początku pliku. 264 00:11:24,490 --> 00:11:26,670 To nie tylko trzy bajtów, a nie ma 265 00:11:26,670 --> 00:11:30,770 cała masa wzorców bajtów które mają z góry określone znaczenie. 266 00:11:30,770 --> 00:11:34,490 Na przykład, w czasie pierwszych kilka bajtów bitmapy 267 00:11:34,490 --> 00:11:37,440 będzie rozmiar z Obraz, szerokość obrazu, 268 00:11:37,440 --> 00:11:40,390 wysokość obrazu, tak Przydatne metadanych, jeśli będzie. 269 00:11:40,390 --> 00:11:43,940 Przydatne informacje, że Photoshop lub jakiekolwiek grafiki programowania używasz 270 00:11:43,940 --> 00:11:45,180 może faktycznie zależy. 271 00:11:45,180 --> 00:11:47,170 >> Więc więcej na ten temat w Problem zestaw 4, ale to 272 00:11:47,170 --> 00:11:49,220 tylko powiedzieć, że na koniec dnia 273 00:11:49,220 --> 00:11:52,390 wszystkie formaty plików używałeś dla years-- plików Microsoft Word, 274 00:11:52,390 --> 00:11:55,820 Pliki liczby, Excel, dowolną liczbę formatów plików 275 00:11:55,820 --> 00:11:57,770 które mogą mieć pewne Wiadomo Rozszerzenie pliku 276 00:11:57,770 --> 00:12:00,130 to tylko 0s i 1s pod maską. 277 00:12:00,130 --> 00:12:02,970 A ludzie postanowili co konwencje, 278 00:12:02,970 --> 00:12:08,340 jakie wzorce 0 i 1 stanowią plik Word kontra pliku Excel, 279 00:12:08,340 --> 00:12:10,322 w stosunku do dowolnej liczby innych formatów. 280 00:12:10,322 --> 00:12:12,780 Tak więc w pset 4, będziesz mieć okazja do zabawy z tym. 281 00:12:12,780 --> 00:12:14,405 >> Ale co to znaczy mieć struct. 282 00:12:14,405 --> 00:12:18,012 Właściwie jest to miłe segue teraz w C, który ma tylko kilka 283 00:12:18,012 --> 00:12:20,220 o dodatkowe funkcje, które my nie spojrzał na jeszcze. 284 00:12:20,220 --> 00:12:24,230 Jest to dość mały język i jeden z ładne cechy o C jest struktura. 285 00:12:24,230 --> 00:12:27,300 Na przykład, jeśli Ciebie chciał represent-- niech 286 00:12:27,300 --> 00:12:33,690 że chcesz mieć zmienną, która reprezentuje ucznia w jakimś programie. 287 00:12:33,690 --> 00:12:37,330 Może pisali kurs Program rejestracji lub rdzenia zakupy 288 00:12:37,330 --> 00:12:38,870 Narzędzie, czy coś takiego. 289 00:12:38,870 --> 00:12:42,922 Jakie są kawałki danych związanych do studenta, który przyszedł do głowy? 290 00:12:42,922 --> 00:12:44,880 Jak student reprezentowana jakie wartości? 291 00:12:44,880 --> 00:12:45,732 Tak? 292 00:12:45,732 --> 00:12:46,940 Masz nazwy jako student. 293 00:12:46,940 --> 00:12:48,900 Co jeszcze robi typowy uczeń ma? 294 00:12:48,900 --> 00:12:49,320 >> PUBLICZNOŚCI: [niesłyszalne] 295 00:12:49,320 --> 00:12:50,200 >> David J. MALAN: Tak, przepraszam. 296 00:12:50,200 --> 00:12:50,660 >> PUBLICZNOŚCI: Wiek. 297 00:12:50,660 --> 00:12:52,980 >> David J. MALAN: wieku lub urodziny równoważnie, yep. 298 00:12:52,980 --> 00:12:53,557 Co jeszcze? 299 00:12:53,557 --> 00:12:54,390 PUBLICZNOŚCI: numer ID? 300 00:12:54,390 --> 00:12:57,460 David J. MALAN: Tak numer identyfikacyjny, może numer telefonu, może w akademiku lub dom, 301 00:12:57,460 --> 00:12:58,670 lub na uczelni, czy coś takiego. 302 00:12:58,670 --> 00:13:01,820 Dowolna ilość sztuk danych Może masz na liście kontaktów 303 00:13:01,820 --> 00:13:03,890 jest to, co może zdefiniować studenta. 304 00:13:03,890 --> 00:13:08,490 Więc jeśli chcemy to zrobić, w kodzie, możemy zrobić coś prostego, jak ten. 305 00:13:08,490 --> 00:13:15,670 Możemy mieć program tak, że ma powiedzmy, int main (void). 306 00:13:15,670 --> 00:13:18,920 A jeśli chcę do reprezentowania Student może ja, na przykład, 307 00:13:18,920 --> 00:13:24,330 ciąg o nazwie nazwa dla tego studenta, ciąg zwany akademik dla tego ucznia, 308 00:13:24,330 --> 00:13:26,900 Może int o nazwie ID dla tego studenta. 309 00:13:26,900 --> 00:13:30,840 A ponieważ używam ciąg, I trzeba wrócić i umieścić CS50.h. 310 00:13:30,840 --> 00:13:33,300 Być może będę potrzebował stdio.h. 311 00:13:33,300 --> 00:13:38,190 Więc pozwól mi zapobiegawczo zrobić ci, a ja jestem Zadzwonię do tej student.c teraz 312 00:13:38,190 --> 00:13:40,080 i zapisać to. 313 00:13:40,080 --> 00:13:44,206 >> A teraz może coś zrobić z tych zmiennych. 314 00:13:44,206 --> 00:13:46,830 A my po prostu zamiar napisać że jako komentarz w kodzie pseudo, 315 00:13:46,830 --> 00:13:48,829 bo to nie jest interesujące co robimy teraz. 316 00:13:48,829 --> 00:13:51,242 OK, więc jest to program, który jakoś przechowuje studenta. 317 00:13:51,242 --> 00:13:53,450 Co chcę zrobić, jeśli chcesz zapisać dwóch studentów? 318 00:13:53,450 --> 00:13:55,991 Więc moim pierwszym odruchem będzie wszystko będzie dobrze, zaraz, 319 00:13:55,991 --> 00:14:01,920 jeśli mam innego ucznia dlaczego nie mogę po prostu zrobić nazwa ciąg 2, ciąg akademiku 2, 320 00:14:01,920 --> 00:14:04,190 int ID2. 321 00:14:04,190 --> 00:14:06,540 I zrobiliśmy odszedł na tej drodze przed 322 00:14:06,540 --> 00:14:10,890 i to, co było nasze rozwiązanie do tego, co wydaje się być rodzajem hackish kopiowania pasty 323 00:14:10,890 --> 00:14:11,555 pracy tutaj? 324 00:14:11,555 --> 00:14:12,346 PUBLICZNOŚCI: Tablica. 325 00:14:12,346 --> 00:14:13,830 David J. MALAN: Tak, możemy używać tablicy. 326 00:14:13,830 --> 00:14:15,620 Prawo to bardzo szybko staje się niewydolny. 327 00:14:15,620 --> 00:14:18,453 Musisz rozwiązać dowolnie rozpocząć nazywania tych wszystkich zmiennych. 328 00:14:18,453 --> 00:14:22,190 A ty, człowiek, trzeba zachować utwór, który odpowiada OK NAME2 329 00:14:22,190 --> 00:14:25,060 z dorm2 odpowiada ID2. 330 00:14:25,060 --> 00:14:26,200 To po prostu staje się bałagan. 331 00:14:26,200 --> 00:14:29,350 Więc jest to o wiele łatwiejsze, przypominam ze kilka tygodni temu, 332 00:14:29,350 --> 00:14:34,300 po prostu konieczności zwanych nazwisk smyczkowych a może dać nam trzy z nich. 333 00:14:34,300 --> 00:14:36,940 A potem może mamy akademiki smyczkowe i mają 334 00:14:36,940 --> 00:14:41,900 trzy z nich, albo ze stałą int identyfikatory i mają trzy z nich. 335 00:14:41,900 --> 00:14:45,250 Ale nawet teraz to czuje trochę zaniedbany, w prawo. 336 00:14:45,250 --> 00:14:49,440 Mówimy o studentów i jeszcze Jestem naprawdę mieszka się na niskim poziomie 337 00:14:49,440 --> 00:14:50,470 szczegóły realizacji. 338 00:14:50,470 --> 00:14:52,790 Student jest nazwa i osobowym oraz ID. 339 00:14:52,790 --> 00:14:59,814 >> Dlaczego nie mogę po prostu zadeklarować zmienną nazywa uczeń i nazywają to s. 340 00:14:59,814 --> 00:15:02,230 A jeśli chcę innego ucznia, dlaczego nie po prostu nazwać to t. 341 00:15:02,230 --> 00:15:05,260 Albo jeśli chcę całą masę studentów, dlaczego nie mogę po prostu 342 00:15:05,260 --> 00:15:09,740 że mam całą klasę studentów, i to trzy z nich. 343 00:15:09,740 --> 00:15:12,470 Innymi słowy, dlaczego nie mogę przyjść z mojego własnego typu danych, zwanych 344 00:15:12,470 --> 00:15:15,641 Studentów, wewnątrz którego jest nazwę, to ID, to w akademiku, 345 00:15:15,641 --> 00:15:16,890 jest liczbą innych dziedzinach. 346 00:15:16,890 --> 00:15:19,030 I okazuje się, was może zrobić dokładnie to. 347 00:15:19,030 --> 00:15:21,850 >> Więc C ma tę funkcję o nazwie struktura. 348 00:15:21,850 --> 00:15:24,700 To funkcja język, pozwala nam dokładnie to zrobić. 349 00:15:24,700 --> 00:15:28,370 Mam zamiar iść do przodu i otworzyć structs.h 350 00:15:28,370 --> 00:15:32,299 gdzie jedziemy zobaczyć po definicji studenta. 351 00:15:32,299 --> 00:15:35,215 Okazuje się - a ten jest jeszcze prostsze niż ten z udziałem identyfikator 352 00:15:35,215 --> 00:15:36,080 przed chwilą. 353 00:15:36,080 --> 00:15:39,120 Jeśli chcesz, aby wymyślić Twój domowy typ danych, 354 00:15:39,120 --> 00:15:42,750 a ponadto do int i char i pływać i tych wszystkich innych, które istnieją, 355 00:15:42,750 --> 00:15:45,810 Można to zrobić dosłownie pisania typedef struct, 356 00:15:45,810 --> 00:15:47,880 następnie niektóre nawiasy klamrowe, wewnątrz której 357 00:15:47,880 --> 00:15:51,460 Lista zmiennych, które chcesz skojarzyć z tym nowym niestandardowych danych 358 00:15:51,460 --> 00:15:55,670 wpisz nazwę i jak akademiku, a następnie po nawiasy 359 00:15:55,670 --> 00:15:57,860 podać nazwę do nowego typu danych. 360 00:15:57,860 --> 00:15:59,220 Tak więc, na przykład, student. 361 00:15:59,220 --> 00:16:03,247 >> I co teraz o tym miło jest, że jeśli spojrzymy na odpowiedni kod, 362 00:16:03,247 --> 00:16:05,080 konwencja, pierwszy wszystkim, jest wprowadzenie tego 363 00:16:05,080 --> 00:16:08,230 w pliku o nazwie coś dot h, plik nagłówka, które nie mamy 364 00:16:08,230 --> 00:16:09,780 zaczął używać się zbyt wiele. 365 00:16:09,780 --> 00:16:12,120 Ale mamy zamiar zacząć używając trochę teraz. 366 00:16:12,120 --> 00:16:18,650 I co możemy z tym zrobić, ostatecznie, w tych kilku linii kodu 367 00:16:18,650 --> 00:16:22,130 jest dokładnie to zadeklarować Typ danych, student. 368 00:16:22,130 --> 00:16:23,230 A teraz z niego korzystać. 369 00:16:23,230 --> 00:16:27,274 >> Idę teraz do plik o nazwie structs1.c. 370 00:16:27,274 --> 00:16:29,440 I rzućmy okiem na Kilka cech tutaj. 371 00:16:29,440 --> 00:16:32,250 Więc rzeczy tu jest w większości znane, a my 372 00:16:32,250 --> 00:16:35,040 wrócić do tego, co nie jest zaznajomieni za chwilę. 373 00:16:35,040 --> 00:16:39,880 To oczywiście jest w tym moje własne nagłówek pliku, który jest nowy, jak również, 374 00:16:39,880 --> 00:16:42,580 wyjątkiem pset 3, gdzie, Przypomnijmy, mamy helpers.h. 375 00:16:42,580 --> 00:16:45,150 Więc może przypomnieć #include helpers.h. 376 00:16:45,150 --> 00:16:49,381 >> Dlaczego choć używam cytatów zamiast ostrych nawiasach? 377 00:16:49,381 --> 00:16:50,630 Kiedy mam wybierać między nimi? 378 00:16:50,630 --> 00:16:52,310 Prawie zawsze wydaje mi się, używać ostrych nawiasach. 379 00:16:52,310 --> 00:16:55,040 A potem, nagle na Linia sześć używam cudzysłowów. 380 00:16:55,040 --> 00:16:55,860 Dlaczego może być? 381 00:16:55,860 --> 00:16:56,700 Tak? 382 00:16:56,700 --> 00:16:57,725 >> PUBLICZNOŚCI: [niesłyszalne] 383 00:16:57,725 --> 00:16:59,350 David J. MALAN: To jest rzeczywista, to co? 384 00:16:59,350 --> 00:17:00,559 PUBLICZNOŚCI: To w IDE. 385 00:17:00,559 --> 00:17:02,475 David J. MALAN: Tak, to w moim rzeczywistego IDE. 386 00:17:02,475 --> 00:17:05,690 I nie mieszkają na IDE, ponieważ to tylko narzędzie, które używam. 387 00:17:05,690 --> 00:17:08,119 To w moim prądu katalog, w szczególności. 388 00:17:08,119 --> 00:17:11,647 Więc structs.h jest mój własny plik nie jest zainstalowane w IDE, 389 00:17:11,647 --> 00:17:14,480 w samego systemu operacyjnego, a to w moim bieżącym katalogu. 390 00:17:14,480 --> 00:17:16,910 Tak więc konwencja jest, jeśli chcesz zawierać własny plik nagłówkowy, 391 00:17:16,910 --> 00:17:18,200 po prostu użyć cudzysłowia. 392 00:17:18,200 --> 00:17:23,290 >> Co nazywamy tę rzecz w Linia 8, ogólnie rzecz biorąc? 393 00:17:23,290 --> 00:17:25,200 Co to jest? 394 00:17:25,200 --> 00:17:28,220 coś #define. 395 00:17:28,220 --> 00:17:31,040 Jest to stałe, prawda? 396 00:17:31,040 --> 00:17:33,140 Jeśli chcesz mieć Wartość w programie 397 00:17:33,140 --> 00:17:35,110 że używasz całość kilka razy, to 398 00:17:35,110 --> 00:17:39,330 dobra konwencja czynnik go, zadeklarować, z symbolem krzyżyka 399 00:17:39,330 --> 00:17:43,340 zdefiniować, a następnie, zgodnie z konwencją, w ogóle wielkie litery word-- choć nie jest 400 00:17:43,340 --> 00:17:45,320 bezwzględnie konieczne, ale Konwencja jest człowiekiem 401 00:17:45,320 --> 00:17:47,210 wykorzystać stałe tak, aby wyskoczyć 402 00:17:47,210 --> 00:17:50,380 na ciebie visually-- miejsca i wówczas wartość chcesz być 403 00:17:50,380 --> 00:17:52,250 odpowiednik nazwy tej stałej jest. 404 00:17:52,250 --> 00:17:56,110 Nie średnik, ale po prostu wynika z tego wzoru nie. 405 00:17:56,110 --> 00:17:57,770 >> Więc co mam zrobić w tym konkretnym kodem. 406 00:17:57,770 --> 00:18:00,660 Warto więc przyjrzeć się główny program tutaj. 407 00:18:00,660 --> 00:18:04,080 W linii 12, bo obejmowały structs.h, 408 00:18:04,080 --> 00:18:06,492 Mam teraz magicznie w moim zbycie nowy typ danych. 409 00:18:06,492 --> 00:18:09,200 Nie wystarczy mieć dostęp do int, i char i float, i łańcuch, 410 00:18:09,200 --> 00:18:10,060 i niebieski i inne. 411 00:18:10,060 --> 00:18:12,470 Mam teraz dostęp do typ danych dla studentów. 412 00:18:12,470 --> 00:18:17,740 Tak więc w linii 12, mam połączenie dwóch ideas-- jeden typ danych niestandardowych i dwa, 413 00:18:17,740 --> 00:18:18,940 przy użyciu tablicy. 414 00:18:18,940 --> 00:18:21,700 I tak w tym programie, jeśli Chcę, aby faktycznie wspierać 415 00:18:21,700 --> 00:18:24,320 trzy różne studenci w moim programie, ja 416 00:18:24,320 --> 00:18:30,480 może po prostu powiedzieć mi dać zmienną zwane studentów, z których każda 417 00:18:30,480 --> 00:18:32,970 jest studentów typu, które jest mój niestandardowy typ danych. 418 00:18:32,970 --> 00:18:35,890 A konkretnie, daj mi trzy z nich w moim tablicy. 419 00:18:35,890 --> 00:18:37,750 >> I co teraz mamy zrobić w tym programie? 420 00:18:37,750 --> 00:18:40,670 Tu jest tylko dla pętli iteracji od 0 do 3, bo to 421 00:18:40,670 --> 00:18:42,110 jaka jest wartość studentów jest. 422 00:18:42,110 --> 00:18:44,420 Ja tylko monitowania użytkownika dać mi imię ucznia. 423 00:18:44,420 --> 00:18:48,090 I następnie w linii 17, to mają głównie znany wiersz. 424 00:18:48,090 --> 00:18:50,370 Mamy starego przyjaciela GetString po prawej stronie. 425 00:18:50,370 --> 00:18:52,345 A co kawałek składni jest podobno nowy, 426 00:18:52,345 --> 00:18:55,130 jeśli nigdy nie programować w C przed, i nigdy nie używał konstrukcjom? 427 00:18:55,130 --> 00:18:55,510 Tak? 428 00:18:55,510 --> 00:18:56,417 >> Uczestniczyć: .name. 429 00:18:56,417 --> 00:18:57,500 David J. MALAN: The .name. 430 00:18:57,500 --> 00:19:01,220 Ale to nie jest za dużo skoku, bo teraz studenci wspornik I 431 00:19:01,220 --> 00:19:02,590 daje i-tego ucznia. 432 00:19:02,590 --> 00:19:04,730 A jeśli chcesz nurkować wewnątrz tej struktury 433 00:19:04,730 --> 00:19:09,490 po prostu korzystać z jednego okresu i następnie nazwę zmiennej wewnątrz 434 00:19:09,490 --> 00:19:11,900 lub własność wewnątrz, że chcesz uzyskać dostęp. 435 00:19:11,900 --> 00:19:14,816 Podobnie więc, jeśli to poprosi Użytkownik, daj mi akademika studenta, 436 00:19:14,816 --> 00:19:18,390 Podobnie można zapisać, że ciąg w zmiennej akademiku wewnątrz 437 00:19:18,390 --> 00:19:19,940 tej struktury studentów. 438 00:19:19,940 --> 00:19:21,410 >> A teraz robi się trochę fantazji. 439 00:19:21,410 --> 00:19:24,420 I to będzie wyglądać co być może wielu już wkrótce. 440 00:19:24,420 --> 00:19:27,970 Ale zobaczysz, to o wiele bardziej w pset 4, więc niech po prostu spojrzenie na to teraz. 441 00:19:27,970 --> 00:19:33,364 Okazuje się, że w linii 23 przez 38, co myślisz ja może robić? 442 00:19:33,364 --> 00:19:35,530 I zostały usunięte komentarze do dzisiaj, ale w wersji 443 00:19:35,530 --> 00:19:38,660 kodu online dla odniesienie ma wszystkie komentarze. 444 00:19:38,660 --> 00:19:40,171 Co wydaje mi się, że robi? 445 00:19:40,171 --> 00:19:42,530 >> PUBLICZNOŚCI: Zapisywanie pliku z wszystkich informację, że wprowadzony przez użytkownika. 446 00:19:42,530 --> 00:19:44,530 >> David J. MALAN: Tak, dokładnie, jest to nowy sposób 447 00:19:44,530 --> 00:19:46,370 które widzimy dwa, Inną cechą C, 448 00:19:46,370 --> 00:19:48,700 w którym można tworzyć własne pliki. 449 00:19:48,700 --> 00:19:51,580 Do tej pory, prawie każdy program napisałeś jest bezpaństwowcem. 450 00:19:51,580 --> 00:19:53,334 Tak szybko, jak to się robi z systemem, to jest to. 451 00:19:53,334 --> 00:19:55,000 Nie ma pamięci lub pamięć o nim. 452 00:19:55,000 --> 00:19:56,110 Nie ma plik zapisany. 453 00:19:56,110 --> 00:19:58,120 Ale jeśli nie chcesz zapisać wejście, które ma 454 00:19:58,120 --> 00:20:02,100 stało się, jak w gry lub programu tak, okazuje się, możemy to zrobić. 455 00:20:02,100 --> 00:20:04,360 I zobaczysz, to bardziej w pset 4 oraz w ust. 456 00:20:04,360 --> 00:20:08,661 Ale ta linia 23 zasadniczo tworzy plik o nazwie students.csv. 457 00:20:08,661 --> 00:20:10,160 A może nie widziałem tego wcześniej. 458 00:20:10,160 --> 00:20:14,250 Nawet jeśli nigdy wcześniej nie studiowała CS wcześniej, CSV jest zmienne oddzielone przecinkami. 459 00:20:14,250 --> 00:20:19,000 To jak bardzo biednych wersja pliku Excel, 460 00:20:19,000 --> 00:20:22,270 co oznacza, że ​​może być otwarty w programie Excel i Numbers Apple, 461 00:20:22,270 --> 00:20:23,830 i ma wierszy i kolumn. 462 00:20:23,830 --> 00:20:26,485 Ale to nie jest zastrzeżona Format jak Microsoft czy Apple. 463 00:20:26,485 --> 00:20:29,840 To tylko przecinki oddzielające Wartości, które zobaczymy w tym momencie. 464 00:20:29,840 --> 00:20:31,010 >> I tylko zgadywać. 465 00:20:31,010 --> 00:20:33,480 W linii 23, na samym koniec, mój drugi argument 466 00:20:33,480 --> 00:20:37,700 do tej nowej funkcji o nazwie f otwarta do otwartego pliku jest w. 467 00:20:37,700 --> 00:20:39,430 Co może w oznaczają? 468 00:20:39,430 --> 00:20:40,022 Tak? 469 00:20:40,022 --> 00:20:41,260 >> PUBLICZNOŚCI: Pozwala na zapisywanie do pliku? 470 00:20:41,260 --> 00:20:42,630 >> David J. MALAN: Pozwala można zapisać do pliku. 471 00:20:42,630 --> 00:20:44,810 Więc jest kilka wariantów że możemy podłączyć tutaj. 472 00:20:44,810 --> 00:20:47,184 Ale jeśli chcesz tylko do odczytu plik, że jest na to patrzeć 473 00:20:47,184 --> 00:20:50,010 i przeczytaj go do pamięci, ci wystarczy użyć cytatu "R". 474 00:20:50,010 --> 00:20:53,110 Jeśli chcesz napisać do pliku, należy użyć cytatu "w". 475 00:20:53,110 --> 00:20:55,190 Istnieje również dołączyć i kilka innych rzeczy 476 00:20:55,190 --> 00:20:57,356 jeśli chcesz zmodyfikować istniejące pliki. 477 00:20:57,356 --> 00:21:00,480 Teraz mamy zamiar utrzymać widząc to rzeczą, wtedy wrócimy do linii 24. 478 00:21:00,480 --> 00:21:02,640 NULL, jak się okazuje, jest specjalną wartość, 479 00:21:02,640 --> 00:21:06,070 może zostać zwrócony przez niektórych funkcji jeśli coś poszło wrong-- 480 00:21:06,070 --> 00:21:08,490 Jeśli plik nie istnieje, jeśli już zabraknie pamięci, 481 00:21:08,490 --> 00:21:09,620 lub kilka innych błędów. 482 00:21:09,620 --> 00:21:13,470 Ale teraz, po prostu założyć, że to tylko konwencjonalne sprawdzanie błędów. 483 00:21:13,470 --> 00:21:17,090 Tu, w linii 26, jestem iteracji od 0 do 3 na wszystkich moich uczniów. 484 00:21:17,090 --> 00:21:20,470 I to jest rodzaj sortowania nowej funkcji fprintf, 485 00:21:20,470 --> 00:21:21,460 ale tylko zgadywać. 486 00:21:21,460 --> 00:21:24,370 Jeśli printf jest tylko do wydruku sformatowany ciąg znaków, 487 00:21:24,370 --> 00:21:26,507 co ma na myśli zapewne fprintf? 488 00:21:26,507 --> 00:21:27,590 PUBLICZNOŚCI: Drukuj do pliku. 489 00:21:27,590 --> 00:21:29,290 David J. MALAN: Wydrukuj sformatowany ciąg do pliku. 490 00:21:29,290 --> 00:21:31,180 To właśnie dodatkowe f środkiem jest plik. 491 00:21:31,180 --> 00:21:36,420 A nowy pierwszy argument musi być zmienna, która reprezentuje plik. 492 00:21:36,420 --> 00:21:38,866 Następnie musimy tylko format Ciąg jak printf. 493 00:21:38,866 --> 00:21:40,740 I mimo, że to Składnia jest nowa, to tylko 494 00:21:40,740 --> 00:21:44,610 oznacza podłączyć imię ucznia, plug-in w akademiku, a następnie 495 00:21:44,610 --> 00:21:47,160 z fclose zamknij plik. 496 00:21:47,160 --> 00:21:49,730 A potem lastly-- to nowa i wrócimy do tego 497 00:21:49,730 --> 00:21:53,240 przed long-- Jestem uwalniając uczeń z przyczyn 498 00:21:53,240 --> 00:21:54,860 że stało się ponad nie. 499 00:21:54,860 --> 00:21:56,820 Ale wrócimy do przed long-- 500 00:21:56,820 --> 00:21:59,820 to dlatego, że, jak GetString jest rzeczywiście pracuje pod maską. 501 00:21:59,820 --> 00:22:01,280 >> Więc rzućmy okiem tutaj. 502 00:22:01,280 --> 00:22:04,380 Gdybym wpisz ls w moim katalogu, zauważyć, że nie mam 503 00:22:04,380 --> 00:22:09,360 posiada plik o nazwie students.csv, po prostu nie istnieje, nie istnieje. 504 00:22:09,360 --> 00:22:14,965 Więc jeśli teraz skompilować ten program, aby konstrukcjom-1. / structury-1, 505 00:22:14,965 --> 00:22:20,570 i mam zamiar iść do przodu i wpisz Andi, który mieszka w Berkeley w Yale. 506 00:22:20,570 --> 00:22:26,350 My będziemy mieć Roba, który Mieszka w Thayer te dni. 507 00:22:26,350 --> 00:22:33,760 I niech wymyślić, gdzie jest, jak sądzę, Maria jest w Mather, 508 00:22:33,760 --> 00:22:35,100 gdybym nie pamiętał. 509 00:22:35,100 --> 00:22:36,460 >> Więc nic się nie stało. 510 00:22:36,460 --> 00:22:40,680 Ale jeśli wpisz ls teraz istnieje students.csv. 511 00:22:40,680 --> 00:22:43,080 Idziemy do przodu i otwarta students.csv. 512 00:22:43,080 --> 00:22:46,050 Jest to również bardzo lekki format pliku. 513 00:22:46,050 --> 00:22:49,570 Ale ja po prostu przyjęła konwencję że mam dwa rzędy i kolumny tutaj. 514 00:22:49,570 --> 00:22:52,020 Pierwsza kolumna imiona ludzi. 515 00:22:52,020 --> 00:22:55,740 Druga kolumna jest studenta w akademiku, lub szkoła lub dom, lub cokolwiek. 516 00:22:55,740 --> 00:22:57,900 A teraz mam zapisane to stałe w pliku. 517 00:22:57,900 --> 00:22:59,280 >> Więc to nie jest wszystko, co ciekawe. 518 00:22:59,280 --> 00:23:02,980 Ale to jest tylko odskocznią teraz do bycia w stanie utrzymywać się informacje 519 00:23:02,980 --> 00:23:04,040 na stałe. 520 00:23:04,040 --> 00:23:08,340 Zobaczmy teraz, co jeszcze możemy zrobić z tych i innych funkcji. 521 00:23:08,340 --> 00:23:10,729 Ale po pierwsze, jakieś pytania? 522 00:23:10,729 --> 00:23:12,145 To było dużo, i to szybko. 523 00:23:12,145 --> 00:23:16,131 Ale zobaczysz dużo więcej w pset 4, jak również. 524 00:23:16,131 --> 00:23:16,630 Tak? 525 00:23:16,630 --> 00:23:19,360 >> PUBLICZNOŚCI: Czy istnieje sposób, aby kontynuować dodawanie nazw do tego pliku? 526 00:23:19,360 --> 00:23:19,880 >> David J. MALAN: Dobre pytanie. 527 00:23:19,880 --> 00:23:21,800 Czy istnieje sposób, aby kontynuować dodanie nazwy do tego pliku? 528 00:23:21,800 --> 00:23:22,340 Tak. 529 00:23:22,340 --> 00:23:24,630 I rzeczywiście, gdy kończy się ponownego otwarcia pliku, 530 00:23:24,630 --> 00:23:26,780 należy użyć cytatu koniec cytatu "a" dla append, 531 00:23:26,780 --> 00:23:31,090 które po prostu dodać nową linię, A Nowa linia ponownie i ponownie, dokładnie. 532 00:23:31,090 --> 00:23:32,010 Dobre pytanie. 533 00:23:32,010 --> 00:23:32,950 Inne pytania? 534 00:23:32,950 --> 00:23:33,450 Tak? 535 00:23:33,450 --> 00:23:35,580 PUBLICZNOŚCI: Jeśli prowadził Program ponownie teraz, 536 00:23:35,580 --> 00:23:38,000 to dodajemy nazwisk do pliku lub byłoby otworzyć nowy plik? 537 00:23:38,000 --> 00:23:38,740 >> David J. MALAN: Ach, dobre pytanie. 538 00:23:38,740 --> 00:23:41,448 Jeśli prowadził program ponownie w prawo Teraz, być może wpisany w nowych nazw, 539 00:23:41,448 --> 00:23:44,820 to dodać do pliku lub nadpisać plik? 540 00:23:44,820 --> 00:23:47,420 Ten ostatni, bo jestem nie używając trybie dopisywania. 541 00:23:47,420 --> 00:23:49,930 A ponieważ jestem ślepo otwarcie pliku do zapisu, 542 00:23:49,930 --> 00:23:51,310 to po prostu będzie zastąpić plik. 543 00:23:51,310 --> 00:23:54,570 Więc chciałbym rzeczywiście musisz zrobić, to dołączyć, jeśli chcę, aby faktycznie mają długi termin 544 00:23:54,570 --> 00:23:55,350 w bazie. 545 00:23:55,350 --> 00:23:58,220 >> Teraz CSV jest przydatna, szczerze mówiąc, nawet na jak jeśli jesteś writing-- 546 00:23:58,220 --> 00:24:00,100 a my w końcu zobaczyć później w semestrze 547 00:24:00,100 --> 00:24:01,455 stosujemy pliki CSV do innych celów. 548 00:24:01,455 --> 00:24:04,920 Jeśli chcesz zapisać wszystkich ludzi którzy zarejestrowali jakiegoś zdarzenia, 549 00:24:04,920 --> 00:24:07,420 czy podpisał się za studenta Grupa, czy coś takiego, 550 00:24:07,420 --> 00:24:10,330 zapisywania danych w tego rodzaju format jest super wygodne. 551 00:24:10,330 --> 00:24:12,580 Ponieważ dosłownie, jeśli I były ściągnąć ten plik. 552 00:24:12,580 --> 00:24:14,540 Mógłbym double-- i niech rzeczywiście spróbować 553 00:24:14,540 --> 00:24:16,720 jeśli mam Excel lub numery tutaj. 554 00:24:16,720 --> 00:24:19,130 >> Idę do kliknięcia prawym przyciskiem myszy lub Control mój plik. 555 00:24:19,130 --> 00:24:20,020 Ups. 556 00:24:20,020 --> 00:24:21,830 Kliknij prawym przyciskiem myszy lub klawiszem Control mój plik. 557 00:24:21,830 --> 00:24:24,960 Chodź, moja mysz nie współpracuje. 558 00:24:24,960 --> 00:24:32,694 Download-- Zamierzam pobrać wszystkie pliki tutaj tak 559 00:24:32,694 --> 00:24:33,860 tak więc mogę złapać tego. 560 00:24:33,860 --> 00:24:37,850 I zobaczymy, czy to działa students.csv-- raz pierwszy 561 00:24:37,850 --> 00:24:39,310 Mam aktywowane. 562 00:24:39,310 --> 00:24:41,360 Teraz chcą zobaczyć moje kontakty. 563 00:24:41,360 --> 00:24:44,310 Teraz muszę się zarejestrować. 564 00:24:44,310 --> 00:24:47,620 Zobacz jak łatwo jest używać pliki CSV? 565 00:24:47,620 --> 00:24:50,840 Tak, utrzymać go na bieżąco. 566 00:24:50,840 --> 00:24:52,375 OK, teraz jesteśmy gotowi na klasy. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, co nowego? 569 00:25:00,370 --> 00:25:02,920 OK, blisko. 570 00:25:02,920 --> 00:25:04,750 To było magiczne. 571 00:25:04,750 --> 00:25:07,280 OK, teraz musimy zaktualizować. 572 00:25:07,280 --> 00:25:10,890 I teraz, że zapomniał, co plik początkowo otwarte, 573 00:25:10,890 --> 00:25:13,090 ale co tam A-- idziemy. 574 00:25:13,090 --> 00:25:16,341 OK, więc teraz mamy plik programu Excel. 575 00:25:16,341 --> 00:25:18,290 Dziękuję. 576 00:25:18,290 --> 00:25:20,764 >> OK, więc to, co zrobiłem było łatwe. 577 00:25:20,764 --> 00:25:23,930 Oczywiście, że mogło preinstalowany Excel lub liczb, czy cokolwiek innego programu. 578 00:25:23,930 --> 00:25:25,846 Ale to miłe, ponieważ teraz mogę manipulować 579 00:25:25,846 --> 00:25:28,090 dane w standardowym formacie. 580 00:25:28,090 --> 00:25:30,294 >> Kontekst Więc teraz niech przełączyć na którym skończyliśmy 581 00:25:30,294 --> 00:25:32,710 Ostatnim razem, co było do początku zdjąć kółka. 582 00:25:32,710 --> 00:25:34,543 Ale po pierwsze, nie zrobił zobacz ten wcześniejszy obiad 583 00:25:34,543 --> 00:25:38,150 znowu dzieje się tutaj w Ogniem i Lód w Cambridge, Sitar w New Haven. 584 00:25:38,150 --> 00:25:43,150 Zarejestruj się na stronie internetowej CS50s ASAP CS50 do udziału studentów i pracowników. 585 00:25:43,150 --> 00:25:46,090 >> Więc wzięliśmy kółka się w poniedziałek, jak follows-- 586 00:25:46,090 --> 00:25:49,120 Łańcuch został ogłoszony w Biblioteka CS50s przez jakiś czas. 587 00:25:49,120 --> 00:25:52,650 I to jest dobre, ponieważ pozwala nam mówić o zmiennych jako 588 00:25:52,650 --> 00:25:54,660 kompletne słowa i zdania i więcej. 589 00:25:54,660 --> 00:25:56,710 Ale okazuje się, ciąg nie istnieje. 590 00:25:56,710 --> 00:26:00,200 To jest po prostu synonimem lub pseudonim, że udało nam się stworzyć czegoś, co 591 00:26:00,200 --> 00:26:03,780 w rzeczywistości jest nieco bardziej techniczne zwane char *. 592 00:26:03,780 --> 00:26:07,900 >> I rzeczywiście, widzieliśmy przykład programu w poniedziałek 593 00:26:07,900 --> 00:26:11,200 że nie zachowują się zupełnie jak oczekiwaliśmy. 594 00:26:11,200 --> 00:26:13,630 To był plik, porównać-0. 595 00:26:13,630 --> 00:26:17,910 I przypominam, że porównanie-0, jeśli I ponownie skompilować program z poniedziałku 596 00:26:17,910 --> 00:26:22,670 i uruchomić porównać-0 i wpisać mamę w małymi literami, małymi literami, a mama znowu. 597 00:26:22,670 --> 00:26:25,320 Program nalegał I wpisać różne rzeczy, 598 00:26:25,320 --> 00:26:29,210 chociaż mama, wszystko w małe, jest identyczne wizualnie. 599 00:26:29,210 --> 00:26:31,990 Więc co to krótka odpowiedź dlaczego komputer myśli 600 00:26:31,990 --> 00:26:34,500 te dwa ciągi są różne? 601 00:26:34,500 --> 00:26:35,250 Tak? 602 00:26:35,250 --> 00:26:36,534 >> PUBLICZNOŚCI: [niesłyszalne] 603 00:26:36,534 --> 00:26:37,450 David J. MALAN: Racja. 604 00:26:37,450 --> 00:26:39,600 Tak, mama, po raz pierwszy I wpisz go w, jest bycie 605 00:26:39,600 --> 00:26:42,710 przechowywane gdzieś w moim komputerze Pamięć ale w innej lokalizacji 606 00:26:42,710 --> 00:26:44,690 niż raz drugi mam wpisać mamą. 607 00:26:44,690 --> 00:26:46,580 Teraz to na pewno może być zoptymalizowane. 608 00:26:46,580 --> 00:26:49,205 Komputer może być inteligentny i zrealizować te dwa ciągi, hej, 609 00:26:49,205 --> 00:26:49,954 są one identyczne. 610 00:26:49,954 --> 00:26:51,520 Nie pozwól mi niepotrzebnie go przechowywać. 611 00:26:51,520 --> 00:26:54,229 Ale komputery nie rób tego optymalizacja chyba powiedzieć im. 612 00:26:54,229 --> 00:26:56,061 Tak, domyślnie są one po prostu się skończyć 613 00:26:56,061 --> 00:26:57,670 w dwóch różnych miejscach w pamięci. 614 00:26:57,670 --> 00:27:01,570 I tak, aby być bardziej jasne, kiedy porównaliśmy dwa ciągi, 615 00:27:01,570 --> 00:27:03,950 Pierwszym było nazywane s, drugi został nazwany 616 00:27:03,950 --> 00:27:08,530 t, co konkretnie było mi Porównując tutaj, na linii 13? 617 00:27:08,530 --> 00:27:09,494 Tak. 618 00:27:09,494 --> 00:27:12,390 >> PUBLICZNOŚCI: Jest to miejsce w pamięci że zmienna będzie wskazywać. 619 00:27:12,390 --> 00:27:14,900 >> David J. MALAN: Dokładnie, jestem Porównując miejsce w pamięci 620 00:27:14,900 --> 00:27:16,300 że te zmienne wskazał. 621 00:27:16,300 --> 00:27:20,560 Tak więc konkretnie, jeśli mama w Liczba bajtów 1 i 2, i 3, 622 00:27:20,560 --> 00:27:24,020 i 4-- bo pamiętam ukośnik 0 musi być aż w końcu. 623 00:27:24,020 --> 00:27:29,420 A druga instancja mama, m-o-m, się pod adresem 10, 11, 12 i 13 lat. 624 00:27:29,420 --> 00:27:33,100 Miałem porównanie 1, że adres, że miejsce w pamięci, 625 00:27:33,100 --> 00:27:35,160 wobec 10, który jest Oczywiście nie same. 626 00:27:35,160 --> 00:27:36,260 1 nie jest 10. 627 00:27:36,260 --> 00:27:39,620 >> Więc to jest ładne, w które to całkiem proste. 628 00:27:39,620 --> 00:27:42,870 Ale jest to problematyczne, o ile Nie możemy porównać ciągi. 629 00:27:42,870 --> 00:27:44,930 Więc fundamentally-- i na tym niskim poziomie, 630 00:27:44,930 --> 00:27:47,300 jeśli chcesz do wdrożenia program do porównania 631 00:27:47,300 --> 00:27:50,270 dwa oddzielne słowa, że Filmaster wpisany w zakresie jakości, 632 00:27:50,270 --> 00:27:53,944 oni kolejce char dla char, tylko w sposób ogólny, 633 00:27:53,944 --> 00:27:55,360 co musimy zrobić, widocznie? 634 00:27:55,360 --> 00:27:57,940 Nie wystarczy po prostu spojrzeć na te dwa adresy. 635 00:27:57,940 --> 00:27:58,860 Co trzeba zrobić? 636 00:27:58,860 --> 00:27:59,360 Tak? 637 00:27:59,360 --> 00:28:01,120 >> PUBLICZNOŚCI: iterację string [niesłyszalne]. 638 00:28:01,120 --> 00:28:02,600 >> David J. MALAN: Tak, niech iterację łańcucha. 639 00:28:02,600 --> 00:28:05,808 Użyjmy pętli for, pętli while, lub co jesteś najbardziej komfortowo. 640 00:28:05,808 --> 00:28:08,840 A jeśli mamy dwa ciągi gdzieś w pamięci, spójrzmy na każdego roku 641 00:28:08,840 --> 00:28:11,770 Pierwszy znak, to każdy jest druga charakter, potem trzeci, i czwarty, 642 00:28:11,770 --> 00:28:15,206 i piąty, aż trafiliśmy co Szczególna wartość wartowniczego? 643 00:28:15,206 --> 00:28:16,080 PUBLICZNOŚCI: [niesłyszalne] 644 00:28:16,080 --> 00:28:18,800 David J. MALAN: Tak, odwrotny ukośnik zero, przy której w każdej struny 645 00:28:18,800 --> 00:28:20,100 możemy uznać, że jest to. 646 00:28:20,100 --> 00:28:21,970 Czy możemy dopasować każdy pojedynczy znak? 647 00:28:21,970 --> 00:28:22,990 Jeśli nie, return false. 648 00:28:22,990 --> 00:28:24,770 Jeśli tak, to zwróci true. 649 00:28:24,770 --> 00:28:28,800 I tak to właśnie ta wersja programu porównać-1.c robi. 650 00:28:28,800 --> 00:28:31,677 Jest on identyczny z tym, co spojrzał na poniedziałek, z wyjątkiem, że mam 651 00:28:31,677 --> 00:28:34,760 pozbyć się string-- słowo choć że nie ma impact-- funkcjonalną wszystkich 652 00:28:34,760 --> 00:28:37,450 Robię teraz jest usunięcie niektóre wizualne kółka, 653 00:28:37,450 --> 00:28:40,880 ale aby zobaczyć wyraźnie, że s i t są adresami. 654 00:28:40,880 --> 00:28:43,020 I to właśnie gwiazda, gwiazdka, reprezentuje 655 00:28:43,020 --> 00:28:46,690 Jest to adres, który zwie bardziej technicznie jako wskaźnik. 656 00:28:46,690 --> 00:28:49,880 >> Kiedy więc Oświadczam s na linia 9 i powiedzieć, char * s, 657 00:28:49,880 --> 00:28:52,160 to nie znaczy, daj mi łańcuch. 658 00:28:52,160 --> 00:28:56,360 Oznacza to, że dał mi zmienną, której celem w życiu jest, aby zapisać adres. 659 00:28:56,360 --> 00:29:00,400 Ponieważ mam zamiar umieścić adres ciąg do niego. 660 00:29:00,400 --> 00:29:03,500 I rzeczywiście, GetString, być jasne, nie zwraca ciąg. 661 00:29:03,500 --> 00:29:06,110 To nie wraca mama backslash zero, per se. 662 00:29:06,110 --> 00:29:10,005 Co getString specjalnie i precyzyjnie wrócić? 663 00:29:10,005 --> 00:29:10,880 PUBLICZNOŚCI: [niesłyszalne] 664 00:29:10,880 --> 00:29:14,080 David J. MALAN: adresu, adres pierwszego znaku 665 00:29:14,080 --> 00:29:16,070 w pewien ciąg ma to zdobyć. 666 00:29:16,070 --> 00:29:19,250 A więc teraz widzimy Hasło specjalny ponownie. 667 00:29:19,250 --> 00:29:20,640 A, wspomniałem o tym wcześniej. 668 00:29:20,640 --> 00:29:23,620 To będzie dobry konwencji że zobaczymy znowu i znowu teraz. 669 00:29:23,620 --> 00:29:27,540 Sprawdzam, aby upewnić się, że s nie jest nieważna i t nie jest null. 670 00:29:27,540 --> 00:29:30,100 Ponieważ opiera się na mojej naprawdę szybkie wzmianka wcześniej, 671 00:29:30,100 --> 00:29:35,510 co może oznaczać, jeśli nie zwraca GetString adres ale N-U-L-L, który jest ponownie 672 00:29:35,510 --> 00:29:36,990 jakaś specjalna wartość? 673 00:29:36,990 --> 00:29:37,890 >> PUBLICZNOŚCI: Błąd. 674 00:29:37,890 --> 00:29:38,600 >> David J. MALAN: To błąd. 675 00:29:38,600 --> 00:29:39,550 Coś poszło nie tak. 676 00:29:39,550 --> 00:29:41,341 A co zwykle może się zdarzyć, zwłaszcza 677 00:29:41,341 --> 00:29:45,162 z strings-- co może być o nieznanej długości w advance-- 678 00:29:45,162 --> 00:29:46,870 być może komputery " z pamięci, może 679 00:29:46,870 --> 00:29:49,280 wpisany w taki długie słowo lub zdanie 680 00:29:49,280 --> 00:29:51,880 lub wklejone tak ogromny esej jest po prostu mało pamięci. 681 00:29:51,880 --> 00:29:55,340 I tak GetString nie mogą wrócić adres całej sprawy, 682 00:29:55,340 --> 00:29:56,620 tak, to po prostu nic nie zwraca. 683 00:29:56,620 --> 00:30:00,580 I to mówi błąd działo się zwracając szczególną wartość NULL. 684 00:30:00,580 --> 00:30:02,890 Jest to adres zera, że ​​tak powiem. 685 00:30:02,890 --> 00:30:06,157 >> Teraz okazuje się, C pochodzi z Funkcja, która robi to iteracji. 686 00:30:06,157 --> 00:30:09,240 Nie mamy do wykonania to z pętli for lub while siebie. 687 00:30:09,240 --> 00:30:11,150 Możemy użyć funkcji, nazywa zwięźle, 688 00:30:11,150 --> 00:30:15,400 wymieszać komp, lub ciąg porównanie, którego celem w życiu jest zrobić dokładnie to. 689 00:30:15,400 --> 00:30:19,990 Dajesz mu dwa wskaźniki, dwa adresy, i przejdzie do tych adresów 690 00:30:19,990 --> 00:30:23,130 a następnie porównać nas na List do listu do jakości, 691 00:30:23,130 --> 00:30:26,610 zatrzymując się tylko wtedy, gdy to, co jest prawdą? 692 00:30:26,610 --> 00:30:31,540 Gdy intuicyjnie powinien mieszać comp przestają iteracji, żeby była jasność? 693 00:30:31,540 --> 00:30:35,400 Gdy natrafi ukośnik 0 w obu ciąg, w którym momencie może zdecydować, 694 00:30:35,400 --> 00:30:38,910 ma wszystko dopasowane, lub Czy nastąpiła rozbieżność? 695 00:30:38,910 --> 00:30:42,740 >> Tak więc, jeśli prowadzimy tego teraz i spróbować nasza gra trochę kapitalizacji, 696 00:30:42,740 --> 00:30:49,260 tak, aby porównać-1, ./compare-1 i wpisz mama małymi literami zarówno razy. 697 00:30:49,260 --> 00:30:50,560 Teraz to samo. 698 00:30:50,560 --> 00:30:54,080 A jeśli zrobię to ponownie małe litery, a następnie być może wielkie litery. 699 00:30:54,080 --> 00:30:56,720 Teraz rzeczywiście odróżnia między górną i małe litery. 700 00:30:56,720 --> 00:31:00,440 Więc nie takie trudne lub magiczne, ale nie teraz wyjaśnić 701 00:31:00,440 --> 00:31:03,140 co dzieje się pod maską. 702 00:31:03,140 --> 00:31:07,640 >> Więc co więcej możemy wyodrębnić z takiej lekcji? 703 00:31:07,640 --> 00:31:08,980 Warto więc spojrzeć na to. 704 00:31:08,980 --> 00:31:15,380 Mam zamiar iść dalej i napisać szybkie Program tutaj nazywa kopiowaniem 0. 705 00:31:15,380 --> 00:31:21,594 A teraz idź i właściwie zróbmy this-- z kopią-0, 706 00:31:21,594 --> 00:31:23,010 spójrz na to, co mam tutaj. 707 00:31:23,010 --> 00:31:24,712 Pierwszy raz poinformować użytkownika, coś powiedzieć. 708 00:31:24,712 --> 00:31:26,420 Wtedy otrzymasz string i przechowywać go w s. 709 00:31:26,420 --> 00:31:29,810 Następnie sprawdź, czy s równa równa NULL, po prostu zwraca 1. 710 00:31:29,810 --> 00:31:31,590 Więc jest to tylko standardowe sprawdzanie błędów. 711 00:31:31,590 --> 00:31:33,112 Nic ciekawego się nie stało. 712 00:31:33,112 --> 00:31:36,320 I rzeczywiście, jeśli mamy pozbyć się błędu sprawdzanie, to wygląda jak kod tygodnie 1 713 00:31:36,320 --> 00:31:36,985 w tym momencie. 714 00:31:36,985 --> 00:31:39,110 Ale zacząłem się dostać trochę lepiej o tym. 715 00:31:39,110 --> 00:31:43,340 >> Teraz w linii 16, tydzień temu, może dni lub nawet parę minut temu, 716 00:31:43,340 --> 00:31:46,720 można powiedzieć, linia 16 jest tworzenie zmiennej o nazwie t 717 00:31:46,720 --> 00:31:48,219 i kopiowanie s do niego. 718 00:31:48,219 --> 00:31:50,010 I to jest doskonale rozsądne wynos. 719 00:31:50,010 --> 00:31:51,560 Ale teraz bardziej precyzyjne. 720 00:31:51,560 --> 00:31:54,190 Co się dzieje w linii 16? 721 00:31:54,190 --> 00:31:56,170 Co jest uzyskiwanie skopiowane od prawej do lewej? 722 00:31:56,170 --> 00:31:56,669 Tak? 723 00:31:56,669 --> 00:31:58,490 PUBLICZNOŚCI: Czy t uzyskanie adresu s? 724 00:31:58,490 --> 00:32:01,220 >> David J. MALAN: Dokładnie, t jest coraz adres s. 725 00:32:01,220 --> 00:32:05,170 Więc być jasne, teraz, gdy odejdę z powrotem do tego wcześniejszego przykładu 726 00:32:05,170 --> 00:32:08,520 a ja wyciągnąć coś mam wpisane w. 727 00:32:08,520 --> 00:32:11,640 I co mam wpisane in-- oto s, a tu 728 00:32:11,640 --> 00:32:15,830 jest to, co mam wpisane w gdzieś w Pamięć, mama, a następnie ukośnik 729 00:32:15,830 --> 00:32:17,840 0, który jest dodawany do mnie. 730 00:32:17,840 --> 00:32:23,060 Co ja przechowywane w tu przypomnieć, to jest w pozycji 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 jest to, co jest obecnie w s. 732 00:32:24,655 --> 00:32:29,220 Więc jeśli na linii 16, mówię daj mi innej zmiennej o nazwie t i sklep 733 00:32:29,220 --> 00:32:33,590 się na wartość S, co zostanie zapisane tutaj nie będzie mamą 734 00:32:33,590 --> 00:32:35,480 ale raczej jest to numer 1. 735 00:32:35,480 --> 00:32:38,520 >> Więc jeśli spojrzymy w przyszłość w tym programie Teraz, to co się stanie? 736 00:32:38,520 --> 00:32:40,690 Tak więc zauważyć, że istnieje funkcja ta może po 737 00:32:40,690 --> 00:32:44,410 Korzystaliśmy z tego jakiś czas temu do Cezara, lub Vigenère, czy nie może być w ogóle. 738 00:32:44,410 --> 00:32:48,170 Twierdzę z moim printf, jestem zamierza wykorzystać do kopiowania t. 739 00:32:48,170 --> 00:32:51,616 Najpierw w linii 19, szybki rozsądku sprawdzić, strlen sprawdza długość t. 740 00:32:51,616 --> 00:32:53,740 Bo nie chcę starają się wykorzystać coś 741 00:32:53,740 --> 00:32:55,104 jeśli nie ma ciąg tam. 742 00:32:55,104 --> 00:32:57,520 Jeżeli użytkownik po prostu wciskamy Enter, nic nie wykorzystać. 743 00:32:57,520 --> 00:33:01,100 Więc nie chcę zrobić linię 21. 744 00:33:01,100 --> 00:33:05,758 Tak więc linia 21 jest czerpanie którego list, najwyraźniej, w t? 745 00:33:05,758 --> 00:33:06,514 >> PUBLICZNOŚCI: m? 746 00:33:06,514 --> 00:33:08,722 David J. MALAN: To wygląda jak jest kopiowanie, który z nich? 747 00:33:08,722 --> 00:33:09,486 PUBLICZNOŚCI: m. 748 00:33:09,486 --> 00:33:10,450 David J. MALAN: Uh, m. 749 00:33:10,450 --> 00:33:12,685 OK, więc pierwszym m, z powodu uprzedzenia, że ​​jestem 750 00:33:12,685 --> 00:33:14,935 przechodząc do TOUPPER, które jeśli nigdy wcześniej nie widziałem, że to 751 00:33:14,935 --> 00:33:16,980 tylko funkcja wykorzystać jako wejścia. 752 00:33:16,980 --> 00:33:20,240 t Uchwyt zera oznacza dać mi znak zero t. 753 00:33:20,240 --> 00:33:22,550 I tak, jak to robi Zmiana obraz, aby być jasne? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Co musi się przepisany lub zmienione w stosunku do S i T i mama 756 00:33:29,160 --> 00:33:30,097 backslash zero. 757 00:33:30,097 --> 00:33:31,470 >> PUBLICZNOŚCI: [niesłyszalne] 758 00:33:31,470 --> 00:33:34,030 >> David J. MALAN: Tak, więc ten tutaj, po prostu 759 00:33:34,030 --> 00:33:40,860 musi się przebrać to-- naprawić this-- musi się zmienić na kapitałowego m. 760 00:33:40,860 --> 00:33:44,330 Ale teraz, spójrz później w Program, jeśli wydrukować 761 00:33:44,330 --> 00:33:49,800 s i t, jak czyścić tu oglądać co stanie się drukowanie S i T. 762 00:33:49,800 --> 00:33:54,310 Tak, aby kopia-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Pozwólcie mi iść do przodu i wpisz w mama we wszystkich małych liter. 764 00:33:57,140 --> 00:34:00,140 Zauważ, zarówno oryginalne i kopia zostały aktywowane. 765 00:34:00,140 --> 00:34:00,850 Czemu? 766 00:34:00,850 --> 00:34:04,431 Oraz, s i t są jak wskazuje, jeśli będzie ten sam fragment pamięci. 767 00:34:04,431 --> 00:34:06,930 I szczerze mówiąc, to jest coraz Naprawdę uninteresting-- fakt, 768 00:34:06,930 --> 00:34:09,150 że używamy adresów zera tutaj. 769 00:34:09,150 --> 00:34:11,719 To znaczy, ja naprawdę nie obchodzi gdzie rzeczy są w pamięci. 770 00:34:11,719 --> 00:34:13,550 Niestety jestem kasowania trochę za dużo. 771 00:34:13,550 --> 00:34:15,674 Ale ja naprawdę nie obchodzi gdzie rzeczy są w pamięci. 772 00:34:15,674 --> 00:34:18,510 I tak, rzeczywiście, co programiści mają tendencję do myślenia 773 00:34:18,510 --> 00:34:21,080 jest to, że kiedy mówisz o adres, lub wskaźnik, 774 00:34:21,080 --> 00:34:22,679 kogo to obchodzi, gdzie jest to w pamięci. 775 00:34:22,679 --> 00:34:24,989 Nie obchodzi mnie, czy to w bajt jeden lub jeden miliard. 776 00:34:24,989 --> 00:34:27,920 Właśnie obchodzi, że to Zmienna jest skutecznie 777 00:34:27,920 --> 00:34:29,620 wskazując na tym fragmencie pamięci. 778 00:34:29,620 --> 00:34:33,350 I tak, od tej chwili, a nie spierać na dowolnych adresów pamięci, niech 779 00:34:33,350 --> 00:34:36,710 po prostu zacznij rysować wskaźniki jako wskaźniki, jak strzały. 780 00:34:36,710 --> 00:34:39,340 Więc co S i T są naprawdę, zgodnie z tym programem 781 00:34:39,340 --> 00:34:42,130 ponieważ, jak stworzyłem t, to zaledwie dwa oddzielne zmienne 782 00:34:42,130 --> 00:34:43,840 wskazując w tym samym fragmencie pamięci. 783 00:34:43,840 --> 00:34:45,215 I nie obchodzi mnie, gdzie są. 784 00:34:45,215 --> 00:34:47,130 Więc możemy się tym abstrakcyjne szczegółowo. 785 00:34:47,130 --> 00:34:48,780 >> Więc jak to naprawić? 786 00:34:48,780 --> 00:34:54,120 Jeśli chcę napisać wersję kopii program, który faktycznie kopiuje ciąg 787 00:34:54,120 --> 00:34:56,840 i aktywuje tylko kopia, tylko intuicyjnie, 788 00:34:56,840 --> 00:34:59,766 co ma być składnikiem naszego rozwiązania? 789 00:34:59,766 --> 00:35:00,640 PUBLICZNOŚCI: [niesłyszalne] 790 00:35:00,640 --> 00:35:01,420 David J. MALAN: Potrzebujemy co? 791 00:35:01,420 --> 00:35:01,820 PUBLICZNOŚCI: fragment pamięci. 792 00:35:01,820 --> 00:35:03,280 David J. MALAN: Musimy kolejny fragment pamięci, prawda? 793 00:35:03,280 --> 00:35:05,360 Nie wiemy, jak zrobić to jeszcze koniecznie. 794 00:35:05,360 --> 00:35:11,330 Ale trochę trzeba to się stało tak że oryginalny mama małymi literami 795 00:35:11,330 --> 00:35:14,170 kończy się w tym dodatkowym kawałkiem pamięci. 796 00:35:14,170 --> 00:35:19,770 A potem, kiedy zmienić kopię, ja nie chce zmienić tę kopię tutaj. 797 00:35:19,770 --> 00:35:26,020 I zamiast tego chcesz zmienić tylko to Kopia tak, że oryginał jest bez zmian. 798 00:35:26,020 --> 00:35:27,980 >> Więc, zobaczmy, w jaki sposób możemy to zrobić. 799 00:35:27,980 --> 00:35:31,800 W copy-1, która już ma został pozbawiony komentarza, 800 00:35:31,800 --> 00:35:33,250 ale jest skomentował w Internecie. 801 00:35:33,250 --> 00:35:36,710 My, zamiast zrobić to following-- nich linie są identyczne, daj mi ciąg 802 00:35:36,710 --> 00:35:38,340 i nazywają to s. 803 00:35:38,340 --> 00:35:43,500 Ale teraz spójrzmy na jednym z naszych najbardziej Kompleks ale ostatni złożoności 804 00:35:43,500 --> 00:35:47,340 na chwilę, linia 16 jest dokładnie to. 805 00:35:47,340 --> 00:35:49,400 Więc jeśli wygodne z obraz po prostu drew-- 806 00:35:49,400 --> 00:35:51,790 daj mi nowy kawałek pamięci, skopiować wszystko, co do niego, 807 00:35:51,790 --> 00:35:53,730 Zobaczmy, jak to przetłumaczyć na kod. 808 00:35:53,730 --> 00:35:59,400 >> Tak więc linia 16, na lewej stronie, char * t daje mi to pole tutaj. 809 00:35:59,400 --> 00:36:00,230 To wszystko, co robi. 810 00:36:00,230 --> 00:36:03,240 Z prawej strony, m alokacji lub malloc, 811 00:36:03,240 --> 00:36:06,480 jest alokacja pamięci, bardzo fantazyjne, to tajny sposób po prostu mówiąc: 812 00:36:06,480 --> 00:36:07,640 daj mi kawałek pamięci. 813 00:36:07,640 --> 00:36:09,290 Ile pamięci jest nam potrzebny? 814 00:36:09,290 --> 00:36:10,910 No cóż, to rodzaj dużej ekspresji. 815 00:36:10,910 --> 00:36:12,570 Ale zobaczmy, co tu jest napisane. 816 00:36:12,570 --> 00:36:15,940 Tak, oczywiście, to dać mi długość ciąg s. 817 00:36:15,940 --> 00:36:19,094 Tak, mama powinna być, co? 818 00:36:19,094 --> 00:36:21,010 Więc tylko trzy, prawda? mama ma trzy znaki. 819 00:36:21,010 --> 00:36:22,830 Nie liczyć backslash zero po 820 00:36:22,830 --> 00:36:25,960 mówić o długości łańcucha jest to rzeczywiście ludzkie widoczne litery. 821 00:36:25,960 --> 00:36:28,020 Więc mama, więc to daje mi 3. 822 00:36:28,020 --> 00:36:31,170 Ale zaraz, jestem teraz dodanie 1. 823 00:36:31,170 --> 00:36:34,861 Dlaczego właściwie chcesz przeznaczyć 4 bajtów, a nie tylko 3? 824 00:36:34,861 --> 00:36:35,360 Tak? 825 00:36:35,360 --> 00:36:36,910 >> PUBLICZNOŚCI: Dla wartości wartowniczego? 826 00:36:36,910 --> 00:36:38,951 >> David J. MALAN: Dokładnie, dla tej wartości wartowniczego. 827 00:36:38,951 --> 00:36:40,840 Dla backslashem zerowej, Potrzebuję 4 bajty. 828 00:36:40,840 --> 00:36:42,870 Więc muszę długość łańcucha plus 1. 829 00:36:42,870 --> 00:36:45,400 A potem po prostu na dobre measure-- mimo że w tym systemie 830 00:36:45,400 --> 00:36:49,390 to zawsze będzie 1-- mówię pomnożyć to przez rozmiar char. 831 00:36:49,390 --> 00:36:51,552 Okazuje się, że sizeof jest operator w C, który 832 00:36:51,552 --> 00:36:53,260 po prostu mówi się liczba bajtów to 833 00:36:53,260 --> 00:36:54,700 wymagany dla określonego typu danych. 834 00:36:54,700 --> 00:36:57,740 To nie działa dla tablic, zazwyczaj, czasami to robi. 835 00:36:57,740 --> 00:36:59,210 Jednak w przypadku ogólnym, no. 836 00:36:59,210 --> 00:37:02,330 Ale to powiedz mi, jak wiele bajtów, char to, co okazuje się zawsze 1. 837 00:37:02,330 --> 00:37:04,080 Tak to jest jak mnożąc przez 1. 838 00:37:04,080 --> 00:37:05,900 >> Tak bardzo tajemnicze spojrzenie linii kodu. 839 00:37:05,900 --> 00:37:09,320 Ale wszystko, co robi to daje mi fragment pamięci. 840 00:37:09,320 --> 00:37:13,590 Ale nie wydaje się być kopiowania coś w tej pamięci? 841 00:37:13,590 --> 00:37:14,560 Jeszcze nie. 842 00:37:14,560 --> 00:37:22,040 A więc co mam na linii 22, a 23, 24, 25, no, po prostu to zrobić. 843 00:37:22,040 --> 00:37:23,760 I to jest coś w rodzaju stara szkoła rzeczy teraz. 844 00:37:23,760 --> 00:37:26,010 To jest jak pset 2, gdzie jesteś po prostu się rzeczy 845 00:37:26,010 --> 00:37:28,620 wokół w pamięci, a raczej w łańcuchach. 846 00:37:28,620 --> 00:37:31,920 >> Więc jestem iteracji od 0 do długość łańcucha s. 847 00:37:31,920 --> 00:37:37,820 A ja kopiowania i-tego znaku w s do i-tego znaku w t. 848 00:37:37,820 --> 00:37:41,820 A ponieważ ja, programista, wykonane Pamiętaj, aby przydzielić dokładnie tak, jak wiele bajtów 849 00:37:41,820 --> 00:37:44,600 jak trzeba, jest doskonały jeden-do-jednego związku. 850 00:37:44,600 --> 00:37:47,060 I skopiować mamę w małe litery na nowy. 851 00:37:47,060 --> 00:37:50,170 I wtedy wreszcie zrobić ten wiersz. 852 00:37:50,170 --> 00:37:54,637 A więc efekt tylko wykorzystać ten t tutaj. 853 00:37:54,637 --> 00:37:56,470 Tak wiele do wchłonięcia, ale jeśli tylko uznają 854 00:37:56,470 --> 00:37:58,220 co się naprawdę dzieje na pod maską 855 00:37:58,220 --> 00:38:00,880 jest po prostu przesuwając je bajty się, wszystko 856 00:38:00,880 --> 00:38:06,617 konieczne jest, aby rozwiązać ten problem po prostu dać nam ten fragment pamięci. 857 00:38:06,617 --> 00:38:08,450 Teraz na ryzyko przytłaczające, pozwól mi pokazać 858 00:38:08,450 --> 00:38:13,200 Innym przykładem, że prawie identyczne, z wyjątkiem tego jednego 859 00:38:13,200 --> 00:38:14,350 linii kodu. 860 00:38:14,350 --> 00:38:18,870 Więc to jest wersja haker tego programu, jeśli będzie. 861 00:38:18,870 --> 00:38:21,050 Ale niech tylko destylować to do tego, co się dzieje. 862 00:38:21,050 --> 00:38:28,920 Linia 24 kiedyś to t Uchwyt i dostaje s uchwyt i. 863 00:38:28,920 --> 00:38:33,370 Teraz jestem zmianę na znacznie bardziej tajemniczy gwiazda t 864 00:38:33,370 --> 00:38:36,280 plus 1 równa się gwiazdą s plus 1. 865 00:38:36,280 --> 00:38:38,702 >> Więc co się dzieje i dlaczego mamy znak gwiazda? 866 00:38:38,702 --> 00:38:41,410 Widzieliśmy gwiazdę przed i jest używany tu jest inaczej. 867 00:38:41,410 --> 00:38:45,490 Wcześniej widział char *, teraz widzę gwiazdy na początku, i to jest OK. 868 00:38:45,490 --> 00:38:48,190 Bo okazuje się, my rodzaj można wnioskować tylko z 869 00:38:48,190 --> 00:38:50,280 od tych, które pierwsze zasady, co się dzieje. 870 00:38:50,280 --> 00:38:53,860 Więc po prostu być jasne, co to s? 871 00:38:53,860 --> 00:38:55,052 W zeszłym tygodniu, to był łańcuch. 872 00:38:55,052 --> 00:38:56,260 To nie wystarczy już. 873 00:38:56,260 --> 00:38:57,690 Co jest s, zwłaszcza? 874 00:38:57,690 --> 00:38:58,590 >> PUBLICZNOŚCI: [niesłyszalne] 875 00:38:58,590 --> 00:38:59,881 >> David J. MALAN: Jest to wskaźnik. 876 00:38:59,881 --> 00:39:02,610 Jest to adres z Pierwszy znak, że wpisane. 877 00:39:02,610 --> 00:39:04,780 OK, to, co jest t? 878 00:39:04,780 --> 00:39:05,660 >> PUBLICZNOŚCI: [niesłyszalne] 879 00:39:05,660 --> 00:39:07,950 >> David J. MALAN: adres pierwszego bajta 880 00:39:07,950 --> 00:39:10,490 wt, że fragment pamięci przydzielone. 881 00:39:10,490 --> 00:39:14,720 Okazuje się, że kiedy iteracyjne od 0 do łańcucha 882 00:39:14,720 --> 00:39:17,424 length-- przede wszystkim ja rozpoczyna się na 0, ponieważ 883 00:39:17,424 --> 00:39:18,840 tej starej szkoły dla pętli rzeczy. 884 00:39:18,840 --> 00:39:22,400 Tak tylko dla uproszczenia, niech Zakładamy, że pierwszy wiersz kodu 885 00:39:22,400 --> 00:39:23,760 jest tak naprawdę to, prawda. 886 00:39:23,760 --> 00:39:26,080 Jeżeli i jest zero, dodając do zera do czegoś przypuszczalnie 887 00:39:26,080 --> 00:39:27,540 nie będzie mieć wpływ. 888 00:39:27,540 --> 00:39:28,560 >> Więc co to jest powiedzenie? 889 00:39:28,560 --> 00:39:31,600 Okazuje się, że gwiazdy operator w tym kontekście 890 00:39:31,600 --> 00:39:33,700 jest wyłuskanie Operator, który jest po prostu 891 00:39:33,700 --> 00:39:37,530 fantazyjny sposób na powiedzenie iść na adres. 892 00:39:37,530 --> 00:39:42,080 Tak więc, gdy s jest adres pierwszego znak w tym fragmencie pamięci, 893 00:39:42,080 --> 00:39:43,630 * s środki tam. 894 00:39:43,630 --> 00:39:45,630 A ponieważ mamy wyciągnąć obraz w ten sposób, 895 00:39:45,630 --> 00:39:47,430 można przyjąć po modelu mentalnego. 896 00:39:47,430 --> 00:39:51,030 Jeśli jest to s, a ty mówisz, * s, * s trochę jak zsypy i drabiny, 897 00:39:51,030 --> 00:39:54,540 jeśli pamiętać grę z dzieciństwa, jest jak podążać tą strzałkę i przejdź 898 00:39:54,540 --> 00:39:55,570 dla adresu. 899 00:39:55,570 --> 00:39:57,080 >> * t jest to samo. 900 00:39:57,080 --> 00:39:59,855 Więc zacznij tutaj, przejdź do jej fragment. 901 00:39:59,855 --> 00:40:03,350 Nie mogę po prostu zwrócić na ten ekran w ten sposób. 902 00:40:03,350 --> 00:40:05,560 * t oznacza udać się tutaj. 903 00:40:05,560 --> 00:40:08,830 A potem, do pętli jest po prostu mówiąc przenieść tę postać tutaj, 904 00:40:08,830 --> 00:40:11,330 przenieść tę postać tutaj, przenieść ten znak tutaj. 905 00:40:11,330 --> 00:40:12,890 Ale jak mam to zrobić incrementation? 906 00:40:12,890 --> 00:40:15,430 Muszę cofnąć to, co właśnie usunięte. 907 00:40:15,430 --> 00:40:18,140 To jest to, co zwykle nazywa wskaźnik arytmetyczne, które 908 00:40:18,140 --> 00:40:20,040 Oznacza matematyki z adresami. 909 00:40:20,040 --> 00:40:22,460 >> Jeżeli w tej pętli, Ciągle zwiększający i, 910 00:40:22,460 --> 00:40:26,880 i s oznacza liczbę adresów a t jest adres, jeśli po prostu dodajemy 1, 911 00:40:26,880 --> 00:40:31,406 że po prostu oznacza, naprzód, i przekazuje i przekazuje do pamięci. 912 00:40:31,406 --> 00:40:34,030 To jak Oxford Street Ulica, że ​​budynek CS jest. 913 00:40:34,030 --> 00:40:36,490 Budynki CS jest na 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Więc jeśli było zrobić 33 Oxford Street plus 1, 915 00:40:39,870 --> 00:40:42,870 które przynosi do 34 Oxford Ulica, następnie 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 następnie 36 Oxford Street, niezależnie od tych, budynki rzeczywiście są - o ile takie istnieją. 917 00:40:46,380 --> 00:40:50,540 I tak, to wszystko robimy tutaj z arytmetyki wskaźników. 918 00:40:50,540 --> 00:40:53,820 >> Więc jest to bardzo tajemna droga wyrażania siebie. 919 00:40:53,820 --> 00:40:56,160 Ale wszystko, co się dzieje pod maską 920 00:40:56,160 --> 00:40:59,330 jest po prostu po tych adresów, jak po mapę, jeśli chcesz, 921 00:40:59,330 --> 00:41:02,692 lub po strzały jak mamy narysowany na ekranie. 922 00:41:02,692 --> 00:41:04,910 OK, dużo do strawienia. 923 00:41:04,910 --> 00:41:10,410 Wszelkie pytania na temat składni, koncepcje, wskaźniki, malloc, lub tym podobne. 924 00:41:10,410 --> 00:41:11,480 Tak, tutaj w pierwszej kolejności. 925 00:41:11,480 --> 00:41:13,755 >> PUBLICZNOŚCI: Więc gdzie to mówi * t * t równa toupper, 926 00:41:13,755 --> 00:41:15,575 jest to, że zamierza wykorzystać wszystkie litery lub just-- 927 00:41:15,575 --> 00:41:17,283 >> David J. MALAN: Ach, bardzo dobre pytanie. 928 00:41:17,283 --> 00:41:19,805 Więc w tej linii tutaj, 31, to jeszcze wykorzystać 929 00:41:19,805 --> 00:41:21,430 Pierwsza litera lub wszystkich liter. 930 00:41:21,430 --> 00:41:23,460 Warto więc odpowiedzieć, że będzie z powrotem do pierwszych zasad. 931 00:41:23,460 --> 00:41:26,168 I pierwsze zasady tutaj mam na myśli Wystarczy przejść do podstawowych definicji 932 00:41:26,168 --> 00:41:27,000 z tego, co się z tym wiąże. 933 00:41:27,000 --> 00:41:29,770 Więc toupper to funkcja które aktywuje char. 934 00:41:29,770 --> 00:41:30,530 To wszystko. 935 00:41:30,530 --> 00:41:36,740 * t oznacza przejść do first-- przejdź na adres w t. 936 00:41:36,740 --> 00:41:40,350 Tak więc, na rysunku, jeżeli jest to klocek pamięci mamy przydzielone z malloc, 937 00:41:40,350 --> 00:41:43,310 i to jest t, * t oznacza tutaj. 938 00:41:43,310 --> 00:41:46,710 >> Tymczasem, jesteś przejazdem że wartość, małe m 939 00:41:46,710 --> 00:41:50,040 do toupper, dostajesz z powrotem Kapitał M, gdzie jesteś wprowadzenie go? 940 00:41:50,040 --> 00:41:52,410 Jesteś wprowadzenie go w tym samym miejscu. 941 00:41:52,410 --> 00:41:55,540 I tak przez tę logikę tych podstawowe definicje To tylko 942 00:41:55,540 --> 00:41:58,792 pierwszej litery chyba iteracyjne z I lub 943 00:41:58,792 --> 00:42:02,000 do pętli lub pętli while, to nie będzie zrobić coś więcej, niż poprosić go. 944 00:42:02,000 --> 00:42:02,583 Dobre pytanie. 945 00:42:02,583 --> 00:42:03,237 Tak? 946 00:42:03,237 --> 00:42:05,369 >> PUBLICZNOŚCI: Dlaczego używasz dereference metody, a nie 947 00:42:05,369 --> 00:42:05,979 tablica? 948 00:42:05,979 --> 00:42:07,395 >> David J. MALAN: Ach, dobre pytanie. 949 00:42:07,395 --> 00:42:10,672 Dlaczego chcesz użyć dereference Sposób zamiast metody macierzowych 950 00:42:10,672 --> 00:42:12,130 Żadnego powodu, aby być uczciwym. 951 00:42:12,130 --> 00:42:15,290 I rzeczywiście, w tym rodzaj przykład, w prawo, 952 00:42:15,290 --> 00:42:17,556 Mówię tylko, argumentując, czyniąc Program bardziej skomplikowane, 953 00:42:17,556 --> 00:42:19,680 więcej oczy są przeszklenia na, ludzie sprawdzić 954 00:42:19,680 --> 00:42:22,830 bo to wygląda bardzo ezoteryczne, ale nawet jeśli to robi to samo. 955 00:42:22,830 --> 00:42:26,695 A tak szczerze mówiąc, to jest niepotrzebnie wizualnie kompleksowe rozwiązanie 956 00:42:26,695 --> 00:42:27,320 problemu. 957 00:42:27,320 --> 00:42:29,580 >> To wciąż dobry projekt, pięć z pięciu do projektowania, 958 00:42:29,580 --> 00:42:33,140 czy to w uchwycie Zapis lub oznaczenie wskaźnika. 959 00:42:33,140 --> 00:42:36,299 Ale-- zwłaszcza, gdy mamy później w toku w pset 5 960 00:42:36,299 --> 00:42:39,340 kiedy wdrożenie tego słownika, który Pisałem kilka times-- 961 00:42:39,340 --> 00:42:42,300 my właściwie dbać o adresy pamięci niski poziom 962 00:42:42,300 --> 00:42:44,140 że naprawdę zrozumieć, co się dzieje. 963 00:42:44,140 --> 00:42:48,300 >> Ale teraz okazuje się, że to linii kodu nawiasach tutaj kwadratowych 964 00:42:48,300 --> 00:42:49,900 tak naprawdę nie istnieje. 965 00:42:49,900 --> 00:42:52,230 Są to, co nazywa lukrem składniowym, które 966 00:42:52,230 --> 00:42:58,390 jest po prostu niesamowicie fajny sposób mówiąc kompilator zamienia nawiasy kwadratowe być 967 00:42:58,390 --> 00:43:00,420 to wyrażenie matematyczne. 968 00:43:00,420 --> 00:43:02,660 Więc jest to ludzka konwencji aby móc się pisać 969 00:43:02,660 --> 00:43:04,220 te bardzo łatwy w obsłudze wsporniki. 970 00:43:04,220 --> 00:43:06,850 Ale to, co kompilator, dzyń, naprawdę robi w każdej chwili 971 00:43:06,850 --> 00:43:10,970 piszesz, co podkreślono w linii 24, pod maską to naprawdę 972 00:43:10,970 --> 00:43:12,330 przekształcenie go do tego. 973 00:43:12,330 --> 00:43:16,200 To jest po prostu bardziej przyjemne jako człowiek czytać i pisać kod jak wiersz 24. 974 00:43:16,200 --> 00:43:18,530 Ale w końcu ci, kółka zbyt schodzą 975 00:43:18,530 --> 00:43:21,780 kiedy czyjaś własna wygoda dostaje silniejszy. 976 00:43:21,780 --> 00:43:27,240 >> W porządku, więc pamiętam to, że ta był typem największy problem 977 00:43:27,240 --> 00:43:27,807 wpadliśmy. 978 00:43:27,807 --> 00:43:30,640 I to, co wywołało tę całość cholernie rozmowa o wskazówki, 979 00:43:30,640 --> 00:43:32,340 oraz adresy i rzeczy kopiowania. 980 00:43:32,340 --> 00:43:35,410 To było dlatego, że potknął się ten głupi, głupi problem, przy czym 981 00:43:35,410 --> 00:43:38,830 I wdrożone logically-- z Lauren tutaj na demo i soku pomarańczowego 982 00:43:38,830 --> 00:43:43,770 w milk-- doskonale algorytmicznie prawidłowa funkcja 983 00:43:43,770 --> 00:43:47,010 do ciężkich dwie zmienne " wartości, ale to cholerstwo 984 00:43:47,010 --> 00:43:50,550 nie ma żadnych trwałych, lub stałe, wpływ na mojego kodu. 985 00:43:50,550 --> 00:43:51,820 >> I dlaczego to było? 986 00:43:51,820 --> 00:43:54,650 W skrócie, dlaczego jest to Realizacja wymiany 987 00:43:54,650 --> 00:43:58,740 logicznie poprawne, ale nie ma wpływu od zmiennych, które są przekazywane do niej, 988 00:43:58,740 --> 00:44:01,119 jak x i y dla Głównym? 989 00:44:01,119 --> 00:44:02,410 Co było sedno problemu? 990 00:44:02,410 --> 00:44:02,909 Tak? 991 00:44:02,909 --> 00:44:05,532 PUBLICZNOŚCI: Ponieważ zmienna wykonane kopie zmiennej w przejściu 992 00:44:05,532 --> 00:44:06,240 za pośrednictwem funkcji. 993 00:44:06,240 --> 00:44:09,060 >> David J. MALAN: Dokładnie, kiedy przechodzą zmienne w funkcji lub argumenty 994 00:44:09,060 --> 00:44:11,030 do funkcji, są one uchwalona przez egzemplarzu, który 995 00:44:11,030 --> 00:44:14,770 oznacza, że ​​otrzymasz identyczny patrząc wzór bitów dla X i Y, 996 00:44:14,770 --> 00:44:15,955 zwany tu i b. 997 00:44:15,955 --> 00:44:18,080 I można zrobić wszystko chcesz z tych kopii, 998 00:44:18,080 --> 00:44:20,657 ale nie będziemy mieć żadnego Wpływ na funkcji wywołującej. 999 00:44:20,657 --> 00:44:22,990 I rzeczywiście, zwróciliśmy że obraz na ekranie, wycofanie 1000 00:44:22,990 --> 00:44:25,520 Ostatni raz, przy czym, jeśli Ciebie naprawdę myślisz o tym, co 1001 00:44:25,520 --> 00:44:28,570 dzieje pod spodem hood-- jeśli to jest pamięci komputera, 1002 00:44:28,570 --> 00:44:31,650 i tu jest fragment Pamięć jest stosowany w głównym, 1003 00:44:31,650 --> 00:44:34,020 jest to fragment Pamięć jest używany do wymiany, 1004 00:44:34,020 --> 00:44:37,090 i tak, nawet jeśli główny ma dwie zmienne X i Y, 1005 00:44:37,090 --> 00:44:41,840 Swap może mieć identyczne spojrzenie wartości, z których oba są 1 i 2, 1006 00:44:41,840 --> 00:44:44,520 ale są całkowicie różne kawałki pamięci. 1007 00:44:44,520 --> 00:44:46,130 >> Musimy więc rozwiązanie tego. 1008 00:44:46,130 --> 00:44:51,580 I szczerze mówiąc, wydaje się, że teraz ma rozwiązanie tego problemu, prawda. 1009 00:44:51,580 --> 00:44:55,760 Jeśli mamy zdolność do manipulować rzeczy w drodze adresów 1010 00:44:55,760 --> 00:44:59,310 oraz, w rodzaju zjeżdżalnie i drabiny styl, wykonaj następujące strzały 1011 00:44:59,310 --> 00:45:02,820 i gdziekolwiek chcemy w pamięci, nie mogliśmy 1012 00:45:02,820 --> 00:45:06,220 Rozwiązaniem tego problemu przechodząc z głównym do wymiany 1013 00:45:06,220 --> 00:45:09,650 nie wartości chcemy wymiany, ale po prostu intuicyjnie 1014 00:45:09,650 --> 00:45:11,630 co możemy przejść do wymiany, a nie? 1015 00:45:11,630 --> 00:45:12,620 >> [Wstawienie GŁOSY] 1016 00:45:12,620 --> 00:45:15,244 >> David J. MALAN: Dlaczego nie możemy po prostu przekazać, że adresy, prawda? 1017 00:45:15,244 --> 00:45:17,470 Dlaczego nie dajemy zamienić skarb mapa, jeśli chcesz, 1018 00:45:17,470 --> 00:45:20,950 prowadziłoby to do Rzeczywiste wartości xi y. 1019 00:45:20,950 --> 00:45:24,340 Miejmy wymiany, faktycznie zmienić te oryginalne bity, a nie 1020 00:45:24,340 --> 00:45:26,797 tylko przejazdem kopie bitów. 1021 00:45:26,797 --> 00:45:29,130 I tak, w rzeczywistości, to, co jest będzie rozwiązaniem. 1022 00:45:29,130 --> 00:45:31,899 Ta wersja tutaj jest jednoznacznie złe i błędne. 1023 00:45:31,899 --> 00:45:35,190 A teraz, na pierwszy rzut oka, to po prostu wygląda jak dodaliśmy kilka gwiazd losowo 1024 00:45:35,190 --> 00:45:37,106 i przekroczył nasze palce że to skompilować. 1025 00:45:37,106 --> 00:45:38,460 Ale, to teraz skompilować. 1026 00:45:38,460 --> 00:45:40,090 >> Ale zobaczmy, co to znaczy. 1027 00:45:40,090 --> 00:45:43,990 I, niestety, autorzy C mógł wybrać inny symbol 1028 00:45:43,990 --> 00:45:46,380 aby ten mały jaśniejsze, ale operator gwiazda 1029 00:45:46,380 --> 00:45:48,610 ma inne znaczenie w Dwa różne konteksty. 1030 00:45:48,610 --> 00:45:50,890 I jak widzieliśmy, ale niech odróżnić. 1031 00:45:50,890 --> 00:45:55,310 >> Tak się w tam na górze, kiedy zostały zmienione a i b 1032 00:45:55,310 --> 00:46:00,470 od bycia int jest w złym Wersja do int gwiazd, A i B, 1033 00:46:00,470 --> 00:46:01,740 Poprzednio były liczbami całkowitymi. 1034 00:46:01,740 --> 00:46:05,752 Jakie są aib teraz dobra, zielona wersja? 1035 00:46:05,752 --> 00:46:06,900 Są adresy. 1036 00:46:06,900 --> 00:46:09,610 Adresy co, być jasne? 1037 00:46:09,610 --> 00:46:10,770 Adresy liczb całkowitych. 1038 00:46:10,770 --> 00:46:12,520 Tak więc fakt, że jestem mówiąc środki int gwiazdkowe 1039 00:46:12,520 --> 00:46:15,440 To jest adres liczbą całkowitą, a konkretnie. 1040 00:46:15,440 --> 00:46:19,120 >> Więc teraz zauważyć w linii kodu, jeszcze coś się zmieniło też. 1041 00:46:19,120 --> 00:46:22,770 tmp pozostaje takie same, ponieważ to tylko tymczasowa całkowita, 1042 00:46:22,770 --> 00:46:24,110 nie magia istnieje pamięci. 1043 00:46:24,110 --> 00:46:26,370 Ale teraz musi gwiazdę. 1044 00:46:26,370 --> 00:46:28,560 I faktycznie każdy inne wzmianki o A i B, 1045 00:46:28,560 --> 00:46:31,780 zauważysz, że wszystko, co zmienia się od czerwieni do zieleni 1046 00:46:31,780 --> 00:46:34,209 jest to, że jestem poprzedzenie te zmienne z gwiazdami. 1047 00:46:34,209 --> 00:46:35,750 Bo nie chcę, aby skopiować i b. 1048 00:46:35,750 --> 00:46:40,350 Bo jeśli po prostu skopiować aib oraz swapu a i b, co ja właściwie zamiana? 1049 00:46:40,350 --> 00:46:43,760 Zaledwie adresy, chcę zamienić co pod tymi adresami. 1050 00:46:43,760 --> 00:46:44,860 Chcę tam pójść. 1051 00:46:44,860 --> 00:46:48,000 I tak operator gwiazda wewnątrz mojej funkcji, 1052 00:46:48,000 --> 00:46:51,700 nie wewnątrz listy parametrów, oznacza idziesz do tych adresów 1053 00:46:51,700 --> 00:46:54,490 i rzeczywiście zmienić te wartości. 1054 00:46:54,490 --> 00:46:56,500 >> Więc co robi zdjęcie teraz wyglądać zamiast. 1055 00:46:56,500 --> 00:47:03,250 Cóż, jeśli zamiast olewam w w A i B 1 i 2-- 1056 00:47:03,250 --> 00:47:05,790 I rzeczywiście trzeba dodać jedna definicja tutaj. 1057 00:47:05,790 --> 00:47:09,030 Więc przypuszczam, że ten fragment pamięci jest w miejscu 10. 1058 00:47:09,030 --> 00:47:12,960 >> To jest w miejscu 11, ale w tym jest trochę uproszczeń, 1059 00:47:12,960 --> 00:47:18,900 Mam teraz dwie możliwości mogę przekazać x i y czy mogę przekazać swoje adresy? 1060 00:47:18,900 --> 00:47:22,500 Jeśli mijam ich adresy tak, po prostu 1061 00:47:22,500 --> 00:47:25,390 Teraz należy wdrożyć Swap na zielonej kod 1062 00:47:25,390 --> 00:47:29,080 tak, że gdy widzi, a kiedy widzi b, to nie wystarczy skopiować aib 1063 00:47:29,080 --> 00:47:30,540 i przesunąć mleko i sok pomarańczowy. 1064 00:47:30,540 --> 00:47:32,664 Mleko i sok pomarańczowy metafora teraz zepsuje, 1065 00:47:32,664 --> 00:47:35,060 ponieważ są puchary mapy płynnych i nie. 1066 00:47:35,060 --> 00:47:37,750 My zamiast tego trzeba iść do zajęcia 10 i my 1067 00:47:37,750 --> 00:47:42,420 trzeba iść do rozwiązania 11, oraz następnie wykonać tę logikę swap. 1068 00:47:42,420 --> 00:47:45,580 >> Tak więc układ logiczny jest tym samym, lecz musimy nieco inny sposób 1069 00:47:45,580 --> 00:47:47,160 z dostępu do tych zmiennych. 1070 00:47:47,160 --> 00:47:52,400 A więc w końcu, co Program ma wyglądać jak to jest. 1071 00:47:52,400 --> 00:47:56,610 W swap.c dosłownie skopiowane i wklejony zieloną wersję. 1072 00:47:56,610 --> 00:47:58,450 Ale muszę dokonać jednej zmiany. 1073 00:47:58,450 --> 00:48:00,180 Nie wystarczy po prostu zmienić swapa. 1074 00:48:00,180 --> 00:48:03,830 Co druga linia kodu muszę zmienić? 1075 00:48:03,830 --> 00:48:04,330 Tak? 1076 00:48:04,330 --> 00:48:05,770 >> PUBLICZNOŚCI: Gdzie to ma argumenty. 1077 00:48:05,770 --> 00:48:07,603 >> David J. MALAN: Gdzie to ma swoje argumenty. 1078 00:48:07,603 --> 00:48:09,985 Więc jeśli mogę przewinąć do głównego, ja Nie można po prostu przejść w X i Y, 1079 00:48:09,985 --> 00:48:12,820 i obiecuję, ostatnia kawałek nowej składni dziś. 1080 00:48:12,820 --> 00:48:17,200 Trzeba przekazać w nie xi y, ale adres xi y. 1081 00:48:17,200 --> 00:48:20,400 I okazuje się, symbol że autorzy C wybrał 1082 00:48:20,400 --> 00:48:23,860 to jeśli używasz ampersanda tutaj, aby nie mylić z ampersand mnożenie, 1083 00:48:23,860 --> 00:48:27,130 jeśli używasz ampersanda tutaj i ampersand tutaj, 1084 00:48:27,130 --> 00:48:29,570 to dane dla ciebie, co to jest adres x, 1085 00:48:29,570 --> 00:48:31,740 być może jest to 10, co jest adres y, może to 1086 00:48:31,740 --> 00:48:35,400 11, i przesyła te w zamian. 1087 00:48:35,400 --> 00:48:37,210 >> Tak wiele do pochłaniają wszystko na raz. 1088 00:48:37,210 --> 00:48:40,190 Ale zobaczmy teraz szybko nasze pozostałe cztery minuty 1089 00:48:40,190 --> 00:48:42,150 gdzie coś może pójść nie tak. 1090 00:48:42,150 --> 00:48:45,120 I tak na marginesie, w rzeczywistości Wziąłem ten obraz, 1091 00:48:45,120 --> 00:48:46,920 TF zrobił to zdjęcie rok czy dwa lata temu. 1092 00:48:46,920 --> 00:48:49,190 Tak to jest z tyłu rogu od Eliot jadalni. 1093 00:48:49,190 --> 00:48:52,310 Wskaźniki są chyba najtrudniejsze temat, który omówimy w CS50. 1094 00:48:52,310 --> 00:48:54,810 Jeśli więc martwić rodzaj nachylenia jest jak może to 1095 00:48:54,810 --> 00:48:56,770 więcej kija hokejowego tak, sobie sprawę, 1096 00:48:56,770 --> 00:49:00,160 jesteśmy trochę zbliża się szczyt w warunki pojęciowej złożoności. 1097 00:49:00,160 --> 00:49:02,300 >> A ja wychować to Fotografia, bo przysięgam 1098 00:49:02,300 --> 00:49:05,920 do Boga, w jesieni 1996 roku, kiedy wziąłem CS50 z moim nauczania kolegów, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, usiadł mnie w Narożnik Eliot D. Hall podczas lunchu, 1100 00:49:09,620 --> 00:49:12,330 lub kolacja, lub coś, aby spróbować aby pomóc mi zrozumieć wskazówki. 1101 00:49:12,330 --> 00:49:16,520 I to jest, gdzie jestem tygodnie po został wprowadzony w wykładzie, gdy 1102 00:49:16,520 --> 00:49:18,170 I w końcu zrozumiał wskazówki. 1103 00:49:18,170 --> 00:49:20,590 I mam nadzieję, że ten kliknij znacznie szybciej będzie dla Ciebie. 1104 00:49:20,590 --> 00:49:23,540 Ale sobie z tego sprawy absolutnie m.in. bardziej zaawansowane tematy 1105 00:49:23,540 --> 00:49:24,420 poznaliśmy już. 1106 00:49:24,420 --> 00:49:25,819 Ale to jedne z najpotężniejszych. 1107 00:49:25,819 --> 00:49:28,860 A kiedy je dostać, to naprawdę wszystko po prostu się wreszcie razem. 1108 00:49:28,860 --> 00:49:31,460 Tak więc pewni, że nie robi musisz wszystkich umywalka w dzisiaj. 1109 00:49:31,460 --> 00:49:32,980 >> Więc tutaj jest ostatni program będziemy patrzeć. 1110 00:49:32,980 --> 00:49:35,605 I będziemy do końca z Szybkie trzy minuty claymation 1111 00:49:35,605 --> 00:49:37,030 wykonane przez naszego przyjaciela, Nicka Parlante. 1112 00:49:37,030 --> 00:49:41,440 Oto program, który na górze dwa linie deklaruje zmienną x i y. 1113 00:49:41,440 --> 00:49:44,780 Z których oba są adresami liczb całkowitych, wskaźniki AKA. 1114 00:49:44,780 --> 00:49:48,125 Następnie przydzielić tyle pamięci do przechowywania int 1115 00:49:48,125 --> 00:49:51,344 i przechowywać adres tej pamięci w x. 1116 00:49:51,344 --> 00:49:53,260 Tak, to jest jeszcze prostsze niż np przed. 1117 00:49:53,260 --> 00:49:56,100 Daj mi czterech bajtów pamięci, to jest rozmiar int, 1118 00:49:56,100 --> 00:49:58,000 i umieścić ten adres w x. 1119 00:49:58,000 --> 00:50:01,070 Ta linia oznacza tutaj przejdź na adres w x 1120 00:50:01,070 --> 00:50:05,270 i umieścić znaczenia życie, liczba 42 nie. 1121 00:50:05,270 --> 00:50:07,710 Ale ta linia mnie martwi. 1122 00:50:07,710 --> 00:50:12,620 Gwiazda y oznacza go na adres podany w y, i podać liczbę pechową 13 tam. 1123 00:50:12,620 --> 00:50:15,780 Dlaczego jest to niebezpieczne, w tym momencie w story-- choć szybko powiedział 1124 00:50:15,780 --> 00:50:17,980 w naszych schyłkowych minut here-- dlaczego jest tak źle 1125 00:50:17,980 --> 00:50:19,660 mi powiedzieć, przejdź do adresu w y? 1126 00:50:19,660 --> 00:50:21,077 >> PUBLICZNOŚCI: nie masz [niesłyszalne]. 1127 00:50:21,077 --> 00:50:22,910 David J. MALAN: nie mam umieścić coś w r. 1128 00:50:22,910 --> 00:50:25,520 Więc jaka jest wartość y, w tym momencie w historii? 1129 00:50:25,520 --> 00:50:26,570 Nie mamy pojęcia. 1130 00:50:26,570 --> 00:50:29,190 To jakaś wartość śmieci i ani nie Binky wiedzieć. 1131 00:50:29,190 --> 00:50:32,532 Gdyby udało nam się zakończyć na tej nocie. 1132 00:50:32,532 --> 00:50:34,832 >> [ODTWARZANIE] 1133 00:50:34,832 --> 00:50:36,500 >> Hej, Binky, obudź się. 1134 00:50:36,500 --> 00:50:39,140 Nadszedł czas na wskaźnik zabawy. 1135 00:50:39,140 --> 00:50:40,210 >> -Co to? 1136 00:50:40,210 --> 00:50:41,690 Dowiedz się o wskazówki? 1137 00:50:41,690 --> 00:50:43,570 Och, cukierek. 1138 00:50:43,570 --> 00:50:46,600 >> -No, Aby zacząć, myślę, że jesteśmy będziemy potrzebować kilka wskazówek. 1139 00:50:46,600 --> 00:50:47,380 >> -OK. 1140 00:50:47,380 --> 00:50:51,120 Ten kod przydziela dwa wskaźniki co może wskazywać na całkowite. 1141 00:50:51,120 --> 00:50:53,557 >> -ok, Dobrze widzę dwa wskaźniki, ale 1142 00:50:53,557 --> 00:50:55,140 nie wydaje się być skierowany do niczego. 1143 00:50:55,140 --> 00:50:55,970 >> -To prawda. 1144 00:50:55,970 --> 00:50:58,100 Początkowo wskaźnikami nie wskazują na nic. 1145 00:50:58,100 --> 00:51:00,950 Rzeczy, które wskazują na to nazywa pointees i ich ustanowieniem 1146 00:51:00,950 --> 00:51:02,330 jest odrębnym etapem. 1147 00:51:02,330 --> 00:51:03,210 >> Och, tak, tak. 1148 00:51:03,210 --> 00:51:03,940 Wiedziałem to. 1149 00:51:03,940 --> 00:51:05,730 W pointees są oddzielne. 1150 00:51:05,730 --> 00:51:08,310 Więc jak można przeznaczyć wskazywany? 1151 00:51:08,310 --> 00:51:11,960 >> -ok, Dobrze jest kod alokuje nowy wskazywany liczbą całkowitą, 1152 00:51:11,960 --> 00:51:15,050 i to zestawy części X pkt do niego. 1153 00:51:15,050 --> 00:51:16,240 >> Hej, to wygląda lepiej. 1154 00:51:16,240 --> 00:51:17,743 Więc należy coś zrobić. 1155 00:51:17,743 --> 00:51:23,580 >> -ok, Będę wyłuskanie wskaźnika x do zapisać numer 42 w jego wskazywany. 1156 00:51:23,580 --> 00:51:27,130 Do tej sztuczki, będę potrzebował mojej magiczna różdżka wyłuskania. 1157 00:51:27,130 --> 00:51:30,200 >> -Twój Magiczna różdżka dereferencing? 1158 00:51:30,200 --> 00:51:32,310 Uh, to, to świetnie. 1159 00:51:32,310 --> 00:51:34,270 >> -To, Co kod wygląda. 1160 00:51:34,270 --> 00:51:35,970 Ja po prostu ustawić liczbę and-- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SOUND] 1162 00:51:37,070 --> 00:51:39,140 >> Hej, spójrz tam idzie. 1163 00:51:39,140 --> 00:51:43,980 Tak, robi dereference na x następująco strzałka dostęp do swojego wskazywany. 1164 00:51:43,980 --> 00:51:46,150 W tym przypadku, w celu przechowywania 42 w środku. 1165 00:51:46,150 --> 00:51:50,700 Hej, spróbuj użyć go, aby zapisać numer 13 przez drugi wskaźnik, y. 1166 00:51:50,700 --> 00:51:51,840 >> -OK. 1167 00:51:51,840 --> 00:51:56,270 Pójdę tu do y, i uzyskać numer 13 ustawiony. 1168 00:51:56,270 --> 00:52:00,380 A następnie podjąć różdżkę wyłuskania i just-- 1169 00:52:00,380 --> 00:52:01,646 >> [BUZZER SOUND] 1170 00:52:01,646 --> 00:52:04,080 >> Och, hej, że nie działa. 1171 00:52:04,080 --> 00:52:06,470 Powiedzieć, uh, Binky, ja nie myślę dereferencing 1172 00:52:06,470 --> 00:52:10,850 y jest dobrym pomysłem, ponieważ ustawienie w górę wskazywany jest odrębnym etapem. 1173 00:52:10,850 --> 00:52:12,480 I nie sądzę, że kiedykolwiek to zrobił. 1174 00:52:12,480 --> 00:52:14,620 >> -Hmm, Dobry punkt. 1175 00:52:14,620 --> 00:52:19,810 >> -Tak, Mamy przydzielone wskaźnik, y, ale nigdy nie ustawić go zwrócić do wskazywany. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Bardzo spostrzegawczy. 1177 00:52:21,590 --> 00:52:23,215 Hej, szukasz dobre tam, Binky. 1178 00:52:23,215 --> 00:52:26,390 Można go naprawić, więc Y punktów w tym samym wskazywany jako X. 1179 00:52:26,390 --> 00:52:29,290 >> -Jasne, Mogę korzystać z magiczną różdżką cesji wskaźnika. 1180 00:52:29,290 --> 00:52:31,970 >> -Czy To będzie Problem, jak wcześniej? 1181 00:52:31,970 --> 00:52:33,790 >> -Nie, To nie dotykać pointees. 1182 00:52:33,790 --> 00:52:35,840 To po prostu zmienia jeden wskaźnik zwrócić się do tego samego thing-- 1183 00:52:35,840 --> 00:52:36,465 >> [Trzasków] 1184 00:52:36,465 --> 00:52:37,450 --as innego. 1185 00:52:37,450 --> 00:52:38,440 >> -Rozumiem. 1186 00:52:38,440 --> 00:52:41,200 Teraz y wskazuje na tym samym miejscu, x. 1187 00:52:41,200 --> 00:52:42,950 Więc, czekaj, teraz y jest stała. 1188 00:52:42,950 --> 00:52:44,110 Ma wskazywany. 1189 00:52:44,110 --> 00:52:47,779 Więc możesz spróbować różdżkę z dereferencing ponownie wysłać 13 over. 1190 00:52:47,779 --> 00:52:51,110 >> Oh, OK, tu idzie. 1191 00:52:51,110 --> 00:52:52,330 >> Hej, spójrz na to. 1192 00:52:52,330 --> 00:52:53,570 Teraz dereferencing prac na rok. 1193 00:52:53,570 --> 00:52:57,900 A ponieważ wskaźniki dzielą że jednym wskazywany, oboje zobaczyć 13. 1194 00:52:57,900 --> 00:52:59,952 >> -Tak, Dzielenie się, uh, cokolwiek. 1195 00:52:59,952 --> 00:53:01,535 Tak, mamy zamiar zamienić się miejscami teraz? 1196 00:53:01,535 --> 00:53:03,730 >> Och, spójrz mamy czasu. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Wystarczy Pamiętam trzy zasady wskaźnika. 1199 00:53:06,520 --> 00:53:09,550 Nr 1, podstawowa struktura jest to, że masz wskaźnik, 1200 00:53:09,550 --> 00:53:11,630 i zwraca się do wskazywany. 1201 00:53:11,630 --> 00:53:13,740 Jednak wskaźnik i wskazywany są oddzielne. 1202 00:53:13,740 --> 00:53:15,620 I częsty błąd jest utworzenie wskaźnika 1203 00:53:15,620 --> 00:53:18,000 ale zapomnij dać mu wskazywany. 1204 00:53:18,000 --> 00:53:21,170 >> Numer 2, wskaźnik wyłuskania rozpoczyna się na wskaźniku 1205 00:53:21,170 --> 00:53:24,020 i następuje jego strzałkę nad aby uzyskać dostęp do jego wskazywany. 1206 00:53:24,020 --> 00:53:27,815 Jak wszyscy wiemy, to działa tylko wtedy, gdy jest wskazywany, jaki rodzaj wróci 1207 00:53:27,815 --> 00:53:29,260 rządzić numer 1. 1208 00:53:29,260 --> 00:53:31,990 >> Numer 3, wskaźnik Przyporządkowanie następuje jeden wskaźnik 1209 00:53:31,990 --> 00:53:35,330 i zmienia go, by wskazywały na samo wskazywany jako inny wskaźnik. 1210 00:53:35,330 --> 00:53:37,150 Więc po cesji, dwa wskaźniki 1211 00:53:37,150 --> 00:53:40,927 będzie wskazywać na samym wskazywany, czasem to się nazywa dzielenie. 1212 00:53:40,927 --> 00:53:42,510 I to wszystko na ten temat, naprawdę. 1213 00:53:42,510 --> 00:53:43,130 Do widzenia teraz. 1214 00:53:43,130 --> 00:53:43,475 >> [Zakończyć odtwarzanie] 1215 00:53:43,475 --> 00:53:44,830 >> David J. MALAN: To wszystko na CS50. 1216 00:53:44,830 --> 00:53:46,246 Dzięki profesor Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Do zobaczenia w przyszłym tygodniu. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [Electronic Music Playing] 1220 00:53:56,435 --> 00:57:22,775