>> [MUZYKA GRA]
David J. MALAN: Wszystko w porządku.
Jest CS50, a to jest koniec czwartego tygodnia.
, A jednym z tematów dzisiejszego jest to, że od kryminalistyki cyfrowej,
sztuka odzyskiwania informacji.
I rzeczywiście, chociaż jesteś w środku
teraz Pokoju w trzech i Breakout, w przyszłym tygodniu,
Nacisk zostanie położony na właśnie domeny.
>> Tak więc jeden z najfajniejszych miejsc pracy, jakie kiedykolwiek miał wrócił do studia,
kiedy byłem w pracy na lokalnym Middlesex County prokuratora okręgowego
biuro, robi kryminalistyki pracy.
Więc zasadniczo, Massachusetts Policji Państwowej, przy okazji,
podczas pracy na przypadkach byłoby przynieść rzeczy jak dyski twarde
i dyskietek i karty pamięci i podobne.
A oni je przekazać do mnie i mojego mentora,
a naszym celem było znalezienie dowodów, jeżeli jest jakiś, z tych nośników.
Teraz możesz widziałem przebłyski z tego świata medycyny sądowej
w mediach, telewizji i filmów.
Ale praca nie miałem, i Śmiem twierdzić, że świat,
nie jest całkiem jak chcesz go zobaczyć.
Rzućmy okiem na to, co Prawdopodobnie widziałeś.
[ODTWARZANIE]
-OK.
Teraz zajmijmy się przyjrzeć Ciebie.
>> [MUZYKA GRA]
>> Czekaj go.
Uruchom to z powrotem.
>> Poczekaj chwilkę.
Idź w prawo.
-Tam.
Zamrażać, że.
-full Ekranem.
>> -OK.
Zamrażać, że.
Dokręcić się na tym, dobrze?
>> -vector Się na tym, facet przez tylne koło.
>> -zoom Się tutaj, na tym miejscu.
>> -Z Odpowiedniego sprzętu, obraz może być powiększony i naostrzone.
>> Co to jest?
>> -To Programu poprawy.
>> -Możesz Jasne, że się każdy?
>> Nie wiem.
Niech jej ulepszenie.
>> -Enhance Sekcja A6.
I wzmocniona szczegółów, i--
-Chyba Nie wystarczy zwiększyć.
Zwolnić go do mojego ekranu.
>> -I Wzmocnione odbicie w jej oku.
-Niech Prowadzony przez ten wzmocnienie wideo.
>> -Edgar Można poprawić to?
>> -Hang Dalej.
>> -Nigdy Pracuje w tej refleksji.
>> -Tu Czyjeś odbicie.
>> -Reflection.
-Tu Odbiciem twarzy mężczyzny.
>> -The Refleksji!
-Tu Refleksji.
-zoom Się na lustrze.
Widać odbicie.
>> -Możesz Poprawić wizerunek stąd?
-Możesz Poprawić go?
-Może Możemy poprawić to?
-Możesz Poprawić go?
Czekaj na sekundę.
Będę poprawić.
-zoom Się na drzwiach.
-Times 10.
-zoom.
-move W.
-Więcej.
Poczekaj, zatrzymaj.
Przestań.
-Pause Go.
-Rotate Nam 75 stopni wokół pionowej, proszę.
>> Przestań.
Wrócić do części o drzwi.
>> -Masz Jest wzmacniacz obrazu, który może bitmap?
>> -Może Możemy użyć Pradeep Singh Sposób, aby zobaczyć w oknach.
>> -The Oprogramowania stanie techniki.
>> -The Wartość własna jest wyłączony.
>> -Z Prawa Połączenie algorithms--
>> -On Podjęte oświetlenie algorytmy do następnego poziomu,
i można ich używać do zwiększenia zdjecia.
>> -lock Na i powiększyć osi z.
>> -Enhance.
Wzmocnienia.
-Enhance.
-Freeze I wzmocnienia.
[KONIEC ODTWARZANIE]
David J. MALAN: To są wszystkie słowa, ale nie były one
używane w zdaniach poprawnie.
I rzeczywiście, w przyszłości, za każdym razem, proszę, słyszysz jak ktoś mówi słowo,
"Wzmocnienia", chichot tylko trochę.
Ponieważ przy próbie zwiększenia, na przykład, to jest to, co się dzieje.
>> Więc tutaj jest wspaniałe zdjęcia.
To CS50 własnej Daven.
I załóżmy, że chcemy skupić się na tym błyskiem w oku,
lub odbicie zły facet, który był wyraźnie
rejestrowany przez kamerę bezpieczeństwa.
To jest to, co się dzieje, gdy można powiększyć obraz, który
zawiera tylko skończoną bitów związanych z nim.
>> To jest to, co dostajesz.
I rzeczywiście, jest w oku Daven jest tylko cztery, może sześć pikseli
że komponować dokładnie, co została połyskującymi tam.
Więc Problem Set ostatecznie mają cztery odkrywania tego świata, szczególnie
coś z natury nazywamy plik I / O, w którym
I / O jest tylko fantazyjny sposób mówiąc, wejście i wyjście.
>> Tak więc do tej pory wszystkie interakcje mieliśmy z komputerem
były w dużej mierze z Twojego Klawiatura i ekran,
ale nie tyle z dysku twardego, lub zapisywania plików, poza te, które Ci
samemu napisać.
Twoje dotychczasowe mają programy nie zostały tworzenie i zapisywanie,
i aktualizacji własnych plików.
>> Cóż, to, co znajduje się plik?
Cóż, coś w formacie JPEG.
To jest obraz, który mógłby mają lub przesłać na Facebooku,
lub zobaczyć nigdzie w internecie.
Rzeczywiście, że po prostu zdjęcia Piła z Daven było JPEG.
I co ciekawe o plikach, takich jak JPEG
jest to, że mogą być zidentyfikowane typowo, określonych wzorami bitów.
>> Innymi słowy, to, co jest to, że odróżnia się od GIF JPEG
z PING od słowa dokument z pliku programu Excel?
Cóż, to jest po prostu inna wzorców bitów.
A te są różne wzory Zwykle na początku tych plików.
>> Tak, że gdy komputer otwiera Słowo doc, lub gdy komputer otwiera JPEG,
wygląda typowo Pierwsze kilka bitów w pliku.
I jeżeli uzna, wzór, mówi, oh, to jest obraz.
Pozwól, aby go wyświetlić użytkownika jako grafika.
Lub, o, to wygląda jak Word doc.
Pokażę go do użytkownika jako eseju.
>> Tak na przykład, JPEG, Okazuje się, że są
dość skomplikowane pod wyciągiem.
Ale pierwsze trzy bajty w większości każdy JPEG są z trzech cyfr.
Tak więc bajt zero, jedna lub dwie, są w Najbardziej każdy JPEG, 255, a następnie numer
216, następnie numer 255.
>> A co będzie można zacząć robić w przyszłym tygodniu
faktycznie grzebie pod jak kaptur z plików JPEG
i jak pliki bitmap, a widząc co zawsze było tam tak długo,
jak byli przy użyciu komputera.
>> Ale co tam, nie jest zazwyczaj napisane jak liczb dziesiętnych, takich jak ten.
Informatycy nie wydają się mówić po przecinku.
Tak naprawdę nie mówią w formacie binarnym.
Zazwyczaj, gdy chcemy do wyrażania liczb,
faktycznie korzystać szesnastkowym które można przywołać
od, powiedzmy, Problem Set Jeden, który zakwestionował
można pomyśleć o innym systemie.
>> My, oczywiście, zna z przecinku, od zera do dziewięciu.
Rozmawialiśmy o binarnym.
I tak naprawdę nie ma w użyciu, że dużo tutaj
na na zewnątrz, ponieważ komputery użyć.
Ale programiści bardzo Często, choć nie zawsze
używać szesnastkowy, co oznacza po prostu masz 16 liter w alfabecie,
w przeciwieństwie do dwóch lub 10.
>> Więc jak można liczyć na wyższe niż dziewięciu w systemie szesnastkowym?
Udać 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, tylko przez konwencję.
Ale co to jest to, że każdy klucz z nich jest pojedynczy symbol.
Nie ma 10.
Nie ma 11 per se, ponieważ każde swoich cyfr, tak jak w systemie dziesiętnym
i tak jak w binarnym, należy po prostu być pojedynczym znakiem, zgodnie z konwencją.
>> Tak, że to jest alfabet mamy do naszej dyspozycji w systemie szesnastkowym.
Więc co, jeśli wygląda JPEG ciebie było napisać z trzech pierwszych
nie bajtów jako przecinku, ale na przykład, w systemie szesnastkowym?
Hex i dlaczego jest przydatna nawet wszystko, co?
>> Cóż, szybkie spojrzenie na przykład.
Więc jeśli piszę z bitów, które stanowią te numbers-- dziesiętną
to może być trochę zardzewiały teraz od kilku tygodni z powrotem,
ale lewa i prawy są dość łatwe.
255 było najwięcej my może stanowić z ośmiu bitów.
To wszystko było z nich.
Więc to jest tylko jeden lekko interesujący jest środkowy.
A jeśli rodzaj zrobić z matematyka, można wywnioskować, że rzeczywiście
że wzór jednego i Zera reprezentuje 216.
Więc po prostu stanowią dla teraz, że są one poprawne.
Ale dlaczego jest to interesujące?
>> Cóż, bajt, oczywiście, jest osiem bitów.
I okazuje się, że jeśli myślisz bajtu jako dwa kawałki czterech bitów,
tak.
Dodajmy jeszcze trochę miejsca.
Tak przed, po.
Właśnie dodałem jakieś białe znaki na litość wizualizacyjnego tutaj.
Jak możemy teraz reprezentować w, powiedzmy, szesnastkowy każdy quad bitów,
każdy zestaw czterech bitów?
>> Tak na przykład w lewej teraz mamy 1111 w formacie binarnym.
Co to jest liczba w systemie dziesiętnym, jeśli nie z matematyki?
Masz miejsce wielofunkcyjne, miejsce dwójki, miejsce czwórki, a miejsce ósemki.
>> PUBLICZNOŚCI: 15.
David J. MALAN: To 15.
Więc jeśli mamy osiem plus cztery plus dwa plus jeden, mamy 15.
Więc mogłem napisać 15 poniżej 1111, ale cały sens tutaj
jest w systemie szesnastkowym, nie dziesiętnym.
Więc zamiast pisać w dół 15, 1-5, Mam zamiar napisać, że w hex,
które, jeśli uważasz, że z powrotem, jeśli masz zera do f, co 15 będzie?
PUBLICZNOŚCI: f.
David J. MALAN: Okazuje się, że to f.
I można pracować, że od stwierdzenia, oraz, jeśli jest 10 to OK f 15.
Tak więc w rzeczywistości, może przepisać ten sam zestaw liczb jak f.
A potem, jeśli zrobić trochę matematyki, my wywnioskować, że to d.
Osiem jest dość łatwe, bo mają jeden w miejscu ósemki.
A następnie, mamy jeszcze kilka f jest.
>> Więc to, co ludzie mają tendencję do zrobienia umownie kiedy używać szesnastkowy jest po prostu
piszę to trochę bardziej zwięźle, pozbyć się większości tego białej przestrzeni.
I po prostu być bardzo jasne, czytelnicy, że jest to w systemie szesnastkowym
Konwencja między prostą ludzi jest pisać zera
x, która ma znaczenie inne niż wizualny identyfikator,
tutaj jest liczba hex.
>> A potem, można umieścić dwie cyfry, f f w tym przypadku, po czym d, po czym f.
Więc krótko mówiąc, szesnastkowy tylko dąży
są użyteczne, ponieważ każdy z jej cyfry, zera do f, doskonale linie
się wzorem czterech bitów.
>> Więc jeśli masz dwie cyfry szesnastkowe, zerowej do F, znowu i znowu,
że daje doskonale osiem bitów lub jeden bajt.
To dlatego, że ma tendencję do być powszechnie użyteczne.
Nie ma intelektualnej Zawartość naprawdę poza tym,
inne niż jego rzeczywistej użyteczności.
>> Teraz JPEG nie są tylko formatów plików graficznych.
Może pamiętacie, że istnieją plików jak to w świecie,
co najmniej od kilku lat wstecz.
>> Więc to było naprawdę zainstalowany w systemie Windows XP
na milionach komputerów na całym świecie.
I był to plik z obrazkiem, BMP.
I plik mapy bitowej, jak zobaczysz następny tygodniu, po prostu oznacza, wzór kropek,
pikseli, jak są one nazywane, mapy na bitach, naprawdę.
>> Tak więc to, co jest interesujące, choć, o tym formacie, BMP, jest
że pod maską, to ma więcej niż tylko trzy bajty
które tworzą jego nagłówek, więc mówić, pierwsze kilka ugryzień.
To faktycznie wygląda trochę skomplikowane na pierwszy rzut oka.
A zobaczysz, to w zbiorze P.
I zaczyna coś zwłaszcza z tym teraz
nie jest tak ważne, ponieważ tylko fakt że na początku każdego bitmapy
plik, w formacie graficznym, istnieje cała masa liczb.
>> Teraz Microsoft, Autor tego formatu,
zmierza nazwać tych, Rzeczy nie ints i znaki
i pływaków, ale słowa i d słowa i tęskni i bajty.
Więc są tylko różne typy danych.
Są różne nazwy do tej samej rzeczy.
Ale zobaczysz, że w P ustawić cztery.
>> Jest to jednak tylko powiedzieć, że w przypadku człowieka podwójnie kliknie jakiś plik na swoim .BMP
lub jej twardy dysk, i otwiera się okno w górę pokazując mu, że obraz,
to się stało, bo w eksploatacji System nie tylko zapewne zauważyłeś
Rozszerzenie pliku BMP w nazwie pliku,
ale także fakt, że jest jakiś Konwencja na wzór bitów
na początku tego pliku mapy bitowej.
>> Ale skupmy się teraz na takie skomplikowane plik,
lecz na czymś takim.
Załóżmy, że tutaj w gedit, ja Wystarczy początki
programu, który jest bardzo prosty.
Mam niektóre obejmuje do góry.
Teraz mam # include "structs.h", ale Wrócę do tego za chwilę.
Ale to jest przydatne do teraz.
Więc jest to program , że zamierza wdrożyć
jak bazy danych stanu cywilnego.
Więc baza studentów, i każdy uczeń w świecie
ma nazwę i dom i prawdopodobnie niektóre inne rzeczy, ale my keep it simple.
Każdy student ma swoje imię i dom.
>> Więc jeśli chciałem napisać Program, którego celem w życiu
tylko do iteracji od zero, do trzech,
jeśli jest trzech studentów na Uniwersytecie Harvarda.
A ja po prostu chcę, aby uzyskać, stosując getString, Nazwa każdego studenta i dom,
a potem po prostu wydrukować te z.
>> To jest coś jak Tygodnia Jeden, Tydzień Dwa rzeczy teraz,
gdzie chcę tylko dla pętli lub coś w tym stylu.
I chcę zadzwonić kilka getString razy, a następnie wydrukować f kilka razy.
Więc jak mogę to zrobić, chociaż, gdy zarówno nazwa i dom
zaangażowane są dla każdego ucznia?
>> Więc mój pierwszy instynkt mógłby się zrobić coś takiego.
I może najpierw powiedzieć, dobrze, daj mi, powiedzieć, tablicę łańcuchów zwanych nazwy.
I nie chcę tu hardcode trzy.
Co chcę, aby tam umieścić?
Tak studentów, bo to po prostu Stała zadeklarowane na górze
tak nie mam hardcode trzech w wielu miejscach.
W ten sposób można zmienić go o jedno miejsce, i wpływa na zmianę wszędzie.
A następnie, może to zrobić Ciąg mieści studentów.
>> A teraz, może zrobić coś jak for (int i = 0; i <studentów; i ++.
Więc piszę szybko, ale jest to prawdopodobnie zna składni teraz.
>> A teraz, to było bardziej aktualne.
Jeśli chcę, aby umieścić w i-tej nazwisko studenta, myślę, że mogę to zrobić.
A potem, nie nazwy ale domy wspornik i.
Robię to, getString, i niech mi wrócić i naprawić tę linię.
Zgadzam się?
Nie zgadza?
To nie jest bardzo łatwy w obsłudze.
Nie powiedziałem użytkownika, co zrobić.
>> Ale teraz, jeśli ja też chciał później, niech
powiedzmy, wydrukować te rzeczy out-- tak TODO później.
Mam zamiar zrobić więcej To-- to prawdopodobnie jest
Prawidłowe stosowanie się nazwiska i domy, trzy
ich suma każda z użytkownikiem.
>> Ale nie jest to bardzo dobry projekt, prawda?
Co zrobić, jeśli student ma nie tylko nazwę i dom, ale również numer identyfikacyjny,
i numer telefonu, i adres e-mail,
a może strona główna i może uchwyt Twitter,
Dowolna liczba innych szczegółów związane z student lub osoba,
bardziej ogólnie.
W jaki sposób zaczynamy dodawać Funkcjonalność tego programu?
>> Cóż, czuję się jak w najprostszy sposób mógłby być coś jak, powiedzmy,
int IDS studentów.
Więc mogę umieścić wszystkie swoje identyfikatory tam.
A następnie, za coś jak numery telefonów,
Nie jestem pewien, jak stanowią, że jeszcze.
Więc śmiało i po prostu zadzwoń to twitters studentów, które
Jest to trochę dziwne, ale-- i kilka więcej pól.
>> Zacząłem skutecznie skopiować i wkleić tutaj.
I to będzie całkiem rosnąć nieporęczny dość szybko, prawda?
Czy nie byłoby miło, gdyby nie było w świecie znana struktura danych
nie jako int lub ciąg, ale coś wyższy poziom, abstrakcja, więc
mówić, znany jako student?
C nie pochodzą z wbudowanym Funkcjonalność dla studentów,
Ale co, jeśli chciałem dać to taki?
>> Cóż, okazuje się, zamierzam otwórz plik o nazwie structs.h tutaj,
i można zrobić dokładnie to.
I mamy zamiar zacząć robić to teraz.
A pod maską P ustawić trzy, już robią to teraz.
Nie ma czegoś takiego jak g rect lub g owalne w języku programowania C.
>> Ludzie w Stanford realizowane te typy danych przy użyciu tej metody tutaj,
deklarując swoje własne nowe dane Typy z wykorzystaniem nowego słowa kluczowego
nazywa struct a inny jeden nazywa typedef.
I rzeczywiście, chociaż składni wygląda trochę inaczej od rzeczy
widzieliśmy już wcześniej, w Zasada, że ​​to bardzo proste.
>> To po prostu oznacza "określić typ."
Że będzie Konstrukcja i struktura
jest jak pojemnik do wielu rzeczy.
I że struktura będzie mieć ciąg o nazwie nazwa,
i ciąg zwany dom.
I nazwijmy, po prostu dla wygody, cała ta struktura danych studentów.
>> Tak więc w chwili, gdy się do średnik, masz teraz
stworzył własne dane Typ nazywa uczeń
że teraz stoi obok int, i pływak, i char i ciąg znaków,
oraz g dacji i g owalny, a każdy numer z innymi ludzie wymyślili.
>> Więc co jest przydatne na ten temat teraz jest to, że jeśli wrócę
do struct 0 i skończyć Wdrożenie, które napisałem
z góry tutaj zauważyć, że wszystkie z nieuniknionym, że niechlujstwa
miał rozpocząć się dzieje jak dodałem numery telefonów i Twitters i wszystko
te inne rzeczy do Definicja ucznia,
teraz to zwięźle opakowane w jednym szeregu studentów.
>> I każdy z tych studentów, teraz ma wiele rzeczy w jej wnętrzu.
Tak, że po prostu pozostawia jedno pytanie.
Jak masz na imię, i dom, i ID,
i co tam jeszcze jest wewnątrz studenta?
Bardzo prosty, jak również.
Nowa składnia, ale prosty pomysł.
>> Po prostu wskaźnik do tablicy, jak my w zeszłym tygodniu i to.
A co wyraźnie nowy kawałek składni?
Po prostu., Co oznacza "do środka Struktura i nazywa się pole
Nazwa, uzyskać pole o nazwie dom, się pole o nazwie Student ".
>> Więc w P ustawić trzy, jeśli jesteś nadal pracuje na tym,
i większość ludzi nadal są, uświadomić sobie, że jak ty
rozpocząć korzystanie z rzeczy, jak g rects i G owale
i inne rzeczy, które wydają się nie pochodzą z Tygodnia zero, jeden lub dwa,
sobie sprawę, że to dlatego, że Stanford ogłosił kilka nowych typów danych.
>> I rzeczywiście, to jest dokładnie to, co będzie zrobić, jak również, w P ustawić cztery, kiedy
zaczynamy zajmować się rzeczami takich jak obrazy, mapy bitowe i więcej.
Więc to tylko zapowiedź i Model psychicznego, co ma nadejść.
Teraz zwlekał nieco tego ranka.
Byłam trochę ciekawi, co tapety Microsoft faktycznie
wygląda dzisiaj.
I okazuje się, kogo w 2006 roku rzeczywiście udał się do prawie dokładnie
samo miejsce, aby fotografować w rzeczywistości wygląda na to, że to, co w dzisiejszych czasach.
Pole jest teraz trochę zarośnięty.
>> Więc mówiąc już o obrazach, niech przywróci Daven tutaj
na ekranie i Mikołaja, i po prostu przypomnieć,
że jeśli chcesz dołączyć do nas na obiad w piątek, szef do naszej zwykłej URL
tutaj.
>> Więc skąd wyjeżdżamy się w poniedziałek?
Wprowadziliśmy ten problem, prawda?
To był pozornie poprawne Realizacja transakcji swap,
w którym bierzesz dwa ints, jeden nazywa, jeden o nazwie b,
zamienić je, tak jak Laura nie tutaj na etapie z mleka, wody,
stosując chwilowy zmienna, lub pusty kubek,
tak, że możemy umieścić B w i a W b bez bałaganu rzeczy.
Użyliśmy zmiennej.
To się nazywa Temp.
>> Ale to, co było podstawowym Problem z tym kodem w poniedziałek?
Co tu chodzi?
Tak.
>> PUBLICZNOŚCI: To zajmuje więcej miejsca.
>> David J. MALAN: Staje się bardziej miejsca, ponieważ używam zmiennej,
i to jest OK.
To prawda, ale jestem powie, że jest OK.
To jest tylko 32 bitów w Wielkim schemat rzeczy, więc nic wielkiego.
Inne myśli?
PUBLICZNOŚCI: tylko on zamienia zmienne lokalnie.
David J. MALAN: Dokładnie.
To zamienia zmienne tylko lokalnie.
Ponieważ za każdym razem wywołać function-- kiedy miałem tace z Annenberg
Ostatni raz, masz głównym na dole.
Jak tylko wywołać funkcję o nazwie Swap, Swap nie dostać x i y,
oryginalne wartości.
Co robi wymiany GET, nie twierdzimy?
WIDOWNI: Kopie.
David J. MALAN: Więc odpisów.
Tak więc staje się to raz i dwa, gdy przywołać przykład z ostatniego czasu,
ale kopia jednego i dwóch które są z powodzeniem zamienione.
Ale niestety w końcu, Wartości te pozostają takie same.
Tak więc widzimy, to z naszego nowy przyjaciel, miejmy nadzieję, GDB,
że ty lub TFS i CA mają było prowadzenie kierunku w następujący sposób.
>> Więc nie ma przypomnieć wymiany niech wygląda jak-- otworzyć To-- patrzy tak.
Mamy zainicjowany x do jednego, y do dwóch.
Miał kilka print f jest.
Ale potem, klawisz połączenia tutaj był do wymiany, które
jest dokładnie to kod Właśnie widziałem przed chwilą.
Co jest prawdziwe w pierwszym rzut oka, ale funkcjonalnie,
program ten nie działa, bo nie trwale zamienić x i y.
>> Zobaczmy więc, to, szybkie ciepło tu z GDB, a ./noswap.
A kilka informacji, że zdecydowaną Ja pozbyć się sterowania L teraz.
A teraz, mam zamiar iść dalej i uruchomić go.
I niestety, że Nie było to użyteczne.
To prowadził program wewnątrz tego Program o nazwie GDB debugger,
ale nie pozwól mi grzebać.
>> Więc w jaki sposób można rzeczywiście wstrzymać wykonanie wewnątrz tego programu?
Więc złamać.
I mogłem przerwać na dowolnym Numer linii, jedna, 10, 15.
Ale mogę też złamać symbolicznie mówiąc przerwa main.
I to się dzieje, aby ustawić przerwę punkt, najwyraźniej w wierszu 16 w głównym.
I gdzie jest linia 16?
Chodźmy do kodu i przejdź do noswap.
I rzeczywiście, linia 16 jest Pierwszy program.
>> Więc teraz, jeśli pójdę do przodu i typ uruchomić ten czas, Enter, wstrzymania.
Warto więc rozglądamy.
Wydrukuj x-- dlaczego x zera?
I zignorować znak dolara.
To tylko dla hodowców korzystanie z danego programu.
Dlaczego x zera w tej chwili?
Tak.
>> PUBLICZNOŚCI: To zatrzymał tuż przed linia 16, a nie w rzeczywistości on line 16.
David J. MALAN: Dokładnie.
GDB, domyślnie jest wstrzymane wykonanie tuż przed linią 16.
Więc to nie jest wykonywane, co Oznacza X jest z jakiejś nieznanej wartości.
I mieliśmy szczęście, że jest to coś czyste jak zero.
Więc teraz, jeśli napiszę następny, teraz jest wykonywane 16.
To na mnie czeka, aby wykonać 17.
Pozwólcie mi iść do przodu i drukuj x.
To jeden.
Pozwólcie mi iść do przodu i drukuj y.
Co mam teraz zobaczyć?
>> PUBLICZNOŚCI: [niesłyszalne]
>> David J. MALAN: trochę głośniej.
>> PUBLICZNOŚCI: [niesłyszalne]
David J. MALAN: Nie dość konsensus.
Więc tak, widzimy jakąś wartość śmieci.
Teraz, y nie jest 134514064.
Cóż, to tylko niektóre wartości śmieci.
Mój program używa pamięci RAM do innych celów.
Nie ma inne funkcje.
Inni ludzie napisali w moim komputerze.
Tak więc te bity są wykorzystywane do inne wartości, i co widzę
to pozostałości niektórych przed korzystanie z tej pamięci.
>> Więc nic wielkiego, bo tak szybko jak wpisać obok, a następnie wydrukować y,
to jest inicjowane wartości, które chcę.
Więc teraz, idziemy do przodu trochę szybciej.
N na następny.
Zróbmy to jeszcze raz.
Ale ja nie chcę trafić to tutaj, ponieważ jeśli
chcesz zobaczyć, co się dzieje w z wymiany, co jest polecenia?
>> PUBLICZNOŚCI: kroki.
>> David J. MALAN: kroki.
Tak to mi się kroki funkcja, a nie nad nim.
A teraz, to trochę tajemnicze szczerze mówiąc, ale to jest po prostu
mówi mi, że jestem w linii 33 już teraz.
I zróbmy to jeszcze raz.
Temperatura print.
Wartość śmieci, tym razem negatywny, ale to tylko jeszcze wartość śmieci.
Więc zróbmy następny, drukowania Temp.
Jest to inicjowane 1, co była wartość x, vel.
>> Teraz, gdzie są nasze, a X pochodzi?
Cóż, zawiadomienia w głównym, mamy zwany te wartości x i y.
Następnie przekazał je zamienić w następujący sposób.
X był pierwszy, przecinek y.
A następnie, wymiany może zadzwonić do nich x i y.
Ale dla jasności, to nazywając je i b.
Ale i B są teraz będzie kopii z X i Y, odpowiednio.
>> Tak więc, jeśli wrócę do GDB, temperatura jest obecnie jednym i jest obecnie jednym.
Ale jeśli to zrobię następny i teraz zrobić odcisk , został już przeniesiony na.
Mleka rozlana jest w byłym szkła soku pomarańczowego, albo na odwrót.
>> A jeśli teraz zrobić ponownie, a teraz jeśli wydrukować jako test dla pewności
jest nadal dwa, ale B jest obecnie jednym.
Szczerze mówiąc, to jeszcze nie.
Nie obchodzi mnie to, co temperatura jest.
Ale jak tylko się wpisać, powiedzmy, nadal wrócić, teraz jestem na końcu
Program.
Niestety, x oznacza liczbę jeszcze jeden, a y jest jeszcze dwa.
>> Tak więc to, co było tam użyteczność GDB?
Nie pomogło mi rozwiązać Problem per se
ale mam nadzieję, że mi pomoże rozumiem, realizując
że tak, moja logika jest w porządku, ale mój kod nie jest ostatecznie konieczności
trwały wpływ.
Tak, to jest problem, że jesteśmy będzie teraz rozwiązuje dziś.
>> Ale niech się tam w drodze to.
Ciąg jest kłamstwem.
To też nie typ danych że istnieje w C. To
synonimem dla niektórych Czas na coś innego,
i pokazują, że można w sposób następujący.
>> Pozwólcie mi iść do przodu i otworzyć Program o nazwie porównać-0.
I zamiast wpisać ten jeden, zaczniemy chodzić po kodzie
Ja już napisałem, ale to tylko kilka linijek.
Więc to jest porównanie-0.
I pierwszą rzeczą, którą robię jest coraz linię tekstu.
>> Nie zauważyć, co mam ten po raz pierwszy.
Czym różni się wyraźnie o linii 21?
Właściwie, chwileczkę.
To jest kopia dwa.
To nie jest nawet odpowiedni program.
Dobrze, spoiler alert.
Wszystko w porządku, więc nie przeszkadza mi to.
To jest odpowiedź na pytanie o przyszłość.
>> Tutaj jest porównanie-0, a ja jestem o do linii tekstu.
Program jest o wiele prostsze.
Więc to jest bardzo proste.
To jest jak Week One Week Dwie rzeczy w tym momencie. String s = GetString.
Teraz powiem to jeszcze raz tutaj.
ciąg t = GetString.
A potem, to ostatnia rzecz, w Program, jak sama nazwa wskazuje,
to mam zamiar spróbować je porównać.
>> Więc jeśli s, pierwszy ciąg, równa = t, to ja jestem
powie wpisać samo.
Indziej, mam zamiar powiedzieć wpisać różne rzeczy.
Warto więc skompilować i uruchomić ten program.
Tak, aby porównać zero.
Wygląda dobrze.
Żadnych błędów kompilacji.
>> Pozwólcie mi iść do przodu teraz i wpisz ./compare-0.
Pozwól mi iść dalej i powiedzieć coś : Daven i coś: Rob.
I wpisać różne rzeczy.
Tak daleko, tak dobrze.
Program wydaje się być poprawne.
>> Ale niech go uruchomić ponownie.
Powiedz coś: Gabe.
Wszystko w porządku.
Może trafić spacji lub coś odjazdowe.
Zróbmy to jeszcze raz.
Więc Zamyla.
Zamyla.
Różne rzeczy.
Więc co się dzieje?
>> Tak więc mamy te dwie linie Kod, GetString miano dwukrotnie.
A następnie, po prostu jestem próbuje porównać S i T.
Ale to, co naprawdę wtedy się dzieje?
Cóż, o moje pismo do zarżnąć ten przykład nieco.
I niech rzeczywiście rzucić to się tutaj, jak również.
>> Mamy więc linię String s = GetString.
Więc to po prostu pierwszy ciekawy wiersz z tego programu.
Ale co to wszystko razem było dzieje się pod maską?
Cóż, na lewej stronie strony jest ciąg, który jest jakiś rodzaj zmiennej
i to się nazywa s.
Tak, wiem, że to jest za pomocą pamięci, lub w pamięci RAM, w moim komputerze w jakiś sposób.
Więc idę do abstrakcyjnie narysować, że jako kwadrat.
32 bity, okazuje się, ale więcej na ten temat w przyszłości.
A potem, co się dzieje tutaj?
>> Cóż, getString oczywiście dostaje ciąg od użytkownika.
I GetString dostał Zamyla lub Gabe lub Daven.
Warto więc wybrać pierwszy z tych, który był Daven.
Tak skutecznie, co GetString dostał ja w tym pierwszym przypadku było D-v-e-n.
A potem, co jeszcze nie to daj mi w tajemnicy?
PUBLICZNOŚCI: [niesłyszalne]
David J. MALAN: Tak, charakter / 0 lub wartość null.
Tak skutecznie dał mi łańcuch.
Ale my już wiemy z poprzedniego wygląda, że ​​łańcuch jest tylko tablica
znaków, i to zakończone to znak specjalny wartownik, / 0.
>> Jednak, jeśli jest to prawdą i jest kwadratowy
to jest wyraźnie znacznie większy prostokąt.
I rzeczywiście, jest to, Twierdzę, tylko 32 bitów.
I jest to wyraźnie więcej niż 32 bitów, ponieważ jest to prawdopodobnie
osiem Plus osiem Plus osiem Plus osiem Plus osiem,
tylko dlatego bajtów w kodzie ASCII.
Jak do cholery mamy zamiar zmieścić Daven w tym małym pudełku tutaj?
>> Cóż, co się faktycznie robi getString?
Cóż, to oznacza siatka tutaj pamięci lub pamięci RAM mojego komputera.
Warto więc arbitralnie powiedzieć, że jeśli każdy z nich reprezentuje bajt
wtedy możemy myśleć o sobie Bajt jako mający adresu
jak Oxford Street, 33 lub 34 Oxford Street, lub 35 Oxford Street.
>> Tak jak domy mają adresy i budynki mają adresy,
tak jak poszczególne bajty pamięci mają adresy lub numery
, które jednoznacznie identyfikują je.
Teraz, to jest dowolna.
Ale keep it simple, zamierzam używać szesnastkowy tylko umownie
ale 0x oznacza nic innego, niż "to szesnastkowy."
i zamierzam twierdzić, że "D", kończy się na jednym bajcie w pamięci.
>> Nie mam nic innego dzieje się w pamięci, więc Daven dostał pierwsze miejsce
w Byte One.
To, to, to będzie 0x2.
To będzie 0x3.
To będzie 0x4.
To będzie 0x5.
To będzie 0x6.
>> Ale gdy już zacząć myśleć o tym, co robi komputera
pod maską, możesz zacząć wnioskować
jak ci, kilka lat temu, byłoby wdrożyły C siebie.
Co to jest GetString prawdopodobnie returning-- bo to
czuje się jak to nie jest powrót Daven, per se,
bo on na pewno nie będzie aby zmieścić się w tym małym box--
więc to, co jest GetString prawdopodobnie powrocie?
>> PUBLICZNOŚCI: [niesłyszalne]
>> David J. MALAN: lokalizacja Daven.
I to robi to odkąd Week One.
Co GetString jest naprawdę powrocie nie jest ciągiem znaków, per se.
To jeden z tych małych białych kłamstw.
To powrót adres ciąg w pamięci, unikalny adres.
Daven mieszka w 33 Oxford Street.
Ale bardziej zwięźle, Gavin żyje w 0x1, adres numer jeden.
>> Więc to, co zostanie umieszczone w tym małe pole to, aby być jasne,
jest tylko adres tego łańcucha.
Więc cały ten czas, to się działo.
Ale to, co wskazuje na to to, że w przypadku wszystkich s
jest liczba jej wnętrzu, które jest się zatrzymać, programista,
od wprowadzenie dowolnej liczby w dowolna zmienna i po prostu skacze
w tym fragmencie pamięci?
I rzeczywiście, zobaczymy to zagrożenie następnym razem.
>> Ale teraz, to czuje się niewystarczające.
Jeśli powiem, żeby mnie ciąg, dasz mi Daven.
Ale tak naprawdę nie dał mi Daven.
Wszystko, co mi daje to adres Daven za.
Jak mam to wiedzieć na pewno, gdzie Daven zaczyna i ends--
historia jest coraz weird-- gdzie Daven zaczyna się i kończy,
, a następnie obok ciąg w pamięci zaczyna?
>> Cóż, jeśli przekazanie mnie początek Daven,
w istocie, nie wiem, w jaki sposób gdzie koniec jego imię jest?
Że specjalny znak null, które Jest to tym bardziej ważne teraz
jeśli struny pod spodem identyfikowane są po prostu kaptur
jednoznacznie o ich lokalizacji w pamięci.
Więc cały ten czas, to to, co się dzieje.
>> Więc teraz, gdy patrzymy na kod tutaj wyjaśnić
jeśli byłoby błąd w linii 26.
Dlaczego Zamyla i Zamyla inaczej?
Dlaczego Gabe i Gabe inaczej?
Tak, w plecy.
>> PUBLICZNOŚCI: Mają różne adresy.
>> David J. MALAN: Po prostu dlatego, mają różne adresy.
Ponieważ kiedy zadzwonić getString ponownie, co zrobię szybko tutaj,
czy to jest druga linia, łańcuch t, tak jak ja w tym programie,
równa się kolejne połączenie do getString.
Następnym razem zadzwonię GetString, zamierzam
aby uzyskać inny kawałek pamięci.
>> GetString jest dozwolone zwrócić się do eksploatacji
System więcej i więcej pamięci.
To nie będzie ponownie wykorzystać ten sam sześć bajtów każdym razem.
Zapowiada się nowy fragment pamięci, który
Oznacza t dostanie inna wartość tutaj.
>> Więc kiedy ja s wynosi = t, nie jesteś porównując
D przed tym i przed ta i V przed tym.
Porównując ten pan wobec tego, który
szczerze mówiąc jest dość useful-- useless-- jest bezużyteczny, bo kto naprawdę
obchodzi, gdzie łańcuchy są w pamięci?
>> I rzeczywiście, nie mamy.
A my nie będziemy rozpocząć szczególnie opiekuńczy.
Tylko w takim zakresie, że mogą pojawić się błędy i zagrożenia bezpieczeństwa mogą wynikać woli
możemy zacząć się martwić o to.
Warto więc rozwiązać ten problem.
Okazuje się to naprawić bardzo prosto.
>> I niech faktycznie, przed I ujawniają, że znowu, co by
zrobić, jeśli w klasie CS50, i trzeba było wdrożyć
porównanie z dwóch ciągów.
Wyraźnie nie można po prostu użyć s wynosi = t.
Ale tak logicznie, jak chcesz porównać ten ciąg
wobec tego łańcucha przy użyciu kodu w C?
Tak.
>> PUBLICZNOŚCI: Rób do pętli [niesłyszalne]
David J. MALAN: Perfect.
PUBLICZNOŚCI: [niesłyszalne]
David J. MALAN: Tak.
Wystarczy użyć do pętli lub podczas pętli lub cokolwiek.
Ale po prostu stosować podstawową ideę, że jeśli jest to fragment pamięci lub tablicy
a to, iteracyjnego zarówno w tym samym czasie.
I po prostu porównać liter.
>> I masz być trochę uważać, bo
nie chcę jeden palec przejść obok innych
ponieważ jeden ciąg jest dłuższa niż druga.
Więc będziesz chciał sprawdzić wartość ta na koniec, null.
Ale to naprawdę jest, w Koniec jako proste.
I szczerze mówiąc, nie potrzebujemy na nowo, że koło.
Oto wersja Two.
I co mam zamiar powiedzieć, jest to, że Zamiast porównywania s oznacza = t,
Ja, zamiast powiedzieć, jeśli ciąg Porównanie s przecinkami t równa się = 0.
Teraz, co jest ciąg porównać?
>> Okazuje się, że jest to funkcja, która pochodzi z C, którego celem w życiu
jest porównanie dwóch ciągów.
I mieszać porównać, jeśli czytamy jego Strona mężczyzna lub dokumentacji lub CS50
odniesienia, to będzie po prostu powiedzieć, że zamieszanie
porównać zyski albo negatywne ilość lub liczbę dodatnią lub zero
gdzie zero oznacza, że ​​są równe.
>> Więc po prostu domysły.
Co to może oznaczać, jeśli mieszać porównania zyski
wartość ujemna lub dodatnia wartość?
PUBLICZNOŚCI: Większe lub mniejsze niż.
David J. MALAN: Tak, większa lub mniejsza niż.
Więc jeśli chcesz, aby posortować całość pęczek strun w dictionary--
jak to w końcu w dół road-- idealna funkcja do wykorzystania potencjalnie,
bo to będzie zrobić Porównanie ciągów dla Ciebie, i powiedz
Państwo nie jest przed b, lub nie b przyjść przed alfabetycznie.
Możemy zrobić dokładnie to.
>> I zauważyć, zrobiłem jeden inny rzecz w tym przykładzie.
Co jeszcze się zmieniło wyższe w tym główną funkcją?
Char *.
I to jest to, że inne białe kłamstwo.
Przez cały ten czas, gdy masz pisze ciąg,
my zostały potajemnie przepisywanie ciąg jako char *, tak że faktycznie clang
rozumie cię.
>> Innymi słowy, CS50.h i jak my w końcu zobaczyć,
zrobiliśmy synonimów zwany ciąg to samo co char *.
A teraz, wiem tylko, że * W związku z tym co najmniej
oznacza adres.
>> Adres, co?
Cóż, fakt, że powiedziałem char *, int * a nie lub float *,
Oznacza to, że char * adres char.
Więc ta mała skrzynka tutaj, aka ciąg, jest naprawdę typu char *,
która jest po prostu fantazyjny sposób na powiedzenie, w tym polu będzie adres.
I co to adres odnosi się do?
Najwyraźniej, char.
>> Ale mogliśmy absolutnie mają int * i inne rzeczy.
Ale teraz, char * jest naprawdę najbardziej proste i jedna z odsetkami.
Więc ten problem będzie wzrasta, jednak ponownie.
>> Załóżmy, że mam otworzyć ten program.
Zobaczymy czy teraz możemy przewidzieć co jest nie tak z tym kodem.
Tak więc w tym programie, copy-0, jestem zamiar iść do przodu i ponownie wywołać
GetString i zapisać wartość w sekundach.
>> A następnie, po co ja to robię, tylko jako przypomnienie od tygodni przeszłości?
Zrobiliśmy powiedzieć, że getString czasami zwraca null.
Co to oznacza, jeśli GetString zwraca null?
Coś poszło nie tak.
To prawdopodobnie oznacza ciąg jest zbyt duży, z komputera z pamięci.
Zdarza się, Super, Super, Super rzadko, ale może się zdarzyć.
Chcemy sprawdzić, za to, i to wszystko robimy.
>> Bo zobaczymy teraz, jeśli nie rozpocząć sprawdzanie zwykle rzeczy
jak null, to polubisz zacząć iść
do adresów w pamięci, że są nieważne.
I masz zamiar rozpocząć indukcji coraz więcej błędów segmentacji.
Lub w komputerze Mac lub PC, po prostu powoduje, że komputer zawiesić
lub program do zamrożenia, potencjalnie.
>> Więc teraz, twierdzą w kopiowaniem 0.c, że I Zamierzam skopiować te sznurki w drodze
linii 28.
A potem, będę zastrz na dnie
tutaj, że będę zmiana jednej z nich.
>> Więc to zauważyć.
Dzwonię do naszego starego przyjaciela strlen.
I po prostu wyjaśnić w języku angielskim Co robi ta linia 34?
Co t wspornik 0 stanowią na lewo.
Tak.
>> PUBLICZNOŚCI: Pierwszy charakter t?
David J. MALAN: pierwszy znak t.
To jest to.
Pierwszy znak t, chcę przypisać wersję wielką
pierwszego znaku w t.
Więc to jest czerpanie Pierwsza litera.
A potem, bardzo ostatnio co robię W tym programie jest Twierdzę tutaj
Oryginalny, s, i tu jest kopia, t.
>> Ale na podstawie tej historii po prostu powiedział o tym, co naprawdę są łańcuchy,
to, co jest naprawdę linia 28 robi, a to, co jest
Otrzymany błąd będzie się na ekranie?
>> Więc po pierwsze, pierwsze pytanie, 28.
Co to jest ciąg t = s naprawdę robi?
Jeśli mamy na lewej ręki łańcuch boczny tutaj t = s;
że daje mi jedno pole tu i tu jedno pole.
I przypuszczam, ten adres jest 0x, powiedzmy, 50 to czas, w sposób arbitralny.
Co ciąg t = s zrobić pod maską?
>> PUBLICZNOŚCI: [niesłyszalne]
>> David J. MALAN: Przechowuje pamięć zajęcia tam, więc 0x50 idzie.
Więc jeśli teraz pójdę do pierwszego charakter i wielkie litery w t go,
Co mam robić, aby skutecznie s?
Jestem naprawdę robi to samo, prawda?
Bo jeśli Adres 0x50-- i po prostu, ja nie ma wiele miejsca na płycie tutaj,
ale zakładamy, że to tu jest 0x50, gdzieś w pamięci mojego komputera.
>> I ja, na przykład, Gabe w małe litery o, tak.
I powiedziałem t wspornik 0 zostanie aktywowane.
Cóż, t 0 jest wspornik pierwsza litera t.
Tak mało g będzie się wielkim G. Ale problem
jest, co to s również wskazać?
>> PUBLICZNOŚCI: sam.
>> David J. MALAN: samo dokładne.
Tak proste wyjaśnienie być może, nawet jeśli składnia jest trochę dziwne.
Więc zróbmy to.
Dodać kopię-0, a następnie ./copy-0.
Powiedz coś: Gabe.
Niestety, obie nich zostały już aktywowane,
ale fakt, że u Dlatego, że jesteśmy po prostu
teraz do czynienia z adresami.
>> Więc jak zacząć address-- gra słów nie intended--
jak mamy zacząć zajęcia ten konkretny problem?
Cóż, w copy1.c, wszystko idzie się trochę bardziej skomplikowane.
Ale chciałbym ubiegać koncepcyjnie proste rozwiązanie.
>> Tak trudno dostać na pierwszy rzut oka.
Nie będzie to łatwe dla pierwszego Czas wpisaniu go, być może,
ale jeśli problem jest to, że po prostu robi t = s tylko
kopiuje adres, co, ponownie, jeśli mogę wybrać się na ciebie,
będzie rozwiązaniem w rzeczywistości kopiujesz ciąg?
>> PUBLICZNOŚCI: Będziemy prawdopodobnie ponownie użyć pętli.
>> David J. MALAN: Tak.
Więc będziemy potrzebować jeszcze pętlę.
I dlatego, jeśli chcemy skopiować łańcuch s do innego łańcucha,
prawdopodobnie chcesz to zrobić znak po znaku.
Ale problemem jest to, czy to pierwotnie s,
Teraz musimy zacząć wyraźnie przydzielania pamięci dla t.
>> Innymi słowy, niech przerysować to po raz ostatni.
Jeśli jest to String s = GetString.
I postawmy to tutaj, jak również.
To GetString.
, A następnie obraz czegoś tak dzieje się tak jak wcześniej,
g-B-E / 0.
To wygląda trochę coś takiego.
I s dlatego nazywamy to 0x50, i że będzie to 51, 52.
>> Więc jest to 0x50.
A potem, mam ciąg t.
W pamięci, że to po prostu będzie daj mi trochę plac takiego.
Więc co jest teraz kluczowym krokiem?
Jeśli chcę skopiować s do t, co puste nie musimy wypełnić tutaj?
Albo, co jest nam potrzebne do zrobić na wysokim poziomie?
Tak?
Ktoś?
Tak.
>> PUBLICZNOŚCI: Musimy [niesłyszalne].
David J. MALAN: Tak, należy wypełnić w tym puste.
Nie mogę skopiować, a następnie wykorzystać nazwę Gabe'a
dopóki nie zwróci się do systemu operacyjnego na innym fragmencie pamięci
to jest co najmniej tak duża, jak w oryginale.
Tak, że pozostawia nas z pytaniem.
>> Jak mogę zwrócić się do systemu operacyjnego nie tylko na prosty mały pointer--
jak to się nazywa, adres, nie pointer--
prostego małego pudełka tak zwany ciąg?
Jak mogę zwrócić się do eksploatacji System na dużą ilość pamięci?
Jak dotąd, stałam tylko, że z powrotem pośrednio przez wywołanie getString.
Więc jak jest getString nawet uzyskanie jego pamięć?
>> Cóż, okazuje się, że nie ma ta druga funkcja tutaj
że będziemy teraz zacząć używać.
Teraz wygląda to o wiele bardziej tajemniczy niż: a ja jestem jedynym, który widzi to--
ta linia wygląda o wiele bardziej tajemnicze to powinno na pierwszy rzut oka.
Ale niech drażnić go od siebie.
>> Z lewej strony, mam char * t.
Tak, w języku angielskim, zacznijmy sformułować właściwe zdania w żargonie technicznym.
Więc to jest przydzielenie zmienna typu char * nazywa t.
Teraz, co to naprawdę oznacza?
>> Cóż, to znaczy, co mam umieścić w tej zmiennej o nazwie t?
Adres char.
Tak, że po prostu prostsze, bardziej rozsądny sposób
opisywania lewą stronę.
Tak, że tworzy to pole tylko tutaj.
Tak, po prawej stronie, przypuszczalnie będzie
przyznanie, że większe fragment pamięci, jak?
Warto więc drażnić to od siebie.
>> To przytłaczające na pierwszy rzut oka, ale co się dzieje wewnątrz tutaj?
Po pierwsze, nie malloc, która widocznie nasz nowy przyjaciel,
"Pamięć przeznaczyć."
Więc to jest argumentem były przekazywane do niego, więc jest to dość duży argumentem.
Warto więc drażnić to od siebie.
>> strlen S oczywiście oznacza do--
PUBLICZNOŚCI: liczba znaków.
David J. MALAN: Tak liczba znaków w S.
Więc długość s, przy ciąg.
Tak więc G-b-e.
Więc to chyba cztery w tej sprawie.
Dlaczego to robię 1 po dzwoniąc strlen z s?
PUBLICZNOŚCI: [niesłyszalne]
David J. MALAN: W tym specjalny znak NULL.
Jeśli pytasz mnie, co jest długość Nazwa Gabe, mam zamiar powiedzieć cztery.
Pod maską, choć muszę że piąty bajt na znak null.
Więc dlatego robię ten 1.
>> Teraz tylko w przypadku, gdy są uruchomione w tym Program na komputerze innym niż, powiedzmy,
Urządzenie CS50, gdzie wielkość char
może być różny z własnego computer--
Okazuje się, że mogę nazwać sizeof operator, wystarczy zwrócić się do komputera,
jaki jest rozmiar char na tym komputerze?
>> I przez pomnożenie pięciu w tym Przykład wielkością, która char
na większości komputerów będzie być tylko jeden, malloc
zamierza przeznaczyć dla mnie wielkim fragment pamięci tutaj po prawej stronie.
I to będzie return-- jest function-- więc
zamierza powrócić do mnie, co?
PUBLICZNOŚCI: adres?
David J. MALAN: adres co?
PUBLICZNOŚCI: pamięci jest przydzielona?
David J. MALAN: Z pamięci jest przydzielona.
Tak więc nie mam pojęcia, szczerze mówiąc, gdzie to będzie skończyć.
Zamierzam zaproponować to się skończyć na 0x88.
Całkowicie arbitralne, ale gdzieś indziej niż 0x50,
Ponieważ system operacyjny, Windows i Mac OS nie dla mnie, to
upewnij się, że to daje mi różne kawałki pamięci RAM.
>> Tak to jest, gdy ta wartość fragment pamięci może skończyć.
Więc to jest to, co kończy się tutaj, 0x88.
Więc teraz wyraźnie, rozumiem że nie jest taki sam jak ten,
bo oni wskazując na różne fragmenty pamięci.
Więc jeśli teraz faktycznie chcą skopiować ten w, zróbmy swoje proponowane rozwiązanie.
>> Chodźmy, tworzenie pętli, i do t uchwyt i dostaje y wspornik i.
Bo teraz mogę korzystać Ta tablica jak zapis,
bo chociaż bardzo się przydzielić ogólnie alokuje mi pamięć,
Pamięć jest tylko ciągłych bajtów.
Bajt, bajt, bajt, z powrotem do tyłu na plecach.
>> Mogę z pewnością jako programista traktować ją jako tablicę, która
oznacza, że ​​mogę korzystać z tego w końcu zna oznaczenie tylko niektórych nawiasach kwadratowych.
>> Więc pozwól mi zatrzymać tam, bo jest wiele jednocześnie, nawet
choć idea, aby podsumować jest to, że ciąg, przez cały ten czas,
Nie jest to nowy typ danych per se.
To jest po prostu tak zwany wskaźnik, adres postaci,
które po prostu oznacza, że ​​jest to liczba konwencji, które przez ludzi
staramy się pisać jak 0x coś.
>> Ale to tylko liczba, jak 33 Oxford Street,
co zdarza się Adres CS budynku.
Wszelkie pytania dotyczące tych informacji?
Tak?
>> PUBLICZNOŚCI: Dlaczego nie możemy sprawdzić dla t równym NULL?
>> David J. MALAN: Dlaczego my sprawdzić t równym NULL?
Jeśli czytamy documentation-- wielki question-- dla malloc,
to się mówi w drobnym drukiem, czasami malloc może zwrócić null,
jak getString.
I rzeczywiście, GetString zwraca null jeśli z kolei malloc zwraca null,
bo GetString używa malloc.
>> I że może się zdarzyć, jeśli system operacyjny, Mac OS, Windows, co jest po prostu
z pamięci dla Ciebie.
Więc to, co tam się stało.
>> I niech mi ujawnić jedną rzecz , że może po prostu cios umysłu
lub całkowicie znajdować się zbyt daleko na linii.
Ale pozwól mi wyciągnąć sama dla pętli do kopiowania,
które przed chwilą, było przywołanie tego. t uchwyt i dostaje y wspornik i.
>> Ładny i łatwy w obsłudze.
Czuję się jak w drugim tygodniu ponownie.
Ale to faktycznie może być w wersji zapisane jako ten, który wygląda tajemniczo.
Jest to technika zwana wskaźnik arytmetyka, adres arytmetyka.
Ale dlaczego to działa?
>> Teraz irytująco, Autorzy postanowili wykorzystać C
* symbol dla różnych celów.
Widzieliśmy kiedyś już raz, char *, co oznacza "daj mi zmienną
że będzie zawierać adres char ".
Tak char * w tym kontekście oznacza "daj mi zmiennej."
>> Niestety, w przypadku korzystania z * bez Słowo przed nim, jak char,
to teraz nazywa Operator nieprawidłowego.
I zobaczymy więcej tego niebawem.
Ale to tylko oznacza "tam".
To tak jakby powiedzieć, jeśli ktoś mi podał na kartce papieru "33 Oxford Street"
jeśli to zrobię "* 33 Oxford Street", to oznacza, "Iść w dół ulicy do budynku ZS."
>> Tak * tylko tam, jeżeli środki Słowo nie ma przed nim.
Tak więc to, co jest t, aby być jasne?
t oznacza adres fragmencie pamięci, która została podana do mnie.
s oznacza adres co do jasności, na przykład byliśmy dyskusji,
z małymi Gabe?
s oznacza adres of--
PUBLICZNOŚCI: ciąg.
David J. MALAN: oryginalnej nazwy Gabe'a.
Więc jest to adres ten fragment pamięci.
Więc jeśli powiem, t + Ja--, informacja, jest po prostu nasz stary znajomy.
To jest po prostu zmienna indeksu który jest iteracji od zera na górę
długości łańcucha s.
Więc to będzie zero, jeden, potem dwa, potem trzy, potem cztery.
Warto więc zebrać te nowe Scratch-jak kawałki układanki, jeśli chcesz,
chociaż znowu składni jest o wiele bardziej ezoteryczne niż Scratch.
Tak t jest adres + i ma dać mi
Liczba, ponieważ są one Numery, które byliśmy rysunek jako hex.
Ale są tylko liczby.
>> Tak więc, jeśli adres t stwierdziliśmy był 0x88, co 0x88 Plus zero.
Nawet jeśli nie jesteś wygodny z jeszcze hex, zgadywać.
>> PUBLICZNOŚCI: oryginalna.
>> David J. MALAN: Nadal 0x88.
Więc co * 0x88 oznacza?
Oznacza to, "tam", co oznacza, skutecznie, "Podnieś tutaj swój palec."
Teraz po stronie prawej to wyrażenie, * a następnie w parens,
e + i oznaczają S, który jest zająć się tutaj małego g.
a + 0 jest oczywiście, s, co wynosi:.
>> Więc teraz, to * S, które podobnie jak * 33 Oxford Street oznacza go na adres
y.
Więc tutaj jest to palec, prawa ręka.
Więc co ja mam skopiować do czego?
Rzeczą na prawo, które jest Gabe, trochę g tutaj, pod tutaj.
>> Tak więc, że efekt Pierwsza iteracja pętli
, jak zaproponowano, chociaż wygląda szalony bardziej skomplikowane niż cokolwiek
widzieliśmy już wcześniej, jest po prostu, kliknij tutaj i skopiuj ten znak tutaj.
To daje mapę do obu miejsc.
>> I zobaczymy o wiele więcej o tym.
Ale teraz, jest tylko nadzieja wprowadzenie niektórych z tych podstawowych pojęć.
I rzeczywiście, przyjrzyjmy jeden ostateczny program, tutaj,
a następnie obiecał claymation, który będzie wszystko w porządku.
Wszystko w porządku.
Więc pozwól mi otworzyć up-- tam idziemy.
Więc mi-- wrócimy na tym zdjęciu przed długo.
Pozwól mi otworzyć ten ostatni przykład tutaj.
>> Więc tutaj jest bardzo, bardzo program, który realizuje
nic w życiu, które wykonuje następujące czynności.
To pierwszy deklaruje dwie zmienne x i Y, które nie są liczbami tym razem
per se.
Oni nie są liczbami całkowitymi, per se.
Są podobno int *.
Więc po prostu ktoś, co to znaczy Jeśli typem danych, zmienna,
jest typu int * gwiazdkowy?
To adres int.
>> Tak więc nie mam pojęcia, gdzie jest jeszcze.
To po prostu oznacza "umieścić, w końcu, adres int tutaj. "
0x50, 0x88, wszędzie tam, gdzie jest to w pamięci, adres jest tam.
I to jest to, co y jest Będzie, jak również.
>> Jeśli teraz powiedzieć, x = malloc (sizeof (int)), to fantazyjny sposób na powiedzenie,
hej systemu operacyjnego, poprzez malloc, dał mi wystarczająco dużo pamięci do wielkości
z int, który jest prawdopodobnie będzie 32 bity lub cztery bajty.
>> Więc co malloc powrócić?
Malloc zwraca adres.
Więc co się dzieje, aby przechowywać w X?
Adres fragmencie pamięci, cztery bajty, że malloc
po prostu znaleźć dla mnie, prosząc system operacyjny.
>> Teraz zaś, linia cztery tutaj, * x = 42.
Wystarczy być jasne, co się dzieje na dole?
Na lewej stronie, * x.
że jest jak * 33 Oxford Street.
Tak * x oznacza co?
>> PUBLICZNOŚCI: Idź do.
>> David J. MALAN: Idź do tego adresu.
Gdziekolwiek, że fragment pamięci, przejdź do niego.
I umieścić to, co tam, oczywiście?
PUBLICZNOŚCI: 42.
David J. MALAN: 42.
Wszystko w porządku, * y, sam pomysł.
Idź do adresu w Y.
Umieścić numer 13 tam, y, ale to, co jest w tej chwili?
PUBLICZNOŚCI: Nie ma pamięci dla y.
David J. MALAN: Nie ma pamięć y.
Więc co robi y prawdopodobnie zawiera, jak już mówi?
>> PUBLICZNOŚCI: Garbage.
>> David J. MALAN: Niektóre wartości śmieci.
Teraz stosunek śmieci wciąż liczbą.
To może jeszcze być mylone z adresem.
To tak, jakby ktoś nabazgrał coś w dół,
i błędnie zinterpretował to w ten sposób, część budynku na ulicy.
A jeśli po prostu spróbować, aby przejść do część budynku nie właścicielem,
lub jakiś fragment pamięci nie ma dano, złe rzeczy mogą się zdarzyć.
Komputer może się zawiesić, lub inne nieokreślone zachowanie może się zdarzyć.
>> Tak intro, a następnie, do Binky to.
Pamiętam jeszcze, 20 niektóre parę lat później,
gdzie jestem, kiedy w końcu rozumieć wskaźniki.
>> To znaczy, jeśli zostawić tutaj trzy minuty
i myślę, że nie zrozumieć wskaźniki, realizować
I pamiętać o 20 lat dla jakiegoś szalonego powodu
kiedy i dlaczego ostatecznie zatopiony w składzie mojego nauczania
kolega, Nishat Mehta w widok od Eliot jadalni.
Teraz, mam pamiętać to dlatego, że to był
jednym z tematów I, w szczególności, walczył z.
A następnie, w końcu kliknął, Ośmielam się powiedzieć, jak wiele tematów
w końcu będzie.
A teraz, aby czuć, że wszystko szczęśliwsi i bardziej przekonujące,
rzućmy okiem na nasz ostateczny Ostatnie trzy minuty, tu w Binky
od naszego przyjaciela, Nicka Parlante od Stanford.
>> [ODTWARZANIE]
>> Hej, Binky.
Obudź się!
To jest czas dla wskaźnika zabawy.
>> Co to jest?
Dowiedz się o wskazówki?
Och, cukierek!
>> Cóż, aby zacząć, myślę, że jesteśmy będzie trzeba kilka wskazówek.
>> -OK.
Ten kod przydziela dwa wskaźniki, które mogą wskazywać na liczby całkowite.
-OK.
Cóż, widzę dwa wskaźniki, ale nie wydają się być skierowane do niczego.
>> -To Prawo.
Początkowo, wskaźniki nie wskazują na nic.
Rzeczy, które wskazują na nazywane są pointees i ich ustanowieniem-tych
oddzielny stopień.
>> Och, tak, tak.
Wiedziałem o tym.
W pointees są oddzielne.
Er, tak jak można przeznaczyć wskazywany?
>> -OK.
Cóż, ten kod przydziela Nowy wskazywany całkowitą,
i to zestawy części X punkt do niego.
>> Hej, to wygląda lepiej.
Więc należy coś zrobić.
>> -OK.
Będę nieprawidłowego wskaźnika x do zapisać numer 42 w jego wskazywany.
Do tej sztuczki, będę potrzebował mój Różdżka z wyłuskania.
>> -Twoja Różdżka z dereferencji?
That-- to świetnie.
>> -To Co kod wygląda.
Ja po prostu ustawić liczbę i [POP]
>> Hej, spójrz.
Nie idzie.
>> Więc robi dereference na x następująco strzałki, aby uzyskać dostęp do jego wskazywany.
W tym przypadku, sklep 42 tam.
Hej, spróbuj go zapisać numer 13 do drugiego wskaźnika y.
>> -OK.
Ja po prostu przejść do y, i uzyskać numer 13 ustawienia.
A następnie podjąć różdżki Wyłuskania i tylko [BUZZ]
>> Och!
>> Oh, hej!
Że nie działa.
Powiedzieć, Binky, nie sądzę dereferencji y jest dobry pomysł, bo wiesz,
konfigurowania wskazywany jest oddzielny etap.
I nie sądzę, że kiedykolwiek to zrobił.
>> Dobry punkt.
Tak.
Mamy przyznane na wskaźnik y, ale nie ustawić go zwrócić do wskazywany.
>> -Bardzo spostrzegawczy.
Hej, szukasz dobrze tam, Binky.
Można go naprawić, więc Y punktów do tej samej wskazywany jako X?
>> Jasne.
Użyję Różdżka z wskaźnikiem zadania.
>> -is, Że będzie Problem jak wcześniej?
Nie.
Nie dotykać pointees.
To tylko jeden wskaźnik do zmiany wskazują na to samo, co innego.
>> Och, widzę.
Teraz y wskazuje na tym samym miejscu co X.
Więc czekać.
Obecnie, y jest ustalone.
Ma wskazywany.
Więc można spróbować różdżki Dereferencji ponownie wysłać 13 goli.
>> Uh, OK.
Tu idzie. [POP]
>> Hej, spójrz na to.
Teraz prace nad wyłuskania y.
A ponieważ wskaźniki dzielą że jednym wskazywany, oboje zobaczyć 13.
Tak.
Udostępnianie, cokolwiek.
Więc my teraz zamienić się miejscami teraz?
>> Och, spójrz.
Nie mamy czasu.
>> -But--
>> Po prostu pamiętaj, trzy zasady wskaźnika.
Numer Jeden, podstawowa struktura jest to, że masz wskaźnik,
i zwraca się do wskazywany.
Ale wskaźnik i wskazywany są oddzielne,
i częsty błąd jest utworzenie wskaźnika,
ale zapomnij dać mu wskazywany.
>> Numer Dwa, wskaźnik dereferencji rozpoczyna się na wskaźniku
i następuje jego strzałkę nad aby uzyskać dostęp do jego wskazywany.
Jak wszyscy wiemy, w tym działa tylko wtedy, gdy istnieje
wskazywany, jakiego rodzaju wraca z art Number One.
>> Numer trzy, wskaźnik Przypisanie przyjmuje jeden wskaźnik
i zmienia go zwrócić do sam wskazywany jako inny wskaźnik.
Więc po cesji, dwa wskaźniki
będzie wskazywać na ten sam wskazywany.
Czasami to się nazywa dzielenie.
I to wszystko, co jest do tego, naprawdę.
Żegnaj teraz.
[KONIEC ODTWARZANIE]
David J. MALAN: To jest to dla CS50.
Będziemy zobaczenia w przyszłym tygodniu.