>> DAVID MALAN: Hallo, und Willkommen zurück auf CS50.
Das ist also das Ende der vierten Woche.
Nur eine Ankündigung zuerst.
Also die sogenannte fünfte Montag kommen bis kommenden Montag.
Dies ist die Gelegenheit, um aus ändern SAT / UNSAT auf einen Brief grade, oder von
Brief Grade SAT / UNSAT.
Dummerweise funktioniert das Verfahren erfordern eine Unterschrift, weil Sie zu füllen
aus einer jener rosa Add / Drop-Formen.
>> Denn technisch gesehen, die SAT / UNSAT Version und der Brief Grade-Version
haben unterschiedliche Katalognummern.
Aber keine große Sache.
Kommen Sie einfach zu mir oder zu berauben oder Lauren an einer beliebigen Stelle.
Oder mailen Sie uns, wenn Sie nicht über die Art Papierkram Sie heute benötigen, und wir
wird sicher sein, damit Sie die kümmern, dass vor Montag.
>> Alles klar, also heute -
Eigentlich gibt es so etwas wie ein Echo.
Können wir Ton mich ein wenig nach unten?
OK.
Also heute, führen wir ein Thema bekannt als Zeiger.
Und ich gebe zu, dass dies eine der ist komplexere Themen, die wir dazu neigen,
decken in dieser Klasse, oder wirklich jede Einführungskurs die C verwendet
>> Aber nehmen Sie mein Wort für sie, vor allem wenn dein Geist fühlt sich ein bisschen mehr gebogen
heute und in den kommenden Wochen.
Es ist nicht repräsentativ für Sie immer noch schlimmer an dieser es bedeutet nur, dass
es ist eine besonders anspruchsvolle Thema Ich verspreche, dass, ein paar Wochen
Daher wird allzu auffallend scheinen einfach im Nachhinein.
>> Ich habe noch bis zum heutigen Tag erinnern.
Ich war in Elliott Dining Hall sitzt, sitzt neben meiner TF Nishat Mehta,
wer war ein Bewohner von Elliott Haus.
Und aus irgendeinem Grund, diese Thema gerade klickt.
Welches ist zu sagen, dass ich zu kämpfen mit ihm für eine gewisse Zeit, aber ich
werde mein Bestes tun, um zu vermeiden, eine solche Kampf mit einem Thema, das letztlich
ist sehr mächtig.
>> In der Tat, eines der Themen, die wir besprechen in den kommenden Wochen ist, dass
der Sicherheit, und wie Sie tatsächlich nutzen Maschinen in einer Weise
Das waren nicht vorgesehen.
Und diese sind in der Regel exploitations das Ergebnis der Fehler, Fehler, die wir
Menschen machen, indem nicht das Verständnis einiger der zugrunde liegende Implementierung
Details über die Programme gemacht werden.
>> Nun, dies zu machen scheinen umso Benutzer freundlich, ich dachte, ich würde eine 10 spielen
zweite Vorschau auf ein wenig claymation Figur namens Binky, die gebracht wurde
Leben von einem Freund von uns in Stanford, Professor Nick Parlante.
So erlauben Sie mir, Ihnen diese Teaser Binky hier.
>> [VIDEO PLAYBACK]
>> -Hey, Binky.
Aufwachen.
Es ist Zeit für Zeiger Spaß.
>> -Was ist das?
Erfahren Sie mehr über Zeiger?
Oh, Goodie.
>> [END VIDEO PLAYBACK]
>> DAVID MALAN: Das Stanford ist Informatik.
Also mehr dazu kommen.
>> [Applaus]
>> DAVID MALAN: Sorry, Nick.
>> So erinnern daran, dass wir das letzte Mal am Ende das wirklich spannende Cliffhanger
wobei diese Funktion einfach nicht funktioniert.
Mindestens intuitiv, es fühlte sich wie sollte es funktionieren.
Einfach das Vertauschen der Werte von zwei ganzen Zahlen.
Aber daran erinnern, dass, wenn wir die ausgedruckt ursprünglichen Werte in Haupt-, Ein-und
zwei, waren sie noch ein und zwei und zwei und eins.
>> Lassen Sie mich also tatsächlich wechseln über dem Gerät.
Und ich schrieb ein bisschen von Skelett-Code in voranzubringen hier, wo ich behaupten, dass x
1 sein, wird y 2 sein.
Ich habe dann ausdrucken beide ihre Werte mit Druck f.
>> Ich dann behaupten, dass hier unten wir werden, um sie auszutauschen.
Ich habe eine leere Stelle hier für uns füllen heute in nur einem Augenblick.
Dann werde ich zu behaupten, dass die zwei Variablen wurden getauscht.
Dann werde ich zum Drucken sie wieder heraus.
Und so hoffentlich, muss ich sehen 1, 2.
2, 1.
Das ist das super einfach Ziel zeigen.
>> Wie können wir also über Swapping gehen zwei Variablen?
Nun, wenn ich hier vorschlagen, dass diese Becher könnte Speicher in einem Computer darstellen.
Dies ist ein paar Bissen, diese ist noch ein paar Bissen.
Könnten wir ein Freiwilliger auf und sind gekommen, mischen uns ein paar Drinks, wenn das bekannt vor?
Komm up.
Wie ist dein Name?
>> Jess: Jess.
>> DAVID MALAN: Jess?
Komm up, Jess.
Wenn Sie nichts dagegen haben, müssen wir die Put- Google Glass auf Sie so können wir
verewigen diese.
OK, Glas.
Aufnehmen eines Videos.
Und OK, wir sind gut zu gehen mit Jess hier.
In Ordnung.
Schön, Sie kennen zu lernen.
>> Also, was ich möchte, dass du hier tun - wenn du könntest, recht schnell -
nur gießt uns ein halbes Glas Orangensaft Saft und ein halbes Glas Milch,
repräsentiert effektiv die Zahlen 1 in eine Tasse und 2 in der anderen Schale.
>> Das wird gut sein Filmmaterial.
>> Jess: Es tut uns leid.
>> DAVID MALAN: Nein, nein.
Es ist OK.
Nizza.
Alles klar, also haben wir vier Bytes Wert von Orangensaft.
Wir nannten es den Wert 1.
Jetzt noch vier Bytes im Wert von Milch.
Wird es nennen Wert 2 hat.
So x und y.
>> Alles klar, also jetzt, wenn die Aufgabe zur Hand - für Sie, Jess, vor allen
Ihre Klassenkameraden -
ist, um die Werte von x und y so tauschen dass wir wollen, dass die Orangensaft in die
andere Tasse und die Milch in dieser Schale, wie könnten Sie - bevor Sie tatsächlich tun
es - über das tun dies gehen?
>> OK, weise Entscheidung.
Sie müssen also ein bisschen mehr Speicher.
Also lasst uns zuteilen eine temporäre Tasse, wenn man so will.
Und jetzt gehen Sie nach x und y vertauschen.
>> Excellent.
Also sehr gut gemacht.
Vielen Dank, Jess.
Hier, bitte.
Ein kleines Souvenir.
>> OK, so offensichtlich, super einfache Idee.
Ganz intuitiv, dass wir ein bisschen brauchen mehr Stauraum - in dieser Form
a cup - wenn wir wirklich wollen, tauschen diese beiden Variablen.
Also lasst uns genau das tun.
Hier oben in zwischen, wo ich behaupte ich bin tun werden einige Swapping, werde ich
gehen Sie vor und erklären Temp.
Und ich werde es gleich gesetzt, sagen wir, x.
>> Dann werde ich den Wert ändern x wie Jess hat hier mit dem
Milch und Orangensaft um gleich y.
Und ich werde y ändern, um gleich nicht x, weil wir jetzt wäre
stecken in einem Kreis, sondern Temperaturber.
Wo kann ich vorübergehend - oder wo Jess zeitweise gab Orangensaft
vor clobbering dass Tasse mit der Milch.
>> Also lass mich gehen jetzt und machen Sie diese.
Es heißt noswap.c.
Und jetzt lassen Sie mich laufen keine Swap.
Und in der Tat sehe ich, wenn ich das erweitern Fenster ein wenig, dass
x 1 ist, y 2.
Und dann ist x 2 ist, y 1.
>> Aber daran erinnern, dass wir am Montag, Dinge tat ein wenig anders, wobei ich
Statt implementiert eine Hilfsfunktion, wenn man so will, das war eigentlich nichtig.
Ich nannte es tauschen.
Ich gab es zwei Parameter, und ich rief sie ein und ich nannte sie b.
>> Ehrlich gesagt, könnte ich nenne sie x und y.
Es gibt nichts zu stoppen mich zu tun.
Aber ich würde behaupten, es ist dann ein wenig zweideutig.
Weil Rückrufaktion für Montag, dass wir behauptet, dass diese Parameter waren
Kopien der übergebenen Werte in.
So ist es nur verwirrt mit Ihrem Geist, denke ich, wenn Sie
genau die gleichen Variablen.
>> Also werde ich stattdessen nennen sie ein und b, nur für Klarheit.
Aber wir könnten sie am meisten alles, was wir wollen.
Und ich werde das Kopieren und Einfügen effektiv dieser Code von dort oben
hinunter in hier.
Weil ich gerade gesehen, dass es funktioniert.
Also das ist ziemlich gut in Form.
Und ich werde mein x auf eine, mein x ändern ein, mein y b und mein y zu b.
>> Mit anderen Worten, genau die gleiche Logik.
Die exakt gleiche Sache, dass Jess tat.
Und dann das einzige, was ich tun muss, bis hier, natürlich, wird nun diese aufrufen
Funktion oder rufen Sie diese Funktion.
Also werde ich diese Funktion mit zwei nennen Eingänge, x und y, und drücken Sie auf Speichern.
>> Alles klar, also grundlegend dasselbe.
In der Tat habe ich wahrscheinlich das Programm gemacht unnötig kompliziert durch
Schreiben Sie eine Funktion, die gerade dabei ist etwa sechs Codezeilen während ich
zuvor umgesetzt dies in nur drei.
>> Also lassen Sie mich jetzt gehen Sie vor und Remake dies, machen keinen Swap.
Alles klar, schraubte ich hier oben.
Dies sollte ein Fehler sein, dass Sie vielleicht sehen zunehmend häufig als
Programme werden immer komplexer.
Aber es gibt eine einfache Lösung.
Lassen Sie mich zurück blättern hier.
>> Und was ist der erste Fehler, den ich sehe?
Implizite Deklaration.
Was bedeutet das in der Regel an?
Oh, ich vergaß, den Prototyp.
Ich habe vergessen, den Compiler zu lehren, dass Swap wird zu existieren, obwohl er
nicht am Anfang vorhanden des Programms.
Also ich bin gerade dabei, Leere, Swap sagen, int, int a b, Semikolon.
>> Also ich bin nicht dabei, es neu zu implementieren.
Aber jetzt passt es, was hier unten.
Und beachten Sie, das Fehlen von einem Semikolon hier ist das nicht notwendig, wenn
Umsetzung.
>> Also lassen Sie mich dieses Remake, keinen Swap.
Viel besser in Form.
Führen Sie keine Swap.
Und verdammt noch mal.
Jetzt sind wir wieder da, wo wir am Montag waren, wo das Ding nicht tauschen.
>> Und was ist der intuitive Erklärung dafür, warum dies der Fall ist?
Ja?
>> STUDENT: [unverständlich].
>> DAVID MALAN: Genau.
So a und b sind Kopien von x und y.
Und in der Tat, jedes Mal, du warst Aufruf einer Funktion so weit, dass
übergibt Variablen wie ints -
nur als Swap wird hier erwartet -
Sie Jungs haben in Exemplaren vorbei.
>> Nun, das bedeutet, es dauert ein wenig Zeit, den Bruchteil einer Sekunde, für die
Computer, um die Bits von einem kopieren Variable in den Bits des anderen.
Aber das ist nicht so eine große Sache.
Aber sie sind dennoch eine Kopie.
>> Und nun, im Rahmen der Swap- Ich bin in der Tat erfolgreich
Ändern eines und b.
In der Tat, wir tun, eine schnelle Plausibilitätsprüfung.
Print f a ist% i, neue Zeile.
Und lassen Sie den Stecker in eine.
Jetzt machen wir dasselbe mit b.
Und lassen Sie uns das gleiche tun hier.
>> Und jetzt lassen Sie mich kopieren die gleichen Linien wieder an der Unterseite der Funktion
nachdem meine drei Zeilen interessant konnte nicht ausgeführt haben und
ausdrucken a und b noch einmal.
So, jetzt lasst uns diese zu machen, machen Sie keinen Swap.
Lassen Sie mich das Terminal-Fenster ein etwas größer, so dass wir sehen können
mehr davon auf einmal.
>> Und laufen keine Swap.
x 1 ist, y 2. a 1 ist, b 2.
Und dann, a 2 ist, b 1.
Also es funktioniert, so wie Jess hat hier innerhalb von Swap.
Aber natürlich ist es keine Wirkung auf die Variablen in main.
>> So sahen wir einen Trick, wobei wir könnte dies zu beheben, nicht wahr?
Wenn Sie mit dieser Scoping konfrontiert Problem, Sie könnten nur Kahn und machen x
und y, welche Art von Variablen statt?
>> Sie könnten sie global.
Setzen Sie sie ganz am Anfang der Datei wie wir, auch im Spiel von 15 Jahren.
Wir verwenden eine globale Variable.
Aber im Zusammenhang mit dem Spiel eine 15, Es ist sinnvoll, einen globalen haben
Variable, die den Vorstand, weil die Gesamtheit der 15.c ist alles
über die Implementierung dieses Spiel.
Das ist, was die Datei zu tun gibt.
>> Aber in diesem Fall hier, ich bin Aufruf einer Funktion Swap.
Ich möchte zwei Variablen vertauschen.
Und es sollte beginnen zu fühlen, nur schlampig wenn die Lösung für alle unsere
Probleme, wenn wir in den Bereich laufen Fragen ist es global.
Da sehr schnell unser Programm gehen, um eine ziemliche Sauerei werden.
Und wir haben das sehr sparsam als Ergebnis in 15.c.
>> Aber es stellt sich heraus, es gibt eine besser ganz.
Lassen Sie mich tatsächlich zurück und löschen Sie die drucken f die, nur um diesen Code zu vereinfachen.
Und lassen Sie mich vor, dies ist in der Tat schlecht.
Aber wenn ich stattdessen in einigen Sternchen hinzufügen und Sterne, kann ich stattdessen machen diese
Funktion in eine, die ist tatsächlich in Betrieb.
>> Also lass mich gehen zurück und sagen zugeben Sternchen ist immer schwierig,
so werde ich sagen Sterne.
Ich werde einfach erzähl ihm, dass man.
In Ordnung.
Und nun, was soll ich stattdessen tun?
>> Also zunächst einmal, ich werde angeben dass anstelle der Übergabe eines int in
die Swap-Funktion, bin ich stattdessen zu gehen, int Sterne sagen.
Nun, was die Sterne angeben?
Dies ist die Vorstellung von einem Zeiger, Binky, die claymation Charakter, war
Bezugnahme auf einen Moment vor.
>> Also, wenn wir sagen, int Sterne, die Bedeutung von Das ist nun, dass eine ist nicht zu sein
bestanden in durch seinen Wert.
Es wird nicht in. kopiert werden
Vielmehr ist die Adresse eines werde in. weitergegeben werden
>> So erinnern daran, dass im Inneren des Computers ist eine ganze Reihe von Speicher, sonst
bekannt als RAM.
Und das ist nur ein RAM ganze Reihe von Bytes.
Also, wenn Ihr Mac oder PC hat zwei Gigabyte, haben Sie 2
Milliarden Byte Speicherplatz.
>> Jetzt lasst uns einfach annehmen, dass nur die Dinge schön und ordentlich, wir
eine Adresse zuweisen -
eine Zahl -
zu jedem Byte des RAM in Ihrem Computer.
Die erste Byte von denen 2 Milliarden von Zahl Null.
Der nächste ist Byte-Nummer eins, Nummer zwei, den ganzen Weg bis auf, dot dot
punkt, um rund 2 Milliarden Euro.
>> So können Sie Anzahl der Bytes Arbeitsspeicher in Ihrem Computer.
Nehmen wir also an, dass das ist, was wir unter einer Adresse.
Also, wenn ich sehe, int Sterne ein, was los ist in Swap bestanden jetzt ist die
Adresse ein.
Nicht der Wert, sondern unabhängig von ihrer Post Adresse ist, so zu sprechen -
seine Lage im RAM.
>> Und in ähnlicher Weise für b, ich werde um die gleiche Sache zu sagen.
Int, star, b.
Nebenbei, technisch den Stern könnte auch in anderen Orten zu gehen.
Aber wir werden auf den Stern, wobei standardisieren direkt neben dem Datentyp.
>> So tauschen Unterschrift bedeutet jetzt, gib mir die Adresse einer int, und rufen
Diese Adresse ein.
Und gib mir noch eine Adresse ein int und rufen Sie diese Adresse b.
>> Aber jetzt mein Code hier muss sich ändern.
Denn wenn ich erklären int Temp -
Das ist immer noch der Typ int -
aber ich speichern in es ein, welche Art von Wert?
Um klar zu sein, setze ich ein a mit der Code geschrieben gerade jetzt?
>> Ich stelle den Standort in ein.
Aber ich weiß nicht über die Pflege Lage jetzt, nicht wahr?
Temp existiert nur Jess 'dritte Tasse existierte, zu welchem ​​Zweck?
Um einen Wert zu speichern.
Milch oder Orangensaft.
Nicht um tatsächlich speichern Sie die Adresse des entweder von diesen Dingen, fühlt sich das ein
wenig unsinnig in dieser realen Welt Kontext sowieso.
>> Also wirklich, was ich will, um in Temp setzen ist nicht die Adresse von A, aber der
Inhalt einer.
Also, wenn a eine Zahl wie 123, ist das 123. Byte Speicher, dass ein gerechter
passiert zu sein Besatzungsmacht, dass der Wert in ein zufällig Besatzungsmacht.
>> Wenn ich will, um an diese Adresse gehen, Ich muss sagen, ein Stern.
Ebenso wenn ich zu ändern, was unter der Adresse ein, ändere ich
diese zu starten ein.
Wenn ich will, was ist im Laden Lage ein mit dem, was an der Stelle
bei b, b-Sterne-Sterne-Hotel.
>> Also kurz gesagt, auch wenn dies nicht ganz Einsinken noch - und ich würde nicht erwarten,
dass es würde so schnell -
erkennen, dass alles, was ich mache, ist das Präfix diese Sterne zu meinem Variablen
Sprichwort greifen Sie nicht die Werte.
Ändern Sie nicht die Werte.
Sondern an diese Adressen gehen und erhalten Sie den Wert.
Gehe zu dieser Adresse und Wandel der Wert gibt.
>> So, jetzt lassen Sie mich zurück blättern bis an die Spitze, nur um diese Linie hier zu fixieren, um
ändern Sie den Prototyp übereinstimmen.
Aber ich muss nun eine andere Sache zu tun.
Intuitiv, wenn ich die Typen geändert der Argumente, die Swap erwartet,
Was brauche ich, um ändern in meinem Code?
>> Wenn ich Swap nennen.
Denn gerade jetzt, was ich Ich Weitergabe noch tauschen?
Der Wert x und der y-Wert, oder die Milch und der Orangensaft.
Aber ich will nicht zu tun.
Ich möchte stattdessen in dem, was passieren?
Die Lage von x und die Position von Y.
Was sind ihre Kontaktdaten wie Postanschriften, sozusagen.
>> So zu tun, gibt es ein kaufmännisches.
Ampersand Art klingt Adresse.
so n, kaufmännisches, die Adresse von x und die Adresse y.
So ist es, dass wir bewusst nutzen kaufmännische beim Aufruf der Funktion,
und die Sterne bei der Deklaration und wenn Umsetzung der Funktion.
>> Und gerade von kaufmännisches denken, wie die Anschrift des Betreibers, und Stern als die
dorthin Betreiber -
oder besser, die Dereferenzierungsoperator.
Also das ist eine ganze Menge von Wörtern, nur um sagen, dass jetzt, hoffentlich, swap wird
richtig zu sein.
>> Lassen Sie mich voran gehen und -
wir tatsächlich die Datei umbenennen, damit dieses Programm noch nicht genannt Swap werden.
Ich behaupte, dass wir nennen es jetzt swap.c.
So machen, tauschen.
Dot, Slash, tauschen.
>> Und jetzt ja x 1 ist, y 2.
Und dann, x 2 ist, y ein.
Nun lassen Sie uns sehen, ob wir nicht tun können, dieses eine wenig anders, was ist
hier los ist.
Lassen Sie mich zunächst vergrößern auf unserer Zeichnung Bildschirm hier.
Und lassen Sie mich für einen Moment schlagen - und wenn ich hier ziehen wird gespiegelt werden
jetzt da oben - lassen Sie mich schlagen vor, dass hier ist eine ganze Reihe von Speicher oder
RAM, innerhalb meines Computers.
>> Und dies wird Biss Zahl sein, sagen wir, 1.
Dies wird bytes Nummer 2 sein.
Und ich werde eine ganze Reihe mehr zu tun, und dann eine Reihe von Punkten zu dot dot
zeigen, dass es 2 Mrd. von diesen Dingen.
4, 5, und so weiter.
>> So gibt es die ersten fünf Bytes meiner Arbeitsspeicher des Computers.
Alles klar?
Sehr wenige von insgesamt 2 Milliarden Euro.
Aber jetzt werde ich vorschlagen der folgende.
Ich werde vorschlagen, dass x zu gehen speichern die Zahl 1, und y wird
um die Nummer 2 zu speichern.
Und lassen Sie mich jetzt gehen und stellt diese Werte wie folgt.
>> Wir tun dies wie folgt.
Gib mir nur eine Sekunde.
Eine Sekunde.
OK.
Ich möchte diese ein wenig zu machen -
lasst uns wieder tun.
Ansonsten bin ich zu gehen und mit Hilfe der gleichen Zahlen, unabsichtlich,
mehrfach.
>> Also nur so haben wir verschiedene Zahlen darüber zu sprechen, nennen wir dieses Byte
Nummer 123, 124, 125, 126, und dot dot dot.
Und lassen Sie mich jetzt behaupten, dass ich zu gehen setzen den Wert 1 hier, und den Wert 2
hier auch als x und y bezeichnet.
So ist es einfach so passiert, dass dies ist x, y ist.
>> Und nur durch einige zufällige Chance, die Computer, das Betriebssystem,
passiert an der Stelle x setzen Nummer 123.
Und y endete an der Stelle 124 -
verdammt.
Ich sollte dieses Problem behoben haben.
Oh Mann, ich wirklich wollen, dies zu tun?
Ja, ich möchte dies und beheben b ordnungsgemäße heute darüber.
Sorry, neu in diesem.
>> 127, 131, und ich wollte nicht das sein komplex, aber warum habe ich das ändern
Zahlen gibt es?
Weil ich möchte, dass die ints zu tatsächlich vier Bytes.
Lassen Sie uns also über diese Super anal sein.
So dass, wenn 1 geschieht behandelt werden 123, wird die 2 in Zukunft an-Adresse sein
127, weil es nur 4 byes entfernt.
Das ist alles.
Und wir werden über all das vergessen andere Adressen in der Welt.
>> So ist an der Stelle x 123, y ist an der Stelle 127.
Und nun, was mache ich eigentlich wollen Sie tun?
Wenn ich Swap rufen jetzt an, was eigentlich los?
Nun, als ich Swap nennen, ich bin im Vorbeigehen die Adresse x und die Adresse y.
So zum Beispiel, wenn diese beiden Teile Papier stellen nun die beiden
Argumente a und b zu tauschen, was bin ich gehen auf die erste von ihnen zu schreiben,
was ich werde rufen beziehen, wie ein?
>> Genau, 123.
Also das ist ein Ich behaupte.
Dies ist der Parameter ein.
Ich setze die Adresse x drin.
>> Was ist das?
>> Nein, nein.
Das ist OK.
Immer noch gut, immer noch gut.
Das ist also ein.
Und jetzt auf dem zweiten Blatt Papier, das wird b, und was bin ich
gehen auf sein Schreiben dieses Stück Papier?
127.
>> Also das einzige, was sich geändert hat seit unsere bisherigen Erzählen dieser Geschichte ist,
anstatt buchstäblich 1 und 2, ich bin gehen, um in 123 und 127 passieren.
Und ich gehe jetzt, um diese nach innen setzen von dieser Box, alles in Ordnung?
So, dass Black Box stellt nun die Swap-Funktion.
>> Inzwischen haben wir uns jetzt jemand Umsetzung der Swap-Funktion.
Wäre jemand hier oben gerne freiwillig?
Komm up.
Wie ist dein Name?
Charlie.
Alles klar, Charlie.
Komm up.
>> So Charlie spielen wird die Rolle der Black Box.
Und Charlie, was ich möchte, dass Sie tun Jetzt ist Swap so umsetzen
dass angesichts dieser beiden Adressen Sie wurden eigentlich los
, um die Werte zu ändern.
Und ich werde in dein Ohr flüstern wie die TV hier laufen.
>> Also los, und du bist der Blackbox.
Reichweite drin.
Welche Werte haben Sie für ein zu sehen, und welche Werte Sie für b sehen?
>> CHARLIE: a 123 und b 127.
>> DAVID MALAN: OK, genau.
Jetzt gibt es eine Pause für einen Moment.
Das erste, was Sie jetzt tun wollen, entsprechend dem Code - die
Ich werde jetzt nach oben ziehen auf dem Bildschirm -
sein wird, um ein wenig verteilen wenig Speicher namens Temp.
Also werde ich weitermachen und Ihnen, dass der Speicher.
>> Also das wird eine dritte Variable Sie haben Zugang zu
Sie rief Temp.
Und was willst du schreiben auf dem Temp Stück Papier?
>> CHARLIE: Zeiger, nicht wahr?
>> DAVID MALAN: OK, gut nicht unbedingt Zeigern.
Also die Codezeile, dass ich hervorgehoben auf der rechten Seite,
Beginnen wir dort.
Er sagt, ein Stern.
So ist derzeit eine Speicherung die Zahl 123.
Und gerade intuitiv, was hat 123 Sterne bedeuten?
>> Aber speziell, wenn a 123, bedeutet Stern was?
Der Wert von a.
Oder eher beiläufig, dorthin zu gehen.
Also lassen Sie mich schlagen, dass ein Halten der in Ihre Hand, gehen Sie vor und behandeln, dass
als ob es eine Karte.
Und gehen Sie über den Computer Speicher und finden uns, was
an Position 123.
Genau.
>> Also haben wir an der Stelle 123 zu sehen ist das, was offensichtlich?
OK, also was Wert jetzt bist du werde in Temp setzen?
Genau.
So gehen Sie vor und tun.
Und schreiben Sie die Nummer 1 auf dem Stück Papier, das derzeit Temp ist betitelt.
>> Und nun der nächste Schritt, dass du gehst zu implementieren
wird, was sein.
Nun, auf der rechten Seite des nächste Codezeile ist star b. b, der
Natürlich speichert eine Adresse.
Das 127 Adressen.
Stern b bedeutet, was, salopp gesagt?
>> Gehen Sie zu dieser Stelle.
So gehen Sie vor und finden uns, was an Position 127.
OK.
Natürlich an der Stelle 127, noch den Wert 2.
Also, was willst du jetzt lagern bei was auch immer ist an der Stelle in ein?
So star ein Mittel, um den Standort einer gehen.
Was ist die Lage ein?
>> Genau.
So jetzt, wenn Sie ändern möchten, Was ist an dieser Stelle -
Ich werde weitermachen und laufen der Radiergummi sind hier.
Und nun legte sie zurück auf die Bürste.
Welche Zahl wollen Sie schreiben in diesem leeren Kasten jetzt?
>> Genau.
Also diese Codezeile, klar zu sein - lassen mich anhalten, was Charlie tun und
hier darauf hinweisen, was er gerade getan ist schreiben in diesem Feld an Position 123
der Wert, der zuvor bei b war.
Und so haben wir jetzt umgesetzt Tat Diese zweite Code.
>> Nun leider ist noch eine Zeile übrig.
Nun, was ist in temp, wörtlich?
Es ist natürlich die Nummer eins.
Das ist nicht eine Adresse.
Es ist nur eine Zahl, Art eine Variable von einer Woche.
>> Und jetzt, wenn Sie sagen star b, das bedeutet, rufen Sie die Adresse b, ist die von
Kurs hier.
Also, wenn Sie dort ankommen -
Ich werde weitermachen und löschen, was ist eigentlich gibt - und was sind Sie
denn jetzt schreiben an der Stelle 127?
>> CHARLIE: Temp, die man ist.
>> DAVID MALAN: Temp, die man ist.
Und was passiert mit Temp am Ende?
Nun, wissen wir nicht wirklich wissen.
Wir wissen nicht wirklich kümmern.
Jedes Mal, wenn wir eine Funktion implementiert haben so weit, alle lokalen Variablen, die Sie haben
sind in der Tat lokalen.
Und sie einfach verschwinden.
Sie sind durch das Betriebssystem freigegeben System schließlich.
>> Also die Tatsache, dass die Temperatur noch Wert 1 ist eine Art grundlegend
uninteressant für uns.
Alles klar, so ein Applaus wenn wir es könnten für Charlie.
Sehr gut gemacht.
>> Alles klar, so was tut mehr dies bedeuten, was wir tun können?
So stellt sich heraus, dass wir waren erzählt ein paar weiße Lügen
seit geraumer Zeit.
Tatsächlich stellt sich heraus, dass eine Zeichenfolge, all dieser Zeit ist nicht wirklich ein
Folge von Zeichen per se.
Es Art ist, dass intuitiv.
>> Aber technisch gesehen ist ein String Datentyp, dass wir innerhalb der angegebenen
der CS50-Bibliothek, um die Welt zu vereinfachen für die ersten paar Wochen der Klasse.
Was ist wirklich ein String ist die Adresse eines Zeichens irgendwo in RAM.
Ein String ist wirklich eine Nummer, wie 123 oder 127, die Abgrenzung geschieht
wo ein String beginnt Arbeitsspeicher Ihres Computers.
>> Aber es gibt nicht die String, per se, sich.
Und wir können sehen, wie folgt.
Lassen Sie mich gehen Sie vor und eröffnen einige Code, der unter ist
heutigen Quellcode-Beispiele.
Und ich werde weitermachen und öffnen bis, sagen wir, zu vergleichen-0.C.
Dies ist ein Programm, das Buggy wird wie folgt implementiert werden.
>> Erste.
Ich werde etwas sagen.
Dann werde ich weitermachen und bekommen einen String vom Benutzer
in diesem nächsten Zeile.
Dann werde ich es wieder sagen.
Dann werde ich zum anderen zu gelangen String von dem Benutzer.
>> Und beachten Sie, zeige ich einer der Zeichenfolgen in einer Variablen namens s, und
andere dieser Strings in einer Variablen namens t.
Und jetzt werde ich Anspruch, sehr angemessen, dass, wenn s gleich gleich t,
die Saiten sind die gleichen.
Sie geben die gleiche Sache.
Else, sind die Saiten nicht dasselbe.
>> Nach allem, wenn wir zwei ints Eingang, zwei Zeichen, zwei Schwimmer, zwei Doppelzimmer, einem der
die Datentypen über die wir gesprochen haben bisher um diese zu vergleichen -
erinnern wir uns sehr klar vor einer Weile dass Sie dies nicht tun, weil eine
einfache Gleichheitszeichen ist natürlich der Zuweisungsoperator.
Also das wäre ein Fehler zu sein.
>> Wir verwenden die equal sign, die in der Tat vergleicht
Dinge für wahre Gleichberechtigung.
Aber ich behaupte, das ist buggy.
Wenn ich voran gehen und vergleichen Null, und dann haben dot Schrägstrich vergleichen Null.
Und ich schreibe in, sagen wir mal, hallo.
Und dann lassen Sie uns sagen, hallo wieder.
Buchstäblich die gleiche Sache, der Computer Ansprüche ich verschiedene Dinge getippt.
>> Jetzt vielleicht habe ich nur etwas vertippt.
Ich werde meinen Namen geben diese Zeit.
Ich meine, hallo.
Hallo.
Es ist anders, jede einzelne Zeit.
>> Nun, warum ist das so?
Was ist wirklich los unter der Haube?
Nun, was wirklich vor sich geht unter die Haube ist der String dann
Ich in dieser ersten Zeit zum Beispiel eingegeben ist das Wort hallo, natürlich.
Aber wenn wir stellen diese unter die Haube, daran erinnern, dass ein
String in einem Array.
Und wir haben so viel in der Vergangenheit gesagt.
>> Also, wenn ich das Array wie folgt zu ziehen, ich bin gehen, um etwas ganz repräsentieren
ähnlich dem, was wir haben vor einem Augenblick.
Und es ist tatsächlich etwas, besondere auch hier.
Was haben wir bestimmen, wurde bei das Ende jedes Strings?
Ja, diese Backslash Null, was ist nur die Art der Darstellung,
wörtlich: 00000000.
Acht Bits 0 in einer Reihe.
>> Ich weiß es nicht, ehrlich gesagt, was ist danach.
Das ist nur ein Haufen mehr RAM Innere meines Computers.
Aber dies ist ein Array.
Wir sprachen über Arrays vor.
Und wir in der Regel über Arrays reden als Standort Null,
dann eine, dann zwei.
Aber das ist nur für die Bequemlichkeit.
Und das ist ganz relativ.
>> Wenn Sie eigentlich immer Speicher aus der Computer, es ist natürlich jedem
2 Mrd. einige merkwürdige bytes, möglicherweise.
Also wirklich unter der Haube, all dieser Zeit, ja.
Dies könnte sehr gut Klammer Null sein.
Aber wenn man noch tiefer graben unter die Haube, das ist wirklich
Adresse Nummer 123.
Dies ist die Adresse 124.
Dies ist die Adresse 125.
>> Und ich habe nicht vermasseln diese Zeit.
Diese sind jetzt ein Byte abgesehen aus welchem ​​Grund?
Wie groß ist ein char?
Ein char ist nur ein Byte.
Ein int ist in der Regel vier Bytes.
Also das ist, warum ich es 123 gemacht, 127, 131 und so weiter.
Jetzt kann ich halten die Mathematik einfacher und genau das zu tun plus 1.
Und das ist jetzt, was wirklich vor sich geht auf unterhalb der Haube.
>> Also, wenn Sie erklären, so etwas wie dieses, string s, das ist eigentlich -
es stellt sich heraus -
char Stern.
Star, bedeutet natürlich, Adresse, aka Zeiger.
So ist es die Adresse von etwas.
Was ist die Adresse?
>> Well -
Ich bin der einzige, der die sehr sehen können wichtiger Punkt, den ich mache, oder denken
Ich mache.
So string -
Das Traurige daran ist, ich habe einen Monitor genau dort, wo ich
konnte sehen, dass haben.
>> Alles klar, also string s ist, was Ich erklärte zuvor.
Aber es stellt sich heraus, dank eines kleinen Magie in der CS50-Bibliothek, alle diese
Zeit-String hat buchstäblich gewesen char Stern.
Der Stern bedeutet wiederum, Zeiger oder Adresse.
Die Tatsache, dass es die flankierenden Wort char bedeutet, dass es die
Adresse eines Zeichens.
>> Also, wenn Sie Zeichenfolge aufgerufen wird, und ich geben in H-E-L-L-O, jetzt schlagen, was zu bekommen
String buchstäblich wieder alle dieses Mal, obwohl wir eher
vereinfacht die Welt?
Was macht String tatsächlich bekommen Rückkehr als Rückgabewert?
>> 123 in diesem Fall, zum Beispiel.
Wir haben vorher gesagt, dass den String gibt einfach ein String, eine Folge von
Zeichen.
Aber das ist ein bisschen wie ein Notlüge.
Die Art und Weise bekommen String wirklich funktioniert unter der Haube ist wird es ein
String von dem Benutzer.
Es plumpst die Zeichen, die er oder sie die im Speicher.
Es setzt einen Backslash Null am Ende jener Folge von Zeichen.
>> Aber was macht den String buchstäblich zurückkehren?
Es gibt buchstäblich die Adresse des ersten Bytes im RAM, dass
es verwendet dieser Stärke.
Und es stellt sich heraus, dass nur durch Rücksendung eine einzelne Adresse des
erste Zeichen in der Zeichenfolge, das ist ausreichend für die Suche nach der Gesamtheit
die Zeichenkette.
>> In anderen Worten, den String nicht bis 123 und 124 und 125 zurück.
Es muss nicht, um mir eine lange Liste aller Bytes,
meinen String verwendet.
Weil man, sie sind alle Rücken an Rücken.
Und zwei, an der ersten Adresse, wobei I herausfinden können, wo der String endet.
Wie?
>> Die spezielle Null-Zeichen, die Backslash Null am Ende.
Mit anderen Worten, wenn Sie umfahren -
innerhalb von Variablen -
die Adresse eines char, und Sie davon ausgehen, dass am Ende einer Zeichenfolge, einem
Folge von Zeichen, wie wir Menschen denken von Strings, wenn Sie davon ausgehen, dass
am Ende einer solchen Zeichenkette es ein Backslash Null, du bist golden.
Da finden Sie immer das Ende einer Zeichenkette.
>> Nun, was ist dann wirklich gehen auf in diesem Programm?
Warum ist das Programm, vergleichen-0.C, Buggy?
Was ist eigentlich verglichen?
Ja?
>> STUDENT: [unverständlich].
>> DAVID MALAN: Genau.
Es Vergleich der Standorte der Saiten.
Also, wenn der Benutzer eingetippt hallo einmal, wie ich, vielleicht Speicher landen
wie folgt aussehen.
Wenn der Benutzer dann in Arten Hallo nochmal, aber durch den Aufruf den String wieder, ist c
nicht besonders klug, wenn Sie lehren es, schlau zu sein, indem das Schreiben von Code.
>> C -
und Computer im Allgemeinen -
wenn man in dem Wort hallo wieder geben, Sie wissen, was Sie bekommen werden.
Sie sind gerade dabei, eine zweite Anordnung erhalten des Speichers, der, ja, passiert sein
Speichern von H-E-L-L-O und so weiter.
>> Es geht um das gleiche zu sehen uns Menschen, aber diese Adresse
vielleicht nicht 123 sein.
Es könnte nur so geschehen, dass die Betriebssystem verfügt über einige
Raum zum Beispiel an der Stelle -
sagen wir mal, etwas willkürlich, so ist die Lage 200.
Und dies ist die Lage 201.
Und dies ist die Lage 202.
Wir haben keine Ahnung, wo das ist gehen, um in Erinnerung sein.
>> Aber was das bedeutet, ist, dass das, was gehen, um letztlich in s gespeichert werden?
Die Zahl 123.
Was ist los in t gespeichert werden, in diesem Beispiel willkürlich?
Die Zahl 200.
Und das bedeutet dann ist offensichtlich, 123 nicht gleich 200 ist.
Und so ist dies, wenn die Bedingung nie wahr ausgewertet.
Weil get String wird mit verschiedenen Brocken von Speicher jeder Zeit.
>> Jetzt können wir sehen, diese wieder in einem anderen Beispiel.
Lassen Sie mich gehen Sie vor und eröffnen copy-0.C.
Ich behaupte, dass dieses Beispiel zu gehen versuchen - aber nicht - zu zwei Strings kopieren
wie folgt.
>> Ich werde etwas sagen an den Benutzer.
Ich bin dann werde eine bekommen Zeichenfolge und nennen es s.
Und jetzt, ich mache dieses Kontrollkästchen hier.
Wir erwähnten dies eine Weile zurück.
Aber wenn vielleicht bekommen String return null, ein anderes Sonderzeichen oder spezielle
Symbol sagen wir.
Wenn es aus der Erinnerung.
>> Zum Beispiel, wenn der Benutzer wirklich als schwierig und Typen ein grauenhaft
Anzahl der Zeichen in der Tastatur und trifft die Eingabetaste.
Wenn die Anzahl der Zeichen kann einfach nicht passen in RAM für was auch immer verrückt
Grund, gut erhalten Zeichenfolge könnten sehr gut null zurück.
>> Oder wenn Ihr Programm selbst wird dabei eine Menge andere Dinge, und es ist nur
Nicht genügend Speicher für den String erfolgreich zu sein, könnte es am Ende
bis Null zurückgegeben.
Aber lassen Sie uns genauer , was das ist.
Was ist s den Datentyp wirklich?
Char Stern.
>> So stellt sich heraus schälen wir können jetzt Sichern Sie die Ebene von null.
Es stellte sich heraus, ist null - ja, natürlich ein besonderes Symbol.
Aber was ist es wirklich?
Wirklich, es ist null nur ein Symbol, dass wir Menschen verwenden, um Null als gut vertreten.
>> So die Autoren C und Computer ganz allgemein entschieden Jahren
dass Sie wissen, was.
Warum gehen wir nicht gewährleisten, dass kein Benutzer Daten ist immer, immer, immer
gelagert bei Null bye?
In der Tat, auch in meinem beliebiges Beispiel vor, ich habe nicht die Nummerierung beginnen
Bytes auf Null.
Ich begann an einem.
Weil ich wusste, dass die Menschen in der Welt beschlossen, die Null behalten haben
Byte in niemandes RAM als etwas Besonderes.
>> Der Grund dafür ist, wann immer Sie wollen signalisieren, dass etwas schief gegangen ist
im Hinblick auf die Adressen, kehrte sie null - anders als Null bekannt -
und weil Sie wissen, dass es keine legit Daten an der Adresse Null, klar
das bedeutet einen Fehler.
Und das ist, warum wir durch Konvention, überprüfen für null und Rückkehr etwas
wie man in diesen Fällen.
>> Also, wenn wir jetzt nach unten zu blättern, ist dies nur dann einige Fehler geprüft, nur für den Fall
ging etwas mit [falsch? Patsche?]
insgesamt und das Programm beenden durch Rücksendung früh.
Diese Linie könnte nun umgeschrieben werden da dies, was bedeutet, was?
Auf der linken Seite, gib mir ein anderer Zeiger auf ein Zeichen, und nennen es t.
Was mache ich Speicherung innerhalb von t, basierend auf dieser eine Zeile Code?
>> Ich bin Speichern einer Lage.
Insbesondere die Lage das war in s.
Also, wenn der Benutzer in hallo eingegeben haben, und dass zuerst hallo geschieht, um am Ende
hier, dann wird die Zahl 123 ist gehen, um wieder aus zu bekommen
bespannen und gespeichert werden -
wie wir bereits gesagt -
in s.
>> Wenn ich jetzt noch erklären Zeiger auf ein char und nennen es t, welche Zahl ist
buchstäblich am Ende sich in t nach der Geschichte?
Also 123.
>> So technisch nun beide s und t werden, um die genaue zeigen
gleiche Stücke des Speichers.
So bemerken, was werde ich jetzt tun, um beweisen, dass dieses Programm buggy ist.
>> Zuerst werde ich Anspruch, mit ein Druck f, Kapital
die Kopie des Strings.
Dann werde ich ein wenig zu tun Fehlerprüfung.
Ich werde sicherstellen.
Lassen Sie uns dafür sorgen, dass der String t an ist mindestens größer als Null in der Länge,
so gibt es einige Zeichen gibt tatsächlich zu nutzen.
>> Und dann haben Sie erinnern sich vielleicht an diese von den vorherigen Beispielen.
2 oberen - das ist in die ctype.h Datei.
T Klammer Null gibt mir die Null Zeichen des Strings t.
Und 2 oberen des gleichen Wert, der Natürlich wandelt sie in Großbuchstaben.
>> So intuitiv, diese Linie hervorgehoben der Code ist Großschreibung des ersten
Brief in t.
Aber es ist nicht kapitalisieren, intuitiv, der erste Buchstabe s.
Aber wenn Sie im Voraus denken, was bin ich etwa, um zu sehen, wenn ich dieses Programm ausführen
und ausdrucken sowohl das Original, s, und die so genannte Kopie, t?
>> Sie sind eigentlich los, um die gleichen sein.
Und warum werden sie gleich sein?
Sie sind beide, die auf genau die gleiche Sache.
Also lasst uns dies tun.
>> Als Kopie Null.
Es kompiliert OK.
Lassen Sie mich laufen Kopie Null.
Lassen Sie mich etwas geben wie in hallo alle Kleinbuchstaben drücken Sie dann die Eingabetaste.
Und sie behauptet, dass sowohl die original s und die Kopie sind in der Tat identisch.
>> Also, was ist wirklich passiert?
Lassen Sie mich dieses Bild neu zeichnen nur um die Geschichte zu erzählen, in ein
etwas anders.
Was wirklich los ist unterhalb des Haube, wenn ich etwas erklären, wie
char Start s, oder String s, Ich bekomme einen Zeiger -
was passiert mit vier Bytes in der CS50 Gerät
und in einer Menge von Computern.
Und ich werde dieses s nennen.
Und dies hat derzeit einige unbekannten Wert.
>> Wenn Sie eine Variable deklarieren, es sei denn, Sie Sie setzen einen Wert gibt, der
weiß, was da ist.
Es könnte einige zufällige Folge von sein Bits von der vorherigen Ausführung.
Also, wenn ich in meinem Code-Zeile zu tun bekommen Schnur, und speichern Sie dann die Rückkehr
Wert in den String s irgendwie -
und wir werden schließlich abziehen, wie bekommen String funktioniert, irgendwie weist eine
Array, das sieht wohl ein bisschen wie diese.
H-E-L-L-O, Backslash Null.
>> Nehmen wir an, dass diese Adresse ist 123 nur erste Konsistenz.
So bekommen Zeichenfolge zurückgibt, in der hervorgehobene Zeile gibt, gibt es das
Zahl haben wir gesagt, 123.
Also, was wirklich geht in der s hier?
>> Nun, was wirklich geht innerhalb von 123 s liegt.
Aber ehrlich gesagt, bin ich immer ein wenig verwirrt von all diesen Adressen
alle diese beliebige Zahlen.
123, 124, 127.
Lassen Sie uns also tatsächlich vereinfachen die Welt ein kleines bisschen.
>> Wenn wir über Zeiger sprechen, ehrlich gesagt, zu uns Menschen, wer zum Teufel kümmert, wo
Dinge sind in Erinnerung?
Das ist völlig willkürlich.
Es wird, wie abhängig viel RAM hat der Benutzer.
Es wird davon abhängen, wann in den Tag Sie das Programm, vielleicht, und
Welchen Input der Anwender gibt Ihnen.
Wir sind Wohnung auf unwichtige Details.
>> Also lasst uns abstrahieren und sagen, dass, wenn Sie eine Codezeile wie diese,
char Sterne s bekommt die Rückkehr Wert von get-String.
Warum gehen wir nicht stattdessen nur zeichnen, was wir halten Aufruf einen Zeiger, als ob es
deutete auf etwas?
Also ich behaupte jetzt, dass s up Es ist ein Zeiger -
unter der Haube, es ist eine Adresse.
Aber es ist nur darauf zu das erste Byte in der
String Das ist zurückgegeben worden.
>> Wenn ich jetzt auf den Code hier zurückzukehren, was los ist in dieser Zeile?
Nun, in diesem hervorgehobene Zeile jetzt, Ich bin anscheinend ein anderer erklärt
Variable namens t.
Aber es ist auch ein Zeiger, so werde ich um es als in der Theorie zu ziehen, die genaue
gleiche Größe Box.
Und ich werde es nennen t.
>> Und jetzt, wenn wir zurück zu den Code erneut ein, wenn ich speichern drin von t,
was bin ich technisch Putting Innenseite t?
Nun technisch, diese war die Zahl 123.
Also wirklich, ich sollte schriftlich die Zahl 123 gibt.
Aber nehmen wir es höhere Ebene.
t, wenn es nur ein Zeiger, intuitiv, ist genau dies.
Das ist alles, was ist gespeichert drin.
>> So, jetzt in den letzten Zeilen interessant der Code, wenn ich tatsächlich über gehen
Aktivierung des Null Charakter in t, was ist los?
Nun, das ist t Klammer Null deuten nun zu dem, was Charakter, vermutlich?
>> Es ist zu h zeigt.
Da t Klammer Null -
erinnern, ist dieses alte Syntax. t Halterung Null bedeutet nur, wenn t ist eine Zeichenfolge, t
Klammer Null bedeutet, dass man die Null Charakter in dieser Stärke.
Also, was das wirklich bedeutet wird auf diesem Array gehen -
und ja, könnte dies 123, dies könnte 124 sein.
Aber es ist alles relativ, erinnern.
Immer, wenn es um ein Array, haben wir der Vorteil des Sprechens über
relativen Indizes.
>> Und nun können wir einfach davon ausgehen, dass t Klammer Null ist h.
Also, wenn ich 2 oberen fordern sie auf, was das ist wirklich tun, ist Kapital
die Kleinbuchstaben h in Großbuchstaben H. Aber natürlich, was ist s?
Es ist auf die gleiche verflixte String zeigt.
>> Also das ist alles, was geschehen ist in diesem Code so weit.
Also, was ist dann die Implikation?
Wie können wir diese beiden Probleme zu beheben?
Wie reagieren wir auf aktuelle Zeichenfolgen zu vergleichen?
>> Nun intuitiv, wie würde Sie gehen über den Vergleich von zwei
Saiten für echte Gleichstellung?
>> Was bedeutet es, wenn zwei Strings sind gleich?
Offenbar nicht, dass ihre Adressen sind gleich in Erinnerung, denn das ist eine geringe
Implementierung auf Details.
Alle Figuren sind die gleichen.
Also lassen Sie mich schlagen, und lassen Sie mich in der Version eines compare.c
hier, so vergleichen-1.c.
>> Lassen Sie mich vorschlagen, dass wir immer noch ein Pointer aufgerufen s, und speichern Sie in der es
Rückgabewert von get-String.
Machen wir das Gleiche mit t.
So kein Code unterscheidet.
Ich werde ein wenig hinzufügen mehr Fehlerprüfung jetzt.
So, jetzt haben wir eine Art Peeling wieder da bist diese Schichten in CS50 von dem, was ein String
tatsächlich ist, müssen wir mehr anal darum, dass wir nicht missbrauchen
ungültige Werte wie null.
>> Also ich bin gerade dabei, zu überprüfen.
Wenn s nicht gleich null und t nicht gleich null, das heißt, wir sind OK.
Lass String nicht vermasseln bekommen eine dieser Zeichenfolgen.
Und Sie können jetzt vielleicht erraten, was hat STR CMP vermutlich tun?
String zu vergleichen.
>> Also, wenn Sie in Java-Programm vor, Das ist wie die Methode equals in der
String-Klasse.
Aber für diejenigen von Ihnen, die nicht über programmiert vor,
dies ist nur ein c-Funktion.
Es passiert in einem kommen Datei namens string.h.
Das ist, wo es erklärt.
>> Und String vergleichen -
Ich tatsächlich vergessen, ihre Nutzung, aber egal, dass.
Daran erinnern, dass wir tun können Mann, rühren zu vergleichen.
Und das wird, um das Fenster Linux-Programmierer Handbuch.
Und es ist, ehrlich gesagt, ein wenig kryptisch.
Aber ich kann sehen, dass, yep.
Ich muss string.h gehören.
>> Und er sagt, hier unter Beschreibung ", die String Vergleichsfunktion vergleicht
die beiden Strings S1 und S2. "Und S1 und S2 sind offenbar die beiden
Argumente übergeben in.
Ich glaube nicht wirklich daran erinnern, was const ist, aber jetzt bemerken -
und Sie können diese schon gesehen haben, wenn Sie haben mit den man-Seiten, wenn Sie
haben sie alle -
dass char Stern ist eben auch mit einer Schnur.
>> So vergleicht die beiden Strings S1 und S2, und es gibt eine ganze Zahl weniger
gleich oder größer als Null ist wenn S1 festgestellt wird bzw. werden
weniger als oder entsprechen, oder größer als S2.
Das ist nur ein sehr komplexer Art zu sagen, diese Zeichenfolge vergleichen Renditen
Null, wenn zwei Saiten sind intuitiv identisch, Zeichen für
Zeichen für Zeichen.
>> Es gibt eine negative Zahl, wenn s, alphabetisch soll
vor t kommen.
Oder gibt eine positive Zahl, wenn s soll nach t kommen
alphabetisch.
Also mit dieser einfachen Funktion, könnte Sie, zum Beispiel, eine sortieren
ganze Reihe von Wörtern?
>> So in dieser neuen Version, ich werde gehen Sie vor und machen compare1.
Dot Slash vergleichen ein.
Ich werde in hallo alle in Kleinbuchstaben eingeben.
Ich werde in hallo geben in Kleinbuchstaben wieder.
Und jetzt ist es zum Glück erkennt Ich tippte die gleiche Sache.
>> Inzwischen, wenn ich schreibe in hallo in unteren Fall und hallo in Groß-und
vergleichen sie, tippte ich verschiedene Dinge.
Denn nicht nur die Adressen anders, aber wir vergleichen
verschiedene Charaktere wieder und wieder.
>> Nun lasst uns gehen und beheben eine andere Problem jetzt.
Lassen Sie mich eröffnen Version eines Kopie, die jetzt behandelt
diese Frage wie folgt.
Und dieser geht zu schauen ein wenig komplizierter.
Aber wenn Sie darüber nachdenken, was wir Problem lösen müssen, hoffentlich wird dies
klar in nur einem Augenblick jetzt.
>> Also das erste Zeile, char Start t, in juristischer Hinsicht könnte jemand vorschlagen
was diese Zeile bedeutet hier?
Char star t, was ist das denn?
>> Gut.
Erstellen Sie einen Zeiger auf einige Ort im Speicher.
Und lassen Sie mich zu verfeinern es ein wenig.
Deklarieren Sie eine Variable, die gespeichert werden Adresse irgendeiner char in Erinnerung, nur
zu sein, ein wenig mehr richtig.
>> OK, so dass nun auf der rechten Seite, ich habe noch nie gesehen eine dieser Funktionen
vor, malloc.
Aber was könnte das bedeuten?
Zuweisung von Speicher.
Speicherzuweisung.
>> So stellt sich heraus, bis jetzt, wir haben nicht wirklich eine leistungsfähige Methode der
fragt das Betriebssystem, gib mir etwas Speicher.
Vielmehr haben wir jetzt eine Funktion namens malloc, die genau das tut.
Auch wenn dies ein bisschen ein Ablenkung gerade feststellen, dass in
zwischen den beiden Klammern gerade dabei, eine Zahl sein.
Wo habe ich in Frage eingegeben Markierungen können eine Zahl sein.
>> Und diese Zahl bedeutet, gib mir 10 Byte.
Gib mir 20 Byte.
Gib mir 100 Bytes.
Und malloc wird sein Bestes tun fragen des Betriebssystems -
Linux, in diesem Fall -
hey, sind ihre 100 Bytes RAM zur Verfügung?
Wenn dem so ist, kehren diese Bytes, die mir von Rücksenden der Adresse, welche der
diese Bytes, vielleicht?
Die allererste.
>> So auch hier - und das ist vorherrschende in C, zu jeder Zeit, du bist
Umgang mit Adressen?
Sie sind fast immer den Umgang mit der erste derartige Adresse, egal wie groß
ein Teil des Speichers Sie werden zurückgab, so zu sprechen.
>> Also lasst uns hier zu tauchen.
Ich versuche zu vergeben, wie viele Bytes, genau?
Well.
String Länge s - lassen Sie uns tun ein konkretes Beispiel.
Wenn s hallo ist, H-E-L-L-O, was ist das String-Länge von s, natürlich?
So ist es fünf.
Aber ich mache ein plus 1 auf, dass, warum?
Warum will ich sechs Bytes statt fünf?
Das Null-Zeichen.
>> Ich will nicht aufhören, diese besondere null Charakter.
Denn wenn ich eine Kopie Hallo und nur tun, H-E-L-L-O, aber ich weiß nicht setzen
Der besondere Charakter der Computer vielleicht nicht, durch Zufall, ein Backslash
Null für mich da.
Und so, wenn ich versuche, herauszufinden, die Länge der Kopie, könnte ich denken, dass
es ist 20 Zeichen lang sein, oder eine Million Zeichen lang sein, wenn ich nur nie passieren
einen Backslash Null getroffen.
>> Also brauchen wir sechs Byte zu speichern H-E-L-L-O, Backslash Null.
Und dann ist dies nur bis hin zu super anal sein.
Angenommen, dass ich vergessen, was die Größe eines char ist.
Wir sagen immer, es ist ein Byte.
Und es ist in der Regel.
Theoretisch könnte es etwas sein unterschiedliche, auf einem anderen Mac oder
anderen PC.
>> So stellt sich heraus, es gibt dieser Operator genannt sizeof dass, wenn Sie passieren sie die
Name eines Datentyps - wie char oder int oder float -
es wird Ihnen sagen, dynamisch, wie viele Bytes, die ein char nimmt auf diese
bestimmten Computer.
>> Das ist also effektiv nur wie gesagt mal 1 oder
mal überhaupt nichts.
Aber ich mache es nur zu super anal sein, nur für den Fall, dass ein char unterscheidet
auf Ihrem Computer im Vergleich zu mir, auf diese Weise die Mathematik wird immer heraus zu überprüfen.
>> Schließlich hier unten ich für null zu überprüfen, Das ist immer ratsam - wieder
Immer, wenn wir mit Zeigern zu tun haben.
Wenn malloc war nicht in der Lage zu geben, mir sechs byes - das ist
unwahrscheinlich, aber nur für den Fall -
zurückzukehren man sofort.
Und jetzt gehen Sie vor und kopieren die Zeichenkette wie folgt.
Und das ist vertraut Syntax wenn auch in einer anderen Rolle.
>> Ich werde weiter zu machen und die Zeichenfolge Länge s und speichern sie in n.
Ich bin dann werde durchlaufen von i gleich Null bis einschließlich n,
größer als oder gleich.
So dass bei jeder Iteration, habe ich die i-te Zeichen von s in der i-ten
Charakter t.
>> Also, was wirklich vor sich geht unter die Haube hier?
Nun, wenn dies zum Beispiel, ist s -
und ich habe in dem Wort H-E-L-L-O eingegeben und es gibt ein Backslash Null.
Und wieder ist dies zeigt s hier.
Und hier ist jetzt t.
>> Und dies zeigt jetzt auf eine Kopie des Gedächtnisses, nicht wahr?
Malloc hat mir eine ganze Teil des Speichers.
Ich weiß nicht, was zunächst in jeder dieser Positionen.
So werde ich von ihnen als denken eine ganze Reihe von Fragezeichen.
>> Aber sobald ich beginne Looping von Null auf bis über die Länge s, t
Klammer Null und t Halterung 1 -
und ich werde das jetzt setzen auf dem Overhead -
t und s Null Halterung Halter Null bedeuten dass ich werde das Kopieren
iterativ h in hier, E-L-L-O. Plus, weil ich auf das Plus
1, Backslash Null.
>> So, jetzt im Fall von vergleichen-1.c, am Ende, wenn ich drucken Sie die
Aktivierung von t, sollten wir sehen, dass s unverändert ist.
Lassen Sie mich gehen und tun dies jetzt.
So machen copy1.
Dot Slash copy1.
Ich werde in hallo, Enter eingeben.
Und nun bemerken, nur die Kopie wurde aktiviert.
Weil ich wirklich haben zwei Stücke des Speichers.
>> Leider können Sie einige ziemlich schlecht und ziemlich gefährliche Dinge hier.
Lassen Sie mich ein Beispiel hochziehen jetzt hier, das gibt uns ein Beispiel von einigen
verschiedene Linien.
Also einfach intuitiv hier, die erste Zeile Code wird int x Sterne, erklärt
eine Variable namens x.
Und was ist der Datentyp dieser Variablen?
Was ist der Datentyp dieser Variablen?
Das war nicht der Cliffhanger.
>> Der Datentyp int ist Stern.
Also, was bedeutet das? x wird speichern Sie die Adresse einer int.
So einfach ist das..
Y wird die Speicherung Adresse einer int.
Was ist in der dritten Zeile Code da?
Es ist die Zuteilung, wie viele Bytes, wahrscheinlich?
Four.
Aufgrund der Größe eines int Regel vier, gibt malloc von vier
mich wieder die Adresse eines Batzen Speicher, ist das erste Byte, dessen
jetzt in x gespeichert.
>> Jetzt sind wir ein wenig schnell bewegen.
Sterne x bedeutet was?
Es bedeutet, gehen Sie zu dieser Adresse und legte, welche Zahl da?
Legte die Zahl 42 gibt.
Stern y bedeutet gehen, was auf y und setzen die Zahl 13 gibt.
>> Aber warten Sie eine Minute.
Was ist in y im Moment?
Welche Adresse ist y Speichern?
Wir wissen es nicht, nicht wahr?
Wir haben nicht ein einziges Mal verwenden die Zuordnung Betreiber mit y.
So y wie erklärt in der zweiten Zeile der Code ist nur einige Müll Wert, ein großes
Fragezeichen sozusagen.
Es könnte zufällig gerichtet sein nichts in Erinnerung, die
ist in der Regel schlecht.
>> Also, sobald wir treffen diese Zeile gibt, Sterne y gleich 13, etwas Schlechtes,
etwas sehr Schlimmes ist etwa zu Binky passieren.
Also mal sehen, was los ist, um am Ende geschieht hier Binky in dieser Minute
oder so aussehen.
>> [VIDEO PLAYBACK]
>> -Hey, Binky.
Aufwachen.
Es ist Zeit für Zeiger Spaß.
>> -Was ist das?
Erfahren Sie mehr über Zeiger?
Oh, Goodie.
>> -Nun, um loszulegen, ich denke, wir sind gehen, um ein paar Zeiger müssen.
>> -OK.
Dieser Code weist zwei Zeiger das kann auf ganze Zahlen verweisen.
>> -OK, gut, ich sehe die beiden Zeiger.
Aber sie scheinen nicht zu sein zeigt auf nichts.
>> -Das ist richtig.
Zunächst tun Zeiger nicht verweisen auf nichts.
Die Dinge, die sie zeigen, werden als pointees und deren Einrichtung ist ein
getrennten Schritt.
>> -Oh, rechts, rechts.
Das wusste ich.
Die pointees sind getrennt.
So wie Sie vergeben einen pointee?
>> -OK.
Nun, weist dieser Code eine neue Zahlen pointee, und dieser Teil setzt x
auf ihn verweisen.
>> -Hey, das sieht besser.
So machen es etwas zu tun.
>> -OK.
Ich werde Dereferenzierung der Zeiger x zu speichern die Zahl 42 in ihre pointee.
Für diesen Trick, ich brauche meine Magie Zauberstab der Dereferenzierung.
>> -Ihr Zauberstab der Dereferenzierung?
Uh, das ist großartig.
>> -Dies ist, was der Code aussieht.
Ich werde einfach richten Sie die Nummer, und -
>> -Hey, schau.
Dort geht es.
So tut ein dereference auf x folgt der Pfeil auf seine pointee zugreifen.
In diesem Fall ist es in 42 zu speichern.
Hey, versuchen Sie es, um die Nummer zu speichern 13 durch den anderen Zeiger, y.
>> -OK.
Ich werde einfach gehen hier auf y und die Zahl 13 gesetzt aufstehen.
Und dann nehmen Sie den Zauberstab Dereferenzierung und einfach -
Whoa!
>> -Oh, hey.
Das hat nicht funktioniert.
Sprich, Binky, ich glaube nicht, das Dereferenzierung y ist eine gute Idee,
weil die Einrichtung der pointee ist ein separater Schritt.
Und ich glaube nicht, dass wir jemals getan hat.
>> -Hmm.
Guter Punkt.
>> -Ja, wir vergeben den Zeiger y.
Aber wir haben nie stellen Sie ihn auf deuten auf eine pointee.
>> -Hmm.
Sehr aufmerksam.
>> -Hey, du siehst gut da, Binky.
Können Sie das reparieren, so dass y Punkte auf den gleichen pointee als x?
>> -Sure.
Ich werde mit meinem Zauberstab Zeiger Zuordnung.
>> -Ist das wird eine sein Problem wie vorher?
>> -No.
Dies berührt nicht die pointees.
Es ändert nur einen Zeiger darauf auf die gleiche Sache wie der andere.
>> -Oh, ich verstehe.
Jetzt y Punkte auf der gleichen Stelle wie x.
So warten.
Nun y befestigt ist.
Es hat eine pointee.
So können Sie versuchen, den Zauberstab von Dereferenzierung wieder
um die 13 über senden.
>> -OK.
Hier geht.
>> -Hey, schau dir das an.
Jetzt Dereferenzieren Werke auf y.
Und weil die Zeiger teilen dass man pointee, sie
beide sehen den 13.
>> -Ja.
Teilen.
Wie auch immer.
So werden wir die Plätze jetzt?
>> -Oh, schau.
Wir haben keine Zeit mehr.
>> -Aber -
>> -Denken Sie daran, die drei Zeiger Regeln.
Die Nummer eins, die grundlegende Struktur ist, dass man einen Zeiger haben.
Und es weist über einem pointee.
Aber der Zeiger und pointee getrennt.
Und die häufiger Fehler ist, Einrichten eines Zeigers, sondern
Vergessen gegeben eine pointee.
>> Nummer zwei, startet Zeiger Dereferenzierung am Zeiger und folgt seiner
Pfeil über seine pointee zugreifen.
Wie wir alle wissen, dies funktioniert nur, wenn es ist ein pointee, die zurück bekommt
Regel Nummer eins.
>> Nummer drei, nimmt Zeigerzuweisung einen Zeiger und Veränderungen es darauf
das gleiche wie pointee anderen Zeiger.
So nach der Abtretung die beiden Zeiger wird
weisen auf die gleiche pointee.
Manchmal, dass heißt Sharing.
Und das ist alles dort ist zu ihm, wirklich.
Bye bye jetzt.
>> [END VIDEO PLAYBACK]
>> DAVID MALAN: Also mehr auf Zeiger, mehr auf Binky nächste Woche.
Wir informieren Sie am Montag zu sehen.