1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Tydzień 4, ciąg dalszy] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Harvard University] 3 00:00:04,240 --> 00:00:07,290 [To jest CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> To CS50, i to jest koniec 4 tygodniu. 5 00:00:11,290 --> 00:00:14,030 Tak dobre wieści i złe wieści. 6 00:00:14,030 --> 00:00:26,240 No wykład w poniedziałek, nie ma problemu ustawić w przyszłym tygodniu. [Studenci doping] 7 00:00:26,240 --> 00:00:28,680 Nie spodoba ci się, gdzie to będzie. 8 00:00:28,680 --> 00:00:31,590 Ale mamy to zamiast w środę, 9 00:00:31,590 --> 00:00:37,740 i nie jest też za Syllabus 1 wykładu piątek następny piątek, abyśmy mogli utrzymać się na torze. 10 00:00:37,740 --> 00:00:40,580 Ale wszystko będzie filmowany, jak zwykle, więc nie martw się. 11 00:00:40,580 --> 00:00:44,100 >> , Aw odniesieniu do quizu 0 co zrobimy w kierunku koniec tygodnia 12 00:00:44,100 --> 00:00:47,140 jest post na kursie w cs50.net homepage wyjaśnienie 13 00:00:47,140 --> 00:00:50,160 z jakiego rodzaju oczekiwania powinno być, jeśli chodzi o pierwszy quiz. 14 00:00:50,160 --> 00:00:55,100 Ogólnie rzecz biorąc, będzie to test wielokrotnego wyboru, prawda-fałsz, krótka odpowiedź, krótkie problemy kodowania. 15 00:00:55,100 --> 00:00:57,360 Nie zamierzasz się spodziewać wdrożenia równowartość 16 00:00:57,360 --> 00:01:00,030 problemu, który można zobaczyć na PSET, dla których masz komputer 17 00:01:00,030 --> 00:01:03,240 i debugger i tym podobne, ale nie będą małe problemy kodowania. 18 00:01:03,240 --> 00:01:06,900 >> I rzeczywiście, najlepszym przewodnikiem do zorientować się co CS50 quizy są jak 19 00:01:06,900 --> 00:01:09,180 to udać się do cs50.net, przejdź do quizy link 20 00:01:09,180 --> 00:01:11,920 i można zobaczyć kilka ostatnich lat warto quizy. 21 00:01:11,920 --> 00:01:16,600 Wystarczy uświadomić sobie, że program nauczania nie zawsze była taka sama na przestrzeni lat. 22 00:01:16,600 --> 00:01:18,510 Czasami możemy dodać, czasem odejmowanie, 23 00:01:18,510 --> 00:01:20,670 więc jeśli widzisz jakiś temat na jednym z tych starych quizy 24 00:01:20,670 --> 00:01:25,380 że nie masz pojęcia, co to mówi, to albo, że nie obejmują go 25 00:01:25,380 --> 00:01:27,210 lub że nie obejmuje go. 26 00:01:27,210 --> 00:01:31,110 Ale w formie opinii, to niedziela, poniedziałek i wtorek 27 00:01:31,110 --> 00:01:34,770 jak również oczywiście-szerokiej sesji przeglądarki w niedzielę wieczorem - 28 00:01:34,770 --> 00:01:37,500 Czas i miejsce zostanie ogłoszone na stronie głównej kursu - 29 00:01:37,500 --> 00:01:40,120 wszyscy mają możliwość zapoznania się z przebiegiem bliźnich dydaktycznych 30 00:01:40,120 --> 00:01:44,830 Materiał tego roku, zarówno w sekcji i w pełnym klasy 31 00:01:44,830 --> 00:01:48,400 a te będą filmowane jak zwykle, jak również. 32 00:01:48,400 --> 00:01:53,380 >> Dobrze. Więc bez zbędnych ceregieli, jeden komentarz na pass / fail i dodaj / upuść. 33 00:01:53,380 --> 00:01:57,980 Może widzieliście moje notatki w nocy, i to jest tak naprawdę tylko niektóre dodatkowe uspokojenie 34 00:01:57,980 --> 00:02:01,250 że jeśli jesteś wśród tych, szczególnie mniej wygodne lub gdzieś pomiędzy 35 00:02:01,250 --> 00:02:04,870 i czujesz tylko trochę się nad głową, 36 00:02:04,870 --> 00:02:08,430 sobie sprawę, że rzeczywiście jest to normalne, i jest tam duży struktura wsparcia w miejscu, 37 00:02:08,430 --> 00:02:13,530 z których jeden dyżur byli zdecydowani poprawę wszystkich więcej na mój adres e ostatniej nocy, 38 00:02:13,530 --> 00:02:16,520 i uświadomić sobie, też, że opcja jak pass / fail dla klasy, podobnie jak to 39 00:02:16,520 --> 00:02:21,540 naprawdę ma jako mechanizm stępić kursu jak ta, 40 00:02:21,540 --> 00:02:24,200 tak, że ponownie jeśli wydatki te 10, 15, 20 godzin 41 00:02:24,200 --> 00:02:28,160 po prostu staramy się zdobyć Pset do pracy i wiesz, że 90-95% z drogi tam 42 00:02:28,160 --> 00:02:32,100 ale nie można znaleźć jakiś cholerny błąd, w pass / fail model, który znajduje się jakby w porządku. 43 00:02:32,100 --> 00:02:36,230 >> Chodzi o to, że z tego mechanizmu można następnie przejść skupić na innych psets 44 00:02:36,230 --> 00:02:39,530 ani spać, czy cokolwiek to jest, że chcesz się skupić. 45 00:02:39,530 --> 00:02:43,390 Tak więc okazuje się, że mają do tego nadchodzący wtorek - technicznie 5-gie poniedziałek, 46 00:02:43,390 --> 00:02:50,840 ale to jest święto, więc wtorek nadchodzi - przejście z przełęczy / nie lub vice versa stopniowanych. 47 00:02:50,840 --> 00:02:54,450 A jeśli jesteś naprawdę nad przepaścią i myśli spada całkowicie, 48 00:02:54,450 --> 00:02:56,440 proszę złap mnie po wykładzie lub wyślij mi wiadomość. 49 00:02:56,440 --> 00:02:59,990 Chcielibyśmy przynajmniej czacie przed licytować Adieu. 50 00:02:59,990 --> 00:03:03,470 Dobrze. Zaczęliśmy więc podjęcie kółka off po raz ostatni. 51 00:03:03,470 --> 00:03:06,030 W szczególności koncentruje się na ciąg. 52 00:03:06,030 --> 00:03:09,740 String jest coś, co jest deklarowane w bibliotece CS50, 53 00:03:09,740 --> 00:03:14,340 specjalnie w tym pliku o nazwie cs50.h które zaczniemy patrzeć na ten tydzień i następny. 54 00:03:14,340 --> 00:03:17,250 Ale łańcuch jest tak naprawdę tylko uproszczenie coś 55 00:03:17,250 --> 00:03:20,980 To trochę więcej arcanely opisany jako char *. 56 00:03:20,980 --> 00:03:24,090 Char jesteśmy zaznajomieni. To jest tylko jeden znak. 57 00:03:24,090 --> 00:03:28,010 Ale * od poniedziałku oznaczone co? >> [Uczeń] wskaźnik. 58 00:03:28,010 --> 00:03:31,290 Wskaźnik. A co to jest wskaźnik? >> [Uczeń] adres. 59 00:03:31,290 --> 00:03:33,420 >> To jak adres, lokalizację w pamięci. 60 00:03:33,420 --> 00:03:35,910 Co znajduje się adres lub miejsce lub pamięci? 61 00:03:35,910 --> 00:03:40,290 Ponownie, wszystkie z nas są w laptopy z koncertu lub 2 gigabajty pamięci RAM najprawdopodobniej te dni, 62 00:03:40,290 --> 00:03:44,160 i oznacza, że ​​masz miliard lub 2 miliard bajtów warte pamięci. 63 00:03:44,160 --> 00:03:46,240 I to naprawdę nie ma znaczenia, co to fizycznie wygląda, 64 00:03:46,240 --> 00:03:51,220 ale wziąć na wiarę, że można liczyć wszystkich pojedynczych bajtów własny laptop - 65 00:03:51,220 --> 00:03:54,580 Ten bajt jest 0, to bajt 1, to bajt 2000000000 - 66 00:03:54,580 --> 00:03:56,100 i to jest dokładnie to, co robi komputer. 67 00:03:56,100 --> 00:04:00,030 Po przydzielić miejsce dla jednej postaci, na przykład, 68 00:04:00,030 --> 00:04:02,480 to oczywiście musi żyć gdzieś w pamięci komputera, 69 00:04:02,480 --> 00:04:05,860 a może to jest w liczbie bajtów 12345, 70 00:04:05,860 --> 00:04:08,470 i to jest gdzieś tutaj, w pamięci komputera. 71 00:04:08,470 --> 00:04:12,630 Oraz adres, a następnie z tego znaku to 12345. 72 00:04:12,630 --> 00:04:16,140 >> Teraz, w tydzień 0 przez teraz do tej pory, nie mamy naprawdę zależało 73 00:04:16,140 --> 00:04:19,170 gdy w pamięci są przechowywane rzeczy, bo zazwyczaj używamy symboli, 74 00:04:19,170 --> 00:04:22,540 Zmienne i tablice rzeczywiście dostać w naszych danych. 75 00:04:22,540 --> 00:04:24,950 Ale od poniedziałku, a tym bardziej dziś, jesteś teraz będzie musiał 76 00:04:24,950 --> 00:04:27,710 tym bardziej ekspresyjne możliwości z programów piszących 77 00:04:27,710 --> 00:04:31,330 naprawdę manipulować pamięci komputera jednak widać pasuje, 78 00:04:31,330 --> 00:04:33,720 zarówno dla dobrych celów i na złe, 79 00:04:33,720 --> 00:04:39,620 błędy są bardzo często wynikiem w tym momencie w naukę tego rzeczy. 80 00:04:39,620 --> 00:04:42,460 Ale co to tak naprawdę znaczy być char *? 81 00:04:42,460 --> 00:04:46,140 Idziemy naprzód z powrotem - i wrócimy do Binky jak obiecałem dzisiaj. 82 00:04:46,140 --> 00:04:48,670 Chodźmy na prosty przykład tutaj. 83 00:04:48,670 --> 00:04:53,060 Pozwól mi zapisać ten plik jako compare.c, i niech mi tylko trochę kod szablonu tutaj 84 00:04:53,060 --> 00:05:00,490 tak jak stdio.h, niech również oddaję obejmują cs50.h. Będę powiększyć tam. 85 00:05:00,490 --> 00:05:05,850 Zacznę pisać główny int main (void), a teraz chcę zrobić coś takiego: 86 00:05:05,850 --> 00:05:13,520 printf ("Podaj mi napis:"), a potem użyję ciąg s pobiera getString 87 00:05:13,520 --> 00:05:16,750 aby ciąg od użytkownika, a następnie zamierzam poprosić użytkownika o innym. 88 00:05:16,750 --> 00:05:21,870 ("Daj mi jeszcze napis:") i mam zamiar zapytać je za pośrednictwem getString to dostać. 89 00:05:21,870 --> 00:05:27,020 Nazwijmy go t bo t jest po s i s to ładne imię dla łańcucha, jeśli jest to dość ogólne. 90 00:05:27,020 --> 00:05:30,030 Więc GetString, a teraz po prostu chcę zrobić test sanity i mam zamiar powiedzieć 91 00:05:30,030 --> 00:05:39,770 if (s == t) wtedy ja tylko powiem instrukcji printf ("Wpisano samo \ n"); 92 00:05:39,770 --> 00:05:45,520 jeszcze mam zamiar wydrukować coś takiego ("wpisałeś coś innego! \ n") 93 00:05:45,520 --> 00:05:48,460 lub cokolwiek zdanie będzie. Więc coś w tym stylu. 94 00:05:48,460 --> 00:05:52,200 Potem, jak zwykle, wrócę 0, które po prostu oznaczało, że nic złego się nie stało, 95 00:05:52,200 --> 00:05:54,400 i mam zamiar iść do przodu i skompilować i uruchomić ten program. 96 00:05:54,400 --> 00:05:56,540 >> Ale w poniedziałek prowadziliśmy ten program, 97 00:05:56,540 --> 00:06:00,420 i rzeczywiście powiedziano nam, że nie jest WITAJ cześć i do widzenia nie jest pożegnanie. 98 00:06:00,420 --> 00:06:03,140 Zachowanie widzieliśmy było trochę więcej jak to. 99 00:06:03,140 --> 00:06:11,450 Pozwól mi iść do mojego katalogu źródłowego, powiększyć tutaj, a niech robią porównania. 100 00:06:11,450 --> 00:06:14,570 Zestawione w porządku. Pozwólcie mi biegać porównać. Daj mi tekst: Hello. 101 00:06:14,570 --> 00:06:16,300 Daj mi jeszcze napis: Hello. 102 00:06:16,300 --> 00:06:18,000 Wpisałeś coś innego! 103 00:06:18,000 --> 00:06:22,650 Cóż, pozwól mi spróbować czegoś prostszego, jak 50, 50 lat. Wpisałeś coś innego! 104 00:06:22,650 --> 00:06:25,740 hi, hi. Tak wyraźnie, coś się tu dzieje. 105 00:06:25,740 --> 00:06:28,440 Ale co było wyjaśnienie, dlaczego? 106 00:06:28,440 --> 00:06:33,850 Najwyraźniej, linia 12 jest całkowicie dysfunkcjonalne. 107 00:06:34,300 --> 00:06:39,430 Co jest podstawowym problemem tutaj? Tak. >> [Uczeń] To porównywanie adresów. 108 00:06:39,430 --> 00:06:41,850 Tak, dokładnie. To faktycznie porównując adresy 109 00:06:41,850 --> 00:06:44,580 , w którym cześć i WITAJ są przechowywane. 110 00:06:44,580 --> 00:06:48,290 To nie jest porównanie litery Witam ponownie i ponownie, 111 00:06:48,290 --> 00:06:52,370 ponieważ to, co się naprawdę stało, cały czas używaliśmy getString - 112 00:06:52,370 --> 00:06:56,130 Ta tablica jest znowu naszym pamięci komputera, 113 00:06:56,130 --> 00:07:00,100 i powiedzmy, że ja nazywam getString po deklaracji zmiennej s. 114 00:07:00,100 --> 00:07:01,930 Co moja pamięć wygląda? 115 00:07:01,930 --> 00:07:07,070 Miejmy arbitralnie powiedzieć, że s wygląda. Jest to kwadrat. 116 00:07:07,070 --> 00:07:09,040 I prawie za każdym razem mam wyciągnąć kawałek pamięci na ekranie 117 00:07:09,040 --> 00:07:12,860 jeśli jest to 32 bity byłem rysowanie kwadratów, jak to, bo rzeczywiście w urządzenie, 118 00:07:12,860 --> 00:07:17,380 wskaźnik, adres, jest 32 bitów. To tak samo jak int. 119 00:07:17,380 --> 00:07:19,420 , Które mogą się zmieniać w zależności od systemu komputerowego. 120 00:07:19,420 --> 00:07:24,630 Ci z was, którzy są jakby znajome z faktem, że komputer Mac lub PC jest 64 bitów, 121 00:07:24,630 --> 00:07:28,120 faktycznie oznacza, że ​​komputer korzysta z 64-bitowych, 122 00:07:28,120 --> 00:07:33,730 64-bitowe adresy, a wśród upsides o to komputery 123 00:07:33,730 --> 00:07:35,560 może mieć znacznie więcej pamięci RAM niż przeszłości. 124 00:07:35,560 --> 00:07:39,240 Krótko mówiąc, z powrotem w dzień, gdy komputery używane tylko 32 bity 125 00:07:39,240 --> 00:07:42,740 do reprezentowania adresów, największą liczbę bajtów można reprezentować 126 00:07:42,740 --> 00:07:46,280 w tym przypadku było to, co, jeśli masz 32 bity? 127 00:07:46,280 --> 00:07:49,590 Więc 4 mld rację, bo 2 do 32 wynosi 4 mld euro. 128 00:07:49,590 --> 00:07:51,370 Ta liczba jest ponownie w ciągu. 129 00:07:51,370 --> 00:07:55,240 >> Więc jeśli masz tylko 32 bitów, najwięcej można liczyć na to około 4 mld euro. 130 00:07:55,240 --> 00:07:58,750 Ale to było fundamentalne ograniczenie komputerów dopiero kilka lat temu 131 00:07:58,750 --> 00:08:01,180 bo czy można liczyć tylko tak wysoka, jak 4 miliardy, 132 00:08:01,180 --> 00:08:05,270 to nie ma znaczenia, jeśli kupisz 8 GB pamięci RAM, a nawet 5 GB pamięci RAM; 133 00:08:05,270 --> 00:08:07,780 nie można liczyć, że wysoki, więc to było bezużyteczne. 134 00:08:07,780 --> 00:08:11,430 Można było tylko przejść pierwsze 3 lub 4 gigabajtów pamięci komputera. 135 00:08:11,430 --> 00:08:14,410 To jest mniejszy problem teraz, a możesz kupić Zalety MacBook i Dells 136 00:08:14,410 --> 00:08:17,680 z 8 GB pamięci RAM, a nawet więcej tych dni. 137 00:08:17,680 --> 00:08:24,100 Ale jeśli mogę przeznaczyć po prostu w tym programie wskaźnik, wskaźnik nazywane s, 138 00:08:24,100 --> 00:08:28,370 może to wyglądać na ekranie, bo rzeczywiście trzeba odwinąć tej warstwy. 139 00:08:28,370 --> 00:08:33,520 Trzymam ciąg mówi, ale od poniedziałku, ciąg jest bardzo char *, 140 00:08:33,520 --> 00:08:35,590 adresy niektórych postaci. 141 00:08:35,590 --> 00:08:39,280 Więc weźmy to koło szkolenia off chociaż będziemy nadal korzystać getString teraz. 142 00:08:39,280 --> 00:08:42,600 Tak już zadeklarowane s, a to jest fragment pamięci, 32 bitów. 143 00:08:42,600 --> 00:08:47,370 Co tu w pamięci domyślnie? >> [Niesłyszalne odpowiedź uczeń] 144 00:08:47,370 --> 00:08:50,040 Co to jest? >> [Uczeń] Garbage. Garbage. >> Dokładnie. 145 00:08:50,040 --> 00:08:54,610 Jeśli programista nie umieścić wartość w zmiennej, który wie, co to jest? 146 00:08:54,610 --> 00:08:57,990 Czasami masz szczęście i to jest 0, co jest raczej miłym, czystym wartości domyślnej 147 00:08:57,990 --> 00:09:00,310 ale jak widzieliśmy poniedziałek, czasami jest to kompletna bzdura, 148 00:09:00,310 --> 00:09:04,130 niektóre naprawdę duże dodatnią lub ujemną, który przyszedł skąd? 149 00:09:05,350 --> 00:09:07,010 Tak. >> [Uczeń] Funkcja wcześniej. >> Tak. 150 00:09:07,010 --> 00:09:10,170 >> Często nazywa się funkcja, ale wcześniej, bo pamiętam, 151 00:09:10,170 --> 00:09:13,920 jak wywoływanie funkcji w pamięci, że zajmują coraz więcej przestrzeni od dołu do góry, 152 00:09:13,920 --> 00:09:17,040 i jak tylko funkcja zwróci wartość, że pamięć zostanie ponownie 153 00:09:17,040 --> 00:09:20,890 przez kolejnego faceta, który zostanie wywołany, który jest przy użyciu tego samego kawałek pamięci. 154 00:09:20,890 --> 00:09:23,450 A jeśli masz lewy śmieci tam, poprzednie wartości, 155 00:09:23,450 --> 00:09:28,190 możemy pomylić s jako posiadające pewną wartość, gdy naprawdę nie mamy umieścić coś tam. 156 00:09:28,190 --> 00:09:30,960 Więc nasz RAM w tym momencie wygląda tak. 157 00:09:30,960 --> 00:09:36,030 Teraz na prawej stronie linii 7 mamy wywołanie getString, 158 00:09:36,030 --> 00:09:40,150 co robiliśmy teraz na tydzień, ale to, co jest naprawdę getString robisz? 159 00:09:40,150 --> 00:09:43,350 GetString napisany przez CS50 personelu jest mało inteligentny 160 00:09:43,350 --> 00:09:46,500 na tym, że jak tylko użytkownik uruchamia pisania klawisze i wciśnie ENTER, 161 00:09:46,500 --> 00:09:50,010 Liczby getString, ile klawiszy zrobili hit użytkownika, 162 00:09:50,010 --> 00:09:53,360 ile znaków muszę przydzielić pamięci RAM. 163 00:09:53,360 --> 00:09:55,660 I gdy RAM pochodzi, kto wie? 164 00:09:55,660 --> 00:09:58,930 Jest gdzieś w komputerze 2 GB lub etażerka pamięci. 165 00:09:58,930 --> 00:10:05,200 Ale załóżmy, że komputer znaleziono miejsca na słowo HELLO tutaj. 166 00:10:05,200 --> 00:10:08,710 Wpisałem słowo było H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 A jeśli rysujemy to jako ciąg znaków, który może wyciągnąć to tak. 168 00:10:13,510 --> 00:10:17,860 Ale muszę zrobić 1 ekstra rzeczy. Co należy w końcu dowolny ciąg w C? 169 00:10:17,860 --> 00:10:20,710 Znak null, który piszemy jako \ 0. 170 00:10:20,710 --> 00:10:23,980 To technicznie 0 numer, ale backslash robi zrozumiałość 171 00:10:23,980 --> 00:10:28,150 że jest to dosłownie liczbę 0, liczbę całkowitą 0; 172 00:10:28,150 --> 00:10:32,440 to nie jest, na przykład, cytuję-koniec cytatu 0, że możesz wpisać z klawiatury. 173 00:10:32,440 --> 00:10:33,940 Więc to jest Halo. 174 00:10:33,940 --> 00:10:36,350 >> A co możemy powiedzieć w poniedziałek, że funkcjonują jak getString 175 00:10:36,350 --> 00:10:39,580 faktycznie wszystkie te tygodnie wraca? 176 00:10:39,580 --> 00:10:43,960 To nie jest powrót ciąg per se, ponieważ tak naprawdę nie mają znaczenie 177 00:10:43,960 --> 00:10:47,710 bo struny nie istnieją. Są swego rodzaju produkcji w CS50 biblioteki. 178 00:10:47,710 --> 00:10:51,300 Co tak naprawdę jest string, bardziej technicznie? >> [Uczeń] To pierwszy znak. 179 00:10:51,300 --> 00:10:55,950 Dokładnie. Jest to po prostu adres pierwszego znaku, który użytkownik wpisze w. 180 00:10:55,950 --> 00:11:02,810 Więc jeśli moje słowo WITAJ kończy go na bajt nr 123, a następnie w bajcie numer 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, i tak dalej, tak, jeśli liczba bajtów moje na się od 0, 182 00:11:08,320 --> 00:11:12,650 co naprawdę GetString wraca jest dosłownie 123 numer. 183 00:11:12,650 --> 00:11:19,270 Więc co zostaje umieszczone w s jest 123 numer nie, H pismo, nie słowo HELLO, 184 00:11:19,270 --> 00:11:23,130 po prostu adres, pod którym można znaleźć pierwszą literę Hello. 185 00:11:23,130 --> 00:11:26,500 Ale to nie wydaje się wystarczająco. Poprosiłem cię o ciąg, a nie charakter. 186 00:11:26,500 --> 00:11:32,970 Jak więc albo komputer wie, że ello rodzaj przyjść z H? 187 00:11:35,760 --> 00:11:37,460 Co jest rodzajem porozumienia mamy? Tak. 188 00:11:37,460 --> 00:11:40,100 [Uczeń] To powtarza się znaleźć trochę więcej znaków. >> Dokładnie. 189 00:11:40,100 --> 00:11:44,570 >> Jest to człowiek-komputer konwencja której gdy masz do czynienia z tekstem, 190 00:11:44,570 --> 00:11:49,410 inaczej znany teraz jako char gwiazd, po prostu dowiedzieć się, 191 00:11:49,410 --> 00:11:54,350 gdzie koniec każdy ciąg w życiu jest tak naprawdę Iterowanie nad nim z pętli for 192 00:11:54,350 --> 00:11:57,820 pętla, cokolwiek, tak, że kiedy znajdziesz koniec łańcucha 193 00:11:57,820 --> 00:12:02,160 teraz można wywnioskować, że, och, całe słowo było Hello. 194 00:12:02,160 --> 00:12:04,820 Ci z was, z wcześniejszego doświadczenia programowania może wiedzieć w Javie 195 00:12:04,820 --> 00:12:09,880 można po prostu zadzwonić. długość oraz w innych językach można zadzwonić długość lub podobnego. 196 00:12:09,880 --> 00:12:14,060 To dlatego, że w wielu językach, szczególnie rzeczy zwane języki obiektowe, 197 00:12:14,060 --> 00:12:18,580 długość jest rodzaj coś zatopiony wewnątrz elementu danych się, 198 00:12:18,580 --> 00:12:24,000 podobnie jak my enkapsulacji identyfikatory i nazwiska i domy wewnątrz studenta w poniedziałek. 199 00:12:24,000 --> 00:12:28,700 C jest jednak znacznie niższy poziom. Nie ma obiektów lub klasy, jeśli nie słyszałem tych terminów wcześniej. 200 00:12:28,700 --> 00:12:31,490 Wszystko co musisz naprawdę adresy pamięci. 201 00:12:31,490 --> 00:12:35,540 Jest to więc rodzaj staromodnego sposobu przedstawiania ciekawych struktur danych. 202 00:12:35,540 --> 00:12:38,760 Masz wartość początkową jak adres pierwszego znaku 203 00:12:38,760 --> 00:12:42,340 a potem po prostu jakiś dowolny konwencja, że ​​każdy zgodzi się przestrzegać. 204 00:12:42,340 --> 00:12:46,420 Więc jak jest długość ciągu realizowane, nie proponujemy? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, co niektórzy z was teraz używane kilka razy. Jest to dość proste, prawda? 206 00:12:51,360 --> 00:12:53,060 To jest jak 2 linii kodu. 207 00:12:53,060 --> 00:12:56,140 To bardzo dużo dla pętli jakiejś, być może z dodatkowej zmiennej lokalnej. 208 00:12:56,140 --> 00:13:00,540 Ale strlen tylko musi podjąć wskaźnik, a następnie rozpocząć poszukiwania \ 0. 209 00:13:00,540 --> 00:13:05,190 >> I jak tylko go znajdzie, to może wrócić całkowitą liczbę kroków, które to wykonane w tym ciągu. 210 00:13:05,190 --> 00:13:07,150 Można więc z tego wywnioskować, co dzieje się dalej. 211 00:13:07,150 --> 00:13:11,850 Załóżmy następnie Oświadczam t jak zrobiłem w linii 10. 212 00:13:11,850 --> 00:13:14,280 To jest jakaś wartość śmieci. Kto wie, co w pierwszej kolejności? 213 00:13:14,280 --> 00:13:18,490 Ale na prawej stronie linii 10 dzwonię getString ponownie. 214 00:13:18,490 --> 00:13:20,050 Kto wie gdzie to kończy? 215 00:13:20,050 --> 00:13:23,830 Miejmy arbitralnie powiedzieć, że system operacyjny nie znaleziono miejsca na sposób tutaj. 216 00:13:23,830 --> 00:13:28,610 Tak się przypadkiem typ H-e-l-l-O znowu 217 00:13:28,610 --> 00:13:31,260 i tak można wyciągnąć ten sam rodzaj obrazu. 218 00:13:31,260 --> 00:13:34,290 Ale fakt, że mam przerysowany ten obraz jest celowe 219 00:13:34,290 --> 00:13:37,720 bo to jest inna WITAJ niż ten. 220 00:13:37,720 --> 00:13:43,920 Więc może to być miejsce 456, jest 457, i tak dalej. 221 00:13:43,920 --> 00:13:47,170 Więc co pobiera umieścić gdzie znak zapytania było kiedyś? 222 00:13:47,170 --> 00:13:50,190 W tym przypadku 456. 223 00:13:50,190 --> 00:13:53,540 Jesteśmy zbierając te liczby dowolnie bo tak naprawdę po dziś 224 00:13:53,540 --> 00:13:57,110 nie będziemy dbać o to, co tak bardzo, adres cokolwiek. 225 00:13:57,110 --> 00:14:02,690 Wszyscy dbamy o to, że możemy dowiedzieć się adres jakiegoś kawałka danych jak Halo. 226 00:14:02,690 --> 00:14:07,100 >> Tak naprawdę to, co większość ludzi robi w informatyce, gdy mówimy o adresy pamięci 227 00:14:07,100 --> 00:14:10,210 i mówić o wskaźniki konkretnie 228 00:14:10,210 --> 00:14:14,220 zamiast niepokoić zastanawianie się 123 - kogo to obchodzi, gdzie te rzeczy w rzeczywistości, 229 00:14:14,220 --> 00:14:17,440 Wiemy tylko, że jest to w pewnym numerycznego adresu - 230 00:14:17,440 --> 00:14:22,180 upraszczamy świat i po prostu powiedzieć, że jest skierowany do tej postaci 231 00:14:22,180 --> 00:14:25,080 i t jest skierowany w tym charakterze. 232 00:14:25,080 --> 00:14:27,430 A fakt, że jest to główna jest całkiem zamierzone 233 00:14:27,430 --> 00:14:31,610 bo dosłownie teraz s wskazuje na H i T jest wskazując na inny H 234 00:14:31,610 --> 00:14:34,720 , ponieważ na końcu dnia, to nie ma znaczenia, adres, 235 00:14:34,720 --> 00:14:40,240 ale to ma znaczenie, że mamy zdolność do wyrażania tego adresu z jakimś kawałkiem kodu. 236 00:14:40,240 --> 00:14:42,730 Tak naprawdę nie manipulował te adresy tylko jeszcze 237 00:14:42,730 --> 00:14:47,770 więc zobaczymy, gdzie możemy wtrącić i rodzaju robić rzeczy z wskaźników, 238 00:14:47,770 --> 00:14:52,030 ale teraz w kolejce 12 dosłownie jakie wartości mamy porównanie 239 00:14:52,030 --> 00:14:55,500 według tej historii w linii 12? 240 00:14:56,570 --> 00:15:01,290 Mówimy to 123 równa równa 456? I to na pewno nie przypadek. 241 00:15:01,290 --> 00:15:05,320 I nawet koncepcyjnie, wskaźnik ten na pewno nie jest taka sama, jak ta 242 00:15:05,320 --> 00:15:09,500 bo nazywa getString dwukrotnie i GetString nie stara się być super mądry, 243 00:15:09,500 --> 00:15:12,470 nie staramy się realizować, oh, wpisałeś WITAJ 5 minut temu; 244 00:15:12,470 --> 00:15:15,090 pozwól mi dać taki sam wskaźnik jak dałem ci wcześniej, 245 00:15:15,090 --> 00:15:18,450 to tylko alokuje nowy kawałek pamięci za każdym razem kiedy to nazwać. 246 00:15:18,450 --> 00:15:20,350 >> Jak więc rozwiązać ten problem? 247 00:15:20,350 --> 00:15:24,270 Jeśli wyższy poziom chcę porównać ciągi Witam i Hello - 248 00:15:24,270 --> 00:15:28,680 Nie dbam o wskaźniki - jak mam go o udzielenie odpowiedzi na pytanie, 249 00:15:28,680 --> 00:15:31,980 czy użytkownik wpisz to samo? Co jest tu potrzebne? Tak. 250 00:15:31,980 --> 00:15:35,200 [Uczeń] Użyj funkcji. >> Mogę użyć funkcji z pudełka. 251 00:15:35,200 --> 00:15:38,170 Można użyć funkcji nazwie strcmp, S-R-T-C-m-P, 252 00:15:38,170 --> 00:15:41,190 tylko skrócona wersja mówiąc ciąg porównania. 253 00:15:41,190 --> 00:15:45,070 I, jeśli się go, na przykład, porównaj 2, który jest jednym z dzisiejszych ulotek, 254 00:15:45,070 --> 00:15:46,690 I właśnie do tego. 255 00:15:46,690 --> 00:15:51,750 Ciągle wszystko inne samo z linii 1 na dół do 26 lub tak, 256 00:15:51,750 --> 00:15:54,360 i teraz to zauważyć, część zmieniła tylko trochę. 257 00:15:54,360 --> 00:15:57,690 Zignorujmy linii 28 na chwilę i skupić się tylko na tej jednej. 258 00:15:57,690 --> 00:16:00,410 Co możemy powiedzieć w poniedziałek, że str porównywania robi? 259 00:16:00,410 --> 00:16:05,200 Zajmuje proces podejmowania 2 wskaźniki, S i T w tym przypadku, 260 00:16:05,200 --> 00:16:08,480 rodzaj praktycznie oddanie jej palec na tych 2 liter, 261 00:16:08,480 --> 00:16:11,530 i to, co musi zrobić, to coś w pętli while lub do pętli, 262 00:16:11,530 --> 00:16:16,050 i mówi, są te same? Jeśli tak, to porusza palcami lub odsyłacze do przodu. 263 00:16:16,050 --> 00:16:17,970 Są one takie same, te same, to sam, 264 00:16:17,970 --> 00:16:22,710 te same, to sam? I ooch, jestem na końcu łańcucha, zarówno na s i t. 265 00:16:22,710 --> 00:16:26,780 Nie znalazłem żadnych sprzeczności. Tak, te słowa są takie same. 266 00:16:26,780 --> 00:16:31,940 A co str porównać zwrot, jeśli 2 ciągi są takie same, podobno? Zero. 267 00:16:31,940 --> 00:16:35,900 Więc 0 jest dobry w tym przypadku, ponieważ jeżeli zwraca -1 lub 1, 268 00:16:35,900 --> 00:16:40,560 oznacza to, że jest po prostu dzieje się przyjść przed t alfabetycznie lub po t. 269 00:16:40,560 --> 00:16:43,760 A dlaczego miałoby to być przydatne funkcję informujący, który ciąg znaków jest przed 270 00:16:43,760 --> 00:16:46,720 po lub w słowniku? 271 00:16:46,720 --> 00:16:48,740 [Uczeń] Wyszukiwanie. >> Wyszukiwanie i sortowanie. 272 00:16:48,740 --> 00:16:51,730 >> Tak można robić takie rzeczy jak binarny wyszukiwania lub sortowania bąbelkowego lub scalania sortowanie 273 00:16:51,730 --> 00:16:53,230 gdzie trzeba porównać rzeczy. 274 00:16:53,230 --> 00:16:56,420 Jak dotąd mamy rodzaj wyciąć niektóre rogi i tylko mówił o sortowaniu 275 00:16:56,420 --> 00:16:59,430 w kontekście liczb, ponieważ jest ładne i łatwe do powiedzenia, 276 00:16:59,430 --> 00:17:02,430 ale z pewnością można porównać ciągi, jabłko i banan, 277 00:17:02,430 --> 00:17:05,349 ponieważ jeśli jabłkowy są znane przed banana, podobnie 278 00:17:05,349 --> 00:17:09,319 można przejść wokół ciągów w pamięci, tak jak Rob zrobił z sortowanie korespondencji seryjnej w teledysku 279 00:17:09,319 --> 00:17:15,880 i my tutaj, na scenie z rodzaju selekcji, sortowania wstawiania, i sortowania bąbelkowego. 280 00:17:15,880 --> 00:17:18,710 Więc gdzie jeszcze można wziąć? Spróbujmy tego. 281 00:17:18,710 --> 00:17:23,980 Miejmy rodzaj zapomnieć tej lekcji na chwilę i spróbować teraz i skopiować 1.c, wykonaj następujące czynności. 282 00:17:23,980 --> 00:17:26,800 Zgodnie 21 Mówię coś druku 283 00:17:26,800 --> 00:17:28,520 potem dostaję ciąg od użytkownika, 284 00:17:28,520 --> 00:17:30,690 to ja jestem sprawdzenia tego. 285 00:17:30,690 --> 00:17:33,620 Tak naprawdę nie dostał jeszcze do tego nawyku, ale niech teraz to zrobić. 286 00:17:33,620 --> 00:17:40,990 Miejmy faktycznie odwinąć tej warstwy. To jest naprawdę char *. Ten facet jest naprawdę char *. 287 00:17:40,990 --> 00:17:45,690 Więc co to znaczy być sprawdzenie, czy s == NULL? 288 00:17:45,690 --> 00:17:48,380 Okazuje się, że podczas wywoływania funkcji takich jak getString 289 00:17:48,380 --> 00:17:51,540 lub bardziej ogólnie po prostu zapytać komputer dać trochę pamięci, 290 00:17:51,540 --> 00:17:53,030 coś może się nie udać. 291 00:17:53,030 --> 00:17:56,630 Możesz być szalony i zapytać komputer dla terabajt pamięci 292 00:17:56,630 --> 00:18:01,780 prosząc o bilionów bajtów pamięci, które po prostu nie istnieją w komputerze, 293 00:18:01,780 --> 00:18:05,130 ale i inne funkcje getString Potrzebuję sposób krzyczy na ciebie 294 00:18:05,130 --> 00:18:06,820 jeśli już prosić o zbyt wiele. 295 00:18:06,820 --> 00:18:10,450 A sposób GetString robi to jest, jeśli prosić o więcej pamięci 296 00:18:10,450 --> 00:18:14,250 niż jest dostępne w komputerze, nawet jeśli to jest super, super niskie prawdopodobieństwo 297 00:18:14,250 --> 00:18:17,730 bo nikt z nas nie będą wpisywać bilionów znaków, a następnie naciśnij klawisz Enter, 298 00:18:17,730 --> 00:18:21,980 ale mało prawdopodobne, choć może to być nadal chcę sprawdzić to tylko w przypadku, 299 00:18:21,980 --> 00:18:26,120 oraz specjalny wartość getString, odpowiedź, i inne funkcje powraca 300 00:18:26,120 --> 00:18:30,630 jeśli coś jest nie tak jest NULL we wszystkich czapkach. 301 00:18:30,630 --> 00:18:36,520 >> A co to jest NULL? NULL tak się reprezentować wskaźnik. Jest 0 adres pamięci. 302 00:18:36,520 --> 00:18:40,800 Świat uznał, że w sposób arbitralny, czy to mój komputer w pamięci - wiesz co? - 303 00:18:40,800 --> 00:18:46,260 mamy zamiar ukraść tylko 1 bajt w każdym pamięci komputera, a to położenie 0. 304 00:18:46,260 --> 00:18:49,560 Zamierzamy dać mu przydomek NULL, i będziemy obiecywać 305 00:18:49,560 --> 00:18:52,660 że nigdy nie faktycznie umieścić tam prawdziwych danych 306 00:18:52,660 --> 00:18:56,770 ponieważ po prostu arbitralnie potrzebują specjalnej wartości, 0, NULL, aka 307 00:18:56,770 --> 00:19:00,230 tak, że możemy krzyczeć na użytkowników, jeśli coś pójdzie źle. 308 00:19:00,230 --> 00:19:03,590 W przeciwnym razie może nie wiedzieć ma 0 oznacza już coś tutaj 309 00:19:03,590 --> 00:19:05,490 czy to znaczy, coś poszło nie tak? 310 00:19:05,490 --> 00:19:09,190 Musimy wszyscy zgadzają się, że nic nie oznacza NULL został zwrócony, 311 00:19:09,190 --> 00:19:11,700 żaden rzeczywisty adres został zwrócony. 312 00:19:11,700 --> 00:19:15,210 Teraz, tutaj jestem po prostu przyjęcie mej ludzkiej konwencji wrócę 1 z głównym 313 00:19:15,210 --> 00:19:17,040 Jeśli coś pójdzie nie tak. 314 00:19:17,040 --> 00:19:20,650 To dlatego, że konwencja Main powrót jest do powrotu 0, jeśli dobry, 315 00:19:20,650 --> 00:19:22,990 1 lub inna wartość, jeśli źle. 316 00:19:22,990 --> 00:19:28,200 Ale GetString i każda funkcja, która zajmuje w pamięci wraca NULL, jeśli coś pójdzie źle. 317 00:19:28,200 --> 00:19:33,480 >> Okay. Więc niestety, linia 27, super proste choć to zupełnie nie skopiować ciąg. 318 00:19:33,480 --> 00:19:35,740 Dlaczego? Widzimy to w następujący sposób. 319 00:19:35,740 --> 00:19:40,120 Jestem twierdząc w wierszu 27 do wykonywania kopii s, a nazywając to t. 320 00:19:40,120 --> 00:19:45,790 Więc nie pytam użytkownika o 2 łańcuchów to czasowych; Mówię tylko wartość w s 321 00:19:45,790 --> 00:19:47,870 należy umieścić w t, jak również. 322 00:19:47,870 --> 00:19:52,890 Więc teraz po prostu pokazać, jak złamane jest to, w wierszu 29 i nowsze, co ja robię? 323 00:19:52,890 --> 00:19:56,980 Najpierw jestem sprawdzenie czy długość t jest większy niż 0. 324 00:19:56,980 --> 00:19:59,330 Jest jakiś ciąg tam. Użytkownik wpisze coś w. 325 00:19:59,330 --> 00:20:03,410 Co to jest linia 32 robi, podobno? 326 00:20:03,410 --> 00:20:08,910 [Niesłyszalne odpowiedź uczeń] Prawo. >> Można wywnioskować, to trochę z tego, co mi powiedział, że to robi. 327 00:20:08,910 --> 00:20:13,200 Ale technicznie, co to robi? t [0] oznacza co? 328 00:20:13,200 --> 00:20:15,140 [Uczeń] znak 0-sza. >> [Malan] znak 0-cia. 329 00:20:15,140 --> 00:20:19,620 Lub, bardziej ludzkie, pierwszy znak w t, cokolwiek to jest, H może w tym przypadku. 330 00:20:19,620 --> 00:20:24,990 I toupper robi to, co mówi. To aktywuje się 0-cie charakter ton i zmienia ją. 331 00:20:24,990 --> 00:20:28,430 Więc oznacza to, wziąć 0-gie charakter t sprawiają, że wielkie litery, 332 00:20:28,430 --> 00:20:30,320 i umieścić go z powrotem w tym samym miejscu. 333 00:20:30,320 --> 00:20:35,540 Więc jeśli wpisz witam małymi literami, to powinien zmienić małą h do literą H. 334 00:20:35,540 --> 00:20:41,400 Ale problemem jest to, że w linii 35 i 36, co mam zrobić, to wydrukować nam s i t. 335 00:20:41,400 --> 00:20:43,120 A jakie jest twoje przeczucie? 336 00:20:43,120 --> 00:20:47,250 Co ja faktycznie się zobaczyć, czy mogę wpisać w cześć we wszystkich małych liter? 337 00:20:47,250 --> 00:20:52,280 Co się wydrukowany? >> [Niesłyszalne reakcja studentów] >> Co to jest? 338 00:20:52,280 --> 00:20:58,360 [Uczeń] Big H, a reszta mała. >> Duże H, a reszta mała, dla których s lub t? 339 00:20:58,360 --> 00:21:03,170 [Uczeń] Both. >> Both. Dokładnie. Zobaczmy więc, co się tutaj dzieje. 340 00:21:03,170 --> 00:21:08,380 >> Pozwólcie mi iść do przodu i skompilować. To Copy1, więc upewnij Copy1. Dobrze. 341 00:21:08,380 --> 00:21:14,840 Powiększyć Pozwól mi iść do przodu i uruchamiania Copy1, Enter, Powiedz coś: witam małe. 342 00:21:14,840 --> 00:21:19,570 Jest aktywowane kopię, ale najwyraźniej kapitalizowane oryginału, jak również, 343 00:21:19,570 --> 00:21:22,070 bo to, co teraz dzieje się w tej historii? 344 00:21:22,070 --> 00:21:27,030 W wierszu 27 nie faktycznie wydaje się być kopiowanie ciąg, 345 00:21:27,030 --> 00:21:30,450 ale nawet możesz mieć nadzieję, że intuicyjnie się w przypadku, 346 00:21:30,450 --> 00:21:33,680 jeśli myślisz o tym zdjęciu, co tak naprawdę zrobiłem? 347 00:21:33,680 --> 00:21:35,410 Połowa rysunku jest taka sama. 348 00:21:35,410 --> 00:21:39,390 Warto więc cofnąć się w czasie tak, że t nie istnieje jeszcze w historii. 349 00:21:39,390 --> 00:21:43,160 S może istnieć w historii, ale niech małe halo ten czas. 350 00:21:43,160 --> 00:21:46,710 Więc pozwól mi naprawić to, co tak naprawdę wpisane w. 351 00:21:46,710 --> 00:21:51,280 W tym przypadku mamy tu h-e-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Będziemy rysować ją jako ciąg znaków, umieścić moje wiersze separatora tutaj i mój \ 0. 353 00:21:58,050 --> 00:22:05,980 Tak to jest, gdzie jesteśmy, jak tylko linii 1 przez 24-ish, lub dać, nie wykonywane. 354 00:22:05,980 --> 00:22:07,800 To jest zdjęcie mojej pamięci. 355 00:22:07,800 --> 00:22:10,800 Kiedy dostanę się do linii 27, co się dzieje? 356 00:22:10,800 --> 00:22:14,730 Tak jak wcześniej, mam wskaźnik, co narysuję, jak ten plac. 357 00:22:14,730 --> 00:22:19,740 To się nazywa t. A co jest jego wartość domyślnie? Kto wie? Niektóre wartości śmieci. 358 00:22:19,740 --> 00:22:22,060 >> Tak abstrakcyjna, że ​​będę z dala jak znak zapytania. 359 00:22:22,060 --> 00:22:27,670 I jak tylko prawej stronie linii 27 wykonuje, co ja umieszczenie wewnątrz t? 360 00:22:27,670 --> 00:22:30,770 Samo, co jest w tych. 361 00:22:30,770 --> 00:22:34,120 Jeśli więc na chwilę usunąć tę abstrakcję strzałki i mówimy: 362 00:22:34,120 --> 00:22:40,330 Och, to jest adres obciążenie pamięci 123, kiedy mówisz t dostaje s, średnik, 363 00:22:40,330 --> 00:22:42,700 jesteś dosłownie oddanie 123 tutaj. 364 00:22:42,700 --> 00:22:45,200 Teraz jeśli rodzaj uprościć nasz świat ponownie ze zdjęciami, 365 00:22:45,200 --> 00:22:48,750 czego się tak naprawdę stało, to się po prostu dodaje kolejną strzałę do swojego świata 366 00:22:48,750 --> 00:22:52,910 który jest skierowany od t do tej samej dokładnie ciąg. 367 00:22:52,910 --> 00:22:59,730 Kiedy więc w linii 31 i 32 I faktycznie go o zmianę t [0], 368 00:22:59,730 --> 00:23:05,580 co t [0] wydaje się synonimem? a [0] 369 00:23:05,580 --> 00:23:07,030 Tak się to wszystko, co się dzieje. 370 00:23:07,030 --> 00:23:09,900 I chociaż ten rodzaj jest trochę niski poziom i arcane 371 00:23:09,900 --> 00:23:12,760 i tego rodzaju uczucie być może intuicyjnie powinno to właśnie działa - 372 00:23:12,760 --> 00:23:15,410 Zrobiłem kopie rzeczy przed i to po prostu działa - 373 00:23:15,410 --> 00:23:18,590 Jeśli naprawdę myślisz o tym, co naprawdę jest ciągiem, to char *. 374 00:23:18,590 --> 00:23:21,700 No, co jest? Jest adres jakiegoś znaku. 375 00:23:21,700 --> 00:23:24,930 Wtedy być może większy sens, że gdy próbujesz coś zrobić 376 00:23:24,930 --> 00:23:29,220 Super pozornie proste tak, wszystko co robisz jest kopiowanie adres pamięci. 377 00:23:29,220 --> 00:23:32,530 Nie jesteś rzeczywiście robi coś z samego łańcucha. 378 00:23:32,530 --> 00:23:37,500 Więc nawet jeśli nie masz pojęcia, jak można rozwiązać ten problem w kodzie, 379 00:23:37,500 --> 00:23:45,080 wysoki poziom, koncepcyjnie, co musimy zrobić, aby uczynić ta kopia s, najwyraźniej? 380 00:23:46,670 --> 00:23:48,820 Tak. >> [Uczeń] Daj mu nową lokalizację? >> Dokładnie. 381 00:23:48,820 --> 00:23:50,800 >> Musimy dać t zupełnie nową lokalizację. 382 00:23:50,800 --> 00:23:55,230 Musimy jakoś stworzyć świat, w którym możemy uzyskać nowy kawałek pamięci, 383 00:23:55,230 --> 00:24:00,090 co tylko dla jasności narysuję tuż pod tym jednym, ale to nie musi być. 384 00:24:00,090 --> 00:24:04,880 Ale to musi być w tym samym rozmiarze, więc rysuję te linie pionowe w tym samym miejscu. 385 00:24:04,880 --> 00:24:09,720 To jest w porządku, jeśli to wszystko śmieci początkowo. Kto wie, co tam było? 386 00:24:09,720 --> 00:24:13,850 Ale krok 1 będzie trzeba dać mi tyle pamięci, jak trzeba 387 00:24:13,850 --> 00:24:18,630 aby zmieścić kopię hello, a następnie dowiedzieć się, jak skopiować h tutaj, e tutaj, 388 00:24:18,630 --> 00:24:20,390 l o i tak dalej. 389 00:24:20,390 --> 00:24:24,880 Ale to już powinien czuć trochę oczywiste, nawet jeśli niektóre szczegóły są wciąż abstrakcyjne. 390 00:24:24,880 --> 00:24:28,690 Aby skopiować ten ciąg do tego, że to tylko na pętli lub pętli while 391 00:24:28,690 --> 00:24:31,580 lub coś, z którym stałeś się jeszcze bardziej znany. 392 00:24:31,580 --> 00:24:35,970 Warto więc spróbować. Pozwólcie mi iść do copy2.c. 393 00:24:35,970 --> 00:24:43,270 W copy2.c mamy prawie ten sam program, z wyjątkiem linii 27. 394 00:24:43,270 --> 00:24:47,260 Wygląda to trochę skomplikowane, ale jeśli mamy rozbicie go kawałek po kawałku, 395 00:24:47,260 --> 00:24:48,950 lewa strona jest taka sama. 396 00:24:48,950 --> 00:24:52,790 Char * t tworzy to coś w pamięci, choć ze znakiem zapytania 397 00:24:52,790 --> 00:24:54,680 ponieważ nie mamy pojęcia, co tam jest domyślnie. 398 00:24:54,680 --> 00:24:57,920 Z prawej strony mamy teraz wprowadza nową funkcję, malloc, 399 00:24:57,920 --> 00:25:00,640 dla pamięci przydzielić mi pamięć, 400 00:25:00,640 --> 00:25:06,900 i to podobno ma jak wiele argumentów, jak wiele rzeczy w nawiasach? 401 00:25:09,660 --> 00:25:12,130 Słyszałem szemranie o 1 i 2, ale to jest tylko 1. 402 00:25:12,130 --> 00:25:15,320 Nie ma przecinek, co oznacza, że ​​tylko 1 rzecz w nawiasie. 403 00:25:15,320 --> 00:25:17,720 Nawet jeśli nie ma innych nawiasów, pozwól mi zaznaczyć 404 00:25:17,720 --> 00:25:21,460 co jest w środku z najbardziej oddalonych nawiasach, i to jest to wyrażenie: 405 00:25:21,460 --> 00:25:25,880 (Strlen (s) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Jeśli więc faktycznie to przemyśleć, to mówi mi długości s. 407 00:25:29,190 --> 00:25:34,440 Dlaczego jestem, choć dodając 1 na długości? >> [Niesłyszalne odpowiedź uczeń] 408 00:25:34,440 --> 00:25:40,200 Dokładnie. Potrzebujemy miejsca dla tego faceta na ogonie, szósty znak, że nie ma znaczenia angielskiego 409 00:25:40,200 --> 00:25:42,250 ale ma specjalny programowy znaczenie. 410 00:25:42,250 --> 00:25:46,800 >> Więc potrzebujemy + 1 za to, bo strlen zwraca ludzkie oczekiwanie długości, 411 00:25:46,800 --> 00:25:50,890 komentarzy lub 5, nie dają dodatkowy znak null. 412 00:25:50,890 --> 00:25:52,980 Więc ręcznie dodać to ze + 1. 413 00:25:52,980 --> 00:25:56,060 A potem to, * rozmiar (char), nie widziałem tego wcześniej. 414 00:25:56,060 --> 00:25:57,480 To nie jest technicznie funkcji. 415 00:25:57,480 --> 00:26:04,150 Jest to specjalne słowo, że po prostu mówi, co rozmiar jest pewnego typu danych na komputerze 416 00:26:04,150 --> 00:26:06,980 ponieważ w rzeczywistości, niektórzy z nas mają 32-bitowe komputery. 417 00:26:06,980 --> 00:26:10,900 Mam dość stary komputer w domu, a używa tylko 32 bitów do reprezentowania wskaźniki. 418 00:26:10,900 --> 00:26:13,900 A jeśli tak zrobiłem rozmiar typu danych, może to być 32 bity. 419 00:26:13,900 --> 00:26:18,300 Ale jeśli używam mojego nowego ozdobnego komputer, być może wrócę wartość 64 bitów 420 00:26:18,300 --> 00:26:20,510 na coś takiego adresu. 421 00:26:20,510 --> 00:26:25,400 Więc w tym przypadku, po prostu jest super bezpieczny, nie idziemy na dysku coś podobnego kodu - 422 00:26:25,400 --> 00:26:28,740 dobrze, co to jest rozmiar char zgodnie z tym co mówiliśmy do tej pory? 423 00:26:28,740 --> 00:26:34,450 Mamy dość dużo mówi ustnie, że to 1 bajt, i to dość dużo prawda całej planszy. 424 00:26:34,450 --> 00:26:37,000 Ale znowu, założenia wydają się być złe. 425 00:26:37,000 --> 00:26:40,850 Prowadzą one do wadliwego oprogramowania, jeśli ludzie używają oprogramowania w sposób, który nie powinien. 426 00:26:40,850 --> 00:26:44,750 Więc to stąd abstrakcyjny i tylko bardziej ogólnie powiedzieć 427 00:26:44,750 --> 00:26:46,830 Muszę to wiele fragmentów pamięci 428 00:26:46,830 --> 00:26:50,210 a każdy fragment pamięci powinny odpowiadać wielkości charakteru 429 00:26:50,210 --> 00:26:54,870 która w rzeczywistości jest równa 1 w tym przypadku, ale jest to bardziej ogólny sposób pisania. 430 00:26:54,870 --> 00:27:00,460 Więc jeśli jest słowo hello, ile bajtów ma malloc podobno przeznaczyć komentarzy 431 00:27:00,460 --> 00:27:04,980 [Uczeń] Six. >> Six. Dokładnie tyle, ile mamy znaki zapytania na ekranie. 432 00:27:04,980 --> 00:27:07,800 A następnie podjąć Chyba teraz oparte na zrozumieniu getString 433 00:27:07,800 --> 00:27:12,790 co to malloc prawdopodobnie wrócić? >> [Uczeń] adres. 434 00:27:12,790 --> 00:27:17,020 Adres z czego? Pierwszy fragment pamięci. 435 00:27:17,020 --> 00:27:20,670 >> Nie mamy pojęcia, co tam jest, ponieważ niektóre inne funkcje 436 00:27:20,670 --> 00:27:23,010 można było za pomocą tej pamięci wcześniej. 437 00:27:23,010 --> 00:27:28,380 Ale malloc, jak getString, zwraca adres pierwszego bajtu pamięci 438 00:27:28,380 --> 00:27:30,540 że ona zarezerwowana dla Ciebie. 439 00:27:30,540 --> 00:27:38,380 Jednak to, co nie zrobić, to wypełnić puste ze znaku pustego odwrotnym ukośnikiem 440 00:27:38,380 --> 00:27:43,030 bo okazuje się, można użyć malloc przeznaczyć wszystko: wskazówki, ciągi znaków, tablice, 441 00:27:43,030 --> 00:27:45,700 pływaków, konstrukcje studentów. 442 00:27:45,700 --> 00:27:47,750 Możesz użyć malloc zupełnie ogólnie. 443 00:27:47,750 --> 00:27:51,470 To nie obchodzi lub wiedzieć, co masz przydzielania pamięci dla. 444 00:27:51,470 --> 00:27:55,810 Więc byłoby aroganckie dla malloc umieścić \ 0 445 00:27:55,810 --> 00:27:58,340 na koniec każdego kawałka pamięci, że daje ci 446 00:27:58,340 --> 00:28:02,620 bo to \ 0 jest to tylko konwencja ciągów. 447 00:28:02,620 --> 00:28:06,310 To nie jest używany do wskazówki, to nie jest używane dla pływaków, to nie jest używane dla studentów. 448 00:28:06,310 --> 00:28:11,730 I tak gotcha z malloc jest to, że ciężar jest wyłącznie od Ciebie programista 449 00:28:11,730 --> 00:28:16,790 pamiętać ile bajtów Ci przydzielone i nie kiedykolwiek użyć pętli for 450 00:28:16,790 --> 00:28:21,570 lub pętla i przejść obok granicy fragmencie pamięci, którą ci dał. 451 00:28:21,570 --> 00:28:23,540 Innymi słowy, jak najszybciej przydzielić pamięci, 452 00:28:23,540 --> 00:28:28,510 nie można prosić system operacyjny, och, tak przy okazji, jak duży fragment pamięci to było? 453 00:28:28,510 --> 00:28:32,080 To zależy wyłącznie od Ciebie, aby pamiętać, jeśli chcesz tę wartość. 454 00:28:32,080 --> 00:28:34,330 >> Zobaczmy więc, jak ja przystąpić do korzystania z tej pamięci. 455 00:28:34,330 --> 00:28:38,430 W linii 28 i 29, dlaczego ja to robię? 456 00:28:39,850 --> 00:28:42,260 Wystarczy całkowita kontrola poprawności. 457 00:28:42,260 --> 00:28:45,110 Tylko w przypadku, coś poszło nie tak, proszę o jakiś szalony ilości pamięci 458 00:28:45,110 --> 00:28:48,690 czy ja tak wiele rzeczy działa na komputerze, który nie tylko nie jest za mało pamięci, 459 00:28:48,690 --> 00:28:51,780 coś w tym stylu, to przynajmniej chcesz sprawdzić, null. 460 00:28:51,780 --> 00:28:55,260 W rzeczywistości, większość komputerów daje złudzenie, że każdy program 461 00:28:55,260 --> 00:28:57,080 może korzystać z całości pamięci RAM, 462 00:28:57,080 --> 00:29:00,740 ale i tak, jeśli użytkownik wpisze w jakiś szalony ciąg długi Może dlatego, że jesteś złym człowiekiem 463 00:29:00,740 --> 00:29:03,440 i są one rzeczywiście próbuje awarię programu lub włamać się do niego, 464 00:29:03,440 --> 00:29:07,300 chcesz przynajmniej sprawdzić wartość zwracaną malloc i czy jest równa null. 465 00:29:07,300 --> 00:29:11,630 A jeśli tak, to niech po prostu rzucić się teraz, bo nie wiem co zrobić w tym przypadku. 466 00:29:11,630 --> 00:29:13,950 Jak mogę skopiować ciąg? Jest kilka sposobów, aby to zrobić. 467 00:29:13,950 --> 00:29:18,850 Istnieje str skopiować funkcje w C, ale jest to bardzo proste dla nas, aby to zrobić w staromodny sposób. 468 00:29:18,850 --> 00:29:23,110 >> Pozwól mi najpierw dowiedzieć się, co długość s jest. 469 00:29:23,110 --> 00:29:26,930 Mógłbym umieścić to w pętli, ale zamiast po prostu umieścić go tutaj dla jasności. 470 00:29:26,930 --> 00:29:30,610 N zapisuje się więc długość oryginalnego łańcucha, który jest pozornie 5. 471 00:29:30,610 --> 00:29:35,290 Wtedy w mojej pętli for Mam iteracji od 0 o do n, 472 00:29:35,290 --> 00:29:40,940 i na każdej iteracji Kładę s [i] wewnątrz t [i]. 473 00:29:40,940 --> 00:29:45,060 Więc to, co ja z moimi 2 dorozumianych palców wskazujących na strunach przed. 474 00:29:45,060 --> 00:29:49,260 Jak to dla pętli iteracji tak, idę do kopiowania h do tutaj, 475 00:29:49,260 --> 00:29:52,890 e się tu do l, ponieważ ten jest S, to T. 476 00:29:52,890 --> 00:29:58,770 I wtedy wreszcie w linii 35, dlaczego ja to robię? 477 00:29:58,770 --> 00:30:03,770 Muszę się upewnić, że jestem kończąc t string. 478 00:30:03,770 --> 00:30:06,170 I zrobiłem to w ten sposób, aby być super wyraźne. 479 00:30:06,170 --> 00:30:09,510 Ale proponuję, kogoś, jeśli można, inny sposób to robi. 480 00:30:09,510 --> 00:30:13,930 I naprawdę nie trzeba wiersz 35. Jest inny sposób aby to zrobić. 481 00:30:13,930 --> 00:30:18,880 Tak. >> [Niesłyszalne reakcja studentów] >> Powiedz to głośniej. 482 00:30:18,880 --> 00:30:20,960 [Uczeń] Mniej niż lub równe. >> Dokładnie. 483 00:30:20,960 --> 00:30:24,450 Można powiedzieć, że po prostu mniej niż lub równe N, który w ogóle nie było złe 484 00:30:24,450 --> 00:30:28,190 ponieważ niemal zawsze, gdy idziemy do równa rzeczy Liczymy 485 00:30:28,190 --> 00:30:30,000 idziemy 1 krok za daleko. 486 00:30:30,000 --> 00:30:32,170 Ale pamiętaj, jak wiele bajtów mogliśmy przeznaczyć? 487 00:30:32,170 --> 00:30:37,210 Mamy przyznane strlen S, więc 5 + 1, w sumie 6. 488 00:30:37,210 --> 00:30:39,980 Więc w tym przypadku można było zrobić coś takiego 489 00:30:39,980 --> 00:30:46,450 tak, że jesteśmy nie tylko kopiowanie, ale również cześć \ 0 na samym końcu. 490 00:30:46,450 --> 00:30:49,860 Alternatywnie, możemy użyć funkcji o nazwie str kopiowanie, strcpy, 491 00:30:49,860 --> 00:30:51,700 ale to nie będzie aż tak dużo zabawy. 492 00:30:51,700 --> 00:30:54,000 Ale to wszystko robi się pod maską. 493 00:30:54,000 --> 00:30:56,050 Wtedy wreszcie możemy zrobić to samo, co wcześniej. 494 00:30:56,050 --> 00:31:01,620 I wykorzystać t, a potem twierdzą, że oryginał wygląda i kopia wygląda. 495 00:31:01,620 --> 00:31:08,570 Więc spróbujmy to teraz. Puść mnie tutaj. Producent copy2. Będziemy powiększać i uruchomić copy2. 496 00:31:08,570 --> 00:31:13,840 Zamierzam wpisać witam małymi literami, i rzeczywiście mam małe halo jak oryginał 497 00:31:13,840 --> 00:31:16,930 ale stolica Witaj na kopii. 498 00:31:16,930 --> 00:31:20,300 Ale ja nie skończyłem jeszcze. Muszę zrobić 1 ostatnią rzeczą tutaj. 499 00:31:20,300 --> 00:31:28,000 46 i 47 jest wyraźnie zwalniania pamięci, ale co to właściwie znaczy? 500 00:31:28,000 --> 00:31:33,250 Co robię, myślisz, dzwoniąc linii 46 i linii 47? 501 00:31:33,250 --> 00:31:38,900 Jaki wpływ to ma? Tak. 502 00:31:38,900 --> 00:31:43,140 [Niesłyszalne reakcja studentów] >> Dokładnie. 503 00:31:43,140 --> 00:31:46,380 >> Jesteś po prostu mówiąc system operacyjny, hey, dzięki za tą pamięcią. 504 00:31:46,380 --> 00:31:48,320 Teraz można używać go do kogoś innego. 505 00:31:48,320 --> 00:31:50,790 I tutaj jest doskonałym przykładem wartości śmieci. 506 00:31:50,790 --> 00:31:55,430 Właśnie tę pamięć używana do zapisywania słowo hello w 2 miejscach, 507 00:31:55,430 --> 00:31:57,490 tutaj, tutaj, tutaj i tutaj. 508 00:31:57,490 --> 00:32:00,910 Tak więc jest to H-L-e-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Ale potem zadzwonić linii 46 i linii 47, a wiesz, co tam się dzieje pod względem obrazu? 510 00:32:06,960 --> 00:32:10,010 Właściwie, czekaj, to zdjęcie jest stare. 511 00:32:10,010 --> 00:32:12,550 Kiedy wykonać kopię, ten facet jest faktycznie skierowany tutaj 512 00:32:12,550 --> 00:32:16,110 więc niech usunąć numery i po prostu streszczenie dala jak nasze strzały ponownie. 513 00:32:16,110 --> 00:32:19,370 Co się dzieje na tym zdjęciu, gdy zgłoszę darmo? 514 00:32:19,370 --> 00:32:22,750 [Niesłyszalne reakcja studentów] >> Nawet. 515 00:32:22,750 --> 00:32:29,510 Jeśli zadzwonić pod bezpłatny S i T - rodzaj podchwytliwe pytanie - to obraz nie zmienia się w ogóle 516 00:32:29,510 --> 00:32:33,880 bo dzwoni s oraz wzywając t tylko informuje system operacyjny, 517 00:32:33,880 --> 00:32:39,010 hej, można użyć tej pamięci na nowo, ale to nie zmienia to null 518 00:32:39,010 --> 00:32:41,840 lub jakiś znak specjalny, to nie ma to zmienić, 519 00:32:41,840 --> 00:32:47,350 to nie zmienia h lub E lub L lub L lub O w każdym miejscu, do niczego innego. 520 00:32:47,350 --> 00:32:51,610 Jeśli chodzi o zdjęcia, jak tylko zadzwonić bezpłatne, nic nie zmienia. 521 00:32:51,610 --> 00:32:56,570 I na tym polega pochodzenie wartości śmieci bo jeśli potem w tym programie 522 00:32:56,570 --> 00:33:01,010 zwrócić się do systemu operacyjnego, aby uzyskać więcej pamięci z getString lub malloc czy coś takiego 523 00:33:01,010 --> 00:33:04,900 i system operacyjny, mówi, na pewno, mam 12 bajtów pamięci tylko uwolnionych, 524 00:33:04,900 --> 00:33:08,080 korzystać z tych, co mają zamiar być przekazane? 525 00:33:08,080 --> 00:33:10,830 Masz zamiar zostać wydany kawałek pamięci, że będziemy rysować zazwyczaj 526 00:33:10,830 --> 00:33:13,700 ze znakami zapytania, ale co to są te znaki zapytania? 527 00:33:13,700 --> 00:33:17,000 Przebywają h-l-e-l-O-H-l-e-l O. 528 00:33:17,000 --> 00:33:20,940 To są nasze nowe wartości śmieci jak najszybciej zwolnić tej pamięci. 529 00:33:20,940 --> 00:33:22,750 >> Jest prawdziwa implikacja świat tutaj. 530 00:33:22,750 --> 00:33:24,720 Dzieje się to zrobić z pamięci RAM, ale komputery 531 00:33:24,720 --> 00:33:26,720 faktycznie zrobić to samo z dysku. 532 00:33:26,720 --> 00:33:30,620 Porozmawiamy o tym w szczególności przyszłego zbioru problemowego, który skupia się na kryminalistyce. 533 00:33:30,620 --> 00:33:36,170 Ale to, co naprawdę się dzieje, jeśli masz jakieś poufne finansowej plik na pulpicie 534 00:33:36,170 --> 00:33:39,600 lub niektórych szkicowy JPEG i przeciągnij ją do kosza, 535 00:33:39,600 --> 00:33:44,390 co się dzieje po przeciągnięciu go do kosza lub kosza? 536 00:33:44,390 --> 00:33:47,240 Wiedziałeś, co miałem na myśli. [Śmiech] 537 00:33:47,240 --> 00:33:52,370 Co się dzieje, kiedy już wyciągnął, że dowody w kosza lub kosza? 538 00:33:52,370 --> 00:33:55,920 [Niesłyszalne odpowiedź uczeń] 539 00:33:55,920 --> 00:33:58,000 Cóż, więc uważaj. Co się dzieje, kiedy to zrobić? 540 00:33:58,000 --> 00:34:01,030 Krótka odpowiedź brzmi: nic, prawda? 541 00:34:01,030 --> 00:34:04,790 Sketchy lub wrażliwe plik jest nadal tylko siedzi gdzieś tam w dysku twardym. 542 00:34:04,790 --> 00:34:07,940 Większość z nas przynajmniej nauczyłem się na własnej skórze, że trzeba opróżnić kosz 543 00:34:07,940 --> 00:34:10,429 lub twój kosz faktycznie usunąć pliki. 544 00:34:10,429 --> 00:34:13,440 I rzeczywiście, po kliknięciu prawym przyciskiem myszy lub Sterowanie Kliknij na śmietniku 545 00:34:13,440 --> 00:34:15,580 lub wybierz Plik, Opróżnij kosz lub cokolwiek 546 00:34:15,580 --> 00:34:21,420 i rzeczywiście opróżnienia kosza lub kosza, co faktycznie dzieje się potem do tego obrazu? 547 00:34:22,810 --> 00:34:25,969 Więcej nic. Więc nic faktycznie dzieje się na dysku. 548 00:34:25,969 --> 00:34:30,880 >> I jeśli tylko tymczasowo dygresję i pisać - ll wystarczy użyć tył to. 549 00:34:30,880 --> 00:34:34,639 Więc teraz historia się zmienia z pamięci RAM, co jest gdzie programy istnieją 550 00:34:34,639 --> 00:34:39,250 podczas biegu je na dysku, czyli tam, gdzie są one przechowywane długoterminowo 551 00:34:39,250 --> 00:34:42,920 nawet wtedy, gdy zgaśnie światło, teraz - i wrócimy do tego w przyszłości - 552 00:34:42,920 --> 00:34:46,380 niech po prostu udawać, że jest to dysk wewnątrz napędu komputera 553 00:34:46,380 --> 00:34:50,110 bo już w dzień kiedyś okrągłe tarcze, tak jak dyskietki. 554 00:34:50,110 --> 00:34:55,130 Więc jeśli masz jakieś poufne plik programu Excel, może podjąć się tego kawałek pamięci 555 00:34:55,130 --> 00:34:59,770 na dysku komputera, a ja po prostu rysunek sam dowolnego 1s i 0s. 556 00:34:59,770 --> 00:35:03,970 Po przeciągnięciu pliku podobnego do kosza lub kosza, 557 00:35:03,970 --> 00:35:07,750 dosłownie nic nie dzieje się dlatego, że Apple i Microsoft po prostu postanowił 558 00:35:07,750 --> 00:35:10,450 kosza, a kosz jest naprawdę tylko chwilowy zastępczy. 559 00:35:10,450 --> 00:35:14,710 Może w końcu OS będzie opróżnić go dla Ciebie, ale zwykle, nie robi nic, 560 00:35:14,710 --> 00:35:17,090 przynajmniej dopóki jesteś naprawdę mało miejsca. 561 00:35:17,090 --> 00:35:20,870 >> Jednak, gdy idziesz do pustego kosza lub pustego kosza, 562 00:35:20,870 --> 00:35:23,460 podobnie, nic się nie dzieje na tym zdjęciu. 563 00:35:23,460 --> 00:35:28,590 Wszystko, co się dzieje, jest w innym miejscu na komputerze, nie jest jakimś stole. 564 00:35:28,590 --> 00:35:35,400 To trochę jak mały arkusza ściągawki, które mówi, że, powiedzmy, resume.doc, 565 00:35:35,400 --> 00:35:40,920 więc swoje CV w pliku Microsoft Word żyli w miejscu 123 na dysku twardym, 566 00:35:40,920 --> 00:35:43,710 nie w pamięci, a nie w pamięci RAM, ale na dysku twardym, 567 00:35:43,710 --> 00:35:49,050 a twoje życie sketchy JPEG w 456, a plik Excel mieszka w 789 lub gdziekolwiek. 568 00:35:49,050 --> 00:35:53,640 Po usunięciu plików przez faktycznie opróżnianie kosza lub kosza, 569 00:35:53,640 --> 00:35:59,530 ten obraz nie zmienia się. 0s i 1s na dysku twardym, nie idź nigdzie. 570 00:35:59,530 --> 00:36:03,930 Ale ta tabela, ta mała baza danych z wszelkiego rodzaju, czy zmiany. 571 00:36:03,930 --> 00:36:08,750 Gdy usuwasz swoje CV, to tak, jakby plik został usunięty w pewnym sensie, 572 00:36:08,750 --> 00:36:12,790 ale komputer nie jest zapomnieć, gdzie to coś żyje na dysku twardym. 573 00:36:12,790 --> 00:36:17,870 0s i 1s że komponować swoje CV lub jakichkolwiek innych plików są nienaruszone. 574 00:36:17,870 --> 00:36:21,960 >> Więc jeśli zrobił to przypadkowo, nadal jest niezerowe prawdopodobieństwo 575 00:36:21,960 --> 00:36:25,800 że można odzyskać dane za pomocą programu Norton Utilities lub niektóre komercyjnego oprogramowania 576 00:36:25,800 --> 00:36:29,810 którego celem w życiu jest znalezienie 0s i 1s, które jakby zostały osierocone, 577 00:36:29,810 --> 00:36:33,300 Zapomnieliście tutaj, ale tutaj w lewo, tak, że można uzyskać dane z powrotem. 578 00:36:33,300 --> 00:36:38,410 Badacze z medycyny sądowej lub policji lub FBI rzeczywiście wziąć dysk 579 00:36:38,410 --> 00:36:42,550 i rzeczywiście szukać wzorców 0s i 1s, które wyglądają jak JPEG, wyglądają jak pliki Excel, 580 00:36:42,550 --> 00:36:46,400 i odzyskać je w ten sposób, nawet jeśli komputer zapomniał je tam. 581 00:36:46,400 --> 00:36:49,820 Tak naprawdę jedynym sposobem, aby usunąć dane, jak omówimy w przyszłości, 582 00:36:49,820 --> 00:36:54,190 jest do szorowania lub wytrzeć plik lub dysk twardy - 583 00:36:54,190 --> 00:36:56,540 Naprawdę nie można się pozbyć 0s i 1s 584 00:36:56,540 --> 00:36:59,440 bo inaczej chcesz zacząć gigabajtowym dysku twardym 585 00:36:59,440 --> 00:37:02,380 i chcesz skończyć z megabajt dysku twardym, jeśli stale były usuwanie, 586 00:37:02,380 --> 00:37:04,380 dosłownie 0s i 1s. 587 00:37:04,380 --> 00:37:06,310 Więc co zrobić, jeśli naprawdę chce pokryć swoje utwory 588 00:37:06,310 --> 00:37:10,510 i podstawowym problemem jest to, że jest jeszcze 0s i 1s na dysku? 589 00:37:10,510 --> 00:37:14,930 Widzę kogoś gestykulując, że fizycznie złamać urządzenie. Że będzie działać. 590 00:37:14,930 --> 00:37:19,600 [Śmiech] Ale jeśli to trochę drogie rozwiązanie, co byłoby bardziej rozsądne? 591 00:37:19,600 --> 00:37:23,270 Tak. >> [Uczeń] Zastąp je. Zastąp je >> co? >> [Uczeń] Inne dane. 592 00:37:23,270 --> 00:37:29,070 Inne dane. Można po prostu zastąpić dysk z 0s lub 1s lub wszystkich 0s, wszystkie 1s. 593 00:37:29,070 --> 00:37:31,230 >> I to jest rzeczywiście to, co niektóre z oprogramowaniem. 594 00:37:31,230 --> 00:37:33,570 Można kupić oprogramowanie lub nawet dostać wolnego oprogramowania, 595 00:37:33,570 --> 00:37:36,610 a nawet wbudowane w Mac OS tych dni, mniej w systemie Windows, 596 00:37:36,610 --> 00:37:38,660 jest możliwość, aby bezpiecznie usunąć. 597 00:37:38,660 --> 00:37:41,960 Właściwie, jeśli chcesz wszystkich home run dzisiaj, jeśli masz komputer Mac i to zrobić, 598 00:37:41,960 --> 00:37:45,740 jeśli masz trochę rzeczy w kosza, można zrobić Opróżnij Kosz bezpiecznie, 599 00:37:45,740 --> 00:37:47,610 który robi dokładnie to. 600 00:37:47,610 --> 00:37:53,350 A nie tylko pliki wymazywania tutaj, to nie kasuje 0s i 1s tutaj 601 00:37:53,350 --> 00:38:01,240 raczej, po prostu zmienia je wszystkie, na przykład, do 0 i kropka, kropka, kropka. 602 00:38:01,240 --> 00:38:05,330 Więc jednym z Twoich przyszłych psets rzeczywiście będzie celowo odzyskać dane - 603 00:38:05,330 --> 00:38:08,430 fotografie, które podjęliśmy z ludzi, miejsc i rzeczy, na terenie kampusu 604 00:38:08,430 --> 00:38:12,810 dla których zrobimy kryminalistycznych obraz cyfrowy na karcie pamięci aparatu, 605 00:38:12,810 --> 00:38:17,120 który jest dokładnie taki sam pomysł - i musisz być kwestionowane rzeczywiście znaleźć 606 00:38:17,120 --> 00:38:20,160 wzory, które reprezentują JPEG na twardym dysku, 607 00:38:20,160 --> 00:38:23,610 tak jak tego byłego studenta, którego email Czytałem kilka tygodni temu zrobił 608 00:38:23,610 --> 00:38:25,860 w celu odzyskania swojej siostry fotografie. 609 00:38:25,860 --> 00:38:30,300 Dlaczego nie zrobić 5-minutową przerwę, tutaj, a my przegrupować z więcej pamięci. 610 00:38:33,030 --> 00:38:38,610 Tak tu jest gdzie rzeczy trochę umysł gięcia, ale jest to bardzo potężny krok 611 00:38:38,610 --> 00:38:40,480 kierunku zrozumienia tego wszystkiego więcej. 612 00:38:40,480 --> 00:38:42,900 Tutaj jest program o nazwie pointers.c. 613 00:38:42,900 --> 00:38:45,430 Jest wśród dzisiejszej przykładowego kodu. 614 00:38:45,430 --> 00:38:51,280 Zauważ, że w pierwszych kilku liniach, 19 do 22, wszystko co robimy jest czymś getString 615 00:38:51,280 --> 00:38:54,460 i zwracanie adresu, przechowywanie go w sekundach. 616 00:38:54,460 --> 00:38:58,380 Odtąd dla Pset nawet 3 jeśli chcesz, ale pset 4 oraz 617 00:38:58,380 --> 00:39:01,030 gdzie można zacząć przyjmować te kółka off siebie, 618 00:39:01,030 --> 00:39:04,030 nie ma powodu, aby udawać, że struny istnieje. 619 00:39:04,030 --> 00:39:07,030 Na pewno jest to w porządku, aby po prostu zacząć mówić char *. 620 00:39:07,030 --> 00:39:12,610 >> Tak na marginesie, w internetowych referencje i w książkach można często zobaczyć gwiazdę obok zmiennej. 621 00:39:12,610 --> 00:39:15,600 Można nawet zobaczyć miejsca w okolicy obu jej stronach. 622 00:39:15,600 --> 00:39:17,680 Wszystkie te są funkcjonalnie poprawny. 623 00:39:17,680 --> 00:39:21,180 Na razie jednak, będziemy standaryzacji na tym podejściu do super jasne 624 00:39:21,180 --> 00:39:24,000 że char * to jak mówienie, wskaźnik znaków. 625 00:39:24,000 --> 00:39:25,680 To jest typ danych. 626 00:39:25,680 --> 00:39:28,730 I wtedy nazwa zmiennej jest s w tym przypadku. 627 00:39:28,730 --> 00:39:31,180 Więc staliśmy ciąg i nazwał to my s. 628 00:39:31,180 --> 00:39:35,180 A potem tu zauważyć, że robię właściwie trochę oszustwa. 629 00:39:35,180 --> 00:39:39,080 To się nazywa arytmetyczne wskaźnika, który jest swego rodzaju super proste. 630 00:39:39,080 --> 00:39:41,790 To oznacza tylko dodawać i odejmować liczby do wskaźników. 631 00:39:41,790 --> 00:39:43,660 Ale to faktycznie działa. 632 00:39:43,660 --> 00:39:49,170 Ten program podobno wypisuje łańcuch s 1 znak w każdym wierszu, takich, że końcowy wynik - 633 00:39:49,170 --> 00:39:54,920 Tylko tak możemy zepsuć, gdzie to będzie, sprawdź wskaźniki, uruchomić wskazówki, niech powiększyć 634 00:39:54,920 --> 00:39:58,940 Teraz niech mi typ w coś Witam i typ Enter 635 00:39:58,940 --> 00:40:01,080 i drukuje 1 znak w wierszu. 636 00:40:01,080 --> 00:40:04,730 Aż sekund temu, byśmy zrobili to z kwadratową notacji wspornika. 637 00:40:04,730 --> 00:40:09,760 Mielibyśmy do pętli i zrobimy printf z s [i] i chcemy to zrobić ponownie i ponownie i ponownie 638 00:40:09,760 --> 00:40:11,950 z n Backslashe na końcu każdej linii. 639 00:40:11,950 --> 00:40:16,800 Ale ten program jest inny. Ten program jest za pomocą dosłownie arytmetyki. 640 00:40:16,800 --> 00:40:18,860 Więc co tu się dzieje? 641 00:40:18,860 --> 00:40:24,720 Przede wszystkim, zanim jeszcze ta pętla wykonuje, co, żeby było jasne, to jest faktycznie? 642 00:40:24,720 --> 00:40:27,270 S? >> [Uczeń] adres. >> Adres. 643 00:40:27,270 --> 00:40:32,980 >> A to adres, w przypadku komentarzy, pierwszy znak w tym słowie, które jest godz. 644 00:40:32,980 --> 00:40:37,370 Tak więc jest to, w tym konkretnym przykładzie, adres godzin. 645 00:40:37,370 --> 00:40:41,850 Więc co to znaczy zrobić s + i? 646 00:40:41,850 --> 00:40:46,280 No, i zaczyna się od 0 w tym dla pętli. Zrobiliśmy, że wiele razy. 647 00:40:46,280 --> 00:40:49,760 I ma zamiar iść do długości łańcucha, najwyraźniej. 648 00:40:49,760 --> 00:40:53,950 Tak więc w pierwszym iteracji tej pętli, i to oczywiście 0. 649 00:40:53,950 --> 00:41:01,740 Więc to wyrażenie mówi s + i -, a, s +0--to oczywiście tylko s. 650 00:41:01,740 --> 00:41:04,320 Więc co to jest * s tutaj? 651 00:41:04,320 --> 00:41:08,530 Teraz używamy gwiazdę w nieco inny sposób. 652 00:41:08,530 --> 00:41:13,080 Pozwólcie mi iść do przodu i pozbyć t bo skończymy mówić o t i kopii tych. 653 00:41:13,080 --> 00:41:15,540 Teraz chcemy tylko opowiedzieć historię z udziałem s. 654 00:41:15,540 --> 00:41:20,090 I tak w tej chwili, po typu String, nasz świat wygląda zupełnie jak przedtem 655 00:41:20,090 --> 00:41:26,630 z tylko s przechowywania adresu h i ogólnie wskazuje na ciąg hello. 656 00:41:26,630 --> 00:41:33,170 Jeśli teraz zrobić linię * (s + i), spróbujmy to. 657 00:41:33,170 --> 00:41:40,140 Tak * (S + i). Pozwól, że uproszczenie to, ponieważ jest to 0, więc jest to * (s +0). 658 00:41:40,140 --> 00:41:43,790 Dobrze, chwileczkę. Dalsze uproszczenie. To * (S). 659 00:41:43,790 --> 00:41:47,020 Cóż, teraz nawiasy są głupie, więc teraz niech po prostu zrobić * s. 660 00:41:47,020 --> 00:41:50,540 Tak więc w pierwszej iteracji tej pętli, że linia, która jest podświetlona, ​​26, 661 00:41:50,540 --> 00:41:53,650 jest prawie równoważna drukowania to. 662 00:41:53,650 --> 00:41:56,040 Co to jest typ danych * s? 663 00:41:56,040 --> 00:42:00,770 W związku z tym, ponieważ gwiazda bywa przy s samej 664 00:42:00,770 --> 00:42:04,930 , ale bardziej szczegółowo, ponieważ są już stwierdzenie s, 665 00:42:04,930 --> 00:42:09,730 nie jesteśmy już utworzenie zmiennej, nie ma wzmianki o char * w linii 26, 666 00:42:09,730 --> 00:42:14,280 Nie ma wzmianki o ciąg słów kluczowych, są po prostu za pomocą zmiennej o nazwie s, 667 00:42:14,280 --> 00:42:19,650 Okazuje się teraz gwiazda ma nieco inne i, trzeba przyznać, myląc znaczenie. 668 00:42:19,650 --> 00:42:26,590 * S oznacza tu iść na adres w s i wydrukować cokolwiek tam jest. 669 00:42:26,590 --> 00:42:33,750 Więc s jest tutaj, * s jest - coś jak Chutes i drabiny, śledzić strzałkę - tutaj. 670 00:42:33,750 --> 00:42:35,850 Więc to jest * s. 671 00:42:35,850 --> 00:42:39,060 >> Więc co zostanie wydrukowane na pierwszej iteracji pętli w linii 26? 672 00:42:39,060 --> 00:42:42,170 Mogę wydrukować% C, która jest symbolem zastępczym charakterze, 673 00:42:42,170 --> 00:42:48,520 następnie \ n dla nowej linii. * (S + i) gdzie i jest 0 jest właśnie to. 674 00:42:48,520 --> 00:42:53,670 Więc co char mam umieścić w na% c? H. 675 00:42:53,670 --> 00:42:56,900 W następnej iteracji pętli - prawdopodobnie można zobaczyć, gdzie to się dzieje - 676 00:42:56,900 --> 00:43:01,350 Następna iteracji jest oczywiście 1, więc oznacza to, s +1, 677 00:43:01,350 --> 00:43:05,580 a teraz trzeba nawiasów bo teraz gwiazda musi powiedzieć 678 00:43:05,580 --> 00:43:08,620 przejdź do adresu pamięci s +1. 679 00:43:08,620 --> 00:43:14,170 Co to jest s? Miejmy cofnąć się w czasie i powiedzieć, że to główna teraz nie jest rzeczywiście robi nam żadnych przysług. 680 00:43:14,170 --> 00:43:18,450 Niech to dokładniej powiedzieć, że to jest przechowywanie 123 numer 681 00:43:18,450 --> 00:43:25,110 , ponieważ na początku tego ciągu cześć, to adres 123 jest 124, i tak dalej. 682 00:43:25,110 --> 00:43:30,550 Więc na drugiej iteracji, kiedy mówię, s. 1, to jak powiedzenie 123 1, 683 00:43:30,550 --> 00:43:35,340 inaczej znany jako 124, więc co char zostanie wydrukowany na drugiej iteracji? 684 00:43:35,340 --> 00:43:37,850 E na adres pamięci 124. 685 00:43:37,850 --> 00:43:44,440 Potem znowu +, 125, 126, 127, i to na szczęście zatrzymuje się przed pętla tu dostaliśmy 686 00:43:44,440 --> 00:43:49,040 ponieważ używam strlen, aby upewnić się, że nie liczy się zbyt wysoka. 687 00:43:49,040 --> 00:43:50,810 Więc to też jest to. 688 00:43:50,810 --> 00:43:55,000 Ponownie, to jest po prostu tak, jakbyśmy zrobili tydzień temu. 689 00:43:55,000 --> 00:43:59,200 Pozwól, że piszę to na linii poniżej, mimo że nie chcę tego robić obie. 690 00:43:59,200 --> 00:44:02,500 Obecnie jest identyczne z tym. 691 00:44:02,500 --> 00:44:08,310 >> Więc nawet jeśli jest to ciąg, jak dzwonię to za tydzień, s jest naprawdę char *. 692 00:44:08,310 --> 00:44:13,270 Więc jeśli chcemy być super anal, to naprawdę wypada napisać na specyficzny charakter 693 00:44:13,270 --> 00:44:17,490 at-tego miejsca za pomocą tych adresów numerycznych i gwiazda tego operatora, 694 00:44:17,490 --> 00:44:20,470 ale szczerze mówiąc, to jest po prostu tak dużo czystsze. Więc to nie jest złe. 695 00:44:20,470 --> 00:44:26,720 Nie ma powodu, aby przestać robić linii 27 tutaj, ale 26 jest funkcjonalnie taka sama, 696 00:44:26,720 --> 00:44:31,570 i jest funkcjonalnie takie same dokładnie powodów, że byliśmy omawianie tej pory. 697 00:44:31,570 --> 00:44:33,650 I wreszcie, 29 jest po prostu dobra praktyka. 698 00:44:33,650 --> 00:44:38,420 Telefonowanie bez s oznacza, że ​​teraz dajesz z powrotem pamięć GetString dał ci 699 00:44:38,420 --> 00:44:41,630 bo znowu, jak już wspomniałem poniedziałek, za tydzień getString 700 00:44:41,630 --> 00:44:44,180 został wprowadzenia błąd w kodzie. 701 00:44:44,180 --> 00:44:46,490 Kod na tydzień miała przecieki pamięci 702 00:44:46,490 --> 00:44:49,970 której zostałeś prosząc getString dla pamięci, ale nigdy nie zostały dając go z powrotem. 703 00:44:49,970 --> 00:44:53,410 I że został celowo wybrany przez nas pedagogicznie 704 00:44:53,410 --> 00:44:55,880 bo to jest po prostu zbyt wiele do myślenia na początku. 705 00:44:55,880 --> 00:44:57,710 Ale teraz potrzebujemy więcej symetrię. 706 00:44:57,710 --> 00:45:00,830 Jeśli spytasz komputer do pamięci, jak to jest w przypadku getString, 707 00:45:00,830 --> 00:45:02,820 jak to ma najwyraźniej na malloc, 708 00:45:02,820 --> 00:45:07,970 musisz teraz Pset 4 począwszy również bezpłatny takie pamięci. 709 00:45:07,970 --> 00:45:11,650 Zawiadomienie to jest inne od powiedzenia int n. 710 00:45:11,650 --> 00:45:15,040 Nie musisz uwolnić to, bo nie zadzwonił getString 711 00:45:15,040 --> 00:45:16,890 a nie wywołać malloc. 712 00:45:16,890 --> 00:45:20,610 >> I nawet jeśli nazywa getInt jak my w końcu zobaczyć, 713 00:45:20,610 --> 00:45:25,520 GetInt nie przydzielić pamięci dla ciebie, bo rzeczywiście można przejść wokół liczb całkowitych 714 00:45:25,520 --> 00:45:29,430 i pace i chars właśnie sposób robiliśmy przez kilka tygodni. 715 00:45:29,430 --> 00:45:33,960 Struny są jednak wyjątkowy, bo naprawdę są połączeniem wielu znaków. 716 00:45:33,960 --> 00:45:37,450 Więc oni są tylko różni się od znaków i pływaków oraz wskazówki i tym podobne. 717 00:45:37,450 --> 00:45:39,980 Ale wrócimy do tego, przed długi. 718 00:45:39,980 --> 00:45:44,920 Wszelkie pytania na owym początku wskaźniki? Tak. 719 00:45:44,920 --> 00:45:49,690 [Niesłyszalne pytanie uczeń] 720 00:45:49,690 --> 00:45:51,440 Ach, bardzo dobre pytanie. 721 00:45:51,440 --> 00:45:55,790 Jedną z niewielu rzeczy, C faktycznie robi dla Ciebie, co jest wygodne, 722 00:45:55,790 --> 00:46:00,110 są to dane dla ciebie co rozmiar jest typu danych 723 00:46:00,110 --> 00:46:03,060 a następnie robi to rodzaj rozmnażania dla Ciebie. 724 00:46:03,060 --> 00:46:06,610 To nie ma znaczenia w przypadku znaków, ponieważ prawie zawsze char jest 1 bajt, 725 00:46:06,610 --> 00:46:08,150 tak to właśnie działa. 726 00:46:08,150 --> 00:46:11,220 Ale dla dobra dyskusji, jeśli zostały rzeczywiście drukowania liczb całkowitych 727 00:46:11,220 --> 00:46:15,500 i próbowano wydrukować niektóre wartości s, który wskazując na liczbę całkowitą, 728 00:46:15,500 --> 00:46:20,720 Państwo również nie musiałby robić + 4 * i tylko dlatego, że int jest 4 bajty. 729 00:46:20,720 --> 00:46:25,780 Arytmetyczna wskaźnika oznacza, że ​​kompilator C i zrobić wszystko, matematyki dla Ciebie. 730 00:46:25,780 --> 00:46:29,190 Wszystko, co musisz się martwić o to liczenie w rodzaju ludzkim sensie. Tak. 731 00:46:29,190 --> 00:46:35,200 [Uczeń] Jeśli zadeklarować ciąg wewnątrz pętli for, masz do uwolnienia go później? 732 00:46:35,200 --> 00:46:36,760 Dobre pytanie. 733 00:46:36,760 --> 00:46:41,390 >> Jeśli zgłoszone w środku ciąg dla pętli, jest potrzebna, aby zwolnić go później? 734 00:46:41,390 --> 00:46:47,520 Wystarczy tylko wolnej pamięci, którą przydziela z getString lub malloc. 735 00:46:47,520 --> 00:46:53,110 Więc jeśli tylko powiedzieć coś takiego - powiem nawiasy klamrowe, tak teraz cały kod jest powiązane. 736 00:46:53,110 --> 00:46:58,580 Jeśli zrobił coś, aczkolwiek buggily, podobnie jak to, char * t = s, 737 00:46:58,580 --> 00:47:03,450 nie trzeba do wolnych t bo t nie obejmowała żadnej wzmianki malloc lub getString. 738 00:47:03,450 --> 00:47:08,960 Natomiast, jeśli to zrobił, GetString, to tak, trzeba byłoby wolnych t. 739 00:47:08,960 --> 00:47:14,350 I rzeczywiście, twoja jedyna szansa na to, że jest teraz wewnątrz tej pętli, w tym samym numerze zakresu 740 00:47:14,350 --> 00:47:16,060 że już omówione w przeszłości. 741 00:47:16,060 --> 00:47:18,830 W przeciwnym razie możesz być przydzielania pamięci, przydział pamięci, przydział pamięci, 742 00:47:18,830 --> 00:47:21,230 i na koniec, ponieważ jesteś programu poza pętli, 743 00:47:21,230 --> 00:47:24,240 t nie istnieje, ale nigdy nie powiedział, system operacyjny 744 00:47:24,240 --> 00:47:26,750 że nie trzeba, że ​​pamięć już. 745 00:47:26,750 --> 00:47:30,430 I niebawem, dla 4 lub 5 PSET będziemy wyposażyć się program o nazwie Valgrind, 746 00:47:30,430 --> 00:47:34,160 które jest podobne w duchu do GDB w tym, że ma nieco z tajemnej interfejsu 747 00:47:34,160 --> 00:47:35,750 ale jego celem w życiu jest aby ci pomóc. 748 00:47:35,750 --> 00:47:39,380 I Valgrind to program, który będzie w przyszłości szukać programów 749 00:47:39,380 --> 00:47:42,550 poszukuje wycieków pamięci, czy z getString lub malloc, 750 00:47:42,550 --> 00:47:47,800 którego zaczniemy przy tym bardziej jak zaprzestać używania CS50 bibliotekę tyle. 751 00:47:47,800 --> 00:47:53,030 W końcu teraz rodzaj słownictwa i rodzaj mentalnego modelu w teorii 752 00:47:53,030 --> 00:47:55,170 w którym, aby rozwiązać ten wadliwy program. 753 00:47:55,170 --> 00:47:59,410 >> Więc w tym wadliwy program, swap działa wewnątrz swapu 754 00:47:59,410 --> 00:48:05,280 ale nigdy tak naprawdę pracował w Głównym ponieważ główny przeszedł w xiy, wycofywania 755 00:48:05,280 --> 00:48:07,260 a te były przekazywane przez wartości w, że tak powiem. 756 00:48:07,260 --> 00:48:09,330 Ich kopie zostały przekazane swap. 757 00:48:09,330 --> 00:48:12,520 Do końca konwersji, A i B zostały faktycznie wymianie 758 00:48:12,520 --> 00:48:16,120 ale oczywiście x i y, jak rozmawialiśmy w poniedziałek, nie było. 759 00:48:16,120 --> 00:48:19,940 Więc proponuję na zielono tutaj, że to jest rzeczywiście rozwiązaniem. 760 00:48:19,940 --> 00:48:22,640 I faktycznie, pozwól mi przenieść moje gwiazdy po prostu być spójne 761 00:48:22,640 --> 00:48:24,440 choć znowu, funkcjonalnie nie ma to znaczenia. 762 00:48:24,440 --> 00:48:28,730 W przyszłości tydzień będziemy wyjaśnić, kiedy i dlaczego to ma znaczenie. 763 00:48:28,730 --> 00:48:30,600 Więc na zielono to rozwiązanie. 764 00:48:30,600 --> 00:48:33,700 Szczerze mówiąc, wygląda to dużo bałaganu, bo mam wszystkie z tych gwiazd. 765 00:48:33,700 --> 00:48:35,380 Pozwól mi wskazać jedną rzecz. 766 00:48:35,380 --> 00:48:40,040 Top line tutaj gdzie mówi int * i int * b 767 00:48:40,040 --> 00:48:42,820 jest zasadniczo robi to samo, co zawsze. 768 00:48:42,820 --> 00:48:47,070 Jest deklarując 2 argumenty lub parametry do wymiany, 769 00:48:47,070 --> 00:48:49,940 z których pierwszy jest int wskaźnik nazywa, 770 00:48:49,940 --> 00:48:53,100 z których drugi jest int wskaźnik zwany b. 771 00:48:53,100 --> 00:48:55,770 Jedyne, co nowego jest w tym miejscu fakt, że nie jest gwiazdą tam. 772 00:48:55,770 --> 00:48:59,340 >> Co to znaczy? Nie int, B nie jest int. 773 00:48:59,340 --> 00:49:04,100 To adres int, a b jest adres innej int. 774 00:49:04,100 --> 00:49:06,980 Tu, w tym miejscu przyznać, C dostaje mylące. 775 00:49:06,980 --> 00:49:09,790 Teraz używamy gwiazdą, ale ma inne znaczenie w tym kontekście. 776 00:49:09,790 --> 00:49:13,150 Ponieważ nie jesteśmy deklarowania wskaźników, jak jesteśmy tu, 777 00:49:13,150 --> 00:49:15,500 tutaj jesteśmy dereferencji rzeczy. 778 00:49:15,500 --> 00:49:21,520 Więc technicznie, gwiazda w tym kontekście pierwszej, drugiej i trzeciej linii wewnątrz swapu 779 00:49:21,520 --> 00:49:24,560 jest operator dereference, co oznacza po prostu tam iść. 780 00:49:24,560 --> 00:49:27,400 Tak, jak mój palec następnie strzałkę h, 781 00:49:27,400 --> 00:49:31,100 * Środkiem przejść do tego adresu i znajdź mi int, który jest tam. 782 00:49:31,100 --> 00:49:34,250 * Oznacza b Przejdź do adresu i przekazać mi, co tam jest. 783 00:49:34,250 --> 00:49:40,730 Więc odświeżanie obrazu z poniedziałek teraz używając stos ramek 784 00:49:40,730 --> 00:49:43,130 z których dolna będzie głównym, 785 00:49:43,130 --> 00:49:47,600 z których górna będzie wymiany, 786 00:49:47,600 --> 00:49:50,880 tak, że nasz świat wygląda tak jak poniedziałek, jak to. 787 00:49:50,880 --> 00:49:53,620 Oto fragment pamięci, że główny będzie używać. 788 00:49:53,620 --> 00:49:56,520 >> Przypomnijmy, od poniedziałku, że program po prostu mieliśmy 2 zmienne, 789 00:49:56,520 --> 00:50:01,930 jeden o nazwie X i jeden o nazwie r, a włożyłem numerami 1 i 2 tam. 790 00:50:01,930 --> 00:50:06,580 Teraz gdy zgłoszę zamienić jak ja w poniedziałek, 791 00:50:06,580 --> 00:50:11,000 wcześniej, gdy użyłem czerwonej wersji tego programu, który wygląda tak, 792 00:50:11,000 --> 00:50:17,470 Mam 2 parametry, A i B, i co piszemy tu i tu? 793 00:50:17,470 --> 00:50:21,160 Tylko 1 i 2, dosłownie kopiuje xiy. 794 00:50:21,160 --> 00:50:23,070 Dziś to zmienić. 795 00:50:23,070 --> 00:50:28,510 Dziś zamiast przekazując wskazówki i b będziemy przechodzić w 2 adresy. 796 00:50:28,510 --> 00:50:34,290 Te adresy stanie wskazać na wskazówki, ale te adresy nie są wskazówki siebie. 797 00:50:34,290 --> 00:50:37,330 Są to adresy. To jak adres pocztowy zamiast. 798 00:50:37,330 --> 00:50:40,580 Więc teraz musimy po prostu dać sobie trochę więcej szczegółów na ekranie. 799 00:50:40,580 --> 00:50:43,250 To jest mój pamięci komputera jak to było przez cały dzień. 800 00:50:43,250 --> 00:50:45,120 Teraz musimy trochę dowolny system numeracji. 801 00:50:45,120 --> 00:50:50,580 Więc powiedzmy, po prostu przez przypadek, że jest to adres w pamięci 123, 124. 802 00:50:50,580 --> 00:50:55,660 Powiedzmy, że jest to 125, to jest 126, i tak dalej, ale to jest całkowicie arbitralne. 803 00:50:55,660 --> 00:50:58,590 Musimy tylko trochę schemat numerowania w mojej pamięci. 804 00:50:58,590 --> 00:51:04,030 Więc teraz, kiedy faktycznie przechodzą w x i y, nie mam zamiaru przechodzić w xiy; 805 00:51:04,030 --> 00:51:08,400 Zamierzam przekazać w adres pocztowy, by tak rzec, z x i y 806 00:51:08,400 --> 00:51:11,870 tak, że to, co zostaje zapisane tu i tu nie jest 1 i 2, 807 00:51:11,870 --> 00:51:16,030 ale jeśli można zobaczyć mój mały tekst, jaki zostanie przeniesiony tu i tu? 808 00:51:16,030 --> 00:51:23,340 [Niesłyszalne reakcja studentów] >> Dokładnie. 123 dostaje umieścić tutaj i 124 pobiera umieścić tutaj. 809 00:51:23,340 --> 00:51:28,910 >> Teraz, ponieważ użyłem gwiazdę w tej pierwszej linii sposób tu na górze, 810 00:51:28,910 --> 00:51:34,340 mój program po prostu wie, że 123 i 124, choć są oczywiście liczbami całkowitymi 811 00:51:34,340 --> 00:51:40,160 że każdy człowiek mógł zauważyć, powinny one być interpretowane jako adresy, adresy numeryczne. 812 00:51:40,160 --> 00:51:43,250 Nie są one same w sobie wskazówki, są adresy, 813 00:51:43,250 --> 00:51:46,120 a to dlatego, że wyraźnie umieścić gwiazdy tam. 814 00:51:46,120 --> 00:51:51,360 Więc teraz w mojej pierwszej, drugiej i trzeciej linii rzeczywistego kodu, co dzieje się tutaj? 815 00:51:51,360 --> 00:51:53,380 Narysujmy resztę obrazu. 816 00:51:53,380 --> 00:51:56,980 Tmp jest tak jak to było w poniedziałek. Nic specjalnego tmp. 817 00:51:56,980 --> 00:52:03,060 To jest zaledwie 32 bity lokalne zmienne, i wewnątrz, że jestem podobno przechowywania wartości *. 818 00:52:03,060 --> 00:52:08,580 Teraz, jeśli tylko powiedział tmp =, co chciałbym umieścić tutaj? >> [Uczeń] 123. 819 00:52:08,580 --> 00:52:10,370 123. Ale to nie jest to, co robię. 820 00:52:10,370 --> 00:52:13,670 Mówię tmp = *. Oznacza gwiazdkowe tam. 821 00:52:13,670 --> 00:52:19,370 Tak tu jest, 123. Jak mam tam iść? Udawaj, że jak nie ma strzałki. 822 00:52:19,370 --> 00:52:24,460 Także, że jest on, 1. Więc co dostaje przechowywane w tmp, najwyraźniej? Tylko 1. 823 00:52:24,460 --> 00:52:29,620 Tak więc inaczej mówiąc, TMP jest * a, * środkiem Do adres, który jest obecnie, 824 00:52:29,620 --> 00:52:31,320 który jest podobno 123. 825 00:52:31,320 --> 00:52:33,910 >> Dobra, jesteśmy na miejscu 123, widzę numer 1, 826 00:52:33,910 --> 00:52:35,670 więc mam zamiar umieścić numer 1 tam. 827 00:52:35,670 --> 00:52:39,020 Co mam teraz zrobić, w wierszu 2, * = * b? 828 00:52:39,020 --> 00:52:44,570 Ten jest trochę bardziej zaangażowane, ponieważ teraz to, co jest? Jest 123. 829 00:52:44,570 --> 00:52:50,220 Więc * jest gdzie? Tam, gdzie byłem wcześniej. Więc idź tam. Okay. 830 00:52:50,220 --> 00:52:53,420 Teraz, wreszcie, w końcu to zacznie mieć sens, mam nadzieję, 831 00:52:53,420 --> 00:53:00,280 * B oznacza, co jest w B? 124. Więc muszę tam iść, co jest 2. 832 00:53:00,280 --> 00:53:03,430 Więc co mam umieścić gdzie? 833 00:53:03,430 --> 00:53:10,100 2 przechodzi tu, bo * b przechodzi w *. Więc będę robić. 834 00:53:10,100 --> 00:53:13,120 I widać już, być może, że jesteśmy o wiele bliżej 835 00:53:13,120 --> 00:53:17,710 do rozwiązania tego głupiego, prostego problemu poprawnie po raz pierwszy 836 00:53:17,710 --> 00:53:20,920 bo teraz mamy jeszcze pamięta co było x, 837 00:53:20,920 --> 00:53:23,230 mamy 2 egzemplarze, co prawda, y, 838 00:53:23,230 --> 00:53:25,850 ale linia 3 teraz mówi, * b. 839 00:53:25,850 --> 00:53:31,080 Tak tu jest b. * Oznacza b tam. Więc gdzie jest miejsce 124? 840 00:53:31,080 --> 00:53:35,560 To najwyraźniej tutaj. Więc co mogę umieścić tutaj? Oczywiście, tmp. 841 00:53:35,560 --> 00:53:39,600 Więc teraz to zrobić. Więc mam 1 tu i 2 tutaj. 842 00:53:39,600 --> 00:53:43,560 A teraz, co o tym wszystkim, 123, 124, a 1? 843 00:53:43,560 --> 00:53:47,910 Jak tylko wraca swap, ta pamięć jest tak dobra, jak porażka 844 00:53:47,910 --> 00:53:51,070 bo jak tylko zwrotów typu swap, system operacyjny 845 00:53:51,070 --> 00:53:54,190 jest do wykorzystania tej pamięci ponownie w przyszłości. 846 00:53:54,190 --> 00:53:58,870 Tylko w pamięci głównej, na dole stosu tzw wystaje wokół. 847 00:53:58,870 --> 00:54:01,470 >> I tak w końcu mamy teraz wersję roboczą. 848 00:54:01,470 --> 00:54:06,310 Pozwólcie mi iść do swap.c i zauważyć, co następuje. 849 00:54:06,310 --> 00:54:11,280 Na początku programu Zmieniłem prototypu jest int a * b * int. 850 00:54:11,280 --> 00:54:15,000 Jedyne więc zmieniłem przejść z czerwonym, który był zły, na zielony, co jest dobre, 851 00:54:15,000 --> 00:54:17,350 jest dodałem te gwiazdy dziś. 852 00:54:17,350 --> 00:54:21,520 Ale wtedy tutaj w zamienić się musiałem skopiować, wkleić to, co było po prostu na slajdzie. 853 00:54:21,520 --> 00:54:24,140 Mam tu gwiazda, gwiazda tutaj - który pasuje do prototypu - 854 00:54:24,140 --> 00:54:27,930 a wszystkie te rzeczy mają teraz gwiazdy oprócz tmp 855 00:54:27,930 --> 00:54:30,680 ponieważ stosowanie zmiennej tymczasowej, nie ma nic nowego. 856 00:54:30,680 --> 00:54:33,040 Muszę tylko tymczasowe magazynowanie dla int. 857 00:54:33,040 --> 00:54:34,820 Więc nie musimy gwiazdę tam. 858 00:54:34,820 --> 00:54:39,310 Musimy tylko gwiazdę tak, że możemy przekroczyć tego rodzaju arbitralnej granicy 859 00:54:39,310 --> 00:54:42,900 między tymi 2 klatek w mojej pamięci komputera. 860 00:54:42,900 --> 00:54:45,630 Ale jedna rzecz musi się zmienić, a może nie dostrzegł go już. 861 00:54:45,630 --> 00:54:48,810 Co druga linia jest oczywiście teraz inaczej? >> [Uczeń] & x. 862 00:54:48,810 --> 00:54:53,270 >> Tak, więc 25 jest ostatni wiersz kodu trzeba zmienić, aby to zadziałało. 863 00:54:53,270 --> 00:54:58,360 Tydzień temu, a nawet w poniedziałek, linia 25 wygląda tak, swap xiy, 864 00:54:58,360 --> 00:55:02,020 i to było po prostu zepsuty, bo jeśli powiesz swap (x, y) 865 00:55:02,020 --> 00:55:05,660 dajesz kopie xiy do wymiany, to robi swoje, 866 00:55:05,660 --> 00:55:09,080 ale nigdy nie rzeczywiście się zmienia xiy sama. 867 00:55:09,080 --> 00:55:12,880 Tak więc, nawet jeśli nigdy wcześniej nie widziałem tego znaku przed z ampersand w kodzie, 868 00:55:12,880 --> 00:55:15,860 tylko zgadywać. Co ampersand robić, najwyraźniej? 869 00:55:15,860 --> 00:55:17,890 [Uczeń] Staje adres. >> Staje adres. 870 00:55:17,890 --> 00:55:21,160 Więc ampersand mówi dać mi adres x. 871 00:55:21,160 --> 00:55:25,590 Kto wie gdzie to jest? Zdarza się 123. Nie obchodzi mnie to. Daj mi adres x. 872 00:55:25,590 --> 00:55:28,340 & Y oznacza dać mi adres y. 873 00:55:28,340 --> 00:55:34,450 I w tym momencie historia jest całkowicie spójny z obrazem nakreśliliśmy chwilą. 874 00:55:34,450 --> 00:55:38,310 >> Więc muszę przyznać wskaźniki, na pewno dla mnie, gdy po raz pierwszy rozpoczęła naukę tego, 875 00:55:38,310 --> 00:55:40,570 była z pewnością jedną z najtrudniejszych rzeczy do zawijania zdanie wokół. 876 00:55:40,570 --> 00:55:43,760 Ale uświadomić sobie, szczególnie, że nadal grać z tego typu rzeczy, 877 00:55:43,760 --> 00:55:48,030 jeśli rozbicie go na te super proste rodzaju intelektualnie nieciekawe problemy 878 00:55:48,030 --> 00:55:52,270 po prostu przenoszenie numerów wokół, odpowiedź na wiele nieporozumień ze wskaźnikami 879 00:55:52,270 --> 00:55:56,590 rzeczywiście można otrzymać z tych podstawowych mechaniki bardzo. 880 00:55:56,590 --> 00:55:59,070 Tu jest adres. Tam z gwiazdy. 881 00:55:59,070 --> 00:56:03,830 Albo odwrotnie, tu ampersand. Dowiedzieć się, co adres jest w rzeczywistości. 882 00:56:03,830 --> 00:56:06,270 Dobrze. 883 00:56:06,270 --> 00:56:09,000 Więc gdzie jest wszystko to pochodzi z pamięci? 884 00:56:09,000 --> 00:56:12,360 Musimy wyciągnąć ten obraz kilka razy, i zachować obiecujące wrócimy do niego, 885 00:56:12,360 --> 00:56:14,920 ale tutaj jest reprezentacja pamięci komputera 886 00:56:14,920 --> 00:56:17,420 To trochę więcej niż nasz tablicy oznaczony tu jest. 887 00:56:17,420 --> 00:56:21,590 Fragment tekstu na górze reprezentuje to, co w odniesieniu do programu? 888 00:56:21,590 --> 00:56:26,090 [Niesłyszalne reakcja studentów] >> Przepraszam? Powtórz. 889 00:56:26,090 --> 00:56:28,660 [Uczeń] rzeczywisty program. >> Rzeczywisty program. 890 00:56:28,660 --> 00:56:32,430 >> Więc 0s i 1s, które zostały opracowane po napisaniu kodu w C, a następnie uruchomić Clang 891 00:56:32,430 --> 00:56:35,910 i generowania 0s i 1s kończy się uzyskiwanie schowany tam w pamięci 892 00:56:35,910 --> 00:56:38,570 ponieważ po dwukrotnym kliknięciu ikony na komputerze Mac lub PC 893 00:56:38,570 --> 00:56:43,010 lub uruchomić polecenie podobne do mario w znaku zachęty, Twój 0s i 1s z dysku 894 00:56:43,010 --> 00:56:45,700 ładowane do pamięci, tak, że komputer może nimi manipulować 895 00:56:45,700 --> 00:56:47,540 i wykonać je szybciej. 896 00:56:47,540 --> 00:56:50,880 Więc założone dane i niezainicjowanych danych, nie będziemy mówić zbyt wiele o tych, 897 00:56:50,880 --> 00:56:52,420 ale to są tylko zmienne globalne. 898 00:56:52,420 --> 00:56:54,710 Zainicjowany oznacza zmienne globalne, które dały wartości; 899 00:56:54,710 --> 00:56:59,300 niezainicjowanych oznacza zmienne globalne, które jeszcze nie dają wartości. 900 00:56:59,300 --> 00:57:01,900 Potem jest zmienne te, które ja całkowicie kołysanie na rękę, 901 00:57:01,900 --> 00:57:04,860 ale one tam są i że przechowuje takie rzeczy jak nazwy użytkownika 902 00:57:04,860 --> 00:57:08,090 oraz z innych gatunków niższych szczegółów szczebla. 903 00:57:08,090 --> 00:57:12,880 Ale najbardziej soczyste kawałki twojej pamięci w układzie jest ta rzecz zwana stosu i sterty. 904 00:57:12,880 --> 00:57:17,470 Stos ponownie, aby było jasne, to pamięć, która jest stosowana przy każdym funkcje są uruchamiane, 905 00:57:17,470 --> 00:57:19,710 gdy istnieją zmienne lokalne 906 00:57:19,710 --> 00:57:22,120 i kiedy tam są parametry były przekazywane wokół. 907 00:57:22,120 --> 00:57:24,490 Wszystko, co dzieje się w stos. 908 00:57:24,490 --> 00:57:29,570 Kupa nie rozmawialiśmy na temat, ale Zgadnijcie kto używa sterty. 909 00:57:31,120 --> 00:57:32,690 Tylko inny fragment pamięci. 910 00:57:32,690 --> 00:57:36,620 Zdarza się wyciągnąć w górę, ale to jest arbitralne obrazowym umowy. 911 00:57:36,620 --> 00:57:41,670 Kto najwyraźniej przy użyciu pamięci ze sterty za tydzień? 912 00:57:41,670 --> 00:57:44,830 To technicznie jesteś, ale pośrednio. >> [Uczeń] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString i malloc. Tak tu jest zasadnicza różnica. 914 00:57:47,950 --> 00:57:51,300 >> Wiesz, w ciągu ostatnich kilku tygodni, że jeśli potrzebujesz pamięci, wystarczy zadeklarować zmienną. 915 00:57:51,300 --> 00:57:54,560 Jeśli potrzebujesz dużo pamięci, zadeklarować tablicę tuż wewnątrz swojej funkcji. 916 00:57:54,560 --> 00:57:59,620 Ale problem mamy przechowywane skierowana jest jeśli deklarować zmienne lokalne wewnątrz funkcji, 917 00:57:59,620 --> 00:58:05,340 tak szybko jak to funkcja zwróci wartość, co dzieje się z pamięcią i tych zmiennych? 918 00:58:05,340 --> 00:58:09,620 Jakoś to już nie jest twoje, prawda? To po prostu znika, jakby koncepcyjnie. 919 00:58:09,620 --> 00:58:13,950 To wciąż tam fizycznie, oczywiście, ale to już nie jest jego prawo do korzystania. 920 00:58:13,950 --> 00:58:17,160 Jest to oczywiście problem, jeśli chcesz napisać funkcje w życiu 921 00:58:17,160 --> 00:58:20,440 że rzeczywiście przydzielić pamięci i nie chce go oddać natychmiast. 922 00:58:20,440 --> 00:58:24,180 Sprawa w punkcie: Celem getString się w życiu, to nie mam pojęcia z góry 923 00:58:24,180 --> 00:58:26,390 jak duży ciąg mam zamiar napisać na klawiaturze, 924 00:58:26,390 --> 00:58:30,390 ale to musi być w stanie przydzielić pamięci trzymać Dawida lub hello 925 00:58:30,390 --> 00:58:32,860 lub cały esej, że użytkownik może mieć wpisane w. 926 00:58:32,860 --> 00:58:35,280 Więc GetString używa malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc dlatego musi być używany, nie stos; 928 00:58:38,910 --> 00:58:40,770 zamiast tego używa to coś o nazwie sterty. 929 00:58:40,770 --> 00:58:44,430 Nie ma nic innego w pamięci. To nie szybciej lub wolniej lub coś w tym stylu. 930 00:58:44,430 --> 00:58:46,570 To jest po prostu fizycznie w innym miejscu. 931 00:58:46,570 --> 00:58:50,120 >> Ale regułą jest, że pamięć, która jest przeznaczona na stercie 932 00:58:50,120 --> 00:58:56,180 nigdy nie będzie wam zabrane, aż zadzwonisz - Zgadnijcie - free. 933 00:58:56,180 --> 00:59:00,510 Natomiast każda pamięć poprosić na stosie po prostu deklarując tablicę 934 00:59:00,510 --> 00:59:03,320 lub zadeklarowanie zmiennej jak robiliśmy przez kilka tygodni, 935 00:59:03,320 --> 00:59:05,640 domyślnie, że kończy się na stosie. 936 00:59:05,640 --> 00:59:09,550 I że działa bardzo 90% czasu, ale w tych przypadkach rzadszych 937 00:59:09,550 --> 00:59:12,470 której chcesz przydzielić pamięci i utrzymać ją wokół, 938 00:59:12,470 --> 00:59:14,730 następnie trzeba użyć funkcji takich jak malloc. 939 00:59:14,730 --> 00:59:19,370 Albo stosuje się funkcję jak GetString, które z kolei wykorzystuje malloc. 940 00:59:19,370 --> 00:59:23,300 Zobaczmy, co może się załamać, a następnie rzucić okiem na Binky. 941 00:59:23,300 --> 00:59:25,820 Wrócimy do tego w przyszłości. 942 00:59:25,820 --> 00:59:29,270 Tutaj jest bardzo prosty program, który w pierwszych 2 liniach co robi? 943 00:59:29,270 --> 00:59:33,460 W języku angielskim, co te pierwsze 2 linie kodu zrobić wewnątrz main? 944 00:59:33,460 --> 00:59:35,600 [Niesłyszalne odpowiedź uczeń] 945 00:59:35,600 --> 00:59:37,880 Ostrożnie. To nie daje mi adres x lub y. 946 00:59:37,880 --> 00:59:41,840 [Uczeń] Daje wskazówki do wskazówki. >> Dobrze. Daj mi 2 wskaźniki do liczb całkowitych. 947 00:59:41,840 --> 00:59:45,130 Innymi słowy, daj mi 2 kawałki pamięci trzymam dzisiaj, rysunek 948 00:59:45,130 --> 00:59:46,950 choć usunięte to teraz, jako kwadraty. 949 00:59:46,950 --> 00:59:50,000 Daj mi 2 kawałki pamięci, o nazwie x, jeden o nazwie Y - 950 00:59:50,000 --> 00:59:54,320 wcześniej nazwałem je s i t - i co to jest typ tego kawałka pamięci? 951 00:59:54,320 --> 00:59:57,160 To będzie przechowywać adres. 952 00:59:57,160 --> 00:59:59,110 To z * typu int. 953 00:59:59,110 --> 01:00:01,630 >> Więc adres int końcu żyć w X, 954 01:00:01,630 --> 01:00:03,860 adres int końcu żyć w y, 955 01:00:03,860 --> 01:00:08,460 ale na początku, co jest w środku x i y? Kto wie? Wartości śmieci. 956 01:00:08,460 --> 01:00:10,180 To nie ma nic wspólnego z wskaźniki. 957 01:00:10,180 --> 01:00:12,720 Jeśli nie mamy już coś tam, kto wie, co tak naprawdę tam jest? 958 01:00:12,720 --> 01:00:18,950 Teraz, x. Co tu się dzieje? To jest legalne, ponieważ teraz x jest wskaźnikiem. To int *. 959 01:00:18,950 --> 01:00:21,870 To znaczy, że mogę umieścić w x adres jakiegoś fragmentu pamięci. 960 01:00:21,870 --> 01:00:25,120 Co malloc powrócić? Perfect, zwraca adresy, 961 01:00:25,120 --> 01:00:28,510 adres pierwszego bajtu w całym fragmencie pamięci. 962 01:00:28,510 --> 01:00:31,140 Ile bajtów jest to najwyraźniej podziału, na przykład, w urządzeniu? 963 01:00:31,140 --> 01:00:33,510 Co jest rozmiar int? 4. 964 01:00:33,510 --> 01:00:36,600 Jeśli uważasz, że powrót do tygodni 1, to nie jest bardzo ważne, aby zawsze pamiętać, że 965 01:00:36,600 --> 01:00:38,870 , ale w tym przypadku jest to użyteczne informacje, 4 bajty. 966 01:00:38,870 --> 01:00:41,770 Więc to przeznacza na stercie 4 bajtów 967 01:00:41,770 --> 01:00:46,110 i to wraca adres pierwszego mnie arbitralnie. 968 01:00:46,110 --> 01:00:47,700 Teraz, co jest x robisz? 969 01:00:47,700 --> 01:00:52,200 * X = 42 robi co? 970 01:00:52,200 --> 01:00:57,150 Jeśli w tym momencie w historii mamy x, która wygląda z pewnej wartości śmieci, 971 01:00:57,150 --> 01:01:04,120 to jest teraz z pewnym y wartości śmieci, teraz w linii 3 Mam przyznane 4 bajty. 972 01:01:04,120 --> 01:01:06,950 Ten obraz w istocie wygląda. 973 01:01:06,950 --> 01:01:12,010 Lub bardziej konkretnie, czy jest to arbitralne adres 123, to właśnie nasza historia wygląda teraz. 974 01:01:12,010 --> 01:01:23,940 * X = 42 oznacza teraz co? To oznacza, że ​​należy przejść do 123 adresów i umieścić numer 42 tam. 975 01:01:23,940 --> 01:01:26,220 Nie muszę narysować te linie, ponieważ nie robimy sznurki. 976 01:01:26,220 --> 01:01:29,480 >> Powinienem tylko napisane, podobnie jak to, i tylko do demonstracji boską, 977 01:01:29,480 --> 01:01:33,240 42 jako int rodzaju zajmuje dużo miejsca, 4 bajty. 978 01:01:33,240 --> 01:01:35,960 Więc to jest to, co się tam stało, ale jest teraz problem. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Co wydarzy się tutaj? 980 01:01:40,580 --> 01:01:46,470 Problem jest y * w naszym uproszczonym świecie po prostu oznacza, przejdź do adresu w y. 981 01:01:46,470 --> 01:01:48,590 Co znajduje się w Y? To jest jakaś wartość śmieci. 982 01:01:48,590 --> 01:01:53,150 Więc załóżmy, że wartość śmieci jest 5551212, coś szalonego tak. 983 01:01:53,150 --> 01:01:56,750 * Oznacza r Idź do adresu 5551212. 984 01:01:56,750 --> 01:02:00,450 To jest tak, jak tutaj. Nie istnieje na przykład. 985 01:02:00,450 --> 01:02:05,310 Więc * y dostaje 13 oznacza Próbuję wyciągnąć 13 tutaj. To nie istnieje. 986 01:02:05,310 --> 01:02:08,790 I już przekroczył segment tablicy. Co mogę dostać? 987 01:02:08,790 --> 01:02:14,930 To tajemniczy błąd segmentacji wiadomość, ponieważ staram się umieścić w pamięci 988 01:02:14,930 --> 01:02:19,470 wartość jak 13 w miejscu, które nie istnieje. 989 01:02:19,470 --> 01:02:23,900 Pozostała część programu może działać dobrze, ale do tego momentu nie ma. 990 01:02:23,900 --> 01:02:25,350 Więc spróbujmy opowiedzieć tę historię. 991 01:02:25,350 --> 01:02:27,830 Wrócimy do tego po raz rozmawialiśmy o hex. 992 01:02:27,830 --> 01:02:30,290 Wróćmy do tego i zawarcia z tym czymś zwanym Binky, 993 01:02:30,290 --> 01:02:33,710 których odzyskanie jest profesorem Stanford siedzieć w domu grając z claymation, 994 01:02:33,710 --> 01:02:36,380 opowiadać dokładnie tego samego programu. 995 01:02:36,380 --> 01:02:40,580 To tylko około 3 minut. Tutaj mamy Binky. 996 01:02:40,580 --> 01:02:45,030 [Mężczyzna głośnik na video] Hey Binky, obudź się. To jest czas na zabawę wskaźnika. 997 01:02:45,030 --> 01:02:50,080 [Binky] Co to jest? Dowiedz się o wskaźniki? Oh, cukierek! 998 01:02:50,080 --> 01:02:53,700 [Mężczyzna głośnik] Cóż, zacząć, myślę, że będziemy potrzebować wskazówek para. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Dobra. Ten kod przydziela 2 wskaźniki, które można podpiąć do liczb całkowitych. 1000 01:02:57,890 --> 01:03:02,220 [Mężczyzna głośnik] Dobra. Cóż, widzę 2 wskaźniki, ale nie wydają się być skierowane do niczego. 1001 01:03:02,220 --> 01:03:05,550 [Binky] To prawda. Początkowo, wskaźniki nie wskazują na nic. 1002 01:03:05,550 --> 01:03:09,270 Rzeczy, które wskazują na nazywa pointees i ustawienie ich to oddzielny etap. 1003 01:03:09,270 --> 01:03:12,330 [Mężczyzna głośnik] Oh, racja, racja. Wiedziałem o tym. W pointees są oddzielne. 1004 01:03:12,330 --> 01:03:15,630 Er, więc jak można przydzielić pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Dobra. Ten kod alokuje nowy całkowitą pointee i ta część zawiera x zwrócić do niego. 1006 01:03:21,510 --> 01:03:23,500 [Mężczyzna głośnik] Hey, że wygląda lepiej. 1007 01:03:23,500 --> 01:03:26,030 Więc zrób to coś zrobić. >> [Binky] Dobra. 1008 01:03:26,030 --> 01:03:30,300 Będę dereference współrzędne x wskaźnik zapisać numer 42 w jego pointee. 1009 01:03:30,300 --> 01:03:34,410 Do tej sztuczki będziesz potrzebował mojej magicznej różdżki z dereferencji. 1010 01:03:34,410 --> 01:03:38,610 [Mężczyzna głośnik] Twoja magiczna różdżka z dereferencji? To świetnie. 1011 01:03:38,610 --> 01:03:44,230 [Binky] To jest to, co kod wygląda. Ja po prostu ustawić liczbę i ... [Popping dźwięk] 1012 01:03:44,230 --> 01:03:46,100 [Mężczyzna głośnik] Hey patrz, tam idzie. 1013 01:03:46,100 --> 01:03:50,990 Więc robi dereference na X następująco główna dostęp do swojego pointee, 1014 01:03:50,990 --> 01:03:53,230 w tym przypadku do przechowywania 42 w nie. 1015 01:03:53,230 --> 01:03:57,630 Hej, spróbuj go zapisać numer 13 przez innego wskaźnika, Y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Dobra. Pójdę tu do y i uzyskać numer 13 ustawić 1017 01:04:03,250 --> 01:04:08,360 a następnie podjąć Różdżka dereferencji i po prostu ... [Brzęczenie] Whoa! 1018 01:04:08,360 --> 01:04:10,980 [Mężczyzna głośnik] Oh hey, że nie działa. 1019 01:04:10,980 --> 01:04:14,870 >> Powiedz, Binky, nie sądzę dereferencji y to dobry pomysł 1020 01:04:14,870 --> 01:04:17,880 ponieważ konfigurowanie pointee jest oddzielny etap 1021 01:04:17,880 --> 01:04:19,850 i nie sądzę, że kiedykolwiek to zrobił. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, dobry punkt. 1023 01:04:21,770 --> 01:04:26,640 [Mężczyzna głośnik] Tak. Mamy przyznane y wskaźnika, ale nigdy nie ustawić go wskazać na pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, bardzo spostrzegawczy. 1025 01:04:28,780 --> 01:04:30,690 [Mężczyzna głośnik] Hej, szukasz dobry tam, Binky. 1026 01:04:30,690 --> 01:04:34,160 Można go naprawić, więc Y wskazuje na ten sam pointee jak X? >> [Binky] Jasne. 1027 01:04:34,160 --> 01:04:37,100 Będę korzystać z magiczną różdżką cesji wskaźnika. 1028 01:04:37,100 --> 01:04:39,070 [Mężczyzna głośnik] Czy to będzie problem, jak wcześniej? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Nie, to nie dotykaj pointees. 1030 01:04:40,840 --> 01:04:44,780 To zmienia tylko jeden wskaźnik, aby wskazywał to samo co innym. [Popping dźwięk] 1031 01:04:44,780 --> 01:04:48,570 [Mężczyzna głośnik] Oh, widzę. Teraz punkty r do tego samego miejsca co X. 1032 01:04:48,570 --> 01:04:51,140 Więc czekać. Teraz r jest stała. Ma pointee. 1033 01:04:51,140 --> 01:04:54,520 Więc można spróbować Różdżka dereferencji ponownie wysłać 13 ponad. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, okay. Tu idzie. [Popping dźwięk] 1035 01:04:58,130 --> 01:05:01,250 [Mężczyzna głośnik] Hej, popatrz na to. Teraz dereferencji prace na y. 1036 01:05:01,250 --> 01:05:05,200 A ponieważ wskaźniki dzielą ten jeden pointee, oboje zobaczyć 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Tak, udostępniania. Cokolwiek. 1038 01:05:06,910 --> 01:05:08,880 >> Więc mamy zamiar zamienić się miejscami teraz? 1039 01:05:08,880 --> 01:05:11,420 [Mężczyzna głośnik] Oh look, jesteśmy poza czasem. >> [Binky] Ale - 1040 01:05:11,420 --> 01:05:13,880 [Mężczyzna głośnik] Wystarczy zapamiętać 3 zasady wskaźnika. 1041 01:05:13,880 --> 01:05:18,630 Numer 1, podstawowa struktura jest, że masz wskaźnik ten wskazuje na do pointee. 1042 01:05:18,630 --> 01:05:23,120 Ale wskaźnik i pointee są oddzielne, a powszechnym błędem jest ustawienie wskaźnika 1043 01:05:23,120 --> 01:05:25,680 ale zapomnij dać mu pointee. 1044 01:05:25,680 --> 01:05:29,580 Numer 2, dereferencji wskaźnik zaczyna się wskaźnika i stosuje swoje strzałki nad 1045 01:05:29,580 --> 01:05:31,060 dostęp do swojego pointee. 1046 01:05:31,060 --> 01:05:34,340 Jak wszyscy wiemy, to tylko wtedy, gdy istnieje pointee, 1047 01:05:34,340 --> 01:05:36,460 jaki rodzaj wróci do orzekania numer 1. 1048 01:05:36,460 --> 01:05:39,870 Numer 3, cesja wskaźnik przyjmuje jeden wskaźnik i zmienia go 1049 01:05:39,870 --> 01:05:42,390 wskazywać na ten sam pointee jak inny wskaźnik. 1050 01:05:42,390 --> 01:05:45,890 Więc po cesji, 2 wskaźniki będą wskazywać na ten sam pointee. 1051 01:05:45,890 --> 01:05:47,800 Czasami to się nazywa dzielenie. 1052 01:05:47,800 --> 01:05:50,910 >> I to wszystko, co jest do niej bardzo. Bye-bye teraz. 1053 01:05:50,910 --> 01:05:55,840 To Binky. To CS50. Do zobaczenia w przyszłym tygodniu. [Oklaski] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]