[Powered by Google Translate] Porozmawiajmy o tablicach.
Więc dlaczego mielibyśmy kiedykolwiek chcesz używać tablice?
No powiedzmy, że masz program, który trzeba przechowywać 5 studentów identyfikatory.
Uzasadnione wydawałoby się mieć 5 oddzielnych zmiennych.
Ze względów zobaczymy za chwilę, zaczniemy liczenie od 0.
Zmienne Musimy będzie int ID0, int id1, i tak dalej.
Każda logika chcemy wykonać na legitymacji studenckiej trzeba będzie skopiować i wkleić
dla każdego z tych identyfikatorów studenckich.
Jeśli chcemy sprawdzić, które studenci akurat w CS50,
my najpierw musimy sprawdzić, czy ID0 reprezentuje studentów w kursie.
Następnie zrobić to samo dla następnego ucznia, musimy skopiować i wkleić kod ID0
i zastąpić wszystkie wystąpienia ID0 z ID1 i tak dalej dla ID2, 3 i 4.
>> Jak tylko słyszę, że trzeba skopiować i wkleić,
powinieneś zacząć myśleć, że jest lepsze rozwiązanie.
Teraz to, co jeśli okaże się, nie trzeba 5 studentów identyfikatory ale 7?
Musisz iść z powrotem do kodu źródłowego i dodać w ID5, o ID6,
i skopiuj i wklej logikę do sprawdzenia, czy identyfikatory należą do klasy dla tych 2 nowych identyfikatorów.
Nie ma nic, łączący wszystkie te identyfikatory razem, a więc nie ma możliwości zadawania
Program to zrobić dla identyfikatorów 0 do 6.
No to teraz sobie sprawę, masz 100 studentów identyfikatory.
To zaczyna się wydawać mniej niż idealnie trzeba osobno zadeklarować każdego z tych identyfikatorów,
i skopiuj i wklej każdą logikę tych nowych identyfikatorów.
Ale być może jesteśmy zdeterminowani i zrobimy to dla wszystkich 100 uczniów.
Ale co, jeśli nie wiesz, ilu uczniów faktycznie istnieją?
Istnieje tylko kilka n studentów i Twój program musi zwrócić się do użytkownika, co to n jest.
Uh oh. To nie będzie działać bardzo dobrze.
Program działa tylko dla pewnej stałej liczby studentów.
>> Rozwiązywanie tych problemów jest piękno tablic.
Więc co to jest tablica?
W niektórych językach programowania typu tablica może być w stanie zrobić nieco więcej,
ale tutaj skupimy się na podstawowej strukturze danych tablicy jak zobaczysz go w C.
Tablica jest po prostu wielki blok pamięci. To jest to.
Kiedy mówimy, że mamy tablicę 10 liczb całkowitych, które po prostu oznacza, że ​​mamy jakiś blok
pamięci, która jest wystarczająco duża, aby pomieścić 10 oddzielne liczby całkowite.
Zakładając, że jest liczbą całkowitą 4 bajtów, oznacza to, że szereg 10 liczb
Blok jest ciągła z 40 bajtów w pamięci.
Nawet podczas korzystania z wielowymiarowych tablic, które nie będziemy się tutaj,
to nadal tylko duży blok pamięci.
Wielowymiarowy zapis jest po prostu wygoda.
Jeśli masz 3 przez 3 wielowymiarowej tablicy liczb całkowitych,
Następnie program będzie naprawdę traktują to jako wielki blok 36 bajtów.
Całkowita liczba liczb jest 3 razy 3, a każdy zajmuje całkowitą 4 bajty.
>> Rzućmy okiem na podstawowy przykład.
Widzimy tutaj 2 różne sposoby tablic wskazujących.
Musimy wypowiedzieć 1 z nich się do programu, aby skompilować
ponieważ deklarują x dwukrotnie.
Będziemy spojrzeć na niektóre z różnic między tymi 2 rodzajów deklaracji w nieco.
Obie te linie deklaruje tablicę N rozmiar,
gdzie mamy # define N jak 10.
Możemy równie dobrze prosić użytkownika o całkowitej dodatniej
i że stosowane jako całkowitą liczbę elementów w tablicy.
Lubię nasz przykład legitymację studencką przed, to jest trochę jak deklarując 10 całkowicie oddzielne
urojone zmienne; x0, x1, x2, i tak dalej aż do xn-1.
Ignorowanie linii, na których możemy zadeklarować tablicę, zauważysz nawiasy kwadratowe nienaruszone
wewnątrz pętli for.
Kiedy piszemy coś jak x [3], w którym będę tylko czytać jako x wspornik 3,
można myśleć o nim jak z prośbą o wyimaginowanym x3.
Wskazówka niż z tablicy o rozmiarze n, oznacza to, że liczba wewnątrz nawiasów,
które będziemy nazywać indeksu, może być cokolwiek od 0 do N-1,
które łącznie N wskaźników.
>> Aby myśleć o tym, jak to naprawdę działa
pamiętaj, że tablica jest duży blok pamięci.
Zakładając, że liczba całkowita wynosi 4 bajty, cała x tablica jest 40 bajtowy blok pamięci.
Odnosi się do tak x0 pierwszych 4 bajtów bloku.
X [1] odnosi się do kolejnych 4 bajtów i tak dalej.
Oznacza to, że X jest początek wszystkie program musi zawsze śledzenia.
Jeśli chcesz korzystać z X [400], a następnie program wie, że jest to równoważne
1600 bajtów w tylko od rozpoczęcia X.
Skąd mamy 1600 bajtów z? To tylko 400 razy 4 bajty na liczbę całkowitą.
>> Zanim przejdziemy dalej, to jest bardzo ważne, aby uświadomić sobie, że w C
nie ma wykonanie używamy indeksu w tablicy.
Nasz wielki blok jest tylko 10 całkowitymi długo, ale nic nie będzie krzyczał na nas, jeśli piszemy X [20]
lub nawet x [-5].
Indeks nie musi nawet być liczbą.
To może być dowolną ekspresją.
W programie możemy użyć zmiennej i. od pętli for do indeksu do tablicy.
Jest to bardzo powszechna wzór, z pętli i = 0 do długości tablicy
, a następnie za pomocą I jako wskaźnik do tablicy.
W ten sposób można skutecznie pętli na całej tablicy,
i możesz przypisać do każdego miejsca w tablicy lub użyć jakiegoś obliczenia.
>> W pierwszej pętli for, i zaczyna się od 0,
i tak będzie to przypisać do 0 miejsce w tablicy, wartość 0 razy 2.
Potem przyrosty, i przydzielić pierwsze miejsce w tablicy wartość 1 razy 2.
Potem znowu zwiększa i tak dalej aż do momentu możemy przypisać do pozycji N-1 w tablicy
wartość N-1 razy 2.
Więc stworzyliśmy tablicę z pierwszych 10 numerów parzystych.
Może wyrównuje byłaby nieco lepsza nazwa dla zmiennej od x,
ale dałby rzeczy dalej.
Druga pętla po prostu drukuje wartości, które już zapisane wewnątrz tablicy.
>> Spróbujmy uruchomić go z obu rodzajów deklaracji tablicy
i spojrzeć na wyjściu programu.
O ile widzimy, program zachowuje się tak samo dla obu rodzajów deklaracji.
Miejmy również spojrzeć na to, co się stanie, jeśli zmienić pierwszą pętlę, aby nie zatrzymać się na N
ale powiedzmy 10.000.
Sposób poza koniec tablicy.
Ups. Może widziałeś to wcześniej.
Segmentation fault oznacza twój program się zawiesił.
Zaczniesz widzieć ich po dotknięciu obszarów pamięci nie należy dotykać.
Tu dotykamy 10.000 miejsc poza początku x,
najwidoczniej to miejsce w pamięci, że nie należy dotykać.
Więc większość z nas prawdopodobnie nie przypadkowo umieścić 10.000 zamiast N,
ale co jeśli możemy zrobić coś bardziej subtelnego, jak na przykład zapis mniejsza lub równa n
w stanie do pętli, w przeciwieństwie do mniej niż N.
Pamiętaj, że tablica ma tylko indeksy od 0 do n-1,
co oznacza, że ​​wskaźnik jest poza N koniec tablicy.
Program nie może upaść w tym przypadku, ale nadal błąd.
W rzeczywistości, ten błąd jest tak powszechne, że ma własną nazwę,
się przez 1 błąd.
>> To jest to o podstawy.
Więc jakie są główne różnice między 2 typów deklaracji tablicy?
Jedną różnicą jest to, gdzie duży blok pamięci idzie.
W pierwszym oświadczeniu, które wezwę Wspornik tablicy typu,
choć jest to bynajmniej konwencjonalne nazwy,
to pójdzie na stos.
Natomiast w drugim, co wezwę pointer-tablicy typu, to pójdzie na stercie.
Oznacza to, że gdy funkcja powraca, wspornik tablicy zostaną automatycznie przydziałów,
mając na uwadze, należy explicitily zadzwonić na darmowy numer tablicy wskaźnika
albo masz wyciek pamięci.
Dodatkowo, nie jest tablica uchwyt rzeczywistości zmienna.
To jest ważne. To tylko symbol.
Można myśleć o tym, jak stała, że ​​kompilator wybiera dla Ciebie.
Oznacza to, że nie możemy zrobić coś jak x + + z typem uchwytu,
choć jest to całkowicie poprawny z typem wskaźnika.
>> Wskaźnik typu jest zmienna.
Dla typu wskaźnika, mamy 2 oddzielne bloki pamięci.
Zmienna x sama jest przechowywany w stosie i jest tylko jeden wskaźnik,
ale duży blok pamięci jest przechowywany na stercie.
Zmienna x na stosie tylko przechowuje adres
dużego bloku pamięci na stercie.
Jedną z konsekwencji jest to z wielkości operatora.
Jeśli poprosisz o wielkości tablicy wspornika, to daje wielkość dużego bloku pamięci,
coś jak 40 bajtów,
ale jeśli poprosić o wielkości typu wskaźnik do tablicy,
to daje wielkość zmiennej x, która sama na urządzeniu prawdopodobnie zaledwie 4 bajty.
Używając pointer-tablicy typu, nie jest możliwe, aby bezpośrednio poprosić o
dużej w bloku pamięci.
Zwykle nie jest wiele ograniczeń, ponieważ bardzo rzadko ma rozmiar
z duży blok pamięci i możemy zazwyczaj obliczyć, jeśli jest to potrzebne.
>> Wreszcie, wspornik tablicy dzieje się nam skrótu do inicjalizacji tablicy.
Przyjrzyjmy się, jak moglibyśmy napisać pierwsze 10 liczb całkowitych nawet używając initilization skrótów.
Z tablicy wskaźnika, nie sposób zrobić skrót jak to jest.
Jest to tylko wstęp do tego, co można zrobić z tablicami.
Pojawiają się one w prawie każdym programie piszesz.
Mam nadzieję, że teraz możesz zobaczyć lepszy sposób student przykład identyfikatory
od początku filmu.
>> Nazywam się Rob Bowden, a to CS50.