1 00:00:00,000 --> 00:00:06,030 >> [MUZYKI] 2 00:00:06,030 --> 00:00:08,390 >> DOUG LLOYD: Wskaźniki, tutaj jesteśmy. 3 00:00:08,390 --> 00:00:11,080 Jest to prawdopodobnie będzie najtrudniejszy temat 4 00:00:11,080 --> 00:00:12,840 że mówimy w CS50. 5 00:00:12,840 --> 00:00:15,060 A jeśli czytasz nic o wskaźniki 6 00:00:15,060 --> 00:00:19,080 zanim można być trochę zastraszenia będzie w tym filmie. 7 00:00:19,080 --> 00:00:21,260 To prawda, że ​​wskaźniki nie pozwalają Ci możliwość 8 00:00:21,260 --> 00:00:23,740 być może zepsuć bardzo źle, gdy jesteś 9 00:00:23,740 --> 00:00:27,450 pracy z zmiennych i danych, i powodując awarię program. 10 00:00:27,450 --> 00:00:30,490 Ale są rzeczywiście bardzo przydatne i pozwalają nam naprawdę świetny sposób 11 00:00:30,490 --> 00:00:33,340 do przekazywania danych z powrotem i się między funkcjami, 12 00:00:33,340 --> 00:00:35,490 że jesteśmy w stanie zrobić w inny sposób. 13 00:00:35,490 --> 00:00:37,750 >> A więc to, co naprawdę chcę zrobić tutaj jest pociąg 14 00:00:37,750 --> 00:00:41,060 , aby mieć dobrą dyscyplinę wskaźnika, więc że można skutecznie wykorzystywać wskaźniki 15 00:00:41,060 --> 00:00:43,850 aby programy, które znacznie lepiej. 16 00:00:43,850 --> 00:00:48,220 Jak powiedziałem wskaźniki dają nam inny sposób przekazywania danych między funkcjami. 17 00:00:48,220 --> 00:00:50,270 Teraz, jeśli przypomnieć od wcześniejszy film, kiedy 18 00:00:50,270 --> 00:00:53,720 rozmawialiśmy o Zmienna Zakres wspominałem 19 00:00:53,720 --> 00:01:00,610 że wszystkie dane, które mijamy między Funkcje w C jest przekazywane przez wartość. 20 00:01:00,610 --> 00:01:03,070 I nie może być stosowany, że Termin, o co mi chodzi nie 21 00:01:03,070 --> 00:01:07,170 było to, że mijamy kopii danych. 22 00:01:07,170 --> 00:01:12,252 Kiedy przekazać zmienną do funkcji, nie jesteśmy właściwie przekazując zmienną 23 00:01:12,252 --> 00:01:13,210 do funkcji, prawda? 24 00:01:13,210 --> 00:01:17,670 Jesteśmy przekazując kopię że dane do funkcji. 25 00:01:17,670 --> 00:01:20,760 Funkcja robi to, co będzie i wyznacza pewną wartość, 26 00:01:20,760 --> 00:01:23,180 i być może użyć tej wartości gdy daje go z powrotem. 27 00:01:23,180 --> 00:01:26,700 >> Był jeden wyjątek ta zasada przekazywania przez wartość, 28 00:01:26,700 --> 00:01:31,210 i wrócimy do tego, co, że jest trochę później w tym filmie. 29 00:01:31,210 --> 00:01:34,880 Jeśli używamy wskaźników zamiast używania zmiennych, 30 00:01:34,880 --> 00:01:38,180 lub zamiast użycia zmiennych sami lub kopie zmiennych, 31 00:01:38,180 --> 00:01:43,790 teraz możemy przekazać zmienne wokół pomiędzy funkcjonuje w odmienny sposób. 32 00:01:43,790 --> 00:01:46,550 Oznacza to, że jeśli robimy zmiana w jednej funkcji, 33 00:01:46,550 --> 00:01:49,827 że zmiany będą faktycznie efekt w innej funkcji. 34 00:01:49,827 --> 00:01:52,160 Ponownie, jest to coś, co nie mogliśmy zrobić wcześniej, 35 00:01:52,160 --> 00:01:56,979 i jeśli kiedykolwiek starał się zamienić wartość dwóch zmiennych w funkcji, 36 00:01:56,979 --> 00:01:59,270 zauważyliście ten problem rodzaj skradanie się, prawda? 37 00:01:59,270 --> 00:02:04,340 >> Jeśli chcemy zamienić X i Y, i przekazać je do funkcji o nazwie swap 38 00:02:04,340 --> 00:02:08,680 Wewnątrz funkcji zamienić Zmienne zrobić wartości wymiany. 39 00:02:08,680 --> 00:02:12,600 Człowiek staje się dwa, dwa staje się jeden, ale w rzeczywistości nie 40 00:02:12,600 --> 00:02:16,890 nic zmieniać w oryginale Funkcja w rozmówcy. 41 00:02:16,890 --> 00:02:19,550 Ponieważ nie możemy, jesteśmy tylko pracy z odpisów. 42 00:02:19,550 --> 00:02:24,760 Ze wskaźnikami chociaż, możemy faktycznie przechodzą X i Y do funkcji. 43 00:02:24,760 --> 00:02:26,960 Ta funkcja może zrobić coś z nimi. 44 00:02:26,960 --> 00:02:29,250 I te wartości zmiennych może faktycznie zmienić. 45 00:02:29,250 --> 00:02:33,710 Więc to jest dość zmiana nasza zdolność do pracy z danymi. 46 00:02:33,710 --> 00:02:36,100 >> Zanim zagłębimy wskaźniki, myślę, że warto 47 00:02:36,100 --> 00:02:38,580 biorąc kilka minut wrócić do podstaw tutaj. 48 00:02:38,580 --> 00:02:41,000 I przyjrzeć się, jak Prace pamięci komputera 49 00:02:41,000 --> 00:02:45,340 ponieważ te dwa obiekty będą aby rzeczywiście być bardzo ze sobą powiązane. 50 00:02:45,340 --> 00:02:48,480 Jak zapewne wiecie, w systemie komputerowym 51 00:02:48,480 --> 00:02:51,310 masz dysk twardy lub być może dysk SSD, 52 00:02:51,310 --> 00:02:54,430 jakieś miejsca przechowywania plików. 53 00:02:54,430 --> 00:02:57,950 Zazwyczaj gdzieś w Sąsiedztwo 250 GB 54 00:02:57,950 --> 00:02:59,810 na moze kilka terabajtów teraz. 55 00:02:59,810 --> 00:03:02,270 I to jest, gdy wszystkie swoje Pliki ostatecznie żyć, 56 00:03:02,270 --> 00:03:04,870 nawet wtedy, gdy komputer jest wyłączony wyłączony, można włączyć ją ponownie 57 00:03:04,870 --> 00:03:09,190 a znajdziesz pliki są tam ponownie po ponownym uruchomieniu systemu. 58 00:03:09,190 --> 00:03:14,820 Ale dyski, jak na przykład dysk twardy, twardego dysku lub dysku SSD SSD, 59 00:03:14,820 --> 00:03:16,050 to tylko przestrzeń do przechowywania. 60 00:03:16,050 --> 00:03:20,400 >> Nie możemy nic zrobić w rzeczywistości dane, które jest w dysk twardy, 61 00:03:20,400 --> 00:03:22,080 lub dysk SSD. 62 00:03:22,080 --> 00:03:24,950 Aby właściwie zmianie danych lub przenieść go w inne, 63 00:03:24,950 --> 00:03:28,800 musimy przenieść do RAM, pamięć o dostępie. 64 00:03:28,800 --> 00:03:31,170 Teraz RAM, masz dużo mniej w komputerze. 65 00:03:31,170 --> 00:03:34,185 Może masz gdzieś w Sąsiedztwo 512 megabajtów 66 00:03:34,185 --> 00:03:38,850 jeśli masz starszy komputer, się może dwa, cztery, osiem, 16, 67 00:03:38,850 --> 00:03:41,820 może nawet trochę więcej, gigabajty pamięci RAM. 68 00:03:41,820 --> 00:03:46,390 Więc to jest o wiele mniejszy, ale to w którym wszystkie dane lotnych istnieje. 69 00:03:46,390 --> 00:03:48,270 To miejsce, gdzie możemy coś zmienić. 70 00:03:48,270 --> 00:03:53,350 Ale kiedy zwrócimy komputer wyłączony, wszystkie dane w pamięci RAM są niszczone. 71 00:03:53,350 --> 00:03:57,150 >> Więc dlatego musimy mieć dysk twardy do bardziej stałego miejsca położenia tego, 72 00:03:57,150 --> 00:03:59,720 tak, że exists- że będzie być naprawdę źle, jeśli za każdym razem, 73 00:03:59,720 --> 00:04:03,310 Okazało nasz komputer wyłączyć, co Plik w naszym systemie zostało zatarte. 74 00:04:03,310 --> 00:04:05,600 Więc pracujemy wewnątrz pamięci RAM. 75 00:04:05,600 --> 00:04:09,210 I za każdym razem mówimy o Pamięć, dość dużo, w CS50, 76 00:04:09,210 --> 00:04:15,080 mówimy o pamięci RAM, a nie na dysku twardym. 77 00:04:15,080 --> 00:04:18,657 >> Kiedy więc przenieść rzeczy do pamięci, zajmuje pewną ilość miejsca. 78 00:04:18,657 --> 00:04:20,740 Wszystkie rodzaje danych, które pracujemy z 79 00:04:20,740 --> 00:04:23,480 zajmują różne ilości miejsca w pamięci RAM. 80 00:04:23,480 --> 00:04:27,600 Dlatego za każdym razem tworzyć liczbę całkowitą Zmienna, czterech bajtów pamięci 81 00:04:27,600 --> 00:04:30,750 uchylenie są w pamięci RAM, więc Ciebie Można pracować z tym całkowita. 82 00:04:30,750 --> 00:04:34,260 Możesz zadeklarować liczbę całkowitą, zmienić go, przypisać go 83 00:04:34,260 --> 00:04:36,700 do wartości 10 zwiększany o jeden, tak dalej, i tak dalej. 84 00:04:36,700 --> 00:04:39,440 Wszystko, co musi się zdarzyć w RAM, a otrzymasz cztery bajty 85 00:04:39,440 --> 00:04:42,550 pracować na każde Liczba całkowita tworzenia. 86 00:04:42,550 --> 00:04:45,410 >> Każda postać ci tworzenie dostaje jeden bajt. 87 00:04:45,410 --> 00:04:48,160 To jest po prostu jak dużo miejsca jest potrzebny do zapisywania znaku. 88 00:04:48,160 --> 00:04:51,310 Każdy pływak, prawdziwy Numer, dostaje cztery bajty 89 00:04:51,310 --> 00:04:53,390 chyba, że ​​jest to podwójna precyzja zmiennoprzecinkowa 90 00:04:53,390 --> 00:04:56,510 Numer, który pozwala na mają bardziej precyzyjne lub więcej cyfr 91 00:04:56,510 --> 00:04:59,300 po przecinku bez utraty precyzji, 92 00:04:59,300 --> 00:05:01,820 które zajmują osiem bajtów pamięci. 93 00:05:01,820 --> 00:05:06,730 Długie tęskni, bardzo duże liczby całkowite, również trwać osiem bajtów pamięci. 94 00:05:06,730 --> 00:05:09,000 Ile bajtów pamięci czy ciągi trwać? 95 00:05:09,000 --> 00:05:12,990 Cóż postawmy szpilkę w tym pytaniu na teraz, ale wrócimy do tego. 96 00:05:12,990 --> 00:05:17,350 >> Więc z powrotem do tej idei pamięci jako duża tablica komórek bajtowych wielkości. 97 00:05:17,350 --> 00:05:20,871 To naprawdę wszystko jest to, że to po prostu ogromny wachlarz komórek, 98 00:05:20,871 --> 00:05:23,370 tak jak każdy inny tablicy, która znasz i zobaczyć, 99 00:05:23,370 --> 00:05:26,430 chyba każdy element jest szeroki jeden bajt. 100 00:05:26,430 --> 00:05:30,030 I podobnie jak tablica, każdy element ma adres. 101 00:05:30,030 --> 00:05:32,120 Każdy element tablicy ma indeks, i 102 00:05:32,120 --> 00:05:36,302 Można korzystać z tego indeksu, aby zrobić tzw o dostępie swobodnym na tablicy. 103 00:05:36,302 --> 00:05:38,510 Nie musimy zacząć od początek tablicy 104 00:05:38,510 --> 00:05:40,569 iterację każdego jego pojedynczy element, 105 00:05:40,569 --> 00:05:41,860 aby znaleźć to, czego szukamy. 106 00:05:41,860 --> 00:05:45,790 Możemy tylko powiedzieć, chcę dostać się do 15th Element lub element 100th. 107 00:05:45,790 --> 00:05:49,930 A może po prostu przekazać w tej liczby i uzyskać wartość, którego szukasz. 108 00:05:49,930 --> 00:05:54,460 >> Podobnie każda lokalizacja w pamięci ma adres. 109 00:05:54,460 --> 00:05:57,320 Więc twoja pamięć może wyglądać tak. 110 00:05:57,320 --> 00:06:01,420 Oto bardzo mały fragment Pamięć ta 20 bajtów pamięci. 111 00:06:01,420 --> 00:06:04,060 Pierwsze 20 bajtów, ponieważ mój odnosi się tam na dnie 112 00:06:04,060 --> 00:06:08,890 0, 1, 2, 3, a więc na całej drodze do 19. 113 00:06:08,890 --> 00:06:13,190 A kiedy deklarować zmienne i kiedy zaczynam pracować z nimi, 114 00:06:13,190 --> 00:06:15,470 System będzie ustawiona bok trochę miejsca dla mnie 115 00:06:15,470 --> 00:06:17,595 w tej pamięci, do współpracy z moich zmiennych. 116 00:06:17,595 --> 00:06:21,610 Więc mogę powiedzieć, char c równa kapitału H. I co się stanie? 117 00:06:21,610 --> 00:06:23,880 Cóż system będzie uchylenie dla mnie jeden bajt. 118 00:06:23,880 --> 00:06:27,870 W tym przypadku wybraliśmy numeru bajtu cztery, bajt pod adresem czterech, 119 00:06:27,870 --> 00:06:31,310 i to będzie przechowywać litera H tam dla mnie. 120 00:06:31,310 --> 00:06:34,350 Gdybym wtedy powiedzieć, int prędkości Limit wynosi 65, to 121 00:06:34,350 --> 00:06:36,806 będzie uchylenie czterech bajtów pamięci dla mnie. 122 00:06:36,806 --> 00:06:39,180 I to będzie traktować tych, cztery bajty jako pojedyncza jednostka 123 00:06:39,180 --> 00:06:41,305 bo czym pracujemy z oznacza liczbę całkowitą o. 124 00:06:41,305 --> 00:06:44,350 I to będzie przechowywać 65 tam. 125 00:06:44,350 --> 00:06:47,000 >> Teraz już jestem trochę informacją, trochę kłamstwa, 126 00:06:47,000 --> 00:06:50,150 Dobrze, bo wiemy, że komputery pracują w systemie binarnym. 127 00:06:50,150 --> 00:06:53,100 Nie rozumieją koniecznie, co stolica H jest 128 00:06:53,100 --> 00:06:57,110 lub co 65 jest, że tylko zrozumieć binarne zer i jedynek. 129 00:06:57,110 --> 00:06:59,000 I tak rzeczywiście to, co jesteśmy przechowywania tam 130 00:06:59,000 --> 00:07:03,450 nie jest litera H i numer 65, ale raczej reprezentacje binarne 131 00:07:03,450 --> 00:07:06,980 tym, które wyglądają Trochę coś takiego. 132 00:07:06,980 --> 00:07:10,360 A w szczególności w Kontekst zmiennej całkowitej, 133 00:07:10,360 --> 00:07:13,559 to nie będzie po prostu wyrzuć to do, to nie będzie traktować go jako jeden cztery 134 00:07:13,559 --> 00:07:15,350 bajt kawałek koniecznie, to faktycznie dzieje 135 00:07:15,350 --> 00:07:19,570 traktować go jako cztery kawałki jeden bajt, co może wyglądać tak. 136 00:07:19,570 --> 00:07:22,424 I nawet nie jest całkowicie prawdziwe albo, 137 00:07:22,424 --> 00:07:24,840 z powodu czegoś, co nazywa kolejność bajtów, których nie jesteśmy 138 00:07:24,840 --> 00:07:26,965 zamiar dostać się do teraz, ale jeśli jesteś ciekaw, 139 00:07:26,965 --> 00:07:29,030 można przeczytać na trochę i duże kolejność bajtów. 140 00:07:29,030 --> 00:07:31,640 Ale ze względu na ten argument, w trosce o tym filmie, 141 00:07:31,640 --> 00:07:34,860 niech po prostu założyć, że jest w Fakt, jak numer 65 będzie 142 00:07:34,860 --> 00:07:36,970 być reprezentowane Pamięć na każdym systemie, 143 00:07:36,970 --> 00:07:38,850 choć nie jest to do końca prawda. 144 00:07:38,850 --> 00:07:41,700 >> Ale spójrzmy prawdzie w rzeczywistości po prostu pozbyć się wszystkich binarnych w całości, 145 00:07:41,700 --> 00:07:44,460 i tylko myśleć o jak H i 65, jest to o wiele łatwiejsze 146 00:07:44,460 --> 00:07:47,900 myśleć o tym, jak że istota ludzka. 147 00:07:47,900 --> 00:07:51,420 W porządku, więc wydaje się też być może trochę przypadkowe, że I've- mój system 148 00:07:51,420 --> 00:07:55,130 nie dają mi bajty 5, 6, 7, i 8 przechowywać liczbę całkowitą. 149 00:07:55,130 --> 00:07:58,580 Jest powód, dla tego też, co nie dostaniemy się już teraz, ale wystarczy 150 00:07:58,580 --> 00:08:00,496 to znaczy, że to, co komputer robi tutaj 151 00:08:00,496 --> 00:08:02,810 to chyba dobry ruch z jego strony. 152 00:08:02,810 --> 00:08:06,020 Aby nie dać mi pamięć, która jest koniecznie z powrotem do tyłu. 153 00:08:06,020 --> 00:08:10,490 Mimo, że to będzie zrobić to teraz jeśli chcę dostać inny ciąg, 154 00:08:10,490 --> 00:08:13,080 nazywa nazwisko, a ja chcę umieścić Lloyd tam. 155 00:08:13,080 --> 00:08:18,360 Będę musiał zmieścić jeden charakter, każda litera to 156 00:08:18,360 --> 00:08:21,330 będzie wymagać jednego charakter, jeden bajt pamięci. 157 00:08:21,330 --> 00:08:26,230 Więc jeśli mogę umieścić Lloyd w moim tablicy tak jestem całkiem dobrze iść, prawda? 158 00:08:26,230 --> 00:08:28,870 Czego brakuje? 159 00:08:28,870 --> 00:08:31,840 >> Pamiętaj, że każdy ciąg pracujemy zw C kończy backslashem zerowej, 160 00:08:31,840 --> 00:08:33,339 i nie możemy pominąć, że tutaj, albo. 161 00:08:33,339 --> 00:08:36,090 Musimy odłożyć na bok jeden bajt pamięci do przechowywania, że ​​dlatego 162 00:08:36,090 --> 00:08:39,130 wiedzieć, kiedy nasz ciąg zakończył. 163 00:08:39,130 --> 00:08:41,049 Więc jeszcze raz ten układ na sposób rzeczy 164 00:08:41,049 --> 00:08:42,799 pojawiają się w potędze pamięci być trochę przypadkowa, 165 00:08:42,799 --> 00:08:44,870 ale w rzeczywistości jest to, jak większość systemów są przeznaczone. 166 00:08:44,870 --> 00:08:48,330 Aby je układać na wielokrotność czterech względów ponownie 167 00:08:48,330 --> 00:08:50,080 że nie trzeba dostać się do teraz. 168 00:08:50,080 --> 00:08:53,060 Ale to, więc wystarczy powiedzieć, że po tych trzech linii kodu, 169 00:08:53,060 --> 00:08:54,810 Pamięć to właśnie może wyglądać. 170 00:08:54,810 --> 00:08:58,930 Jeśli muszę komórek pamięci 4, 8 i 12 do przechowywania moich danych, 171 00:08:58,930 --> 00:09:01,100 to co moja pamięć może wyglądać. 172 00:09:01,100 --> 00:09:04,062 >> I tak być szczególnie pedantyczny tutaj, kiedy 173 00:09:04,062 --> 00:09:06,020 mówimy o pamięci Adresy zwykle 174 00:09:06,020 --> 00:09:08,390 zrobić za pomocą zapisów w systemie szesnastkowym. 175 00:09:08,390 --> 00:09:12,030 Więc dlaczego nie możemy przekształcić wszystkie te z przecinku do zapisie szesnastkowym 176 00:09:12,030 --> 00:09:15,010 tylko dlatego, że na ogół w jaki odnosimy się do pamięci. 177 00:09:15,010 --> 00:09:17,880 Więc zamiast być od 0 do 19, co mamy jest zero 178 00:09:17,880 --> 00:09:20,340 x od zera do zera x1 trzy. 179 00:09:20,340 --> 00:09:23,790 Są to 20 bajtów pamięci, że zostały lub patrzymy na tym zdjęciu 180 00:09:23,790 --> 00:09:25,540 dokładnie tutaj. 181 00:09:25,540 --> 00:09:29,310 >> Więc wszystko, co mówi, niech krok od pamięci na sekundę 182 00:09:29,310 --> 00:09:30,490 i powrót do wskaźników. 183 00:09:30,490 --> 00:09:32,420 Oto najważniejsze rzeczą do zapamiętania 184 00:09:32,420 --> 00:09:34,070 jak rozpocząć pracę ze wskaźnikami. 185 00:09:34,070 --> 00:09:36,314 Wskaźnik ma nic więcej niż adresem. 186 00:09:36,314 --> 00:09:38,230 Powiem to jeszcze raz, ponieważ to takie ważne, 187 00:09:38,230 --> 00:09:42,730 wskaźnik ma nic więcej niż adresem. 188 00:09:42,730 --> 00:09:47,760 Wskaźniki są adresy do lokalizacji Zmienne w pamięci, gdzie mieszkają. 189 00:09:47,760 --> 00:09:52,590 Wiedząc, że staje się miejmy nadzieję, trochę łatwiej z nimi pracować. 190 00:09:52,590 --> 00:09:54,550 Inną rzeczą lubię zrobić, to mieć sortowania 191 00:09:54,550 --> 00:09:58,510 schematów wizualnie reprezentujący co dzieje się z różnych linii kodu. 192 00:09:58,510 --> 00:10:00,660 A my to kilka zrobić razy w wskaźników, 193 00:10:00,660 --> 00:10:03,354 a kiedy mówimy o dynamicznym alokacji pamięci, jak również. 194 00:10:03,354 --> 00:10:06,020 Bo myślę, że te schematy może być szczególnie pomocne. 195 00:10:06,020 --> 00:10:09,540 >> Więc jeśli powiem, na przykład, int k w moim kodu, co się dzieje? 196 00:10:09,540 --> 00:10:12,524 Cóż, co się w zasadzie dzieje się Dostaję pamięć przeznaczoną dla mnie, 197 00:10:12,524 --> 00:10:14,690 ale ja nawet nie lubię myśleć o tym w ten sposób, że 198 00:10:14,690 --> 00:10:16,300 lubię myśleć o tym jak pudełko. 199 00:10:16,300 --> 00:10:20,090 Mam pole i to kolorowe zielona bo 200 00:10:20,090 --> 00:10:21,750 może umieścić całkowite w zielone pola. 201 00:10:21,750 --> 00:10:23,666 Jeśli był to znak, że może mieć niebieskie pole. 202 00:10:23,666 --> 00:10:27,290 Ale ja zawsze powtarzam, jeśli tworzę pole, które może pomieścić liczb całkowitych 203 00:10:27,290 --> 00:10:28,950 że skrzynka jest w kolorze zielonym. 204 00:10:28,950 --> 00:10:33,020 I biorę markerem i piszę k na stronie. 205 00:10:33,020 --> 00:10:37,590 Więc mam pole o nazwie K, w którym można umieścić liczby całkowite. 206 00:10:37,590 --> 00:10:41,070 Więc kiedy mówię, int k, to co dzieje się w mojej głowie. 207 00:10:41,070 --> 00:10:43,140 Jeśli powiem, k równa się pięć, co ja robię? 208 00:10:43,140 --> 00:10:45,110 Cóż, Kładę pięć w polu, tuż. 209 00:10:45,110 --> 00:10:48,670 To jest bardzo proste, jeśli Mówię int k, utworzyć pole o nazwie k. 210 00:10:48,670 --> 00:10:52,040 Jeśli powiem, k równa się 5, umieścić pięć w polu. 211 00:10:52,040 --> 00:10:53,865 Mam nadzieję, że to nie jest zbyt wielkim skokiem. 212 00:10:53,865 --> 00:10:55,990 Oto, gdzie rzeczy pójść mało interesujące choć. 213 00:10:55,990 --> 00:11:02,590 Jeśli powiem, int * pk, a nawet jeśli nie mam wiem co to niekoniecznie oznacza, 214 00:11:02,590 --> 00:11:06,150 to wyraźnie coś do czynienia z liczbą całkowitą. 215 00:11:06,150 --> 00:11:08,211 Więc idę do koloru to pole Zielona-owski, 216 00:11:08,211 --> 00:11:10,210 Wiem, że to ma coś do czynienia z liczbą całkowitą, 217 00:11:10,210 --> 00:11:13,400 ale to nie jest samo w sobie całkowitą, bo to int gwiazdą. 218 00:11:13,400 --> 00:11:15,390 Jest coś, co nieco różni się o tym. 219 00:11:15,390 --> 00:11:17,620 Tak zaangażowany liczbą całkowitą użytkownika, ale poza tym to 220 00:11:17,620 --> 00:11:19,830 niezbyt różni się od co nam chodzi. 221 00:11:19,830 --> 00:11:24,240 Jest to pole, jego dostał etykietę, to sobie pk etykiety, 222 00:11:24,240 --> 00:11:27,280 i jest w stanie utrzymać int gwiazdy, co to są. 223 00:11:27,280 --> 00:11:29,894 Mają coś do zrobienia z liczb całkowitych, wyraźnie. 224 00:11:29,894 --> 00:11:31,060 Oto ostatnia linia chociaż. 225 00:11:31,060 --> 00:11:37,650 Jeśli powiem, pk = & k, zaraz, co się stało, prawda? 226 00:11:37,650 --> 00:11:41,820 Więc to liczba losowa, pozornie przypadkowe liczba, zostaje wrzucony w pudełku. 227 00:11:41,820 --> 00:11:44,930 Wszystko to jest pk dostaje adres k. 228 00:11:44,930 --> 00:11:52,867 Więc mam trzymać gdzie k mieszka w pamięci, adres, adres jego bajtów. 229 00:11:52,867 --> 00:11:55,200 Wszystko robię to mówię że wartość jest co zamierzam 230 00:11:55,200 --> 00:11:59,430 umieścić wewnątrz mojej skrzynki zwanej pk. 231 00:11:59,430 --> 00:12:02,080 A ponieważ te rzeczy są wskaźniki, a ponieważ patrząc 232 00:12:02,080 --> 00:12:04,955 na sznurku, jak zero, X osiem zera c siedem cztery osiem 233 00:12:04,955 --> 00:12:07,790 dwa zera jest chyba nie bardzo znaczące. 234 00:12:07,790 --> 00:12:12,390 Kiedy ogół wizualizować wskaźniki, faktycznie zrobić jako wskaźniki. 235 00:12:12,390 --> 00:12:17,000 Pk daje nam informacje musimy znaleźć k w pamięci. 236 00:12:17,000 --> 00:12:19,120 Więc w zasadzie pk ma strzałkę w nim. 237 00:12:19,120 --> 00:12:21,670 A jeśli idziemy długość tej strzałki, wyobraź sobie, 238 00:12:21,670 --> 00:12:25,280 to jest coś, co można chodzić, jeśli będziemy spacer wzdłuż strzałki, 239 00:12:25,280 --> 00:12:29,490 na samym czubku tej strzałki, mamy będzie znaleźć miejsce w pamięci 240 00:12:29,490 --> 00:12:31,390 gdzie k żyje. 241 00:12:31,390 --> 00:12:34,360 I to jest bardzo ważne bo kiedy wiemy, gdzie k mieszka, 242 00:12:34,360 --> 00:12:37,870 możemy przystąpić do pracy z danymi Wnętrze tego miejsca pamięci. 243 00:12:37,870 --> 00:12:40,780 Choć jesteśmy coraz malusieńki bit przed siebie teraz. 244 00:12:40,780 --> 00:12:42,240 >> Więc co to jest wskaźnik? 245 00:12:42,240 --> 00:12:45,590 Wskaźnik jest element danych, którego wartość jest adres pamięci. 246 00:12:45,590 --> 00:12:49,740 To było to, że zera x ośmiu zera stuff dzieje, że był to adres pamięci. 247 00:12:49,740 --> 00:12:52,060 To było miejsce w pamięci. 248 00:12:52,060 --> 00:12:55,080 I typ wskaźnika opisuje rodzaj 249 00:12:55,080 --> 00:12:56,930 danych znajdziesz w że adres pamięci. 250 00:12:56,930 --> 00:12:58,810 Więc jest częścią prawo int gwiazdą. 251 00:12:58,810 --> 00:13:03,690 Jeśli śledzę tę strzałkę, to będzie prowadzić mnie do lokalizacji. 252 00:13:03,690 --> 00:13:06,980 I to miejsce, co ja znajdzie tam w moim przykładzie, 253 00:13:06,980 --> 00:13:08,240 jest w kolorze zielonym polu. 254 00:13:08,240 --> 00:13:12,650 Jest liczbą całkowitą, to co ja znajdzie, jeśli pójdę na ten adres. 255 00:13:12,650 --> 00:13:14,830 Typ danych wskaźnik opisuje co 256 00:13:14,830 --> 00:13:17,936 znajdziesz pod tym adresem pamięci. 257 00:13:17,936 --> 00:13:19,560 Więc tutaj jest naprawdę fajne rzeczy jednak. 258 00:13:19,560 --> 00:13:25,090 Wskaźniki pozwalają nam przejść zmienne pomiędzy funkcjami. 259 00:13:25,090 --> 00:13:28,520 I rzeczywiście przekazać zmienne i nie przekazać ich kopie. 260 00:13:28,520 --> 00:13:32,879 Bo jeśli wiemy dokładnie, gdzie w pamięci, aby znaleźć zmienną, 261 00:13:32,879 --> 00:13:35,670 nie musimy zrobić kopię to możemy po prostu udać się do tego miejsca 262 00:13:35,670 --> 00:13:37,844 i pracy z tej zmiennej. 263 00:13:37,844 --> 00:13:40,260 Tak w istocie rodzaj wskaźników od dokonania środowisko komputera 264 00:13:40,260 --> 00:13:42,360 o wiele bardziej jak w rzeczywistym świecie, w prawo. 265 00:13:42,360 --> 00:13:44,640 >> Tak tu jest analogia. 266 00:13:44,640 --> 00:13:48,080 Powiedzmy, że mam notebooka w prawo, i to jest pełne notatek. 267 00:13:48,080 --> 00:13:50,230 I chciałbym, aby go zaktualizować. 268 00:13:50,230 --> 00:13:53,960 Jesteś funkcją aktualizacje notatki, prawda. 269 00:13:53,960 --> 00:13:56,390 W drodze byliśmy działa tak daleko, co 270 00:13:56,390 --> 00:14:02,370 dzieje się weźmiesz mój zeszyt, pójdziesz do sklepu, kopiowania, 271 00:14:02,370 --> 00:14:06,410 będziesz się kserokopię każda strona notebooka. 272 00:14:06,410 --> 00:14:09,790 Musisz opuścić mój notatnik na moim biurku, kiedy skończysz, 273 00:14:09,790 --> 00:14:14,600 pójdziesz i przejechać się rzeczy w moim notebook, które są nieaktualne lub błędne, 274 00:14:14,600 --> 00:14:19,280 a następnie będziesz przechodzić z powrotem do mi stos stron Xerox 275 00:14:19,280 --> 00:14:22,850 która jest repliką moim notebooku z zmiany, które zostały wprowadzone do niego. 276 00:14:22,850 --> 00:14:27,040 I w tym momencie, to do mnie, funkcja powołaniem jako rozmówcy, 277 00:14:27,040 --> 00:14:30,582 zdecydować, aby zabrać swoje notatki i zintegrować je z powrotem na moim notebooku. 278 00:14:30,582 --> 00:14:32,540 Więc jest dużo schodów chodzi tu, w prawo. 279 00:14:32,540 --> 00:14:34,850 Jak nie będzie lepiej gdybym tylko powiedzieć, hej, można 280 00:14:34,850 --> 00:14:38,370 zaktualizować notebook dla ja, wręczyć ci mój zeszyt, 281 00:14:38,370 --> 00:14:40,440 i zabrać rzeczy i dosłownie przekroczyć je 282 00:14:40,440 --> 00:14:42,810 i aktualizować swoje notatki w zeszycie. 283 00:14:42,810 --> 00:14:45,140 A potem dał mi mój notatnik. 284 00:14:45,140 --> 00:14:47,320 To coś, co wskaźniki pozwalają nam robić, 285 00:14:47,320 --> 00:14:51,320 robią to środowisko o wiele raczej jak działamy w rzeczywistości. 286 00:14:51,320 --> 00:14:54,640 >> Dobrze więc, że to, co wskaźnik jest, porozmawiajmy 287 00:14:54,640 --> 00:14:58,040 o tym, jak działają wskaźniki w C, a jak możemy rozpocząć pracę z nimi. 288 00:14:58,040 --> 00:15:02,550 Więc jest to bardzo prosty wskaźnik w C zwany pustego wskaźnika. 289 00:15:02,550 --> 00:15:04,830 Null wskaźnik pokazywał nic. 290 00:15:04,830 --> 00:15:08,310 Wydaje się to zapewne jak to Właściwie nie bardzo przydatna rzecz, 291 00:15:08,310 --> 00:15:10,500 ale jak zobaczymy Nieco później, fakt, 292 00:15:10,500 --> 00:15:15,410 że ten wskaźnik NULL istnieje rzeczywiście bardzo może się przydać. 293 00:15:15,410 --> 00:15:19,090 I podczas tworzenia wskaźnika, a nie ustawić jej wartość immediately- 294 00:15:19,090 --> 00:15:21,060 Przykład ustawiania jego wartość natychmiast 295 00:15:21,060 --> 00:15:25,401 będzie kilka slajdów z powrotem gdzie powiedziałem pk równa & K, 296 00:15:25,401 --> 00:15:28,740 pk dostaje adres k, tak jak Zobaczymy, co to znaczy, 297 00:15:28,740 --> 00:15:32,990 zobaczymy jak kod, który shortly- jeśli nie ustawić jej wartość na coś 298 00:15:32,990 --> 00:15:35,380 natychmiast sens, powinieneś zawsze 299 00:15:35,380 --> 00:15:37,480 ustawić kursor do punktu na null. 300 00:15:37,480 --> 00:15:40,260 Należy ustawić go wskazują na nic. 301 00:15:40,260 --> 00:15:43,614 >> To jest zupełnie inny niż pozostawiając tylko wartość, jak to jest 302 00:15:43,614 --> 00:15:45,530 a następnie uznającej wskaźnik i tylko przy założeniu, 303 00:15:45,530 --> 00:15:48,042 jest pusty, bo to rzadko prawdziwe. 304 00:15:48,042 --> 00:15:50,000 Więc zawsze należy ustawić wartość wskaźnika 305 00:15:50,000 --> 00:15:55,690 null, jeśli nie ustawić jej wartość do czegoś sensownego natychmiast. 306 00:15:55,690 --> 00:15:59,090 Można sprawdzić, czy wartość wskaźnika w jest null za pomocą operatora równości 307 00:15:59,090 --> 00:16:05,450 (==), Tak jak porównać dowolną liczbę całkowitą wartości lub wartości postaciach używając (==) 308 00:16:05,450 --> 00:16:06,320 równie dobrze. 309 00:16:06,320 --> 00:16:10,994 To szczególny rodzaj stałej wartości, które można używać do testowania. 310 00:16:10,994 --> 00:16:13,160 Tak, że był to bardzo proste wskaźnik, null pointer. 311 00:16:13,160 --> 00:16:15,320 Innym sposobem tworzenia wskaźnik jest wydobycie 312 00:16:15,320 --> 00:16:18,240 adres zmiennej już stworzone, 313 00:16:18,240 --> 00:16:22,330 i można to zrobić za pomocą & Ekstrakcja adres operatora. 314 00:16:22,330 --> 00:16:26,720 Które widzieliśmy już wcześniej w pierwszym przykładzie schematu pokazałem. 315 00:16:26,720 --> 00:16:31,450 Tak więc, jeśli x jest zmienna mamy już utworzony typu INTEGER, 316 00:16:31,450 --> 00:16:35,110 następnie & x jest wskaźnikiem do liczby całkowitej. 317 00:16:35,110 --> 00:16:39,810 & x jest-pamiętam, i zamierza wyodrębnić adres rzeczy po prawej stronie. 318 00:16:39,810 --> 00:16:45,350 A ponieważ wskaźnik jest tylko adres, niż & x jest wskaźnikiem do liczby całkowitej 319 00:16:45,350 --> 00:16:48,560 których wartość jest, gdy w pamięci x życiu. 320 00:16:48,560 --> 00:16:50,460 Jest to adres X.. 321 00:16:50,460 --> 00:16:53,296 Więc i x jest adres x. 322 00:16:53,296 --> 00:16:55,670 Weźmy ten jeden krok dalej i połączyć się z czymś 323 00:16:55,670 --> 00:16:58,380 Wspomniałem w poprzednim filmie. 324 00:16:58,380 --> 00:17:06,730 Jeśli arr jest tablicą deblu, a następnie & arr nawias kwadratowy i jest wskaźnikiem 325 00:17:06,730 --> 00:17:08,109 na podwójne. 326 00:17:08,109 --> 00:17:08,970 OK. 327 00:17:08,970 --> 00:17:12,160 arr nawias kwadratowy i, jeśli to arr jest tablicą deblu 328 00:17:12,160 --> 00:17:19,069 następnie arr nawias kwadratowy i jest element i-tego tablicy 329 00:17:19,069 --> 00:17:29,270 i & arr nawias kwadratowy i jest gdzie w element i-ty z arr istnieje pamięci. 330 00:17:29,270 --> 00:17:31,790 >> Więc co jest implikacją tutaj? 331 00:17:31,790 --> 00:17:34,570 Tablice nazwa, implikacja w całej tej sprawie, 332 00:17:34,570 --> 00:17:39,290 jest to, że nazwa tablicy jest właściwie sam wskaźnik. 333 00:17:39,290 --> 00:17:41,170 Pracowaliście ze wskaźnikami wszystkim wzdłuż 334 00:17:41,170 --> 00:17:45,290 za każdym razem, że użyłeś tablicę. 335 00:17:45,290 --> 00:17:49,090 Pamiętaj, na przykładzie na zmiennej zakresie, 336 00:17:49,090 --> 00:17:53,420 pod koniec filmu przedstawiam przykład, w którym mamy funkcję 337 00:17:53,420 --> 00:17:56,890 zwany zestaw int i Funkcja o nazwie zestaw tablica. 338 00:17:56,890 --> 00:18:00,490 A twój wyzwaniem, aby określić czy też nie, lub co 339 00:18:00,490 --> 00:18:03,220 Wartości, które drukowane na Koniec funkcji 340 00:18:03,220 --> 00:18:05,960 pod koniec głównego programu. 341 00:18:05,960 --> 00:18:08,740 >> Jeśli pamiętacie z tego przykładu lub jeśli nie oglądałem film, 342 00:18:08,740 --> 00:18:13,080 wiesz, że jeśli wam-wezwanie do Zestaw int skutecznie nic nie robi. 343 00:18:13,080 --> 00:18:16,390 Ale rozmowa ustawić tablicę robi. 344 00:18:16,390 --> 00:18:19,280 I coś w rodzaju tabu, dlaczego tak było w tym czasie. 345 00:18:19,280 --> 00:18:22,363 Powiedziałem tylko, jak to jest tablicą, to Specjalny, wiesz, że jest powód. 346 00:18:22,363 --> 00:18:25,020 Powodem jest to, że tablica na Nazwa jest naprawdę tylko wskaźnik, 347 00:18:25,020 --> 00:18:28,740 i jest to specjalne Składnia kwadratowy nawias, że 348 00:18:28,740 --> 00:18:30,510 dokonać rzeczy o wiele ładniejszy pracować. 349 00:18:30,510 --> 00:18:34,410 A oni ideę wyżeł dużo mniej zastraszające, 350 00:18:34,410 --> 00:18:36,800 i dlatego są one rodzaju zaprezentowanych w ten sposób. 351 00:18:36,800 --> 00:18:38,600 Ale tak naprawdę to tylko tablice Wskaźniki. 352 00:18:38,600 --> 00:18:41,580 I dlatego, kiedy wprowadzeniu zmian do tablicy, 353 00:18:41,580 --> 00:18:44,880 kiedy minęliśmy tablicę jako parametr do funkcji lub argument 354 00:18:44,880 --> 00:18:50,110 do funkcji, zawartość tablicy rzeczywiście zmieniona w wywoływany 355 00:18:50,110 --> 00:18:51,160 a rozmówcą. 356 00:18:51,160 --> 00:18:55,846 Które dla każdego innego rodzaju Zmienna widzieliśmy nie był przypadek. 357 00:18:55,846 --> 00:18:58,970 Tak, że po prostu coś do utrzymania w przeszkadza podczas pracy ze wskaźnikami, 358 00:18:58,970 --> 00:19:01,610 jest to, że nazwą Tablica rzeczywiście wskaźnik 359 00:19:01,610 --> 00:19:04,750 pierwszego elementu tablicy. 360 00:19:04,750 --> 00:19:08,930 >> OK, więc teraz mamy wszystko fakty, będziemy mówili, w prawo. 361 00:19:08,930 --> 00:19:11,370 Dlaczego dbamy o gdzie coś żyje. 362 00:19:11,370 --> 00:19:14,120 Cóż, jak powiedziałem, to jest całkiem warto wiedzieć, gdzie coś mieszka 363 00:19:14,120 --> 00:19:17,240 więc można tam pojechać i go zmienić. 364 00:19:17,240 --> 00:19:19,390 Praca z nim i rzeczywiście mieć coś, co Cię 365 00:19:19,390 --> 00:19:23,710 chcesz zrobić z tym zmiennym skutkiem podjęcia, i nie ma wpływu na jakimś kopię. 366 00:19:23,710 --> 00:19:26,150 To się nazywa wyłuskania. 367 00:19:26,150 --> 00:19:28,690 Idziemy do odniesienia i my tam zmienić wartość. 368 00:19:28,690 --> 00:19:32,660 Więc jeśli mamy wskaźnik i to się nazywa pc, a to wskazuje na charakter, 369 00:19:32,660 --> 00:19:40,610 wtedy możemy powiedzieć, * * pc i pc jest nazwa, co znajdziemy jeśli pójdziemy 370 00:19:40,610 --> 00:19:42,910 na pc adresu. 371 00:19:42,910 --> 00:19:47,860 Co my tam znaleźć to charakter i * pc jest, jak odnosimy się do danych na które 372 00:19:47,860 --> 00:19:48,880 Lokalizacja. 373 00:19:48,880 --> 00:19:54,150 Więc można powiedzieć coś takiego * pc = D lub coś w tym stylu, 374 00:19:54,150 --> 00:19:59,280 a to oznacza, że ​​bez względu na był pod adresem pamięci komputera, 375 00:19:59,280 --> 00:20:07,040 bez względu na charakter był wcześniej tam, jest D, jeśli powiemy * pc = D. 376 00:20:07,040 --> 00:20:10,090 >> Więc zaczynamy ponownie niektóre dziwne C rzeczy, prawda. 377 00:20:10,090 --> 00:20:14,560 Tak więc widzieliśmy * wcześniej jako w jakiś sposób częścią tego typu danych, 378 00:20:14,560 --> 00:20:17,160 i obecnie jest używany w nieco inny kontekst 379 00:20:17,160 --> 00:20:19,605 Aby uzyskać dostęp do danych na miejscu. 380 00:20:19,605 --> 00:20:22,480 Wiem, że to trochę mylące i to jest rzeczywiście częścią tej całości 381 00:20:22,480 --> 00:20:25,740 jak, dlaczego wskaźniki mają tę mitologię wokół nich jako tak skomplikowane, 382 00:20:25,740 --> 00:20:28,250 to rodzaj problemu składni, szczerze. 383 00:20:28,250 --> 00:20:31,810 A * jest używany zarówno w kontekstach zarówno jako część nazwy typu, 384 00:20:31,810 --> 00:20:34,100 i zobaczymy trochę później coś jeszcze. 385 00:20:34,100 --> 00:20:36,490 A teraz jest operator wyłuskiwania. 386 00:20:36,490 --> 00:20:38,760 Więc to idzie do odniesienia, że dostęp do danych 387 00:20:38,760 --> 00:20:43,000 w miejscu kursora, oraz pozwala manipulować do woli. 388 00:20:43,000 --> 00:20:45,900 >> Teraz to jest bardzo podobne do zwiedzanie bliźniego, prawo. 389 00:20:45,900 --> 00:20:48,710 Jeśli wiesz, co sąsiad mieszka, jesteś 390 00:20:48,710 --> 00:20:50,730 Nie wychodzić z sąsiadem. 391 00:20:50,730 --> 00:20:53,510 Wiesz, że zdarzy się wiedzieć, gdzie mieszkają, 392 00:20:53,510 --> 00:20:56,870 ale to nie znaczy, że Cnota mając tę ​​wiedzę 393 00:20:56,870 --> 00:20:59,170 jesteś interakcji z nimi. 394 00:20:59,170 --> 00:21:01,920 Jeśli chcesz interakcji z nimi, musisz udać się do ich domu, 395 00:21:01,920 --> 00:21:03,760 musisz udać się do miejsca, gdzie żyją. 396 00:21:03,760 --> 00:21:07,440 A kiedy to zrobisz, wtedy można oddziaływać 397 00:21:07,440 --> 00:21:09,420 z nimi tak jak wy chcą. 398 00:21:09,420 --> 00:21:12,730 I podobnie ze zmiennymi, trzeba iść na ich adres 399 00:21:12,730 --> 00:21:15,320 jeśli chcesz ich interakcji, nie można po prostu znać adres. 400 00:21:15,320 --> 00:21:21,495 I tak, jak przejść do adresu jest używać *, operator wyłuskiwania. 401 00:21:21,495 --> 00:21:23,620 Co sądzisz dzieje jeśli spróbujemy i dereference 402 00:21:23,620 --> 00:21:25,260 wskaźnik, którego wartość jest null? 403 00:21:25,260 --> 00:21:28,470 Przypomnijmy, że null Wskaźnik wskazuje na nic. 404 00:21:28,470 --> 00:21:34,110 Więc jeśli spróbujesz i dereference nic lub udać się do niczego adresu 405 00:21:34,110 --> 00:21:36,800 co sądzisz dzieje? 406 00:21:36,800 --> 00:21:39,630 Cóż, jeśli zgadłeś segmentacja winy, to masz rację. 407 00:21:39,630 --> 00:21:41,390 Jeśli spróbujesz i dereference wskaźnikiem NULL, 408 00:21:41,390 --> 00:21:43,140 cierpisz segmentacji przyczepić. Ale poczekaj, 409 00:21:43,140 --> 00:21:45,820 ja nie powiedziałem ci, że jeśli nie będziemy 410 00:21:45,820 --> 00:21:49,220 ustawić wartość swoich wskaźnik do czegoś sensownego, 411 00:21:49,220 --> 00:21:51,000 należy ustawić na wartość null? 412 00:21:51,000 --> 00:21:55,290 Zrobiłem i faktycznie segmentacja Błędem jest rodzajem dobrego zachowania. 413 00:21:55,290 --> 00:21:58,680 >> Czy kiedykolwiek zadeklarowaniu zmiennej i nie od razu przypisać jej wartość? 414 00:21:58,680 --> 00:22:02,680 Więc po prostu powiedzieć, int x; ty nie faktycznie przypisać go do niczego 415 00:22:02,680 --> 00:22:05,340 a następnie później w kodzie, wydrukować wartość x, 416 00:22:05,340 --> 00:22:07,650 nadal nie mając przypisane go do niczego. 417 00:22:07,650 --> 00:22:10,370 Najczęściej dostaniesz zero, ale czasami 418 00:22:10,370 --> 00:22:15,000 Może trochę liczb losowych, a nie masz pojęcia, skąd się to wzięło. 419 00:22:15,000 --> 00:22:16,750 Podobnie można rzeczy stało ze wskaźnikami. 420 00:22:16,750 --> 00:22:20,110 Kiedy zadeklarować wskaźnik int * pk np 421 00:22:20,110 --> 00:22:23,490 i nie przypisać go do wartości, masz cztery bajty w pamięci. 422 00:22:23,490 --> 00:22:25,950 Niezależnie cztery bajty Pamięć system może 423 00:22:25,950 --> 00:22:28,970 okaże się, że jakieś sensowne wartości. 424 00:22:28,970 --> 00:22:31,760 I nie mogło być coś, co już istnieje, że 425 00:22:31,760 --> 00:22:34,190 nie są już potrzebne innym Funkcja, więc po prostu trzeba 426 00:22:34,190 --> 00:22:35,900 niezależnie od danych nie było. 427 00:22:35,900 --> 00:22:40,570 >> Co zrobić, jeśli próbował zrobić dereference Adres, że niektóre don't- było 428 00:22:40,570 --> 00:22:43,410 już bajtów i informacji w nie, to jest teraz w Twoim wskaźnikiem. 429 00:22:43,410 --> 00:22:47,470 Jeśli spróbujesz i wyłuskanie tego wskaźnika, może być brudząc z jakiegoś pamięci 430 00:22:47,470 --> 00:22:49,390 że nie zamierza zadzierać z tym wszystkim. 431 00:22:49,390 --> 00:22:51,639 A w rzeczywistości można zrobić coś naprawdę katastrofalne, 432 00:22:51,639 --> 00:22:54,880 jak złamać inny program, lub złamać kolejną funkcję, 433 00:22:54,880 --> 00:22:58,289 lub zrobić coś szkodliwego, że nie miał zamiaru robić w ogóle. 434 00:22:58,289 --> 00:23:00,080 I tak właśnie dlatego, że to rzeczywiście dobry pomysł 435 00:23:00,080 --> 00:23:04,030 aby ustawić wskazówki na null, jeśli Ciebie nie ustawić je na coś sensownego. 436 00:23:04,030 --> 00:23:06,760 To chyba lepiej u Koniec dnia dla programu 437 00:23:06,760 --> 00:23:09,840 do katastrofy to na to, aby zrobić Coś, śruby górę 438 00:23:09,840 --> 00:23:12,400 inny program lub innej funkcji. 439 00:23:12,400 --> 00:23:15,207 To zachowanie jest chyba nawet mniej idealna niż tylko upaść. 440 00:23:15,207 --> 00:23:17,040 I tak właśnie dlatego, że to rzeczywiście dobry zwyczaj 441 00:23:17,040 --> 00:23:20,920 aby dostać się na ustawienie wskazówek null, jeśli nie je ustawić 442 00:23:20,920 --> 00:23:24,540 do znaczącej wartości natychmiast, to wartość, która wiesz, 443 00:23:24,540 --> 00:23:27,260 i że można bezpiecznie dereference. 444 00:23:27,260 --> 00:23:32,240 >> Więc niech się teraz do tyłu i spojrzeć w całkowitej składni sytuacji. 445 00:23:32,240 --> 00:23:37,400 Jeśli powiem, int * p ;, co ja po prostu zrobić? 446 00:23:37,400 --> 00:23:38,530 Co zrobiłem jest to. 447 00:23:38,530 --> 00:23:43,290 Wiem, wartość p jest adres ponieważ wszystkie wskaźniki są po prostu 448 00:23:43,290 --> 00:23:44,660 adresy. 449 00:23:44,660 --> 00:23:47,750 Mogę dereference p za pomocą operatora *. 450 00:23:47,750 --> 00:23:51,250 W związku z tym tutaj, na samym top przypomnieć * jest częścią typu. 451 00:23:51,250 --> 00:23:53,510 Int * jest typem danych. 452 00:23:53,510 --> 00:23:56,150 Ale mogę dereference s za pomocą operatora *, 453 00:23:56,150 --> 00:24:01,897 a jeśli mam zrobić, jeśli pójdę na ten adres, co znajdę pod tym adresem? 454 00:24:01,897 --> 00:24:02,855 Znajdę liczbę całkowitą. 455 00:24:02,855 --> 00:24:05,910 Tak int * p jest w zasadzie mówiąc, p jest adres. 456 00:24:05,910 --> 00:24:09,500 Mogę dereference p, a jeśli Ja, znajdę liczbę całkowitą 457 00:24:09,500 --> 00:24:11,920 w tym miejscu pamięci. 458 00:24:11,920 --> 00:24:14,260 >> OK, więc powiedziałem, nie było innego irytujące z gwiazdami 459 00:24:14,260 --> 00:24:17,060 I tu, że irytujące z gwiazdami jest. 460 00:24:17,060 --> 00:24:21,640 Czy kiedykolwiek próbowałeś do ogłoszenia wiele zmiennych tego samego typu 461 00:24:21,640 --> 00:24:24,409 na tej samej linii kodu? 462 00:24:24,409 --> 00:24:27,700 Więc na chwilę, udawać, że linia, kod I rzeczywiście jest w kolorze zielonym 463 00:24:27,700 --> 00:24:29,366 tam nie ma i po prostu mówi, int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Co, że zrobi to rzeczywiście stworzyć trzy zmienne całkowite dla Ciebie, 466 00:24:34,550 --> 00:24:36,930 jeden o nazwie x, jeden o nazwie y, jeden zwany z. 467 00:24:36,930 --> 00:24:41,510 Jest to sposób, aby to zrobić bez konieczności podzielić na trzy linie. 468 00:24:41,510 --> 00:24:43,890 >> Oto, gdzie gwiazdek uzyskać ponownie denerwujące choć, 469 00:24:43,890 --> 00:24:49,200 ponieważ * jest rzeczywiście częścią zarówno nazwą typu i częściowo 470 00:24:49,200 --> 00:24:50,320 nazwy zmiennych. 471 00:24:50,320 --> 00:24:56,430 I tak, jeśli powiem, int * px, py, pz, co ja rzeczywiście się jest wskaźnikiem do liczby całkowitej 472 00:24:56,430 --> 00:25:01,650 nazywa px i dwie liczby całkowite, py i pz. 473 00:25:01,650 --> 00:25:04,950 A to nie to, co prawdopodobnie chcemy, to nie jest dobre. 474 00:25:04,950 --> 00:25:09,290 >> Więc jeśli chcę utworzyć wiele wskaźników na tej samej linii z tego samego typu, 475 00:25:09,290 --> 00:25:12,140 i gwiazdy, co faktycznie potrzebne zrobić, to powiedzieć, int * pa, * pb, * szt. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Teraz po prostu powiedział, że a teraz ci tego mówić, 478 00:25:20,300 --> 00:25:22,170 prawdopodobnie nigdy nie będzie tego robił. 479 00:25:22,170 --> 00:25:25,170 I to chyba dobrze, szczerze mówiąc, ponieważ może nieumyślnie 480 00:25:25,170 --> 00:25:26,544 pominąć gwiazda, coś takiego. 481 00:25:26,544 --> 00:25:29,290 To chyba najlepiej może zadeklarować Wskaźniki na poszczególnych liniach, 482 00:25:29,290 --> 00:25:31,373 ale to tylko jeszcze jeden z tych irytujących składni 483 00:25:31,373 --> 00:25:35,310 rzeczy, które sprawiają, że z gwiazd Wskaźniki tak trudno pracować. 484 00:25:35,310 --> 00:25:39,480 Bo to jest właśnie to składniowym bałagan trzeba pracować przez. 485 00:25:39,480 --> 00:25:41,600 Z praktyki robi naprawdę się drugą naturą. 486 00:25:41,600 --> 00:25:45,410 I nadal popełniają błędy z nim jeszcze po zaprogramowaniu przez 10 lat, 487 00:25:45,410 --> 00:25:49,630 więc nie denerwuj się, jeśli coś się dzieje do ciebie, to dość powszechne szczerze. 488 00:25:49,630 --> 00:25:52,850 To naprawdę rodzaj to błąd składni. 489 00:25:52,850 --> 00:25:54,900 >> OK, więc rodzaj obiecał że będziemy ponownie 490 00:25:54,900 --> 00:25:59,370 pojęcie, jak duże jest łańcuchem. 491 00:25:59,370 --> 00:26:02,750 Cóż, gdybym powiedział, że Łańcuch, mamy naprawdę rodzaj 492 00:26:02,750 --> 00:26:04,140 leżał na ciebie cały czas. 493 00:26:04,140 --> 00:26:06,181 Nie ma typ danych o nazwie łańcuch, aw rzeczywistości 494 00:26:06,181 --> 00:26:09,730 Wspomniałem o tym w jednym z naszych Pierwsze filmy w typów danych, 495 00:26:09,730 --> 00:26:13,820 że łańcuch był to typ danych, które został stworzony dla Ciebie w CS50.h. 496 00:26:13,820 --> 00:26:17,050 Musisz #include CS50.h w celu wykorzystania go. 497 00:26:17,050 --> 00:26:19,250 >> Cóż łańcuch jest tak naprawdę aliasem na coś 498 00:26:19,250 --> 00:26:23,600 nazywany char *, a wskaźnik do znaku. 499 00:26:23,600 --> 00:26:26,010 Cóż wskaźniki, przypomnijmy, są tylko adresy. 500 00:26:26,010 --> 00:26:28,780 Więc co jest rozmiar w bajtach ciąg? 501 00:26:28,780 --> 00:26:29,796 No to cztery lub osiem. 502 00:26:29,796 --> 00:26:32,170 A powód mówię cztery lub osiem, bo to jest naprawdę 503 00:26:32,170 --> 00:26:36,730 zależy od systemu, Jeśli używasz CS50 ide, char * jest wielkość char 504 00:26:36,730 --> 00:26:39,340 * Jest osiem, jest to system 64-bitowy. 505 00:26:39,340 --> 00:26:43,850 Każdy adres w pamięci jest długa 64 bity. 506 00:26:43,850 --> 00:26:48,270 Jeśli używasz CS50 urządzenia lub przy użyciu dowolnego komputera 32-bitowego, 507 00:26:48,270 --> 00:26:51,640 i słyszałem, że termin 32-bit Maszyna, co to maszyna 32-bit? 508 00:26:51,640 --> 00:26:56,090 No to po prostu oznacza, że ​​każdy adres w pamięci jest długa 32 bity. 509 00:26:56,090 --> 00:26:59,140 I tak 32 bity to cztery bajty. 510 00:26:59,140 --> 00:27:02,710 Więc char * jest cztery lub osiem bajtów w zależności od systemu. 511 00:27:02,710 --> 00:27:06,100 I rzeczywiście wszelkie typy danych, i wskaźnik do wszelkich danych 512 00:27:06,100 --> 00:27:12,030 wpisać, ponieważ wszystkie wskaźniki są po prostu adresy, cztery lub osiem bajtów. 513 00:27:12,030 --> 00:27:14,030 Więc ponownie tego diagram i niech to stwierdzić 514 00:27:14,030 --> 00:27:18,130 Ten film z odrobiną wysiłku tutaj. 515 00:27:18,130 --> 00:27:21,600 Więc oto schemat skończyliśmy z na samym początku filmu. 516 00:27:21,600 --> 00:27:23,110 Więc co się dzieje teraz, jeśli powiem, * PK = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Więc co to znaczy, gdy mówię, * pk = 35? 519 00:27:30,530 --> 00:27:32,420 Weź drugi. 520 00:27:32,420 --> 00:27:34,990 * pk. 521 00:27:34,990 --> 00:27:39,890 W kontekście tutaj, * jest operator wyłuskiwania. 522 00:27:39,890 --> 00:27:42,110 Więc kiedy dereference operator jest używany 523 00:27:42,110 --> 00:27:48,520 idziemy na adres wskazany przez pk, i zmienić to, co możemy znaleźć. 524 00:27:48,520 --> 00:27:55,270 Tak * pk = 35 skutecznie robi to na zdjęciu. 525 00:27:55,270 --> 00:27:58,110 Więc jest to w zasadzie składniowo identyczny z powiedział, k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Jeszcze jeden. 528 00:28:01,930 --> 00:28:05,510 Jeśli powiem, int m, tworzę nową zmienną o nazwie m. 529 00:28:05,510 --> 00:28:08,260 Nowy pojemnik, to zielone pole, ponieważ to będzie trzymać liczbę całkowitą, 530 00:28:08,260 --> 00:28:09,840 i jest oznaczony m. 531 00:28:09,840 --> 00:28:14,960 Jeśli powiem, m = 4, to umieścić całkowita w tym polu. 532 00:28:14,960 --> 00:28:20,290 Jeśli powiedzmy pk = & m, w jaki sposób ta zmiana schemat? 533 00:28:20,290 --> 00:28:28,760 Pk = & m, zrobić sobie przypomnieć, co się & Operator robi i nazywa? 534 00:28:28,760 --> 00:28:34,430 Pamiętaj, że & jakąś nazwę zmiennej jest adres nazwy zmiennej. 535 00:28:34,430 --> 00:28:38,740 Więc to, co mówisz, jest pk dostaje adres m. 536 00:28:38,740 --> 00:28:42,010 I tak skutecznie, co się stanie, Schemat jest to, że pk nie wskazuje już 537 00:28:42,010 --> 00:28:46,420 k, ale punkty do m. 538 00:28:46,420 --> 00:28:48,470 >> Ponownie wskaźniki są bardzo trudne do pracy z 539 00:28:48,470 --> 00:28:50,620 i biorą dużo praktyka, ale dlatego, 540 00:28:50,620 --> 00:28:54,150 ich zdolności, aby umożliwić do przekazywania danych pomiędzy funkcjami 541 00:28:54,150 --> 00:28:56,945 i rzeczywiście mają te Zmiany zaczną obowiązywać, 542 00:28:56,945 --> 00:28:58,820 się wokół twojej głowie jest naprawdę ważne. 543 00:28:58,820 --> 00:29:02,590 To chyba jest najbardziej skomplikowane temat omówimy CS50, 544 00:29:02,590 --> 00:29:05,910 ale wartość, że cię uzyskać z wykorzystaniem wskaźników 545 00:29:05,910 --> 00:29:09,200 znacznie przewyższają powikłań które pochodzą z ich nauki. 546 00:29:09,200 --> 00:29:12,690 Więc życzę ci najlepiej Powodzenia nauki o wskazówki. 547 00:29:12,690 --> 00:29:15,760 Jestem Doug Lloyd, to CS50. 548 00:29:15,760 --> 00:29:17,447