DAVID MALAN: Hello, a Witamy z powrotem do CS50. Więc to jest koniec tygodnia cztery. Tylko jedna zapowiedź pierwsza. Tak więc tak zwane piątym to poniedziałek nadchodzące przyszły poniedziałek. Jest to okazja, aby zmienić SAT / UNSAT do klasy list, lub grade list SAT / UNSAT. Irytująco, że proces nie wymaga podpis, bo trzeba wypełnić obecnie jednym z tych różowych Dodaj / spadek formy. Ponieważ technicznie, SAT / UNSAT wersja i wersja grade list mają różne numery katalogowe. Ale nic wielkiego. Wystarczy przyjść do mnie lub do Roba lub Laurena w dowolnym punkcie. Lub napisz do nas, jeśli nie masz tego rodzaju formalności potrzebne dzisiaj, a my będzie z pewnością pomoże Ci podjąć opieka, że ​​przed poniedziałkiem. Dobrze, więc dzisiaj - faktycznie, jest trochę echo. Czy możemy tone mnie trochę? OK. Więc dzisiaj wprowadzamy temat znany jako wskaźniki. I muszę przyznać, że jest to jeden z bardziej złożonych tematów, które mają tendencję do pokrycie w tej klasie, czy naprawdę każdy kurs wprowadzający, który wykorzystuje C. Ale wierz mi na słowo, zwłaszcza w sytuacji Jeśli twój umysł czuje się nieco więcej wygięte dziś iw nadchodzących tygodniach. To nie jest przedstawiciel otrzymujesz gorzej na tym to po prostu oznacza, że to jest szczególnie wyrafinowany temat Obiecuję, że na kilka tygodni Stąd może wydawać się zbyt efektownie prosta w retrospekcji. Pamiętam do dziś. Ja siedziałem w Elliott Dining Hall, siedzi obok mojego TF Nishat Mehta, który był mieszkańcem Elliott domu. I z jakiegoś powodu, ta temat klika. To znaczy, że ja też walczyli z nim przez jakiś czas, ale będzie co w mojej mocy, aby pomóc uniknąć takich Walka z tematu, który ostatecznie jest dość silny. W rzeczywistości, jednym z tematów omówimy w najbliższych tygodniach jest to, że bezpieczeństwa, i jak można rzeczywiście eksploatować maszyny w sposób, , które nie zostały przeznaczone. A te wyzysk są zazwyczaj wynikiem błędów, pomyłek, które ludzie robią, nie rozumiejąc niektórych z realizacji bazowego szczegóły poprzez które programy są wykonane. Teraz, aby ta wydaje się tym bardziej użytkownik przyjazny, myślałem, że gram 10 Druga zapowiedź trochę claymation postać o imieniu Binky który został przywieziony do życia przez naszego przyjaciela w Stanford, Profesor Nick Parlante. Więc pozwól mi dać ci to teaser Binky tutaj. [PLAYBACK VIDEO] -Hej, Binky. Obudź się. Czas na zabawę wskaźnika. -Co to jest? Dowiedz się o wskazówki? Oh, jare. [END PLAYBACK VIDEO] DAVID MALAN: To Stanford informatyka. Tak bardziej na tym, by przyjść. [APPLAUSE] DAVID MALAN: Niestety, Nick. Tak więc przypomnieć, że ostatnim razem skończyło się na to naprawdę ekscytujące cliffhanger przy czym funkcja ta po prostu nie działa. Przynajmniej intuicyjnie czułem jak to powinno działać. Wystarczy zamiana wartości dwóch liczb całkowitych. Ale pamiętam, że gdy drukowane oryginalne wartości w jedną i głównego dwa, byli jeszcze jeden i dwa, a nie dwa i jeden. Więc pozwól mi faktycznie przełączyć powyżej do urządzenia. A ja napisałem kawałek kodu w szkieletowych przejść tutaj, gdzie twierdzą, że x będzie 1, Y będzie 2. I następnie wydrukować zarówno ich wartości z F druku. I potem ubiegać się tu, że mamy zamiar zamienić je. Zostawiłem puste miejsce tutaj dla nas wypełnić dzisiaj za chwilę. Następnie zamierzam twierdzić, że dwie zmienne zostały zamienione. Potem idę do druku je ponownie. A więc mam nadzieję, że powinienem zobaczyć, 1, 2. 2, 1. To jest bardzo proste, Celem teraz. Więc jak go o zamianę dwie zmienne? Cóż, jeśli proponuję tutaj, że te kubki może reprezentować pamięci w komputerze. To jest kilka ukąszeń, to jest jeszcze kilka ukąszeń. Mogliśmy wolontariusz Chodź i mieszać nam kilka drinków, jeśli zna? Chodź na górę. Jak masz na imię? JESS: Jess. DAVID MALAN: Jess? Chodź, Jess. Jeśli nie masz nic przeciwko, musimy umieścić Google Szkło na ciebie więc możemy uwiecznić to. OK, szkło. Nagrywanie wideo. I OK, jesteśmy dobrze pójść z Jess tutaj. Dobrze. Miło Pana poznać. Więc to, co chcę robić tutaj - jeśli można, bardzo szybko - po prostu wylewa się z nami pół szklanki pomarańczy sok i pół szklanki mleka, reprezentujący skutecznie numery 1 w jednej filiżance i 2 w drugiej filiżance. To będzie dobry materiał. JESS: Sorry. DAVID MALAN: Nie, nie. To jest OK. Miło. Dobrze, więc mamy cztery bajty warto soku pomarańczowego. My nazwaliśmy to wartość 1. Teraz kolejne cztery bajty o wartości mleka. Czy nazwać to wartość 2. Więc x i y, odpowiednio. Dobrze, więc teraz, jeśli zadanie pod ręką - dla Ciebie, Jess, przed wszystkim z kolegami - jest, aby zamienić wartości x i y takie że chcemy sok pomarańczowy w inne cup i mleko w filiżance, jak może ty - zanim faktycznie to - za to zabrać? OK, mądra decyzja. Więc trzeba nieco więcej pamięci. Warto więc przydzielić tymczasowy puchar, jeśli będzie. A teraz przystąpić do wymiany x i y. Excellent. Więc bardzo dobrze zrobione. Dziękuję bardzo, Jess. Proszę. Mały upominek. OK, tak, oczywiście, bardzo prosty pomysł. Całkowicie intuicyjne, że potrzebujemy trochę miejsca w pamięci - w tej formie, cup - jeśli rzeczywiście chcesz zamienić te dwie zmienne. Więc zróbmy dokładnie to. Się tu w latach, gdzie twierdzą, że jestem będzie jakiejś wymiany, ja śmiało zadeklarować Temp. A ja ustawiony jest równa, powiedzmy, x. Potem mam zamiar zmienić wartość x jak Jess nie tutaj z mleko i sok pomarańczowy być równe y. I mam zamiar zmienić y równa aby nie x, bo teraz będziemy tkwi w kręgu, ale temp. Gdzie ja tymczasowo - lub gdzie Jess tymczasowo umieścić sok pomarańczowy przed przebijania, że kubek z mlekiem. Więc pozwól mi iść do przodu i teraz zrobić to. To się nazywa noswap.c. A teraz pozwól mi biegać bez swapa. I rzeczywiście widzę, gdybym rozwiń okno trochę, że x oznacza 1, y oznacza 2. A następnie x oznacza 2, Y oznacza 1. Ale przypominam, że w poniedziałek zrobiliśmy rzeczy trochę inaczej, przy czym I zamiast wprowadziliśmy funkcję pomocnika, jeśli chcesz, to było naprawdę nieważne. I nazwał go zamienić. Dałem dwa parametry i zadzwoniłem im i nazwał ich b. Szczerze mówiąc, mógłbym nazwać ich x i y. Nie ma nic zatrzymując mnie od robienia tego. Jednak jestem zdania, że ​​to wtedy trochę niejasne. Ponieważ wycofanie w poniedziałek, że twierdził, że parametry te były kopie wartości przekazywane w. Więc to tylko miesza ci umysł, myślę, że jeśli używasz dokładnie te same zmienne. Więc ja, zamiast nazywać ich i b, tak dla jasności. Ale możemy nazwać ich najbardziej cokolwiek chcemy. I mam zamiar skopiować i wkleić skutecznie ten kod tam z góry w dół tutaj. Bo właśnie widziałem, że to działa. Tak, że jest w dobrej formie. A ja zmienię x na, moim x. na moje r do b i mojej r do b. Tak więc, innymi słowy, dokładnie taki sam układ logiczny. Dokładnie to samo, że Jess nie. A potem jedno muszę zrobić się tu, oczywiście, to jest teraz powołać Funkcja lub wywołać tę funkcję. Będę więc wywołać tę funkcję z dwoma wejść, x i y, a hitem Zapisz. W porządku, więc zasadniczo samo. W rzeczywistości, mam zapewne program niepotrzebnie złożone przez napisanie funkcji, która jest po prostu biorąc niektóre sześć linijek kodu, podczas gdy I poprzednio realizowane to w zaledwie trzy. Więc pozwól mi iść do przodu i teraz przerobić ta, nie znaleziono swapa. Dobrze, wkręca się tutaj. Powinno to być błąd, który może zobacz coraz bardziej powszechnie, jak Twoje Programy uzyskać bardziej złożone. Ale jest łatwo naprawić. Pozwól mi przejść z powrotem tutaj. I co jest pierwszy błąd widzę? Niejawna deklaracja. Co to zazwyczaj wskazują? Oh, zapomniałem prototyp. Zapomniałem uczyć kompilator, że zamiana będzie istnieć, mimo że nie istnieje na samym początku programu. Więc mam zamiar powiedzieć, nieważne, swap, int, int b, średnik. Więc nie będę reimplement go. Ale teraz to pasuje, co jest tutaj. I zauważ, brak średnikiem o, co nie jest konieczne, gdy realizacji. Więc pozwól mi przerobić to zrobić bez swapa. Znacznie lepszej formie. Uruchom bez swapa. I cholera. Teraz jesteśmy tam, gdzie byliśmy w poniedziałek, gdzie sprawa nie zamienić. I co jest intuicyjne wyjaśnienie dlaczego jest to przypadek? Tak? STUDENT: [niesłyszalne]. DAVID MALAN: Dokładnie. Więc i b są kopiami x i y. A w rzeczywistości, za każdym razem byłeś wywołanie funkcji tak daleko, że przechodzi zmienne jak ints - jak Swap spodziewa tutaj - wy zostały przekazując kopie. Teraz to znaczy, że ma trochę czasu, ułamek sekundy, na komputer skopiować bitów z jednego Zmienna do bitów drugiego. Ale to nie taka wielka sprawa jest. Ale to jednak kopia. A więc teraz, w kontekście wymiany, Jestem w tym, z powodzeniem zmiana i IIIb. W rzeczywistości, zróbmy szybkie sanity check. F Print jest% i, nowa linia. A wtyczka niech w. Teraz zróbmy to samo z b.. I zróbmy to samo tutaj. A teraz pozwól mi skopiować te same linie raz na końcu funkcji po moich trzech linii ciekawa mógł wykonane i wydrukować i b po raz kolejny. Więc teraz zróbmy to zrobić bez swapa. Pozwól, że okno terminala nieco wyższy, tak, że możemy zobaczyć go więcej na raz. I uruchomić bez swapa. x oznacza 1, y oznacza 2. a oznacza 1, b oznacza 2. A potem, to 2, b wynosi 1. Tak to działa, tak jak Jess A tutaj, w środku wymiany. Ale, oczywiście, to jest bezskuteczny na zmiennych w main. Tak więc widzieliśmy trick w którym możemy może to naprawić, prawda? Kiedy masz do czynienia z tym określania zakresu problem, to może po prostu punt i uczynić x i y, jakie zmienne zamiast? Można ich globalnym. Umieść je na samej górze pliku jak my, nawet w grze 15. Używamy zmiennej globalnej. Jednak w kontekście gry 15, jest to rozsądne, aby globalna zmiennej reprezentującej planszę, ponieważ Całość 15.c jest wszystko o realizacji tej gry. To, co plik istnieje zrobić. Ale w tym przypadku tutaj jestem wywołanie swap funkcji. Chcę zamienić dwie zmienne. I powinien zacząć odczuwać tylko niechlujstwa jeśli rozwiązanie dla wszystkich naszych problemy, gdy działają w zakresie zagadnienia jest zrobić to globalny. Bo bardzo szybko nasz program jest będzie się dość bałaganu. I zrobiliśmy to bardzo oszczędnie w rezultacie w 15.c. Ale okazuje się, że jest lepszy sposób całkowicie. Pozwól, że faktycznie wrócić i usunąć wydrukować f-tych, po prostu uprościć ten kod. I pozwól mi zaproponować to rzeczywiście, jest złe. Ale jeśli zamiast dodawać w niektórych gwiazdkach i gwiazdy, mogę zamiast skręcić w tym funkcji w jednym, który jest faktycznie działa. Więc pozwól mi wrócić tu i przyznać, mówiąc: gwiazdka jest zawsze trudne, tak powiem gwiazdki. Ja po prostu przyznaj się do tego. Dobrze. A teraz, co ja robić zamiast tego? Więc po pierwsze, mam zamiar podać że zamiast przekazywać int do Funkcja wymiany, jestem zamiast z powie int gwiazdę. Teraz, to co gwiazdki oznaczają? To, że pojęcie wskaźnik ten Binky, charakter claymation, był odnosząc się chwilą. Więc jeśli mówimy int gwiazdę, rozumieniu to teraz jest to, że nie będzie podjęta w jego wartości. To nie ma być skopiowany w. Raczej adres jest będzie przekazany w. Tak więc przypomnieć, że do wnętrza komputera, jest cała masa pamięci, w przeciwnym razie znane jako pamięci RAM. I to jest właśnie RAM cała masa bajtów. Więc jeśli Mac lub komputer ma dwa gigabajty, masz 2 miliard bajtów pamięci. Teraz tylko przypuszczać, że właśnie zachować rzeczy ładne i uporządkowany, ale przypisanie adresu - liczba - aby każdy bajt pamięci RAM w komputerze. Pierwszy bajt z tych 2 miliard jest cyfra zero. Kolejny to bajt numer jeden, numer dwa, aż On Up, dot dot dot, do mniej więcej 2000000000. Więc możesz liczba bajtów pamięci w komputerze. Więc załóżmy, że to, co rozumiemy przez adres. Więc gdy widzę int star, co się dzieje być przekazywane do wymiany teraz jest adres. Nie jej wartość, ale bez względu na postal Adres jest, by tak rzec - jego lokalizacja w pamięci RAM. I podobnie dla b, idę powiedzieć to samo. Int, star, b. Tak na marginesie, technicznie gwiazdy może pójść w innych lokalizacjach. Ale my ujednolicić gwiazdy będącej obok typu danych. Więc zamienić podpis oznacza teraz, daj mi adres int, i wywołanie ten adres. I daj mi inny adres int i nazywają to B Adres. Ale teraz mój kod tutaj musi się zmienić. Bo jeśli Oświadczam int temp - który nadal jest typu int - ale ja przechowywać w to, jakie wartości? Żeby było jasne, ja kładąc się Kod jak napisane w tej chwili? Kładę lokalizację w. Ale nie dbam o lokalizacja teraz, prawda? Temp istnieje tylko trzecią filiżankę Jess ' istnieje, w jakim celu? Aby zapisać wartość. Mleko lub sok pomarańczowy. Nie faktycznie przechowywać adres jedną z tych rzeczy, które czuje się trochę bezsensowne w tym prawdziwym kontekst świata i tak. Tak naprawdę, to co chcę umieścić w temp. nie jest adres, ale zawartość. Jeżeli tak jest numer 123 jak to jest 123-gie bajt pamięci, że tylko dzieje się zajmują, że wartość w dzieje się zajmują. Jeśli chcę, aby przejść do tego adresu, Muszę powiedzieć, star. Podobnie, jeśli miałbym zmienić to, co jest na adres, zmienię to zacząć. Jeśli chcę, aby przechowywać w to, co jest w lokalizacja z tym co jest w miejscu w B, gwiazda b gwiazdki. Tak więc, w skrócie, nawet jeśli nie jest to całkiem pogrąża się w jeszcze - i nie spodziewałbym że to będzie tak szybko - sobie sprawę, że wszystko co robię jest poprzedzenie te gwiazdy do moich zmiennych, powiedzenie nie chwycić wartości. Nie należy zmieniać wartości. Ale raczej iść do tych adresów i uzyskać wartość. Idź do tego adresu i zmiany wartość istnieje. Więc teraz pozwól mi przejść z powrotem do góry, wystarczy, aby rozwiązać ten wiersz tutaj, aby zmienić prototyp pasujące. Ale teraz trzeba zrobić jedną rzecz. Intuicyjnie, jeśli zmieniłem typy argumentów, które zamienią spodziewa, co jeszcze muszę zmienić w moim kodzie? Kiedy dzwonię swapa. Bo teraz, co ja I przechodząc do wymiany jeszcze? X wartość i wartość y, lub mleko i sok pomarańczowy. Ale ja nie chcę tego robić. I zamiast chcą przekazać w co? Położenie xi Położenie Y. Jakie są ich adresy pocztowe, że tak powiem. Tak więc, aby to zrobić, jest Ampersand. Rodzaj Ampersand dźwięków, takich jak adres. więc n, Ampersand, adres od x, a adres y. Więc to jest zamierzone, że używamy Ampersands po wywołaniu funkcji i gwiazdy podczas deklarowania i kiedy realizacji funkcji. I tylko pomyśleć o znaku & w adres operatora, jak i gwiazdy tam operator - lub, dokładniej, operator nieprawidłowego. Więc to jest całe mnóstwo słów po prostu powiedzieć, że teraz, miejmy nadzieję, swap będzie za prawidłowe. Pozwólcie mi iść do przodu i robić - niech faktycznie zmienić nazwę pliku, aby nie ten program jeszcze nazwać nie wymiany. I twierdzą, że nazwiemy go swap.c teraz. Tak zrobić, zamienić. Dot, slash, zamienić. I teraz rzeczywiście, x oznacza 1, y oznacza 2. A potem, x wynosi 2, y jest jeden. No zobaczymy, czy nie można tego zrobić trochę inaczej, co jest tu dzieje. Po pierwsze, chciałbym przybliżyć naszym rysowanie ekranu tutaj. I pozwól mi zaproponować na chwilę - i gdy rysuję tutaj będą dublowane tam teraz - pozwól mi zaproponować tutaj jest cała masa pamięci lub RAM, wewnątrz komputera. A to będzie liczba zgryz, powiedzmy, 1. Będzie to liczba bajtów 2. I zrobię całą masę bardziej i następnie kilka kropki do kropki wskazują, że jest 2000000000 z tych rzeczy. 4, 5, i tak dalej. Tak więc są pierwsze pięć bajtów mojej pamięci komputera. Wszystko w porządku? Bardzo niewielu z 2000000000. Ale teraz mam zamiar zaproponować dodaje. Zamierzam zaproponować x będzie przechowywać liczbę 1, a Y jest zamiar zapisać numer 2. I pozwól mi iść do przodu i teraz reprezentuje Wartości te, jak następuje. Zróbmy to w następujący sposób. Daj mi tylko jedną sekundę. Jedna sekunda. OK. Chcę, aby ten mały - zróbmy to jeszcze raz. W przeciwnym razie będę i za pomocą same liczby, w sposób niezamierzony, wiele razy. Więc tak mamy różne numery aby porozmawiać o, nazwijmy to bajt numer 123, 124, 125, 126, i dot dot dot. I niech mnie twierdzą teraz, że będę umieścić wartość 1 tutaj, a wartość 2 tutaj, zwie x i y. Więc tak się składa, że To jest x, to Y. I tak przez jakiś przypadek, komputer, system operacyjny, się postawić X na miejscu Numer 123. A y skończyło się na miejscu 124 - cholera. Powinienem był ustalony to. Oh man, czy naprawdę chcesz to zrobić? Tak, chcę, aby to naprawić i b prawidłowe o tym dzisiaj. Niestety, w tym nowy. 127, 131, a ja nie chcę być w tym skomplikowane, ale dlaczego zmienić numery tam? Bo chcę, aby się ints faktycznie się z czterech bajtów. Więc być super anal o tym. Tak, że jeśli 1 stanie się zająć 123, 2 będzie w adresie 127, ponieważ jest to tylko 4 byes dala. To wszystko. A my zapominamy o wszystkich inne adresy świata. Tak więc x jest w miejscu 123, Y znajduje się w miejscu 127. A teraz, co ja właściwie chcesz zrobić? Kiedy dzwonię swapa teraz, co jest właściwie dzieje? Cóż, kiedy ja nazywam swapa, jestem przekazując adres X i adres y. Tak więc na przykład, jeżeli te dwa kawałki papieru stanowią obecnie dwa argumenty i b, aby zamienić, co ja zamiar napisać na pierwszej z nich, które mam zamiar zadzwonić nazywać? Dokładnie 123. Więc to mam prawo to. Jest to parametr. Kładę adres x tam. Co to jest? Co to jest? Nr, nr. To jest OK. Nadal dobre, nadal dobre. Tak to jest. A teraz na drugiej kartce papieru, to będzie b, i co ja mam będzie pisemnie ten kawałek papieru? 127. Więc jedyne, co się zmieniło od nasze poprzednie opowiadanie tej historii, zamiast dosłownie 1 i 2, jestem przejdzie w 123 i 127. I mam teraz zamiar umieścić te wnętrza tego pola, wszystko w porządku? Tak, że czarna skrzynka stanowi obecnie Funkcja wymiany. Tymczasem, niech teraz ktoś realizować funkcję wymiany. Czy ktoś się tutaj jak zostać wolontariuszem? Chodź na górę. Jak masz na imię? Charlie. Wszystko w porządku, Charlie. Chodź na górę. Więc Charlie zagra Rola naszej czarnej skrzynki. A Charlie, co chciałbym Ci zrobić teraz jest wdrożenie swapa w taki sposób, że biorąc pod uwagę te dwa adresy, Ci rzeczywiście dzieje do zmiany wartości. A ja szepczę do ucha jak uruchomić telewizję tutaj. Więc śmiało, i jesteś czarna skrzynka. Dojdzie tam. Jakie wartości widzisz na i Jakie wartości widzisz na b? CHARLIE: jest 123 i b wynosi 127. DAVID MALAN: OK, dokładnie. Teraz zatrzymać się tam na chwilę. Pierwszą rzeczą, którą zamierzamy zrobić teraz, zgodnie z kodem - które Będę teraz pull up na ekranie - będzie przeznaczyć trochę bit pamięci o nazwie Temp. Więc mam zamiar iść do przodu i daje tej pamięci. Więc to będzie trzecia zmienna , że masz dostęp do dzwoniłeś Temp. I co masz zamiar napisać temp na kawałku papieru? CHARLIE: Wskaźniki, prawda? DAVID MALAN: OK, no nie koniecznie wskazówek. Więc linia kodu mam podświetlony na prawej stronie, zacznijmy tam. To mówi gwiazda. Tak jest obecnie przechowywania Numer 123. I tylko intuicyjnie, co czy gwiazda 123 oznacza? Ale w szczególności, jeśli jest 123, gwiazda znaczy co? Wartość. Lub bardziej przypadkowo, tam. Więc pozwól mi zaproponować, trzymając w Twoja ręka, śmiało traktować, że jakby to mapa. I iść sobie na do komputera pamięci i nas znaleźć to, co jest na miejscu 123. Dokładnie. Widzimy więc, na miejscu 123 to, co, oczywiście? OK, więc to, co masz teraz wartość zamiar umieścić w temperaturze? Dokładnie. Więc zrób to. I napisać numer 1 na kartce Papier, który jest aktualnie pod tytułem Temp. A teraz następny krok, który masz zamiar wdrożyć będzie co. Cóż, z prawej strony następna linia kodu jest gwiazda b. b, z Oczywiście, przechowuje adres. To dotyczy 127. Gwiazda b oznacza co, od niechcenia mówi? Idź do tej lokalizacji. Więc idź naprzód i znaleźć nam co jest na miejscu 127. OK. Oczywiście, w miejsce 127, jest nadal wartość 2. Więc co masz zamiar teraz sklep na co jest w miejscu, w? Więc hotel środkiem przejdź do lokalizacji na. Czym jest lokalizacja? Dokładnie. Więc teraz, jeśli chcesz zmienić co jest w tym miejscu - Pójdę dalej i uruchomić gumka są tutaj. I teraz umieścić go z powrotem na szczotkę. Jaki numer masz zamiar pisać w tym pustym polu teraz? Dokładnie. Tak więc ta linia kodu, aby być jasne - niech mnie zatrzymać to, co robi i Charliego podkreślić tutaj, co on po prostu zrobił to napisz do tego pola w miejscu 123 wartość, która była wcześniej w B. I tak mamy teraz rzeczywiście realizowane ta druga linia kodu. Teraz, niestety, nie ma jeszcze jedna linia pozostała. Teraz to, co jest w temperaturze, dosłownie? Jest to oczywiście numer jeden. To nie przemówień. To tylko liczba, rodzaj Zmienna od tygodnia jeden. A teraz, kiedy mówisz gwiazda b, co oznacza, że przejdź do B Adres, który jest Kurs tutaj. Więc kiedy się tam dostać - Pójdę dalej i usunąć to, co w rzeczywistości tam - a co ty zamiar napisać teraz na 127 lokalizacji? CHARLIE: Temp, który jest jeden. DAVID MALAN: Temp, który jest jeden. A co się dzieje, do temperatury w końcu? Cóż, naprawdę nie wiem. Tak naprawdę nie obchodzi. Za każdym razem, my wprowadziliśmy funkcję do tej pory, wszelkie zmienne lokalne masz rzeczywiście są lokalne. A oni po prostu zniknąć. Są one odzyskane przez działającego System ostatecznie. Tak więc fakt, że temperatura jeszcze wartość 1 jest rodzaj gruntu nieciekawe do nas. W porządku, więc brawa czy możemy dla Charliego. Bardzo dobrze zrobione. No dobrze, więc co więcej robi oznacza to, co możemy zrobić? Tak więc okazuje się, że byliśmy mówi kilka białych kłamstw już od jakiegoś czasu. W rzeczywistości okazuje się, że ciąg, Wszystkie tego czasu, nie jest tak naprawdę Sekwencja znaków per se. To niby jest, że intuicyjnie. Ale technicznie rzecz biorąc, ciąg jest Typ danych, które uznane wewnątrz CS50 biblioteka uprościć świat w pierwszych kilku tygodniach od klasy. Co tak naprawdę jest ciąg jest adres o charakterze gdzieś w pamięci RAM. Ciąg jest naprawdę wiele, tak jak 123 lub 127, które zdarza się wyznaczenie gdzie ciąg rozpoczyna się w pamięci komputera. Ale to nie oznacza ciąg, per se, sama. I widzimy to w następujący sposób. Pozwólcie mi iść do przodu i otworzyć niektóre kod, który znajduje się między dzisiejsze przykłady kodu źródłowego. I zamierzam iść do przodu i otworzyć się, powiedzmy, porównanie-0.c. To buggy program, który będzie być realizowane w następujący sposób. Po pierwsze. Mam zamiar coś powiedzieć. Potem mam zamiar iść do przodu i uzyskać ciąg od użytkownika w tej nowej linii. Potem mam zamiar powiedzieć to jeszcze raz. Potem mam zamiar dostać inny ciąg od użytkownika. I zauważ, jestem pokazano jedną z ciągi w zmiennej o nazwie s, a drugiego z tych ciągów w zmiennej o nazwie t. A teraz mam zamiar twierdzić, bardzo zasadnie, że jeśli s jest równa jest równa t, łańcuchy są takie same. Możesz wpisać to samo. Else, łańcuchy są nie to samo. Po tym wszystkim, jeśli wejście dwie wskazówki, dwa znaki, dwa pływaki, dwa dwuosobowe, wszystkie z typy danych Mówiliśmy o tak daleko, aby porównać je - Przypominam sobie zrobiliśmy bardzo jasne, podczas gdy temu że nie robią tego, bo Pojedynczy znak równości jest oczywiście Operator przypisania. Więc to będzie błąd. Używamy równy znak równości, które rzeczywiście porównuje rzeczy dla prawdziwej równości. Ale twierdzą, jest to buggy. Jeśli pójdę do przodu i zrobić porównanie do zera, a następnie nie dot slash porównać do zera. I wpisz w, powiedzmy, witam. A potem niech się przywitać ponownie. Dosłownie to samo, komputer Roszczenia Wpisałem różne rzeczy. Teraz może po prostu błędnie coś. Będę wpisać moje imię tym razem. To znaczy, cześć. Hello. Jest inaczej za każdym razem. Cóż, to dlaczego? Co się naprawdę dzieje pod maską? Cóż, to, co tak naprawdę dzieje się pod kaptur jest ciąg a następnie Wpisałem w tym po raz pierwszy, na przykład jest słowo hello, oczywiście. Ale jeśli reprezentujemy to pod okap, przypomnieć, że ciąg jest w tablicy. I mówiliśmy tyle w przeszłości. Więc jeśli rysuję tej tablicy tak, jestem będzie reprezentować coś zupełnie podobny do tego, co zrobiliśmy przed chwilą. I tam rzeczywiście coś specjalnego tutaj też. Czego możemy określić został na koniec każdego łańcucha? Tak, to zerowy backslash, który jest tylko sposób reprezentacji, dosłownie, 00000000. Osiem 0 bity rzędu. Nie wiem, szczerze mówiąc, co po tym. To tylko kilka więcej RAM wewnątrz komputera. Ale to jest tablica. Rozmawialiśmy o tablicach przed. A my zwykle mówić o macierzach jako miejsce zero, potem jeden, potem dwa. Ale to tylko dla wygody. I to jest całkowicie względne. Kiedy rzeczywiście coraz pamięci z komputer, to oczywiście każdego 2000000000 niektóre dziwne bajtów, potencjalnie. Tak naprawdę pod maską, przez cały ten czas, tak. To może być bardzo dobrze zera wspornik. Ale jeśli kopać jeszcze głębiej pod kaptur, to naprawdę adres numer 123. To jest adres 124. To jest adres 125. I nie spieprz tego czasu. Są to obecnie jeden bajtów siebie z jakiego powodu? Jak duży jest char? Char jest tylko jeden bajt. Int jest zwykle cztery bajty. Więc dlatego zrobiłem to 123, 127, 131 i tak dalej. Teraz mogę utrzymać math prostsze i po prostu zrobić plus 1. I to jest teraz to, co się naprawdę dzieje on pod maską. Więc jeśli deklarują coś takiego, string s, to faktycznie - Okazuje się - char gwiazda. Gwiazda, oczywiście oznacza adres, aka pointer. Więc jest to adres coś. Co to jest adres? Cóż - Jestem jedynym, który widzi bardzo Ważnym punktem robię, lub myśleć Robię. Więc string - Smutne jest to, mam monitor tam gdzie ja mógł zobaczyć, że. W porządku, więc ciąg s jest to, co I oświadczył wcześniej. Ale okazuje się, dzięki mało Magia w CS50 bibliotece, to wszystko Czas ma dosłownie ciąg było char gwiazda. Oznacza gwiazda ponownie wskaźnik lub adres. Fakt, że to flankująca słowo char oznacza to adres znaku. Jeśli więc uzyskać ciąg nazywa, i wpisz w H-E-L-L-O, proponuję teraz, co ma dostać ciąg dosłownie powróciła wszystkie tym razem, mimo że mamy dość uproszczona świat? Co robi się ciąg faktycznie powrócić jako wartość zwracana? 123, w tym przypadku, na przykład. Mamy wcześniej powiedział, że dostać ciąg po prostu zwraca ciąg, ciąg znaków. Ale to trochę białym kłamstwem. Sposób uzyskać ciąg naprawdę działa pod maską to robi ciąg od użytkownika. To plops znaki, które On lub ona rodzaje w pamięci. Stawia zero backslash na końcu z tych sekwencji znaków. Ale to, co robi się ciąg dosłownie wrócić? Dosłownie zwraca adres Pierwsze bajtów pamięci RAM jest wykorzystywane do tego siły. I okazuje się, że tylko przez powrót Pojedynczy adres Pierwszy znak w łańcuchu, który jest wystarczający dla znalezienia całość ciąg. Innymi słowy, pobiera ciąg znaków nie ma powrót 123, 124 i 125. To nie musi się dać mi długo Lista wszystkich bajtów mój ciąg jest za pomocą. Ponieważ jednym, wszystkie są z powrotem do tyłu. Drugiego, w zależności od pierwszego adresu, że można dowiedzieć się, gdzie ciąg kończy. W jaki sposób? Specjalny znak null, użyjemy zera na końcu. Tak więc, innymi słowy, jeśli przejechaniu około - wewnątrz zmiennych - adres char i bierze , że na końcu każdego łańcucha, dowolną Sekwencja znaków, jak my, ludzie, myśleć o strunach, jeśli przyjąć, że na końcu każdego takiego ciągu istnieje zero backslash, jesteś złoty. Bo zawsze można znaleźć koniec łańcucha. Teraz to, co jest naprawdę, a następnie będzie on w tym programie? Dlaczego ten program, porównanie-0.c, buggy? Co jest rzeczywiście w porównaniu? Tak? STUDENT: [niesłyszalne]. DAVID MALAN: Dokładnie. To porównanie lokalizacje z ciągów. Więc jeśli użytkownik wpisał w witam raz, jak ja, pamięć może skończyć się wygląda tak. Jeśli użytkownik naciśnie klawisz w Witam ponownie, ale dzwoniąc uzyskać ciąg ponownie, c jest nie szczególnie mądry, chyba że nauczy , że jest mądry, pisząc kod. C - i bardziej ogólnie - komputery po wpisaniu w słowie Witam ponownie, wiesz, co masz zamiar uzyskać. Jesteś po prostu dostanie drugą tablicę z pamięci, tak, zdarza się przechowywanie H-E-L-L-O i tak dalej. To będzie wyglądać tak samo do nas ludzie, ale ten adres może nie być 123. To może tak się zdarzyć, że System operacyjny ma jedne dostępne miejsce na przykład w miejscu - powiedzmy, że coś niepożądanego, jak to jest lokalizacja 200. I to jest miejsce 201. I to jest miejsce 202. Nie mamy pojęcia, gdzie to jest w będzie w pamięci. Ale co to oznacza to, że to, co jest będzie przechowywany ostatecznie s? Numer 123. Co się dzieje, przechowywać w t, w tej arbitralnej przykład? Numer 200. A wszystko to oznacza, to jest oczywiście, 123 nie jest równa 200. A więc to, czy nie stanie wartość true. Ponieważ get ciąg jest za pomocą różnych fragmenty pamięci za każdym razem. Teraz możemy zobaczyć to jeszcze raz W innym przykładzie. Pozwólcie mi iść do przodu i otworzyć kopiowaniem 0.c. I twierdzą, że ten przykład będzie spróbować - ale nie uda się - dwa ciągi w następujący sposób. Mam zamiar coś powiedzieć dla użytkownika. Jestem wtedy dostanie Łańcuch i nazywają to s. A teraz robię ten test tutaj. Wspominaliśmy już, to z powrotem podczas. Ale kiedy może się zwróć NULL ciągu, inny znak specjalny, lub specjalne symbol powiedzmy. Jeśli jest to z pamięci. Na przykład, jeśli użytkownik jest naprawdę jest trudne i rodzaje okropna liczba znaków w klawiatura i odsłon Enter. Jeśli ta liczba znaków po prostu nie może się w pamięci RAM niezależnie szalone Powodem, jak uzyskać ciąg może bardzo dobrze zwróci wartość null. Lub, jeśli program sam robi wiele, z innymi i nie tylko Za mało pamięci do get ciąg aby odnieść sukces, to może skończyć up powrocie null. Ale bądźmy bardziej precyzyjne , co to jest. Co to jest typ S w dane naprawdę? Char gwiazdki. Okazuje się teraz, że mogą się odklejać kopii warstwy null. Okazuje się, null jest - tak, oczywiście specjalny symbol. Ale co to jest naprawdę? Naprawdę, null to tylko symbol, że ludzie używają do reprezentowania zera, jak również. Więc autorów C i komputery bardziej ogólnie, postanowił rok temu , wiesz co. Dlaczego nie możemy zagwarantować, że żaden użytkownik dane nigdy, nigdy, nigdy przechowywany w temperaturze zera bye? W rzeczywistości, nawet w moim dowolnego przykładu przed, nie rozpocząć numerowanie bajtów na zero. Zacząłem w jednym. Ponieważ wiedziałem, że ludzie na świecie Postanowiliśmy zarezerwować zera byte w niczyjej pamięci RAM jako coś specjalnego. Powodem jest, kiedy tylko chcesz sygnał, że coś poszło nie tak w odniesieniu do adresów, powróciłeś NULL - zwie zera - a bo wiesz, że nie ma legit dane o adresie zero wyraźnie Oznacza to, że komunikat o błędzie. I dlatego my, zgodnie z konwencją, sprawdź o coś pustego i powrót jak jeden z tych przypadków. Jeśli więc przewijać teraz, to tylko następnie sprawdzanie błędów, tylko w przypadku coś poszło nie tak z [? bail?] całkowicie i zamknąć program powracając wcześnie. Ta linia teraz mogą być zapisane jak to, co oznacza, co? Na lewej stronie, daj mi inną wskaźnik do znaku, i nazywają to t. Co ja przechowywania wewnątrz t, w oparciu na tej jednej linii kodu? Jestem przechowywania lokalizację. Konkretnie lokalizacja to było w tych. Więc jeśli użytkownik wpisał w hello, i że pierwsza cześć dzieje się skończyć tu, a następnie numer 123 jest wróci z uzyskania ciągu i być przechowywane - jak powiedzieliśmy wcześniej - w sekundach. Kiedy teraz zadeklarować inny wskaźnik do char i nazywają to t, jaki numer jest dosłownie skończy w t zgodnie z historii? Więc 123. Więc technicznie teraz zarówno s i t wskazują na dokładną same fragmenty pamięci. Tak więc zauważyć, co mam teraz zrobić, aby udowodnić, że ten program ma błędy. Najpierw zamierzam twierdzić, ze f druku, wykorzystując kopia napisu. Potem mam zamiar zrobić trochę sprawdzanie błędów. Idę się upewnić. Upewnijmy się, że łańcuch jest na t najmniej większa od zera w długości, więc jest tam jakiś znak właściwie wykorzystać. A potem można przypomnieć to z poprzednich przykładów. 2 górna - która jest w ctype.h plik. T Uchwyt zera daje mi zero charakter t smyczkowy. I 2 górne tej samej wartości, Oczywiście, przetwarza go na wielkie litery. Tak intuicyjnie, to podświetlony wiersz kodu jest czerpanie pierwszy List wt. Ale to nie jest kapitalizacji, intuicyjnie, Pierwsza litera s. Ale jeśli myślisz dalej, co mam by zobaczyć, gdy uruchomię ten program i wydrukować zarówno oryginalne, y, i tak zwana kopia, T? Oni rzeczywiście będzie tak samo. I dlaczego są one będzie tak samo? Obaj wskazując dokładnie to samo. Więc zróbmy to. Marka zera kopiowania. Kompiluje OK. Pozwólcie mi biegać zera kopiowania. Pozwól mi wpisać coś komentarzy w wszystkie małe litery, a następnie naciśnij Enter. I twierdzi, że zarówno przy s i kopia są rzeczywiście identyczne. Więc co tak naprawdę się stało? Pozwól mi przerysować ten obraz tylko opowiedzieć się nieco inny sposób. Co tak naprawdę dzieje się pod kaptur kiedy Oświadczam coś char początek s, lub string s, Otrzymuję wskaźnik - co dzieje się z czterech bajtów w CS50 urządzenia oraz w wielu komputerach. I mam zamiar nazwać s. I to ma obecnie jakaś nieznana wartość. Kiedy deklarujesz zmienną, chyba że samemu umieścić wartość tam, kto wie, co tam jest. Może to być także losowa sekwencja bity z poprzedniej realizacji. Kiedy więc, w mojej linii kodu nie dostać łańcuch, a następnie zapisać do zwrotu wartość w sekundach uzyskać ciąg jakoś - a my będziemy w końcu odwinąć jak uzyskać Prace smyczkowe, w jakiś sposób przydziela Tablica, która prawdopodobnie wygląda trochę tak. H-E-L-P-O, odwróconej zera. Załóżmy, że jest to adres 123 tylko pierwsza konsekwencja. Więc Zwraca łańcuch znaków, w podświetlona linia istnieje, zwraca liczba powiedzieliśmy, 123. Więc to, co naprawdę dzieje wewnątrz jest tutaj? No, co naprawdę idzie wewnątrz s jest 123. Ale szczerze mówiąc, jestem już trochę zdezorientowane wszystkich tych adresów, Wszystkie z tych wartości arbitralne. 123, 124, 127. Więc rzeczywiście uprościć świat trochę. Kiedy mówimy o wskaźniki, szczerze mówiąc, do nas ludzie, którzy do cholery obchodzi gdzie rzeczy są w pamięci? To jest całkowicie arbitralne. To będzie zależeć od tego jak dużo RAM użytkownik ma. To będzie zależeć od kiedy w dzień uruchomieniu programu, być może, i co wejście użytkownik daje. Mamy mieszkanie na nieistotnych szczegółach. Więc abstract się i powiedzieć, że po uruchomieniu linii kodu w ten sposób, char gwiazda s dostaje zwrot wartość get ciąg. Dlaczego nie, a nie po prostu narysować to, co wzywasz wskaźnik tak, jakby to wskazując na coś? Więc twierdzą teraz, że s up jest wskaźnik - pod maską jest adres. Ale to jest po prostu wskazując Pierwszy bajt Ciąg, który został zwrócony. Gdybym teraz do kodu tutaj, co się dzieje na tej linii? Cóż, w tej zaznaczonej linii teraz, Jestem deklarując najwyraźniej inny zmienna o nazwie t. Ale jest to także wskazówka, więc będę narysować go jako, w teorii, dokładny samo okno rozmiar. I zamierzam to nazwać t. A teraz, jeśli wrócimy do kodu ponownie, kiedy przechowywać s wewnątrz t, co ja technicznie umieszczenie wewnątrz t? Dobrze technicznie, to było 123 numer. Tak naprawdę powinien być na piśmie 123 numer istnieje. Ale weźmy to wyższy poziom. t, jeśli jest to tylko wskaźnik, intuicyjnie, to właśnie to. To jest wszystko, co jest przechowywane tam. Więc teraz, w ostatnich linii interesujących kodu, kiedy faktycznie go o kapitalizacji charakter zero wt, co się dzieje? Cóż, t wspornik zera wskazuje teraz do tego, co postać, zapewne? To wskazuje na godz. Ponieważ t wspornik zera - przypominam, jest to stary składnia. t wspornik zera oznacza po prostu, jeśli t jest ciągiem, t Uchwyt zera oznacza uzyskanie zerowej postać w tym siły. Więc, co to naprawdę znaczy to udać się do tej tablicy - i tak, to może być 123, może to być 124. Ale to wszystko jest względne, pamiętam. Gdy mówimy o tablicy, mamy Zaletą mówisz względne indeksy. I tak teraz możemy po prostu założyć, że t zera wspornik h. Więc jeśli zadzwonię 2 górne na to, co to jest naprawdę robi jest czerpanie mała litera h na wielkie H. Ale, oczywiście, to, co jest s? To wskazuje na samej cholernej ciąg. Więc to wszystko, co dzieje się w tym kodzie do tej pory. Więc co to implikacja? Jak możemy rozwiązać te dwa problemy? Jak możemy porównać do rzeczywistych ciągów? Cóż intuicyjnie, w jaki sposób go o porównanie dwóch Struny do prawdziwej równości? Co to znaczy, gdy dwa łańcuchy są równe? Oczywiście, że nie, że ich adresy są równać w pamięci, bo to jest niskie Szczegóły wdrożenia poziom. Wszystkie znaki są takie same. Więc pozwól mi zaproponować, i pozwól mi przedstawić w wersji jednej z compare.c tutaj, więc porównanie-1.c. Pozwól mi zaproponować, że wciąż wskaźnik o nazwie s, i przechowywać w nim zwrotu wartości get ciąg. Zróbmy to samo z t.. Tak więc żaden z kodu jest inna. Mam zamiar dodać trochę więcej sprawdzanie błędów teraz. Więc teraz, że jesteśmy jakby odrywając to warstwy w CS50, co ciąg faktycznie jest, musimy być bardziej anal o to, abyśmy się nie nadużywać Nieprawidłowe wartości jak null. Więc mam zamiar sprawdzić. Jeśli nie jest równe NULL robi i t nie równa null, co oznacza, że ​​jesteśmy OK. Skorzystaj ciąg nie zepsuć się albo z tych ciągów. I można chyba domyślić się, co zgadza STR CMP przypuszczalnie zrobić? String porównać. Więc jeśli masz program w java przed, to jest jak jest równa metody w Klasa String. Ale dla tych z Was, którzy nie mają zaprogramowane wcześniej, jest to tylko funkcja c. Zdarza się przyjść Plik o nazwie string.h. To gdzie jest zadeklarowana. A ciąg porównanie - I rzeczywiście zapomnieć jej wykorzystania, ale mniejsza z tym. Przypomnijmy, że możemy zrobić Człowiek, wymieszać porównać. I to się dzieje, aby przywołać Linux obsługi programistów. I to jest, szczerze mówiąc, trochę tajemniczy. Ale widzę tutaj, yep. Muszę to string.h. I tu jest napisane pod opisem " Funkcja porównania ciąg porównuje dwa łańcuchy S1 i S2. "A S1 i S2 są wyraźnie dwa Argumenty przekazywane w. I naprawdę nie pamiętam co const, ale teraz zauważyć - a może widzieliście to już, kiedy już używać stron man, jeśli to wszystko - że char gwiazda jest po prostu synonimem sznurkiem. Więc to porównuje dwa łańcuchy, S1 i S2, i zwraca liczbę całkowitą mniejszą lub równą lub większą od zera jeżeli S1 jest odpowiednio, być mniej niż, lub mecz, lub większy niż s2. To jest po prostu bardzo złożony sposób na powiedzenie że ciąg porównać zyski zero gdy dwa ciągi znaków są intuicyjnie identyczne, znaków dla znaków dla znaku. Zwraca liczbę ujemną, jeśli s, alfabetycznie, ma przyjść przed t. Lub zwraca liczbę dodatnią, jeśli s ma przyjść po t alfabetycznie. Więc z tej prostej funkcji, może można, na przykład, posortować cała masa słów? Tak więc w tej nowej wersji, będę iść do przodu i robić compare1. Dot slash porównać jeden. Będę pisać w witaj w całej dolnej części obudowy. Idę do wpisywania komentarzy z wszystkimi małymi ponownie. I na szczęście teraz to zdaje sobie sprawę, Wpisałem to samo. Tymczasem, jeśli wpisać cześć w dolnej case i WITAJ wielkimi literami i porównać je, wpisałem różne rzeczy. Ponieważ nie tylko adresy inna, ale mamy porównanie różnych znaków ponownie. Więc chodźmy i naprawić jeden Inny problem teraz. Pozwól mi otworzyć wersję jednego z Kopia, która teraz zajmuje ten problem w następujący sposób. A ten będzie wyglądać nieco bardziej skomplikowane. Ale jeśli myślisz o tym, co problemem trzeba rozwiązać, mam nadzieję, że będzie to wyczyścić za chwilę teraz. Więc ten pierwszy wiersz, znak startu t, w laika może ktoś zaproponuje co ta linia tutaj oznacza? Char gwiazda t, co to robi? Dobra. Tworzenie wskaźnika do niektórych miejsce w pamięci. I pozwól mi ulepszyć go trochę. Zadeklaruj zmienną, która będzie przechowywać adres niektóre char w pamięci, po prostu być trochę bardziej właściwa. OK, więc teraz po prawej stronie, mam nigdy nie widziałem jedną z tych funkcji przed, malloc. Ale co może znaczyć? Alokacja pamięci. Alokacji pamięci. Tak więc okazuje się, aż do teraz, tak naprawdę nie miał potężny sposób zwracając się do systemu operacyjnego, daj mi trochę pamięci. Przeciwnie, mamy teraz funkcję o nazwie malloc, że robi dokładnie to. Mimo, że jest to trochę roztargnienie teraz zauważyć, że w między dwoma nawiasach tylko będzie liczba. Gdzie mam wpisać w pytaniu Znaki mogą być liczbą. I ta liczba oznacza, daj mi 10 bajtów. Daj mi 20 bajtów. Daj mi 100 bajtów. I malloc dołoży wszelkich starań, aby zwrócić się do systemu operacyjnego - Linux, w tym przypadku - hej, jest ich 100 bajtów od dostępnej pamięci RAM? Jeśli tak, zwróci te bajty do mnie zwrotu z których z adresu te bajty, może? Bardzo pierwszy. Więc tutaj też - i to jest dominujący w C, w każdym czasie, że jesteś czynienia z adresami? Jesteś prawie zawsze do czynienia z Pierwszy taki adres, bez względu na to, jak duży fragment pamięci pacjent jest podał do tyłu, że tak powiem. Więc nurkować tutaj. Staram się przeznaczyć jak wiele bajtów, dokładnie? Dobrze. Długość łańcucha S - Niech zrobić konkretny przykład. Jeśli s jest hello, H-E-L-L-O, co jest długość łańcuch s, oczywiście? Więc to jest pięć. Ale robię plus 1 na tym, dlaczego? Dlaczego chcę sześć bajtów zamiast pięciu? Znak null. Nie chcę wyjść poza ten specjalny znak null. Bo jeśli robię kopię cześć i po prostu zrobić H-E-L-L-O, ale nie szuka że szczególny charakter, komputer może nie mają, przez przypadek, backslash zero, nie dla mnie. I tak, jeśli próbuję dowiedzieć się, długość kopii, mógłbym pomyśleć, że jest to 20 znaków, lub milion znaków, jeśli nie dzieje się samo trafić zero backslash. Więc musimy sześć bajtów do przechowywania H-E-L-P-O, odwróconej zera. I to jest właśnie być super anal. Załóżmy, że nie pamiętam, co rozmiar char jest. Ciągle mówią, że to jeden bajt. I to zwykle jest. W teorii, to może być coś inny, na innym komputerze Mac lub inny PC. Tak więc okazuje się, że to jest operator nazywa sizeof, że jeśli zostanie przekazany do nazwa typu danych - jak char lub int lub float - powie to, dynamicznie, jak wiele bajtów char zajmuje w tej sprawie dany komputer. Więc to jest skuteczne tylko jak mówią razy 1 lub razy w ogóle nic. Ale robię to tylko, aby być super anal, , że tylko w przypadku char różni na komputerze kontra kopalni, w ten sposób matematyka zawsze będzie sprawdzić. Wreszcie tu sprawdzić za nieważną, która zawsze jest dobra praktyka - znowu za każdym razem mamy do czynienia ze wskaźnikami. Jeśli malloc nie był w stanie udzielić mi sześć byes - co jest mało prawdopodobne, ale tylko w przypadku - powrót jednego razu. A teraz idź i skopiować ciąg w następujący sposób. I to jest znać składnię, choć w innej roli. Mam zamiar iść do przodu i uzyskać ciąg długość s i przechowywać go w n. Jestem wtedy będzie iteracyjne od i jest równa zera dla i w tym N, większy lub równy. Tak, że w każdej iteracji, kładę ith charakter sw-ty charakter t. Więc co tak naprawdę dzieje się pod kaptur tutaj? Dobrze, jeśli to, na przykład, jest y - i mam wpisane w słowie H-E-L-L-O a tam zero backslash. I znowu, to jest s wskazując tutaj. I tu teraz jest t. A to wskazuje teraz Kopia pamięci, prawda? Malloc dał mi cały fragment pamięci. Nie wiem, co jest na początku w każdym z tych miejsc. Więc zamierzam myśleć o nich jako cała masa znaków zapytania. Ale jak tylko zacznę zapętlenie od zera na górę przez długości S, T Wspornik Wspornik zera i t 1 - i włożę to teraz na napowietrznych - t Wspornik Wspornik zera i s oznacza zerowy że mam zamiar być kopiowanie iteratively h tutaj, E-L-L-O. Plus, ponieważ zrobiłem Plus 1, backslash zero. Więc teraz, w przypadku porównania-1c, w końcu, czy mogę wydrukować kapitalizacja t, powinniśmy zobaczyć, że s jest bez zmian. Pozwólcie mi iść do przodu i teraz to zrobić. Tak zrobić Copy1. Dot slash Copy1. Idę do wpisywania komentarzy, Enter. A teraz uwaga, tylko kopię zostało aktywowane. Bo ja naprawdę mają dwa fragmenty pamięci. Niestety, możesz zrobić kilka dość złe i bardzo niebezpieczne rzeczy. Pozwól mi wyciągnąć przykład tu teraz, który daje nam przykład kilka różne linie. Więc po prostu intuicyjnie tutaj, w pierwszej linii kodu, int gwiazdki x, deklaruje zmienna o nazwie x. A co to jest typ danych tej zmiennej? Co dane typ zmiennej? To nie był cliffhanger. Typ danych int gwiazdki. Więc co to oznacza? x będzie przechowywać adres int. Proste. Y będzie przechowywać adres wew. Co to jest trzecia linia kodu tam robi? To przeznaczenie, jak wiele bajtów, prawdopodobnie? Cztery. Ze względu na rozmiar int jest zazwyczaj cztery, malloc czterech daje mnie adres kawałkiem pamięci, najpierw, których bajtów jest przechowywane obecnie w x. Teraz idziemy trochę szybko. Gwiazda x oznacza co? To znaczy iść na ten adres i umieścić jaki numer tam? Umieścić numer 42 tam. Gwiazda y oznacza przejść do tego, co jest na y. i umieścić numer 13 tam. Ale chwileczkę. Co jest w Y w tej chwili? Jaki adres y przechowywanie? Nie wiemy, prawda? Nigdy nie raz użyć przypisania operator udziałem y. Więc y jak oświadczył na drugiej linii kod jest tylko niektóre wartości śmieci, duży znak zapytania, tak powiem. Może on być skierowany przypadkowo do niczego w pamięci, które jest ogólnie zły. Więc jak tylko hit tej linii tam, gwiazdkowy y jest równa 13, coś złego, Jest coś bardzo źle o stanie z Binky. Zobaczmy więc, co się skończyć dzieje się tutaj, w tym binky minutę lub tak wyglądać. [PLAYBACK VIDEO] -Hej, Binky. Obudź się. Czas na zabawę wskaźnika. -Co to jest? Dowiedz się o wskazówki? Oh, jare. -Dobrze, aby zacząć, myślę, że jesteśmy będzie potrzebował wskazówek para. -OK. Ten kod przydziela dwa wskaźniki które mogą wskazywać na liczby całkowite. -OK, dobrze, widzę dwa wskaźniki. Ale nie wydaje się być wskazując na coś. -To prawda. Początkowo wskaźniki nie zwrócić się do niczego. Rzeczy, wskazują one są nazywane pointees i ustalanie ich jest oddzielny etap. -Och, dobrze, dobrze. Wiedziałem o tym. W pointees są oddzielne. Więc jak można przeznaczyć pointee? -OK. Cóż, ten kod alokuje nowy liczb całkowitych pointee, i ta część zbiorów X wskazać na to. -Hej, to wygląda lepiej. Więc zrobić to coś zrobić. -OK. Będę nieprawidłowego x wskaźnik do przechowywania Numer 42 w swojej pointee. Do tej sztuczki, a ja potrzebuję magii różdżka dereferencji. -Twoja magiczna różdżka dereferencji? Uh, to świetnie. -To, co kod wygląda. Ja po prostu ustawić liczbę i - -Hej, spójrz. Nie idzie. Tak robi nieprawidłowego na x następująco strzałka dostęp do swojego pointee. W tym przypadku, w celu przechowywania w 42 istnieje. Hej, spróbuj go zapisać numer 13 za pośrednictwem innego wskaźnika, Y. -OK. Pójdę tu do y i się liczba 13 skonfigurować. A potem wziąć różdżkę dereferencji i po prostu - whoa! -Oh, hey. To nie działa. Powiedz, Binky, nie sądzę, dereferencji y to dobry pomysł, bo konfigurowania pointee jest oddzielny etap. I nie sądzę, że kiedykolwiek to zrobił. -Hmm. Dobry punkt. -Tak, przeznaczył y wskaźnika. Ale nigdy nie ustawić go na wskazywać pointee. -Hmm. Bardzo uważny. -Hej, szukasz dobra tam, Binky. Czy można to naprawić, tak by punkty r do tej samej pointee jak X? -Jasne. Będę korzystać z magiczną różdżką z wskaźnik zadanie. -Czy to będzie Problem, jak wcześniej? -No. Nie dotykać pointees. To po prostu zmienia jeden wskaźnik do punktu się do tego samego, co innego. -O, widzę. Teraz punkty y do tego samego miejsca co X. Więc czekać. Teraz Y jest stała. Ma pointee. Więc można spróbować różdżkę z dereferencji ponownie wysłać 13 na. -OK. Tu idzie. -Hej, spójrz na to. Teraz dereferencji prace y. A ponieważ wskaźniki dzielą że jeden pointee, że zarówno zobaczyć 13. -Tak. Udostępnianie. Cokolwiek. Więc idziemy miejsca przełączników teraz? -Oh, spójrz. Mamy czas. -Ale - -Wystarczy przypomnieć sobie trzy Zasady wskaźnika. Numer jeden, podstawowa struktura jest to, że masz wskaźnik. I wskazuje na do pointee. Ale wskaźnik i pointee są oddzielne. A częsty błąd to ustawić wskaźnik, ale do zapomnij dać pointee. Numer dwa, dereferencji wskaźnik zacznie na wskaźnik i następuje jego strzałka na dostęp do swojego pointee. Jak wszyscy wiemy, to tylko wtedy, gdy istnieje jest pointee, który wraca do rządzić numer jeden. Numer trzy, cesja wskaźnik przyjmuje jeden wskaźnik i zmienia się w celu wskazania same pointee jako inny wskaźnik. Więc po cesji, dwa wskaźniki woli wskazywać na ten sam pointee. Czasami to się nazywa dzielenie. I to wszystko na ten temat, naprawdę. Bye bye teraz. [END PLAYBACK VIDEO] DAVID MALAN: Tak bardziej na wskaźnikach, Więcej na Binky przyszłym tygodniu. Do zobaczenia w poniedziałek.