>> [Musik zu spielen]
David J. MALAN: In Ordnung.
Dies ist CS50, und dies ist das Ende der Woche vier.
Und eines der Themen heute ist, dass der digitalen Forensik,
die Kunst der Wiederherstellung von Informationen.
Und in der Tat, auch wenn Sie sind in der Mitte
jetzt des Friedens bei Drei und Breakout, nächste Woche,
der Fokus auf sein genau diese Domäne.
>> So einer der coolsten Jobs, die ich jemals hatte, war zurück in Graduiertenschule,
als ich für den lokalen Arbeits Middlesex County Bezirksstaatsanwalts
Büro, macht Forensik zu arbeiten.
So im Wesentlichen, das Massachusetts Staatspolizei, bei Gelegenheit,
bei der Arbeit an Fällen wäre bringen in Dinge wie Festplatten
und Disketten und Speicherkarten und dergleichen.
Und sie würde die Hand zu mir und meinem Mentor,
und unser Ziel war es, Beweise zu finden, ob es eine, auf diesen Medien.
Jetzt könnten Sie gesehen haben Einblicke von dieser Welt der Forensik
in den Medien, TV und Filme.
Aber der Job, den ich hatte, und wage zu behaupten, dass die Welt,
ist nicht ganz wie man es sehen würde.
Werfen wir einen Blick auf, was Sie haben wahrscheinlich gesehen.
[VIDEO PLAYBACK]
-OK.
Jetzt wollen wir einen guten Blick auf Sie.
>> [Musik zu spielen]
>> -Halten Es.
Führen Sie das zurück.
>> -wait Eine Minute.
Gehen Sie nach rechts.
-Es.
Einfrieren, dass.
Full-Screen.
>> -OK.
Einfrieren, dass.
Auf, dass eine Straffung, ja?
>> -vector In auf, dass Guy von dem Hinterrad.
>> -zoom In genau hier an dieser Stelle.
>> -Mit der richtigen Ausrüstung, die Bild kann vergrößert und geschärft werden.
>> -Was Ist das?
>> -Es Ist eine Steigerungsprogramm.
>> -Kann Sie klar, dass Sie überhaupt?
>> Weiß ich nicht.
Lassen Sie uns zu verbessern es.
>> -Verbessern Abschnitt A6.
Ich erhöhte das Detail, und--
-I Denke, es ist genug, um zu erhöhen.
Lassen Sie es zu meinem Bildschirm.
>> -I Verstärkt die Reflexion in ihrem Auge.
-Let Dieses durchlaufen Video-Enhancement.
>> -Edgar, Können Sie verbessern das?
>> -hang Auf.
>> -Ich Wurde auf dieser Reflexion arbeiten.
>> -Es Ist jemand Reflexion.
>> -Reflexion.
-Es Ist ein Spiegelbild der das Gesicht des Mannes.
>> -Der Reflexion!
-Es Ist eine Reflexion.
-zoom In auf dem Spiegel.
Sie können eine Reflexion zu sehen.
>> -Kann Verbessern Sie das Bild von hier?
-Kann Sie es verbessern?
-Kann Erweitern wir das?
-Kann Sie es verbessern?
-Halten Auf einem zweiten.
Ich werde zu verbessern.
-zoom In an der Tür.
-Fache 10.
-zoom.
-move In.
-weitere.
-wait, Zu stoppen.
-stop.
-PAUSE Es.
-rotate Uns 75 Grad um die vertikale, bitte.
>> -stop.
Gehen Sie zurück zu dem Teil über der Tür wieder.
>> -Haben Eine Bildverbesserung, die Bitmap kann?
>> -Vielleicht Können wir die Pradeep Singh verwenden Methode, um in die Fenster sehen.
>> -Der Software ist Stand der Technik.
>> -Der Eigenwert ist aus.
>> -Mit der rechten Kombination von algorithms--
>> -Er Genommen Beleuchtung Algorithmen, um die nächste Ebene,
und ich kann sie zu bedienen verbessern Sie dieses Foto.
>> -Verschluss Auf und vergrößern die z-Achse.
>> -Verbessern.
Zu verbessern.
-Verbessern.
-Freeze Und zu verbessern.
[END VIDEO PLAYBACK]
David J. MALAN: Das sind also Alle Wörter, aber sie waren nicht
in Sätzen richtig eingesetzt.
Und in der Tat in der Zukunft, zu jeder Zeit, Bitte hören Sie jemand sagen, das Wort,
"Verbessern", Kichern nur ein kleines bisschen.
Weil, wenn Sie versuchen, zu verbessern, zum Beispiel ist das, was passiert.
>> Also hier ist ein wunderschönes Foto.
Dies ist CS50 eigenen Daven.
Und nehme an, dass wir es wollten konzentrieren sich in der Augenzwinkern,
oder die Reflexion des Bösewicht, die eindeutig war
durch die Überwachungskamera eingefangen.
Dies ist, was passiert, wenn Sie vergrößern auf ein Bild,
nur eine endliche Anzahl von Bits zugeordnet.
>> Das ist, was Sie erhalten würden.
Und in der Tat, in Daven Auge ist, sondern vier, vielleicht sechs Pixel
dass genau das, was komponieren wurde dort schimmern.
So Problem Set Vier letztlich haben Sie, diese Welt zu erforschen, insbesondere
von Natur aus etwas wir nennen Datei-I / O, wobei
I / O ist nur eine andere Art von sagen Eingang und Ausgang.
>> So bislang alle Interaktionen wir mit einem Computer gehabt haben
weitgehend mit waren Ihre Tastatur und der Bildschirm,
aber nicht so sehr mit der Festplatte, oder Speichern von Dateien über die, die Sie
selbst schreiben.
Ihre Programme haben bisher nicht zu schaffen, und speichern,
und Aktualisierung ihrer eigenen Dateien.
>> Nun, was ist eine Datei?
Nun, so etwas wie ein JPEG.
Dies ist ein Bild, das Sie vielleicht haben oder Upload auf Facebook,
oder sehen überall im Web.
In der Tat, dass wir einfach Foto Säge Daven war ein JPEG.
Und was ist interessant über Dateien wie JPEGs
ist, dass sie identifiziert werden können, typischerweise durch bestimmte Muster von Bits.
>> Mit anderen Worten, was ist es, dass unterscheidet ein JPEG aus einem GIF
von einem PING aus einem Word- Dokument aus einer Excel-Datei?
Nun, es ist einfach anders Muster von Bits.
Und diese verschiedenen Muster sind normalerweise zu Beginn dieser Dateien.
>> So dass, wenn Sie Ihren Computer öffnet ein Wort doc, oder wenn ein Computer öffnet ein JPEG,
es sieht typischerweise bei der erste mehrere Bits in der Datei.
Und wenn es ein Muster erkennt, es sagt, oh, ein Bild dafür.
Lassen Sie mich zeigen Sie es auf der Benutzer als Grafik.
Oder, oh, das sieht aus wie ein Word-Dokument.
Lassen Sie mich es dem Benutzer als einem Essay.
>> So zum Beispiel, JPEGs, es stellt sich heraus, sind
ziemlich anspruchsvolle unter der Haube.
Aber die ersten drei Bytes in den meisten jedes JPEG beginnen mit diesen drei Zahlen.
So Byte null, eins und zwei sind in der Fast jeder JPEG, 255, dann wird die Anzahl
216, dann wird die Zahl 255.
>> Und was Sie in der Lage sein, zu tun beginnen nächste Woche
tatsächlich unter Stossen die Haube von Dateien wie JPEGs
und wie Bitmap-Dateien, und zu sehen, was immer für wie lange
Sie haben mit einem Computer gewesen.
>> Aber was ist es in der Regel nicht wie Dezimalzahlen so geschrieben.
Informatiker nicht neigen dazu, in Dezimal zu sprechen.
Sie haben nicht wirklich in binärer sprechen.
Normalerweise, wenn wir wollen, Zahlen auszudrücken,
wir tatsächlich nutzen hexadezimal, die Sie sich erinnern können
von, sagen wir, Problem-Set Eine, die in Frage gestellt
Sie über ein anderes System nachdenken.
>> Wir natürlich vertraut mit Nachkommastellen, Null bis Neun.
Wir sprachen über binär.
Und wir haben nicht wirklich so viel hier verwenden
auf sich, weil Computer verwenden das.
Aber Programmierer sehr Oft, aber nicht immer,
hexadezimale, was bedeutet nur, Sie haben 16 Buchstaben im Alphabet Ihr,
im Gegensatz zu zwei oder 10.
>> So, wie Sie zählen zu höheren als neun in Hexadezimal?
Sie gehen 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, nur durch Konvention.
Aber was ist Schlüssel ist, dass jeder von diesen ist ein einzelnes Symbol.
Es gibt keine 10.
Es gibt keine 11 per se, da jedes Ihre Stellen, genau wie in Dezimal
Und genau wie in binärer, sollte nur ein einzelner Charakter, durch Konvention.
>> So dass dann das Alphabet haben wir zur Verfügung für hexadezimal.
Also, was macht ein JPEG aussehen, wenn Sie waren zu schreiben, jene ersten drei
Byte nicht als Dezimalzahl, aber beispielsweise als hexadezimalen?
Und warum ist hex auch alles, was nützlich?
>> Nun, ein kurzer Blick auf ein Beispiel.
Also, wenn ich schreiben, die Bits, die stellen diese dezimal numbers--
könnte dies ein wenig rostig sein jetzt von ein paar Wochen zurück,
aber der linke und der Richtige sind ziemlich einfach.
255 war die größte Zahl, die wir konnte mit acht Bits repräsentieren.
Es war nur Einsen.
Also das einzige, das leicht ist Interessant ist auch die mittleren.
Und wenn Sie Art tun sich die Mathe, werden Sie folgern, dass, ja,
das Muster ein und Nullen repräsentiert 216.
Also lasst uns einfach vor, für jetzt, dass diese korrekt sind.
Aber warum ist das interessant?
>> Nun, ein Byte, natürlich, ist acht Bits.
Und es stellt sich heraus, dass, wenn Sie denken, ein Byte als zwei Stücke von vier Bits,
so was.
Lassen Sie mich nur etwas Platz hinzufügen.
So vor, nach.
Ich habe gerade etwas Leerraum hinzugefügt zur Visualisierung der hier willen.
Wie können wir nun in repräsentieren, sagen wir, hexadezimal jeweils Quad von Bits,
wobei jede Gruppe von vier Bits?
>> So zum Beispiel auf der linken Seite jetzt haben wir 1111 in binär.
Was ist diese Zahl in Dezimal-, wenn Sie die Mathematik zu tun?
Sie haben die Einerstelle, die zu zweit Platz, die Vieren statt, und die Achter Platz.
>> ZIELGRUPPE: 15.
David J. MALAN: Es ist 15.
Also, wenn wir acht plus vier plus zwei plus eins, bekommen wir 15.
So konnte ich unten aufschreiben 15 1111, aber der springende Punkt hier
hexadezimal, nicht dezimal.
Also statt der Niederschrift 15, 1-5, Ich werde das in Hex zu schreiben,
die, wenn Sie zurückdenken, wenn Sie Null bis f, was 15 sein wird?
ZIELGRUPPE: f.
David J. MALAN: So stellt sich heraus, es ist f.
Und Sie können daran arbeiten heraus mit den Worten: Nun, wenn eine 10 ist, dann OK, f 15.
Also ja, wir schreiben konnte Die gleiche Reihe von Zahlen als f f.
Und dann, wenn wir ein bisschen Mathematik, wir folgern, dass das ist, d.
Acht ist recht einfach, denn wir eine Eins in der Achter Platz.
Und dann haben wir noch ein paar f f ist.
>> Also, was Menschen dazu neigen, durch Konvention zu tun wenn sie verwenden hexadezimale ist sie nur
schreibe ein wenig kurz und bündig, der meisten dieser weißen Raum loszuwerden.
Und nur um super klar zu sein Leser, dass dies hexadezimal,
die einfache Konvention unter Menschen wird Sie schreiben Null
x, der keine andere Bedeutung hat als ein visueller Kennung,
hier kommt ein Hex-Zahl.
>> Und dann setzen Sie die beiden Ziffern, f f in diesem Fall, so d a ist, dann f f.
So lange Rede kurzer Sinn, hexadezimale nur tendenziell
nützlich zu sein, da jedes der Ziffern Null bis f, perfekt Linien
mit einem Muster von vier Bits.
>> Also, wenn Sie zwei hexadezimalen Ziffern haben, Null bis F, wieder und wieder,
das gibt Ihnen perfekt acht Bits oder ein Byte.
Also das ist, warum es dazu neigt, sein konventionell nützlich.
Es gibt keine geistigen Inhalt wirklich darüber hinaus,
außer seiner eigentlichen Programm.
>> Jetzt JPEG sind nicht die einzige Dateiformate für Grafiken.
Sie erinnern sich vielleicht, dass es Dateien wie diese in der Welt,
zumindest von ein paar Jahre zurück.
>> Also eigentlich war diese in Windows XP installiert
auf Millionen PCs weltweit.
Und das war eine Bitmap-Datei, BMP.
Und eine Bitmap-Datei, wie Sie sehen werden neben Woche, bedeutet nur ein Muster aus Punkten,
Pixel, wie sie genannt werden, Eine Karte auf Bits, wirklich.
>> Also, was ist interessant, wenn auch, über dieses Dateiformat, BMP, ist
dass unter der Haube, es hat mehr als nur drei Bytes
dass seine Kopf komponieren, so zu sprechen, die ersten paar Bissen.
Es sieht tatsächlich ein wenig auf den ersten Blick kompliziert.
Und Sie werden diese in der P-Reihe zu sehen.
Und immer etwas Insbesondere aus diesem jetzt
ist nicht so wichtig, da nur die Tatsache, daß zu Beginn jedes Bitmap
Datei, ein Grafikformat, es gibt eine ganze Reihe von Zahlen.
>> Jetzt Microsoft, die Autor von diesem Format
neigt dazu, diejenigen nennen Dinge nicht ints und chars
und schwimmt aber Worte und d Worte und sehnt sich und Bytes.
Also sie sind nur verschiedene Datentypen.
Sie sind verschiedene Namen für die gleiche Sache.
Aber Sie werden feststellen, dass in P Set Vier sehen.
>> Aber das ist nur zu sagen, dass, wenn ein Mensch doppelklickt etwas BMP-Datei auf seinem
oder ihre Festplatte, und ein Fenster öffnet sich bis ihm oder ihr, dass Bild, das zeigt,
das passiert ist, weil das Betriebs System vermutlich aufgefallen, nicht nur
die BMP-Datei-Erweiterung im Dateinamen,
sondern auch die Tatsache, dass es einige Konvention mit dem Muster der Bits
am Anfang dieser Bitmap-Datei.
>> Aber lassen Sie uns jetzt konzentrieren sich auf eine so komplizierte Datei,
sondern auf so etwas wie dieses.
Nehmen wir hier in GEdit, ich einfach nur die Anfänge
von einem Programm, das sehr einfach ist.
Ich habe einige beinhaltet bis oben.
Jetzt habe ich # include "structs.h" aber Ich werde in einem Moment zurückkommen.
Aber das ist jetzt für sinnvoll.
Also das ist ein Programm, das geht zu implementieren
wie das Standes Datenbank.
So eine Datenbank von Studenten, und jeder Schüler in der Welt
hat einen Namen und ein Haus und wahrscheinlich einige andere Sachen, aber wir werden es einfach zu halten.
Jeder Student hat einen Namen und ein Haus.
>> Also, wenn ich wollte schreiben Programm, dessen Zweck im Leben
wurde nur von laufen Null auf bis zu drei,
wenn es drei Studenten an der Harvard University.
Und ich möchte nur, um mit GetString, jedes Schülers Namen und Haus,
und dann einfach ausdrucken diejenigen aus.
>> Das ist ein bisschen wie Woche Eins, jetzt Woche zwei Sachen,
wo ich will nur für Schleife oder so ähnlich.
Und ich möchte GetString rufen ein paar mal, und drucken Sie dann f ein paar mal.
Also, wie könnte ich das tun, obwohl, wenn sowohl ein Name und ein Haus
werden für jeden Schüler beteiligt?
>> Also mein erster Instinkt könnte sein, um so etwas zu tun.
Ich könnte zunächst sagen, gut, gib mir, sagen, ein Array von Strings genannt Namen.
Und ich glaube nicht, dass ein Hard drei hier.
Was will ich, dort zu setzen?
So dass die Schüler, denn das ist nur eine Konstante an der Spitze erklärt,
nur damit ich nicht zu codieren drei in mehreren Orten.
Auf diese Weise, kann ich es an einem Ort ändern, und es wirkt sich eine Veränderung überall.
Und dann könnte ich tun, String beherbergt Studenten.
>> Und jetzt, ich könnte etwas tun, wie for (int i = 0; i <Studenten; i ++.
Also bin ich schnell tippen, aber das ist wohl bekannte Syntax jetzt.
>> Und nun war dieser aktueller ist.
Wenn ich in der i-ten setzen der Name des Studenten, ich glaube, ich dies tun.
Und dann keine Namen aber Häuser Halterung I.
Ich mache das, GetString, und lassen mich zurückgehen und diese Linie.
Zustimmen?
Nicht einverstanden sind?
Es ist nicht sehr benutzerfreundlich.
Ich habe nicht gesagt, der Benutzer, was zu tun ist.
>> Aber jetzt, wenn ich auch wollte später, lassen Sie uns
sagen wir, diese Dinge zu drucken out-- so TODO später.
Ich werde mehr mit zu tun this-- dies ist wohl
eine korrekte Umsetzung der immer Namen und Häuser, drei
von ihnen insgesamt jeweils von einem Benutzer.
>> Aber das ist nicht sehr gutes Design, oder?
Was ist, wenn ein Schüler nicht nur einen Namen und ein Haus, sondern auch eine ID-Nummer,
und eine Telefonnummer, und eine E-Mail-Adresse,
und vielleicht eine Homepage, und vielleicht ein Twitter-Griff,
und jede Anzahl von anderen Details mit einem Schüler oder einer Person verbunden,
im Allgemeinen.
Wie würden wir beginnen, hinzufügen Funktionalität zu diesem Programm?
>> Nun, ich fühle mich wie der einfachste Weg, vielleicht sein, etwas zu tun, sagen wir mal,
int ids Studenten.
So kann ich alle ihre IDs in es gesetzt.
Und dann, nach etwas wie Telefonnummern,
Ich bin mir nicht sicher, wie man stellen, dass nur noch.
Lassen Sie uns also vor, nur Anruf gehen Diese twittert STUDENTEN, die
ist ein wenig seltsam, aber-- und ein paar mehr Felder.
>> Ich habe angefangen, effektiv Kopieren Sie hier.
Und das wird ziemlich wachsen unhandlich ziemlich schnell, oder?
Wäre es nicht schön sein, wenn es in der Welt eine Datenstruktur bekannt
nicht als int oder ein String, sondern etwas, höhere Ebene, eine Abstraktion, so
zu sprechen, als Student bekannt?
C nicht mit eingebautem kommen Funktionalität für Studenten,
aber was, wenn ich wollte, dass es eine solche geben?
>> Nun, es stellt sich heraus, ich bin zu gehen Öffnen einer Datei structs.h hier genannt,
und Sie genau das tun können.
Und wir werden damit beginnt jetzt.
Und unter der Haube von P Set Drei, Sie haben bereits das getan, jetzt.
Es gibt nicht so etwas wie eine g rect oder a g oval in der Programmiersprache C.
>> Leute, die an der Stanford implementiert Datentypen mit diesem Ansatz hier
erklärt ihre eigenen neuen Daten Arten mit einem neuen Stichwort
genannt und eine andere Struktur nannte man typedef.
Und in der Tat, obwohl die Syntax sieht von Sachen ein wenig anders
wir zuvor gesehen haben, in Prinzip, es ist super einfach.
>> Das bedeutet einfach nur "definieren einen Typ."
Das wird eine sein Struktur und eine Struktur,
ist wie ein Container für mehrere Dinge.
Und diese Struktur wird um einen String aufgerufen Namen haben,
und einen String aufgerufen Haus.
Und nennen, nur für die Bequemlichkeit, diese ganze Datenstruktur Schüler.
>> Also in dem Moment, Sie bekommen das Semikolon, haben Sie jetzt
erstellt Ihren eigenen Daten Typ namens Student
dass nun steht neben int, und float und char, und String,
und g rect und g oval, und eine beliebige Anzahl andere Dinge, die Menschen erfunden haben.
>> Also, was ist sinnvoll darüber jetzt ist, dass wenn ich wieder gehen
0 konstruieren und beenden diese Umsetzung, die ich geschrieben habe
im Voraus hier bemerken, dass alle der unvermeidlichen Unordnung, dass
war kurz vor dem Start passiert, als ich aufgenommen Telefonnummern und zwitschert und alle
diese anderen Dinge zu Definition eines Schülers,
jetzt ist es kurz und bündig eingepackt nur als eine Reihe von Studenten.
>> Und jeder dieser Schüler jetzt mehrere Dinge darin.
So dass nur noch eine Frage verlässt.
Wie kann man sich die Namen zu erhalten, und das Haus, und die ID,
und was sonst ist Innenseite der Student?
Super einfach, wie gut.
Neue Syntax, aber eine einfache Idee.
>> Sie einfach in den Index-Array wie wir letzte Woche und diese.
Und was ist eindeutig die neues Stück von Syntax?
Nur., Was bedeutet, "innerhalb der go Struktur und bekommen das Feld mit dem Namen
Name, bekommen die Feld namens Haus, erhalten die Feld namens Student. "
>> So in P-Set Drei, wenn Sie noch an, dass,
und die meisten Leute immer noch sind, erkennen, dass, wie Sie
beginnen mit Dingen wie g und g rects Ovale
und andere Dinge, die nicht zu scheinen, kommen von Woche null, eins oder zwei,
erkennen, dass das ist, weil Stanford erklärt einige neue Datentypen.
>> Und in der Tat, das ist genau, was wir zu tun, als auch, in P Set Four, wenn
wir beginnen, mit den Dingen umzugehen wie Bilder, Bitmaps und mehr.
Also das ist nur ein Teaser und ein mentales Modell für das, was noch kommen wird.
Nun zögerte ich ein bisschen an diesem Morgen.
Ich war irgendwie neugierig zu sehen, was Microsoft Tapete tatsächlich
sieht aus wie heute.
Und es stellt sich heraus, jemand im Jahr 2006 ging tatsächlich fast genau
der gleichen Stelle, in der Realität fotografieren was aussieht wie, dass in diesen Tagen.
Das Feld ist jetzt ein wenig überwuchert.
>> So spricht nun der Bilder, Lassen Sie uns zurückbringen Daven hier
auf dem Bildschirm und Nikolaus, und nur daran erinnern,
, dass, wenn Sie möchten, um uns zum Mittagessen kommen an diesem Freitag, den Kopf auf unseren üblichen URL
Hier.
>> Also, wo sind wir stehen geblieben am Montag?
Wir führten dieses Problem, oder?
Das war scheinbar eine korrekte Umsetzung der Swap,
wobei Sie die Einnahme zwei ints, eine genannt, nannte man b,
tauschen sie, genau wie Laura hat hier auf der Bühne mit der Milch und dem Wasser,
unter Verwendung eines temporären Variable oder eine leere Tasse,
so dass wir in einem b und einem in setzen b ohne ein Chaos der Dinge.
Wir verwendeten eine Variable.
Es heißt Temperatur.
>> Aber was war das Grund Problem mit diesem Code am Montag?
Was war das Problem?
Ja.
>> ZIELGRUPPE: Es nimmt mehr Platz.
>> David J. MALAN: Nimmt mehr Raum, denn ich bin mit einem variablen,
und das ist OK.
Das ist wahr, aber ich bin gehen zu sagen, das ist OK.
Es ist nur 32 Bit in der großen Schema der Dinge, so dass nicht eine große Sache.
Andere Gedanken?
ZIELGRUPPE: Es tauscht nur die Variablen vor Ort.
David J. MALAN: Genau.
Es tauscht nur die Variablen vor Ort.
Weil immer wenn Sie ein function-- nennen wenn ich die Schalen von Annenberg
letzten Mal, haben Sie Haupt auf der Unterseite.
Sobald Sie eine Funktion namens nennen Swap, Swap wird nicht x und y,
die ursprünglichen Werte.
Was bedeutet Swap wird, haben wir den Anspruch?
ZIELGRUPPE: Kopien.
David J. MALAN: Also Kopien von ihnen.
So wird es eins und zwei, wenn Sie erinnern das Beispiel vom letzten Mal,
sondern eine Kopie von einem und zwei , die erfolgreich ausgelagert werden.
Aber leider am Ende, diese Werte sind die gleichen geblieben.
So können wir diese mit unserer sehen neuen Freund, hoffentlich GDB,
dass Sie oder die Transkriptionsfaktoren und Ca verfügen wurde der Sie zu wie folgt.
>> Also keine Swap-Rückruf sieht like-- uns gelassen eröffnen this-- sieht so aus.
Wir initialisiert x zu einem, y auf zwei.
Hatte eine Reihe von Druck f ist.
Aber dann, der Schlüssel Anruf hier war zu tauschen, die
ist genau der Code, den wir gerade gesehen, vor einem Augenblick.
Die auf den ersten richtig ist Blick, aber funktional,
dieses Programm nicht funktionieren, weil es nicht dauerhaft tauschen x und y.
>> Also lassen Sie uns das zu sehen, eine schnelle Aufwärm hier mit GDB, einem ./noswap.
Ein Bündel von Informationen überwältigend, dass Ich werde jetzt loswerden mit Control L.
Und jetzt bin ich zu gehen gehen Sie vor und führen Sie es.
Und leider, dass war nicht so sinnvoll.
Es lief das Programm innerhalb dieses Programm namens GDB, einen Debugger,
aber es ließ mich nicht herumzustochern.
>> Also, wie kann ich eigentlich pausieren Ausführung in diesem Programm?
So brechen.
Und ich konnte auf allen brechen Zeilennummer, eine, 10, 15.
Aber ich kann auch symbolisch zu brechen mit den Worten Pause Main.
Und das wird eine Pause gesetzt Punkt, offenbar in Zeile 16 in Haupt.
Und wo ist die Linie 16?
Gehen wir bis zum Code und gehen bis zu NOSWAP.
Und in der Tat ist die Linie 16 die erste im Programm.
>> So, jetzt, wenn ich voran gehen und Typ laufen diese Zeit, Enter, blieb es.
Lassen Sie uns also herumzustochern.
Drucken x-- warum ist x Null?
Und ignorieren die Dollar-Zeichen.
Das ist nur für Züchter Verwendung des Programms.
Warum ist x Null im Moment?
Ja.
>> ZIELGRUPPE: Es hielt direkt vor Linie 16, nicht wirklich auf der Leitung 16.
David J. MALAN: Genau.
GDB, die standardmäßig angehalten hat Ausführung kurz vor Linie 16.
So ist es nicht ausgeführt, die bedeutet, x ist von einem unbekannten Wert.
Und wir hatten Glück, dass es etwas sauber wie Null.
So, jetzt, wenn ich als nächstes schreiben, nun ausgeführt es 16.
Es wartet auf mich ausführen 17.
Lassen Sie mich weiter und Druck x zu gehen.
Es ist einer.
Lassen Sie mich weiter und Druck y gehen.
Was soll ich jetzt?
>> ZIELGRUPPE: [unverständlich]
>> David J. MALAN: Ein wenig lauter.
>> ZIELGRUPPE: [unverständlich]
David J. MALAN: Nicht ganz ein Konsens.
Also ja, wir sehen einige Müll Wert.
Nun ist es y 134514064.
Nun, es ist nur einige Müll Wert.
Mein Programm nutzt RAM für verschiedene Zwecke.
Es gibt andere Funktionen.
Andere Leute in meinem Computer geschrieben.
Also diese Bits für benutzt worden andere Werte, und was ich sehe
sind die Reste einiger vor Verwendung dieses Speichers.
>> Also keine große Sache, denn sobald wie ich als nächstes schreiben und drucken Sie dann y,
es ist initialisiert der Wert, den ich will.
So, jetzt wollen wir voran gehen ein wenig schneller.
N für den nächsten.
Lassen Sie es wieder tun.
Aber ich will nicht zu schlagen es hier, denn wenn ich
wollen sehen, was los ist in Swap, was ist der Befehl?
>> ZIELGRUPPE: Schritte.
>> David J. MALAN: Schritte.
Also diese Schritte mich in eine Funktion, anstatt über sie.
Und jetzt ist es ein wenig kryptisch ehrlich gesagt, aber das ist nur
sagen mir, ich bin in der Zeile 33 jetzt.
Und lassen Sie uns wieder tun.
Drucktemperatur.
Müll Werte negativ diesmal aber das ist nur noch ein Müll Wert.
Lassen Sie uns also als nächstes tun, Drucktemperatur.
Es ist mit 1 initialisiert, die war der Wert von x, auch bekannt als ein.
>> Nun, wo sind unsere A und X her?
Nun, in den Haupt bemerken wir bezeichnet diese Werte x und y.
Wir haben dann an ihnen vorbei zu tauschen wie folgt.
X war zuerst da, Komma y.
Und dann konnte sie Swap-x und y nennen.
Aber aus Gründen der Klarheit, ist es ruft sie a und b.
Aber A und B werden nun sein Kopien von x bzw. y.
>> Also, wenn ich wieder nach GDB, Temp ist jetzt ein und eine ist heute einer.
Aber wenn ich als nächstes tun, und jetzt machen Druck a, a wurde bereits über bewegt.
Die Milch ist in der ehemaligen gegossen worden Orangensaft ist Glas, oder umgekehrt.
>> Und wenn ich als nächstes tun wieder, und jetzt wenn ich ausdrucken als Plausibilitätsprüfung,
ein immer noch zwei, aber b ist nun ein.
Ehrlich gesagt, es ist immer noch da.
Es ist mir egal, welche Temperatur ist.
Aber sobald ich jetzt geben, sagen wir mal, weiter zurück gehen, jetzt bin ich am Ende
Das Programm.
Und leider ist x immer noch einer und y noch zwei.
>> Also, was war der Nutzen der GDB da?
Es half nicht, mich zu beheben das Problem an sich,
aber es hoffentlich mir helfen verstehen es durch die Realisierung
dass ja, das ist meine Logik richtig, aber mein Code letztlich nicht mit
eine dauerhafte Wirkung.
Also das ist ein Problem, wir sind denn jetzt heute zu lösen.
>> Aber lassen Sie es bekommen durch diese.
String ist eine Lüge.
Auch sie kein Datentyp das existiert in C. Es ist
ein Synonym für einige Zeit für etwas anderes,
und wir können zeigen, dass wie folgt.
>> Lassen Sie mich gehen Sie vor und öffnen ein Programm namens vergleichen-0.
Und eher als Typ dieses heraus, wir beginnen, um den Code zu Fuß
Habe ich bereits geschrieben, aber es ist nur ein paar Zeilen.
So ist dies vergleichen-0.
Und das erste, was ich mache ist immer eine Textzeile.
>> Beachten Sie aber, was ich bin dabei zum ersten Mal.
Was ist anders klar über Linie 21?
Eigentlich, warten Sie eine Minute.
Dies ist kopier zwei.
Das ist auch nicht das richtige Programm.
Alle Rechte, Spoiler Alarm.
Alles in Ordnung, so egal, dass.
Das ist die Antwort auf eine künftige Frage.
>> Hier ist zu vergleichen-0, und ich bin etwa um eine Textzeile zu bekommen.
Programms wesentlich einfacher.
Also das ist einfach.
Das ist wie eine Woche, Woche zwei Sachen im Augenblick. string s = GetString.
Nun, ich sage es noch einmal hier unten.
String t = GetString.
Und dann das letzte, was in dieser Programm, wie der Name schon sagt,
ist werde ich versuchen, sie zu vergleichen.
>> Also, wenn s, die erste Saite, gleich = t, dann bin ich
sagen Sie das Gleiche geben.
Else, ich werde sagen, Sie geben verschiedene Dinge.
Lassen Sie uns also kompilieren und führen Sie dieses Programm.
So stellen Sie vergleichen Null.
Sieht gut aus.
Keine Fehler Zusammenstellung.
>> Lassen Sie mich jetzt voran gehen und geben ./compare-0.
Lassen Sie mich gehen Sie vor und sagen etwas : Daven und etwas: Rob.
Und ich geben verschiedene Dinge.
So weit, ist es gut.
Programm scheint korrekt zu sein.
>> Aber lassen Sie uns starten Sie es erneut.
Sagen Sie etwas: Gabe.
In Ordnung.
Vielleicht traf ich die Leertaste oder etwas flippig.
Lassen Sie es wieder tun.
So Zamyla.
Zamyla.
Verschiedene Dinge.
Also, was ist da los?
>> Also haben wir diese zwei Zeilen Code, GetString zweimal genannt.
Und dann bin ich einfach versuchen, zu vergleichen s und t.
Aber was dann wirklich los ist?
Nun, über meine Handschrift zu Metzger dieses Beispiel etwas.
Und lassen Sie uns eigentlich werfen diese bis hier, wie gut.
>> So haben wir eine Zeile wie string s = GetString.
Also das ist einfach die erste interessante Linie von diesem Programm.
Aber was die ganze Zeit war geht unter der Haube?
Nun, auf der linken Seite ist string, Das ist eine Art von Variablen,
und es heißt s.
Also ich weiß, dass dies mit Speicher oder RAM, in meinem Computer irgendwie.
Also werde ich zu abstrakt ziehen, dass ein Quadrat.
32 Bits, es stellt sich heraus, aber mehr dazu in der Zukunft.
Und dann, was ist los hier?
>> Nun, offensichtlich GetString Ruft eine Zeichenfolge von dem Benutzer.
Und bekam GetString Zamyla oder Gabe oder Daven.
Also wählen wir den ersten von denen, die Daven war.
So effektiv, bekam, was GetString mich in diesem ersten Fall war D-a-v-e-n.
Und dann, was hast es mir heimlich?
ZIELGRUPPE: [unverständlich]
David J. MALAN: Ja, die / 0 oder Null-Zeichen.
So ist es effektiv gab mir einen String.
Aber wir wissen bereits aus früheren sieht, dass ein String nur ein Array
von Zeichen, und es ist von beendet Diese spezielle Wächter Charakter, / 0.
>> Aber wenn das wahr ist und dies ist ein Quadrat,
das ist eindeutig ein viel größeres Rechteck.
Und in der Tat ist dies, Ich behaupte, nur 32 Bit.
Und das ist deutlich mehr als 32 Bits, da dies wahrscheinlich
acht plus acht plus acht plus acht plus acht,
gerade weil der Bytes in ASCII.
Wie zum Teufel sollen wir passen Daven in diese kleine Box hier?
>> Nun, was ist eigentlich GetString tun?
Nun, hier stellt dieses Gitter Speicher oder RAM meines Computers.
Also lassen Sie uns sagen, dass wenn willkürlich jedes von diesen ist ein Byte,
dann werden wir von jeder denken kann Byte als eine Adresse hat,
wie 33 Oxford Street, oder 34 Oxford Street, Oxford Street oder 35.
>> So wie Häuser haben Adressen und Gebäude haben Adressen,
Dazu einzelnen Bytes Gedächtnis haben Adressen oder Nummern
dass sie eindeutig zu identifizieren.
Nun, dies ist willkürlich.
Aber um es einfach zu halten, ich bin zu gehen hexadezimale nur durch Konvention,
aber das bedeutet nichts anderes, 0x als "das ist hexadezimal."
und ich werde dass der Anspruch des "D" endet in Byte Ein im Speicher.
>> Ich habe nichts anderes passiert in Speicher, so Daven bekam den ersten Platz
bei Byte One.
Das also wird sich 0x2 sein.
Dies ist auf 0x3 gehen.
Das wird 0x4 sein.
Dies ist auf 0x5 gehen.
Das wird 0x6 sein.
>> Aber sobald Sie anfangen, über das, was der Computer tut
unter der Haube, können Sie beginnen, schließen
wie Sie vor einigen Jahren wäre C haben selbst implementiert.
Was ist wohl GetString returning--, weil es
fühlt sich an wie es ist nicht Zurück Daven per se
weil er sicher nicht gehen in diesem kleinen box-- passen
Also, was ist GetString wahrscheinlich zurückkehren?
>> ZIELGRUPPE: [unverständlich]
>> David J. MALAN: Die Lage des Daven.
Und es ist das getan, seit Week One.
Was ist wirklich GetString Rückkehr ist kein String, an sich.
Das ist eine von den kleinen Notlügen.
Es zurück die Adresse der String im Speicher, die eindeutige Adresse.
Daven lebt bei 33 Oxford Street.
Aber kurz und bündig, lebt Gavin bei 0x1, Adresse Nummer Eins.
>> Also, was wird in diese setzen kleine Box dann, klar zu sein,
ist nur die Adresse dieser Zeichenkette.
Also die ganze Zeit, dies hat schon.
Aber was diese Hinweise bei Jetzt ist, wenn alle S
eine Zahl in der es, wer ist Sie zu stoppen, der Programmierer,
aus, dass jeder beliebige Zahl in jede Variable und nur Springen
zu diesem Teil des Speichers?
Und in der Tat, wir werden sehen das ist eine Bedrohung nächsten Mal.
>> Aber jetzt fühlt sich unzureichend.
Wenn ich sage, hol mir ein String, mich Daven geben.
Aber Sie müssen nicht wirklich geben mir Daven.
Alles, was Sie mir geben, ist Daven-Adresse ein.
Wie kann ich dann sicher wissen, Daven wo beginnt und ends--
die Geschichte wird immer weird-- wobei Daven beginnt und endet,
und dann wird die nächste String im Speicher beginnt?
>> Nun, wenn Sie Übergabe sind mich der Anfang von Daven,
im Wesentlichen, wie kann ich wissen wo das Ende sein Name ist?
Das spezielle Null-Zeichen, die ist umso wichtiger jetzt
wenn Strings unter der Haube einfach identifiziert
eindeutig durch ihre Position in dem Speicher.
Also die ganze Zeit, das ist was los war.
>> Also, wenn wir jetzt zu betrachten der Code hier erklären
wenn Sie die Fehler in Zeile 26 würde.
Warum ist Zamyla und Zamyla anders?
Warum ist Gabe und Gabe anders?
Ja, auf der Rückseite.
>> ZIELGRUPPE: Sie haben unterschiedliche Adressen.
>> David J. MALAN: Ganz einfach, weil sie haben unterschiedliche Adressen.
Denn wenn Sie GetString nennen wieder, was ich hier zu tun schnell,
wenn dies die zweite Zeile, string t, wie ich in diesem Programm haben,
gleich einen weiteren Anruf zu GetString.
Das nächste Mal rufe ich GetString, ich werde
, um einen anderen Teil des Speichers zu erhalten.
>> GetString ist erlaubt das Betriebs fragen
System für mehr und mehr Speicher.
Es wird nicht um das gleiche wiederverwenden sechs Bytes jedes einzelne Mal.
Es wird eine neue zu bekommen Teil des Speichers, die
bedeutet, t wird zu bekommen einen anderen Wert hier.
>> Also, wenn ich s gleich = t, du bist nicht zu vergleichen
D gegen diese und gegen A Diese und V dagegen.
Sie vergleichen diese gegen diese, die
ehrlich gesagt ist ziemlich useful-- useless-- ist ziemlich nutzlos, weil die wirklich
kümmert, wo die Saiten in Erinnerung?
>> Und in der Tat haben wir nicht.
Und wir sind es nicht gewohnt, Start besonders fürsorglich.
Nur in dem Ausmaß, dass Fehler auftreten können, und Sicherheitsbedrohungen können entstehen
wir tatsächlich beginnen, sich dafür interessieren.
Also lassen Sie dieses Problem beheben.
Stellt sich heraus, können Sie es beheben Super einfach.
>> Und lassen Sie eigentlich, bevor ich zeigen, dass wieder, was würden
Sie, wenn in einer Klasse zu tun CS50, Sie implementieren und hatte
ein Vergleich gegen zwei Saiten.
Man kann deutlich nicht einfach s = t entspricht.
Aber nur logisch, wie würden Sie diese Zeichenfolge vergleichen
gegen diese Zeichenfolge unter Verwendung von C-Code?
Ja.
>> ZIELGRUPPE: Just do die for-Schleife [unverständlich]
David J. MALAN: Perfect.
ZIELGRUPPE: [unverständlich]
David J. MALAN: Ja.
Verwenden Sie einfach eine for-Schleife oder eine while-Schleife oder was auch immer.
Aber gerade die Grundidee gelten, dass, wenn Dies ist ein Teil des Speichers oder eines Arrays
und das ist, durchlaufen beide zur gleichen Zeit.
Und vergleichen Sie die Buchstaben.
>> Und man muss eine sein, habe wenig vorsichtig, weil man
möchte nicht einen Finger in der Vergangenheit der anderen gehen
weil eine Saite ist länger als der andere.
So dass Sie gehen, um den Check zu wollen sind Dieser spezielle Wert am Ende, null.
Aber es ist wirklich, in der Ende, so einfach ist das.
Und ehrlich gesagt, wir brauchen nicht neu zu erfinden das Rad.
Hier ist Version zwei.
Und was ich hier zu sagen ist, dass Anstelle des Vergleichs s = t entspricht,
Ich bin stattdessen sagen, wenn der String Vergleich von s Komma t gleich = 0 ist.
Nun, was ist String vergleichen?
>> Es stellt sich heraus, es ist eine Funktion, die kommt mit C, deren Zweck im Leben
ist es, zwei Zeichenketten zu vergleichen.
Und rühren, zu vergleichen, wenn wir lesen, seine man-Seite oder in der Dokumentation oder CS50
Referenz, wird es einfach sagen, dass die Aufsehen
Vergleichen gibt entweder eine negative Nummer oder eine positive Zahl oder Null ist,
wobei Null bedeutet, dass sie gleich sind.
>> Also nur eine Vermutung.
Was könnte es bedeuten, wenn rühren vergleichen Renditen
negativen Wert oder positiven Wert?
ZIELGRUPPE: größer oder kleiner als.
David J. MALAN: Ja, größer oder kleiner.
Also, wenn Sie eine ganze sortieren wollte Reihe von Zeichenfolgen in einer dictionary--
als wir schließlich auf der road-- perfekte Funktion, um möglicherweise zu verwenden,
weil es sich, das zu tun Vergleich von Strings für Sie, und sagen,
Sie funktioniert eine kommt vor b, oder tut b vor einer alphabetisch kommen.
Wir können genau das tun.
>> Und merke ich eine andere tat was in diesem Beispiel.
Was hat sich geändert höher in dieser Hauptfunktion?
Char *.
Und das ist, dass andere Notlüge.
Die ganze Zeit, als Sie haben, schreibt Schnur,
wir wurden heimlich umgeschrieben String als char *, so dass Klang tatsächlich
Sie versteht.
>> Mit anderen Worten, in CS50.h und wie wir schließlich sehen,
wir haben ein Synonym namens String das ist das gleiche wie char *.
Und jetzt, nur, dass die wissen, * In diesem Zusammenhang, zumindest,
bedeutet die Adresse.
>> Die Adresse von was?
Nun, die Tatsache, dass ich sagte, char *, int und nicht * oder * schweben,
bedeutet, dass char * ist die Adresse eines char.
Also diese kleine Box hier, auch bekannt als String, ist wirklich der Typ char *,
Das ist einfach eine andere Art zu sagen, In diesem Feld wird eine Adresse gehen.
Und was bedeutet das Adresse beziehen sich auf?
Offenbar ein Zeichen.
>> Aber wir konnten absolut haben int * und andere Dinge.
Aber jetzt ist char * wirklich das Beste unkompliziert und einem von Interesse.
So dass dieses Problem wird steigen, aber erneut.
>> Angenommen, ich dieses Programm für.
Mal sehen, ob wir jetzt vorhersagen kann was ist los mit diesem Code.
Also in diesem Programm, kopieren-0, Ich bin werde weitermachen und wieder anrufen
GetString und den Wert in s.
>> Und dann, warum mache ich das, nur als Erinnerung von Wochen Vergangenheit?
Wir haben sagen, dass GetString manchmal null zurück.
Was bedeutet es, wenn meine GetString null zurück?
Etwas ist schief gelaufen.
Es bedeutet wohl der String ist auch groß, der Speicher des Computers.
Es passiert super, super, super selten, aber es kann passieren.
Wir wollen für sie zu überprüfen, und das ist alles, was wir tun.
>> Weil wir jetzt sehen werden, wenn Sie dies nicht tun Beginn Check für gewöhnlich Dinge
wie null, können Sie tatsächlich beginnen zu gehen
Adressen im Speicher, die ungültig sind.
Und wir beginnen zu induzieren sind mehr und mehr Segmentation Faults.
Oder in einem Mac oder einem PC, nur Veranlassen eines Computers zum Aufhängen
oder ein Programm zu frieren, möglicherweise.
>> So, jetzt behaupten, ich in Kopie-0.c, dass ich werde diese Zeichenfolgen durch kopieren
der Leitung 28.
Und dann, ich werde an der Unterseite, dadurch gekennzeichnet
hier, dass ich werde , einen von ihnen zu ändern.
>> So merkt das.
Ich rufe unseren alten Freund strlen.
Und nur auf Englisch erklären was diese Linie 34 ist da?
Was bedeutet t Halterung 0 stellen auf der linken Seite.
Ja.
>> ZIELGRUPPE: Erstes Zeichen von T?
David J. MALAN: Erstes Zeichen von t.
Das ist es.
Erste Zeichen von t, ich will um die Großversion zuordnen
des ersten Zeichens in t.
Das ist also Kapital der erste Buchstabe.
Und dann, das allerletzte, was ich tun In diesem Programm ist, dass ich behaupten, hier ist
das Original, S, und hier ist die Kopie, t.
>> Aber auf der Basis der Geschichte, die wir gerade erzählt, was Saiten wirklich sind,
Was ist die Linie 28 wirklich tut, und was
die daraus resultierende Fehler gehen auf dem Bildschirm sein?
>> Also zuerst, die erste Frage, 28.
Was ist String t = s wirklich tun?
Wenn man auf der linken Seite haben Seiten hier String t = s;
das gibt mir eine Box hier und hier eine Box.
Und angenommen, diese Adresse 0x, sagen wir mal, 50 dieses Mal, willkürlich.
Was bedeutet String t = s tun unter der Haube?
>> ZIELGRUPPE: [unverständlich]
>> David J. MALAN: Es speichert die Speicher Adresse gibt, so geht es 0x50.
Also, wenn jetzt, gehe ich in der ersten Zeichen in Großbuchstaben T und es,
was soll ich tun, um effektiv zu s?
Ich bin wirklich das Gleiche tun, oder?
Denn wenn 0x50-- Adresse und gerecht, ich nicht viel Platz auf dem Board haben hier,
aber davon ausgehen, dass dies hier unten 0x50, irgendwo im Speicher meines Computers.
>> Und ich habe, zum Beispiel, Gabe hier in Kleinbuchstaben, wie diese.
Und ich habe gesagt, t Halterung 0 wird aktiviert.
Nun, t 0 Halterung ist der erste Buchstabe in t.
So wenig g ist los groß geworden G. Aber das Problem
ist, was ist auch, darauf hinzuweisen?
>> ZIELGRUPPE: Das gleiche.
>> David J. MALAN: exakt das gleiche Ding.
So eine einfache Erklärung vielleicht, auch wenn die Syntax ist ein wenig seltsam.
Also lassen Sie uns dies tun.
Machen Kopie-0 und dann ./copy-0.
Sagen Sie etwas: Gabe.
Und leider, sowohl von sie haben jetzt aktiviert wurde,
aber für diesen Basiswert Grund dafür, dass wir einfach
nun mit Adressen.
>> So, wie wir beginnen address-- kein Wortspiel intended--
Wie können wir damit beginnen, richten Diese besondere Problem?
Nun, in copy1.c, die Dinge laufen um ein wenig komplizierter.
Aber ich würde behaupten, ein konzeptionell einfache Lösung.
>> So schwer, auf den ersten Blick zu bekommen.
Nicht einfach für die erste zu sein, Zeit, die Sie geben es aus, vielleicht,
aber wenn das Problem ist, dass einfach tun, t = s nur
kopiert die Adresse, was, wieder, wenn ich auf Sie wählen,
wird sich die Lösung sein eigentlich eine Kopie für einen String?
>> ZIELGRUPPE: Wir werden wahrscheinlich verwenden Sie eine Schleife wieder.
>> David J. MALAN: Ja.
Also werden wir, um eine Schleife wieder benötigen.
Und weil, wenn wir kopieren wollen ein String s in eine andere Zeichenfolge,
wir wahrscheinlich wollen, es zu tun Zeichen für Zeichen.
Aber das Problem ist, wenn Dies ist ursprünglich s,
Jetzt müssen wir explizit starten Zuweisen von Speicher für t.
>> Mit anderen Worten, wir neu zeichnen diese ein letztes Mal.
Wenn dies string s = GetString.
Und lassen wir diese hier, wie gut.
Dies ist GetString.
Und dann ist das Bild etwas wie das wird sein wie zuvor,
g-a-b-e / 0.
Das sieht ein wenig so etwas wie dieses.
Und s daher nennen wir das 0x50, und das wird auf 51, 52 sein.
>> Das ist also 0x50.
Und dann, ich weiß String t.
In Erinnerung, das ist gerade dabei, geben Sie mir einen kleinen Platz wie diesem.
Also, was ist der entscheidende Schritt ist jetzt?
Wenn ich s in t zu kopieren, was Rohling brauchen wir, um hier zu füllen?
Oder was brauchen wir, um tun auf einem hohen Niveau?
Ja?
Jemand?
Ja.
>> ZIELGRUPPE: Wir müssen [unverständlich].
David J. MALAN: Ja, wir müssen in dieser leere zu füllen.
Ich kann nicht kopieren und dann Kapital Gabe Namen
bis ich fragen, das Betriebssystem für einen anderen Teil des Speichers
das ist mindestens so groß wie das Original.
So dass lässt uns mit einer Frage.
>> Wie frage ich das Betriebssystem nicht nur für eine kleine, einfache pointer--
dies heißt, ein Adresse, eine pointer-- nicht
für eine einfache kleine Box wie nennt man das einen String?
Wie kann ich das Betriebs fragen System für einen großen Teil des Speichers?
Bisher habe ich nur bekommen das zurück indirekt durch den Aufruf GetString.
Also, wie ist GetString sogar immer seine Erinnerung?
>> Nun, es stellt sich heraus, dass es hier diese andere Funktion
dass wir jetzt damit beginnen, zu verwenden.
Nun, das sieht viel mehr kryptische than-- und ich bin der einzige, der es-- sehen können
Diese Zeile sieht so kryptischer dann sollte es auf den ersten Blick.
Aber lassen Sie uns necken sie auseinander.
>> Auf der linken Seite habe ich char * t.
Also in Deutsch, Englisch, beginnen wir zu formulieren richtige Sätze im Fachjargon.
Also das ist die Zuteilung einer Variable vom Typ char * t genannt.
Nun, was bedeutet das wirklich?
>> Nun, das bedeutet, was soll ich in dieser Variable namens t setzen?
Eine Adresse eines char.
Also das ist nur die einfacheren, vernünftiger Weise
der Beschreibung der linken Seite.
So dass diese Box schafft hier nur.
So dass die rechte Seite, Vermutlich wird
zu vergeben, dass größere Teil des Speichers, wie?
Also lassen Sie necken diese auseinander.
>> Es ist überwältigend auf den ersten Blick aber was ist los hier drinnen?
Zunächst gibt es malloc, die ist offenbar unser neuer Freund,
"Speicher zuweisen."
Also das ist das Argument übergeben hinein, so ist es ein ziemlich großes Argument.
Also lassen Sie necken diese auseinander.
>> Strlen s natürlich darstellt the--
ZIELGRUPPE: Die Anzahl der Zeichen.
David J. MALAN: Nur die Anzahl der Zeichen s.
So dass die Länge s der Original-Zeichenkette.
So G-a-b-e.
So ist es wahrscheinlich in diesem Fall vier.
Warum mache ich ein nach Aufruf strlen von s?
ZIELGRUPPE: [unverständlich]
David J. MALAN: Für die Sonder Null-Zeichen.
Wenn Sie mich fragen, was ist die Länge der Gabe Namen, ich werde sagen, vier.
Unter der Haube, aber ich brauche dass fünften Byte für den Nullzeichen.
Also das ist, warum ich das tue die +1.
>> Jetzt brauchen Sie nur, wenn Sie aktiv sind dies Programm auf einem anderen Computer als, sagen wir,
die CS50 Gerät, wobei die Größe eines Zeichens
könnte anders sein aus meiner eigenen computer--
stellt sich heraus, dass ich das nennen Operator sizeof, fragen Sie einfach den Computer,
was der Größe eines char auf diesem Computer?
>> Und durch Multiplizieren dieser fünf Beispiel von der Größe eines char, die
auf den meisten Computern wird nur eine, malloc sein
wird sich für mich diese große zuweisen Teil des Speichers hier auf der rechten Seite.
Und es geht um return-- es ist ein function-- so ist es
werde mir was zurück?
ZIELGRUPPE: Die Adresse?
David J. MALAN: Die Adresse von was?
ZIELGRUPPE: der Speicher zugeordnet?
David J. MALAN: Von den Speicher zugeordnet.
Also ich habe keine Ahnung, ehrlich gesagt, wo dies geht, um am Ende.
Ich werde vorschlagen, dass es wird bei 0x88 am Ende.
Völlig willkürlich, aber irgendwo anders als 0x50,
Da das Betriebssystem, was Für mich Windows und Mac OS zu tun, ist
stellen Sie sicher, dass es was mir verschiedene Stücke von RAM.
>> Also das ist der Wert, wenn die Teil des Speichers könnte am Ende.
Also das ist, was hier landet in, 0x88.
So, jetzt klar, kann ich verstehen daß dies nicht das Gleiche wie diese,
weil sie auf Zeige verschiedene Stücke von Speicher.
Also, wenn ich jetzt tatsächlich auf diese kopieren möchten in, machen wir Ihnen vorgeschlagenen Lösung.
>> Lassen Sie uns gerade gehen, erstellen Sie eine for-Schleife, und tun t i Halterung bekommt s i Halterung.
Weil ich jetzt verwenden können, Dieses Array-ähnlichen Notation,
denn auch wenn malloc sehr generisch ordnet mir Speicher,
Speicher ist nur zusammenhängende Bytes.
Byte, Byte, Byte-, Zurück, um wieder zurück.
>> Ich kann sicherlich als Programmierer behandeln es als ein Array, das
bedeutet, ich kann diesen schließlich vertraut verwenden Notation von nur einigen eckigen Klammern.
>> Also lassen Sie mich es zu unterbrechen, weil Dies ist eine Menge auf einmal, auch
obwohl die Grundidee zur Erinnerung ist, dass String, die ganze Zeit,
ist keine neue Datentyp an sich bekannt.
Es ist nur eine so genannte Zeiger, eine Adresse eines Zeichens,
das bedeutet, es ist nur eine Zahl dass durch menschliche Konvention
neigen wir dazu, wie 0x etwas zu schreiben.
>> Aber es ist nur eine Nummer, wie 33 Oxford Street,
, die zu den zufällig Adresse CS Gebäudes.
Sie haben Fragen zu diesen Details?
Ja?
>> ZIELGRUPPE: Warum müssen wir überprüfen, für t gleich null?
>> David J. MALAN: Warum haben wir prüfen t gleich null?
Wenn wir lesen, die documentation-- große question-- für malloc,
es wird in Kleingedruckte zu sagen, manchmal malloc könnte null zurück,
wie GetString.
Und in der Tat, gibt GetString null Wenn wiederum liefert malloc null,
weil GetString verwendet malloc.
>> Und das könnte passieren, wenn das Betriebssystem, Mac OS, Windows, was auch immer, ist einfach
aus der Erinnerung für Sie.
Also das ist, was da passiert.
>> Und lassen Sie mich zeigen eine andere Sache dass nur blasen könnte Ihre Meinung
oder vollständig zu weit über die Linie.
Aber lassen Sie mich nach oben ziehen elbe for-Schleife zum Kopieren,
die vor einem Augenblick war Rückruf Diese. t i Konsole bekommt s i Halterung.
>> Schön und benutzerfreundlich.
Fühlt Woche zwei wieder.
Aber diese Version tatsächlich sein kann wie dieses, das kryptische sieht neu geschrieben.
Es ist eine Technik, die als Zeiger Arithmetik, Adresse Arithmetik.
Aber warum funktioniert das?
>> Jetzt ärgerlich, die Autoren von C entschied sich für
Das Symbol * für verschiedene Zwecke.
Wir haben gesehen, dass es schon einmal benutzt, char *, das bedeutet "geben Sie mir eine variable
das wird sich enthalten die Adresse eines char. "
So char * in diesem Zusammenhang bedeutet "geben Sie mir eine Variable."
>> Leider, wenn Sie die * ohne verwenden ein Wort vor sich, wie char,
es ist jetzt genannt Dereferenzierungsoperator.
Und wir werden schon bald mehr davon zu sehen.
Aber es bedeutet nur, "dorthin zu gehen."
Es ist wie gesagt, wenn mich jemand übergeben auf ein Stück Papier ", 33 Oxford Street",
wenn ich "* 33 Oxford Street", das heißt "Gehen Sie die Straße bis zum CS Gebäude."
>> So * bedeutet nur, wenn es gehen es gibt kein Wort vor ihm.
Also, was ist t, klar zu sein?
t ist die Adresse des Blocks aus Speicher, der zu mir zurück gegeben wurde.
s ist die Adresse von dem, was, klar zu sein, im Beispiel haben wir diskutiert,
von Klein Gabe?
s ist die Adresse von--
ZIELGRUPPE: Der String.
David J. MALAN: Von Gabes ursprünglichen Namen.
So ist es die Adresse des Dieses Teil des Speichers.
Also, wenn ich sage, t + i-- i, Bekanntmachung, ist nur unser alter Freund.
Es ist nur eine Indexvariable das ist die Iteration von Null auf bis
um die Länge der Zeichenfolge s.
Also es geht auf Null, dann eins sein, dann zwei, dann drei, dann vier.
Also lassen Sie uns zusammen diese neue Kratz wie Puzzleteile, wenn man will,
obwohl wiederum die Syntax ist weit mehr als obskuren Scratch.
Also t ist eine Adresse + Ich wird mich geben
eine Zahl, da es sich um Zahlen, die wir als Hex-Zeichnung worden.
Aber sie sind nur Zahlen.
>> Also, wenn die Adresse von T gesagt war 0x88, 0x88, was plus null.
Auch wenn Sie sich nicht wohl sind mit Sechskant noch, einen Vermutung.
>> ZIELGRUPPE: Das Original.
>> David J. MALAN: Noch 0x88.
Also, was bedeutet * 0x88 das?
Es bedeutet, "dorthin zu gehen", was bedeutet, effektiv, "Reiche deinen Finger her."
Und nun auf der rechten Seite von Dieser Ausdruck, * und dann in Pars,
s + i bedeutet s, was der ist Adresse hier von dem kleinen g.
s + 0 ist, natürlich, s, was s ist.
>> So, jetzt ist es * s, die wie * 33 Oxford Street bedeutet rufen Sie die Adresse
s.
Also hier ist dieser Finger der rechten Hand.
Also, was soll ich nur in das, was zu kopieren?
Das, was auf der rechten Seite, die ist gabe, wenig g hier in hier.
>> Und so ist die Wirkung dieser ersten Iteration der Schleife,
Sie vorgeschlagen, obwohl es scheint verrückt komplizierter als alles, was
wir zuvor gesehen haben, ist einfach zu sagen, gehen Sie hier und kopieren Sie dieses Zeichen hier.
Es gibt dir eine Karte, um den beiden Standorten.
>> Und wir werden viel mehr davon zu sehen.
Aber jetzt ist die Hoffnung, nur um stellen einige dieser grundlegenden Ideen.
Und in der Tat, schauen wir uns an eine endgültige Programm hier
und dann die versprochene claymation, das wird alles in Ordnung zu machen.
In Ordnung.
Also lassen Sie mich zu öffnen up-- es wir gehen.
Also lassen Sie mich- wir kommen wieder zu diesem Bild vor lang.
Lassen Sie mich hier eröffnen dieses letzte Beispiel.
>> So, hier ist ein super, super Programm, das vollbringt
nichts im Leben, die die folgende tut.
Es erklärt ersten beiden Variablen x und y, die nicht dieses Mal sind Zahlen,
an sich.
Sie sind nicht Zahlen, an sich.
Sie sind offenbar int *.
Also einfach jemand, was bedeutet es, wenn Ihre Datentyp Ihrer Variablen,
ist vom Typ int * Sterne?
Das ist die Adresse einer int.
>> Also ich habe keine Ahnung, wo es noch ist.
Es bedeutet nur, "setzen, schließlich, die Adresse einer int hier. "
0x50, 0x88, überall dort, wo es sich befindet Speicher wird eine Adresse dort vor sich geht.
Und das ist, was y sein wird, als auch.
>> Wenn ich jetzt sagen, x = malloc (sizeof (int)), das ist eine andere Art zu sagen,
hey Betriebssystem, über malloc, gib mir genug Speicher für die Größe
eines int, das ist wahrscheinlich gehen auf 32 Bit oder vier Bytes.
>> Also, was bedeutet malloc zurückkehren?
Malloc gibt eine Adresse.
Also, was ist los in x gespeichert werden?
Die Adresse der Brocken Speicher, die vier Bytes, dass malloc
nur für mich mit der Frage gefunden das Betriebssystem.
>> Jetzt unterdessen Linie vier hier der * x = 42.
Nur klar zu sein, was ist los da unten?
Auf der linken Seite, * x.
das ist wie * 33 Oxford Street.
So * x bedeutet was?
>> ZIELGRUPPE: Gehen Sie zu.
>> David J. MALAN: Gehen Sie an diese Adresse.
Wo immer das Stück Speicher ist, gehen Sie zu ihm.
Und setzen, was es offensichtlich?
ZIELGRUPPE: 42.
David J. MALAN: 42.
Alle Rechte, * y, gleiche Idee.
Rufen Sie die Adresse in y.
Legte die Zahl 13 gibt, aber was ist y im Moment?
ZIELGRUPPE: Es gibt keine Speicher für y.
David J. MALAN: Es ist kein Speicher für y.
Also, was tut y wahrscheinlich enthalten, wie wir gesagt habe?
>> ZIELGRUPPE: Abfall.
>> David J. MALAN: Einige Müll Wert.
Nun, das ist Müll Wert immer noch eine Zahl.
Es kann immer noch fälschlicherweise für eine Adresse sein.
Es ist, als ob jemand kritzelte etwas nach unten,
und ich falsch interpretiert es als Bedeutung einige Gebäude auf der Straße.
Und wenn Sie nur versuchen, in zu gehen einige Gebäude, das Sie nicht besitzen,
oder einige Stück Speicher Sie nicht gegeben gewesen, hätte schlimme Dinge passieren.
Computer abstürzen oder eine andere unbestimmten Verhalten passieren könnte.
>> Also das Intro, dann ist es, diese Binky.
Ich erinnere mich noch, 20 einige ungerade Jahre später,
wo ich war, als ich endlich verstanden Zeiger.
>> Welches ist zu sagen, wenn Sie hier lassen in drei Minuten
und ich denke nicht Zeiger verstehen, erkennen
Ich habe für 20 erinnert Jahre für einige verrückte Grund
wann und warum es schließlich versenkt in, sitzend mit meiner Lehre
Kerl, Nishat Mehta in der Rückseite Eliot Dining Hall.
Nun, ich habe in Erinnerung Deshalb war
eines der Themen, die ich in Insbesondere kämpfte mit.
Und dann war es endlich geklickt haben, Ich wage zu sagen, wie viele Themen
schließlich will.
Und nun, zu machen, dass das Gefühl, die ganze glücklicher und umso überzeugender,
werfen wir einen letzten Blick in unsere letzten drei Minuten hier bei Binky,
von unserem Freund, Nick Parlante von der Stanford.
>> [VIDEO PLAYBACK]
>> -Hey, Binky.
Aufwachen!
Es ist Zeit für Zeiger Spaß.
>> -Was Ist das?
Erfahren Sie mehr über Zeiger?
Oh, gute sachen!
>> Nun, um zu beginnen, ich denke, wir sind gehen, um ein paar Zeiger müssen.
>> -OK.
Dieser Code weist zwei Zeiger, das kann auf ganze Zahlen zeigen.
-OK.
Nun, ich sehe die beiden Zeiger, aber sie scheinen nicht zu sein, die auf irgendetwas.
>> -Das Ist richtig.
Zunächst Zeigern nicht auf nichts.
Die Dinge, die sie werden als Punkt pointees und deren Einrichtung die
ein separater Schritt.
>> Oh, richtig, richtig.
Das wusste ich.
Die pointees sind getrennt.
Er, so wie Sie einen pointee zuordnen?
>> -OK.
Nun, dieser Code ordnet eine neue Integer pointee,
und dieser Teil Sätze x auf ihn verweisen.
>> -Hey, Dass besser aussieht.
So machen es etwas zu tun.
>> -OK.
Ich werde den Zeiger dereferenzieren x zu Speichern Sie die Nummer 42 in seiner pointee.
Für diesen Trick, ich brauche meine Zauberstab dereferenzieren.
>> -Ihr Magic Wand von Dereferenzierung?
Dass-- das ist großartig.
>> Dieses wird, wie der Code aussieht.
Ich werde einfach die Nummer, und [POP] eingestellt
>> -Hey, Zu suchen.
Da geht es.
>> SO macht einen Dereferenzierung von x folgt der Pfeil auf seine pointee zugreifen.
In diesem Fall, ein Geschäft 42 drin.
Hey versuchen Sie es, um die Nummer zu speichern 13 durch die anderen Zeiger, y.
>> -OK.
Ich werde einfach gehen hier auf y, und erhalten die Zahl 13 Einrichtung.
Und dann nehmen Sie die Wand von Dereferenzierung und nur [BUZZ]
>> Oh!
>> Oh, hey!
Das hat nicht funktioniert.
Sagen, Binky, ich glaube nicht, dass die Dereferenzierung y ist eine gute Idee, weil Sie wissen,
Einrichten der pointee ist ein getrennter Schritt.
Und ich glaube nicht, dass wir je gemacht habe.
>> -Gute Punkt.
-Ja.
Wir vergeben den Zeiger y, aber wir nie stellen Sie ihn auf zu einem pointee zeigen.
>> -Sehr aufmerksam.
-Hey, Du bist es gut aus, Binky.
Kann man das lösen, so dass y Punkte auf den gleichen pointee als x?
>> -sure.
Ich werde mein Zauberstab von Pointer Zuordnung.
>> -Ist Dass sein wird ein Problem wie vorher?
-no.
Dies berührt nicht die pointees.
Es ändert sich nur ein Zeiger auf zeigen auf die gleiche wie die andere.
>> Oh, ich verstehe.
Jetzt y Punkte auf der gleichen Stelle wie x.
Also warten.
Nun wird y befestigt.
Es hat eine pointee.
So können Sie den Zauberstab der versuchen Dereferenzierung wieder um die 13 über zu senden.
>> -Uh, OK.
Hier geht es. [POP]
>> -Hey, Schau dir das an.
Jetzt Dereferenzierung Arbeiten auf y.
Und da die Zeiger geben dass man pointee, sie beide sehen den 13.
-Ja.
Teilen, was auch immer.
So werden wir an Orte, jetzt wechseln?
>> Oh, schau.
Wir sind aus der Zeit.
>> -But--
>> -Just Erinnern die drei Zeiger Regeln.
Eine Zahl, die Grundstruktur ist, dass Sie einen Zeiger haben,
und er zeigt auf eine über pointee.
Aber der Zeiger und pointee sind getrennt,
und die gemeinsame Fehler ist die Einrichtung einen Zeiger,
aber zu vergessen, es eine pointee zu geben.
>> Nummer zwei, Zeiger Dereferenzierung beginnt an der Zeiger
und folgt dessen Pfeil über seine pointee zugreifen.
Wie wir alle wissen, diese funktioniert nur, wenn es
ein pointee, welche Art von erhält zurück zu Regel Nummer eins.
>> Nummer drei, Zeiger Zuordnung erfolgt ein Zeiger
und ändert es auf den Punkt pointee gleichen wie ein anderer Zeiger.
Also nach der Abtretung die beiden Zeiger
wird auf die gleiche pointee zeigen.
Manchmal, so nennt man Sharing.
Und das ist alles dort ist zu ihm, wirklich.
Bye-bye jetzt.
[END VIDEO PLAYBACK]
David J. MALAN: Das ist es für CS50.
Wir sehen uns nächste Woche.