1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID MALAN: Hello, a Witamy z powrotem do CS50. 3 00:00:13,260 --> 00:00:14,860 Więc to jest koniec tygodnia cztery. 4 00:00:14,860 --> 00:00:16,680 Tylko jedna zapowiedź pierwsza. 5 00:00:16,680 --> 00:00:19,600 Tak więc tak zwane piątym to poniedziałek nadchodzące przyszły poniedziałek. 6 00:00:19,600 --> 00:00:22,800 Jest to okazja, aby zmienić SAT / UNSAT do klasy list, lub 7 00:00:22,800 --> 00:00:24,130 grade list SAT / UNSAT. 8 00:00:24,130 --> 00:00:27,130 Irytująco, że proces nie wymaga podpis, bo trzeba wypełnić 9 00:00:27,130 --> 00:00:28,770 obecnie jednym z tych różowych Dodaj / spadek formy. 10 00:00:28,770 --> 00:00:31,680 >> Ponieważ technicznie, SAT / UNSAT wersja i wersja grade list 11 00:00:31,680 --> 00:00:33,320 mają różne numery katalogowe. 12 00:00:33,320 --> 00:00:34,240 Ale nic wielkiego. 13 00:00:34,240 --> 00:00:36,620 Wystarczy przyjść do mnie lub do Roba lub Laurena w dowolnym punkcie. 14 00:00:36,620 --> 00:00:39,550 Lub napisz do nas, jeśli nie masz tego rodzaju formalności potrzebne dzisiaj, a my 15 00:00:39,550 --> 00:00:43,410 będzie z pewnością pomoże Ci podjąć opieka, że ​​przed poniedziałkiem. 16 00:00:43,410 --> 00:00:45,780 >> Dobrze, więc dzisiaj - 17 00:00:45,780 --> 00:00:47,630 faktycznie, jest trochę echo. 18 00:00:47,630 --> 00:00:51,070 Czy możemy tone mnie trochę? 19 00:00:51,070 --> 00:00:51,730 OK. 20 00:00:51,730 --> 00:00:54,850 Więc dzisiaj wprowadzamy temat znany jako wskaźniki. 21 00:00:54,850 --> 00:00:57,770 I muszę przyznać, że jest to jeden z bardziej złożonych tematów, które mają tendencję do 22 00:00:57,770 --> 00:01:00,960 pokrycie w tej klasie, czy naprawdę każdy kurs wprowadzający, który wykorzystuje C. 23 00:01:00,960 --> 00:01:05,510 >> Ale wierz mi na słowo, zwłaszcza w sytuacji Jeśli twój umysł czuje się nieco więcej wygięte 24 00:01:05,510 --> 00:01:07,100 dziś iw nadchodzących tygodniach. 25 00:01:07,100 --> 00:01:10,340 To nie jest przedstawiciel otrzymujesz gorzej na tym to po prostu oznacza, że 26 00:01:10,340 --> 00:01:13,360 to jest szczególnie wyrafinowany temat Obiecuję, że na kilka tygodni 27 00:01:13,360 --> 00:01:17,610 Stąd może wydawać się zbyt efektownie prosta w retrospekcji. 28 00:01:17,610 --> 00:01:18,720 >> Pamiętam do dziś. 29 00:01:18,720 --> 00:01:22,190 Ja siedziałem w Elliott Dining Hall, siedzi obok mojego TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 który był mieszkańcem Elliott domu. 31 00:01:24,070 --> 00:01:26,340 I z jakiegoś powodu, ta temat klika. 32 00:01:26,340 --> 00:01:29,430 To znaczy, że ja też walczyli z nim przez jakiś czas, ale 33 00:01:29,430 --> 00:01:33,610 będzie co w mojej mocy, aby pomóc uniknąć takich Walka z tematu, który ostatecznie 34 00:01:33,610 --> 00:01:34,580 jest dość silny. 35 00:01:34,580 --> 00:01:37,350 >> W rzeczywistości, jednym z tematów omówimy w najbliższych tygodniach jest to, że 36 00:01:37,350 --> 00:01:41,130 bezpieczeństwa, i jak można rzeczywiście eksploatować maszyny w sposób, 37 00:01:41,130 --> 00:01:42,320 , które nie zostały przeznaczone. 38 00:01:42,320 --> 00:01:45,850 A te wyzysk są zazwyczaj wynikiem błędów, pomyłek, które 39 00:01:45,850 --> 00:01:49,740 ludzie robią, nie rozumiejąc niektórych z realizacji bazowego 40 00:01:49,740 --> 00:01:52,250 szczegóły poprzez które programy są wykonane. 41 00:01:52,250 --> 00:01:55,410 >> Teraz, aby ta wydaje się tym bardziej użytkownik przyjazny, myślałem, że gram 10 42 00:01:55,410 --> 00:01:59,680 Druga zapowiedź trochę claymation postać o imieniu Binky który został przywieziony do 43 00:01:59,680 --> 00:02:03,020 życia przez naszego przyjaciela w Stanford, Profesor Nick Parlante. 44 00:02:03,020 --> 00:02:06,753 Więc pozwól mi dać ci to teaser Binky tutaj. 45 00:02:06,753 --> 00:02:09,520 >> [PLAYBACK VIDEO] 46 00:02:09,520 --> 00:02:10,380 >> -Hej, Binky. 47 00:02:10,380 --> 00:02:11,050 Obudź się. 48 00:02:11,050 --> 00:02:13,610 Czas na zabawę wskaźnika. 49 00:02:13,610 --> 00:02:14,741 >> -Co to jest? 50 00:02:14,741 --> 00:02:16,440 Dowiedz się o wskazówki? 51 00:02:16,440 --> 00:02:17,928 Oh, jare. 52 00:02:17,928 --> 00:02:18,920 >> [END PLAYBACK VIDEO] 53 00:02:18,920 --> 00:02:20,670 >> DAVID MALAN: To Stanford informatyka. 54 00:02:20,670 --> 00:02:23,194 Tak bardziej na tym, by przyjść. 55 00:02:23,194 --> 00:02:24,930 >> [APPLAUSE] 56 00:02:24,930 --> 00:02:26,660 >> DAVID MALAN: Niestety, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Tak więc przypomnieć, że ostatnim razem skończyło się na to naprawdę ekscytujące cliffhanger 58 00:02:30,680 --> 00:02:32,960 przy czym funkcja ta po prostu nie działa. 59 00:02:32,960 --> 00:02:34,960 Przynajmniej intuicyjnie czułem jak to powinno działać. 60 00:02:34,960 --> 00:02:37,600 Wystarczy zamiana wartości dwóch liczb całkowitych. 61 00:02:37,600 --> 00:02:40,915 Ale pamiętam, że gdy drukowane oryginalne wartości w jedną i głównego 62 00:02:40,915 --> 00:02:44,210 dwa, byli jeszcze jeden i dwa, a nie dwa i jeden. 63 00:02:44,210 --> 00:02:46,070 >> Więc pozwól mi faktycznie przełączyć powyżej do urządzenia. 64 00:02:46,070 --> 00:02:50,180 A ja napisałem kawałek kodu w szkieletowych przejść tutaj, gdzie twierdzą, że x 65 00:02:50,180 --> 00:02:52,500 będzie 1, Y będzie 2. 66 00:02:52,500 --> 00:02:54,810 I następnie wydrukować zarówno ich wartości z F druku. 67 00:02:54,810 --> 00:02:57,540 >> I potem ubiegać się tu, że mamy zamiar zamienić je. 68 00:02:57,540 --> 00:03:00,800 Zostawiłem puste miejsce tutaj dla nas wypełnić dzisiaj za chwilę. 69 00:03:00,800 --> 00:03:03,380 Następnie zamierzam twierdzić, że dwie zmienne zostały zamienione. 70 00:03:03,380 --> 00:03:04,770 Potem idę do druku je ponownie. 71 00:03:04,770 --> 00:03:07,090 A więc mam nadzieję, że powinienem zobaczyć, 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 To jest bardzo proste, Celem teraz. 74 00:03:09,830 --> 00:03:12,430 >> Więc jak go o zamianę dwie zmienne? 75 00:03:12,430 --> 00:03:17,220 Cóż, jeśli proponuję tutaj, że te kubki może reprezentować pamięci w komputerze. 76 00:03:17,220 --> 00:03:19,070 To jest kilka ukąszeń, to jest jeszcze kilka ukąszeń. 77 00:03:19,070 --> 00:03:23,260 Mogliśmy wolontariusz Chodź i mieszać nam kilka drinków, jeśli zna? 78 00:03:23,260 --> 00:03:23,920 Chodź na górę. 79 00:03:23,920 --> 00:03:24,815 Jak masz na imię? 80 00:03:24,815 --> 00:03:25,260 >> JESS: Jess. 81 00:03:25,260 --> 00:03:25,690 >> DAVID MALAN: Jess? 82 00:03:25,690 --> 00:03:26,540 Chodź, Jess. 83 00:03:26,540 --> 00:03:29,180 Jeśli nie masz nic przeciwko, musimy umieścić Google Szkło na ciebie więc możemy 84 00:03:29,180 --> 00:03:30,430 uwiecznić to. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 OK, szkło. 87 00:03:34,670 --> 00:03:37,250 Nagrywanie wideo. 88 00:03:37,250 --> 00:03:43,103 I OK, jesteśmy dobrze pójść z Jess tutaj. 89 00:03:43,103 --> 00:03:43,810 Dobrze. 90 00:03:43,810 --> 00:03:45,120 Miło Pana poznać. 91 00:03:45,120 --> 00:03:47,720 >> Więc to, co chcę robić tutaj - jeśli można, bardzo szybko - 92 00:03:47,720 --> 00:03:51,040 po prostu wylewa się z nami pół szklanki pomarańczy sok i pół szklanki mleka, 93 00:03:51,040 --> 00:03:55,710 reprezentujący skutecznie numery 1 w jednej filiżance i 2 w drugiej filiżance. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> To będzie dobry materiał. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Sorry. 98 00:04:05,860 --> 00:04:06,330 >> DAVID MALAN: Nie, nie. 99 00:04:06,330 --> 00:04:08,703 To jest OK. 100 00:04:08,703 --> 00:04:10,120 Miło. 101 00:04:10,120 --> 00:04:12,950 Dobrze, więc mamy cztery bajty warto soku pomarańczowego. 102 00:04:12,950 --> 00:04:14,460 My nazwaliśmy to wartość 1. 103 00:04:14,460 --> 00:04:16,579 Teraz kolejne cztery bajty o wartości mleka. 104 00:04:16,579 --> 00:04:18,519 Czy nazwać to wartość 2. 105 00:04:18,519 --> 00:04:20,440 Więc x i y, odpowiednio. 106 00:04:20,440 --> 00:04:23,450 >> Dobrze, więc teraz, jeśli zadanie pod ręką - dla Ciebie, Jess, przed wszystkim 107 00:04:23,450 --> 00:04:24,270 z kolegami - 108 00:04:24,270 --> 00:04:28,510 jest, aby zamienić wartości x i y takie że chcemy sok pomarańczowy w 109 00:04:28,510 --> 00:04:32,070 inne cup i mleko w filiżance, jak może ty - zanim faktycznie 110 00:04:32,070 --> 00:04:34,020 to - za to zabrać? 111 00:04:34,020 --> 00:04:35,220 >> OK, mądra decyzja. 112 00:04:35,220 --> 00:04:36,340 Więc trzeba nieco więcej pamięci. 113 00:04:36,340 --> 00:04:38,190 Warto więc przydzielić tymczasowy puchar, jeśli będzie. 114 00:04:38,190 --> 00:04:40,540 A teraz przystąpić do wymiany x i y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Excellent. 117 00:04:53,530 --> 00:04:54,420 Więc bardzo dobrze zrobione. 118 00:04:54,420 --> 00:04:55,670 Dziękuję bardzo, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Proszę. 121 00:05:00,020 --> 00:05:01,950 Mały upominek. 122 00:05:01,950 --> 00:05:04,350 >> OK, tak, oczywiście, bardzo prosty pomysł. 123 00:05:04,350 --> 00:05:07,500 Całkowicie intuicyjne, że potrzebujemy trochę miejsca w pamięci - w tej formie, 124 00:05:07,500 --> 00:05:09,750 cup - jeśli rzeczywiście chcesz zamienić te dwie zmienne. 125 00:05:09,750 --> 00:05:11,110 Więc zróbmy dokładnie to. 126 00:05:11,110 --> 00:05:14,330 Się tu w latach, gdzie twierdzą, że jestem będzie jakiejś wymiany, ja 127 00:05:14,330 --> 00:05:15,720 śmiało zadeklarować Temp. 128 00:05:15,720 --> 00:05:17,980 A ja ustawiony jest równa, powiedzmy, x. 129 00:05:17,980 --> 00:05:21,110 >> Potem mam zamiar zmienić wartość x jak Jess nie tutaj z 130 00:05:21,110 --> 00:05:23,200 mleko i sok pomarańczowy być równe y. 131 00:05:23,200 --> 00:05:27,460 I mam zamiar zmienić y równa aby nie x, bo teraz będziemy 132 00:05:27,460 --> 00:05:29,530 tkwi w kręgu, ale temp. 133 00:05:29,530 --> 00:05:33,170 Gdzie ja tymczasowo - lub gdzie Jess tymczasowo umieścić sok pomarańczowy 134 00:05:33,170 --> 00:05:35,460 przed przebijania, że kubek z mlekiem. 135 00:05:35,460 --> 00:05:37,250 >> Więc pozwól mi iść do przodu i teraz zrobić to. 136 00:05:37,250 --> 00:05:39,210 To się nazywa noswap.c. 137 00:05:39,210 --> 00:05:41,190 A teraz pozwól mi biegać bez swapa. 138 00:05:41,190 --> 00:05:43,910 I rzeczywiście widzę, gdybym rozwiń okno trochę, że 139 00:05:43,910 --> 00:05:45,160 x oznacza 1, y oznacza 2. 140 00:05:45,160 --> 00:05:47,230 A następnie x oznacza 2, Y oznacza 1. 141 00:05:47,230 --> 00:05:51,910 >> Ale przypominam, że w poniedziałek zrobiliśmy rzeczy trochę inaczej, przy czym I 142 00:05:51,910 --> 00:05:56,760 zamiast wprowadziliśmy funkcję pomocnika, jeśli chcesz, to było naprawdę nieważne. 143 00:05:56,760 --> 00:05:58,010 I nazwał go zamienić. 144 00:05:58,010 --> 00:06:01,600 Dałem dwa parametry i zadzwoniłem im i nazwał ich b. 145 00:06:01,600 --> 00:06:04,380 >> Szczerze mówiąc, mógłbym nazwać ich x i y. 146 00:06:04,380 --> 00:06:06,040 Nie ma nic zatrzymując mnie od robienia tego. 147 00:06:06,040 --> 00:06:08,140 Jednak jestem zdania, że ​​to wtedy trochę niejasne. 148 00:06:08,140 --> 00:06:11,910 Ponieważ wycofanie w poniedziałek, że twierdził, że parametry te były 149 00:06:11,910 --> 00:06:13,650 kopie wartości przekazywane w. 150 00:06:13,650 --> 00:06:15,640 Więc to tylko miesza ci umysł, myślę, że jeśli używasz 151 00:06:15,640 --> 00:06:17,370 dokładnie te same zmienne. 152 00:06:17,370 --> 00:06:20,150 >> Więc ja, zamiast nazywać ich i b, tak dla jasności. 153 00:06:20,150 --> 00:06:21,840 Ale możemy nazwać ich najbardziej cokolwiek chcemy. 154 00:06:21,840 --> 00:06:26,280 I mam zamiar skopiować i wkleić skutecznie ten kod tam z góry 155 00:06:26,280 --> 00:06:27,170 w dół tutaj. 156 00:06:27,170 --> 00:06:29,110 Bo właśnie widziałem, że to działa. 157 00:06:29,110 --> 00:06:30,790 Tak, że jest w dobrej formie. 158 00:06:30,790 --> 00:06:37,390 A ja zmienię x na, moim x. na moje r do b i mojej r do b. 159 00:06:37,390 --> 00:06:39,130 >> Tak więc, innymi słowy, dokładnie taki sam układ logiczny. 160 00:06:39,130 --> 00:06:40,850 Dokładnie to samo, że Jess nie. 161 00:06:40,850 --> 00:06:44,350 A potem jedno muszę zrobić się tu, oczywiście, to jest teraz powołać 162 00:06:44,350 --> 00:06:45,990 Funkcja lub wywołać tę funkcję. 163 00:06:45,990 --> 00:06:50,430 Będę więc wywołać tę funkcję z dwoma wejść, x i y, a hitem Zapisz. 164 00:06:50,430 --> 00:06:52,300 >> W porządku, więc zasadniczo samo. 165 00:06:52,300 --> 00:06:55,570 W rzeczywistości, mam zapewne program niepotrzebnie złożone przez 166 00:06:55,570 --> 00:07:00,820 napisanie funkcji, która jest po prostu biorąc niektóre sześć linijek kodu, podczas gdy I 167 00:07:00,820 --> 00:07:02,970 poprzednio realizowane to w zaledwie trzy. 168 00:07:02,970 --> 00:07:06,230 >> Więc pozwól mi iść do przodu i teraz przerobić ta, nie znaleziono swapa. 169 00:07:06,230 --> 00:07:07,920 Dobrze, wkręca się tutaj. 170 00:07:07,920 --> 00:07:11,290 Powinno to być błąd, który może zobacz coraz bardziej powszechnie, jak Twoje 171 00:07:11,290 --> 00:07:12,380 Programy uzyskać bardziej złożone. 172 00:07:12,380 --> 00:07:13,470 Ale jest łatwo naprawić. 173 00:07:13,470 --> 00:07:15,650 Pozwól mi przejść z powrotem tutaj. 174 00:07:15,650 --> 00:07:18,190 >> I co jest pierwszy błąd widzę? 175 00:07:18,190 --> 00:07:19,520 Niejawna deklaracja. 176 00:07:19,520 --> 00:07:21,466 Co to zazwyczaj wskazują? 177 00:07:21,466 --> 00:07:22,830 Oh, zapomniałem prototyp. 178 00:07:22,830 --> 00:07:26,900 Zapomniałem uczyć kompilator, że zamiana będzie istnieć, mimo że 179 00:07:26,900 --> 00:07:28,920 nie istnieje na samym początku programu. 180 00:07:28,920 --> 00:07:35,780 Więc mam zamiar powiedzieć, nieważne, swap, int, int b, średnik. 181 00:07:35,780 --> 00:07:37,280 >> Więc nie będę reimplement go. 182 00:07:37,280 --> 00:07:39,140 Ale teraz to pasuje, co jest tutaj. 183 00:07:39,140 --> 00:07:42,530 I zauważ, brak średnikiem o, co nie jest konieczne, gdy 184 00:07:42,530 --> 00:07:43,200 realizacji. 185 00:07:43,200 --> 00:07:46,010 >> Więc pozwól mi przerobić to zrobić bez swapa. 186 00:07:46,010 --> 00:07:46,910 Znacznie lepszej formie. 187 00:07:46,910 --> 00:07:48,130 Uruchom bez swapa. 188 00:07:48,130 --> 00:07:48,740 I cholera. 189 00:07:48,740 --> 00:07:51,650 Teraz jesteśmy tam, gdzie byliśmy w poniedziałek, gdzie sprawa nie zamienić. 190 00:07:51,650 --> 00:07:55,410 >> I co jest intuicyjne wyjaśnienie dlaczego jest to przypadek? 191 00:07:55,410 --> 00:07:56,380 Tak? 192 00:07:56,380 --> 00:07:57,630 >> STUDENT: [niesłyszalne]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID MALAN: Dokładnie. 195 00:08:05,230 --> 00:08:07,330 Więc i b są kopiami x i y. 196 00:08:07,330 --> 00:08:10,680 A w rzeczywistości, za każdym razem byłeś wywołanie funkcji tak daleko, że 197 00:08:10,680 --> 00:08:12,540 przechodzi zmienne jak ints - 198 00:08:12,540 --> 00:08:14,470 jak Swap spodziewa tutaj - 199 00:08:14,470 --> 00:08:16,270 wy zostały przekazując kopie. 200 00:08:16,270 --> 00:08:19,150 >> Teraz to znaczy, że ma trochę czasu, ułamek sekundy, na 201 00:08:19,150 --> 00:08:23,270 komputer skopiować bitów z jednego Zmienna do bitów drugiego. 202 00:08:23,270 --> 00:08:24,610 Ale to nie taka wielka sprawa jest. 203 00:08:24,610 --> 00:08:25,920 Ale to jednak kopia. 204 00:08:25,920 --> 00:08:30,020 >> A więc teraz, w kontekście wymiany, Jestem w tym, z powodzeniem 205 00:08:30,020 --> 00:08:31,180 zmiana i IIIb. 206 00:08:31,180 --> 00:08:33,000 W rzeczywistości, zróbmy szybkie sanity check. 207 00:08:33,000 --> 00:08:36,830 F Print jest% i, nowa linia. 208 00:08:36,830 --> 00:08:38,770 A wtyczka niech w. 209 00:08:38,770 --> 00:08:41,830 Teraz zróbmy to samo z b.. 210 00:08:41,830 --> 00:08:43,640 I zróbmy to samo tutaj. 211 00:08:43,640 --> 00:08:47,260 >> A teraz pozwól mi skopiować te same linie raz na końcu funkcji 212 00:08:47,260 --> 00:08:51,250 po moich trzech linii ciekawa mógł wykonane i 213 00:08:51,250 --> 00:08:53,270 wydrukować i b po raz kolejny. 214 00:08:53,270 --> 00:08:56,030 Więc teraz zróbmy to zrobić bez swapa. 215 00:08:56,030 --> 00:08:58,430 Pozwól, że okno terminala nieco wyższy, tak, że możemy zobaczyć 216 00:08:58,430 --> 00:08:59,520 go więcej na raz. 217 00:08:59,520 --> 00:09:00,860 >> I uruchomić bez swapa. 218 00:09:00,860 --> 00:09:04,000 x oznacza 1, y oznacza 2. a oznacza 1, b oznacza 2. 219 00:09:04,000 --> 00:09:06,070 A potem, to 2, b wynosi 1. 220 00:09:06,070 --> 00:09:09,390 Tak to działa, tak jak Jess A tutaj, w środku wymiany. 221 00:09:09,390 --> 00:09:13,090 Ale, oczywiście, to jest bezskuteczny na zmiennych w main. 222 00:09:13,090 --> 00:09:15,360 >> Tak więc widzieliśmy trick w którym możemy może to naprawić, prawda? 223 00:09:15,360 --> 00:09:19,560 Kiedy masz do czynienia z tym określania zakresu problem, to może po prostu punt i uczynić x 224 00:09:19,560 --> 00:09:22,400 i y, jakie zmienne zamiast? 225 00:09:22,400 --> 00:09:23,390 >> Można ich globalnym. 226 00:09:23,390 --> 00:09:27,560 Umieść je na samej górze pliku jak my, nawet w grze 15. 227 00:09:27,560 --> 00:09:28,890 Używamy zmiennej globalnej. 228 00:09:28,890 --> 00:09:32,420 Jednak w kontekście gry 15, jest to rozsądne, aby globalna 229 00:09:32,420 --> 00:09:37,170 zmiennej reprezentującej planszę, ponieważ Całość 15.c jest wszystko 230 00:09:37,170 --> 00:09:38,650 o realizacji tej gry. 231 00:09:38,650 --> 00:09:41,470 To, co plik istnieje zrobić. 232 00:09:41,470 --> 00:09:44,170 >> Ale w tym przypadku tutaj jestem wywołanie swap funkcji. 233 00:09:44,170 --> 00:09:45,380 Chcę zamienić dwie zmienne. 234 00:09:45,380 --> 00:09:48,950 I powinien zacząć odczuwać tylko niechlujstwa jeśli rozwiązanie dla wszystkich naszych 235 00:09:48,950 --> 00:09:51,300 problemy, gdy działają w zakresie zagadnienia jest zrobić to globalny. 236 00:09:51,300 --> 00:09:54,730 Bo bardzo szybko nasz program jest będzie się dość bałaganu. 237 00:09:54,730 --> 00:09:57,760 I zrobiliśmy to bardzo oszczędnie w rezultacie w 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Ale okazuje się, że jest lepszy sposób całkowicie. 239 00:10:00,470 --> 00:10:05,600 Pozwól, że faktycznie wrócić i usunąć wydrukować f-tych, po prostu uprościć ten kod. 240 00:10:05,600 --> 00:10:09,160 I pozwól mi zaproponować to rzeczywiście, jest złe. 241 00:10:09,160 --> 00:10:15,990 Ale jeśli zamiast dodawać w niektórych gwiazdkach i gwiazdy, mogę zamiast skręcić w tym 242 00:10:15,990 --> 00:10:18,670 funkcji w jednym, który jest faktycznie działa. 243 00:10:18,670 --> 00:10:25,020 >> Więc pozwól mi wrócić tu i przyznać, mówiąc: gwiazdka jest zawsze trudne, 244 00:10:25,020 --> 00:10:26,170 tak powiem gwiazdki. 245 00:10:26,170 --> 00:10:27,660 Ja po prostu przyznaj się do tego. 246 00:10:27,660 --> 00:10:28,190 Dobrze. 247 00:10:28,190 --> 00:10:30,190 A teraz, co ja robić zamiast tego? 248 00:10:30,190 --> 00:10:34,130 >> Więc po pierwsze, mam zamiar podać że zamiast przekazywać int do 249 00:10:34,130 --> 00:10:37,980 Funkcja wymiany, jestem zamiast z powie int gwiazdę. 250 00:10:37,980 --> 00:10:39,170 Teraz, to co gwiazdki oznaczają? 251 00:10:39,170 --> 00:10:41,970 To, że pojęcie wskaźnik ten Binky, charakter claymation, był 252 00:10:41,970 --> 00:10:43,465 odnosząc się chwilą. 253 00:10:43,465 --> 00:10:47,610 >> Więc jeśli mówimy int gwiazdę, rozumieniu to teraz jest to, że nie będzie 254 00:10:47,610 --> 00:10:49,110 podjęta w jego wartości. 255 00:10:49,110 --> 00:10:50,350 To nie ma być skopiowany w. 256 00:10:50,350 --> 00:10:54,700 Raczej adres jest będzie przekazany w. 257 00:10:54,700 --> 00:10:57,840 >> Tak więc przypomnieć, że do wnętrza komputera, jest cała masa pamięci, w przeciwnym razie 258 00:10:57,840 --> 00:10:58,760 znane jako pamięci RAM. 259 00:10:58,760 --> 00:11:00,520 I to jest właśnie RAM cała masa bajtów. 260 00:11:00,520 --> 00:11:03,320 Więc jeśli Mac lub komputer ma dwa gigabajty, masz 2 261 00:11:03,320 --> 00:11:05,760 miliard bajtów pamięci. 262 00:11:05,760 --> 00:11:08,440 >> Teraz tylko przypuszczać, że właśnie zachować rzeczy ładne i uporządkowany, ale 263 00:11:08,440 --> 00:11:09,450 przypisanie adresu - 264 00:11:09,450 --> 00:11:10,170 liczba - 265 00:11:10,170 --> 00:11:12,270 aby każdy bajt pamięci RAM w komputerze. 266 00:11:12,270 --> 00:11:15,410 Pierwszy bajt z tych 2 miliard jest cyfra zero. 267 00:11:15,410 --> 00:11:18,572 Kolejny to bajt numer jeden, numer dwa, aż On Up, dot dot 268 00:11:18,572 --> 00:11:20,530 dot, do mniej więcej 2000000000. 269 00:11:20,530 --> 00:11:23,640 >> Więc możesz liczba bajtów pamięci w komputerze. 270 00:11:23,640 --> 00:11:26,460 Więc załóżmy, że to, co rozumiemy przez adres. 271 00:11:26,460 --> 00:11:31,360 Więc gdy widzę int star, co się dzieje być przekazywane do wymiany teraz jest 272 00:11:31,360 --> 00:11:32,830 adres. 273 00:11:32,830 --> 00:11:37,150 Nie jej wartość, ale bez względu na postal Adres jest, by tak rzec - 274 00:11:37,150 --> 00:11:38,810 jego lokalizacja w pamięci RAM. 275 00:11:38,810 --> 00:11:41,250 >> I podobnie dla b, idę powiedzieć to samo. 276 00:11:41,250 --> 00:11:42,720 Int, star, b. 277 00:11:42,720 --> 00:11:46,350 Tak na marginesie, technicznie gwiazdy może pójść w innych lokalizacjach. 278 00:11:46,350 --> 00:11:50,140 Ale my ujednolicić gwiazdy będącej obok typu danych. 279 00:11:50,140 --> 00:11:54,080 >> Więc zamienić podpis oznacza teraz, daj mi adres int, i wywołanie 280 00:11:54,080 --> 00:11:55,400 ten adres. 281 00:11:55,400 --> 00:11:58,690 I daj mi inny adres int i nazywają to B Adres. 282 00:11:58,690 --> 00:12:01,120 >> Ale teraz mój kod tutaj musi się zmienić. 283 00:12:01,120 --> 00:12:03,470 Bo jeśli Oświadczam int temp - 284 00:12:03,470 --> 00:12:05,580 który nadal jest typu int - 285 00:12:05,580 --> 00:12:08,700 ale ja przechowywać w to, jakie wartości? 286 00:12:08,700 --> 00:12:12,870 Żeby było jasne, ja kładąc się Kod jak napisane w tej chwili? 287 00:12:12,870 --> 00:12:14,360 >> Kładę lokalizację w. 288 00:12:14,360 --> 00:12:16,500 Ale nie dbam o lokalizacja teraz, prawda? 289 00:12:16,500 --> 00:12:21,940 Temp istnieje tylko trzecią filiżankę Jess ' istnieje, w jakim celu? 290 00:12:21,940 --> 00:12:23,090 Aby zapisać wartość. 291 00:12:23,090 --> 00:12:24,830 Mleko lub sok pomarańczowy. 292 00:12:24,830 --> 00:12:28,520 Nie faktycznie przechowywać adres jedną z tych rzeczy, które czuje się 293 00:12:28,520 --> 00:12:31,200 trochę bezsensowne w tym prawdziwym kontekst świata i tak. 294 00:12:31,200 --> 00:12:34,990 >> Tak naprawdę, to co chcę umieścić w temp. nie jest adres, ale 295 00:12:34,990 --> 00:12:36,180 zawartość. 296 00:12:36,180 --> 00:12:41,930 Jeżeli tak jest numer 123 jak to jest 123-gie bajt pamięci, że tylko 297 00:12:41,930 --> 00:12:45,090 dzieje się zajmują, że wartość w dzieje się zajmują. 298 00:12:45,090 --> 00:12:49,040 >> Jeśli chcę, aby przejść do tego adresu, Muszę powiedzieć, star. 299 00:12:49,040 --> 00:12:52,610 Podobnie, jeśli miałbym zmienić to, co jest na adres, zmienię 300 00:12:52,610 --> 00:12:53,570 to zacząć. 301 00:12:53,570 --> 00:12:58,185 Jeśli chcę, aby przechowywać w to, co jest w lokalizacja z tym co jest w miejscu 302 00:12:58,185 --> 00:13:02,180 w B, gwiazda b gwiazdki. 303 00:13:02,180 --> 00:13:05,340 >> Tak więc, w skrócie, nawet jeśli nie jest to całkiem pogrąża się w jeszcze - i nie spodziewałbym 304 00:13:05,340 --> 00:13:06,560 że to będzie tak szybko - 305 00:13:06,560 --> 00:13:11,100 sobie sprawę, że wszystko co robię jest poprzedzenie te gwiazdy do moich zmiennych, 306 00:13:11,100 --> 00:13:13,350 powiedzenie nie chwycić wartości. 307 00:13:13,350 --> 00:13:14,520 Nie należy zmieniać wartości. 308 00:13:14,520 --> 00:13:17,600 Ale raczej iść do tych adresów i uzyskać wartość. 309 00:13:17,600 --> 00:13:21,430 Idź do tego adresu i zmiany wartość istnieje. 310 00:13:21,430 --> 00:13:25,500 >> Więc teraz pozwól mi przejść z powrotem do góry, wystarczy, aby rozwiązać ten wiersz tutaj, aby 311 00:13:25,500 --> 00:13:27,690 zmienić prototyp pasujące. 312 00:13:27,690 --> 00:13:30,280 Ale teraz trzeba zrobić jedną rzecz. 313 00:13:30,280 --> 00:13:35,500 Intuicyjnie, jeśli zmieniłem typy argumentów, które zamienią spodziewa, 314 00:13:35,500 --> 00:13:37,245 co jeszcze muszę zmienić w moim kodzie? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Kiedy dzwonię swapa. 317 00:13:40,840 --> 00:13:43,340 Bo teraz, co ja I przechodząc do wymiany jeszcze? 318 00:13:43,340 --> 00:13:47,450 X wartość i wartość y, lub mleko i sok pomarańczowy. 319 00:13:47,450 --> 00:13:48,510 Ale ja nie chcę tego robić. 320 00:13:48,510 --> 00:13:51,060 I zamiast chcą przekazać w co? 321 00:13:51,060 --> 00:13:53,050 Położenie xi Położenie Y. 322 00:13:53,050 --> 00:13:55,300 Jakie są ich adresy pocztowe, że tak powiem. 323 00:13:55,300 --> 00:13:57,600 >> Tak więc, aby to zrobić, jest Ampersand. 324 00:13:57,600 --> 00:13:59,260 Rodzaj Ampersand dźwięków, takich jak adres. 325 00:13:59,260 --> 00:14:03,240 więc n, Ampersand, adres od x, a adres y. 326 00:14:03,240 --> 00:14:06,790 Więc to jest zamierzone, że używamy Ampersands po wywołaniu funkcji 327 00:14:06,790 --> 00:14:10,230 i gwiazdy podczas deklarowania i kiedy realizacji funkcji. 328 00:14:10,230 --> 00:14:14,220 >> I tylko pomyśleć o znaku & w adres operatora, jak i gwiazdy 329 00:14:14,220 --> 00:14:15,490 tam operator - 330 00:14:15,490 --> 00:14:18,640 lub, dokładniej, operator nieprawidłowego. 331 00:14:18,640 --> 00:14:23,480 Więc to jest całe mnóstwo słów po prostu powiedzieć, że teraz, miejmy nadzieję, swap będzie 332 00:14:23,480 --> 00:14:24,440 za prawidłowe. 333 00:14:24,440 --> 00:14:26,550 >> Pozwólcie mi iść do przodu i robić - 334 00:14:26,550 --> 00:14:30,940 niech faktycznie zmienić nazwę pliku, aby nie ten program jeszcze nazwać nie wymiany. 335 00:14:30,940 --> 00:14:33,240 I twierdzą, że nazwiemy go swap.c teraz. 336 00:14:33,240 --> 00:14:35,670 Tak zrobić, zamienić. 337 00:14:35,670 --> 00:14:37,520 Dot, slash, zamienić. 338 00:14:37,520 --> 00:14:40,210 >> I teraz rzeczywiście, x oznacza 1, y oznacza 2. 339 00:14:40,210 --> 00:14:44,040 A potem, x wynosi 2, y jest jeden. 340 00:14:44,040 --> 00:14:46,500 No zobaczymy, czy nie można tego zrobić trochę inaczej, co jest 341 00:14:46,500 --> 00:14:47,180 tu dzieje. 342 00:14:47,180 --> 00:14:51,250 Po pierwsze, chciałbym przybliżyć naszym rysowanie ekranu tutaj. 343 00:14:51,250 --> 00:14:54,160 I pozwól mi zaproponować na chwilę - i gdy rysuję tutaj będą dublowane 344 00:14:54,160 --> 00:14:58,660 tam teraz - pozwól mi zaproponować tutaj jest cała masa pamięci lub 345 00:14:58,660 --> 00:15:00,540 RAM, wewnątrz komputera. 346 00:15:00,540 --> 00:15:04,140 >> A to będzie liczba zgryz, powiedzmy, 1. 347 00:15:04,140 --> 00:15:05,720 Będzie to liczba bajtów 2. 348 00:15:05,720 --> 00:15:08,220 I zrobię całą masę bardziej i następnie kilka kropki do kropki 349 00:15:08,220 --> 00:15:10,880 wskazują, że jest 2000000000 z tych rzeczy. 350 00:15:10,880 --> 00:15:13,520 4, 5, i tak dalej. 351 00:15:13,520 --> 00:15:17,055 >> Tak więc są pierwsze pięć bajtów mojej pamięci komputera. 352 00:15:17,055 --> 00:15:17,560 Wszystko w porządku? 353 00:15:17,560 --> 00:15:19,060 Bardzo niewielu z 2000000000. 354 00:15:19,060 --> 00:15:21,120 Ale teraz mam zamiar zaproponować dodaje. 355 00:15:21,120 --> 00:15:27,490 Zamierzam zaproponować x będzie przechowywać liczbę 1, a Y jest zamiar 356 00:15:27,490 --> 00:15:29,690 zapisać numer 2. 357 00:15:29,690 --> 00:15:35,000 I pozwól mi iść do przodu i teraz reprezentuje Wartości te, jak następuje. 358 00:15:35,000 --> 00:15:41,510 >> Zróbmy to w następujący sposób. 359 00:15:41,510 --> 00:15:42,870 Daj mi tylko jedną sekundę. 360 00:15:42,870 --> 00:15:44,150 Jedna sekunda. 361 00:15:44,150 --> 00:15:45,680 OK. 362 00:15:45,680 --> 00:15:47,560 Chcę, aby ten mały - 363 00:15:47,560 --> 00:15:50,440 zróbmy to jeszcze raz. 364 00:15:50,440 --> 00:15:53,250 W przeciwnym razie będę i za pomocą same liczby, w sposób niezamierzony, 365 00:15:53,250 --> 00:15:54,230 wiele razy. 366 00:15:54,230 --> 00:15:57,320 >> Więc tak mamy różne numery aby porozmawiać o, nazwijmy to bajt 367 00:15:57,320 --> 00:16:03,391 numer 123, 124, 125, 126, i dot dot dot. 368 00:16:03,391 --> 00:16:08,400 I niech mnie twierdzą teraz, że będę umieścić wartość 1 tutaj, a wartość 2 369 00:16:08,400 --> 00:16:11,990 tutaj, zwie x i y. 370 00:16:11,990 --> 00:16:15,300 Więc tak się składa, że To jest x, to Y. 371 00:16:15,300 --> 00:16:18,180 >> I tak przez jakiś przypadek, komputer, system operacyjny, 372 00:16:18,180 --> 00:16:21,890 się postawić X na miejscu Numer 123. 373 00:16:21,890 --> 00:16:25,590 A y skończyło się na miejscu 124 - 374 00:16:25,590 --> 00:16:26,330 cholera. 375 00:16:26,330 --> 00:16:28,700 Powinienem był ustalony to. 376 00:16:28,700 --> 00:16:34,040 Oh man, czy naprawdę chcesz to zrobić? 377 00:16:34,040 --> 00:16:37,340 Tak, chcę, aby to naprawić i b prawidłowe o tym dzisiaj. 378 00:16:37,340 --> 00:16:39,950 Niestety, w tym nowy. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, a ja nie chcę być w tym skomplikowane, ale dlaczego zmienić 380 00:16:45,020 --> 00:16:46,340 numery tam? 381 00:16:46,340 --> 00:16:48,360 Bo chcę, aby się ints faktycznie się z czterech bajtów. 382 00:16:48,360 --> 00:16:49,810 Więc być super anal o tym. 383 00:16:49,810 --> 00:16:53,800 Tak, że jeśli 1 stanie się zająć 123, 2 będzie w adresie 384 00:16:53,800 --> 00:16:55,730 127, ponieważ jest to tylko 4 byes dala. 385 00:16:55,730 --> 00:16:56,210 To wszystko. 386 00:16:56,210 --> 00:16:58,640 A my zapominamy o wszystkich inne adresy świata. 387 00:16:58,640 --> 00:17:03,320 >> Tak więc x jest w miejscu 123, Y znajduje się w miejscu 127. 388 00:17:03,320 --> 00:17:05,770 A teraz, co ja właściwie chcesz zrobić? 389 00:17:05,770 --> 00:17:10,099 Kiedy dzwonię swapa teraz, co jest właściwie dzieje? 390 00:17:10,099 --> 00:17:14,920 Cóż, kiedy ja nazywam swapa, jestem przekazując adres X i adres y. 391 00:17:14,920 --> 00:17:18,540 Tak więc na przykład, jeżeli te dwa kawałki papieru stanowią obecnie dwa 392 00:17:18,540 --> 00:17:23,510 argumenty i b, aby zamienić, co ja zamiar napisać na pierwszej z nich, 393 00:17:23,510 --> 00:17:27,720 które mam zamiar zadzwonić nazywać? 394 00:17:27,720 --> 00:17:30,610 >> Dokładnie 123. 395 00:17:30,610 --> 00:17:31,905 Więc to mam prawo to. 396 00:17:31,905 --> 00:17:32,955 Jest to parametr. 397 00:17:32,955 --> 00:17:35,856 Kładę adres x tam. 398 00:17:35,856 --> 00:17:38,152 >> Co to jest? 399 00:17:38,152 --> 00:17:40,890 >> Co to jest? 400 00:17:40,890 --> 00:17:41,190 >> Nr, nr. 401 00:17:41,190 --> 00:17:41,720 To jest OK. 402 00:17:41,720 --> 00:17:42,570 Nadal dobre, nadal dobre. 403 00:17:42,570 --> 00:17:43,530 Tak to jest. 404 00:17:43,530 --> 00:17:46,240 A teraz na drugiej kartce papieru, to będzie b, i co ja mam 405 00:17:46,240 --> 00:17:49,010 będzie pisemnie ten kawałek papieru? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Więc jedyne, co się zmieniło od nasze poprzednie opowiadanie tej historii, 408 00:17:53,720 --> 00:17:58,590 zamiast dosłownie 1 i 2, jestem przejdzie w 123 i 127. 409 00:17:58,590 --> 00:18:02,130 I mam teraz zamiar umieścić te wnętrza tego pola, wszystko w porządku? 410 00:18:02,130 --> 00:18:04,640 Tak, że czarna skrzynka stanowi obecnie Funkcja wymiany. 411 00:18:04,640 --> 00:18:07,230 >> Tymczasem, niech teraz ktoś realizować funkcję wymiany. 412 00:18:07,230 --> 00:18:09,090 Czy ktoś się tutaj jak zostać wolontariuszem? 413 00:18:09,090 --> 00:18:09,560 Chodź na górę. 414 00:18:09,560 --> 00:18:11,080 Jak masz na imię? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Wszystko w porządku, Charlie. 417 00:18:12,080 --> 00:18:14,810 Chodź na górę. 418 00:18:14,810 --> 00:18:17,310 >> Więc Charlie zagra Rola naszej czarnej skrzynki. 419 00:18:17,310 --> 00:18:21,460 A Charlie, co chciałbym Ci zrobić teraz jest wdrożenie swapa w taki sposób, 420 00:18:21,460 --> 00:18:25,320 że biorąc pod uwagę te dwa adresy, Ci rzeczywiście dzieje 421 00:18:25,320 --> 00:18:26,330 do zmiany wartości. 422 00:18:26,330 --> 00:18:28,290 A ja szepczę do ucha jak uruchomić telewizję tutaj. 423 00:18:28,290 --> 00:18:29,930 >> Więc śmiało, i jesteś czarna skrzynka. 424 00:18:29,930 --> 00:18:30,920 Dojdzie tam. 425 00:18:30,920 --> 00:18:34,054 Jakie wartości widzisz na i Jakie wartości widzisz na b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: jest 123 i b wynosi 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID MALAN: OK, dokładnie. 428 00:18:37,530 --> 00:18:38,940 Teraz zatrzymać się tam na chwilę. 429 00:18:38,940 --> 00:18:41,680 Pierwszą rzeczą, którą zamierzamy zrobić teraz, zgodnie z kodem - które 430 00:18:41,680 --> 00:18:43,220 Będę teraz pull up na ekranie - 431 00:18:43,220 --> 00:18:46,750 będzie przeznaczyć trochę bit pamięci o nazwie Temp. 432 00:18:46,750 --> 00:18:48,850 Więc mam zamiar iść do przodu i daje tej pamięci. 433 00:18:48,850 --> 00:18:52,210 >> Więc to będzie trzecia zmienna , że masz dostęp do 434 00:18:52,210 --> 00:18:54,080 dzwoniłeś Temp. 435 00:18:54,080 --> 00:18:57,120 I co masz zamiar napisać temp na kawałku papieru? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: Wskaźniki, prawda? 438 00:19:03,470 --> 00:19:04,790 >> DAVID MALAN: OK, no nie koniecznie wskazówek. 439 00:19:04,790 --> 00:19:07,230 Więc linia kodu mam podświetlony na prawej stronie, 440 00:19:07,230 --> 00:19:07,900 zacznijmy tam. 441 00:19:07,900 --> 00:19:08,890 To mówi gwiazda. 442 00:19:08,890 --> 00:19:11,670 Tak jest obecnie przechowywania Numer 123. 443 00:19:11,670 --> 00:19:16,660 I tylko intuicyjnie, co czy gwiazda 123 oznacza? 444 00:19:16,660 --> 00:19:21,630 >> Ale w szczególności, jeśli jest 123, gwiazda znaczy co? 445 00:19:21,630 --> 00:19:22,560 Wartość. 446 00:19:22,560 --> 00:19:24,580 Lub bardziej przypadkowo, tam. 447 00:19:24,580 --> 00:19:28,620 Więc pozwól mi zaproponować, trzymając w Twoja ręka, śmiało traktować, że 448 00:19:28,620 --> 00:19:29,430 jakby to mapa. 449 00:19:29,430 --> 00:19:32,940 I iść sobie na do komputera pamięci i nas znaleźć to, co jest 450 00:19:32,940 --> 00:19:36,520 na miejscu 123. 451 00:19:36,520 --> 00:19:37,720 Dokładnie. 452 00:19:37,720 --> 00:19:41,100 >> Widzimy więc, na miejscu 123 to, co, oczywiście? 453 00:19:41,100 --> 00:19:44,240 OK, więc to, co masz teraz wartość zamiar umieścić w temperaturze? 454 00:19:44,240 --> 00:19:44,750 Dokładnie. 455 00:19:44,750 --> 00:19:45,600 Więc zrób to. 456 00:19:45,600 --> 00:19:51,280 I napisać numer 1 na kartce Papier, który jest aktualnie pod tytułem Temp. 457 00:19:51,280 --> 00:19:53,540 >> A teraz następny krok, który masz zamiar wdrożyć 458 00:19:53,540 --> 00:19:54,310 będzie co. 459 00:19:54,310 --> 00:19:57,820 Cóż, z prawej strony następna linia kodu jest gwiazda b. b, z 460 00:19:57,820 --> 00:19:59,260 Oczywiście, przechowuje adres. 461 00:19:59,260 --> 00:20:02,270 To dotyczy 127. 462 00:20:02,270 --> 00:20:06,620 Gwiazda b oznacza co, od niechcenia mówi? 463 00:20:06,620 --> 00:20:08,700 >> Idź do tej lokalizacji. 464 00:20:08,700 --> 00:20:14,988 Więc idź naprzód i znaleźć nam co jest na miejscu 127. 465 00:20:14,988 --> 00:20:15,480 OK. 466 00:20:15,480 --> 00:20:19,170 Oczywiście, w miejsce 127, jest nadal wartość 2. 467 00:20:19,170 --> 00:20:24,060 Więc co masz zamiar teraz sklep na co jest w miejscu, w? 468 00:20:24,060 --> 00:20:26,860 Więc hotel środkiem przejdź do lokalizacji na. 469 00:20:26,860 --> 00:20:29,770 Czym jest lokalizacja? 470 00:20:29,770 --> 00:20:30,430 >> Dokładnie. 471 00:20:30,430 --> 00:20:34,190 Więc teraz, jeśli chcesz zmienić co jest w tym miejscu - 472 00:20:34,190 --> 00:20:36,470 Pójdę dalej i uruchomić gumka są tutaj. 473 00:20:36,470 --> 00:20:37,760 I teraz umieścić go z powrotem na szczotkę. 474 00:20:37,760 --> 00:20:42,190 Jaki numer masz zamiar pisać w tym pustym polu teraz? 475 00:20:42,190 --> 00:20:42,850 >> Dokładnie. 476 00:20:42,850 --> 00:20:46,470 Tak więc ta linia kodu, aby być jasne - niech mnie zatrzymać to, co robi i Charliego 477 00:20:46,470 --> 00:20:51,730 podkreślić tutaj, co on po prostu zrobił to napisz do tego pola w miejscu 123 478 00:20:51,730 --> 00:20:55,150 wartość, która była wcześniej w B. 479 00:20:55,150 --> 00:20:59,140 I tak mamy teraz rzeczywiście realizowane ta druga linia kodu. 480 00:20:59,140 --> 00:21:01,920 >> Teraz, niestety, nie ma jeszcze jedna linia pozostała. 481 00:21:01,920 --> 00:21:04,900 Teraz to, co jest w temperaturze, dosłownie? 482 00:21:04,900 --> 00:21:06,200 Jest to oczywiście numer jeden. 483 00:21:06,200 --> 00:21:07,020 To nie przemówień. 484 00:21:07,020 --> 00:21:09,380 To tylko liczba, rodzaj Zmienna od tygodnia jeden. 485 00:21:09,380 --> 00:21:13,520 >> A teraz, kiedy mówisz gwiazda b, co oznacza, że przejdź do B Adres, który jest 486 00:21:13,520 --> 00:21:15,090 Kurs tutaj. 487 00:21:15,090 --> 00:21:16,020 Więc kiedy się tam dostać - 488 00:21:16,020 --> 00:21:18,320 Pójdę dalej i usunąć to, co w rzeczywistości tam - a co ty 489 00:21:18,320 --> 00:21:20,820 zamiar napisać teraz na 127 lokalizacji? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, który jest jeden. 491 00:21:22,010 --> 00:21:23,430 >> DAVID MALAN: Temp, który jest jeden. 492 00:21:23,430 --> 00:21:25,670 A co się dzieje, do temperatury w końcu? 493 00:21:25,670 --> 00:21:26,600 Cóż, naprawdę nie wiem. 494 00:21:26,600 --> 00:21:27,420 Tak naprawdę nie obchodzi. 495 00:21:27,420 --> 00:21:31,090 Za każdym razem, my wprowadziliśmy funkcję do tej pory, wszelkie zmienne lokalne masz 496 00:21:31,090 --> 00:21:31,890 rzeczywiście są lokalne. 497 00:21:31,890 --> 00:21:33,060 A oni po prostu zniknąć. 498 00:21:33,060 --> 00:21:35,040 Są one odzyskane przez działającego System ostatecznie. 499 00:21:35,040 --> 00:21:39,800 >> Tak więc fakt, że temperatura jeszcze wartość 1 jest rodzaj gruntu 500 00:21:39,800 --> 00:21:41,150 nieciekawe do nas. 501 00:21:41,150 --> 00:21:43,100 W porządku, więc brawa czy możemy dla Charliego. 502 00:21:43,100 --> 00:21:46,400 Bardzo dobrze zrobione. 503 00:21:46,400 --> 00:21:51,520 >> No dobrze, więc co więcej robi oznacza to, co możemy zrobić? 504 00:21:51,520 --> 00:21:54,400 Tak więc okazuje się, że byliśmy mówi kilka białych kłamstw 505 00:21:54,400 --> 00:21:55,540 już od jakiegoś czasu. 506 00:21:55,540 --> 00:21:59,990 W rzeczywistości okazuje się, że ciąg, Wszystkie tego czasu, nie jest tak naprawdę 507 00:21:59,990 --> 00:22:02,190 Sekwencja znaków per se. 508 00:22:02,190 --> 00:22:03,980 To niby jest, że intuicyjnie. 509 00:22:03,980 --> 00:22:08,270 >> Ale technicznie rzecz biorąc, ciąg jest Typ danych, które uznane wewnątrz 510 00:22:08,270 --> 00:22:12,170 CS50 biblioteka uprościć świat w pierwszych kilku tygodniach od klasy. 511 00:22:12,170 --> 00:22:20,130 Co tak naprawdę jest ciąg jest adres o charakterze gdzieś w pamięci RAM. 512 00:22:20,130 --> 00:22:25,530 Ciąg jest naprawdę wiele, tak jak 123 lub 127, które zdarza się wyznaczenie 513 00:22:25,530 --> 00:22:28,420 gdzie ciąg rozpoczyna się w pamięci komputera. 514 00:22:28,420 --> 00:22:31,870 >> Ale to nie oznacza ciąg, per se, sama. 515 00:22:31,870 --> 00:22:33,460 I widzimy to w następujący sposób. 516 00:22:33,460 --> 00:22:35,980 Pozwólcie mi iść do przodu i otworzyć niektóre kod, który znajduje się między 517 00:22:35,980 --> 00:22:38,340 dzisiejsze przykłady kodu źródłowego. 518 00:22:38,340 --> 00:22:42,225 I zamierzam iść do przodu i otworzyć się, powiedzmy, porównanie-0.c. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 To buggy program, który będzie być realizowane w następujący sposób. 521 00:22:48,790 --> 00:22:49,040 >> Po pierwsze. 522 00:22:49,040 --> 00:22:50,420 Mam zamiar coś powiedzieć. 523 00:22:50,420 --> 00:22:52,660 Potem mam zamiar iść do przodu i uzyskać ciąg od użytkownika 524 00:22:52,660 --> 00:22:53,750 w tej nowej linii. 525 00:22:53,750 --> 00:22:55,370 Potem mam zamiar powiedzieć to jeszcze raz. 526 00:22:55,370 --> 00:22:57,540 Potem mam zamiar dostać inny ciąg od użytkownika. 527 00:22:57,540 --> 00:23:00,390 >> I zauważ, jestem pokazano jedną z ciągi w zmiennej o nazwie s, a 528 00:23:00,390 --> 00:23:03,040 drugiego z tych ciągów w zmiennej o nazwie t. 529 00:23:03,040 --> 00:23:07,480 A teraz mam zamiar twierdzić, bardzo zasadnie, że jeśli s jest równa jest równa t, 530 00:23:07,480 --> 00:23:08,940 łańcuchy są takie same. 531 00:23:08,940 --> 00:23:09,970 Możesz wpisać to samo. 532 00:23:09,970 --> 00:23:11,830 Else, łańcuchy są nie to samo. 533 00:23:11,830 --> 00:23:15,440 >> Po tym wszystkim, jeśli wejście dwie wskazówki, dwa znaki, dwa pływaki, dwa dwuosobowe, wszystkie z 534 00:23:15,440 --> 00:23:18,400 typy danych Mówiliśmy o tak daleko, aby porównać je - 535 00:23:18,400 --> 00:23:22,070 Przypominam sobie zrobiliśmy bardzo jasne, podczas gdy temu że nie robią tego, bo 536 00:23:22,070 --> 00:23:25,840 Pojedynczy znak równości jest oczywiście Operator przypisania. 537 00:23:25,840 --> 00:23:26,820 Więc to będzie błąd. 538 00:23:26,820 --> 00:23:29,260 >> Używamy równy znak równości, które rzeczywiście porównuje 539 00:23:29,260 --> 00:23:31,050 rzeczy dla prawdziwej równości. 540 00:23:31,050 --> 00:23:32,275 Ale twierdzą, jest to buggy. 541 00:23:32,275 --> 00:23:37,400 Jeśli pójdę do przodu i zrobić porównanie do zera, a następnie nie dot slash porównać do zera. 542 00:23:37,400 --> 00:23:39,700 I wpisz w, powiedzmy, witam. 543 00:23:39,700 --> 00:23:41,590 A potem niech się przywitać ponownie. 544 00:23:41,590 --> 00:23:46,040 Dosłownie to samo, komputer Roszczenia Wpisałem różne rzeczy. 545 00:23:46,040 --> 00:23:47,640 >> Teraz może po prostu błędnie coś. 546 00:23:47,640 --> 00:23:49,910 Będę wpisać moje imię tym razem. 547 00:23:49,910 --> 00:23:52,580 To znaczy, cześć. 548 00:23:52,580 --> 00:23:54,770 Hello. 549 00:23:54,770 --> 00:23:57,360 Jest inaczej za każdym razem. 550 00:23:57,360 --> 00:23:58,430 >> Cóż, to dlaczego? 551 00:23:58,430 --> 00:24:00,140 Co się naprawdę dzieje pod maską? 552 00:24:00,140 --> 00:24:03,270 Cóż, to, co tak naprawdę dzieje się pod kaptur jest ciąg a następnie 553 00:24:03,270 --> 00:24:07,410 Wpisałem w tym po raz pierwszy, na przykład jest słowo hello, oczywiście. 554 00:24:07,410 --> 00:24:11,660 Ale jeśli reprezentujemy to pod okap, przypomnieć, że 555 00:24:11,660 --> 00:24:13,470 ciąg jest w tablicy. 556 00:24:13,470 --> 00:24:15,040 I mówiliśmy tyle w przeszłości. 557 00:24:15,040 --> 00:24:20,200 >> Więc jeśli rysuję tej tablicy tak, jestem będzie reprezentować coś zupełnie 558 00:24:20,200 --> 00:24:23,030 podobny do tego, co zrobiliśmy przed chwilą. 559 00:24:23,030 --> 00:24:25,390 I tam rzeczywiście coś specjalnego tutaj też. 560 00:24:25,390 --> 00:24:28,090 Czego możemy określić został na koniec każdego łańcucha? 561 00:24:28,090 --> 00:24:30,760 Tak, to zerowy backslash, który jest tylko sposób reprezentacji, 562 00:24:30,760 --> 00:24:33,610 dosłownie, 00000000. 563 00:24:33,610 --> 00:24:35,680 Osiem 0 bity rzędu. 564 00:24:35,680 --> 00:24:37,610 >> Nie wiem, szczerze mówiąc, co po tym. 565 00:24:37,610 --> 00:24:40,090 To tylko kilka więcej RAM wewnątrz komputera. 566 00:24:40,090 --> 00:24:40,970 Ale to jest tablica. 567 00:24:40,970 --> 00:24:42,260 Rozmawialiśmy o tablicach przed. 568 00:24:42,260 --> 00:24:45,010 A my zwykle mówić o macierzach jako miejsce zero, 569 00:24:45,010 --> 00:24:46,580 potem jeden, potem dwa. 570 00:24:46,580 --> 00:24:47,950 Ale to tylko dla wygody. 571 00:24:47,950 --> 00:24:49,380 I to jest całkowicie względne. 572 00:24:49,380 --> 00:24:53,010 >> Kiedy rzeczywiście coraz pamięci z komputer, to oczywiście każdego 573 00:24:53,010 --> 00:24:55,450 2000000000 niektóre dziwne bajtów, potencjalnie. 574 00:24:55,450 --> 00:24:59,100 Tak naprawdę pod maską, przez cały ten czas, tak. 575 00:24:59,100 --> 00:25:01,670 To może być bardzo dobrze zera wspornik. 576 00:25:01,670 --> 00:25:04,780 Ale jeśli kopać jeszcze głębiej pod kaptur, to naprawdę 577 00:25:04,780 --> 00:25:07,000 adres numer 123. 578 00:25:07,000 --> 00:25:09,150 To jest adres 124. 579 00:25:09,150 --> 00:25:11,040 To jest adres 125. 580 00:25:11,040 --> 00:25:12,540 >> I nie spieprz tego czasu. 581 00:25:12,540 --> 00:25:15,840 Są to obecnie jeden bajtów siebie z jakiego powodu? 582 00:25:15,840 --> 00:25:17,930 Jak duży jest char? 583 00:25:17,930 --> 00:25:19,170 Char jest tylko jeden bajt. 584 00:25:19,170 --> 00:25:20,570 Int jest zwykle cztery bajty. 585 00:25:20,570 --> 00:25:24,850 Więc dlatego zrobiłem to 123, 127, 131 i tak dalej. 586 00:25:24,850 --> 00:25:27,560 Teraz mogę utrzymać math prostsze i po prostu zrobić plus 1. 587 00:25:27,560 --> 00:25:30,510 I to jest teraz to, co się naprawdę dzieje on pod maską. 588 00:25:30,510 --> 00:25:37,760 >> Więc jeśli deklarują coś takiego, string s, to faktycznie - 589 00:25:37,760 --> 00:25:39,170 Okazuje się - 590 00:25:39,170 --> 00:25:41,190 char gwiazda. 591 00:25:41,190 --> 00:25:44,640 Gwiazda, oczywiście oznacza adres, aka pointer. 592 00:25:44,640 --> 00:25:46,200 Więc jest to adres coś. 593 00:25:46,200 --> 00:25:47,510 Co to jest adres? 594 00:25:47,510 --> 00:25:47,760 >> Cóż - 595 00:25:47,760 --> 00:25:51,680 Jestem jedynym, który widzi bardzo Ważnym punktem robię, lub myśleć 596 00:25:51,680 --> 00:25:52,560 Robię. 597 00:25:52,560 --> 00:25:55,270 Więc string - 598 00:25:55,270 --> 00:25:57,180 Smutne jest to, mam monitor tam gdzie ja 599 00:25:57,180 --> 00:25:58,100 mógł zobaczyć, że. 600 00:25:58,100 --> 00:26:00,990 >> W porządku, więc ciąg s jest to, co I oświadczył wcześniej. 601 00:26:00,990 --> 00:26:04,600 Ale okazuje się, dzięki mało Magia w CS50 bibliotece, to wszystko 602 00:26:04,600 --> 00:26:08,780 Czas ma dosłownie ciąg było char gwiazda. 603 00:26:08,780 --> 00:26:11,310 Oznacza gwiazda ponownie wskaźnik lub adres. 604 00:26:11,310 --> 00:26:14,180 Fakt, że to flankująca słowo char oznacza to 605 00:26:14,180 --> 00:26:15,970 adres znaku. 606 00:26:15,970 --> 00:26:23,100 >> Jeśli więc uzyskać ciąg nazywa, i wpisz w H-E-L-L-O, proponuję teraz, co ma dostać 607 00:26:23,100 --> 00:26:27,330 ciąg dosłownie powróciła wszystkie tym razem, mimo że mamy dość 608 00:26:27,330 --> 00:26:29,980 uproszczona świat? 609 00:26:29,980 --> 00:26:33,310 Co robi się ciąg faktycznie powrócić jako wartość zwracana? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123, w tym przypadku, na przykład. 612 00:26:38,720 --> 00:26:42,630 Mamy wcześniej powiedział, że dostać ciąg po prostu zwraca ciąg, ciąg 613 00:26:42,630 --> 00:26:43,300 znaków. 614 00:26:43,300 --> 00:26:44,790 Ale to trochę białym kłamstwem. 615 00:26:44,790 --> 00:26:48,010 Sposób uzyskać ciąg naprawdę działa pod maską to robi 616 00:26:48,010 --> 00:26:48,930 ciąg od użytkownika. 617 00:26:48,930 --> 00:26:51,530 To plops znaki, które On lub ona rodzaje w pamięci. 618 00:26:51,530 --> 00:26:54,680 Stawia zero backslash na końcu z tych sekwencji znaków. 619 00:26:54,680 --> 00:26:57,310 >> Ale to, co robi się ciąg dosłownie wrócić? 620 00:26:57,310 --> 00:27:02,710 Dosłownie zwraca adres Pierwsze bajtów pamięci RAM 621 00:27:02,710 --> 00:27:04,130 jest wykorzystywane do tego siły. 622 00:27:04,130 --> 00:27:07,500 I okazuje się, że tylko przez powrót Pojedynczy adres 623 00:27:07,500 --> 00:27:12,120 Pierwszy znak w łańcuchu, który jest wystarczający dla znalezienia całość 624 00:27:12,120 --> 00:27:12,630 ciąg. 625 00:27:12,630 --> 00:27:16,930 >> Innymi słowy, pobiera ciąg znaków nie ma powrót 123, 124 i 125. 626 00:27:16,930 --> 00:27:19,950 To nie musi się dać mi długo Lista wszystkich bajtów 627 00:27:19,950 --> 00:27:20,740 mój ciąg jest za pomocą. 628 00:27:20,740 --> 00:27:22,670 Ponieważ jednym, wszystkie są z powrotem do tyłu. 629 00:27:22,670 --> 00:27:28,160 Drugiego, w zależności od pierwszego adresu, że można dowiedzieć się, gdzie ciąg kończy. 630 00:27:28,160 --> 00:27:29,910 W jaki sposób? 631 00:27:29,910 --> 00:27:33,490 >> Specjalny znak null, użyjemy zera na końcu. 632 00:27:33,490 --> 00:27:35,430 Tak więc, innymi słowy, jeśli przejechaniu około - 633 00:27:35,430 --> 00:27:36,530 wewnątrz zmiennych - 634 00:27:36,530 --> 00:27:41,300 adres char i bierze , że na końcu każdego łańcucha, dowolną 635 00:27:41,300 --> 00:27:45,040 Sekwencja znaków, jak my, ludzie, myśleć o strunach, jeśli przyjąć, że 636 00:27:45,040 --> 00:27:48,600 na końcu każdego takiego ciągu istnieje zero backslash, jesteś złoty. 637 00:27:48,600 --> 00:27:52,430 Bo zawsze można znaleźć koniec łańcucha. 638 00:27:52,430 --> 00:27:54,870 >> Teraz to, co jest naprawdę, a następnie będzie on w tym programie? 639 00:27:54,870 --> 00:27:59,990 Dlaczego ten program, porównanie-0.c, buggy? 640 00:27:59,990 --> 00:28:01,690 Co jest rzeczywiście w porównaniu? 641 00:28:01,690 --> 00:28:02,420 Tak? 642 00:28:02,420 --> 00:28:05,000 >> STUDENT: [niesłyszalne]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID MALAN: Dokładnie. 644 00:28:05,730 --> 00:28:08,350 To porównanie lokalizacje z ciągów. 645 00:28:08,350 --> 00:28:12,420 Więc jeśli użytkownik wpisał w witam raz, jak ja, pamięć może skończyć się 646 00:28:12,420 --> 00:28:13,430 wygląda tak. 647 00:28:13,430 --> 00:28:18,210 Jeśli użytkownik naciśnie klawisz w Witam ponownie, ale dzwoniąc uzyskać ciąg ponownie, c jest 648 00:28:18,210 --> 00:28:21,800 nie szczególnie mądry, chyba że nauczy , że jest mądry, pisząc kod. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 i bardziej ogólnie - komputery 651 00:28:23,860 --> 00:28:27,370 po wpisaniu w słowie Witam ponownie, wiesz, co masz zamiar uzyskać. 652 00:28:27,370 --> 00:28:31,480 Jesteś po prostu dostanie drugą tablicę z pamięci, tak, zdarza się 653 00:28:31,480 --> 00:28:35,510 przechowywanie H-E-L-L-O i tak dalej. 654 00:28:35,510 --> 00:28:38,240 >> To będzie wyglądać tak samo do nas ludzie, ale ten adres 655 00:28:38,240 --> 00:28:39,460 może nie być 123. 656 00:28:39,460 --> 00:28:42,470 To może tak się zdarzyć, że System operacyjny ma jedne dostępne 657 00:28:42,470 --> 00:28:45,430 miejsce na przykład w miejscu - 658 00:28:45,430 --> 00:28:49,820 powiedzmy, że coś niepożądanego, jak to jest lokalizacja 200. 659 00:28:49,820 --> 00:28:51,620 I to jest miejsce 201. 660 00:28:51,620 --> 00:28:53,060 I to jest miejsce 202. 661 00:28:53,060 --> 00:28:55,730 Nie mamy pojęcia, gdzie to jest w będzie w pamięci. 662 00:28:55,730 --> 00:28:59,110 >> Ale co to oznacza to, że to, co jest będzie przechowywany ostatecznie s? 663 00:28:59,110 --> 00:29:00,750 Numer 123. 664 00:29:00,750 --> 00:29:04,860 Co się dzieje, przechowywać w t, w tej arbitralnej przykład? 665 00:29:04,860 --> 00:29:06,300 Numer 200. 666 00:29:06,300 --> 00:29:11,410 A wszystko to oznacza, to jest oczywiście, 123 nie jest równa 200. 667 00:29:11,410 --> 00:29:14,940 A więc to, czy nie stanie wartość true. 668 00:29:14,940 --> 00:29:18,430 Ponieważ get ciąg jest za pomocą różnych fragmenty pamięci za każdym razem. 669 00:29:18,430 --> 00:29:20,360 >> Teraz możemy zobaczyć to jeszcze raz W innym przykładzie. 670 00:29:20,360 --> 00:29:23,764 Pozwólcie mi iść do przodu i otworzyć kopiowaniem 0.c. 671 00:29:23,764 --> 00:29:28,770 I twierdzą, że ten przykład będzie spróbować - ale nie uda się - dwa ciągi 672 00:29:28,770 --> 00:29:29,910 w następujący sposób. 673 00:29:29,910 --> 00:29:31,730 >> Mam zamiar coś powiedzieć dla użytkownika. 674 00:29:31,730 --> 00:29:34,490 Jestem wtedy dostanie Łańcuch i nazywają to s. 675 00:29:34,490 --> 00:29:36,400 A teraz robię ten test tutaj. 676 00:29:36,400 --> 00:29:37,990 Wspominaliśmy już, to z powrotem podczas. 677 00:29:37,990 --> 00:29:42,490 Ale kiedy może się zwróć NULL ciągu, inny znak specjalny, lub specjalne 678 00:29:42,490 --> 00:29:45,050 symbol powiedzmy. 679 00:29:45,050 --> 00:29:45,900 Jeśli jest to z pamięci. 680 00:29:45,900 --> 00:29:48,970 >> Na przykład, jeśli użytkownik jest naprawdę jest trudne i rodzaje okropna 681 00:29:48,970 --> 00:29:51,220 liczba znaków w klawiatura i odsłon Enter. 682 00:29:51,220 --> 00:29:54,580 Jeśli ta liczba znaków po prostu nie może się w pamięci RAM niezależnie szalone 683 00:29:54,580 --> 00:29:57,820 Powodem, jak uzyskać ciąg może bardzo dobrze zwróci wartość null. 684 00:29:57,820 --> 00:30:01,080 >> Lub, jeśli program sam robi wiele, z innymi i nie tylko 685 00:30:01,080 --> 00:30:03,790 Za mało pamięci do get ciąg aby odnieść sukces, to może skończyć 686 00:30:03,790 --> 00:30:05,240 up powrocie null. 687 00:30:05,240 --> 00:30:07,160 Ale bądźmy bardziej precyzyjne , co to jest. 688 00:30:07,160 --> 00:30:10,280 Co to jest typ S w dane naprawdę? 689 00:30:10,280 --> 00:30:11,610 Char gwiazdki. 690 00:30:11,610 --> 00:30:14,560 >> Okazuje się teraz, że mogą się odklejać kopii warstwy null. 691 00:30:14,560 --> 00:30:17,500 Okazuje się, null jest - tak, oczywiście specjalny symbol. 692 00:30:17,500 --> 00:30:19,190 Ale co to jest naprawdę? 693 00:30:19,190 --> 00:30:25,220 Naprawdę, null to tylko symbol, że ludzie używają do reprezentowania zera, jak również. 694 00:30:25,220 --> 00:30:29,010 >> Więc autorów C i komputery bardziej ogólnie, postanowił rok temu 695 00:30:29,010 --> 00:30:30,010 , wiesz co. 696 00:30:30,010 --> 00:30:34,850 Dlaczego nie możemy zagwarantować, że żaden użytkownik dane nigdy, nigdy, nigdy 697 00:30:34,850 --> 00:30:36,730 przechowywany w temperaturze zera bye? 698 00:30:36,730 --> 00:30:39,610 W rzeczywistości, nawet w moim dowolnego przykładu przed, nie rozpocząć numerowanie 699 00:30:39,610 --> 00:30:40,390 bajtów na zero. 700 00:30:40,390 --> 00:30:41,540 Zacząłem w jednym. 701 00:30:41,540 --> 00:30:44,950 Ponieważ wiedziałem, że ludzie na świecie Postanowiliśmy zarezerwować zera 702 00:30:44,950 --> 00:30:47,970 byte w niczyjej pamięci RAM jako coś specjalnego. 703 00:30:47,970 --> 00:30:52,020 >> Powodem jest, kiedy tylko chcesz sygnał, że coś poszło nie tak 704 00:30:52,020 --> 00:30:55,960 w odniesieniu do adresów, powróciłeś NULL - zwie zera - 705 00:30:55,960 --> 00:30:59,410 a bo wiesz, że nie ma legit dane o adresie zero wyraźnie 706 00:30:59,410 --> 00:31:00,400 Oznacza to, że komunikat o błędzie. 707 00:31:00,400 --> 00:31:04,080 I dlatego my, zgodnie z konwencją, sprawdź o coś pustego i powrót 708 00:31:04,080 --> 00:31:06,260 jak jeden z tych przypadków. 709 00:31:06,260 --> 00:31:09,300 >> Jeśli więc przewijać teraz, to tylko następnie sprawdzanie błędów, tylko w przypadku 710 00:31:09,300 --> 00:31:10,610 coś poszło nie tak z [? bail?] 711 00:31:10,610 --> 00:31:13,470 całkowicie i zamknąć program powracając wcześnie. 712 00:31:13,470 --> 00:31:19,030 Ta linia teraz mogą być zapisane jak to, co oznacza, co? 713 00:31:19,030 --> 00:31:23,155 Na lewej stronie, daj mi inną wskaźnik do znaku, i nazywają to t. 714 00:31:23,155 --> 00:31:26,935 Co ja przechowywania wewnątrz t, w oparciu na tej jednej linii kodu? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Jestem przechowywania lokalizację. 717 00:31:32,170 --> 00:31:34,742 Konkretnie lokalizacja to było w tych. 718 00:31:34,742 --> 00:31:39,000 Więc jeśli użytkownik wpisał w hello, i że pierwsza cześć dzieje się skończyć 719 00:31:39,000 --> 00:31:42,567 tu, a następnie numer 123 jest wróci z uzyskania 720 00:31:42,567 --> 00:31:43,810 ciągu i być przechowywane - 721 00:31:43,810 --> 00:31:44,780 jak powiedzieliśmy wcześniej - 722 00:31:44,780 --> 00:31:45,440 w sekundach. 723 00:31:45,440 --> 00:31:50,560 >> Kiedy teraz zadeklarować inny wskaźnik do char i nazywają to t, jaki numer jest 724 00:31:50,560 --> 00:31:53,940 dosłownie skończy w t zgodnie z historii? 725 00:31:53,940 --> 00:31:55,420 Więc 123. 726 00:31:55,420 --> 00:32:00,310 >> Więc technicznie teraz zarówno s i t wskazują na dokładną 727 00:32:00,310 --> 00:32:02,410 same fragmenty pamięci. 728 00:32:02,410 --> 00:32:06,140 Tak więc zauważyć, co mam teraz zrobić, aby udowodnić, że ten program ma błędy. 729 00:32:06,140 --> 00:32:08,820 >> Najpierw zamierzam twierdzić, ze f druku, wykorzystując 730 00:32:08,820 --> 00:32:10,080 kopia napisu. 731 00:32:10,080 --> 00:32:11,660 Potem mam zamiar zrobić trochę sprawdzanie błędów. 732 00:32:11,660 --> 00:32:12,160 Idę się upewnić. 733 00:32:12,160 --> 00:32:16,710 Upewnijmy się, że łańcuch jest na t najmniej większa od zera w długości, 734 00:32:16,710 --> 00:32:19,190 więc jest tam jakiś znak właściwie wykorzystać. 735 00:32:19,190 --> 00:32:22,840 >> A potem można przypomnieć to z poprzednich przykładów. 736 00:32:22,840 --> 00:32:25,630 2 górna - która jest w ctype.h plik. 737 00:32:25,630 --> 00:32:30,800 T Uchwyt zera daje mi zero charakter t smyczkowy. 738 00:32:30,800 --> 00:32:34,360 I 2 górne tej samej wartości, Oczywiście, przetwarza go na wielkie litery. 739 00:32:34,360 --> 00:32:38,230 >> Tak intuicyjnie, to podświetlony wiersz kodu jest czerpanie pierwszy 740 00:32:38,230 --> 00:32:40,250 List wt. 741 00:32:40,250 --> 00:32:44,485 Ale to nie jest kapitalizacji, intuicyjnie, Pierwsza litera s. 742 00:32:44,485 --> 00:32:48,130 Ale jeśli myślisz dalej, co mam by zobaczyć, gdy uruchomię ten program 743 00:32:48,130 --> 00:32:54,220 i wydrukować zarówno oryginalne, y, i tak zwana kopia, T? 744 00:32:54,220 --> 00:32:55,350 >> Oni rzeczywiście będzie tak samo. 745 00:32:55,350 --> 00:32:56,600 I dlaczego są one będzie tak samo? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Obaj wskazując dokładnie to samo. 748 00:33:01,020 --> 00:33:01,610 Więc zróbmy to. 749 00:33:01,610 --> 00:33:03,160 >> Marka zera kopiowania. 750 00:33:03,160 --> 00:33:04,070 Kompiluje OK. 751 00:33:04,070 --> 00:33:06,500 Pozwólcie mi biegać zera kopiowania. 752 00:33:06,500 --> 00:33:10,110 Pozwól mi wpisać coś komentarzy w wszystkie małe litery, a następnie naciśnij Enter. 753 00:33:10,110 --> 00:33:16,520 I twierdzi, że zarówno przy s i kopia są rzeczywiście identyczne. 754 00:33:16,520 --> 00:33:17,920 >> Więc co tak naprawdę się stało? 755 00:33:17,920 --> 00:33:20,100 Pozwól mi przerysować ten obraz tylko opowiedzieć się 756 00:33:20,100 --> 00:33:21,340 nieco inny sposób. 757 00:33:21,340 --> 00:33:26,060 Co tak naprawdę dzieje się pod kaptur kiedy Oświadczam coś 758 00:33:26,060 --> 00:33:30,410 char początek s, lub string s, Otrzymuję wskaźnik - 759 00:33:30,410 --> 00:33:33,090 co dzieje się z czterech bajtów w CS50 urządzenia 760 00:33:33,090 --> 00:33:34,410 oraz w wielu komputerach. 761 00:33:34,410 --> 00:33:36,008 I mam zamiar nazwać s. 762 00:33:36,008 --> 00:33:39,810 I to ma obecnie jakaś nieznana wartość. 763 00:33:39,810 --> 00:33:43,900 >> Kiedy deklarujesz zmienną, chyba że samemu umieścić wartość tam, kto 764 00:33:43,900 --> 00:33:44,570 wie, co tam jest. 765 00:33:44,570 --> 00:33:48,110 Może to być także losowa sekwencja bity z poprzedniej realizacji. 766 00:33:48,110 --> 00:33:52,490 Kiedy więc, w mojej linii kodu nie dostać łańcuch, a następnie zapisać do zwrotu 767 00:33:52,490 --> 00:33:54,800 wartość w sekundach uzyskać ciąg jakoś - 768 00:33:54,800 --> 00:33:58,520 a my będziemy w końcu odwinąć jak uzyskać Prace smyczkowe, w jakiś sposób przydziela 769 00:33:58,520 --> 00:34:00,480 Tablica, która prawdopodobnie wygląda trochę tak. 770 00:34:00,480 --> 00:34:05,390 H-E-L-P-O, odwróconej zera. 771 00:34:05,390 --> 00:34:09,510 >> Załóżmy, że jest to adres 123 tylko pierwsza konsekwencja. 772 00:34:09,510 --> 00:34:13,000 Więc Zwraca łańcuch znaków, w podświetlona linia istnieje, zwraca 773 00:34:13,000 --> 00:34:15,000 liczba powiedzieliśmy, 123. 774 00:34:15,000 --> 00:34:17,420 Więc to, co naprawdę dzieje wewnątrz jest tutaj? 775 00:34:17,420 --> 00:34:26,590 >> No, co naprawdę idzie wewnątrz s jest 123. 776 00:34:26,590 --> 00:34:29,250 Ale szczerze mówiąc, jestem już trochę zdezorientowane wszystkich tych adresów, 777 00:34:29,250 --> 00:34:30,320 Wszystkie z tych wartości arbitralne. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Więc rzeczywiście uprościć świat trochę. 780 00:34:34,570 --> 00:34:38,800 >> Kiedy mówimy o wskaźniki, szczerze mówiąc, do nas ludzie, którzy do cholery obchodzi gdzie 781 00:34:38,800 --> 00:34:39,870 rzeczy są w pamięci? 782 00:34:39,870 --> 00:34:41,080 To jest całkowicie arbitralne. 783 00:34:41,080 --> 00:34:43,370 To będzie zależeć od tego jak dużo RAM użytkownik ma. 784 00:34:43,370 --> 00:34:46,590 To będzie zależeć od kiedy w dzień uruchomieniu programu, być może, i 785 00:34:46,590 --> 00:34:48,250 co wejście użytkownik daje. 786 00:34:48,250 --> 00:34:50,060 Mamy mieszkanie na nieistotnych szczegółach. 787 00:34:50,060 --> 00:34:54,230 >> Więc abstract się i powiedzieć, że po uruchomieniu linii kodu w ten sposób, 788 00:34:54,230 --> 00:34:57,320 char gwiazda s dostaje zwrot wartość get ciąg. 789 00:34:57,320 --> 00:35:02,720 Dlaczego nie, a nie po prostu narysować to, co wzywasz wskaźnik tak, jakby to 790 00:35:02,720 --> 00:35:04,140 wskazując na coś? 791 00:35:04,140 --> 00:35:07,000 Więc twierdzą teraz, że s up jest wskaźnik - 792 00:35:07,000 --> 00:35:08,480 pod maską jest adres. 793 00:35:08,480 --> 00:35:11,330 Ale to jest po prostu wskazując Pierwszy bajt 794 00:35:11,330 --> 00:35:12,780 Ciąg, który został zwrócony. 795 00:35:12,780 --> 00:35:16,710 >> Gdybym teraz do kodu tutaj, co się dzieje na tej linii? 796 00:35:16,710 --> 00:35:20,020 Cóż, w tej zaznaczonej linii teraz, Jestem deklarując najwyraźniej inny 797 00:35:20,020 --> 00:35:21,070 zmienna o nazwie t. 798 00:35:21,070 --> 00:35:25,700 Ale jest to także wskazówka, więc będę narysować go jako, w teorii, dokładny 799 00:35:25,700 --> 00:35:26,710 samo okno rozmiar. 800 00:35:26,710 --> 00:35:28,160 I zamierzam to nazwać t. 801 00:35:28,160 --> 00:35:33,500 >> A teraz, jeśli wrócimy do kodu ponownie, kiedy przechowywać s wewnątrz t, 802 00:35:33,500 --> 00:35:36,920 co ja technicznie umieszczenie wewnątrz t? 803 00:35:36,920 --> 00:35:39,350 Dobrze technicznie, to było 123 numer. 804 00:35:39,350 --> 00:35:42,270 Tak naprawdę powinien być na piśmie 123 numer istnieje. 805 00:35:42,270 --> 00:35:43,900 Ale weźmy to wyższy poziom. 806 00:35:43,900 --> 00:35:48,090 t, jeśli jest to tylko wskaźnik, intuicyjnie, to właśnie to. 807 00:35:48,090 --> 00:35:49,800 To jest wszystko, co jest przechowywane tam. 808 00:35:49,800 --> 00:35:54,970 >> Więc teraz, w ostatnich linii interesujących kodu, kiedy faktycznie go o 809 00:35:54,970 --> 00:36:00,680 kapitalizacji charakter zero wt, co się dzieje? 810 00:36:00,680 --> 00:36:06,310 Cóż, t wspornik zera wskazuje teraz do tego, co postać, zapewne? 811 00:36:06,310 --> 00:36:07,460 >> To wskazuje na godz. 812 00:36:07,460 --> 00:36:08,870 Ponieważ t wspornik zera - 813 00:36:08,870 --> 00:36:12,490 przypominam, jest to stary składnia. t wspornik zera oznacza po prostu, jeśli t jest ciągiem, t 814 00:36:12,490 --> 00:36:15,590 Uchwyt zera oznacza uzyskanie zerowej postać w tym siły. 815 00:36:15,590 --> 00:36:18,650 Więc, co to naprawdę znaczy to udać się do tej tablicy - 816 00:36:18,650 --> 00:36:21,520 i tak, to może być 123, może to być 124. 817 00:36:21,520 --> 00:36:22,790 Ale to wszystko jest względne, pamiętam. 818 00:36:22,790 --> 00:36:25,640 Gdy mówimy o tablicy, mamy Zaletą mówisz 819 00:36:25,640 --> 00:36:27,000 względne indeksy. 820 00:36:27,000 --> 00:36:31,120 >> I tak teraz możemy po prostu założyć, że t zera wspornik h. 821 00:36:31,120 --> 00:36:35,090 Więc jeśli zadzwonię 2 górne na to, co to jest naprawdę robi jest czerpanie 822 00:36:35,090 --> 00:36:38,290 mała litera h na wielkie H. Ale, oczywiście, to, co jest s? 823 00:36:38,290 --> 00:36:41,010 To wskazuje na samej cholernej ciąg. 824 00:36:41,010 --> 00:36:44,200 >> Więc to wszystko, co dzieje się w tym kodzie do tej pory. 825 00:36:44,200 --> 00:36:45,960 Więc co to implikacja? 826 00:36:45,960 --> 00:36:48,300 Jak możemy rozwiązać te dwa problemy? 827 00:36:48,300 --> 00:36:50,870 Jak możemy porównać do rzeczywistych ciągów? 828 00:36:50,870 --> 00:36:53,720 >> Cóż intuicyjnie, w jaki sposób go o porównanie dwóch 829 00:36:53,720 --> 00:36:55,090 Struny do prawdziwej równości? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Co to znaczy, gdy dwa łańcuchy są równe? 832 00:37:00,750 --> 00:37:04,330 Oczywiście, że nie, że ich adresy są równać w pamięci, bo to jest niskie 833 00:37:04,330 --> 00:37:06,590 Szczegóły wdrożenia poziom. 834 00:37:06,590 --> 00:37:08,360 Wszystkie znaki są takie same. 835 00:37:08,360 --> 00:37:12,810 Więc pozwól mi zaproponować, i pozwól mi przedstawić w wersji jednej z compare.c 836 00:37:12,810 --> 00:37:14,970 tutaj, więc porównanie-1.c. 837 00:37:14,970 --> 00:37:19,590 >> Pozwól mi zaproponować, że wciąż wskaźnik o nazwie s, i przechowywać w nim 838 00:37:19,590 --> 00:37:20,610 zwrotu wartości get ciąg. 839 00:37:20,610 --> 00:37:21,750 Zróbmy to samo z t.. 840 00:37:21,750 --> 00:37:23,230 Tak więc żaden z kodu jest inna. 841 00:37:23,230 --> 00:37:25,420 Mam zamiar dodać trochę więcej sprawdzanie błędów teraz. 842 00:37:25,420 --> 00:37:29,390 Więc teraz, że jesteśmy jakby odrywając to warstwy w CS50, co ciąg 843 00:37:29,390 --> 00:37:33,520 faktycznie jest, musimy być bardziej anal o to, abyśmy się nie nadużywać 844 00:37:33,520 --> 00:37:35,330 Nieprawidłowe wartości jak null. 845 00:37:35,330 --> 00:37:36,440 >> Więc mam zamiar sprawdzić. 846 00:37:36,440 --> 00:37:41,490 Jeśli nie jest równe NULL robi i t nie równa null, co oznacza, że ​​jesteśmy OK. 847 00:37:41,490 --> 00:37:44,460 Skorzystaj ciąg nie zepsuć się albo z tych ciągów. 848 00:37:44,460 --> 00:37:51,270 I można chyba domyślić się, co zgadza STR CMP przypuszczalnie zrobić? 849 00:37:51,270 --> 00:37:52,000 String porównać. 850 00:37:52,000 --> 00:37:55,470 >> Więc jeśli masz program w java przed, to jest jak jest równa metody w 851 00:37:55,470 --> 00:37:56,490 Klasa String. 852 00:37:56,490 --> 00:37:57,890 Ale dla tych z Was, którzy nie mają zaprogramowane wcześniej, 853 00:37:57,890 --> 00:37:59,320 jest to tylko funkcja c. 854 00:37:59,320 --> 00:38:02,180 Zdarza się przyjść Plik o nazwie string.h. 855 00:38:02,180 --> 00:38:03,830 To gdzie jest zadeklarowana. 856 00:38:03,830 --> 00:38:05,110 >> A ciąg porównanie - 857 00:38:05,110 --> 00:38:07,530 I rzeczywiście zapomnieć jej wykorzystania, ale mniejsza z tym. 858 00:38:07,530 --> 00:38:10,470 Przypomnijmy, że możemy zrobić Człowiek, wymieszać porównać. 859 00:38:10,470 --> 00:38:12,590 I to się dzieje, aby przywołać Linux obsługi programistów. 860 00:38:12,590 --> 00:38:14,060 I to jest, szczerze mówiąc, trochę tajemniczy. 861 00:38:14,060 --> 00:38:15,270 Ale widzę tutaj, yep. 862 00:38:15,270 --> 00:38:17,570 Muszę to string.h. 863 00:38:17,570 --> 00:38:20,590 >> I tu jest napisane pod opisem " Funkcja porównania ciąg porównuje 864 00:38:20,590 --> 00:38:24,560 dwa łańcuchy S1 i S2. "A S1 i S2 są wyraźnie dwa 865 00:38:24,560 --> 00:38:26,120 Argumenty przekazywane w. 866 00:38:26,120 --> 00:38:28,650 I naprawdę nie pamiętam co const, ale teraz zauważyć - 867 00:38:28,650 --> 00:38:31,480 a może widzieliście to już, kiedy już używać stron man, jeśli 868 00:38:31,480 --> 00:38:32,390 to wszystko - 869 00:38:32,390 --> 00:38:36,220 że char gwiazda jest po prostu synonimem sznurkiem. 870 00:38:36,220 --> 00:38:40,440 >> Więc to porównuje dwa łańcuchy, S1 i S2, i zwraca liczbę całkowitą mniejszą 871 00:38:40,440 --> 00:38:44,930 lub równą lub większą od zera jeżeli S1 jest odpowiednio, być 872 00:38:44,930 --> 00:38:47,450 mniej niż, lub mecz, lub większy niż s2. 873 00:38:47,450 --> 00:38:51,220 To jest po prostu bardzo złożony sposób na powiedzenie że ciąg porównać zyski 874 00:38:51,220 --> 00:38:55,760 zero gdy dwa ciągi znaków są intuicyjnie identyczne, znaków dla 875 00:38:55,760 --> 00:38:57,120 znaków dla znaku. 876 00:38:57,120 --> 00:38:59,970 >> Zwraca liczbę ujemną, jeśli s, alfabetycznie, ma 877 00:38:59,970 --> 00:39:01,010 przyjść przed t. 878 00:39:01,010 --> 00:39:05,300 Lub zwraca liczbę dodatnią, jeśli s ma przyjść po t 879 00:39:05,300 --> 00:39:06,170 alfabetycznie. 880 00:39:06,170 --> 00:39:08,360 Więc z tej prostej funkcji, może można, na przykład, posortować 881 00:39:08,360 --> 00:39:09,770 cała masa słów? 882 00:39:09,770 --> 00:39:13,984 >> Tak więc w tej nowej wersji, będę iść do przodu i robić compare1. 883 00:39:13,984 --> 00:39:15,750 Dot slash porównać jeden. 884 00:39:15,750 --> 00:39:18,030 Będę pisać w witaj w całej dolnej części obudowy. 885 00:39:18,030 --> 00:39:20,300 Idę do wpisywania komentarzy z wszystkimi małymi ponownie. 886 00:39:20,300 --> 00:39:23,340 I na szczęście teraz to zdaje sobie sprawę, Wpisałem to samo. 887 00:39:23,340 --> 00:39:27,520 >> Tymczasem, jeśli wpisać cześć w dolnej case i WITAJ wielkimi literami i 888 00:39:27,520 --> 00:39:29,710 porównać je, wpisałem różne rzeczy. 889 00:39:29,710 --> 00:39:32,530 Ponieważ nie tylko adresy inna, ale mamy porównanie 890 00:39:32,530 --> 00:39:35,350 różnych znaków ponownie. 891 00:39:35,350 --> 00:39:37,320 >> Więc chodźmy i naprawić jeden Inny problem teraz. 892 00:39:37,320 --> 00:39:41,590 Pozwól mi otworzyć wersję jednego z Kopia, która teraz zajmuje 893 00:39:41,590 --> 00:39:42,900 ten problem w następujący sposób. 894 00:39:42,900 --> 00:39:45,650 A ten będzie wyglądać nieco bardziej skomplikowane. 895 00:39:45,650 --> 00:39:49,320 Ale jeśli myślisz o tym, co problemem trzeba rozwiązać, mam nadzieję, że będzie to 896 00:39:49,320 --> 00:39:51,870 wyczyścić za chwilę teraz. 897 00:39:51,870 --> 00:39:57,280 >> Więc ten pierwszy wiersz, znak startu t, w laika może ktoś zaproponuje 898 00:39:57,280 --> 00:39:59,450 co ta linia tutaj oznacza? 899 00:39:59,450 --> 00:40:01,050 Char gwiazda t, co to robi? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Dobra. 902 00:40:07,210 --> 00:40:09,500 Tworzenie wskaźnika do niektórych miejsce w pamięci. 903 00:40:09,500 --> 00:40:10,930 I pozwól mi ulepszyć go trochę. 904 00:40:10,930 --> 00:40:17,180 Zadeklaruj zmienną, która będzie przechowywać adres niektóre char w pamięci, po prostu 905 00:40:17,180 --> 00:40:18,480 być trochę bardziej właściwa. 906 00:40:18,480 --> 00:40:21,210 >> OK, więc teraz po prawej stronie, mam nigdy nie widziałem jedną z tych funkcji 907 00:40:21,210 --> 00:40:22,660 przed, malloc. 908 00:40:22,660 --> 00:40:26,980 Ale co może znaczyć? 909 00:40:26,980 --> 00:40:28,050 Alokacja pamięci. 910 00:40:28,050 --> 00:40:29,410 Alokacji pamięci. 911 00:40:29,410 --> 00:40:33,050 >> Tak więc okazuje się, aż do teraz, tak naprawdę nie miał potężny sposób 912 00:40:33,050 --> 00:40:36,210 zwracając się do systemu operacyjnego, daj mi trochę pamięci. 913 00:40:36,210 --> 00:40:39,980 Przeciwnie, mamy teraz funkcję o nazwie malloc, że robi dokładnie to. 914 00:40:39,980 --> 00:40:42,960 Mimo, że jest to trochę roztargnienie teraz zauważyć, że w 915 00:40:42,960 --> 00:40:46,200 między dwoma nawiasach tylko będzie liczba. 916 00:40:46,200 --> 00:40:48,510 Gdzie mam wpisać w pytaniu Znaki mogą być liczbą. 917 00:40:48,510 --> 00:40:51,020 >> I ta liczba oznacza, daj mi 10 bajtów. 918 00:40:51,020 --> 00:40:52,320 Daj mi 20 bajtów. 919 00:40:52,320 --> 00:40:53,820 Daj mi 100 bajtów. 920 00:40:53,820 --> 00:40:56,500 I malloc dołoży wszelkich starań, aby zwrócić się do systemu operacyjnego - 921 00:40:56,500 --> 00:40:57,630 Linux, w tym przypadku - 922 00:40:57,630 --> 00:40:59,630 hej, jest ich 100 bajtów od dostępnej pamięci RAM? 923 00:40:59,630 --> 00:41:04,320 Jeśli tak, zwróci te bajty do mnie zwrotu z których z adresu 924 00:41:04,320 --> 00:41:06,610 te bajty, może? 925 00:41:06,610 --> 00:41:07,610 Bardzo pierwszy. 926 00:41:07,610 --> 00:41:10,460 >> Więc tutaj też - i to jest dominujący w C, w każdym czasie, że jesteś 927 00:41:10,460 --> 00:41:11,680 czynienia z adresami? 928 00:41:11,680 --> 00:41:15,830 Jesteś prawie zawsze do czynienia z Pierwszy taki adres, bez względu na to, jak duży 929 00:41:15,830 --> 00:41:19,490 fragment pamięci pacjent jest podał do tyłu, że tak powiem. 930 00:41:19,490 --> 00:41:20,880 >> Więc nurkować tutaj. 931 00:41:20,880 --> 00:41:23,940 Staram się przeznaczyć jak wiele bajtów, dokładnie? 932 00:41:23,940 --> 00:41:24,080 Dobrze. 933 00:41:24,080 --> 00:41:26,090 Długość łańcucha S - Niech zrobić konkretny przykład. 934 00:41:26,090 --> 00:41:30,700 Jeśli s jest hello, H-E-L-L-O, co jest długość łańcuch s, oczywiście? 935 00:41:30,700 --> 00:41:32,010 Więc to jest pięć. 936 00:41:32,010 --> 00:41:34,590 Ale robię plus 1 na tym, dlaczego? 937 00:41:34,590 --> 00:41:37,700 Dlaczego chcę sześć bajtów zamiast pięciu? 938 00:41:37,700 --> 00:41:38,790 Znak null. 939 00:41:38,790 --> 00:41:41,210 >> Nie chcę wyjść poza ten specjalny znak null. 940 00:41:41,210 --> 00:41:45,160 Bo jeśli robię kopię cześć i po prostu zrobić H-E-L-L-O, ale nie szuka 941 00:41:45,160 --> 00:41:50,160 że szczególny charakter, komputer może nie mają, przez przypadek, backslash 942 00:41:50,160 --> 00:41:51,730 zero, nie dla mnie. 943 00:41:51,730 --> 00:41:55,570 I tak, jeśli próbuję dowiedzieć się, długość kopii, mógłbym pomyśleć, że 944 00:41:55,570 --> 00:41:59,360 jest to 20 znaków, lub milion znaków, jeśli nie dzieje się samo 945 00:41:59,360 --> 00:42:01,050 trafić zero backslash. 946 00:42:01,050 --> 00:42:05,780 >> Więc musimy sześć bajtów do przechowywania H-E-L-P-O, odwróconej zera. 947 00:42:05,780 --> 00:42:07,870 I to jest właśnie być super anal. 948 00:42:07,870 --> 00:42:10,700 Załóżmy, że nie pamiętam, co rozmiar char jest. 949 00:42:10,700 --> 00:42:12,020 Ciągle mówią, że to jeden bajt. 950 00:42:12,020 --> 00:42:12,860 I to zwykle jest. 951 00:42:12,860 --> 00:42:15,425 W teorii, to może być coś inny, na innym komputerze Mac lub 952 00:42:15,425 --> 00:42:16,250 inny PC. 953 00:42:16,250 --> 00:42:19,650 >> Tak więc okazuje się, że to jest operator nazywa sizeof, że jeśli zostanie przekazany do 954 00:42:19,650 --> 00:42:22,680 nazwa typu danych - jak char lub int lub float - 955 00:42:22,680 --> 00:42:26,930 powie to, dynamicznie, jak wiele bajtów char zajmuje w tej sprawie 956 00:42:26,930 --> 00:42:28,090 dany komputer. 957 00:42:28,090 --> 00:42:31,360 >> Więc to jest skuteczne tylko jak mówią razy 1 lub 958 00:42:31,360 --> 00:42:32,440 razy w ogóle nic. 959 00:42:32,440 --> 00:42:36,340 Ale robię to tylko, aby być super anal, , że tylko w przypadku char różni 960 00:42:36,340 --> 00:42:40,610 na komputerze kontra kopalni, w ten sposób matematyka zawsze będzie sprawdzić. 961 00:42:40,610 --> 00:42:43,720 >> Wreszcie tu sprawdzić za nieważną, która zawsze jest dobra praktyka - znowu 962 00:42:43,720 --> 00:42:44,920 za każdym razem mamy do czynienia ze wskaźnikami. 963 00:42:44,920 --> 00:42:47,520 Jeśli malloc nie był w stanie udzielić mi sześć byes - co jest 964 00:42:47,520 --> 00:42:49,210 mało prawdopodobne, ale tylko w przypadku - 965 00:42:49,210 --> 00:42:50,730 powrót jednego razu. 966 00:42:50,730 --> 00:42:53,290 A teraz idź i skopiować ciąg w następujący sposób. 967 00:42:53,290 --> 00:42:57,240 I to jest znać składnię, choć w innej roli. 968 00:42:57,240 --> 00:43:01,210 >> Mam zamiar iść do przodu i uzyskać ciąg długość s i przechowywać go w n. 969 00:43:01,210 --> 00:43:06,620 Jestem wtedy będzie iteracyjne od i jest równa zera dla i w tym N, 970 00:43:06,620 --> 00:43:08,410 większy lub równy. 971 00:43:08,410 --> 00:43:13,540 Tak, że w każdej iteracji, kładę ith charakter sw-ty 972 00:43:13,540 --> 00:43:15,380 charakter t. 973 00:43:15,380 --> 00:43:18,190 >> Więc co tak naprawdę dzieje się pod kaptur tutaj? 974 00:43:18,190 --> 00:43:22,140 Dobrze, jeśli to, na przykład, jest y - 975 00:43:22,140 --> 00:43:26,400 i mam wpisane w słowie H-E-L-L-O a tam zero backslash. 976 00:43:26,400 --> 00:43:29,020 I znowu, to jest s wskazując tutaj. 977 00:43:29,020 --> 00:43:30,830 I tu teraz jest t. 978 00:43:30,830 --> 00:43:34,860 >> A to wskazuje teraz Kopia pamięci, prawda? 979 00:43:34,860 --> 00:43:37,340 Malloc dał mi cały fragment pamięci. 980 00:43:37,340 --> 00:43:41,440 Nie wiem, co jest na początku w każdym z tych miejsc. 981 00:43:41,440 --> 00:43:44,340 Więc zamierzam myśleć o nich jako cała masa znaków zapytania. 982 00:43:44,340 --> 00:43:50,190 >> Ale jak tylko zacznę zapętlenie od zera na górę przez długości S, T 983 00:43:50,190 --> 00:43:52,790 Wspornik Wspornik zera i t 1 - 984 00:43:52,790 --> 00:43:55,080 i włożę to teraz na napowietrznych - 985 00:43:55,080 --> 00:44:04,190 t Wspornik Wspornik zera i s oznacza zerowy że mam zamiar być kopiowanie 986 00:44:04,190 --> 00:44:09,875 iteratively h tutaj, E-L-L-O. Plus, ponieważ zrobiłem Plus 987 00:44:09,875 --> 00:44:12,370 1, backslash zero. 988 00:44:12,370 --> 00:44:19,060 >> Więc teraz, w przypadku porównania-1c, w końcu, czy mogę wydrukować 989 00:44:19,060 --> 00:44:24,760 kapitalizacja t, powinniśmy zobaczyć, że s jest bez zmian. 990 00:44:24,760 --> 00:44:26,090 Pozwólcie mi iść do przodu i teraz to zrobić. 991 00:44:26,090 --> 00:44:28,630 Tak zrobić Copy1. 992 00:44:28,630 --> 00:44:30,860 Dot slash Copy1. 993 00:44:30,860 --> 00:44:33,670 Idę do wpisywania komentarzy, Enter. 994 00:44:33,670 --> 00:44:37,430 A teraz uwaga, tylko kopię zostało aktywowane. 995 00:44:37,430 --> 00:44:40,890 Bo ja naprawdę mają dwa fragmenty pamięci. 996 00:44:40,890 --> 00:44:44,390 >> Niestety, możesz zrobić kilka dość złe i bardzo niebezpieczne rzeczy. 997 00:44:44,390 --> 00:44:49,290 Pozwól mi wyciągnąć przykład tu teraz, który daje nam przykład kilka 998 00:44:49,290 --> 00:44:51,540 różne linie. 999 00:44:51,540 --> 00:44:56,040 Więc po prostu intuicyjnie tutaj, w pierwszej linii kodu, int gwiazdki x, deklaruje 1000 00:44:56,040 --> 00:44:57,340 zmienna o nazwie x. 1001 00:44:57,340 --> 00:44:58,810 A co to jest typ danych tej zmiennej? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Co dane typ zmiennej? 1004 00:45:04,290 --> 00:45:06,980 To nie był cliffhanger. 1005 00:45:06,980 --> 00:45:08,350 >> Typ danych int gwiazdki. 1006 00:45:08,350 --> 00:45:12,600 Więc co to oznacza? x będzie przechowywać adres int. 1007 00:45:12,600 --> 00:45:13,520 Proste. 1008 00:45:13,520 --> 00:45:16,220 Y będzie przechowywać adres wew. 1009 00:45:16,220 --> 00:45:18,390 Co to jest trzecia linia kodu tam robi? 1010 00:45:18,390 --> 00:45:21,850 To przeznaczenie, jak wiele bajtów, prawdopodobnie? 1011 00:45:21,850 --> 00:45:22,350 Cztery. 1012 00:45:22,350 --> 00:45:25,460 Ze względu na rozmiar int jest zazwyczaj cztery, malloc czterech daje 1013 00:45:25,460 --> 00:45:29,950 mnie adres kawałkiem pamięci, najpierw, których bajtów jest 1014 00:45:29,950 --> 00:45:32,110 przechowywane obecnie w x. 1015 00:45:32,110 --> 00:45:34,410 >> Teraz idziemy trochę szybko. 1016 00:45:34,410 --> 00:45:35,760 Gwiazda x oznacza co? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 To znaczy iść na ten adres i umieścić jaki numer tam? 1019 00:45:42,590 --> 00:45:43,870 Umieścić numer 42 tam. 1020 00:45:43,870 --> 00:45:47,590 Gwiazda y oznacza przejść do tego, co jest na y. i umieścić numer 13 tam. 1021 00:45:47,590 --> 00:45:48,600 >> Ale chwileczkę. 1022 00:45:48,600 --> 00:45:51,640 Co jest w Y w tej chwili? 1023 00:45:51,640 --> 00:45:54,950 Jaki adres y przechowywanie? 1024 00:45:54,950 --> 00:45:55,770 Nie wiemy, prawda? 1025 00:45:55,770 --> 00:45:59,230 Nigdy nie raz użyć przypisania operator udziałem y. 1026 00:45:59,230 --> 00:46:03,370 Więc y jak oświadczył na drugiej linii kod jest tylko niektóre wartości śmieci, duży 1027 00:46:03,370 --> 00:46:04,760 znak zapytania, tak powiem. 1028 00:46:04,760 --> 00:46:07,230 Może on być skierowany przypadkowo do niczego w pamięci, które 1029 00:46:07,230 --> 00:46:08,340 jest ogólnie zły. 1030 00:46:08,340 --> 00:46:13,540 >> Więc jak tylko hit tej linii tam, gwiazdkowy y jest równa 13, coś złego, 1031 00:46:13,540 --> 00:46:17,220 Jest coś bardzo źle o stanie z Binky. 1032 00:46:17,220 --> 00:46:25,810 Zobaczmy więc, co się skończyć dzieje się tutaj, w tym binky minutę 1033 00:46:25,810 --> 00:46:26,200 lub tak wyglądać. 1034 00:46:26,200 --> 00:46:26,490 >> [PLAYBACK VIDEO] 1035 00:46:26,490 --> 00:46:26,745 >> -Hej, Binky. 1036 00:46:26,745 --> 00:46:27,000 Obudź się. 1037 00:46:27,000 --> 00:46:29,296 Czas na zabawę wskaźnika. 1038 00:46:29,296 --> 00:46:30,680 >> -Co to jest? 1039 00:46:30,680 --> 00:46:31,980 Dowiedz się o wskazówki? 1040 00:46:31,980 --> 00:46:34,010 Oh, jare. 1041 00:46:34,010 --> 00:46:37,220 >> -Dobrze, aby zacząć, myślę, że jesteśmy będzie potrzebował wskazówek para. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Ten kod przydziela dwa wskaźniki które mogą wskazywać na liczby całkowite. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, dobrze, widzę dwa wskaźniki. 1045 00:46:43,760 --> 00:46:45,850 Ale nie wydaje się być wskazując na coś. 1046 00:46:45,850 --> 00:46:46,490 >> -To prawda. 1047 00:46:46,490 --> 00:46:48,630 Początkowo wskaźniki nie zwrócić się do niczego. 1048 00:46:48,630 --> 00:46:51,700 Rzeczy, wskazują one są nazywane pointees i ustalanie ich jest 1049 00:46:51,700 --> 00:46:52,850 oddzielny etap. 1050 00:46:52,850 --> 00:46:53,740 >> -Och, dobrze, dobrze. 1051 00:46:53,740 --> 00:46:54,500 Wiedziałem o tym. 1052 00:46:54,500 --> 00:46:56,270 W pointees są oddzielne. 1053 00:46:56,270 --> 00:46:58,553 Więc jak można przeznaczyć pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Cóż, ten kod alokuje nowy liczb całkowitych pointee, i ta część zbiorów X 1056 00:47:03,707 --> 00:47:05,520 wskazać na to. 1057 00:47:05,520 --> 00:47:06,760 >> -Hej, to wygląda lepiej. 1058 00:47:06,760 --> 00:47:08,520 Więc zrobić to coś zrobić. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Będę nieprawidłowego x wskaźnik do przechowywania Numer 42 w swojej pointee. 1061 00:47:14,110 --> 00:47:17,660 Do tej sztuczki, a ja potrzebuję magii różdżka dereferencji. 1062 00:47:17,660 --> 00:47:20,695 >> -Twoja magiczna różdżka dereferencji? 1063 00:47:20,695 --> 00:47:22,632 Uh, to świetnie. 1064 00:47:22,632 --> 00:47:24,620 >> -To, co kod wygląda. 1065 00:47:24,620 --> 00:47:27,526 Ja po prostu ustawić liczbę i - 1066 00:47:27,526 --> 00:47:28,250 >> -Hej, spójrz. 1067 00:47:28,250 --> 00:47:29,680 Nie idzie. 1068 00:47:29,680 --> 00:47:34,520 Tak robi nieprawidłowego na x następująco strzałka dostęp do swojego pointee. 1069 00:47:34,520 --> 00:47:36,690 W tym przypadku, w celu przechowywania w 42 istnieje. 1070 00:47:36,690 --> 00:47:40,890 Hej, spróbuj go zapisać numer 13 za pośrednictwem innego wskaźnika, Y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Pójdę tu do y i się liczba 13 skonfigurować. 1073 00:47:46,810 --> 00:47:50,890 A potem wziąć różdżkę dereferencji i po prostu - 1074 00:47:50,890 --> 00:47:52,430 whoa! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hey. 1076 00:47:53,030 --> 00:47:54,610 To nie działa. 1077 00:47:54,610 --> 00:47:58,200 Powiedz, Binky, nie sądzę, dereferencji y to dobry pomysł, 1078 00:47:58,200 --> 00:48:01,370 bo konfigurowania pointee jest oddzielny etap. 1079 00:48:01,370 --> 00:48:03,460 I nie sądzę, że kiedykolwiek to zrobił. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Dobry punkt. 1082 00:48:05,160 --> 00:48:07,410 >> -Tak, przeznaczył y wskaźnika. 1083 00:48:07,410 --> 00:48:10,045 Ale nigdy nie ustawić go na wskazywać pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Bardzo uważny. 1086 00:48:12,170 --> 00:48:13,790 >> -Hej, szukasz dobra tam, Binky. 1087 00:48:13,790 --> 00:48:16,920 Czy można to naprawić, tak by punkty r do tej samej pointee jak X? 1088 00:48:16,920 --> 00:48:17,810 >> -Jasne. 1089 00:48:17,810 --> 00:48:20,300 Będę korzystać z magiczną różdżką z wskaźnik zadanie. 1090 00:48:20,300 --> 00:48:22,240 >> -Czy to będzie Problem, jak wcześniej? 1091 00:48:22,240 --> 00:48:22,665 >> -No. 1092 00:48:22,665 --> 00:48:24,300 Nie dotykać pointees. 1093 00:48:24,300 --> 00:48:27,880 To po prostu zmienia jeden wskaźnik do punktu się do tego samego, co innego. 1094 00:48:27,880 --> 00:48:28,970 >> -O, widzę. 1095 00:48:28,970 --> 00:48:31,730 Teraz punkty y do tego samego miejsca co X. 1096 00:48:31,730 --> 00:48:32,450 Więc czekać. 1097 00:48:32,450 --> 00:48:33,490 Teraz Y jest stała. 1098 00:48:33,490 --> 00:48:34,630 Ma pointee. 1099 00:48:34,630 --> 00:48:36,520 Więc można spróbować różdżkę z dereferencji ponownie 1100 00:48:36,520 --> 00:48:39,200 wysłać 13 na. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Tu idzie. 1103 00:48:41,570 --> 00:48:42,870 >> -Hej, spójrz na to. 1104 00:48:42,870 --> 00:48:44,320 Teraz dereferencji prace y. 1105 00:48:44,320 --> 00:48:47,020 A ponieważ wskaźniki dzielą że jeden pointee, że 1106 00:48:47,020 --> 00:48:48,585 zarówno zobaczyć 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Tak. 1108 00:48:49,040 --> 00:48:49,670 Udostępnianie. 1109 00:48:49,670 --> 00:48:50,380 Cokolwiek. 1110 00:48:50,380 --> 00:48:52,290 Więc idziemy miejsca przełączników teraz? 1111 00:48:52,290 --> 00:48:52,970 >> -Oh, spójrz. 1112 00:48:52,970 --> 00:48:54,150 Mamy czas. 1113 00:48:54,150 --> 00:48:55,200 >> -Ale - 1114 00:48:55,200 --> 00:48:57,060 >> -Wystarczy przypomnieć sobie trzy Zasady wskaźnika. 1115 00:48:57,060 --> 00:49:00,100 Numer jeden, podstawowa struktura jest to, że masz wskaźnik. 1116 00:49:00,100 --> 00:49:02,170 I wskazuje na do pointee. 1117 00:49:02,170 --> 00:49:04,160 Ale wskaźnik i pointee są oddzielne. 1118 00:49:04,160 --> 00:49:06,460 A częsty błąd to ustawić wskaźnik, ale do 1119 00:49:06,460 --> 00:49:08,540 zapomnij dać pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Numer dwa, dereferencji wskaźnik zacznie na wskaźnik i następuje jego 1121 00:49:12,460 --> 00:49:14,570 strzałka na dostęp do swojego pointee. 1122 00:49:14,570 --> 00:49:18,640 Jak wszyscy wiemy, to tylko wtedy, gdy istnieje jest pointee, który wraca do 1123 00:49:18,640 --> 00:49:19,790 rządzić numer jeden. 1124 00:49:19,790 --> 00:49:23,670 >> Numer trzy, cesja wskaźnik przyjmuje jeden wskaźnik i zmienia się w celu wskazania 1125 00:49:23,670 --> 00:49:25,850 same pointee jako inny wskaźnik. 1126 00:49:25,850 --> 00:49:27,840 Więc po cesji, dwa wskaźniki woli 1127 00:49:27,840 --> 00:49:29,430 wskazywać na ten sam pointee. 1128 00:49:29,430 --> 00:49:31,600 Czasami to się nazywa dzielenie. 1129 00:49:31,600 --> 00:49:33,430 I to wszystko na ten temat, naprawdę. 1130 00:49:33,430 --> 00:49:33,840 Bye bye teraz. 1131 00:49:33,840 --> 00:49:34,300 >> [END PLAYBACK VIDEO] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID MALAN: Tak bardziej na wskaźnikach, Więcej na Binky przyszłym tygodniu. 1133 00:49:36,940 --> 00:49:38,190 Do zobaczenia w poniedziałek. 1134 00:49:38,190 --> 00:49:42,187