[Musikwiedergabe] David J. MALAN: Das ist wie ein Neuling Seminar heute. OK. So sehr regnerisch aus. Dieser neigt dazu, am Mittwoch geschehen, aber umso Gelegenheit Fragen heute. Lassen Sie uns also beginnen, tatsächlich mit dem Film in nur einem Augenblick. Aber wir werden wie immer großartig zu starten. Dies CS50 und dies ist das Ende der Woche 4. Also, wenn Sie jemals gesehen haben Fernsehen oder einen Film, wobei es gibt einige Computer-Experten und die Polizei oder FBI oder eine Agentur versucht, etwas zu fangen Gegner, gut, haben Sie vermutlich gehört, den Ausdruck "zu verbessern" wobei die Techniker irgendwie magisch zoomt stufenlos weit, um die Verbrecher zu sehen Identität oder das Kennzeichen selbst in den Schimmer eines Spiegels oder der Schimmer von jemandes Auge. Also ja, lassen Sie uns einen Blick auf ein paar solche Szenen aus Hollywood. [VIDEO PLAYBACK] -OK, Jetzt lassen Sie uns einen guten Blick auf Sie. -Halte es. Führen Sie das zurück. -Warte eine Minute. Geh rechts. -Es, Gefriert, dass. -Vollbild. -OK, Einfrieren, dass. Up auf, dass eine Straffung, werden Sie? -vector In auf, dass Kerl vom Hinterrad. -zoom In hier an dieser Stelle. -Mit Der richtigen Ausrüstung, die Bild konnte erweitert und geschärft werden. -Was ist das? -Es Ist eine Steigerungsprogramm. -Kann Sie klar, dass Sie überhaupt? -Ich weiß es nicht. Lassen Sie uns zu verbessern es. -Verbessern Abschnitt A6. -I Verbessert das Detail, und-- Ich glaube, es gibt genug, um zu verbessern, lassen Sie ihn zu meinem Bildschirm. -I Verbessert die Reflexion in ihrem Auge. -Let Dieses durchlaufen Video-Enhancement. -Edgar, Können Sie verbessern das? -Abwarten. -Ich Wurde auf dieser Reflexion arbeitet. -Someone Reflexion. -Reflexion. -Es Ist ein Spiegelbild der das Gesicht des Mannes. -Die Reflexion. -Es Ist eine Reflexion. -ZOOM In auf dem Spiegel. -Sie Können ein Spiegelbild zu sehen. -Kann Verbessern Sie das Bild von hier? -Kann Man ihn verbessern hier richtig? -Kann Man es verbessern? Können Sie es verbessern? -Kann Erweitern wir das? -Kann Man es verbessern? -Halten Auf einer zweiten, ich werde zu verbessern. -ZOOM In an der Tür. -Zeiten 10. -zoom. -Einziehen. -Mehr. -wait, Zu stoppen. -Stopp. -PAUSE Es. -rotate Uns 75 Grad um die vertikale, bitte. -Stopp. Zurück zum Teil über der Tür, noch einmal. -Haben Sie einen Bildverstärker, die Bitmap kann? -Hey, Vielleicht können wir die Pradeep verwenden Sen Methode, um in die Fenster zu sehen. -Diese Software ist Stand der Technik. -Die Eigenwert ist ausgeschaltet. -Mit Der rechten Kombination von algorithm-- -Er Genommen Eliminierung Algorithmen, um die nächste Stufe, und ich kann sie zu bedienen erweitern Sie dieses Foto. -Verschluss Auf und vergrößern den z-Achse. -Verbessern. -Verbessern. -Verbessern. -Freeze Und zu verbessern. [END PLAYBACK] David J. MALAN: Okay, so alle, die sind eigentlich Worte. Sie sind einfach zusammen in eine aufgereiht Weise, die nicht wirklich sinnvoll ist. Und in der Tat, CS50 und Kurse, wie es neigt dazu, eine Menge von TV und Filmen zu ruinieren für dich. Denn wenn dieser Computer-Experten sind leiern Bedingungen und sagen Lust Dinge wie Eigenvektoren und die z-Achse, und jede Anzahl von anderen eigentlich mehr Fachbegriffe, sie sind wirklich nur Bespannen Wörter zusammen allzu oft. Ist, dass einer unserer Hoffnung ist, dass, als Nebeneffekt der Teilnahme an Kursen wie diese, werden mehr Menschen in der Welt tatsächlich in der Lage, um in wiegen und nur immer so leicht beeinflussen die Qualität und Genauigkeit dieser Filme? In der Tat, werfen wir einen Blick auf die Realität. So, hier ist das Personal Foto Mary, einer unserer Lehr Stipendiaten. Und angenommen, sie ist von etwas vermutet. Und doch gibt es einen Schimmer von einige Beweismittel in ihren Augen, oder in der Reflexion ihre Brille. Nun, wenn wir genau das tun, wie die Filme vorzuschlagen, bei dem wir zu vergrößern und "verbessern", Das ist, wie viel Information ist in Marys Gesicht wenn Sie ein Bild zu erfassen mit dieser Auflösung. Und in der Tat, können Sie diese Punkte zu sehen. Und das sind, was sind Pixel genannt, P-I-X-E-L-S, Das ist nur ein Quadrat in der Regel das ist ein Punkt, der ein Bild komponiert. Und wieder in den Tag, und tatsächlich sogar heute mit einigen der heutigen LED-Fernseher oder LCD-Fernseher, wenn du hast einem auf Ihrem Zimmer oder in der Wohnung, wenn Sie gehen ganz nah, und vor allem, wenn es ist ein etwas älteres TV, Sie können sich wahrscheinlich sogar sehen diese Punkte und das ist, was ein Bild zu komponieren. Und es gibt nicht mehr Informationen als diese. Wir könnten "zu verbessern", im Sinne von Glätten Dinge immer und Art Ableiten Art, Art, was Farbe sollte neben Marien Auge so dass es nicht tatsächlich so pixelig. Aber wenn ich immer Zoomen gibt ist der Bösewicht in ihrem Auge. Wie das ist alles Informationen, die wir haben. Sie können keine Informationen aus dem Nichts. Es gibt nur eine endliche Anzahl von Bits besteht. So in Übungsblatt 4, wobei Sie die Möglichkeit haben, um mit dieser Art der Welt zu spielen. In Problem Set 4 erfahren Sie, die Welt der Grafiken und Forensik, und tatsächlich Code schreiben dass erholt verlorene Bilder. Du wirst Code schreiben, dass manipuliert vorhandene Bilder und schließlich zu verstehen, was ist geht unter der Haube. Und stellt sich heraus, es ist eigentlich nicht so kompliziert. Zum Beispiel, wenn wir wollten stellen ein Smiley-Gesicht, wo mit diesen schwarzen Pixeln, oder diese schwarze Punkte, gut, wir einfach darstellen könnte sie als wirklich ein Bitmap. Und wenn Sie jemals davon gehört hatte Ausdruck Bitmap, vielleicht Jetzt beginnt eine zu machen wenig mehr Sinn, heute. Wir wissen bereits, was ein bisschen ist. Es ist 0 oder 1. Und eine Karte ist nur etwas wie ein Stück Papier das gibt Ihnen Richtungen und hat vielleicht ein Raster von x- und y-Koordinaten. So, hier ist eine Bitmap. Es ist eine Karte von Bits wobei a 1 ist anscheinend werde ein weißes Pixel darstellen, und eine 0 wird, um ein schwarzes Pixel darzustellen. Aber wir könnten sicherlich drehen Sie sie um. Es spielt eigentlich keine Rolle, so solange wir konsequent. Und hier ist, wie, in binary-- innen Arbeitsspeicher eines Computers, oder sogar in einer Datei auf Ihrer Fest drive-- könnten Sie speichern die einfachsten Smiley Bilder. Aber was sollen wir, natürlich, fehlt in diesem Bild? Farbe, nicht wahr? Es ist offensichtlich, dass die nächste Stufe oder Verbesserung, dies mit Farbe zu verbessern. Also leider mit nur einem einzigen bit, 0 oder 1, wir könnten Farbe darzustellen. Das könnte rot oder blau sein, oder schwarz oder weiß, oder grün oder rosa, oder irgendwelche Farbenpaare. Aber der Einfachheit halber werden wir einfach davon ausgehen, schwarz und weiß. Also, was logischerweise müssen wir, wenn wir wollen Farbe in einem Bild zu implementieren? Was müssen wir machen? Wie, wenn der begrenzende Faktor hier ist, dass mit einem Bit können Sie nur repräsentieren zwei Zustände 0 oder 1, weiß oder schwarz, was wollen Sie tun? ZIELGRUPPE: Mehr Daten. David J. MALAN: Mehr Bits, ja mehr Daten, mehr Bits. Und in der Tat, das ist genau, wie Farbbilder werden dargestellt. Verwenden, anstatt ein einzelnes Bit, ein 0 oder 1 für jedes Pixel, wobei jeder Punkt, Sie benutzen Sie einfach mehrere. Vielleicht verwenden 8, vielleicht, besser bekannt verwenden 24, und in der Tat, in Übungsblatt 4, werden Sie mit einer Datei zu spielen Format 24 Bits typischerweise verwendet. Aber die meisten von Ihnen sind wahrscheinlich vertraut mit JPEGs. Wenn Sie jemals gemacht hätten ein Foto auf Ihrem Telefon, oder hochgeladen oder sehen etwas auf Facebook oder Flickr, eine beliebige Anzahl der Foto-Websites, haben Sie wahrscheinlich ein JPEG-Bild gesehen. Und es stellt sich heraus, dass dies die Datei Format werden wir in PSet 4 verwenden, wodurch du zu gehen haben, um Bilder zu erholen dass ich aus Versehen von einem gelöschten beschädigten Speicherkarte in der Kamera, wenn du möchtest. Und es stellt sich heraus, dass, obwohl JPEG ist ziemlich sophisticated-- es ist viel anspruchsvoller als die schwarzen und weißen Punkten wir vorhin gesehen haben, denn es gibt tatsächlich Lust Algorithmen, werden verwendet, um einen JPEG komprimieren, so dass Sie ein wirklich schöner machen können, Bildqualität, aber unter Verwendung von relativ wenige Bits. Und wir werden zurückkommen Kompressions es dauerte nicht lange. Es stellt sich heraus, daß die erste drei Bytes in einem JPEG image-- egal, was Sie ein Foto aufgenommen haben von-- sind die Werte 255, 216, 255. Mit anderen Worten, wenn Sie gerade sehen, dass Muster von Bits, hier als drei vertreten Bytes oder 24 Bits insgesamt, mit hoher Wahrscheinlichkeit kann man folgern, dass Sie sind auf es auf diese ersten drei suchen Bytes einer JPEG. Und das ist, was ist bekannt nach der Unterzeichnung eines JPEG. Viele Dateiformate da draußen sind in der Regel starten mit bestimmten Mustern von 0 und 1, so dass Windows und Mac OS und iOS, Android und wissen, welche Art von Datei, die sie sind, zusätzlich zu dem sogenannten Datei Erweiterung, dass viele Dateien haben. Wenn Sie .jpg haben, das ist, ein weiterer Hinweis auf den Computer. Also lassen Sie uns nun einen Blick auf diese ein wenig technisch. Wir wissen, das Dezimal System von 0 bis 9. Wir wissen, binär 0 und 1. Und wenn Sie denken, PSet zurück 0 hatten wir Sie mit zu ringen, für ein wenig, etwas, genannt hexadezimal, wo Sie haben 16 Stellen, anstelle von 10 oder anstelle von 2. Und jene Ziffern, durch Konvention, sind von 0 bis 9 und dann eine bis f, wobei f, was Dezimalzahl, ebenso wie eine schnelle geistige Gesundheit überprüfen? So, 15. Und ein Muss 10 nur durch die Betreiber, Art der Bestellung, die ich gegeben habe. Es ist nur eine willkürliche Konvention aber es ist ziemlich Standard. Also, wenn wir auf diesem Muster von drei bytes-- uns gelassen starten Sie einfach, es zu sehen in Einklang mit how Informatiker der Regel schauen und denken über Dateien. Sie können sicherlich zu denken Dateien in 0s und 1s und dezimal, aber in Wirklichkeit ist, neigen wir dazu binäre verwenden oder typischer hexadecimal-- zurück von PSet 0. Also lassen Sie mich schlagen vor, 255, 216 und 255 sind nur diese Muster von 0 und 1. Und Sie können dies überprüfen, wenn Sie wollen die Mathematik von Woche 0 zu tun. Aber für jetzt, einfach davon ausgehen, dass dies in der Tat richtig. Ich habe gerade drei Dezimalstellen umgeschrieben Zahlen als drei binäre Werte. Nun, was ich zu tun ist, fügen Sie einfach einige Leerraum, nur zur besseren Lesbarkeit willen. Und beachtet, Ich werde einfach die Dinge bewegen sich auseinander. So vor, nach vor, nach. Ich bin nichts Interessantes anderen tun als nur die Verbreitung Dinge so Hinweis, dass jeder Satz von acht Bits ist nun zwei Gruppen von vier Bits. Dies ist nützlich, weil hexadezimalen Besonders modisch weil jede Hexadezimalzahl zwischen 0 und f oder insbesondere 0 bis 15, dargestellt werden kann mit genau vier Bits. Mit anderen Worten, wenn man in hexadezimaler wollen eine 0 darstellen, ist es nur 0000, vier Nullen. Und wenn Sie repräsentieren 15 möchten, es ist 1111, die vier Bits ist. Und wenn Sie die Mathematik zu tun, ob dies der Ort, diejenigen, dies ist der Ort, 16s, das wird sich geben Sie-- sondern das wird zu-- sorry, in binärer, das wird Ihnen 15, diejenigen statt, Zweien Ort, Vieren und Achter Platz. Also lassen Sie mich schlagen vor, dass Set von vier Bits auf der linken Seite ist das, was wir werden f rufen. Es ist die größte Zahl, die Sie kann mit vier Bits stellen. Und wir von hexadezimalen wissen bereits, f ist die größte Ziffer in hexadezimal. Wir haben eine andere f dort ankamen, zwei weitere drüben. Und jetzt, auf den Glauben zu nehmen dass ich die Mathematik richtig gemacht und dass die linke Hälfte dieser Bits, 1101, ist das gleiche wie in d hexadezimal. Und die rechte Hand, 1000, ist nur 8. Und dass man die leicht nach rechts zu sehen? Die 8 represents-- richtig ist unter diesem Achter Platz. Also haben wir eine in der Achter Spalte und nichts in den Vieren, zu zweit oder Einsen. So, jetzt mehr konventionell, Menschen neigen dazu, In den hexadezimalen Ziffern so zu schreiben, Sie gerade zerquetschen sie zusammen, und dann können Sie sie mit 0x voranstellen. Es bedeutet nichts anderes, als einen visuellen Hinweis auf ein human-- hier kommt eine hexadezimale value-- da es sonst nicht klar sein könnte. Welche also letztlich, dass das Muster von Nullen und Einsen, oder das Muster der hexadezimalen Stellen äquivalent, dass Sie gehen auf die Suche nach in Übungsblatt 4 this-- und das Problem Set 4-Spezifikation wird zu Fuß Sie durch diese in mehr detail-- sondern als eine Art geheimnisvollen wie realisieren dies könnte auf den ersten Blick, Sie gehen zu sehen, beginnen diese sehr. Und in der Tat auch in GDB, die Debugger am Montag haben wir und Dan bringt in PSet 3, wird zu oft zeigen Ihnen Hexadezimalwerte gerade weil sie dazu neigen, mehr betragen, konventionelle als dezimal oder binär in der Welt der Computer. Jetzt lassen wir diese in einen Kontext. Viele von Euch werden sich daran erinnern bild hier, was von dem, was kam? Vista, so dass selbst früher als dass, tat Windows XP dieses Debüt. Also das ist eine schöne Landschaft. Und in der Tat, wenn Sie herumzustochern online-- Ich denke, es ist ein Wikipedia-Artikel, wobei jemand ganz erstaunlich ging Fanden Sie diese Position in der Welt einzurichten seine Kamera in genau der richtige place-- und dies sieht heute aber like-- es ist genau die gleiche Einstellung. Dieses Bild ist jedoch, in einer Datei, Format namens Bitmap, b-m-p. Und wir werden ein Super nehmen kurzen Blick auf, was das bedeutet. Aber Bitmap ist nur eine andere Art, , die Bilder immer noch mit Pixel in 0 und 1, letztendlich. Aber bei schnellen Blick, hat es ein interessanter Unterschrift am Anfang der Datei. Es ist nicht nur drei Bytes, sondern es gibt eine ganze Reihe von Mustern von Bytes Diese Bedeutung vorbestimmten haben. Beispielsweise irgendwo in der ersten Bytes einer Bitmap wird sich die Größe der zu sein Bild, die Breite des Bildes, die Höhe des Bildes, so dass nützliche Metadaten, wenn man so will. Praktische Informationen, dass Photoshop oder jedem Grafikprogramm Sie verwenden könnte tatsächlich interessieren. Also mehr dazu in Problem Set 4, aber das ist nur zu sagen, dass am Ende des Tages alle Dateiformate Sie bislang verwendet haben für Jahre-- Microsoft Word-Dateien, Numbers-Dateien, Excel-Dateien, eine beliebige Anzahl von Dateiformaten das könnte einige haben bekannte Dateierweiterung sind nur 0 und 1 unter der Haube. Und Menschen haben beschlossen, was die Konventionen sind, welche Muster von 0 und 1 repräsentieren eine Word-Datei gegen eine Excel-Datei, gegen eine beliebige Anzahl von anderen Dateiformaten. So in PSet 4, werden Sie eine haben, Gelegenheit, mit, dass zu spielen. Aber was bedeutet es, eine Struktur zu haben. Dies ist eigentlich eine nette segue jetzt in C, die nur ein paar hat von zusätzlichen Funktionen, haben wir nicht noch sah. Es ist eine ziemlich kleine Sprache und einer der die nette Features zu C ist eine Struktur. Zum Beispiel, wenn man wollte represent-- lassen sagen, dass Sie eine Variable haben wollte, dass stellt ein Student in einem gewissen Programm. Vielleicht waren Sie einen Kurs zu schreiben Registrierungsprogramm, oder Kern-Shopping Werkzeug, oder so ähnlich. Was sind Stücke von Daten im Zusammenhang an einen Studenten, die in den Sinn kommen? Wie ein Schüler mit, welche Werte vertreten? Ja? Sie haben einen Namen als Student. Was braucht ein typisches Studenten haben? ZIELGRUPPE: [unverständlich] David J. MALAN: Also, sorry. Publikum: Alter. David J. MALAN: Eine Alters oder Geburtstags äquivalent yep. Was sonst? ZIELGRUPPE: ID-Nummer? David J. MALAN: So eine ID-Nummer, vielleicht eine Telefonnummer, vielleicht ein Schlafsaal, oder Haus, oder Fachhochschule, oder so ähnlich. Eine beliebige Anzahl von Stücken von Daten, Sie in Ihrer Kontaktliste haben könnte ist das, was vielleicht einen Studenten zu definieren. Wenn wir dies tun, in Code wollte, wir könnten etwas Einfaches wie dies zu tun. Wir könnten ein Programm, damit haben hat lassen Sie uns sagen, int main (void). Und wenn ich will, für einen student Ich hätte zum Beispiel ein String genannt Namen für diesen Schüler, ein String genannt Wohnheim für die Schüler, vielleicht ein int namens ID für die Schüler. Und weil ich mit Schnur, I brauchen, um zurück zu gehen und Aufmachungen CS50.h. Vielleicht werde ich stdio.h müssen. Lassen Sie mich also präventiv tun diejenigen, und ich bin werde diese student.c für jetzt anrufen und speichern Sie diese. Und jetzt kann ich etwas tun Mit diesen Variablen. Und wir sind gerade dabei, zu schreiben dass als Kommentar in Pseudo-Code, denn es ist nicht interessant was wir jetzt tun. OK, das ist so ein Programm, speichert irgendwie einen Studenten. Was will ich, wenn ich zu tun wollen zwei Studenten zu speichern? Also mein erster Instinkt wird um alles in Ordnung zu sein, warten Sie eine Minute, wenn ich einen anderen Schüler, warum nicht ich nur 2 string name, string Wohnheim 2 zu tun, int id2. Und wir haben gone getan auf diesem Weg vor und was war unsere Lösung zu dem, was scheint, Art von einem hackish kopieren und einfügen zu sein Job hier? ZIELGRUPPE: Ein Array. David J. MALAN: Ja, wir ein Array verwenden. Rechts dies sehr schnell unhandlich. Sie müssen sich beliebig sortieren von starten Namensgebung alle diese Variablen. Und Sie, der Mensch, haben zu halten Track, der OK name2 entspricht mit dorm2 entspricht id2. Es wird nur ein Durcheinander. So ist es viel einfacher, Rückruf von vor ein paar Wochen, nur mit den genannten Zeichenfolgennamen und vielleicht geben uns drei davon. Und dann vielleicht wir String-Schlafsäle und haben drei davon, oder mit einem konstanten, int-IDs und drei von denen. Aber auch jetzt das fühlt sich an ein wenig schlampig, rechts. Wir freuen uns über Schüler und doch sprechen Ich bin wirklich Wohnung auf dem niedrigen Niveau Implementierungsdetails. Der Student ist ein Name und ein Wohnheim und ID. Warum kann ich nicht einfach nur eine Variable zu deklarieren genannt Student und nennen es s. Und wenn ich einen anderen Schüler, warum nicht ich nenne es nicht einfach t. Oder wenn ich eine ganze Reihe von Studenten, warum ich nicht einfach sagen, ich habe eine ganze Klasse von Studenten, und es ist drei von ihnen. Mit anderen Worten, warum kann ich nicht kommen up mit meinen eigenen Datentyp, genannt Die Schüler, von denen im Inneren ist ein Name, ist eine ID, ein Wohnheim, ist eine beliebige Anzahl von anderen Bereichen. Und es stellt sich heraus Sie kann genau das tun. So C hat dieses Feature namens struct. Das ist eine Sprache-Funktion, die ermöglicht es uns, genau dies zu tun. Ich werde weitermachen und eröffnen structs.h wohin wir gehen, um das zu sehen folgende Definition eines Studenten. Es stellt sich heraus - und diese sogar einfacher als die eines mit einer ID vor einem Moment. Wenn Sie kommen mit möchten Ihre hausgemachten Datentyp, und zusätzlich zu int und char und schweben und all diese anderen, die es gibt, können Sie dies tun, indem sie buchstäblich Schreiben typedef struct, dann einige geschweiften Klammern, innerhalb dessen Sie Liste der Variablen, die Sie wollen, assoziieren mit diesem neuen benutzerdefinierten Daten Geben Sie wie ein Name und ein Studentenwohnheim, und dann nach den geschweiften Klammern Sie einen Namen für den neuen Datentyp zu geben. So, zum Beispiel, Student. Und was ist schön, jetzt darüber ist, dass wenn wir auf den entsprechenden Code, die Konvention, erste Vor allem ist zu bereiten in einer Datei namens etwas Punkt h, eine Header-Datei, die wir nicht haben begann mit uns zu viel. Aber wir werden beginnen mit jetzt ziemlich viel. Und was wir damit machen können, letztlich in diesen wenigen Zeilen Code ist genau das zu erklären Datentyp, ein Student. Und jetzt nutzen es zulassen. Ich werde jetzt in zu gehen eine Datei namens structs1.c. Und lassen Sie uns einen Blick auf ein einige Merkmale hier. Also das Zeug hier oben ist meist vertraut, und wir schicken kommen zurück, um, was nicht vertraut in nur einem Augenblick. Das ist natürlich auch meine eigene Header-Datei, die neu ist, als auch, Ausnahme PSet 3, wo, Recall, haben wir helpers.h. Sie könnten also #include helpers.h wieder zu verwenden. Warum aber soll ich mit Zitaten statt der eckigen Klammern? Wann muss ich zwischen ihnen wählen? Fast immer ich scheine In den eckigen Klammern verwenden. Und dann, ganz plötzlich auf Reihensechs Ich bin mit doppelten Anführungszeichen. Warum könnte das sein? Ja? ZIELGRUPPE: [unverständlich] David J. MALAN: Das ist eine tatsächliche, was? ZIELGRUPPE: Das ist in der IDE. David J. MALAN: Ja, das ist in meinem eigentlichen IDE. Und lassen Sie uns nicht auf dem IDE zu wohnen, weil das ist nur ein Werkzeug, das ich verwende. Das ist in meinem aktuellen Verzeichnis spezifisch. So structs.h ist meine eigene Datei nicht in der IDE installiert in dem Betriebssystem selbst, sondern es ist in meinem aktuellen Verzeichnis. Also der Konvention ist, wenn Sie wollen eigene Header-Datei enthalten, verwenden Sie einfach Anführungszeichen. Was machen wir dieses Ding nennen in Linie 8, allgemein gesprochen? Das ist was? #define etwas. Dies stellt Konstanten, oder? Wenn Sie eine haben wollen Wert in Ihrem Programm dass Sie eine ganze verwenden paar Mal, es ist gute Konvention, sie ausklammern, deklarieren, mit dem Hash-Symbol zu definieren, dann, durch Konvention, in allen Großbuchstaben word-- wenn es nicht unbedingt erforderlich ist, aber Es ist die menschliche Konvention Konstanten nutzen so dass sie herausspringen bei Ihnen Platz visually-- und dann wird der Wert, den Sie wollen sicher sein äquivalent zu Namen, die konstant ist. Kein Semikolon, aber Sie einfach folgen diesem Muster gibt. So was mache ich in diesem eigentlichen Code. Werfen wir also einen Blick auf das Hauptprogramm hier. In Zeile 12, weil ich haben structs.h enthalten, Ich habe jetzt magisch an meinem Entsorgungs ein neuer Datentyp. Ich meine nicht nur Zugriff auf int, und Saibling und float und string, und Blau und andere. Ich habe jetzt den Zugang zu Student-Datentyp. So in Zeile 12, ich bin die Kombination von zwei ideas-- man einen benutzerdefinierten Datentyp und zwei, Verwendung eines Arrays. Und so in diesem Programm, wenn Ich möchte eigentlich unterstützen drei Studenten in meinem Programm, I kann einfach sagen, gib mir eine variable genannt Studenten, von denen jede ist vom Typ Studenten, die ist mein benutzerdefinierten Datentyp. Und insbesondere, gib mir drei davon in meinem Array. So, jetzt was tun wir in diesem Programm zu tun? Hier ist nur eine for-Schleife Iteration 0-3, denn das ist was den Wert der Studierenden ist. Ich bin nur der Benutzer aufgefordert geben Sie mir den Namen des Studenten. Und dann in Zeile 17, die wir haben eine meist vertrauten Leitung. Wir haben unser alter Freund GetString rechts. Und was für Stück Syntax ist offenbar neue, wenn Sie noch nie in C programmiert, bevor, und haben noch nie die Strukturen verwendet? Ja? Publikum: Die .name. David J. MALAN: Die .name. Aber das ist nicht zu viel von einem Sprung, denn jetzt Studenten Halterung I gibt Ihnen die i-te Schüler. Und wenn Sie tauchen wollen innerhalb dieser Struktur, Sie nur eine einzige Zeitraum zu nutzen und dann wird der Name der Variable, innen, oder Eigentum im Inneren, Sie wollen den Zugang zu bekommen. Ebenso dann, wenn ich dann aufgefordert, die Benutzer, geben Sie mir den Studenten im Studentenwohnheim, Sie ähnlich speichern kann, dass String im Wohnheim Variable innerhalb dieser Studentenstruktur. Und jetzt die Dinge ein wenig Phantasie. Und das wird sich freuen bei vielleicht eine Menge ziemlich bald. Aber Sie werden diese weit mehr in PSet sehen 4, so lassen Sie uns nur einen Blick auf ihn jetzt. Es stellt sich heraus, dass in Zeile 23 durch 38, was denken Sie, ich bin vielleicht gerade? Ich habe die Kommentare entfernt für heute, aber die Version des Codes online Referenz hat alle Kommentare. Was muss ich scheinen zu tun? Publikum: Das Speichern der Datei mit allen die Informationen, die der Benutzer eingegeben. David J. MALAN: Ja, genau, ist dies eine neue Art , dass wir sehen, zwei, Ein weiteres Merkmal der C, wodurch kann ich meine eigenen Dateien erstellen. Bisher fast jedes Programm Sie haben geschrieben staatenlos. Sobald es fertig ist läuft, das ist es. Es gibt keinen Speicher oder Erinnerung daran. Es gibt kein Datei gespeichert. Aber wenn Sie zu wollen, sparen Eingang, verfügt passiert, wie in einem Spiel oder ein Programm so, stellt sich heraus, wir können dies tun. Und du wirst diese mehr zu sehen in PSet 4 und in Abschnitt. Aber diese Linie 23 im wesentlichen erstellt eine Datei namens students.csv. Und Sie vielleicht schon gesehen haben. Auch wenn Sie noch nie studiert CS vor, CSV ist durch Kommata getrennte Variablen. Es ist wie ein sehr armen Mannes Version einer Excel-Datei, was bedeutet, dass es geöffnet werden konnte in Excel und im Apple-Zahlen, und es besteht aus Reihen und Spalten. Aber es ist nicht ein proprietäres Format wie Microsoft oder Apple. Es ist nur das Komma trennen Werte, die wir gleich sehen werden. Und nehmen Sie nur eine Vermutung. In Zeile 23, zumin Ende, mein zweites Argument auf diese neue Funktion f für die Datei geöffnet geöffnet ist w. Was könnte w bezeichnen? Ja? Publikum: Es lässt Sie in die Datei zu schreiben? David J. MALAN: Es lässt Sie schreiben in die Datei. Es gibt also ein paar Varianten dass wir hier kann einstecken. Aber wenn Sie nur lesen wollen die Datei, ist, dass es betrachten und lesen Sie es in den Speicher, die Sie benutzen Sie einfach Zitat unquote "r". Wenn Sie auf die schreiben wollen Datei, Zitat verwenden Sie unquote "w". Es ist auch anzuhängen und ein paar andere Dinge, wenn Sie wollen, um vorhandene Dateien zu modifizieren. Jetzt werden wir halten dies sah Sache, dann kommen wir wieder in die Linie 24. NULL, es sich herausstellt, ein spezieller Wert, kann durch bestimmte Funktionen zurückgegeben werden wenn etwas wrong-- gegangen wenn die Datei nicht existiert, wenn Sie über genügend Arbeitsspeicher ausgeführt habe, oder ein paar andere Fehler. Aber jetzt lasst uns einfach davon ausgehen, dass diese ist nur herkömmliche Fehlerprüfung. Hier in der Leitung 26, ich bin Iteration 0-3 über alle meine Schüler. Und das ist Art von Art einer neuen Funktion fprintf, sondern einfach nur eine Vermutung. Wenn printf ist nur Druck einen formatierten String, Was bedeutet fprintf wahrscheinlich das? ZIELGRUPPE: Drucken in eine Datei. David J. MALAN: Drucken formatierten String in eine Datei. Das ist, was die zusätzliche f Mittel-Datei. Und der neue erste Argument muss es sein die Variable, die die Datei darstellt. Dann werden wir einfach nur einen Format String wie printf. Und obwohl dies Syntax ist neu, das nur Mittel, die in den Namen des Studenten stecken, Plug-in Studentenwohnheim, und dann mit fclose, schließen Sie die Datei. Und dann lastly-- das ist neu und wir werden darauf zurückkommen vor long-- Ich befreien der Student aus Gründen das passiert ist da oben. Aber wir kommen wieder zu derjenigen vor long-- das ist, weil, wie GetString ist tatsächlich arbeiten unter der Haube. Werfen wir also einen Blick hier. Wenn ich ls in meinem Verzeichnis, feststellen, dass ich nicht haben eine Datei namens students.csv, einfach nicht da, ist nicht vorhanden. Also, wenn ich jetzt dieses Programm zu kompilieren, machen structs-1,. / structs-1, und ich werde weitermachen und geben Sie Andi, der in Berkeley an der Yale lebt. Wir werden Rob haben, die lebt in Thayer in diesen Tagen. Und lassen Sie kommen mit denen ist, glaube ich, ist Maria in Mather, wenn ich das richtig in Erinnerung habe. So scheint nichts zu passieren. Aber wenn ich ls jetzt, gibt es students.csv. Lassen Sie uns weiter und offener students.csv gehen. Dies ist wiederum eine sehr Leichtbau-Dateiformat. Aber ich habe einfach angenommen eine Konvention dass ich zwei Zeilen und Spalten Sie hier. Die erste Spalte ist Vornamen der Menschen. In der zweiten Spalte ist die Schüler- Wohnheim oder Fachschule und Haus, oder was. Und jetzt habe ich diese gespeichert dauerhaft in einer Datei. Also ist es nicht so interessant. Aber das ist nur ein Sprungbrett jetzt um in der Lage, Informationen fortbestehen dauerhaft. Also mal sehen, was nun mehr können wir zu tun mit diesen und anderen Funktionen. Aber zuerst, irgendwelche Fragen? Das war eine Menge, und das war schnell. Aber du wirst eine Menge zu sehen Weitere in PSet 4, wie gut. Ja? Publikum: Gibt es eine Möglichkeit, um weiterhin Hinzufügen von Namen zu dieser Datei? David J. MALAN: Gute Frage. Gibt es eine Möglichkeit, um fortzufahren Hinzufügen von Namen zu dieser Datei? Ja. Und in der Tat, wenn Sie am Ende up Wieder Öffnen der Datei, Sie Zitat verwenden würden unquote "a" für Anfügen, die nur hinzufügen, würde eine neue Zeile ein neue Linie wieder und wieder, genau. Gute Frage. Andere Fragen? Ja? Publikum: Wenn Sie lief der Programm erneut im Augenblick, wäre es zu halten Hinzufügen von Namen, um die Datei oder wäre es öffnen, eine neue Datei? David J. MALAN: Ah, gute Frage. Wenn Sie das Programm erneut rechts ran nun, vielleicht in neue Namen eingegeben haben, wäre es zu der Datei hinzufügen oder überschreiben Sie die Datei? Letzteres, weil ich nicht mit Append-Modus. Und weil ich einfach blind Öffnen der Datei zum Schreiben, ist es nur geht, um die Datei zu überschreiben. Also ich würde ja tun müssen, ist anzufügen, wenn ich wirklich eine langfristige Datenbank. Jetzt CSV ist nützlich, ehrlich gesagt, auch für wie wenn Sie writing-- und wir werden schließlich sehen dies später im Semester, wenn wir CSVs für andere Zwecke. Wenn Sie all die Menschen speichern möchten , die auf ein Ereignis registriert haben, oder für Ihre Studenten unterzeichnet Gruppe, oder so ähnlich, Speichern der Daten in dieser Art von Format ist super bequem. Da buchstäblich, wenn ich waren, um diese Datei herunterzuladen. Ich double-- könnte und wir tatsächlich versuchen diese wenn ich Excel oder Numbers hier. Ich bin auf der rechten Maustaste los oder Steuerungstaste auf Datei. Whoops. Rechts-Klick oder Control-Klick meiner Datei. Komm schon, ist meine Maus nicht zusammen. Download-- ich zu gehen downloaden Sie alle Dateien hier so nur so kann ich diese ein zu greifen. Und mal sehen, ob das funktioniert students.csv-- ersten Mal Ich habe aktiviert. Jetzt wollen sie meine Kontakte sehen. Nun, ich muss zu registrieren. Sehen Sie, wie einfach es ist, CSVs benutzen? Ja, halten Sie auf dem Laufenden. OK, jetzt sind wir bereit für die Klasse. OK, oh, was ist neu? OK, in der Nähe. Das war magisch. OK, wir haben jetzt zu aktualisieren. Und jetzt, vergessen, was es Datei ich ursprünglich eröffnet, aber was es a-- wir gehen. OK, so jetzt haben wir eine Excel-Datei. Danke. OK, also was ich tat, war der einfache Teil. Natürlich konnte ich vorinstalliert haben Excel oder Numbers, oder was auch immer Programm. Aber das ist schön, weil jetzt kann ich manipulieren die Daten in einem Standardformat. Kontext So, jetzt lassen wechseln Sie zu, wo wir aufgehört haben letzten Mal, was zu beginnen war ausziehen Stützräder. Aber zuerst, hast du nicht finden Sie in diesem früheren Mittagessen ist wieder passiert hier bei Feuer und Ice in Cambridge, Sitar in New Haven. Registrieren auf CS50s Website so schnell wie möglich In den CS50 Studenten und Mitarbeiter zu verbinden. Also nahmen wir Stützräder off am Montag als follows-- Saite befindet sich im deklariert CS50s Bibliothek für einige Zeit. Und es ist schön, weil es uns zu Variablen als reden kompletten Wörter und Sätze und mehr. Aber es stellt sich heraus, String ist nicht vorhanden. Das ist nur ein Synonym oder ein Alias, dass wir für etwas geschaffen haben, dass tatsächlich ist ein wenig technische genannt char *. Und in der Tat, ein Beispiel haben wir gesehen, eines Programms am Montag, das hat nicht ganz so verhalten wir erwartet hatten. Dies war der Datei vergleichen-0. Und daran erinnern, dass zu vergleichen-0, wenn I-Programm Montag neu kompilieren und führen zu vergleichen-0 und geben mom in Kleinbuchstaben, und Mama in Kleinbuchstaben erneut. Das Programm bestand ich darauf, Geben Sie verschiedene Dinge, auch wenn Mama, alle in Kleinbuchstaben, ist optisch identisch. Also, was war die kurze Antwort dafür, warum der Computer denkt, diese beiden Strings sind anders? Ja? ZIELGRUPPE: [unverständlich] David J. MALAN: Richtig. Also, Mama, das erste Mal, Ich geben Sie es in, wird irgendwo in meinem Computer gespeichert Speicher, sondern in einem anderen Ort als das zweite Mal, dass ich geben mom. Jetzt ist es mit Sicherheit konnte optimiert werden. Das System könnte klug sein und erkennen, diese beiden Saiten, hey, sie sind identisch. Lassen Sie mich nicht redundant zu speichern. Aber Computer nicht, das zu tun Optimierung, wenn Sie sie zu erzählen. Also, standardmäßig sind sie nur gehen, um am Ende an zwei verschiedenen Stellen im Speicher. Und so, um mehr klar ist, wenn sein verglichen wir die beiden Zeichenfolgen, die ersten genannt wurde s, das zweite genannt wurde t, was gesagt war ich Vergleichen Sie hier in Zeile 13? Ja. Publikum: Es ist der Ort im Speicher daß die Variable verweisen auf. David J. MALAN: Genau, ich war Vergleichen der Platz im Speicher dass diese Variablen zeigte auf. So gesagt, war, wenn Mama auf Byte Nummer 1, und 2 und 3, und 4-- da erinnere mich an den umgekehrten Schrägstrich 0 muss ganz am Ende zu sein. Und die andere Instanz von Mama, m-o-m, wurde auf die Adresse 10, 11, 12 und 13. Ich war den Vergleich 1, die Adresse, diese Stelle im Speicher, gegen 10, das offensichtlich nicht die gleichen. 1 nicht 10. Also das ist schön, dass es ist ziemlich einfach. Aber es ist insofern problematisch, als Wir können nicht scheinen, um Zeichenfolgen zu vergleichen. So fundamentally-- und auf diesem niedrigen Niveau, wenn Sie zu implementieren wollte ein Programm, um zu vergleichen zwei Worte, die der Benutzer hat in für die Qualitäts eingegeben haben, tun sie line up für char char, nur in allgemeiner Form, was müssen wir tun, scheinbar? Es reicht nicht, nur um Schauen Sie sich diese beiden Adressen. Was müssen wir tun? Ja? ZIELGRUPPE: Durchlaufen die Zeichenfolge [unverständlich]. David J. MALAN: Ja, lassen Sie uns durchlaufen Sie die Zeichenkette. Lassen Sie uns eine for-Schleife, einer while-Schleife, oder was auch immer Sie am bequemsten mit. Und wenn wir zwei Strings irgendwo kam im Speicher, schauen wir uns an jedem der erste Zeichen, dann ist jeder zweite Charakter, dann dritte und vierte, und fünften, bis wir was spezielle Sentinel-Wert? ZIELGRUPPE: [unverständlich] David J. MALAN: Ja, der Backslash Null ist, an welcher Stelle in entweder String können wir entscheiden, das ist es. Haben wir abgestimmt jeden einzelnen Charakter? Wenn nicht, dann false zurück. Wenn ja, return true. Und das ist also genau das, was diese Version des Programms vergleichen-1.c tut. Es ist identisch mit dem, was wir sah Montag außer, dass ich losgeworden des Wortes string-- obwohl daß keine funktionelle impact-- allen Ich jetzt mache ist das Entfernen Einige visuelle Stützräder, aber klar, dass zu sehen s und t Adressen. Und das ist, was der Stern, der Stern, stellt eine Adresse ist, ansonsten bekannter technisch als Zeiger. Also, wenn ich erkläre s auf Zeile 9 und sagen, char * s, das bedeutet nicht, geben Sie mir eine Saite. Das bedeutet, geben Sie mir eine Variable, deren Ziel im Leben ist, um eine Adresse zu speichern. Da ich zu dem setzen Adresse einer Zeichenfolge hinein. Und in der Tat, GetString, zu sein klare, nicht einen String zurück. Dabei spielt es keine Mutter zurückkehren Backslash Null, per se. Was bedeutet speziell GetString und präzise zurückgeben? ZIELGRUPPE: [unverständlich] David J. MALAN: Eine Adresse, die Adresse des ersten Zeichens in einigen Zeichenkette, die es bekommen hat. Und nun sehen wir ein spezielles Schlüsselwort erneut. Und, angespielt I dieser früher. Das wird eine gute Konvention sein dass wir jetzt wieder und wieder zu sehen. Ich überprüfe, um sicherzustellen, dass s nicht null ist und t nicht null ist. Da auf meinem basiert wirklich schnelle Erwähnung früher, , was bedeuten könnte, wenn GetString liefert nicht eine Adresse, aber N-U-L-L, die wiederum, einigen besonderen Wert? ZIELGRUPPE: Fehler. David J. MALAN: Es ist ein Fehler aufgetreten. Etwas ist schief gelaufen. Und was in der Regel könnte passieren, vor allem mit strings-- dem auch sein mag unbekannter Länge in advance-- vielleicht die Computer ' aus der Erinnerung, vielleicht Sie in eine solche typisierte Lang Wort oder einen Satz oder eingefügt einen so großen Essay es gibt einfach nicht genug Speicher. Und so GetString nicht zurückkehren die Adresse der ganzen Sache, so dass es nur gibt nichts zurück. Und es sagt, ist ein Fehler passiert durch Rücksendung der Spezial-NULL-Wert. Es ist die Null-Adresse, so zu sprechen. Jetzt stellt sich heraus, C kommt mit einer Funktion, dass die Iteration tut. Wir haben nicht, dies mit zu implementieren eine for-Schleife oder einer while-Schleife selbst. Wir können eine Funktion zu verwenden, kurz und bündig genannt wird, rühren Layout-Datei oder String vergleichen, dessen Ziel im Leben ist es, genau das zu tun. Sie geben ihm zwei Zeiger, zwei Adressen, und es wird an diese Adressen zu gehen und vergleichen Sie dann Buchstabe für Buchstabe für Buchstabe für Qualität, Stoppen nur, wenn, was wahr ist? Wenn intuitiv sollte comp rühren Stop Iteration, nur klar zu sein? Wenn sie trifft einen umgekehrten Schrägstrich 0 entweder Schnur, an welcher Stelle es entscheiden kann, hat alles aufeinander abgestimmt, oder hat es eine Diskrepanz? Also, wenn wir laufen diese nun und versuchen unsere kleine Kapitalisierung Spiel, so stellen Sie vergleichen-1, ./compare-1 und geben mom in Klein beide Male. Jetzt ist es das Gleiche. Und wenn ich es wieder tun mit Kleinbuchstaben und dann vielleicht in Großbuchstaben. Nun ist es in der Tat unterscheidet zwischen Groß- und Kleinschreibung. Also nicht allzu schwer oder magisch, aber es muss jetzt erklären, was los ist unter der Haube. Also, was können wir noch zu extrahieren von dieser Art von Unterricht? Werfen wir also einen Blick auf diese. Ich werde weitermachen und schreiben ein Schnellprogramm kopier 0 hier genannt. Und jetzt weiter und tatsächlich loslassen lass es uns tun this-- mit Kopie-0, einen Blick auf das, was ich hier habe. Ich zum ersten Mal den Benutzer zu sagen, etwas sagen. Dann bekomme ich einen String und ich es in s gespeichert. Dann ich überprüfen, wenn s gleich ist gleich NULL, nur 1 zurückzukehren. So ist dies nur Standard-Fehlerprüfung. Nichts Interessantes passiert ist. Und in der Tat, wenn wir uns des Fehlers zu befreien Prüfen, das sieht aus wie Woche 1 Code Im Moment. Aber ich habe damit begonnen, eine zu bekommen wenig besser darüber. Jetzt in Zeile 16, vor einer Woche, vielleicht sogar ein paar Tage oder Stunden, man könnte sagen, Linie 16 Erstellen einer Variable namens t und Kopieren s hinein. Und das ist ein perfekt angemessenen Lieferservice. Aber jetzt genauer. Was passiert in Zeile 16? Was wird immer kopiert von rechts nach links? Ja? ZIELGRUPPE: Ist t bekommen eine Adresse s? David J. MALAN: Genau, t wird immer die Adresse s. So, um nun klar sein, wenn ich gehe zurück zu diesem früheren Beispiel und ich ziehen die Sache, die ich eingetippt. Und was habe ich getippt in-- hier ist s, und hier, ist, was ich in irgendwo in getippten Speicher, Mama und dann ein Backslash 0, die für mich gegeben hat. Was ich in hier gespeichert sind, zu erinnern, dies ist bei Position 1, 2, 3, 4, das ist, was zur Zeit in s. Also, wenn auf der Leitung 16, sage ich mir eine weitere Variable t und speichern in auf den Wert von s, was wird hier abgelegt wird nicht mom sondern nur die Nummer 1. Also, wenn wir nach vorne schauen in diesem Programm Nun, was wird passieren? So bemerken, dass es mit dieser Funktion könnte haben dies vor einiger Zeit für Caesar verwendet, oder Vigenere, oder vielleicht gar nicht. Ich behaupte mit meiner printf, bin ich gehen, um die Kopie t Kapital zu schlagen. Erste in der Reihe 19, Schnell sanity zu überprüfen, strlen Kontrollen der Länge t. Weil ich nicht möchte versuchen, etwas zu nutzen wenn es keinen String gibt. Wenn der Benutzer einfach Enter drücken, es gibt nichts zu profitieren. Also ich möchte nicht, um die Leitung 21 zu tun. So Leitung 21 Kapitalisierung welcher Buchstabe, offenbar, in t? ZIELGRUPPE: m? David J. MALAN: Es sieht aus wie es Kopier welche? ZIELGRUPPE: m. David J. MALAN: Äh, m. OK, so dass die erste m, weil Ankündigung, dass ich vorbei an ToUpper, die wenn Sie noch nie gesehen, es ist nur eine Funktion an Kapital als seine Eingabe. t Halterung Null bedeutet geben mir die Null-Charakter t. Und so wie funktioniert das Bildwechsel, klar zu sein? Was muss umgeschrieben oder umzuziehen in Bezug auf s und t und Mama Backslash Null. ZIELGRUPPE: [unverständlich] David J. MALAN: Ja, so diese hier einfach muss geändert zu-- beheben this-- erhalten muss auf eine Kapital m umziehen. Aber jetzt, später aussehen in der Programm, wenn ich drucken s und t wie reinige ich hier, schau, was ist passieren Ausdrucken von s und t. So stellen Sie copy-0, ./copy-0. Lassen Sie mich gehen Sie vor und geben Sie im mom nur aus Kleinbuchstaben. Beachten Sie, sowohl die ursprüngliche und die Kopie aktiviert wurden. Warum? Nun, s und t beide zeigte auf, wenn man so will, das gleiche Teil des Speichers. Und ehrlich gesagt, das ist immer wirklich uninteresting-- die Tatsache, dass wir mit der Adresse Null hier. Ich meine, ich weiß nicht wirklich, wo Zeug ist in Erinnerung. Sorry, ich bin das Löschen ein wenig zu viel. Aber ich weiß nicht wirklich, wo die Dinge sind im Speicher. Und so, in der Tat, was Programmierer neigen dazu, zu denken, ist, dass, wenn Sie reden eine Adresse oder einen Zeiger, wer sich interessiert, wo es im Speicher ist. Es ist mir egal, ob es an Byte eines oder eine Milliarde. Ich kümmere mich nur, dass diese Variable ist effektiv zeigt auf diesem Teil des Speichers. Und so, von nun an, anstatt kleinlich über beliebige Speicheradressen, lassen Sie uns starten Sie einfach den Zeiger ziehen als Zeiger als Pfeile. Also, was s und t wirklich sind, Nach diesem Programm, weil, wie ich geschaffen t, es ist nur zwei Variablen zeigt auf dem gleichen Teil des Speichers. Und wir kümmern uns nicht, wo sie sind. So können wir abstrahieren diesem Detail. So wie ich das beheben? Wenn ich eine Version der Kopie zu schreiben Programm, das tatsächlich kopiert die Zeichenfolge und nutzt nur den Kopie, nur intuitiv, was muss doch eine sein Bestandteil, um unsere Lösung? ZIELGRUPPE: [unverständlich] David J. MALAN: Wir brauchen ein was? ZIELGRUPPE: Klumpen des Speichers. David J. MALAN: Wir brauchen ein anderer Teil des Speichers, nicht wahr? Wir wissen nicht, wie man tun es noch, unbedingt. Aber ich irgendwie müssen dies so geschehen, dass die ursprüngliche Mutter in Kleinbuchstaben landet in den extra Teil des Speichers. Und als ich dann die Kopie ändern, ich wollen nicht diese Kopie ändern. I statt, um nur diese zu ändern Kopie, so dass das Original unverändert. Also, lassen Sie uns sehen, wie wir das tun. In copy-1, die bereits wurde der Kommentar abgestreift, aber Online kommentierte. Wir stattdessen tun die following-- diese Linien identisch sind, hol mir einen String und nennen es s. Aber jetzt einen Blick auf eines unserer lassen komplex, aber der letzte der Komplexität für eine Weile, Zeile 16 macht genau dieses. Also, wenn Ihr bequem mit der Bild, das wir gerade drew-- gib mir einen neuen Teil des Speichers, kopieren alles hinein, mal sehen, wie wir übersetzen, dass, um Code. So Leitung 16, auf der linken Seite, char * t gibt mir diese Box auf hier. Das ist alles, es tut. Auf der rechten Seite, m alloc oder malloc, ist die Speicherzuweisung, super schickes, eine kryptische Art, nur sagen, geben Sie mir einen Teil des Speichers. Wie viel Speicher brauchen wir? Nun, das ist eine Art große Ausdruck. Aber mal sehen, was es sagt hier. Also das, natürlich, zu geben mir die Stringlänge von s. Also, Mama sollte es was? Also nur drei, oder? Mama ist drei Zeichen. Sie zählen nicht die Backslash Null, wenn Sie sprechen über die Länge eines Strings ist es eigentlich die menschliche sichtbaren Buchstaben. So Mama, so gibt mir 3. Aber warten Sie eine Minute, ich bin jetzt Zugabe von 1. Warum muss ich eigentlich zu wollen, zuzuweisen 4 Bytes und nicht nur 3? Ja? Gruppe: für die Sentinel-Wert? David J. MALAN: Genau, für die Sentinel-Wert. Für den umgekehrten Schrägstrich Null, Ich muss 4 Byte insgesamt. Also muss ich die Länge der Schnur plus 1. Und dann nur für eine gute measure-- obwohl in diesem System, es immer sein wird 1-- ich sage, multiplizieren Sie diese mit der Größe eines char. Stellt sich heraus, sizeof ist ein Operator in C, dass nur sagt Ihnen, die Anzahl von Bytes, ist für einen bestimmten Datentyp benötigt. Es ist nicht für Arrays arbeiten, Typischerweise manchmal tut. Aber im allgemeinen Fall, Nr. Aber es wird mir sagen, wie viele Bytes ein char ist, die entpuppt sich immer 1. Das ist also, wie Multiplikation mit 1. So super kryptischen suchen Codezeile. Aber alles, was sie tut ist verleiht mich ein Teil des Speichers. Aber ist es zu sein scheinen kopiert alles in diesem Speicher? Noch nicht. Und so was muss ich auf der Leitung 22 und 23, 24, 25, gut, habe ich einfach tun. Und das ist eine Art alte Schulsachen bekommen. Dies ist wie PSet 2, wobei Dazu zählt die Mitnahme Dinge sind rund im Speicher, oder besser gesagt in Zeichenfolgen. Also ich bin Iteration von 0 bis die Länge der Zeichenfolge s. Und ich bin das Kopieren der i-te Zeichen in s in das i-te Zeichen in t. Und weil ich, der Programmierer, machte Achten Sie darauf, genau so, wie viele Bytes zuzuweisen wie ich brauche, ist es perfekt Eins-zu-Eins-Beziehung. Und ich kopieren mom in Kleinbuchstaben in die neue. Und dann schließlich ich diese Zeile. Und so ist der Effekt nur um dieses t nutzen Sie hier. So viel zu absorbieren, aber wenn Sie gerade betrachten was wirklich los ist auf unter der Haube befindet sich nur bewegen diese Bytes um, alles, wird benötigt, um dieses Problem zu lösen, nur, um uns diesen Teil des Speichers. Jetzt auf die Gefahr hin überwältigend, lassen Sie mich einem anderen Beispiel, das ist fast identisch ist, mit Ausnahme dieses einen Codezeile. Das ist also der Hacker-Version dieses Programms, wenn man so will. Aber lasst uns einfach zu destillieren es in das, was vor sich geht. Zeile 24 verwendet, um dieses t sein Halterung i erhält s Halterung i. Jetzt bin ich der Veränderung dieser zu die viel mehr kryptische Sterne t plus 1 entspricht-Sterne-s plus 1. Also, was passiert und warum haben wir einen Stern Charakter? Wir haben den Stern gesehen und es verwendet wird hier anders. Wir haben vorher gesehen char *, jetzt bin ich zu sehen, ein zu Beginn Star, und das ist OK. Denn es stellt sich heraus, wir kann Art von nur folgern, von jenen ersten Prinzipien, was los ist. Also nur klar zu sein, was ist s? Letzte Woche war es ein String. Das funktioniert nicht mehr ausreichen. Was ist s, speziell? ZIELGRUPPE: [unverständlich] David J. MALAN: Es ist ein Zeiger. Es ist die Adresse des erste Zeichen eingegeben haben wir in. OK, was ist t? ZIELGRUPPE: [unverständlich] David J. MALAN: Die Adresse des ersten Bytes in t, dass Teil des Speichers neu zugeordnet. So stellt sich heraus, dass, wenn wir iterieren von 0 an bis zur Zeichenfolge length-- zuallererst i beginnt bei 0, weil dieser alten Schule für Schleife Sache. Also nur der Einfachheit halber, lassen Sie uns davon ausgehen, dass die erste Zeile des Codes ist wirklich nur diese, richtig. Wenn i gleich Null ist, indem Null etwas vermutlich wird nicht um einen Effekt zu haben. Also, was ist dieses Sprichwort? Es stellt sich heraus, dass die Sterne Betreiber in diesem Kontext ist die Dereferenzierung Betreiber, die gerade ist eine andere Art zu sagen gehen an folgende Adresse. So dass, wenn s die Adresse des ersten Zeichen in diesem Teil des Speichers, * s Mittel gehen dorthin. Und weil wir gezeichnet haben das Bild auf diese Weise, Sie können die anzunehmen Folgende mentales Modell. Wenn dies s, und Sie sagen, * s * s eine Art, wie Rutschen und Leitern, wenn Sie sich erinnern, das Spiel aus der Kindheit, ist wie folgen diesem Pfeil und gehen an die Adresse. * t ist die gleiche. So starten Sie hier, gehen Sie zu ihrem Stück. Ich kann nicht einfach zurückgreifen dieser Bildschirm auf diese Weise. * t bedeutet, hier zu gehen. Und dann ist die for-Schleife nur sagen, bewegen diese Figur hier, bewegen diese Figur hier, bewegen Sie dieses Zeichen hier. Aber wie kann ich diese Inkrementierung tun? Ich muss rückgängig machen, was ich gerade gelöscht. Dies ist, was allgemein als Pointer-Arithmetik, die bedeutet Mathe mit Adressen. Wenn in diesem for-Schleife, Ich halte Inkrementieren i, und s ist eine Adresse, und t eine Adresse, wenn ich einfach weiter Zugabe von 1, das bedeutet nur, vorwärts sich zu bewegen, und nach vorn, und nach vorn in den Speicher. Es ist wie Oxford Street, die Straße, die die CS-Gebäude befindet sich auf. Die CS Gebäude ist auf 33 Oxford Street. Also, wenn Sie zu tun, 33 waren Oxford Street plus 1, das bringt Sie 34 Oxford Street, dann 35 Oxford Street, dann 36 Oxford Street, was diejenigen, Gebäude wirklich sind - sofern sie existieren. Und so, das ist alles wir tun hier mit Zeigerarithmetik. Also ist es ein super obskure Weise Ausdrucks uns. Aber alles, was passiert, unter der Haube Nur die folgenden Adressen, wie nach einer Karte, wenn man so will, oder im Anschluss an die Pfeile, wie wir auf dem Bildschirm gezeichnet habe. OK, eine Menge zu verdauen. Jede Frage zur Syntax, Konzepte, Zeiger malloc oder dergleichen. Ja, hier zuerst. Publikum: So, wo das sagt * t gleich toupper * t, ist, dass gehen, um zu profitieren alle Buchstaben oder just-- David J. MALAN: Ah, wirklich gute Frage. So in dieser Linie hier, 31, das wird zu profitieren der erste Buchstabe oder die Gesamtheit der Briefe. Lassen Sie uns also antworten, dass, indem Sie zurück zur ersten Prinzipien. Und ersten Prinzipien hier meine ich nur auf die grundlegenden Definitionen gehen von dem, was beteiligt. So toupper ist eine Funktion, dass nutzt eine char. Das ist alles. * t bedeutet, gehen Sie zum first-- rufen Sie die Adresse in t. Also, in dem Bild, ob dies der Klumpen Speicher wir zugeteilt mit malloc, und das ist t, * t bedeutet, gehen Sie hier. Unterdessen übergeben Sie dieser Wert, Kleinbuchstaben m um toupper, Sie wieder einlassen Hauptstadt M, wo willst du es setzen? Sie setzen es in der gleichen Lage. Und so von dieser Logik derer, grundlegenden Definitionen ist es nur Großbuchstaben beginn wenn Sie mit i oder ein laufen for-Schleife oder einer while-Schleife, wird es nicht nichts mehr, als Sie fragen zu tun. Gute Frage. Ja? Publikum: Warum haben Sie die dereferenzieren Methode, anstatt das Array? David J. MALAN: Ah, gute Frage. Warum würden Sie das dereferenzieren verwenden Methode anstelle der Array-Verfahren? Keinen besonderen Grund, um ehrlich zu sein. Und in der Tat dafür Art beispielsweise, rechts, Ich bin einfach nur dem Argument macht die Programm komplizierter, mehr Augen über Verglasung, Menschen bist gerade denn dies sieht super obskuren, aber obwohl es das gleiche tun. Und so, ehrlich gesagt, ist dies ein unnötigerweise visuell komplexe Lösung für das Problem. Es ist immer noch ein gutes Design, fünf von fünf für den Entwurf, ob es in der Halterung Notation oder die Zeigernotation. Aber-- vor allem, wenn wir bekommen im späteren Verlauf in PSet 5 wenn wir realisieren, dass Wörterbuch, Ich habe ein paar times-- erwähnt wir werden tatsächlich über die Pflege geringe Speicheradressen dass wir wirklich verstehen, Was ist los. Aber für jetzt, stellt sich heraus, dass dies Codezeile hier eckigen Klammern nicht wirklich existieren. Sie sind, was heißt syntaktischer Zucker, die ist nur eine unheimlich coole Art zu sagen, die Compiler wandelt eckigen Klammern zu sein dass mathematischen Ausdruck. Also ist es eine menschliche Konvention in der Lage, einfach zu schreiben diese sehr benutzerfreundlich Klammern. Aber was ist der Compiler, Klang, ist wirklich keine Zeit zu tun Sie schreiben, was in Zeile markiert 24, unter der Haube ist es wirklich Umwandlung in diese. Es ist einfach angenehmer als Mensch lesen und schreiben Code wie Linie 24. Aber schließlich diejenigen, Stützräder zu kommen off wenn das eigene Komfort wird stärker. In Ordnung, so erinnern, dann, dass diese war die Art von größte Problem stießen wir auf. Und das ist, was löste die ganze verdammt Gespräch über Zeiger, und Adressen und Kopieren Dinge. Es war, weil wir darüber stolpern Diese dummen, dummen Frage, wobei I umgesetzt logically-- mit Lauren hier oben auf der Demo und der Orangensaft im milk-- ein perfekt algorithmisch einwandfreie Funktion für den Austausch von zwei Variablen ' Werte, aber das verdammte Ding hatten keine anhaltenden oder permanent, Wirkung auf mein Code. Und warum war das? Auf den Punkt gebracht, warum ist das Umsetzung der Swap- logisch korrekt, aber hat keinen Einfluss auf die Variablen, die ihr übergeben werden, wie x und y für die wichtigsten? Was war der Kern des Problems? Ja? Publikum: Da variabel gemacht Kopien der Variablen in dem Durchgang Through-Funktion. David J. MALAN: Genau, wenn Sie vorbei Variablen in einer Funktion oder Argumente in eine Funktion, sie sind kopieren, übergeben die bedeutet, dass Sie eine identische suchen zu erhalten Muster von Bits für x und y, hier als a und b. Und Sie können alles tun, Sie wollen mit dieser Kopien, aber sie gehen nicht zu haben, Wirkung auf die aufrufende Funktion. Und in der Tat, erstellten wir, dass Bild auf dem Bildschirm, Rückruf letzten Mal, wobei, wenn Sie wirklich über das, was denken geht unter dem hood-- wenn dies ist den Arbeitsspeicher Ihres Computers, und ab hier ist der Brocken Speicher, die für Haupt verwendet, dies ist die Batzen Speicher wird für Swap benutzt, und so, auch wenn Haupt hat zwei Variablen x und y, Swap haben könnten identische suchen Werte, die beide 1 und 2, aber sie sind komplett verschiedene Stücke von Speicher. Also brauchen wir eine Lösung für dieses. Und ehrlich gesagt, ist es, dass wir jetzt den Anschein, haben eine Lösung für dieses Problem, rechts. Wenn wir nun die Möglichkeit haben, Dinge zu manipulieren haft Adressen und Art von Rutschen und Leitern Stil folgendermaßen Pfeile und gehen überall wir wollen im Gedächtnis, konnte nicht wir dieses Problem dadurch zu lösen, Übergang von Haupt zu tauschen nicht die Werte wollen wir Swap, sondern nur intuitiv was könnte passieren wir, anstatt zu tauschen? [Zwischen Stimmen] David J. MALAN: Warum wir nicht einfach übergeben Sie die Adressen, richtig? Warum geben Sie nicht uns Swap ein Schatzkarte, wenn man so will, , dass es führt zu der Ist-Werte x und y. Lassen Sie uns tauschen, tatsächlich ändern jene ursprünglichen Bits, anstatt nur auf der Durch Kopien der Bits. Und so, in der Tat, das ist, was ist gehen, um die Lösung sein. Diese Version finden Sie hier eindeutig schlecht und fehlerhaft. Und nun, auf den ersten Blick, es sieht einfach wie wir soeben einen Haufen von Sternen nach dem Zufallsprinzip und überquerte den Fingern dass es zu kompilieren. Aber wäre es jetzt zu kompilieren. Aber mal sehen, was das ist. Und leider die Autoren C könnte ein anderes Symbol gewählt haben, um diese ein wenig zu machen klarer, aber die Sterne Betreiber hat andere Bedeutung in zwei unterschiedlichen Kontexten. Und wir beide gesehen haben, aber wir unterscheiden. So an der Spitze gibt, wenn ich a und b verändert andere als int in der schlechten Version auf int Sterne, a und b, Zuvor wurden ganze Zahlen. Was sind A und B nun in die gute, grüne Version? Sie sind Adressen. Adressen von dem, was, klar zu sein? Adressen von ganzen Zahlen. Also die Tatsache, dass ich sagen int Sterne Mittel Dies ist die Adresse des eine ganze Zahl, nämlich. So, jetzt feststellen, in den Code-Zeilen, etwas hat sich verändert. tmp gleich bleibt, weil es ist nur die vorübergehende ganze Zahl ist, kein Memory-Magie gibt. Aber eine muss nun einen Stern. Und, in der Tat, jedes weitere Erwähnung von a und b, feststellen, dass alles, was von rot nach grün ist, dass ich voranstellen diese Variablen mit Sternen. Weil ich möchte nicht a und b zu kopieren. Denn wenn ich kopieren Sie einfach a und b und Swap- a und b, was mache ich eigentlich Swapping? Nur Adressen, möchte ich tauschen Was ist an diesen Adressen. Ich will dahin. Und so ist die Sternoperator Innenseite meiner Funktion nicht in der Parameterliste, bedeutet, dass Sie an diese Adressen zu gehen und tatsächlich, diese Werte zu ändern. Was bedeutet das Bild Jetzt aussehen statt. Nun, wenn ich anstatt vorbei in A und B nicht gleich 1 und 2-- Ich wirklich brauchen, um hinzuzufügen, eine weitere Definition hier. So nehme an, dass dieses Stück der Speicher ist an der Stelle 10. Dies ist an der Stelle 11, jedoch diese ist ein bisschen wie eine Vereinfachung, Ich habe jetzt zwei Möglichkeiten tun ich pass x und y oder übergeben ich ihre Adressen? Wenn ich übergeben ihre Adressen wie diese, ich habe gerade müssen nun umsetzen Swap pro grünen Code so dass, wenn er sieht ein, und wenn es b sieht, ist es nicht einfach kopieren a und b und bewegen Sie die Milch und Orangensaft. Die Milch und Orangensaft Metapher bricht nun nach unten, denn das sind Tassen von flüssigen und nicht die Karten. Wir brauchen statt zu gehen bis 10, und wir adressieren gehen müssen zur Adresse 11, und führen Sie diese Auslagerungslogik. So ist die Logik die gleiche, aber wir brauchen eine etwas andere Weise für den Zugriff auf diese Variablen. Und so dass am Ende, was die Programm hat zu schauen, wie das ist. In swap.c wörtlich kopiert und klebte die grüne Version. Aber ich muss eine Änderung vorzunehmen. Es reicht nicht, nur um Swap ändern. Welche anderen Codezeile muss ich ändern? Ja? ZIELGRUPPE: Wo es die Argumente übernimmt. David J. MALAN: Wo es nimmt ihr Argument. Also, wenn ich nach oben zum Haupt, I können nicht nur in x und y übergeben, und, das verspreche ich, die letzte Stück neue Syntax heute. Ich brauche, um in nicht x passieren und y aber die Adresse von x und y. Und es stellt sich heraus, das Symbol dass die Autoren der C gewählt ist, wenn Sie ein kaufmännisches Und hier verwenden, um nicht zu mit dem bitweise Und-Zeichen verwechselt werden, wenn Sie ein Und-Zeichen verwenden hier und ein kaufmännisches hier, Dieses findet heraus für Sie, was ist die Adresse von x, vielleicht ist es 10, was ist das Adresse y, vielleicht ist es 11, und leitet die im statt. So viel auf einmal zu absorbieren. Aber mal sehen nun schnell in unsere verbleibenden 4 Minuten wo die Dinge schief gehen. Und nebenbei, eigentlich Ich machte dieses Foto, TF machte dieses Foto, ein oder zwei Jahren. Das ist also der hinteren Ecke von Eliot Dining Hall. Zeiger sind vielleicht die härteste Thema, das wir abdecken in CS50. Also, wenn Sie die Art Sorgen der Hang ist wie vielleicht ist es mehr von einem Hockeyschläger wie diese, zu realisieren wir Art von kurz vor einem Gipfel in Bedingungen der konzeptionellen Komplexität. Und ich bringen diese Foto, denn ich schwöre, zu Gott, im Herbst 1996, als ich CS50 mit meiner Lehre Kerl, Nishat Mehta, setzte er mich in die Ecke des Eliot D. Halle während des Mittagessens, oder Abendessen, oder etwas zu versuchen mir zu helfen, Hinweise zu verstehen. Und das ist, wo ich war Wochen nach es in der Vorlesung, wenn eingeführt wurde Ich endlich verstanden, Zeiger. Und ich bin zuversichtlich, dass diese wird viel früher für Sie klicken. Aber weiß, das absolut zu die anspruchsvollere Themen wir angeschaut habe. Aber es ist zu den mächtigsten. Und wenn Sie es erhalten, es ist wirklich alles, nur gehen, um endlich zusammen kommen. Also seien Sie versichert, es funktioniert nicht müssen alle Körper mehr. Also hier ist das letzte Programm wir gehen, zu betrachten. Und wir werden mit einem Ende Schnell drei Minuten claymation von unserem Freund, Nick Parlante gemacht. Hier ist ein Programm, das auf der Oberseite zwei Leitungen deklariert eine Variable x und y. Wobei beide Adressen von ganzen Zahlen, AKA Zeigern. Wir haben dann zuzuteilen genug Speicher in einen int speichern und speichern Sie die Adresse dieses Speichers in x. Also, es ist sogar noch einfacher als das Beispiel zuvor. Gebt mir vier Byte, das ist die Größe eines int, und bringe diese Adresse in x. Diese Linie bedeutet hier, rufen Sie die Adresse in x und legte die Bedeutung von Leben, die Zahl 42 gibt. Aber diese Linie macht mir Sorgen. Sterne y bedeutet, rufen Sie die Adresse in y, und setzen Sie die Unglückszahl 13 da. Warum ist es gefährlich, zu diesem Zeitpunkt in den story-- wenn auch schnell erzählt in unserer schwind Minuten hier-- warum ist es schlecht für mich zu sagen, an die Adresse in y gehen? Publikum: Sie müssen nicht [unverständlich]. David J. MALAN: Ich habe keine, setzen alles in y. Also, was ist der Wert von y, an diesem Punkt in der Geschichte? Wir haben keine Ahnung. Es ist einige Müllwert und auch nicht Binky kennen. Wenn wir auf dieser Note zu beenden. [VIDEO PLAYBACK] -Hey, Binky, wach auf. 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 Hinweise müssen. -OK. Dieser Code weist zwei Zeiger das kann auf ganze Zahlen zeigen. -OK, Auch ich sehe die zwei Zeiger, aber sie scheinen nicht zu sein, die auf nichts. -Das ist richtig. Zunächst Zeiger nicht auf nichts. Die Dinge, die sie verweisen, sind genannt pointees und deren Einrichtung ist ein getrennter Schritt. Oh, richtig, richtig. Ich wusste, dass. Die pointees sind getrennt. So wie Sie eine pointee zuzuweisen? -OK, Auch dieser Code zuweist ein neues 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 die Zahl 42 in seine pointee. Für diesen Trick, ich brauche meine Zauberstab der Dereferenzierung. -Ihre Zauberstab der Dereferenzierung? Äh,, das ist großartig. -Dies Ist, was der Code aussieht. Ich werde einfach die Nummer eingestellt und-- [POP SOUND] -Hey, Dort zu suchen geht. Also, tun eine Dereferenzierung auf x folgt der Pfeil auf seine pointee zuzugreifen. In diesem Fall auf 42 in dort zu speichern. Hey, versuchen Sie es, um die Nummer zu speichern 13 durch die anderen Zeiger, y. -OK. Ich werde einfach gehen hier auf y, und nutzen Sie die Nummer 13 Einrichtung. Und dann mit dem Zauberstab aus Dereferenzierung und just-- [Signalton] Oh, hey das hat nicht funktioniert. Sagen, äh, Binky, weiß ich nicht denke Dereferenzierung y ist eine gute Idee, weil die Einstellung up der pointee ist ein separater Schritt. Und ich glaube nicht, dass wir jemals getan haben. -Hmm, Guter Punkt. -Ja, Zugeteilt wir den Zeiger, y, aber wir nie setzen Sie ihn auf auf eine pointee zeigen. -Hmm, Sehr aufmerksam. -Hey, Du bist es gut aus, Binky. Können Sie das Problem zu beheben, so dass y Punkte zu derselben pointee als x. -sure, Benutze ich meinen Zauberstab der Zeigerzuweisung. -Ist, Dass wird eine sein, Problem, wie vorher? Nein, dies nicht zu berühren die pointees. Es ändert sich nur ein Zeiger auf die gleiche thing-- zeigen [Knall] --as anderen. Oh, ich verstehe. Jetzt y Punkte auf der gleichen Stelle wie x. Also, warten Sie, nun y festgelegt ist. Es hat eine pointee. So können Sie den Zauberstab der versuchen wieder dereferenzieren, um die 13 über zu senden. Oh, OK, hier geht. -Hey, Sehen Sie, dass. Jetzt Dereferenzierung Arbeiten auf y. Und weil die Zeiger Sharing dass man pointee, beide finden Sie in der 13. -Ja, Sharing, äh, was auch immer. Also, wir gehen an Orte jetzt wechseln? Oh, freuen wir aus der Zeit sind. -But-- -Nur Erinnern die drei Zeiger Regeln. Nummer 1, der Grundstruktur ist, dass Sie einen Zeiger haben, und es weist über zu einem pointee. Aber der Zeiger und pointee sind getrennt. Und die gemeinsame Fehler ist die Einrichtung eines Zeigers aber vergessen Sie es ein pointee zu geben. Nummer 2, Pointer Dereferenzierung beginnt an der Zeiger und folgt dessen Pfeil über seine pointee zuzugreifen. Wie wir alle wissen, das funktioniert nur, wenn es ist ein pointee, die Art der zurückkommt Nummer 1 herrschen. Zahl 3, Zeiger Zuordnung erfolgt ein Zeiger und ändert es, um zu dem Punkt, gleichen pointee als eine andere Zeiger. So nach der Abtretung, die beiden Zeiger wird auf die gleiche pointee Punkt manchmal, dass heißt Sharing. Und das ist alles dort ist zu ihm, wirklich. Bye-bye jetzt. [END PLAYBACK] David J. MALAN: Das ist es für CS50. Dank Professor Nick Parlante. Wir sehen uns nächste Woche. [Elektronische Musik zu spielen]