1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Porozmawiajmy o tablicach. 2 00:00:09,360 --> 00:00:12,780 Więc dlaczego mielibyśmy kiedykolwiek chcesz używać tablice? 3 00:00:12,780 --> 00:00:17,210 No powiedzmy, że masz program, który trzeba przechowywać 5 studentów identyfikatory. 4 00:00:17,210 --> 00:00:21,270 Uzasadnione wydawałoby się mieć 5 oddzielnych zmiennych. 5 00:00:21,270 --> 00:00:24,240 Ze względów zobaczymy za chwilę, zaczniemy liczenie od 0. 6 00:00:24,240 --> 00:00:30,700 Zmienne Musimy będzie int ID0, int id1, i tak dalej. 7 00:00:30,700 --> 00:00:34,870 Każda logika chcemy wykonać na legitymacji studenckiej trzeba będzie skopiować i wkleić 8 00:00:34,870 --> 00:00:36,870 dla każdego z tych identyfikatorów studenckich. 9 00:00:36,870 --> 00:00:39,710 Jeśli chcemy sprawdzić, które studenci akurat w CS50, 10 00:00:39,710 --> 00:00:43,910 my najpierw musimy sprawdzić, czy ID0 reprezentuje studentów w kursie. 11 00:00:43,910 --> 00:00:48,070 Następnie zrobić to samo dla następnego ucznia, musimy skopiować i wkleić kod ID0 12 00:00:48,070 --> 00:00:54,430 i zastąpić wszystkie wystąpienia ID0 z ID1 i tak dalej dla ID2, 3 i 4. 13 00:00:54,430 --> 00:00:57,560 >> Jak tylko słyszę, że trzeba skopiować i wkleić, 14 00:00:57,560 --> 00:01:00,440 powinieneś zacząć myśleć, że jest lepsze rozwiązanie. 15 00:01:00,440 --> 00:01:05,360 Teraz to, co jeśli okaże się, nie trzeba 5 studentów identyfikatory ale 7? 16 00:01:05,360 --> 00:01:09,570 Musisz iść z powrotem do kodu źródłowego i dodać w ID5, o ID6, 17 00:01:09,570 --> 00:01:14,260 i skopiuj i wklej logikę do sprawdzenia, czy identyfikatory należą do klasy dla tych 2 nowych identyfikatorów. 18 00:01:14,260 --> 00:01:19,600 Nie ma nic, łączący wszystkie te identyfikatory razem, a więc nie ma możliwości zadawania 19 00:01:19,600 --> 00:01:22,040 Program to zrobić dla identyfikatorów 0 do 6. 20 00:01:22,040 --> 00:01:26,120 No to teraz sobie sprawę, masz 100 studentów identyfikatory. 21 00:01:26,120 --> 00:01:30,770 To zaczyna się wydawać mniej niż idealnie trzeba osobno zadeklarować każdego z tych identyfikatorów, 22 00:01:30,770 --> 00:01:33,760 i skopiuj i wklej każdą logikę tych nowych identyfikatorów. 23 00:01:33,760 --> 00:01:38,380 Ale być może jesteśmy zdeterminowani i zrobimy to dla wszystkich 100 uczniów. 24 00:01:38,380 --> 00:01:42,240 Ale co, jeśli nie wiesz, ilu uczniów faktycznie istnieją? 25 00:01:42,240 --> 00:01:47,320 Istnieje tylko kilka n studentów i Twój program musi zwrócić się do użytkownika, co to n jest. 26 00:01:47,320 --> 00:01:50,250 Uh oh. To nie będzie działać bardzo dobrze. 27 00:01:50,250 --> 00:01:53,820 Program działa tylko dla pewnej stałej liczby studentów. 28 00:01:53,820 --> 00:01:57,520 >> Rozwiązywanie tych problemów jest piękno tablic. 29 00:01:57,520 --> 00:01:59,930 Więc co to jest tablica? 30 00:01:59,930 --> 00:02:04,480 W niektórych językach programowania typu tablica może być w stanie zrobić nieco więcej, 31 00:02:04,480 --> 00:02:09,960 ale tutaj skupimy się na podstawowej strukturze danych tablicy jak zobaczysz go w C. 32 00:02:09,960 --> 00:02:14,030 Tablica jest po prostu wielki blok pamięci. To jest to. 33 00:02:14,030 --> 00:02:17,770 Kiedy mówimy, że mamy tablicę 10 liczb całkowitych, które po prostu oznacza, że ​​mamy jakiś blok 34 00:02:17,770 --> 00:02:20,740 pamięci, która jest wystarczająco duża, aby pomieścić 10 oddzielne liczby całkowite. 35 00:02:29,930 --> 00:02:33,410 Zakładając, że jest liczbą całkowitą 4 bajtów, oznacza to, że szereg 10 liczb 36 00:02:33,410 --> 00:02:37,180 Blok jest ciągła z 40 bajtów w pamięci. 37 00:02:42,660 --> 00:02:46,280 Nawet podczas korzystania z wielowymiarowych tablic, które nie będziemy się tutaj, 38 00:02:46,280 --> 00:02:49,200 to nadal tylko duży blok pamięci. 39 00:02:49,200 --> 00:02:51,840 Wielowymiarowy zapis jest po prostu wygoda. 40 00:02:51,840 --> 00:02:55,640 Jeśli masz 3 przez 3 wielowymiarowej tablicy liczb całkowitych, 41 00:02:55,640 --> 00:03:00,650 Następnie program będzie naprawdę traktują to jako wielki blok 36 bajtów. 42 00:03:00,650 --> 00:03:05,460 Całkowita liczba liczb jest 3 razy 3, a każdy zajmuje całkowitą 4 bajty. 43 00:03:05,460 --> 00:03:07,750 >> Rzućmy okiem na podstawowy przykład. 44 00:03:07,750 --> 00:03:10,660 Widzimy tutaj 2 różne sposoby tablic wskazujących. 45 00:03:15,660 --> 00:03:18,580 Musimy wypowiedzieć 1 z nich się do programu, aby skompilować 46 00:03:18,580 --> 00:03:20,900 ponieważ deklarują x dwukrotnie. 47 00:03:20,900 --> 00:03:25,140 Będziemy spojrzeć na niektóre z różnic między tymi 2 rodzajów deklaracji w nieco. 48 00:03:25,140 --> 00:03:28,560 Obie te linie deklaruje tablicę N rozmiar, 49 00:03:28,560 --> 00:03:30,740 gdzie mamy # define N jak 10. 50 00:03:30,740 --> 00:03:34,460 Możemy równie dobrze prosić użytkownika o całkowitej dodatniej 51 00:03:34,460 --> 00:03:37,250 i że stosowane jako całkowitą liczbę elementów w tablicy. 52 00:03:37,250 --> 00:03:41,960 Lubię nasz przykład legitymację studencką przed, to jest trochę jak deklarując 10 całkowicie oddzielne 53 00:03:41,960 --> 00:03:49,000 urojone zmienne; x0, x1, x2, i tak dalej aż do xn-1. 54 00:03:57,270 --> 00:04:00,840 Ignorowanie linii, na których możemy zadeklarować tablicę, zauważysz nawiasy kwadratowe nienaruszone 55 00:04:00,840 --> 00:04:02,090 wewnątrz pętli for. 56 00:04:02,090 --> 00:04:09,660 Kiedy piszemy coś jak x [3], w którym będę tylko czytać jako x wspornik 3, 57 00:04:09,660 --> 00:04:13,090 można myśleć o nim jak z prośbą o wyimaginowanym x3. 58 00:04:13,090 --> 00:04:17,519 Wskazówka niż z tablicy o rozmiarze n, oznacza to, że liczba wewnątrz nawiasów, 59 00:04:17,519 --> 00:04:22,630 które będziemy nazywać indeksu, może być cokolwiek od 0 do N-1, 60 00:04:22,630 --> 00:04:25,660 które łącznie N wskaźników. 61 00:04:25,660 --> 00:04:28,260 >> Aby myśleć o tym, jak to naprawdę działa 62 00:04:28,260 --> 00:04:31,260 pamiętaj, że tablica jest duży blok pamięci. 63 00:04:31,260 --> 00:04:37,460 Zakładając, że liczba całkowita wynosi 4 bajty, cała x tablica jest 40 bajtowy blok pamięci. 64 00:04:37,460 --> 00:04:41,360 Odnosi się do tak x0 pierwszych 4 bajtów bloku. 65 00:04:45,810 --> 00:04:49,230 X [1] odnosi się do kolejnych 4 bajtów i tak dalej. 66 00:04:49,230 --> 00:04:53,760 Oznacza to, że X jest początek wszystkie program musi zawsze śledzenia. 67 00:04:55,660 --> 00:04:59,840 Jeśli chcesz korzystać z X [400], a następnie program wie, że jest to równoważne 68 00:04:59,840 --> 00:05:03,460 1600 bajtów w tylko od rozpoczęcia X. 69 00:05:03,460 --> 00:05:08,780 Skąd mamy 1600 bajtów z? To tylko 400 razy 4 bajty na liczbę całkowitą. 70 00:05:08,780 --> 00:05:13,170 >> Zanim przejdziemy dalej, to jest bardzo ważne, aby uświadomić sobie, że w C 71 00:05:13,170 --> 00:05:17,080 nie ma wykonanie używamy indeksu w tablicy. 72 00:05:17,080 --> 00:05:23,180 Nasz wielki blok jest tylko 10 całkowitymi długo, ale nic nie będzie krzyczał na nas, jeśli piszemy X [20] 73 00:05:23,180 --> 00:05:26,060 lub nawet x [-5]. 74 00:05:26,060 --> 00:05:28,240 Indeks nie musi nawet być liczbą. 75 00:05:28,240 --> 00:05:30,630 To może być dowolną ekspresją. 76 00:05:30,630 --> 00:05:34,800 W programie możemy użyć zmiennej i. od pętli for do indeksu do tablicy. 77 00:05:34,800 --> 00:05:40,340 Jest to bardzo powszechna wzór, z pętli i = 0 do długości tablicy 78 00:05:40,340 --> 00:05:43,350 , a następnie za pomocą I jako wskaźnik do tablicy. 79 00:05:43,350 --> 00:05:46,160 W ten sposób można skutecznie pętli na całej tablicy, 80 00:05:46,160 --> 00:05:50,600 i możesz przypisać do każdego miejsca w tablicy lub użyć jakiegoś obliczenia. 81 00:05:50,600 --> 00:05:53,920 >> W pierwszej pętli for, i zaczyna się od 0, 82 00:05:53,920 --> 00:05:58,680 i tak będzie to przypisać do 0 miejsce w tablicy, wartość 0 razy 2. 83 00:05:58,680 --> 00:06:04,370 Potem przyrosty, i przydzielić pierwsze miejsce w tablicy wartość 1 razy 2. 84 00:06:04,370 --> 00:06:10,170 Potem znowu zwiększa i tak dalej aż do momentu możemy przypisać do pozycji N-1 w tablicy 85 00:06:10,170 --> 00:06:13,370 wartość N-1 razy 2. 86 00:06:13,370 --> 00:06:17,810 Więc stworzyliśmy tablicę z pierwszych 10 numerów parzystych. 87 00:06:17,810 --> 00:06:21,970 Może wyrównuje byłaby nieco lepsza nazwa dla zmiennej od x, 88 00:06:21,970 --> 00:06:24,760 ale dałby rzeczy dalej. 89 00:06:24,760 --> 00:06:30,210 Druga pętla po prostu drukuje wartości, które już zapisane wewnątrz tablicy. 90 00:06:30,210 --> 00:06:33,600 >> Spróbujmy uruchomić go z obu rodzajów deklaracji tablicy 91 00:06:33,600 --> 00:06:36,330 i spojrzeć na wyjściu programu. 92 00:06:51,450 --> 00:06:57,020 O ile widzimy, program zachowuje się tak samo dla obu rodzajów deklaracji. 93 00:06:57,020 --> 00:07:02,230 Miejmy również spojrzeć na to, co się stanie, jeśli zmienić pierwszą pętlę, aby nie zatrzymać się na N 94 00:07:02,230 --> 00:07:05,040 ale powiedzmy 10.000. 95 00:07:05,040 --> 00:07:07,430 Sposób poza koniec tablicy. 96 00:07:14,700 --> 00:07:17,210 Ups. Może widziałeś to wcześniej. 97 00:07:17,210 --> 00:07:20,440 Segmentation fault oznacza twój program się zawiesił. 98 00:07:20,440 --> 00:07:24,430 Zaczniesz widzieć ich po dotknięciu obszarów pamięci nie należy dotykać. 99 00:07:24,430 --> 00:07:27,870 Tu dotykamy 10.000 miejsc poza początku x, 100 00:07:27,870 --> 00:07:31,920 najwidoczniej to miejsce w pamięci, że nie należy dotykać. 101 00:07:31,920 --> 00:07:37,690 Więc większość z nas prawdopodobnie nie przypadkowo umieścić 10.000 zamiast N, 102 00:07:37,690 --> 00:07:42,930 ale co jeśli możemy zrobić coś bardziej subtelnego, jak na przykład zapis mniejsza lub równa n 103 00:07:42,930 --> 00:07:46,830 w stanie do pętli, w przeciwieństwie do mniej niż N. 104 00:07:46,830 --> 00:07:50,100 Pamiętaj, że tablica ma tylko indeksy od 0 do n-1, 105 00:07:50,100 --> 00:07:54,510 co oznacza, że ​​wskaźnik jest poza N koniec tablicy. 106 00:07:54,510 --> 00:07:58,050 Program nie może upaść w tym przypadku, ale nadal błąd. 107 00:07:58,050 --> 00:08:01,950 W rzeczywistości, ten błąd jest tak powszechne, że ma własną nazwę, 108 00:08:01,950 --> 00:08:03,970 się przez 1 błąd. 109 00:08:03,970 --> 00:08:05,970 >> To jest to o podstawy. 110 00:08:05,970 --> 00:08:09,960 Więc jakie są główne różnice między 2 typów deklaracji tablicy? 111 00:08:09,960 --> 00:08:13,960 Jedną różnicą jest to, gdzie duży blok pamięci idzie. 112 00:08:13,960 --> 00:08:17,660 W pierwszym oświadczeniu, które wezwę Wspornik tablicy typu, 113 00:08:17,660 --> 00:08:20,300 choć jest to bynajmniej konwencjonalne nazwy, 114 00:08:20,300 --> 00:08:22,480 to pójdzie na stos. 115 00:08:22,480 --> 00:08:27,450 Natomiast w drugim, co wezwę pointer-tablicy typu, to pójdzie na stercie. 116 00:08:27,450 --> 00:08:32,480 Oznacza to, że gdy funkcja powraca, wspornik tablicy zostaną automatycznie przydziałów, 117 00:08:32,480 --> 00:08:36,419 mając na uwadze, należy explicitily zadzwonić na darmowy numer tablicy wskaźnika 118 00:08:36,419 --> 00:08:38,010 albo masz wyciek pamięci. 119 00:08:38,010 --> 00:08:42,750 Dodatkowo, nie jest tablica uchwyt rzeczywistości zmienna. 120 00:08:42,750 --> 00:08:45,490 To jest ważne. To tylko symbol. 121 00:08:45,490 --> 00:08:49,160 Można myśleć o tym, jak stała, że ​​kompilator wybiera dla Ciebie. 122 00:08:49,160 --> 00:08:52,970 Oznacza to, że nie możemy zrobić coś jak x + + z typem uchwytu, 123 00:08:52,970 --> 00:08:56,240 choć jest to całkowicie poprawny z typem wskaźnika. 124 00:08:56,240 --> 00:08:58,270 >> Wskaźnik typu jest zmienna. 125 00:08:58,270 --> 00:09:01,510 Dla typu wskaźnika, mamy 2 oddzielne bloki pamięci. 126 00:09:01,510 --> 00:09:06,060 Zmienna x sama jest przechowywany w stosie i jest tylko jeden wskaźnik, 127 00:09:06,060 --> 00:09:08,620 ale duży blok pamięci jest przechowywany na stercie. 128 00:09:08,620 --> 00:09:11,010 Zmienna x na stosie tylko przechowuje adres 129 00:09:11,010 --> 00:09:14,010 dużego bloku pamięci na stercie. 130 00:09:14,010 --> 00:09:17,370 Jedną z konsekwencji jest to z wielkości operatora. 131 00:09:17,370 --> 00:09:22,480 Jeśli poprosisz o wielkości tablicy wspornika, to daje wielkość dużego bloku pamięci, 132 00:09:22,480 --> 00:09:24,620 coś jak 40 bajtów, 133 00:09:24,620 --> 00:09:26,920 ale jeśli poprosić o wielkości typu wskaźnik do tablicy, 134 00:09:26,920 --> 00:09:32,740 to daje wielkość zmiennej x, która sama na urządzeniu prawdopodobnie zaledwie 4 bajty. 135 00:09:32,740 --> 00:09:36,530 Używając pointer-tablicy typu, nie jest możliwe, aby bezpośrednio poprosić o 136 00:09:36,530 --> 00:09:38,530 dużej w bloku pamięci. 137 00:09:38,530 --> 00:09:42,530 Zwykle nie jest wiele ograniczeń, ponieważ bardzo rzadko ma rozmiar 138 00:09:42,530 --> 00:09:46,980 z duży blok pamięci i możemy zazwyczaj obliczyć, jeśli jest to potrzebne. 139 00:09:46,980 --> 00:09:51,490 >> Wreszcie, wspornik tablicy dzieje się nam skrótu do inicjalizacji tablicy. 140 00:09:51,490 --> 00:09:56,130 Przyjrzyjmy się, jak moglibyśmy napisać pierwsze 10 liczb całkowitych nawet używając initilization skrótów. 141 00:10:11,220 --> 00:10:14,470 Z tablicy wskaźnika, nie sposób zrobić skrót jak to jest. 142 00:10:14,470 --> 00:10:18,120 Jest to tylko wstęp do tego, co można zrobić z tablicami. 143 00:10:18,120 --> 00:10:20,990 Pojawiają się one w prawie każdym programie piszesz. 144 00:10:20,990 --> 00:10:24,390 Mam nadzieję, że teraz możesz zobaczyć lepszy sposób student przykład identyfikatory 145 00:10:24,390 --> 00:10:26,710 od początku filmu. 146 00:10:26,710 --> 00:10:29,960 >> Nazywam się Rob Bowden, a to CS50.