[TEMAT MUZYKA] GŁOŚNIK 1: Cześć wszystkim. Witamy z powrotem do sekcji. Piękny dzień out--, dlatego, że jestem Oczywiście, są tylko cztery z was tutaj i nie nasz zwykły pakiet. Byłem chory w ten weekend. Więc nie mam Gwiazda dla was. A może zacznę kaszleć strasznie przez to. Więc po prostu nosić ze mną. Będę naprawdę spróbować i przejść przez ten pierwszy, jednak, zanim mam atak kaszlu. Ale tak łatwo się mnie trochę bit-- to wszystko pytam. Więc nasza agenda today-- tylko reminder-- quiz jest w przyszłym tygodniu. Powiedziałem wam to w zeszłym tygodniu, więc nie złapać tropu. Więc jestem przypominając ponownie. Przyszłym tygodniu quiz. W tym celu, w przyszłym tygodniu na Sekcja będzie znacznie więcej of-- Postaram się i pracować w jakimś przeglądu. Więc jeśli wam się mi pomóc, wysyłając mnie rzeczy, że jesteś wygodne się, że się martwisz, tematy, które chciałbyś dla mi na pokrycie, to byłoby świetnie. Więc mogę spróbować i ich pracy do naszej sekcji w przyszłym tygodniu lub wysłać dodatkowy materiał lub prep że nie może dostać się gdzie indziej. Tak! Więcej ludzi przychodzi! Myślałem, że zrobiłem źle w ubiegłym tygodniu, że nikt nie chce wrócić? Boję się. Tak więc trzech innych rzeczy że mamy zamiar iść na są przekierowania, plik I / O, a następnie wskaźniki i pamięci dynamicznej. Jestem pewien, że wszyscy jesteśmy bardzo podekscytowani pointers-- ulubiony temat każdego z nas, tak proste do zrozumienia. Jestem pewien, że wy wszyscy mają, prawda? Pierwszy tak pierwsze rzeczy, redirection-- jest to w zasadzie tylko sposobem kontrolować, w jaki sposób wejście rzeczy w programie, rzeczy, jak wyjść z programu. Główne sposoby, że chłopaki zostały interakcje z jest tylko poprzez standardowe wyjście z ekranu drukowania tutaj. Ale są sposoby na pipe-- jak widzimy tutaj jest jednym z naszych words-- rodzaju Rura z informacja lub że dane w pliku z pliku. To jest po prostu różne sposoby Getting Things do programu i się z programem, a nie tylko drukowanie ich na tym ekranie lub wprowadzania rzeczy z linii poleceń. Pierwszym z nich jest tak mało większa niż daszek. Więc output-- to wyjście po prostu drukuje do pliku zamiast ekranu. Więc jeśli masz coś, wydrukowany "Witaj, świecie!" na ekranie jeśli umieścić go zamiast do output.text, że tworzy plik o nazwie output.text. A kiedy go otworzyć, to będziesz powiedzieć: "Witaj, świecie!" tam. Może to być bardzo przydatne jeśli masz mnóstwo błędów rzeczywiście, jak widzimy w tym. Jeśli nie dwie karetki, to będziesz drukowanie komunikatów o błędach. Tak więc, jeśli masz problem z kompilacja, ma dużo błędów a ty ugrzęznąć w staraniach przewiń w linii poleceń przez wszystkich tych, można po prostu wydrukować je do pliku, otworzyć ten plik, tak aby można przewijać nich łatwiejsze. I rzeczywiście wykorzystywane, że Wiele kiedy debugowania moje 181 psets dla uczenia maszynowego. Więc to może być bardzo przydatne w przyszłości. Jest to także przydatne, jeśli masz program że być może generuje bibliotekę lub generowania jakiś zestaw strun, i muszą być w stanie dostrzec, że to generuje je prawidłowo. To jest sposób, aby to zrobić. Więc jeśli je wydrukować do pliku, mogą łatwiej zbadać je, prawda? Versus próbuje przewijać za pośrednictwem linii poleceń. I wtedy jedna rzecz, aby pamiętać, jest to, że z tylko większe niż daszek, jeśli piszesz do pliku, który już exists-- tak, jak gdyby zabrakło tego pierwszego Czas, kładziemy go na output.text, a następnie mieliśmy drugi program że to wydrukowane w programie dwa i nie większa niż output.text, spowoduje zastąpienie that-- tak nadpisanie, co było kiedykolwiek w ten plik, aby rozpocząć. Tak więc, jeśli chcesz dołączyć do pliku, jak widzimy tutaj, po prostu zrobić dwa większe niż znaki. I będzie dołączyć do niego. Nie będzie go zastąpić. Więc jeśli chcesz uruchomić wielokrotnego Programy i rodzaj utrzymać tor, co wszystkie z nich są wracając do Ciebie w pliku, to jest sposób, aby to zrobić. Jeśli nie obchodzi co jest w pliku i to mogą być zastąpione, możesz po prostu użyć jednego większa niż. Czy to ma sens dla każdego? Odbiorcy: Jak przywitać większa kropka slash niż tekst wyjściowy kropka, jak dwa razy, będzie to po prostu pokazać się tylko na wyjściu kropka drugi time-- tekst GŁOŚNIK 1: Prawo. Więc to w zasadzie tylko w całości nadpisanie, co było na początku. Jeśli ten plik tutaj, już output.text istnieje, w zasadzie, co nazywasz że dzięki jednej Wielkopolski nie można po prostu myśleć o tym tak jak to zastąpić plik. Jak wtedy, gdy jesteś zapisywania Słowo dokument i nie zapisywać, i zachować tę samą nazwę, a całkowicie nadpisuje it-- jest to ten sam rodzaj rzeczy. Ktoś ma jakieś pytania na temat tylko wyprowadzania do pliku? Niesamowite. Tak oczywiście, jeśli odwrócić strzałka kierunku, to może zrobić wejście. Kiedy więc chłopaki mieli jak Cezara lub Visioneer i trzeba było coś wejściowego, miałeś linii poleceń argumentu Wejście to, że rzeczywiście. Jest to kolejny sposób, aby to zrobić. Więc zamiast czekać w wierszu polecenia jak, kiedy poprosił o swoje Komunikat w Cezara lub Visioneer, gdybyś miał plik tekstowy że mieliśmy wiadomość, można po prostu wpisać go do tego. Więc jeśli to było jak kropka slash Cezara 3 mniej niż tekstu wejściowego strzałki, które jest wiadomość, że byłoby dobrze. Gdy Cezar rzeczywiście program zapytany o dane od użytkownika, byłoby już to dlatego, wpisaniu w tym pliku. To tylko kolejny sposób. Wystarczy odwrotna output-- tylko wejście do danych. I wtedy ostatni jest rura. Tak Ten jest całkiem fajny. Dlatego, że pozwala na wziąć wyjście jednego Program i umieścić go w Wejście do innego programu. Nie wiem, czy ktoś z was grał z rozszyfrować że CS50 może mieć wam, ale to będzie pozwalają trochę próbkę pliku, wpisz go do szyfrowania, a następnie stamtąd wpisać że w swoim deszyfrowania upewnić się, okazało się to samo. Więc jest to coś w rodzaju pętli trójdrożny. Idź do niego. Publiczność: Jeśli program ma wiele wejść, czy jest jakiś sposób, żeby go które wejście powiedzieć do korzystania z pliku tekstowego lub wyjście? GŁOŚNIK 1: Posiada wiele wejść. Cokolwiek złożyć input-- kiedy to z prośbą o wejście że za pierwszym razem, to zamiar założyć, myślę, że to zamiar rury w całym pliku. Więc jeśli masz kilka wejść, jesteś będzie rurociągów w wielu plikach. Więc jeśli pytasz wiadomości trzy razy w kodzie, masz zamiar być wprowadzenie w trzech różnych plików. I robi się szalony. I nie powinno się martw się o to już teraz. Ale to jest pomysł. Więc tak, rura jest tylko wyjście jednego Program wykorzystuje wejście do drugiej. Wszyscy tam dobrze? Fajne. OK. Prawdopodobnie nie będzie miał zrobić zbyt wiele z nim. Ale trzeba zrozumieć, sposobów można to wykorzystać. I są pewne sprawy, które możesz go używać. Więc plik I / O- wiem co masz saying-- jesteśmy przyzwyczajeni do czytania z i pisania do naszej ekranie tam, co jest standardem i standardowe wyjście. I to jest to, co faceci byli robi od początku klasy tutaj. Ale można także odczytywać i zapisywać pliki, który jest cały plik I / O- więc plik wejściowy, Wyjście to wszystko oznacza. Więc to w zasadzie oznacza, że można przechowywać swoje dane teraz. Po prostu wydrukuj go do ekran, to w zasadzie nie ma, prawda? Jak najszybciej zrobić "Hello świat "i uruchomić" Witaj świecie " wypisuje "Hello World" na ekranie. Ale tak naprawdę nie można zrobić coś z nim tam. W przypadku przechowywania w tekście Plik, a potem nagle masz te dane, że masz prawo manipulować lub umieścić go w pliku, lub umieścić go w programie później. Jednym z powodów Dlaczego robimy to tylko jako sposób przechowywania danych w celu późniejszego wykorzystania. Mam tu kilka kroków po prostu przechodząc przez standardowe I / O. W pierwszym kroku, można należy utworzyć odwołanie dostępu do pliku wszystkich czapki Plik gwiazdek. Tak, że tworzy wskaźnik do pliku. Więc chcesz go otworzyć. I mówisz, dosłownie, tylko plik równa fopen. I to się dzieje, aby powrócić wskaźnika do właśnie otwartego pliku. Widziałem kilka Ciebie Faceci w godzinach urzędowania. Ale jedną z rzeczy, jest remember-- wskaźniki może być jakiś adres lub null, prawda? Jeśli kiedykolwiek ma przypadku, gdy coś może zwrócić null, co mamy robić zanim jeszcze go używać? Musimy sprawdzić, czy jest zerowy lub nie, prawda? Ponieważ niektórzy z was mogą mieć Kwestia, gdzie co obiekt był zwrócony w wybuchu była zerowa. Próbowano wykonać niektóre funkcje na nim. A Twoja strona komputer nic zarzucić. Prawda? Założę kilka Ciebie może mieć ten problem. Więc z fopen, fopen albo będzie zwraca wskaźnik do pliku, lub, jeśli coś pójdzie nie tak, to się zwróci null. Tak więc zawsze trzeba sprawdzić że nie wrócił pusty przed przystąpieniem do niczego innego. To jest jak standardowy paradygmatu że masz zamiar trzeba tutaj. Jeśli jest szansa, że ​​kiedykolwiek coś może zwrócić null, sprawdzić, czy to nie przed kontynuowaniem. W przeciwnym razie, będziesz aby uzyskać piękne usterek witryn. A nikt nie lubi zajmować się tym. Tak jak widzimy tutaj, pierwszy argument jest tylko ścieżka do pliku. Jeśli plik nie istnieje, to będzie utworzyć ten plik. I to właśnie będzie puste. A potem drugi argument jest tryb, który chcesz. Czy chcemy czytać z tego pliku? Czy chcesz napisać od niego? Chcesz dołączyć? Tak naprawdę to, co właśnie said-- jeśli plik nie istnieje i starasz się czytać z to, że rzuci się błąd. Jeśli podoba czy plik name-- file.text jeszcze nie istnieje i chcesz napisać do niej, stworzy pusty plik o nazwie file.text dla Ciebie. A jeśli chcesz dołączyć, powinieneś zrobić to samo. Czy to ma sens? Jeśli starasz się czytać z Plik, który jeszcze nie istnieje, będzie to wyrzucić błąd. W przeciwnym razie, będzie utworzyć plik dla ciebie zrobić, co chcesz do niego. Fajne. Teraz możemy odczytać z pliku. I to jest właśnie rodzaj dzieje przez różne funkcje że mamy do pliku I / O. Ta wola być konieczne w tym tygodniu Pset, jeśli dobrze pamiętam. Tak, będzie to absolutnie niezbędne w tym tygodniu Pset. Więc fgetc zwraca następny znak. fgets tylko zwraca wiersz tekstu. Powróci do niczego Nowa linia, i będzie przerwa. Więc fread odczytuje pewne liczba bajtów i umieszcza je do tablicy, która jest coś, co może chcą zrobić z ponownego size-- Może być użyteczne. Ile osób przeczytałeś spec pset, przy okazji? OK. [Niesłyszalne] GŁOŚNIK 1: OK. Dobrze. Zdecydowanie przeczytać that-- to zabawa zbior. Można dostać się do odzyskać usunięty pamięci card-- naprawdę ekscytujące, kiedy to działa. Ale na pewno, zacznij czytać tego. Chodź ze mną rozmawiać, jeśli Ciebie pytania o to. OK, tak jak mówiłem, fread odczytuje się określoną liczbę bajtów. To niektóre dowolna liczba że masz zamiar ustawić. A następnie fseek tylko ruchy w pewnym położeniu. Więc może to nie obchodzi o następne 10 bajtów. Chcesz po prostu przejść od razu. Nie dbam o nich. Chcesz przeczytać zaczynając od bajtu 11. fseek pozwala to zrobić. Więc to pozwala być selektywna o tym, co czytasz. Ponieważ fgetc, fgets i fread przeczytane z pewnego miejsca w pliku. Sposób, aby myśleć o to, czy to jest nasz plik, gdy po raz pierwszy go otworzyć, masz tę pozycję w pliku który zaczyna się na początku. Kiedykolwiek zadzwonić fgetc, fgetf lub fread, to będzie rozpocząć od ten znacznik pozycji. Powiedzmy, że po prostu chcesz przeczytać ten fragment pamięci tutaj. Nie można po prostu zadzwonić. Musisz szukać tutaj a następnie odczytać stamtąd lub czytać, dostaje albo getc, w zależności od tego, co chcesz. Więc szukać tylko pozwala na pominąć fragmenty pamięci. A to tylko sposób można pominąć rzeczy bez czytania ich do bufora. Czy to ma sens dla każdego? Oczywiście, nie Wiele równoległych here-- nasz przekierowanie wyjścia lub wejścia, już czytać i pisać. Więc fputc tylko pisze znaków w pliku. fputs pisze wiersz. Fprintf drukuje sformatowany wyjście. Więc jeśli masz karty, lub miejsca, lub cokolwiek. A potem pisze niektóre fwrite Tablica bajtów do pliku. Tak to jest w ten sam sposób fwrite i fread są analogiczne opposites-- fgets, fputs i następnie fputc i fgetc-- wiele crazy, szybkie rzeczy. Wystarczy trochę zachować to handy-- będziesz mieć różne czasy gdzie może po prostu chcesz jeden znak na raz. Może chcesz całą linię. Z słownika pset-- która składa się z dwóch psets, Wierzę, damy Ci całość Słownik w formacie tekstowym każde słowo, które ma oddziela się linią. Więc jeśli chcesz, aby przeczytać w jednym słowie na raz, co można użyć, jeśli czytasz i wszystkie są rozdzielone na nowych liniach, i chcesz tylko jedno słowo na raz? WIDOWNI: fgets GŁOŚNIK 1: Prawo. Fgets-- dlatego, że zwraca co jest w jednej linii. A jeśli każde słowo jest jej własna linia, możemy użyć fgets. Fajne. Czy to ma sens, wszyscy? Cool? Tak, mamy zamiar dostać się do zabawy część z wskaźnikami bardzo szybko, w którym się zrobić trochę matematyki. I to będzie wielki. Ostatni step-- zamknij plik. Z tak wielu rzeczy tutaj, jeden z naszych modeli to czy może wrócić null, sprawdź, null. Jeśli otworzyć coś, lepiej go zamknąć. OK, więc nie skończysz dopóki jesteś zrobić chyba, że ​​je zamknął. Coś jak to nie jest na dopóki gruba dama śpiewa. To tak, jakby zamknięcie pliku. Jak mówi, po prostu powtórzyć, zawsze otworzyć plik, zanim będziesz odczytu lub zapisu do niego. I zawsze zamknąć go, jeśli już je otworzył. Wszystko w porządku? Fajne. Więc oto przykład. Więc tiny-- Nie wiem, czy ty ludzie widzą, że bardzo dobrze. Gdybyśmy tylko mogli zwiększyć Jasność jakoś. Pozwól, że faktycznie to jeśli mogę. OK, chłopaki naprawdę nie może zobaczyć, że w ogóle można? OK, mamy zamiar to zrobić, a następnie. [Niesłyszalne] Zakładam, że jest to o wiele lepiej, aby zobaczyć. Czy ktoś może zobaczyć, gdzie mój Mysz poszła jest pytanie? Ach, to is-- co walczy! OK. Zasadniczo, faceci powinni mieć rodzaj od pomysłu co to robi. To nie jest idealne. Ale wolałbym wyjaśnić niż spędzić więcej czasu próbując go sformatować poprawnie. Zasadniczo, jak widać tutaj, zaczynamy z otwartego pliku. I mamy pewne plik bazy danych, które są otwarcie, że mówi, że to nasi studenci. I mamy zamiar napisać do niego. Więc oczywiście zwróci null. Musimy więc sprawdzić, null. A potem, jeśli to nie jest null, przechodzimy. I jak widać, jesteśmy krążący tutaj. Są studenci. Studenci to skrót zdefiniowany jako trzy. I to, co robimy jest jesteśmy drukowanie do pliku, tak? Więc co my drukowania do naszego pliku? Uczestniczyć: wyniki że są w tablicy? 1 głośnik: Tak. Wynik, które są w array-- dokładnie. Więc otwieramy ten plik bazy danych, które Zakładam, że jest jakiś bazy danych klas. A my po prostu drukowanie wyniki każdego ucznia do tego pliku. Cool? Dobra. Niesamowite. OK. Wróćmy to-- Publiczność: mam szybkie pytanie. Printf nie jest w pętli for? To tylko w razie pętli? GŁOŚNIK 1: Nie, to w pętli for. Nie widzę mojej myszy bardzo dobrze się tutaj. Więc jestem stara się format, który poprawnie. Wspornik powinien zniknąć. Należy tu w dół. To jest to, co masz w pętli for. Nie. Teraz to całkiem. Więc tak jak powinno być: z wyjątkiem dla tego ostatniego przedziału, że odwołany. OK. Czy to ma sens dla każdego? OK. Mamy zamiar przenieść na do następnej rzeczy then-- które, rzeczywiście, masz zamiar potrzebować, aby zobaczyć kod. Więc jestem po prostu będzie Kopiowanie, że w ciągu chwili. OK. Więc mam zamiar pokazać wam ten kod. I chcę, aby spróbować i rysunek co to ma robić. Tak więc biorąc pod uwagę that-- zająć minutę lub tak. Spróbuj dowiedzieć się, co się tutaj dzieje. Jakieś pomysły? Wiemy, że mamy co najmniej dwa argumenty w linii poleceń, tak? I przyjąć, z których jedna ma być że [niesłyszalne] naszego programu jest a potem coś innego. Bo jeśli [niesłyszalne] jest mniej niż dwóch, możemy krzyczeć na nich. Prawda? I od użytkowania, wygląda na to, to będzie jakiś plik. Wszyscy zgadzają się, że? Więc teraz, co to pętla robi? Co to przeżywa? Grupa docelowa: Wszystkie pliki. GŁOŚNIK 1: Dokładnie. To się dzieje przez cały pliki, które mamy tam wejście. Więc dla każdego pliku, to otwierając jakiś ciąg tam. To otwarcie się do tego pliku. Prawda? I czyta z niej. Oczywiście, sprawdzając, czy jest pusty. I to jest drukowane. Jeśli jest pusty, to tylko mówi nam, że to nie jest plik, który nie istnieje. Bo pamiętam, z czytaj nasz plik musi istnieć. Prawda? Z zapisu i dołączyć, można uciec z nim. Ale z odczytu, nasz plik musi istnieć. A jeśli istnieje, Co my tu robimy? Po prostu zacząć tutaj. Co to jest do-- to pierwszy znak. Co to robi? Dostaje jeden znak, prawda? Więc co to robi? Robi się pierwszy znak. Ktoś wie EOF? Publiczność: Koniec pliku? GŁOŚNIK 1: Koniec file-- dokładnie. Więc to będzie przejść przez cały plik, tak? I wtedy to się aktualizować przez coraz każdy kolejny znak. Prawda? A co on robi? Publiczność: Putting że in-- GŁOŚNIK 1: druki putchar do wygaszacza ekranu. [Niesłyszalne] charakter. I wtedy, gdy [niesłyszalne] będzie zamknąć plik. Publiczność: Nie potrzebujesz [? jeszcze? ?] GŁOŚNIK 1: Niekoniecznie. Mam na myśli, to jest rodzaj domniemanych w tym. Ponieważ ten wraca, chociaż, jak długo jak nie złapać tego, jesteś w porządku. Mam na myśli to chyba dobry ćwiczyć się zrobić więcej. Ale nie zawsze jest inaczej konieczne zwłaszcza jeśli masz coś jak powrót, który Oznacza to, że w tym przypadku, gdy chwyta to twój program będzie do końca i nigdy nie dostać się do tego. To bardziej dla przypadku, gdy jesteś niekoniecznie powrocie coś. Bo jeśli to nie było powrót niczego, oznaczałoby to, że gdyby to było prawdą, Reszta to będzie nadal działać. I w tym przypadku, chciałby fałszywe. Jeśli nie jest to powrót, i Zakończenie programu, jeszcze wszystko nie jest konieczne czas, w zależności od kontekstu. Jakub, nie masz pytanie? Publiczność: Tak. Więc nie fgetc się następny znak? Jak bohater zwiększyć? 1 głośnik: Tak. Więc fgetc dostaje następny znak. Możesz myśleć o tym, jak C ++, w pewnym sensie. Publiczność: Tak, co było EOF? GŁOŚNIK 1: EOF jest koniec pliku. To jest po prostu znacznik, który pozwala wiedzieć że jesteś na końcu pliku. Więc to będzie drukować do standardu zewnątrz. I wtedy to się zamknij plików, kiedy to zrobić. A potem idziemy do następny plik, prawda? Więc ogólnie rzecz biorąc, to co ten program zrobić? [Niesłyszalne] 1 głośnik: Tak. To po prostu wypisuje wszystko tam. Więc jeśli wy kiedykolwiek Cat a następnie nazwa jakiegoś file-- Nie wiem, czy ktoś z was ma kiedykolwiek zrobił, że na terminalu. Ale jeśli kiedykolwiek użyć Komenda CAT-- C-T-- Plik, a następnie co masz there-- go drukuje go do terminalu, który może być bardzo przydatne dla niektórych rzeczy. Używam go dużo. Czy to ma sens dla każdego? Cool? OK, więc zadanie now-- albo samodzielnie lub z ludźmi wokół you-- jest po prostu napisać prosty program , że będzie po prostu napisać "Witaj, świecie!" do pliku. [Niesłyszalne] [Niesłyszalne] GŁOŚNIK 1: Ja na to nie Źle robię, że w zeszłym tygodniu? Nie sądziłem, że to było tak źle. Cieszę się, że jesteśmy tutaj. To naprawdę sprawia, że ​​jestem szczęśliwy. Jestem dziewczyną z prostych przyjemności. Ja po prostu lubię, gdy moja sekcja uczęszcza. Więc ja tylko się zaczęło dla wy tak, że możemy zakodować razem. Nie lubię nikogo na wprowadzenie miejsce, jeśli nie chcesz być. Grupa docelowa: Do quizu, zrobić musimy napisać program? GŁOŚNIK 1: Możesz zostać poproszony o pisać proste programy ręcznie. Tak. Publiczność: quiz jest w przyszłym tygodniu, tak? GŁOŚNIK 1: quiz jest w najbliższą środę. Oznacza to, że jest piękny [? CSE?] klasyfikacji partii po tym, który oznacza otrzymasz swoje wyniki z powrotem, że night-- w jakim czasie? Kto wie? Ale będzie to, że noc. Dobrze. Jak chcemy rozpocząć ten? Dam ci hint-- zaczyna z tego. PUBLICZNOŚCI: Musisz otworzyć plik. 1 głośnik: Tak. Więc co chcesz nazwać? Czy chcesz po prostu nazwać to "plik"? Zróbmy to łatwe. Więc fopen-- co nasze Test wyjścia będzie? Nazwijmy to "Hello". A jaki jest nasz tryb? Co mamy robić do tego pliku? Publiczność: Czytaj. Pisanie. GŁOŚNIK 1: Piszemy do niego. Piękny. OK, więc mamy ten plik teraz. Co musimy zrobić? PUBLICZNOŚCI: Sprawdź, czy jest to wartość null. GŁOŚNIK 1: Sprawdź, czy jest to null-- dokładnie. To, co chciałbym usłyszeć. To powinno być automatyczne, zwłaszcza praktycznie od tego momentu. Jeśli zaczniesz segfaulting, prawdopodobnie nie sprawdzić wartość null gdzieś. Dziewięć razy na dziesięć, to będzie twój błąd. Więc jeśli można po prostu dostać w zwyczaj, zawsze należy sprawdzić, czy jest pusty, Twoje życie będzie ładne i easy-- lub łatwiejsze. Więc sprawdź, czy jest pusty. Więc jeśli to nie jest null, która jest to, co równa się huk means-- nie null-- to ważne. Co chcemy zrobić? Chcemy tylko, aby wydrukować do tego pliku, prawda? Więc co będziemy używać? Publiczność: fprintf GŁOŚNIK 1: Fprintf-- piękne. I fprintf tam gdzie zajmuje dwie arguments-- to będzie i co chcemy wydrukować. Więc co jest pierwszy? Gdzie to będzie? Publiczność: Plik. GŁOŚNIK 1: To będzie plik. I co chcemy wydrukować? "Witaj, świecie!" Dobrze. Mamy ostatnią thing-- tu kolejny wielki paradygmat. Publiczność: Zamknij. GŁOŚNIK 1: Zamknij. Proszę bardzo. Publiczność: Czy to się dzieje jeśli plik jest pusty? GŁOŚNIK 1: Nie, to jest, jeśli nie jest pusty. Publiczność: Och, czy to not-- OK. Dla fopen a następnie dwa argumenty, które go w środku, co to pierwszy argument oznacza ponownie? GŁOŚNIK 1: argument jest tak jak w nazwie pliku które chcesz się udać. Więc po działa to byś jakiś plik o nazwie "cześć" że miał "Hello, world" w nim. To wszystko. Tylko nazwa. Publiczność: A ponieważ jest to pisanie, Plik nie musi już istnieć. Czy to, co pan powiedział? GŁOŚNIK 1: Prawo. Dokładnie. Jeśli "Hello" w postaci pliku jeszcze nie istnieje, to zamierza utworzyć plik o nazwie Hello "i napisać do niego dla Ciebie. Publiczność: Kiedy mówisz program napisał do pliku, dlaczego piszesz "Plik", a nie Nazwa pliku i fprintf-- GŁOŚNIK 1: Ponieważ w tym przypadku mamy że duża FILE-- wszystko caps-- gwiazdy, pliku. Więc jest to wskaźnik do pliku że mówisz. To jest sposób, w jaki po prostu się do niego. Tak więc w tym przypadku można myśleć o file-- AHA, możemy użyć this-- plik tutaj odnosi się do otwarcia "Hello" i pozwolić, aby to napisać. Publiczność: Czy możemy umieścić "Hello" zamiast [? po prostu?] plik f? GŁOŚNIK 1: Nie, ponieważ "Hello" musi być otwarty i zapisu. File tutaj jest jak oznaczenie, które mówi, OK, mamy mają ten file-- hello-- że patrzymy. Został on otwarty. I mamy zamiar napisać do niego. Jeśli po prostu użyć "Hello", która jest zawarta w nim. Więc to będzie freak out. To znaczy, może nazwali go. Mogłeś zrobić plik, gwiazda, "Hello", odpowiada, że. Ale chodzi o to, że ty Potrzebuję gwiazdy plik wskaźnik w porządku aby móc korzystać z tych funkcji. Publiczność: Czy możesz zrobić plik, gwiazda, plik, "Hello" lub masz do wprowadzenia złożyć gwiazdę, plik przez niego? GŁOŚNIK 1: Mogłabyś nie pliku, gwiazda, "Hello". Możesz to zmienić, aby bez względu na nazwę chcesz. To całkowicie arbitralne co to imię. Możesz nazwać to wszystko. Nazwij go latające spaghetti, jeśli chcesz. Publiczność: Co to jest "w" w cudzysłowie dla? GŁOŚNIK 1: "w" jest tylko tryb. Więc piszemy do tego pliku. Każdy dobry? Jasne? Tak. Publiczność: Tak, kiedy to pisze złożyć, gdzie możemy następnie znaleźć ten plik? GŁOŚNIK 1: To będzie w sam katalog, że jesteś obecnie. Jeśli jesteś w Pset trzy i uruchomieniu tego, w swoim Pset trzy folderu będzie to plik o nazwie "Hello". Cool? Każdy dobry? Czuję, że jesteś wszystkim coraz to, co jest wspaniałe. OK. Więc z powrotem do mojego show-- slajdów Uwielbiam, gdy wszystko działa. OK, pointers-- Czy chłopaki podekscytowany? Wskaźniki są świetne. Biorą trochę owinąć wokół twojej głowie. To jest mój drugi rok wskazówki dydaktyczne. I myślę, że w końcu dostał. Więc jeśli walczyć, to OK. Jak powiedziałem wcześniej, rysunek zdjęcia Pomaga wiele z rzeczy w CS, tak samo jak ja, że ​​ludzie mają tendencję myśleć o, jesteśmy przy komputerze. Powinniśmy tylko kod. Rysunek zdjęcia No-- będzie naprawdę pomóc. I naprawdę zachęcam do dopasować się do swojej strony Kindergärtner i wydobyć kredki lub markery i remis. Bo to pomoże. A jeśli zobaczysz mnie w godzinach pracy, to będzie zabierania stosy papieru z pióra rysunek rzeczy. Tak, zwłaszcza z pointers-- rysować. I jestem pewien, że jesteśmy rzeczywiście będzie być rysunek kilka zdjęć tu. Więc wy wszyscy nam się zobaczyć Binky, to fajna rzecz claymation. I myślę, że to jest naprawdę zabawne, kiedy wybucha na kilka kawałków. To jakiś komiczny dla klasy. C [niesłyszalne] to wielka umiejętność aby móc kontrolować pamięci. I to jest jedna z rzeczy, które naprawdę sprawia, że ​​tak potężny język. Ale z wielką mocą przychodzi wielka odpowiedzialność. I szalone rzeczy mogą się zdarzyć jeśli nie jesteś ostrożny. Więc jeśli używasz wskaźniki, chcesz zrobić upewnij się, że naprawdę zrozumieć dokładnie to, co robisz. Mam nadzieję, że w przyszłym trochę czas pomoże Ci naprawdę zrozumieć wskazówki, jak z nich korzystać, i jak nimi manipulować. Więc memory-- Jestem pewien, mamy widziałem ten schemat. Więc jest to tylko prosty schemat jak rzeczy mogą być przechowywane w pamięci. Więc w zasadzie mają one ogromne tablice bloków jeden bajt jest to, co mamy here-- niewielkie przyrost o jeden za każdym razem. To jest w hex [niesłyszalne] więc osiem-bitowe bloki. I każdy blok jest związane z jakimś adresem szesnastkowym. Więc jeśli kiedykolwiek zobaczyć 0x, że właśnie notating że jest to adres szesnastkowy. Można założyć, oznacza to, jakiś adres w pamięci. Mówimy o adresów pamięci gdy widzisz szesnastkowy. Mamy ints są zmienne, pływaki są zmienne, które przechowują. Więc ints sklepu int. Pływa sklep pływa. Więc mamy także wskaźniki że adresy sklep pamięci. To rodzaj mapowania. Wskaźniki są wyłącznie dla adresów pamięci. Więc to jest jak twój typ tam. Twoje urządzenie jest 32-bitowy, co oznacza, że adres pamięci jest cztery bajty. Tak więc każda wskazówka, że ​​masz również będzie cztery bajty. Albo jeśli to cztery bajty, Pamięć jest cztery bajty. Wskaźniki pamięci sklepu. W związku z tym, że są cztery bajty. Cool-- tylko chcę zwrócić uwagę, że. Powinieneś dostać ten komiks teraz. Nie wiem ilu z was xkcd fanów, ale kocham XKCD. To wspaniałe. Dobrze. Więc tworzenie pointers-- jak powiedziałem, to jest prawie tak jak nic innego. Masz typ. Masz imię. Prawda? To, co mamy tam. [? Hex?] Gwiazda oznacza, że ​​jest to wskaźnik, i co chcesz to nazwać. Więc typ reprezentuje co można zapisać. Wszystko w porządku? W ten sam sposób, że jeśli robimy ints, wiemy, że jesteśmy przechowywania int tam. Ze wskaźnikiem, to posiada adres pamięci. Ale co to znaczy jest that-- oto gdzie rysunek ma się przydać. Tak więc w tym przypadku mamy niektóre value-- powiedzmy cztery. Cztery jest pod adresem jednego. OK? Ta pierwsza oznacza tutaj że jest to wskaźnik 2x. Prawda? To jakiś wskaźnik x. x może być coś, cokolwiek. Cokolwiek x is-- powiedzieć x jest cztery. To będzie przechowywać Adres tu pamięć. Więc int, gwiazda, x-- to niektóre inne gniazdo w memory-- kto wie co to jest. Ale to będzie przechowywać adres tutaj. Więc byłoby to like-- w tym przypadku, niezależnie, przechowywano w 0x1-- co jest przechowywane na adres, że nasz wskaźnik posiada, musi się dopasować co mamy wyznaczony. Tak na 0x1, w tym przypadku, jest to x. To może być tylko int, gdy używamy tego. Podobnie, jeśli mamy inny 1r, niezależnie Adres jest zapisywany z y ma być char-- samo z z. W ten sam sposób, gdy ci spróbować zrobić intx wynosi 0,4, to będzie krzyczeć na siebie i być jak nie, powiedział, że chciał int. To ma być int. Przestań próbować zrobić to pływak. Więc wszystko jest, co chcą być. Niech wszystko będzie się. Tak jest po prostu wielka rzecz niezależnie od typu wskaźnika jest to, że to tylko co można tam przechowywać. OK? Z praktyką, jak w przypadku w zeszłym tygodniu, wszystko Wydaje się, naprawdę rodzaju abstrakcyjne. Mamy zamiar zrobić trochę praktyki. Powinna ona więcej sensu. Więc katalogowanie i dereferencing-- to bardzo ważne, aby te proste. I jeszcze, aby odświeżyć od czasu do czasu. A ja jestem jak czekać, który z nich chcę? Więc ampersand rzeczywiście dać ty odniesienia lub adres. Dlatego zwraca adres w Pamięć, która zmienna jest przechowywana. Więc to będzie rzeczywiście powrócić do Ciebie szesnastkowy, podczas wyłuskania go faktycznie zamiar dać Dane, które są tam zapisywane. OK? Więc mamy zamiar spojrzeć na przykład bardzo szybko, czy rzeczywiście się obok. OK. Więc musimy myśleć naprawdę dokładnie o tym. Mamy tu więc pewną liczbę całkowitą x. Mam zamiar spróbować wyciągnąć ten się najlepiej jak potrafię. Więc będziemy mieć to gniazda x. I to przechowywania pięciu. Jego adres to 0x4. Cool? Wszystko dobrze. Więc teraz mamy ten wskaźnik. To było tutaj. I daje nam ampersand adres coś. Tak więc, w tym przypadku, jest to adres x. Co to jest adres x? 04-- i ten wskaźnik jest na 0x08. Cool? Tak więc można myśleć o tym wskaźnik, 04, tylko wskazuje tutaj. I nazywa się wskaźniki bo jak się bardziej do tego, masz zamiar zobaczyć, wskazując na rzeczy. I jeden, wskazując na inny blok Blok będzie dużo więcej sensu. Więc tutaj są dwa. A potem mamy kilka kopia, która jest what-- 0x0C. I to będzie dereference naszego wskaźnika. Tak więc to, co mówi jest OK, tutaj jest nasz wskaźnik. Jest przechowuje wartość 0x04, a co to mówi się przejść do tego adresu i powiedz mi, co w niej jest. Więc to skutecznie co to strzałka robi. Możesz myśleć o tym jak twoja gwiazda. Więc OK, gdy robimy gwiazdę, oznacza to postępować. Idź na ten adres. I to w zasadzie tylko po strzałka do tego ten fragment pamięci. I daje nam to, co w niej jest, co jest 5. To dlatego nasza kopia jest równe 5. Czy to ma sens? Czy ktoś mnie potrzebuje, aby przejść przez że ponownie lub wolniej? Chcesz, żebym przez to jeszcze raz? OK. Mamy zamiar przerysować go ponownie. Kiedy zaczynamy, wszyscy zgadzają się, mamy jakiś fragment pamięci, że jest zmienna x, że równy 5. Nie kontrolujemy, gdzie to jest w pamięci. Więc to miejsce jest po prostu arbitralnie przypisane. Jest dobry? OK. Następnie zainicjować wskaźnik do int. Dlatego nie jest to dozwolone, aby wskazywał x bo mamy int w tutaj. Mamy kolejny kawałek pamięci, ponieważ wskaźnik ten jest zmienna, tak jak wszystko inne. To arbitralnie przypisano wolną przestrzeń w pamięci. A co przechowuje to adres x. Ampersand oznacza adres x. Więc jaki jest adres x? Publiczność: To zero-- GŁOŚNIK 1: 0x04. Więc then-- ostatni. Znów mamy trochę copy-- tylko kolejna zmienna. Warto więc przypisać jakąś arbitralną miejsce. A my dereference naszego wskaźnika. Gwiazda oznacza iść do Adres zapisany w moim wskaźnika. Powiedz mi, co tam jest. Więc adres przechowywany w naszym wskaźnikiem jest 0x04. Więc idziemy na ten adres. To wskazuje na ten adres. Co znajduje się wewnątrz tego bloku pamięci? To pięć. Więc to, co przypisujemy naszą kopię. Każdy dobry? Fajne. Again-- zdjęcia. Więc śledzenia wartości here-- Jestem pozwolimy myślicie o tym. Możemy wyciągnąć kolejne zdjęcie. Ale chcę, aby spróbować i rozum przez to na własną rękę przez minutę. Ponieważ nie da nam adres przykładem, Jestem po prostu zrobić ampersand x-- które powinny napędzać go do domu. Ampersand oznacza adres. Tak więc w pierwszym, wszyscy przejść z pierwszej linii. Niektóre x zestaw na five-- niektóre losowo gniazdo w pamięci. Int wskaźnik wynosi gwiazda na adres x, prawda? Int wskaźnik tworzy gwiazda ten blok, nazywa to wskaźnik, i przypisuje go na adres x. Jestem okropny w znaków handlowego. Teraz to, co robimy, to mówimy, OK, dereference naszego wskaźnika. Więc idziemy OK, co jest w naszej wskaźnika? To ampersand x. Idź do ampersand x i ich przekazania. Więc teraz, ampersand x będzie 35. Więc w zasadzie, gdy jesteś wyłuskania, idziesz OK. Masz zamiar być rysunek zdjęcia takie jak ten. Masz zamiar być rysunek strzałki ponad gdzie jest. Więc idź do tego gniazda pamięci i albo daj mi tę wartość z powrotem, lub zmienić go. W tym przypadku, ze względu na to, że jesteśmy wartość, jesteśmy przypisanie go być 35. Podczas gdy w ubiegłym jeden, jeśli zauważysz, że co to było przypisanie tutaj do czegoś innego. Więc mają ten wspaniały stół. To nie jest takie złe. Chłopaki nad nim pracować. Mam zamiar wyciągnąć go na pokład. Mamy zamiar wypełnić go razem, OK? Tak zdobędą papieru, chwyć partner rozpocząć pracę. Mam zamiar dostać większy kawałek kredy. Bo to będzie dużo. OK. PROFESOR: OK. Zacznijmy od pierwszego rzędu. Zaczniemy tam, potem chłopaki może może pracować przez kilka innych. OK. równa razy B C więc to, co jest? To nie jest podchwytliwe pytanie, obiecuję. STUDENT: 4 razy 5. PROFESOR: 4 razy 5. 20. Więc co b? STUDENT: 4. PROFESOR: I c? STUDENT: 5. PROFESOR: 5. I wtedy jest to po prostu będzie a, należy handlowe i ampersand b, Znak & c, prawda? Nie jest źle. Jest to dość proste. OK. Więc następnego. Odpowiada to razy c, w przypadku ktoś nie znał tego. Czy wszyscy znają z czasów równa? OK, to jest wszystkie means-- skrótem równa się razy c. Możesz też zrobić to z podziału, z dodatkiem, z odejmowaniem. Możesz zrobić sobie równych, lub równa c plus Oznacza równa się c plus, minus równe c będzie równa się minus c. To jest po prostu cukier syntaktyczny. Tak więc, w tym przypadku jest równa a razy c da nam to, co? Ponownie, nie podchwytliwe pytanie. STUDENT: 100. PROFESOR: 100. Czy coś jeszcze zmienić? Nie. Może w końcu się lepiej w moich znaków handlowego. STUDENT: OK, przepraszam, jak nie masz 100? PROFESOR: OK. Więc jest równa razy c, więc razy c. STUDENT: Och, używasz dla previous-- PROFESOR: Tak. Więc to są nasze ostatnie wartości. Są to, co powinno być stosując jako ruszamy w dół, OK. Tak, jest tylko b zmiana rzecz, prawda? Warto więc wypełnić wszystko. B. Co jest b będzie? Być lub nie być. Więc co to robi? Co to jest gwiazda pa robi? STUDENT: Kod do lokalizacji rocznie. Student: Nie, nie całkiem. Więc to jest odniesienie d. UCZEŃ: Tak b jest ręką wartość pa. PROFESOR: Tak, tak, to pa adres, prawda? Więc to mówi iść do których jest przechowywane i dać mu tę wartość. Więc co to b? STUDENT: 100. PROFESOR: 100. Doskonały. OK, więc komputer jest co się zmienia. Wszystko inne pozostaje takie samo. Co to jest pc będzie? Proste zadanie. Szt wynosi rocznie, a to, co jest pa? STUDENT: Ampersand. PROFESOR: Idealny. Teraz stajemy się interesujący. OK, niech złamać ten jeden w dół. Po pierwsze, co to razy B C, bo to łatwa część tego jednego, prawda? Czasy B c is-- STUDENT: 500. PROFESOR: Tak, tak, Co to jest jeden sposób, Jeśli jest to gwiazda pb, co się zmienia? Student: Co znajduje się w the-- PROFESOR: Co znajduje się w b? Student: Co znajduje się w przestrzeni że pb wskazuje. PROFESOR: A pb wskazuje to-- STUDENT: B. PROFESOR: B. Więc tylko zmiana jest to b, prawo. Tak b razy c, 500. Więc to, co zmienia się teraz. Fajne. Piękny. Chłopaki robią wielkie. Dobrze, łamiąc tym jedną w dół. C zmienia, prawda? Tak więc możemy wypełnić wszystko. Zobaczmy. OK. Wiemy, że C będzie iloczyn dwóch liczb, prawda? Co dwa numery, choć? STUDENT: c? PROFESOR: Tak jest Prawo do pierwszego. Więc my d odwołanie P, prawda? P a punkty do, więc wiemy, że to ma być 100 razy, co? Razy, co robi punkt pc do? Wskazuje. Więc 100 razy 100 jest 10000. Czy to ma sens? Fajne. Odcinek do domu, chłopaki, ostatni wiersz. OK. Co się zmienia tutaj? STUDENT: A. PROFESOR: A Perfect, tak wszystko może pozostać taka sama. OK. A co to jest? Więc jest to czasy, co? Jest to gwiazda pb. Tak gwiazda pb oznacza tutaj PB, PB punkty do b. STUDENT: 500. PROFESOR: 500. Mamy więc 500 razy 100. To 50.000. Uff! Spójrz na to. STUDENT: Dlaczego mamy & c dla last-- PROFESOR: Niestety. STUDENT: Oh, OK. PROFESOR: Moje złe. Dużo piśmie. Każdy dobry? Nie jest tak źle, prawda? Po prostu ma trochę podczas pracy przez. Jeśli rozbicie go, Rozumiesz, co do każdej części odnosi to-- jako ze wszystkiego jest to, yes-- rozbicie go trochę Problemy i rekombinacji, i można zrobić jakieś niesamowite rzeczy. Są to odpowiedzi, ale zrobiliśmy to. Wskaźnik arytmetyka. Ach. Moje ręce są kredowy. Tak więc dodanie lub odjęcie int dostosowuje wskaźnik rozmiarem do rodzaju wskaźnika. Pamiętasz, jak każdy rodzaj ma inny rozmiar? Tak jak podwójne lub long long znaczy osiem i cztery, ale jest int char jest jeden. Więc co chcesz zrobić is-- jedną rzecz, aby pamiętać, to po prostu, ile faktycznie zmienia wartość wskaźnika będzie zależeć typ wskaźnika jest. Wszyscy dobrze się z tym? Czy mogę usunąć go? Jesteśmy dobrzy? Niesamowite. Więc jeśli mamy jakiś wskaźnik that-- to ma być: jestem zamiar zrobić to int wskaźnik. Przechowuje to. Jeśli było powiedzieć, wskaźnik plus jeden, co to będzie zrobić jest to będzie zaktualizować to przez rozmiar int bo to typ wskaźnika jest. Z C, wszystko jest bardzo surowe i regulowany. Int wskaźnik będzie aktualizować przez Ilość miejsca int zajmie. Int jest cztery bajty. Więc co by to przekształcić? Jesteś po prostu dodanie czterech na to. Teraz wskaźnik będzie być: OK. Więc jeśli to był znak i zrobiliśmy wskaźnik plus jeden, co by to było teraz? Jeśli started-- udając my started-- teraz to 0x08. Załóżmy teraz, że to był char wskaźnik, i dodaliśmy jeden. Co trzeba zmienić? Ile bajtów jest znak? Publiczność: Jeden. GŁOŚNIK 1: Jeden. Publiczność: Tak 0x09. GŁOŚNIK 1: Więc to będzie dziewięć. Więc po prostu coś pamiętać. Tuż po dodaniu jednego, to nie jest dodanie jednego, chyba, że ​​to znak. To dodanie ile bajtów typu, że jest, dlatego mają równanie to tutaj. Więc jest to int razy większy od rodzaju wskaźnika. Mamy więc tutaj przykład. y został przypisany do tej wartości, 0x4, kiedy zrobiliśmy y oraz równa się jeden. Co znajduje się w nim, co jest w X, nie zmienia się. Co oznacza zmiana jest co w r. Adres zapisany w r aktualizowane przez cztery ponieważ istnieją cztery bajty w int i jest to int wskaźnik. Dobrze. Więc teraz mamy kolejny ćwiczenia. Więc pytanie, co będzie drukować. Jakieś pomysły? Grupa docelowa: liczba znaki w szczęśliwym kotem? GŁOŚNIK 1: Dokładnie. Tak jak z łańcucha. Czy wszyscy się tego? Czy chcemy, aby przejść przez to? Tak, OK. Więc co mamy here-- I tak o wiele więcej. Nie mam do [Niesłyszalne] śmiesznie. Tak więc mamy tu szczęśliwy ciąg kota. Piękny. Mamy pewne, że licznik mamy śledzenie. Więc mamy trochę wskaźnik char * że po prostu jest równy STR. Co to robi jest to przypisując jakiś wskaźnik na początku swojego łańcucha. Bo jestem pewien, jak to wspomniano w wykładzie Daliśmy wam tego typ danych zwany ciąg. Ale tak naprawdę to tylko łańcuchy Tablica of-- jak char *. Jest to wskaźnik na kilka znaków że są ciągłe w pamięci. Więc to po prostu ustawia go równa dowolny ciąg jest zidentyfikowane przez gdzie jego pierwszy znak jest. Więc to jest jakiś punkt po prostu ustawienie równa początku łańcucha. Wszyscy tam dobrze? Fajne. Więc to jest nasz wyłuskania wskaźnika. Więc to rzeczywiście będzie nam tu jakąś wartość, w naszym ciąg, że mówisz. A my mówimy, o ile to nie jest wartość null terminator. Więc nie poddawać się, aż dojdziesz na końcu łańcucha. Zaktualizuj wskaźnik o jeden. Tak r, to w rzeczywistości jedna aktualizacji za każdym razem, bo to jest znak, char *. Więc to będzie przejść. To będzie zaktualizować. Tak więc po raz pierwszy to działa, to będzie tutaj, w godz. To będzie zaktualizować. To będzie. To będzie p, y, i tak dalej, i tak dalej. Będziemy aktualizować licznik. Gdy dojdzie do końca to, tylko drukuje, jak daleko to zdobyć. Tak. Publiczność: Tak to się liczy Przestrzeń jako jeden, prawda? OK. GŁOŚNIK 1: Pomyśl tak. Czy to question-- PUBLICZNOŚCI: [niesłyszalne]. GŁOŚNIK 1: Nie martw się. Ten to zrobić. W porządku, więc jedna rzecz, zrozumieć, że z tablicy, można również traktować go jako wskaźnik, bo tablice są po prostu ciągłe miejsca pamięci. Więc można traktować w ten sam sposób. Można nimi manipulować ze wskaźnikami, też. Więc zamiast robić, w tym przypadku, analogicznie rzecz będzie tablicą 0 jest równa 1. Ale w ten sam sposób, Ciąg jest określony czasu rozpoczęcia gdzie jego pierwszy znak to, Tablica ustala gdzie jego pierwszym elementem jest. Ponieważ wiemy, że jesteśmy gwarantuje, że te będą ciągłe bloki pamięci. To, co pozwala nam to zrobić. Wiemy, że są ciągłe bloki pamięci. Więc w tym przypadku, przez dereferencji tylko tablica, która mówi nam, OK, przejdź do początku macierzy, która jest tutaj. Tak można określić to równa jeden. I w tym przypadku, bez względu na tablicy Typ jest, gdy go zaktualizować po drugim, to tak jak aktualizację do następnego indeksu. Możesz to zrobić, bo Ciebie wiedzieć, co jest w twojej tablicy. Więc wie, ile aktualizować wskaźnik przez, co do adresu, aby go tak aktualizować że jesteś w następnej szczelinie. Więc jest to tylko inny sposób pisania Tablica 0 jest równa 1, Tablica 1 równa się 2, tablicę Uchwyt 2 równa się trzy. To jest po prostu inny sposób myślenia o nim. Ponieważ są one ciągłe bloki w pamięci, można zwrócić się do nich albo przez tablicy notation-- który osobiście ale może znajdziesz easier-- trzeba go manipulować ściśle adresów pamięci. I to jest sposób, by to zrobić. Niby więcej jak fajne rzeczy można zrobić w porównaniu Może nie jesteś czegoś rzeczywiście zamierza wdrożyć. Używam go w 61. Wy chyba nie trzeba martwić się o nim zbyt wiele. Ale jeśli jesteś zainteresowany, wziąć 61 w przyszłym roku. Jesteśmy w domu facetów rozciągania. Wiem, że to długo. Dynamiczne pamięci Allocation-- więc wiemy, że jeden rzeczy, gdy rozmawialiśmy w czasie nasz pierwszy odcinek razem, patrzyliśmy na swap Funkcja, gdzie to było poza zakres naszej głównej funkcji. I mijaliśmy tych wartości które były skutecznie kopiuje. I po raz zakończeniu wymiany wykonania, to tylko w lewo stos. Pamiętaj, mamy stos ramy dla wymiany. Pozostawia i tych Wartości zostawić z nim. I już ich nie było. Nie mogliśmy nic zrobić z nimi i było nam smutno ponieważ nie możemy zamienić nasze wartości. Ale z C, jak już wspomniałem, ci dużo władzy nad pamięcią. Więc co można zrobić, to można przeznaczyć na stercie rzeczy tutaj że pozostanie tam do powiedz im inaczej. Są jak dobre dzieci. Przebywają tam. Nie pozostawiają. Będą tam do momentu, gdy jak, OK, możesz odejść. Natomiast rzeczy na stosie, who-- są jak niegrzeczne dzieci. Oni po prostu uciec, kiedy chcesz tam być, a następnie ich nie ma. Nie można ich odzyskać. Więc kupa is-- będziemy mówić o malloc i wolne, które Jestem pewien, że chłopaki słyszałem o w wykładzie. I to w zasadzie sposób mieć bardzo trwałe dane. Dzięki czemu można zachować dane wokół tak długo, jak chcesz. Mhm. Publiczność: Czy możesz określić sterty i stosu? Czy są jak miejsca, aby umieścić rzeczy? GŁOŚNIK 1: Więc oni są zasadzie just-- są Sposób, w jaki odnoszą się tylko do pamięci. Więc kupa miejsca, gdzie jest po prostu Pamięć jest przydzielana dynamicznie, podczas gdy stos odnosi więcej ramek stosu że są bardziej centralnym funkcje, które rzeczywiście działają. Tak naprawdę nie mają kontroli. Duża różnica, masz kontrolę na stercie, jeśli chcesz. Masz mniejszą kontrolę nad stosu. Stos zależy Funkcje, które są uruchomione, i kolejność, w jakiej są one uruchomić i jak są zwracane rzeczy. Natomiast z hałdy, jak zobaczymy, można powiedzieć, OK, chcę, aby ta wartość wokół, aż ci powiem inaczej. Nie masz uprawnień, aby się go pozbyć. Nie wolno go zastąpić. Masz zamiar utrzymać ją wokół tak długo, jak ci powiem. Masz być szefem w kupie, natomiast stack-- Może jeśli jak finagle drogę możesz być szefem. Ale nie do końca. I to jest tak naprawdę pamięci. To jest po prostu różne sposoby odnoszenia się do pamięci. Fajne. Więc z tym, jak kontrolować pamięć. To, co z malloc masz zamiar dostać się do wykorzystania. Więc jest to tylko krótki alokacji pamięci. To wszystko to jest. Istnieje kilka innych fajnych Funkcje, które mają Alloc na końcu, i stoją do różnych rzeczy. Więc kiedy trzeba, że ​​potrzebuje pamięci aby przetrwać bieżącą funkcję tak że gdy prąd Funkcja ucieka, nadal masz dane, które dostałem od niego chcesz użyć malloc. Że będzie go zainicjować na stercie. I tak jak powiedziałem i zachować mówiąc, będziesz go trzymać tam dopóki nie powiedzieć to inaczej, co jest ważne tutaj. Więc jedna rzecz zauważyć, i to zazwyczaj bardzo ważne, jest to, że sizeof jest bardzo przydatna w użyciu gdyż w zależności od rodzaju maszyny używasz, może mieć różne ilości z pamięci, że to trwa. Więc zawsze użyć rozmiaru tak że nie jesteś zależny od maszyny, tak, że kod będzie uruchomić w każdym urządzeniu. A to tylko część pisać dobry kod. Jeśli to działa na jednym komputerze, jednak żaden z innymi jak przydatny był program? Więc zawsze chcesz upewnij się, i użyć sizeof. Publiczność: Tak jest, że jak rozmiar 10 cali [niesłyszalne]? GŁOŚNIK 1: Jest to wielkość 10 int. tak. Wielkość wskazówki tak wróci ile ma jeden int podjęcia. Lub wielkość char, jak wiele ma jeden char zabiorą. A potem, jak wiele bloków tego chcesz? Tak więc w tym przypadku chcemy coś że możemy przechowywać 10 ints do. I to będzie działać niezależnie maszyny, która jest cool. Tak jak wiele bajtów będzie że faktycznie daje? Szybkie matematyki. Grupa docelowa: 40. GŁOŚNIK 1: 40. Dokładnie. Tak więc kolejna wielka rzecz. Wskaźnik lub malloc może zwróci null. Więc jeszcze raz, zawsze sprawdź sprawdzić, czy wrócił pusty przed próbą i nic z nim zrobić. Jeśli spróbujesz i nieprawidłowego Teraz ten wskaźnik, to po prostu będzie się wysypać bo poszedł i spróbował dotykać wartość null, gdy nie powinien mieć. Więc zawsze sprawdzić, null. Ponownie, wszystko może zrobić. Może to zwróci null. To będzie powrót null, jeśli jesteś albo z miejsca, albo z jakiegokolwiek powodu pobiegł do jakiegoś błędu pamięci. Czasami po prostu zwraca null. Więc po prostu trzeba sprawdzić to. To wszystko, co mówi ten slajd. A potem to, co mamy tutaj jest wezwaniem do uwolnienia. Tak więc w ten sam sposób, że jeśli otworzyć plik należy zamknąć plik, Jeśli pamięci malloc, ty trzeba zwolnić tej pamięci. I chłopaki dostaną zrobić naprawdę fajne rzeczy. I nie można uruchomić programu, aby zobacz jeśli kiedykolwiek wyciek pamięci. Ale ty nie chcesz do wycieku pamięci. Jest naprawdę źle. Zaledwie bałagan rzeczy. To źle zrobić tak jak programowanie mądry efektywności projektowania. Ale to też tylko rodzaj z szkodliwe dla komputera. Więc po prostu darmowe rzeczy kiedy je malloc. Wy zobaczyć symetrie tutaj. Super proste. Tylko wolne, a następnie bez względu na wskaźnik, bez względu na nazwę wskaźnik jest, i to zatroszczy się o uwolnienie go dla Ciebie. Fajne. Następnie mamy to. Więc jesteśmy po prostu będzie przejść przez ten program. A potem chłopaki są wykonywane. Więc [niesłyszalne] tylko główne. Więc mamy trochę int * wskaźnik. Mamy więc wskaźnik że będzie trzymać ints. A ile ints to będzie trzymać? Tylko jeden. Rozmiar wew. Mamy sprawdzić, czy wskaźnik ma wartość null, ponieważ to to chcemy powiedzieć nie rób nic. To źle. Więc wydrukować jakiś błąd z pamięci, najczęściej powrót 1, jak faceci są przyzwyczajeni. A potem mamy tutaj, że dereference naszego wskaźnika. To oznacza, że ​​będziemy przechowywać coś w miejscu nam dany. Int * pointer lub malloc, zwraca adres, gdzie to ustawić to na bok Pamięć dla Ciebie. Więc to w zasadzie dając like-- jeśli Ciebie myśleć o kilka domy w sąsiedztwie które chcesz umieścić meble w, malloc jest jak OK, masz iść do domu trzy. I to daje ci adres domu trzy. Tak to teraz, to wskaźnik przechowuje adres, przechowuje adres domu. * środki PTR, OK, jestem w moim domu. Fajne. Muszę zdobyć całkowitą. Więc prosisz kogoś dać meble teraz. Więc trochę int. I umieszcza go w swoim wskaźnikiem gdzie to wskazuje. A potem to tylko odbitki się, wprowadzony gdziekolwiek. I znowu odniesienia. Tak to jest, jak to poszedł do zajęcia i zobaczył, co tam było. Cool? I wtedy oczywiście możemy uwolnić nasze wskaźnik. Nie zapomnij, aby uwolnić kursor. Nie zapomnij sprawdzić, null. Nie zapomnij, aby uwolnić kursor. Masz dwie rzeczy, które pamiętam z to, albo że należy pamiętać. Tak. PUBLICZNOŚCI: [niesłyszalne] rzeczy tak, char * s. Jak to nigdy nie uwolnimy te? GŁOŚNIK 1: Hm? Publiczność: Czy tacy jak struny? Mówiłeś, że łańcuchy są jak char * s, prawda? Więc dlaczego nie możemy uwolnić sznurki? GŁOŚNIK 1: tylko Ty się wolne jeśli mallocing. Publiczność: Och, jeśli mallocing. 1 głośnik: Tak malloc i wolne są dwie rzeczy, że należy zawsze mieć ze sobą. f otwarty, f blisko dwie rzeczy należy mieć ze sobą. W obu tych przypadkach należy sprawdzić, null. Tak. Publiczność: Tak jest po prostu wolny pozwalając coś innego być przechowywane tam po program ten stosowany jest? GŁOŚNIK 1: To jest po prostu mówiąc, OK, skończę z tym. Nie musisz trzymać go wokół. W przeciwnym razie komputer będzie Podobnie jak spróbować i trzymać go tam. A potem can't-- działa do problemów z pamięcią. Zawsze chcesz zwolnić, bo mówi komputer, OK, jestem zrobić z tego miejsca pamięci. Możesz mieć go z powrotem dla mnie do wykorzystania później. Cool? Tak. Publiczność: Tak użyliśmy tylko% d bo dwukrotnie wraca, lub dlaczego is-- [niesłyszalne]. Publiczność: Czy można używać% i? GŁOŚNIK 1: Możesz użyć% I. Jakieś ostatnie pytania minut? Śmiało. Publiczność: Mam tylko szybkie pytanie. Więc zmienna ptr, that's-- jak, z int * ptr = malloc, że po prostu mówi, że to wskazując miejsce w memory-- GŁOŚNIK 1: Chcesz [niesłyszalne]? Publiczność: czyli regulują to Wielkość of-- nie, to OK. Ale to tylko wskazuje na miejsce w pamięci, że jest tak jak czterech bajtów. GŁOŚNIK 1: Prawo. Więc malloc rozmiar z int mówi, OK, mam zamiar iść uciekł, znaleźć czterech bajtów pamięci dla Ciebie. Gdy okaże się, że cztery bajtów pamięci, to daje kopię adres gdzie zaczyna, i to, co zapisane w wskaźnika lub ptr. Dobra. Chłopaki wyglądają mniej zdezorientowany niż większość ludzie, kiedy mówię o wskazówki, więc czuję się teraz całkiem dobrze. Dobrze. Jak zawsze, chłopaki powinni mieć wszyscy zdobyć Twoje wyniki pset2 teraz. Wiem, że był jakiś słaby rzeczy, gdzie jest napisane, nie obowiązuje formuła czy coś. Jeśli otrzymujesz, że wszystkie Twoje oceny są ważne po mojej stronie. Więc mogę wysłać screeny swoich klasach. Daj mi znać, jak również, jeśli jesteś brakuje jakichkolwiek ocen, czy coś nie wydaje się mieć sens. Chodź do mnie. Byłem bardzo dumny z Ciebie faceci już tak trzymać. I dobrze resztę tygodnia. Jestem pewien, że widzę niektóre z was w godzinach urzędowania.