[Powered by Google Translate] [Woche 4, Fortsetzung] [David J. Malan - Harvard University] [Dies ist CS50. - CS50.TV] Dies ist CS50, und das ist das Ende der Woche 4. So eine gute Nachricht und eine schlechte Nachricht. Keine Vorlesung am Montag, setzen kein Problem nächste Woche. [Schüler jubeln] Du wirst doch nicht zu mögen, wohin dieses geht. Aber wir haben diese statt am kommenden Mittwoch, und es gibt auch pro Lehrplan 1 Freitag Vortrag am kommenden Freitag, so dass wir auf dem richtigen Weg zu bleiben. Aber alles wird wie gewohnt gefilmt werden, so keine Sorgen machen. Und im Hinblick auf die Quiz-0, was wir in Richtung Ende der Woche zu tun basiert auf der natürlich die Homepage cs50.net eine Erklärung veröffentlichen welche Art von Erwartungen, die Sie haben sollten, wenn es um die erste Quiz kommt. In der Regel wird es Multiple Choice, Richtig-Falsch, kurze Antwort, kurze Kodierung Probleme. Du wirst doch nicht zu erwarten, um das Äquivalent zu implementieren ein Problem, dass Sie auf einem pset zu sehen, für die Sie einen Computer und ein Debugger und dergleichen, aber es wird kleine Kodierung Probleme. Und in der Tat, sind der beste Führer, um ein Gefühl von dem, was CS50 Quiz bekommen, wie wird cs50.net gehen, zum Quizzes Link gehen, und Sie können sehen die vergangenen Jahre im Wert von Tests. Nur erkennen, dass der Lehrplan nicht immer das gleiche über die Jahre. Manchmal fügen wir, manchmal subtrahieren, Wenn Sie also etwas Thema auf einer von denen alte Quiz dass Sie keine Ahnung, was es redet haben, ist es entweder, dass wir es zu bedecken oder dass wir nicht abdecken. Aber in der Form von Bewertungen, an diesem Sonntag, Montag und Dienstag sowie einem Kurs-weiten Review-Sitzung am Sonntagabend - Zeit und Ort auf der natürlich die Homepage bekannt gegeben - Sie alle haben die Möglichkeit, mit dem Verlauf der Lehre Stipendiaten überprüfen Das Material für dieses Jahr, sowohl im Schnitt und als Full-Klasse, und diese werden wie üblich gefilmt als gut. Gut. So ohne weiteres, ein Kommentar über Pass / Fail und Add / Drop. Sie können meine Notizen gesehen haben letzte Nacht, und das ist wirklich nur ein paar zusätzliche Sicherheit dass, wenn Sie zählen zu den besonders weniger komfortabel oder irgendwo dazwischen und du fühlst dich nur ein wenig über den Kopf, erkennen, dass ist ja ganz normal, und es gibt eine breite Unterstützung Struktur vorhanden, von denen Bürozeiten waren darauf bedacht, auf die Verbesserung der umso mehr pro meine email letzte Nacht, und zu erkennen, dass eine Option wie Pass / für eine Klasse wie folgt fehl wirklich als einen Mechanismus, um den Rand ausziehen eines Kurses, wie dies bedeutete, so dass wiederum, wenn Sie verbringen diese 10, 15, 20 Stunden nur versuchen, etwas pset an die Arbeit, und Sie wissen, dass Sie 90-95% der Weg dorthin Sie können aber nicht gefunden, einige verdammte Bug in einer Pass / Fail-Modell, das Art ist okay. Die Idee ist, dass mit diesem Mechanismus können Sie dann konzentrieren sich auf Ihre anderen pset oder schlafen oder was immer es ist, dass man auf das konzentrieren, wollen. So erkennen, dass Sie bis zum kommenden Dienstag haben - technisch 5. Montag, aber es ist ein Feiertag, so am kommenden Dienstag - aus Lichthupenschalter / Fail abgestufte oder umgekehrt. Und wenn du wirklich am Abgrund und der Drop ganz denken, Sie fangen mich nach Vorlesung oder schreiben Sie mir eine Notiz. Wir würden auf mindestens Chat lieben, bevor Sie adieu mitzubieten. Gut. Also haben wir angefangen, die Stützräder off letzten Zeit. Insbesondere konzentrierten wir uns auf String. String ist etwas, das in der CS50-Bibliothek deklariert ist, speziell in dieser Datei namens cs50.h die wir beginnen, in dieser und nächste Woche aussehen. Aber String ist eigentlich nur eine Vereinfachung der etwas das ist ein wenig mehr arcanely als char * beschrieben. Char wir kennen. Es ist nur ein einzelnes Zeichen. Aber * ab Montag bezeichnet, was? >> [Student] Ein Zeiger. Ein Zeiger. Und was ist ein Zeiger? >> [Schüler] Eine Adresse. Es ist wie eine Adresse, eine Stelle im Speicher. Was ist eine Adresse oder einen Ort oder Speicher? Wieder haben uns alle Laptops mit einem Gig oder 2 Gigabyte RAM wahrscheinlich in diesen Tagen, und das bedeutet, Sie haben eine Milliarde oder 2 Milliarden Bytes im Wert von Speicher. Und es ist nicht wirklich wichtig, was es physisch aussieht, sondern auf den Glauben nehmen, dass man all Anzahl der einzelnen Bytes, dass Sie Ihren eigenen Laptop hat - Dies ist Byte 0 dieses Byte 1 ist, ist dieses Byte 2 Mrd. - und das ist genau das, was ein Computer macht. Wenn Sie Speicherplatz reservieren für ein einzelnes Zeichen, zum Beispiel, hat es natürlich irgendwo leben in den Arbeitsspeicher Ihres Computers, und vielleicht ist es bei Byte Nummer 12345, und das ist irgendwo hier in den Arbeitsspeicher Ihres Computers. Und die Adresse dann von diesem Charakter ist 12345. Jetzt, in der Woche von 0 bis jetzt so weit, wir haben nicht wirklich etwas wo im Speicher die Dinge gespeichert, weil wir normalerweise Symbole, Variablen und Arrays tatsächlich auf unsere Daten zu erhalten. Aber ab Montag und umso mehr heute, bist du jetzt gehen zu müssen umso mehr expressive Fähigkeiten mit Schreiben von Programmen um wirklich zu manipulieren Speicher eines Computers aber Sie sehen, passen, für beide gute Zwecke und schlecht, Bugs ist ein sehr häufiges Ergebnis an dieser Stelle in das Erlernen dieses Zeug. Aber was bedeutet es wirklich, ein char * sein? Fahren wir zurück zu - und wir kommen wieder zum Binky wie versprochen heute. Lassen Sie uns auf ein einfaches Beispiel hier. Lassen Sie mich diese Datei als compare.c, und lass mich einfach ein wenig Template Code hier so gehören stdio.h, lassen Sie mich auch mir selbst gehören cs50.h. Ich werde in bis es zu vergrößern. Lassen Sie mich mit dem Schreiben beginnen wichtigsten int main (void), und jetzt will ich so etwas wie dies zu tun: printf ("Gib mir einen String:") und dann verwende ich string s wird GetString um einen String vom Benutzer zu bekommen, dann werde ich um den Benutzer für ein anderes bitten. ("Gib mir noch eine Zeichenfolge:") und ich werde sie über GetString dazu kommen zu fragen. Ich nenne es t, weil t kommt nach s und s ist ein schöner Name für einen String, wenn es ziemlich generisch ist. So GetString, und jetzt habe ich wollen einfach nur eine Plausibilitätsprüfung tun, und ich werde sagen: if (s == t) dann bin ich gerade dabei, den Benutzer printf erzählen ("Du dasselbe \ n eingegeben!"); sonst werde ich ausdrucken etwas wie ("Du hast etwas anderes! \ n") oder was auch immer das Urteil sein. So etwas Ähnliches. Dann wie gewohnt, werde ich 0 zurück, die nur bedeutete, dass nichts Schlimmes passiert ist, und ich werde weitermachen und Kompilieren und Ausführen dieses Programms. Aber am Montag liefen wir dieses Programm, und tatsächlich wurde gesagt, dass HALLO nicht hallo und tschüss ist kein Abschied. Das Verhalten, das wir sahen, war ein wenig mehr wie diese. Lassen Sie mich in mein Quellverzeichnis, zoom in hier, und wir haben zu vergleichen. Zusammengestellt okay. Lassen Sie mich laufen zu vergleichen. Gib mir einen String: HALLO. Gib mir noch eine Zeichenfolge: HALLO. Sie tippte etwas anderes! Nun, lassen Sie mich versuchen, etwas einfacher, wie 50, 50. Sie tippte etwas anderes! hallo, hallo. So klar ist was los hier. Aber was war die Erklärung dafür, warum? Offenbar ist die Linie 12 komplett dysfunktional. Was ist das grundlegende Problem hier? Yeah. >> [Schüler] Es vergleicht die Adressen. Ja, genau. Es ist eigentlich Vergleichen der Adressen in denen HALLO und HALLO gespeichert werden. Es ist nicht zu vergleichen die Buchstaben HALLO wieder und wieder, weil das, was wirklich passiert ist, die ganze Zeit wir haben mit GetString - Diese Tafel ist wieder unser Arbeitsspeicher des Computers, und sagen wir ich nenne GetString nach der Deklaration einer Variablen s. Was macht mein Gedächtnis aussehen? Lasst uns willkürlich sagen, dass s so aussieht. Es ist ein Quadrat. Und so ziemlich jede Zeit habe ich ein Stück Erinnerung auf dem Bildschirm gezeichnet wenn es 32 Bit ist Ich zeichne Plätze wie das, weil in der Tat in das Gerät, ein Zeiger, um eine Adresse, beträgt 32 Bits. Es ist das gleiche wie ein int. Das kann basierend auf Computersystems variieren. Diejenigen von euch, vage mit der Tatsache vertraut, dass Ihr Mac oder PC 64 Bit ist es, das tatsächlich bedeutet, dass Ihr Computer mit 64-Bit-Zeiger, 64-Bit-Adressen, und unter den upsides davon ist Ihr Computer kann viel mehr RAM als damals haben. Lange Rede kurzer Sinn, wieder in den Tag, wenn die Computer nur 32 Bit Adressen darstellen, die größte Anzahl von Bytes, die Sie darstellen könnte in diesem Fall war, was, wenn Sie 32-Bit haben? So 4 Milliarden, rechts, da 2 der 32 4 Milliarden. Diese Zahl hat sich im Laufe worden wiederkehrend. Also, wenn Sie nur 32 Bits, die höchste Zahl, die Sie zu zählen können, ist rund 4 Milliarden Euro. Aber das war eine grundlegende Einschränkung von Computern bis vor ein paar Jahren denn wenn man zählen nur so hoch wie 4 Milliarden es spielt keine Rolle, wenn Sie 8 Gigabyte RAM oder sogar 5 Gigabyte RAM zu kaufen; könnt ihr nicht zählen, dass hoch, so dass es sinnlos war. Man konnte nur auf die ersten 3 oder 4 Gigabyte Arbeitsspeicher Ihres Computers. Das ist weniger ein Problem, jetzt, und Sie können MacBook Pros und Dells kaufen mit 8 Gigabyte RAM oder mehr in diesen Tagen. Aber wenn ich ganz einfach in diesem Programm zuzuordnen einen Zeiger, genannt ein Zeiger s, es könnte, wie dies auf den Bildschirm schauen, weil wir tatsächlich zu schälen zurück diese Schicht müssen. Ich sage immer Saite, aber ab Montag, string ist wirklich char *, die Adresse einiger Charakter. Werfen wir also, dass die Ausbildung Rad ab, obwohl wir weiterhin mit GetString für jetzt. Also habe ich erklärt, s, und das ist ein Stück Speicher, 32 Bit. Was ist hier im Speicher standardmäßig? >> [Unverständlich Studenten Antwort] Was ist das? >> [Schüler] Garbage. >> Garbage. Genau. Wenn Sie der Programmierer nicht stellen einen Wert in einer Variablen, wer weiß, was es ist? Manchmal muss man Glück haben und es ist 0, welche Art von einem schönen, sauberen Default-Wert, aber wie wir Montag sah, manchmal ist es völliger Unsinn, einige wirklich große positive oder negative Zahl, von wo kam? Yeah. >> [Schüler] Die Funktion vor. >> Ja. Oft ist die Funktion, die aufgerufen werden, bevor, weil erinnern konnte, wie Sie Funktionen in Erinnerung rufen, nehmen sie mehr und mehr Raum von unten nach oben, und sobald die Funktion zurückkehrt, wird diese Erinnerung wiederverwendet mit dem nächsten Kerl, der aufgerufen wird, wird die mit Ihrem gleichen Schicht des Speichers. Und wenn Sie nach links Müll dort vorherigen Werte, könnten wir s als mit etwas Wert, wenn wir wirklich nicht gesetzt haben dort nichts zu verwechseln. Also unsere RAM an diesem Punkt sieht wie folgt aus. Jetzt auf der rechten Seite der Linie 7 nennen wir GetString, Which wir haben jetzt tun seit Wochen, aber was ist GetString wirklich tun? GetString geschrieben von der CS50 Personal ist ein wenig intelligenter , dass, sobald der Benutzer startet Eingabe-Tasten und ENTER drückt, GetString Zahlen, wie viele Anschläge hat der Benutzer Hit, wie viele Zeichen muss ich RAM für zuzuweisen. Und wo das RAM kommt, wer weiß? Es ist irgendwo in Ihrem Computer 2 Gigabyte oder was der Erinnerung. Aber lassen Sie uns annehmen, dass die Computer-Raum für das Wort HALLO gefunden hier. Das Wort, das ich geschrieben war H-E-L-L-O. Und wenn wir daraus ziehen als eine Abfolge von Zeichen, könnten wir es so machen. Aber ich muss 1 extra tun. Was gehört am Ende einer Zeichenfolge in C? Das Null-Zeichen, die wir schreiben, wie \ 0. Es ist technisch die Zahl 0, aber der Backslash macht den klareren dass dies ist buchstäblich die Zahl 0, die ganze Zahl 0; Es ist zum Beispiel nicht, quote-unquote 0, dass Sie vielleicht über die Tastatur einzugeben. Das ist also HALLO. Und was haben wir gesagt am Montag, dass eine Funktion wie GetString tatsächlich wieder all diese Woche? Es ist nicht wieder einen String per se, weil das nicht wirklich eine Bedeutung haben da Strings existieren nicht. Sie sind eine Art der Herstellung in der CS50-Bibliothek. Was ist wirklich ein String ist, technisch? >> [Schüler] Es ist das erste Zeichen. Genau. Es ist ganz einfach die Adresse des ersten Zeichens, dass der Benutzer eingetippt Also, wenn mein Wort HELLO es endet bei Byte Nummer 123 und dann auf Byte-Zahl 124, 125, 126, und so weiter, wenn ich lediglich die Anzahl meiner Bytes von 0 an aufwärts, was wirklich GetString kehrt zurück ist buchstäblich die Nummer 123. Also, was wird in s gesetzt ist die Nummer 123, nicht der Buchstabe H, nicht das Wort HALLO, ganz einfach die Adresse, an die ich finden kann, den ersten Buchstaben des HALLO. Aber das heißt nicht wie genug zu sein scheinen. Ich fragte Sie nach einer Zeichenkette, nicht ein Zeichen. So, wie wir oder der Computer weiß, dass ELLO Art zusammen mit dem H kommen? Was ist die Art von Vereinbarung, die wir haben? Yeah. [Schüler] Es hält Erzählen selbst, einige weitere Zeichen zu finden. >> Genau. Es ist das Mensch-Computer-Konvention, wodurch, wenn Sie mit Strings zu tun haben, ansonsten nun als char bekannten Sterne, müssen Sie einfach, um herauszufinden, wo das Ende jeder Saite im Leben ist, indem wirklich nur Iteration über sie mit einer for-Schleife eine while-Schleife, was auch immer, so dass, wenn Sie das Ende des Strings Sie können jetzt von dem abzuleiten, oh war das ganze Wort HALLO. Diejenigen von euch, mit vorheriger Programmierung Erfahrung könnte in Java kennen Sie können einfach anrufen. Länge und in anderen Sprachen können Sie Länge oder ähnliches nennen. Das ist, weil in vielen Sprachen, vor allem Dinge genannt objektorientierten Sprachen, die Länge von etwas Art eingekapselt des Stückes der Daten selbst, so wie wir gekapselt IDs und die Namen und Häuser innerhalb eines Schülers am Montag. Aber C ist viel niedrigeren Niveau. Es gibt keine Objekte oder Klassen, wenn Sie diese Begriffe gehört habe zuvor. Alles, was Sie wirklich Speicheradressen. Also das ist eine Art der altmodischen Art der Darstellung interessanter Datenstrukturen. Dein Startwert wie die Adresse des ersten Zeichens und dann nur einige willkürliche Konvention, dass jeder stimmt zu folgen. Also, wie ist Stringlänge umgesetzt, haben wir vor? Strlen, strlen, die einige von euch haben jetzt ein paar Mal verwendet. Es ist ziemlich einfach, nicht wahr? Es ist wie 2 Zeilen Code. Es ist so ziemlich eine for-Schleife von einer Art, vielleicht mit einem zusätzlichen lokalen Variablen. Aber strlen hat nur einen Zeiger zu nehmen und dann auf die Suche nach \ 0. Und sobald er sie findet, kann die Gesamtanzahl von Schritten, die ihn in dieser Zeichenfolge getroffen ist. So können wir daraus schließen, was sich weiter. Nehmen wir also erkläre ich t, ​​wie ich in der Zeile 10 gemacht habe. Dies ist einige Müll Wert. Wer weiß, auf den ersten? Aber auf der rechten Seite der Linie von 10 Ich rufe GetString wieder. Wer weiß, wo endet es? Lasst uns willkürlich sagen, dass das Betriebssystem Platz für sie Weg hierher gefunden. Ich bin zufällig zufälligerweise geben H-E-L-L-O wieder und so können wir ziehen die gleiche Art von Bild. Aber die Tatsache, dass ich neu gezeichnet dieses Bild habe ist gewollt denn das ist eine andere HALLO als diese. Also hier könnte dies location 456 sein, das ist 457, und so weiter. Also, was wird gebracht, wo das Fragezeichen einmal war? In diesem Fall 456. Wir sammeln diese Zahlen willkürlich denn wirklich nach dem heutigen wir werden nicht so sehr darum, was die Adresse von etwas ist. Alles, was wir kümmern uns ist, dass wir herausfinden können, die Adresse einiger Stück Daten wie HALLO. Also wirklich, was die meisten Menschen in der Informatik zu tun, wenn man über Speicheradressen und reden über Zeiger gesagt, anstatt die Mühe herauszufinden, 123 - who cares, wo dieses Zeug tatsächlich ist, Wir wissen nur, dass es an einem gewissen numerischen Adresse - vereinfachen wir die Welt und nur sagen, dass s auf diesem Charakter zeigen und t ist dieses Zeichen zeigt. Und die Tatsache, dass es ein Pfeil ist ganz vorsätzliche weil jetzt buchstäblich s und t bei H weisenden am anderen H weisenden Denn am Ende des Tages, spielt es keine Rolle, was die Adresse ist, aber es ist nicht egal, dass wir die Möglichkeit, diese Adresse mit einem Stück des Codes zu äußern. Wir haben nicht wirklich diese Adressen manipuliert nur noch so werden wir sehen, wo wir einwerfen und sortieren von Dingen zu tun mit Zeigern aber jetzt in Zeile 12 wahrsten Sinne des Wortes, welche Werte vergleichen wir nach dieser Geschichte in Zeile 12? Wir sagen ist 123 gleich gleich 456? Und das ist definitiv nicht der Fall. Und auch konzeptionell, ist dieser Zeiger definitiv nicht das gleiche, da dies weil Sie als GetString zweimal, und GetString nicht versucht sein super clever, es nicht versuchen zu erkennen, oh, du HALLO vor 5 Minuten eingegeben; lassen Sie mich Ihnen den gleichen Zeiger als ich Ihnen vor, es ist nur weist ein neues Stück Speicher jedes Mal, wenn Sie es nennen. So, wie wir dieses Problem beheben? Wenn übergeordnete möchte ich die Saiten HALLO und HALLO vergleichen - Ich weiß nichts über die Zeiger kümmern - wie gehe ich über die Beantwortung der Frage gehen, hat der User geben die gleiche Sache? Was ist notwendig? Yeah. [Student] Verwenden Sie eine Funktion. >> Ich kann mit einer Funktion aus der Box. Ich kann mit einer Funktion namens strcmp, s-t-r-c-m-p, nur die gekürzte Version des Sagens Zeichenfolge vergleichen. Und wenn wir in zu gehen, zum Beispiel, vergleichen 2, welches unter den heutigen Handouts, I genau das tun. Ich hielt alles das gleiche von der Linie 1 auf bis zu 26 oder so, und jetzt feststellen, dieser Teil hat nur ein wenig verändert. Lassen Sie ignorieren Linie 28 für einen Moment und konzentrieren sich nur auf diesen einen. Was haben wir gesagt am Montag, dass str compare tut? Es übernimmt die Prozess, 2 Zeiger, s und t in diesem Fall, Art praktisch die Umsetzung ihrer Finger auf die 2 Buchstaben, und was sie tun müssen, ist so etwas wie eine while-Schleife oder einer for-Schleife und er sagt, das sind die gleichen? Wenn ja, bewegt sie die Finger oder die Zeiger vorwärts. Sind das die gleichen, diese gleich, diese gleich, diese gleich, diese gleich? Und ooh, ich bin am Ende der Schnur an beiden s und t. Ich habe keine Widersprüche gefunden. Ja, diese Strings die gleiche. Und was bedeutet str vergleichen zurück, wenn 2 Strings gleich sind, offenbar? Zero. So 0 ist gut in diesem Fall, denn wenn es -1 oder +1, das bedeutet, dass s nur zufällig vor t alphabetisch oder nach t kommen. Und warum wäre das nützlich sein, um eine Funktion, die Ihnen sagt, welche Zeichenfolge kommt vor haben oder nach in einem Wörterbuch? [Schüler] Searching. >> Suchen und Sortieren. So kann man Dinge wie binäre Suche oder bubble sort tun oder Mergesort wo man die Dinge zu vergleichen. Bisher haben wir Art geschnitten einige Ecken und nur zum Sortieren sprach im Kontext von Zahlen, weil es schön und einfach zu reden, aber man kann sicherlich Zeichenfolgen vergleichen, Apfel und Banane, denn wenn apple ist bekannt, dass vor der Banane zu kommen, ähnlich, können Sie verschieben Strings um im Speicher wie Rob tat mit Mergesort im Video und wir haben hier auf der Bühne mit der Auswahl sortieren, Insertion Sort und Bubble-Sort. So wo sonst können wir das? Lasst uns versuchen. Lasst Art vergessen, dass Lektion für einen Moment und versuchen Sie es jetzt und kopieren 1.c die folgenden tun. In Zeile 21 Ich sage Druck etwas, dann bin ich immer einen String vom Benutzer dann bin ich checking this. Wir haben nicht wirklich in diese Gewohnheit noch bekommen, aber lasst uns jetzt tun. Lasst uns tatsächlich abziehen dieser Schicht. Das ist wirklich char *. Dieser Kerl ist wirklich char *. Also, was bedeutet es, wenn s == NULL werden überprüft? Es stellt sich heraus, dass, wenn Sie eine Funktion aufrufen, wie GetString oder ganz allgemein fragen Sie einfach einen Computer, um Ihnen einige Speicher, etwas schief gehen könnte. Man könnte verrückt sein und bitten Sie den Computer für einen Terabyte Speicher indem er für Billionen von Bytes im Speicher, die einfach nicht in der Computer nicht vorhanden sind, aber GetString und andere Funktionen benötigen einen Weg schreien dich an wenn Sie schon zu viel gefragt. Und die Art und Weise GetString tut, ist, wenn Sie mehr Speicher gebeten haben als es in den Computer, auch wenn diese super, super geringe Wahrscheinlichkeit ist weil keiner von uns gehen, um eine Billion Zeichen eingeben und dann die Eingabetaste drücken, aber geringer Wahrscheinlichkeit auch sein mag, will ich noch für sie nur für den Fall zu überprüfen, und die besonderen Wert, dass GetString, Antwort, und andere Funktionen wieder wenn etwas schief gegangen ist in allen Caps NULL. Und was ist NULL? NULL passiert einfach so, um einen Zeiger zu repräsentieren. Es ist Speicheradresse 0. Die Welt entschieden, dass willkürlich, wenn dies ist mein Arbeitsspeicher des Computers - wissen Sie was? - werden wir nur 1 Byte eines jeden Arbeitsspeicher des Computers zu stehlen, und das ist die Lage 0. Wir werden ihm einen Spitznamen NULL, und wir werden zu versprechen dass wir nie wirklich gestellt realen Daten gibt weil wir einfach willkürlich brauchen einen besonderen Wert, 0, aka NULL, so dass wir an Anwender schreien, wenn etwas schief geht. Ansonsten könnten Sie nicht wissen, 0 bedeutet, legte hier etwas oder bedeutet es etwas schief gelaufen? Wir müssen alle einig, dass NULL bedeutet nichts zurückgegeben wurde, keine tatsächliche Adresse zurückgegeben wurde. Nun, hier bin ich nur die Annahme meiner menschlichen Konvention ich wieder ein von den wichtigsten wenn etwas schief geht. Das ist, weil Haupt Rückkehr Konvention ist auf 0, wenn gute zurückkehren, 1 oder einen anderen Wert, wenn schlecht. Aber GetString und jede Funktion, die sich im Speicher NULL zurück, wenn etwas schlecht geht. Okay. Also leider, Zeile 27, super einfach, obwohl es völlig versäumt, die Zeichenfolge zu kopieren. Warum? Wir können sehen, das wie folgt. Ich bin in Zeile 27, die sich als eine Kopie von s und nannte es t. Also ich bin nicht die Benutzer zu fragen 2 Strings diesmal, ich sage nur den Wert in s sollte in t sowie genommen werden. So jetzt nur noch zu zeigen, wie gebrochene dies in Zeile 29 weiter, was soll ich tun? Ich ersten Prüfung, ob die Länge von t größer als 0 ist. Es gibt einige Zeichen gibt. Der Benutzer eingegeben etwas in. Was ist die Linie 32 zu tun, offenbar? [Unverständlich Student Response] >> Richtig. Sie können Art schließen sie aus, was ich sagte es tut. Aber technisch ist, was diese tun? t [0] stellt dar, was? [Schüler] Die 0. Charakter. >> [Malan] Die 0. Charakter. Oder, human-like, das erste Zeichen in t, was immer das ist, H vielleicht in diesem Fall. Und toupper tut, was es sagt. Es nutzt die 0. Charakter t und es ändert sich. So bedeutet dies, nehmen Sie die 0. Charakter t, machen es Großbuchstaben und steckte es wieder in der gleichen Lage. Also, wenn ich hallo geben in Kleinbuchstaben, sollte dies die Kleinbuchstaben h zu einer Kapitalerhöhung H. ändern Aber das Problem ist, dass in den Zeilen 35 und 36, was ich zu tun habe auszudrucken für uns s und t. Und was ist Ihre Vermutung? Was mache ich eigentlich vor sich geht, um zu sehen, ob ich in Kleinbuchstaben in hallo getippt? Was wird gedruckt werden? >> [Unverständlich Student Response] >> Was ist das? [Schüler] Big H und der Rest klein. >> Der große H und der Rest für die kleine, s oder t? [Schüler] Both. >> Beides. Genau. Also lasst uns sehen, was hier los ist. Lassen Sie mich gehen Sie vor und erstellen diese. Dies ist copy1, so stellen copy1. Gut. Zoom in. Lassen Sie mich gehen Sie vor und führen Sie copy1, Enter, Sag etwas: hallo in Kleinbuchstaben. Es aktiviert die Kopie, aber es scheint aktiviert die ursprüngliche als auch, denn das, was jetzt passiert in dieser Geschichte? In Zeile 27 Ich weiß nicht wirklich zu sein scheinen Kopieren der Zeichenkette, aber auch wenn Sie vielleicht intuitiv gehofft haben, dass der Fall zu sein, Wenn Sie zu diesem Bild denken, was wirklich habe ich getan? Hälfte des Bildes ist die gleiche. Also lasst uns zurück in die Zeit so aus, dass t noch nicht in der Geschichte existieren. S kann in der Geschichte gibt, aber wir Kleinbuchstaben hallo diese Zeit. Also lassen Sie mich zu beheben, was ich eigentlich getippt in. In diesem Fall haben wir hier h-E-l-l-o. Wir werden es als eine Folge von Zeichen zu ziehen, legte meine Trennlinien hier und mein \ 0. Also das ist, wo wir so bald wie Linie 1 sind über 24-ish, geben oder nehmen, ausgeführt wurden. Dies ist das Bild von meinem Speicher. Als ich in die Linie 27 zu bekommen, was geschieht dann? Genau wie vorher, bekomme ich einen Zeiger, die ich als dieses Quadrat zu zeichnen werde. Es heißt t. Und was ist der Wert standardmäßig? Wer weiß? Einige Müll Wert. Also werde ich abstrakt, dass weg wie ein Fragezeichen. Und sobald die rechte Seite der Linie 27 führt, was soll ich setzen Innenseite t? Dasselbe, was in s ist. Also, wenn wir für einen Augenblick zu entfernen diese Abstraktion des Pfeils, und wir sagen, oh, ist dieser Speicher Ladeadresse 123, wenn Sie sagen, t erhält s, Semikolon, Sie buchstäblich setzen 123 hier. Nun, wenn wir solche Vereinfachung unserer Welt wieder mit Bildern, was du wirklich getan ist nur ein weiterer Pfeil, um Ihre Welt hinzugefügt Das ist von t bis exakt das gleiche String zeigt. Also, wenn in Zeile 31 und 32 ich tatsächlich über die Änderung t [0] gehen, was ist t [0] offenbar gleichbedeutend mit jetzt? s [0] Also das ist alles, was passiert ist. Und obwohl diese Art der fühlt sich ein wenig niedrigem Niveau und arcane und diese Art von Gefühl, vielleicht intuitiv dies sollte nur gearbeitet haben - Ich habe Kopien der Dinge vor gemacht und es funktionierte einfach - wenn Sie tatsächlich darüber nachdenken, was ein String ist wirklich, es ist ein char *. Nun, was ist das? Es ist die Adresse eines Charakters. Dann vielleicht macht es mehr Sinn, dass, wenn Sie versuchen, etwas zu tun Super scheinbar einfache wie diese, ist alles was Sie tun Kopieren einer Speicheradresse. Sie sind nicht wirklich etwas zu tun mit der Zeichenfolge sich. Also selbst wenn Sie keine Ahnung haben, wie Sie dieses Problem lösen im Code hohem Niveau, konzeptionell, was wir tun müssen, damit ta originalgetreue Kopie s, offenbar? Yeah. >> [Schüler] Gib es einen neuen Standort? >> Genau. Wir müssen den t eine neue Lage. Wir müssen irgendwie eine Welt schaffen, in dem wir einen neuen Block arbeiten, die gerade der Übersichtlichkeit halber werde ich direkt unter diesem ein zu ziehen, aber es muss nicht dort zu sein. Aber es braucht, um die gleiche Größe haben, also werde ich diese vertikalen Linien an der gleichen Stelle zu ziehen. Es ist in Ordnung, wenn dies alles Müll zunächst. Wer weiß, was da war? Aber Schritt 1 gehen zu müssen, werden mir so viel Speicher geben, wie ich brauche eine Kopie hallo passen, dann herauszufinden, wie man die h hier kopieren, die E hier l die hier und so weiter. Aber dies sollte bereits das Gefühl ein wenig offensichtlich, auch wenn einige Details noch abstrakt. Um diese Zeichenfolge in diese zu kopieren, ist es nur eine for-Schleife oder eine while-Schleife oder etwas, mit dem Sie umso vertraut habe. Also lasst uns versuchen. Lassen Sie mich in copy2.c gehen. In copy2.c haben wir fast das gleiche Programm, außer für die Linie 27. Es sieht ein wenig komplex, aber wenn wir brechen sie Stück für Stück, Die linke Seite ist gleich. Char * t schafft dieses Ding in Erinnerung, wenn auch mit einem Fragezeichen weil wir keine Ahnung haben, was da ist standardmäßig aktiviert. Auf der rechten Seite sind wir jetzt eine neue Funktion malloc, für Speicher zuzuweisen, geben Sie mir Speicher, und es anscheinend dauert, wie viele Argumente, wie viele Dinge in Klammern? Ich hörte Gemurmel von 1 und 2, aber es ist nur 1. Es gibt kein Komma, das gibt es nur 1 Sache in den Klammern bedeutet. Auch wenn es noch andere Klammern, lassen Sie mich unterstreichen was drin ist der äußersten Klammern, und es ist dieser Ausdruck: (Strlen (s) + 1) * sizeof (char). Also, wenn wir tatsächlich denken, daß diese durch, wird dieser Spruch mir die Länge von s. Warum bin ich, obwohl, Zugabe von 1 auf die Länge? >> [Unverständlich Studenten Antwort] Genau. Wir brauchen Platz für diesen Kerl am Heck, das sechste Zeichen, die kein Englisch Bedeutung hat aber spezielle programmatische Bedeutung. Also brauchen wir ein + 1 dafür, weil strlen gibt die menschliche Erwartung der Länge, hallo oder 5, bedeutet es nicht geben Ihnen die zusätzliche Null-Zeichen. Also habe ich manuell hinzufügen dies mit + 1. Und dann diese, * Größe (char), haben wir nicht gesehen hatte. Dies ist technisch nicht eine Funktion. Es ist ein spezielles Schlüsselwort, die gerade erfahren Sie, was die Größe von einigen Datentyp auf einem Computer denn in Wirklichkeit haben einige von uns 32-Bit-Computern. Ich habe eine ziemlich alten Computer zu Hause, und es nutzt nur 32 Bit auf Zeiger darstellen. Und so, wenn ich Größe eines Datentyps hat, könnte es 32 Bits. Aber wenn ich mit meinem neuen ausgefallenen Computer bin, könnte ich wieder einen Wert von 64 Bit für so etwas wie eine Adresse. Also in diesem Fall, um nur super sicher zu sein, werden wir nicht zu hart Code so etwas wie - Nun, was ist von der Größe eines char nach dem, was wir bisher gesagt haben? Wir haben ziemlich viel gesagt mündlich, dass sie 1 Byte ist, und das ist ziemlich wahr auf der ganzen Linie. Aber noch einmal, neigen Annahmen, schlecht zu sein. Sie führen zu buggy Software, wenn Menschen nutzen die Software in einer Weise, sie nicht gedacht. Lassen Sie uns also abstrakte diese weg und nur mehr allgemein sagen, Ich brauche so viele Stücke der Erinnerung und jeder Block arbeiten sollte gleich der Größe eines Zeichens, das ist in Wirklichkeit gleich 1 in diesem Fall, aber es ist ein allgemeiner Weise es zu schreiben. Also, wenn das Wort hallo, ist, wie viele Bytes malloc offenbar hallo zuweisen? [Schüler] Six. >> Six. Genau so viele wie Fragezeichen auf dem Bildschirm haben. Und dann nehmen Sie ein jetzt Vermutung auf Ihr Verständnis von GetString Basis was bedeutet malloc wahrscheinlich zurückkehren? >> [Schüler] Eine Adresse. Eine Adresse von was? Der erste Block des Speichers. Wir haben keine Ahnung, was da ist, weil eine andere Funktion konnten, wurden mit diesen Speicher zuvor. Aber malloc wie GetString, liefert die Adresse des ersten Bytes des Speichers dass es beiseite für Sie eingerichtet. Allerdings ist, was sie nicht tun in dieser Rohling mit einem Backslash Nullzeichen füllen weil es stellt sich heraus, Sie malloc verwenden können, um nichts zuordnen: ints, Strings, Arrays, Schwimmer, Student Strukturen. Sie können malloc komplett generisch verwenden. Es kümmert sich nicht oder müssen wissen, was Sie Zuweisen von Speicher für. So wäre es vermessen für malloc ein \ 0 setzen am Ende eines jeden Stück Speicher es Ihnen weil diese \ 0 Sache ist nur eine Konvention für Streicher. Es nicht für ints verwendet, es ist nicht für Schwimmer verwendet, ist es nicht für Studenten verwendet. Und so ist die gotcha mit malloc ist, dass die Belastung ganz auf Sie der Programmierer zu erinnern, wie viele Bytes Ihnen zugeordnet und nicht immer eine for-Schleife oder eine while-Schleife und gehen vorbei an der Grenze des Stück Speicher, die Sie erhalten haben. Anders gesagt, sobald Sie Speicher zuweisen, Sie können nicht fragen, das Betriebssystem, oh, übrigens, wie groß der ein Stück der Erinnerung war das? Es ist völlig bis zu Ihnen zu erinnern, wenn Sie diesen Wert benötigen. Also mal sehen, wie ich diesen Speicher zu verwenden fortzufahren. In Zeile 28 und 29, warum mache ich das? Nur insgesamt Plausibilitätsprüfung. Nur für den Fall etwas schief gelaufen ist, bitte ich um ein paar verrückte Menge an Speicher oder ich habe so viele Dinge auf dem Computer ausgeführt, dass es einfach nicht genug Speicher, so etwas wie, dass ich zumindest will für null überprüfen. In Wirklichkeit werden die meisten Computer geben Ihnen die Illusion, dass jedes Programm kann die Gesamtheit Ihrer RAM zu verwenden, aber auch so, wenn der Benutzer in einem verrückten langen Schnur vielleicht weil sie ein schlechter Kerl und sie tatsächlich versuchen, Ihr Programm oder hack in sie abstürzen, Sie wollen mindestens den Rückgabewert von malloc und ob es gleich null. Und wenn doch, lass uns einfach jetzt beenden, weil ich nicht weiß, was in diesem Fall zu tun. Wie kopiere ich den String? Es gibt ein paar Möglichkeiten, dies zu tun. Es gibt str Kopieren von Funktionen in C, aber es ist super einfach für uns, diese auf die altmodische Art und Weise zu tun. Lassen Sie mich zunächst herauszufinden, was die Länge von s ist. Ich konnte dies in der Schleife gesetzt haben, sondern ich legte es hier für Klarheit. So n speichert nun die Länge der ursprünglichen Zeichenfolge, die anscheinend 5. Da ist in meinem for-Schleife Ich bin von 0 Iteration auf bis zu n, und bei jeder Iteration Ich stelle s [i] Innenseite t [i]. Also das ist, was ich mit meinen 2 Finger zeigt auf den Saiten, bevor impliziert. Da diese for-Schleife wie diese, ich werde das Kopieren h in hier, e in hier l in hier, weil dies s, ist dies t. Und dann schließlich in Zeile 35, warum mache ich das? Ich muss sicherstellen, dass ich die Beendigung der String t. Und ich habe es auf diese Weise zu super explizit. Aber vorzuschlagen, jemand, wenn Sie könnten, einen anderen Weg, dies zu tun. Ich weiß nicht wirklich brauchen, Zeile 35. Es gibt einen anderen Weg, um dies zu tun. Yeah. >> [Unverständlich Student Response] >> Sag es lauter. [Student] Weniger als oder gleich. >> Genau. Wir könnten nur sagen, weniger als oder gleich n, die in der Regel schlecht gewesen ist weil fast immer, wenn wir gehen bis zu einer gleich dem, was wir sind gezählt wir gehen ein Schritt zu weit. Aber denken Sie daran hat, wie viele Bytes vergeben wir? Wir zugeordnet strlen von s, so 5 + 1 für insgesamt sechs. Also in diesem Fall könnten wir etwas tun so dass wir kopiert nicht nur die hallo, sondern auch die \ 0 am Ende. Alternativ könnten wir eine Funktion namens str Kopie, strcpy, aber das wäre nicht annähernd so viel Spaß machen. Aber das ist alles es tut unter der Haube. Dann endlich, wir tun das gleiche wie vorher. Ich Kapital t und dann behaupte ich, dass die ursprüngliche wie dieses und die Kopie sieht so aussieht. So versuchen wir das jetzt. Lassen Sie mich hier zu gehen. Machen copy2. Wir vergrößern und führen copy2. Ich werde in hallo Kleinbuchstaben einzugeben, und zwar bekomme ich Kleinbuchstaben hallo wie das Original sondern das Kapital hallo für die Kopie. Aber ich bin noch nicht fertig nur noch. Ich muss 1 letzte, was hier zu tun. 46 und 47 ist deutlich freigegeben werden kann, aber was bedeutet das eigentlich? Was mache ich, meinst du, indem Linie 46 und Linie 47? Welche Auswirkungen hat das denn? Yeah. [Unverständlich Student Response] >> Genau. Sie sind nur zu sagen das Betriebssystem, hey, danke für dieses Speichers. Jetzt können Sie es für jemand anderes. Und hier ist ein perfektes Beispiel für Müll Werte. Ich habe gerade diesen Speicher verwendet werden, um aufzuschreiben, das Wort Hallo in 2 Plätze, hier, hier, hier und hier. Dies ist also h-E-l-l-o-\ 0. Aber dann rufe ich die Leitung 46 und die Leitung 47, und Sie wissen, was dort geschieht im Hinblick auf dem Bild? Eigentlich warten, dieses Bild ist die alte. Sobald wir die Kopie zu machen, ist dieser Kerl tatsächlich zeigt sich hier, also lasst entfernen Sie die Zahlen und nur abstrakte weg, als unsere Pfeile wieder. Was passiert in diesem Bild, wenn ich kostenlos telefonieren? [Unverständlich Student Response] >> Nicht einmal. Wenn ich frei auf s und t nennen - eine Art Fangfrage - dieses Bild überhaupt nicht ändern da ruft s und ruft t sagt nur das Betriebssystem, hey, können Sie diesen Speicher wieder zu verwenden, aber es ändert daran nichts zu null oder einige Sonderzeichen, ist es nicht dies zu ändern, es ändert nicht die h oder e oder l oder l oder o in beiden Orten etwas anderes. In Bezug auf das Bild, sobald Sie kostenlos, es ändert sich nichts nennen. Und darin liegt der Ursprung von Müll Werte, denn wenn ich später in diesem Programm stellen Sie das Betriebssystem mehr Speicher mit GetString oder malloc oder so ähnlich und das Betriebssystem sagt, sicher, ich 12 Byte Speicher nur befreit haben up, nutzen diese, was wirst du zu übergeben? Du wirst übergab ein Stück Erinnerung, dass wir in der Regel ziehen würde mit Fragezeichen, aber was sind die Fragezeichen? Sie zufällig h-E-l-l-o, h-E-l-l-o sein. Dies sind unsere neue Garbage-Werte so bald wie Sie sich befreien, dass der Speicher. Es gibt eine reale Welt stillschweigend auch hier. Dies geschieht mit RAM zu tun, aber Ihre Computer tatsächlich tun die gleiche Sache mit der Festplatte. Wir werden über diese insbesondere sprechen Sie mit einem zukünftiges Problem Satz, der auf Forensik konzentriert. Aber was passiert eigentlich, wenn Sie einige sensible Finanzdaten-Datei auf Ihrem Desktop haben oder einige skizzenhafte JPEG und Sie ziehen Sie es in den Papierkorb, was passiert, wenn Sie es ziehen in den Papierkorb oder in den Papierkorb? Sie wusste, was ich redete. [Gelächter] Was passiert, wenn Sie diese Hinweise in Ihrem Papierkorb oder Mülleimer gezogen haben? [Unverständlich Studenten Antwort] Nun, so vorsichtig. Was passiert, wenn Sie das tun? Die kurze Antwort ist nichts, oder? Sketchy oder sensible Datei noch nur da sitzen irgendwo in Ihrer Festplatte. Die meisten von uns haben zumindest die harte Tour, dass Sie Ihren Papierkorb entleeren müssen gelernt oder Ihrem Papierkorb tatsächlich Dateien löschen. Und in der Tat, wenn Sie die rechte Maustaste oder Steuern Klick auf Ihre Mülleimer oder wählen Sie Datei, Empty Trash oder was auch immer und Sie tatsächlich leeren den Papierkorb oder Papierkorb, was tatsächlich passiert, dann zu diesem Bild? Mehr nichts. Also nichts passiert eigentlich auf der Festplatte. Und wenn wir vorübergehend nur abschweifen und schreiben - ich werde einfach die Rückseite dieser. So, jetzt wird die Geschichte aus dem RAM, die in dem Programme existieren ändern während Sie sie wollen, auf die Festplatte, die ist, wo sie langfristig gespeichert werden selbst wenn der Strom ausfällt, denn jetzt - und wir kommen wieder, diese in die Zukunft - lasst uns einfach behaupten, dass dies die Festplatte im Inneren des Computers stellt weil wieder in den Tag sie verwendet, um Kreisscheiben werden, ähnlich wie Disketten. Also, wenn Sie einige sensible Excel-Datei zu tun, könnte es bis dieses Stück Speicher auf Festplatte Ihres Computers, und ich bin einfach nur Zeichnen gleichen willkürlichen 1s und 0s. Wenn Sie die Datei so ziehen Sie Ihre Mülleimer oder Papierkorb, buchstäblich nichts passiert, weil Apple und Microsoft haben gerade beschlossen, die Mülleimer und Papierkorb ist wirklich nur eine vorübergehende Platzhalter. Vielleicht schließlich das OS wird es für Sie zu leeren, aber in der Regel ist es nicht tun, zumindest bis Sie wirklich wenig Platz sind. Allerdings, wenn Sie Papierkorb leeren oder leeren Papierkorb zu gehen, ähnlich, passiert nichts an diesem Bild. Alles, was geschieht, ist an anderer Stelle auf Ihrem Computer, es ist eine Art Tisch. Es ist eine Art wie ein kleiner Spickzettel, die, dass, sagen wir, Resume.doc sagt, so Ihren Lebenslauf in einer Microsoft Word-Datei verwendet werden, um an der Stelle 123 auf Ihrer Festplatte zu leben, nicht im Speicher und nicht im RAM, sondern auf Ihrer Festplatte, und Ihre skizzenhaften JPEG Leben auf 456 und Ihre Excel-Datei lebt auf 789 oder wo auch immer. Wenn Sie Dateien löschen, indem tatsächlich Leeren des Papierkorbs oder dem Papierkorb, Dieses Bild ändert sich nicht. Die 0 und 1 auf Ihrer Festplatte nicht überall hingehen. Aber dieser Tisch, dieses kleine Datenbank sortiert, ändert sich. Wenn Sie Ihren Lebenslauf löschen, ist es, als ob die Datei in einem gewissen Sinn gelöscht wird, aber der Computer tut, ist vergessen, wo das Ding lebt auf Ihrer Festplatte. Die 0 und 1, die Ihren Lebenslauf oder eine dieser anderen Dateien zu komponieren sind noch intakt. Also, wenn Sie tat dies versehentlich, es gibt noch eine Nicht-Null-Wahrscheinlichkeit dass Sie Ihre Daten wiederherstellen mit Norton Utilities oder eine kommerzielle Software deren Zweck im Leben zu finden ist 0 und 1, die Art der zu Waisen geworden sind, hier aber vergessen Sie hier links, so dass Sie Ihre Daten zurück bekommen kann. Oder forensische Ermittler bei der Polizei oder FBI würde tatsächlich einen Festplatte und tatsächlich nach Mustern von 0 und 1, die aussehen wie JPEGs, wie Excel-Dateien zu suchen aussehen, und erholen sie auf diese Weise, auch wenn der Computer hat sie dort vergessen. Der einzige Weg, wirklich zu löschen, wie wir in der Zukunft besprechen, ist zu schrubben oder wischen Sie die Datei oder Festplatte - Man kann nicht wirklich loszuwerden, die 0 und 1 denn sonst würden Sie mit einem Gigabyte Festplatte zu starten und Sie würden am Ende mit einem Megabyte Festplatte, wenn Sie ständig das Löschen wurden, wörtlich 0s und 1s. Also, was würden Sie tun, wenn Sie wirklich wollen, um Ihre Spuren zu verwischen und das grundlegende Problem ist, dass es noch 0 und 1 auf der Festplatte? Ich sehe jemanden gestikulierend, dass Sie physisch zu brechen das Gerät. Das wird funktionieren. [Gelächter] Aber wenn das ist irgendwie eine teure Lösung, was wäre vernünftiger sein? Yeah. >> [Schüler] überschreiben. >> Überschreiben sie mit was? >> [Schüler] Andere Daten. Andere Daten. Sie können einfach überschreiben Festplatte mit 0s oder 1s oder alle 0s, alle 1s. Und das ist in der Tat, was einige der Software tut. Sie können kaufen, Software oder sogar kostenlose Software, und selbst in den Mac OS diesen Tagen gebaut, weniger in Windows, ist die Fähigkeit, sicher zu löschen. Eigentlich, wenn Sie alle laufen heute nach Hause wollen, wenn Sie einen Mac haben und tun dies, wenn du schon ein paar Sachen in Ihrem Papierkorb können, können Sie Papierkorb sicher entleeren, die genau das tut. Anstatt nur zu löschen Dateien hier ist es nicht löschen Sie die 0 und 1 hier vielmehr es ändert sie alle z. B. auf 0s und Punkt, Punkt, Punkt. So ein Ihrer zukünftigen pset wird tatsächlich absichtlich Daten wiederherstellen - Fotos, die wir von Menschen, Orte und Dinge auf dem Campus getroffen für die wir machen eine forensische Bild von einer Digitalkamera Speicherkarte das ist genau die gleiche Idee - und du musst herausgefordert, tatsächlich finden werden die Muster, die JPEGs stellen auf Ihrer Festplatte, ähnlich wie dieser ehemalige Schüler, dessen E-Mail-las ich vor ein paar Wochen hat seine Schwester Fotografien erholen. Warum nehmen wir nicht einen 5-minütigen Pause hier, und wir werden mit mehr Speicher neu zu gruppieren. Also hier ist, wo die Dinge ein wenig kniffligen bekommen, aber dies ist eine sehr mächtige Schritt zum Verständnis dieses umso mehr. Hier ist ein Programm namens pointers.c. Es ist unter den heutigen Beispielcode. Beachten Sie, dass in den ersten paar Zeilen 19 bis 22, alles, was wir tun so etwas wie GetString ist und Zurückgeben einer Adresse, Speichern derselben in n. Fortan für pset sogar 3, wenn Sie wollen, aber pset 4 und auf wo Sie anfangen, diese Ausbildung Räder selbst zu nehmen, es gibt keinen Grund zu behaupten, dass Strings mehr gibt. Es ist sicherlich in Ordnung, starten Sie einfach sagen char *. Nebenbei, in Online-Referenzen und Bücher, die Sie oft sehen den Stern neben der Variablen. Vielleicht sehen Sie sogar Räume um beide Seiten davon. Alle von ihnen sind funktionsgerecht. Für jetzt aber, wir auf diesem Ansatz zu standardisieren, um super klar dass char * ist wie gesagt Zeichenzeiger. Das ist der Datentyp. Und dann der Name der Variablen s in diesem Fall. So haben wir einen String bekommen und wir haben es nannte s. Und dann hier unten bemerken, dass ich tatsächlich tun ein bisschen Betrug. Dies wird Pointer-Arithmetik, welche Art von super einfach aufgerufen wird. Es bedeutet nur, addieren und subtrahieren Zahlen Zeiger. Aber dies tatsächlich funktioniert. Dieses Programm scheint druckt die Zeichenfolge s 1 Zeichen pro Zeile, so dass das Endergebnis - Nur so können wir verderben, wohin dieses geht, machen Zeiger laufen Zeiger, lassen Sie mich hineinzuzoomen Nun lassen Sie mich geben so etwas wie HALLO und Typ eingeben und es gibt 1 Zeichen pro Zeile. Bis vor einer Sekunde, würden wir dies mit eckigen Klammern getan haben. Wir hatten eine for-Schleife, und wir tun würde printf von s [i] und wir würden das wieder und wieder und wieder tun mit einem Backslash n am Ende jeder Zeile. Aber dieses Programm ist anders. Dieses Programm verwendet, buchstäblich, Arithmetik. Also, was ist denn hier los? Zunächst bevor diese Schleife selbst ausführt, was nur klar zu sein, ist tatsächlich s? S? >> [Schüler] Eine Adresse. >> Eine Adresse. Und es ist die Adresse, im Falle von hallo, das erste Zeichen in dem Wort ist, die H. Also s ist, in diesem besonderen Beispiel die Adresse h. Also, was bedeutet es, s do + i? Nun beginnt i bei 0 in dieser for-Schleife. Wir haben das schon oft getan. I gehen wird bis zu der Länge des Strings, offensichtlich. Also bei der ersten Iteration dieser Schleife, i 0 offensichtlich. So ist dieser Ausdruck sagen s + i - vielmehr s +0--das ist offensichtlich nur s. Also, was ist * s hier? Jetzt sind wir mit dem Stern in eine etwas andere Weise. Lassen Sie mich gehen Sie vor und loszuwerden t, weil wir getan reden t und Kopien s. Jetzt wollen wir nur eine Geschichte, die s erzählen. Und so in diesem Moment, nachdem Typ string, sieht unsere Welt ganz wie es zuvor mit nur s Speichern der Adresse h und ganz allgemein zeigend auf der Saite Hallo. Wenn ich jetzt eine Zeile wie * (s + i), lasst uns das auszuprobieren. So * (s + i). Lassen Sie mich zu vereinfachen, weil dies 0, so ist dies * (s +0). Nun, warten Sie eine Minute. Weiter vereinfachen. Dies ist * (n). Nun, jetzt die Klammern Art dumm sind, so dass nun lasst uns einfach tun * s. Also in der ersten Iteration von dieser Schleife, die Linie, die ist hervorgehoben, 26, ist so ziemlich gleichwertig Bedrucken dies. Was ist der Datentyp * s? In diesem Zusammenhang, da die Sterne zufällig neben dem s selbst sein, sondern insbesondere, weil wir nicht mehr erklären s, wir sind nicht die Schaffung eines variablen mehr, es gibt keine Erwähnung von char * in Zeile 26, es gibt keine Erwähnung der Schlüsselwort string, sind wir nur mit einer Variable namens s, es stellt sich heraus jetzt die Sterne etwas anderes hat und, zugegebenermaßen, verwirrend Bedeutung. * S bedeutet hier rufen Sie die Adresse in s und Druck, was da ist. So s hier ist, ist * s - Art wie Rutschen und Leitern, folgen Sie dem Pfeil - hier. Also das ist * s. Was also wird bei der ersten Iteration der Schleife in der Leitung 26 gedruckt? Drucke ich% c, die Platzhalter für ein Zeichen ist, dann ein \ n für eine neue Zeile. * (S + i), wobei i 0 ist genau dies. Also, was char mache ich Platz für% c? H. In der nächsten Iteration der Schleife - kann man wohl sehen, wohin das führt - die nächste Iteration i 1 ist offensichtlich, so bedeutet dies, s +1, und dann jetzt ich brauche die Klammern, weil jetzt der Stern muss sagen, gehen Speicheradresse s +1. Was ist s? Lassen Sie uns rollen zurück in der Zeit und sagen dieser Pfeil ist nun eigentlich nicht tun uns keinen Gefallen. Lasst uns genauer sagen, dass dies ist das Speichern der Zahl 123 weil der Beginn dieser Zeichenfolge hallo, ist diese Adresse 123, ist dies 124, und so weiter. Also auf der zweiten Iteration, wenn ich sage, s +1, das ist wie gesagt 123 ein, sonst als 124 bekannt, so was char auf dem zweiten Iteration wird gedruckt? E an der Speicheradresse 124. Dann + wieder, 125, 126, 127, und diese Schleife zum Glück stoppt, bevor wir hier bekommen weil ich bin mit strlen, um sicherzustellen, dass ich nicht gezählt zu hoch. So auch das ist es. Auch dies ist so, als ob wir vor einer Woche getan. Lassen Sie mich schreiben Sie es auf die Zeile unter, obwohl wir nicht wollen, beides zu tun. Dies ist identisch nun dazu. Also auch wenn s ein String ist, wie wir gefordert haben es seit Wochen, ist s wirklich ein char *. Also, wenn wir zu super anal sein wollen, ist es wirklich richtig, den besonderen Charakter schreiben bei der i-ten Stelle mit diesen numerischen Adressen und diesen Stern-Operator, aber ehrlich gesagt, das ist nur so viel sauberer. Also das ist nicht schlecht. Kein Grund, damit aufzuhören Linie 27 hier, aber 26 ist funktional gleich, und es ist funktional gleich aus genau den Gründen, dass wir schon so weit zu diskutieren. Und schließlich ist 29 nur eine gute Praxis. Aufruf frei von s bedeutet, dass jetzt gibst du die Erinnerung, dass GetString gab dir weil wieder, wie ich bereits erwähnt Montag, GetString Wochen wurde die Einführung eines Fehlers in Ihren Code. Ihr Code seit Wochen Speicherlecks hatten wobei Sie haben gefragt GetString für Speicher, aber Sie haben nie geben es zurück. Und das wurde bewusst von uns gewählten pädagogisch weil es einfach zu viel zu früh auf zu denken. Aber jetzt brauchen wir mehr Symmetrie. Wenn Sie den Computer stellen für Speicher, wie es der Fall für die GetString, wie es der Fall offenbar malloc, Sie müssen nun für pset 4 Weiterreise auch kostenlos ein solcher Speicher. Beachten Sie dies anders zu sagen int n. Sie brauchen nicht, dies zu befreien, weil du nicht angerufen hast GetString und du hast nicht angerufen malloc. Und selbst wenn Sie angerufen GetInt als wir schließlich sehen, GetInt keinen Speicher für Sie, weil Sie tatsächlich passieren kann rund Zahlen und schwimmt und Zeichen genau so, wie wir uns seit Wochen habe tun. Strings sind jedoch etwas Besonderes, weil sie wirklich die Verkettung von mehreren chars sind. So sind sie eben anders aus chars und schwimmt und ints und dergleichen. Aber kommen wir zurück zu dieser vor langer. Fragen dann auf dieser Anfang von Zeigern? Yeah. [Unverständlich Studenten stellen] Ah, sehr gute Frage. Eines der wenigen Dinge, C tatsächlich für Sie, ist die bequeme, ist es herausfindet, für Sie, was die Größe des Datentyps und dann tut diese Art der Vermehrung für Sie. Dies ist irrelevant im Fall von Zeichen, weil fast immer ein Zeichen ist 1 Byte, so dass diese einfach funktioniert. Aber im Interesse der Diskussion, ob man tatsächlich Drucken Zahlen und Sie versuchen zu drucken einen Wert s, die bei einem ganzzahligen verwies, Sie ähnlich müssten nicht + 4 do * i, nur weil ein int 4 Byte. Zeigerarithmetik bedeutet, dass C und der Compiler alle, dass Mathematik für Sie tun. Alles, was Sie zu kümmern ist das Zählen in eine Art der menschlichen Sinne. Yeah. [Schüler] Wenn Sie eine Zeichenfolge erklären Inneren eine for-Schleife, haben Sie später befreien? Gute Frage. Wenn Sie eine Zeichenfolge innerhalb der for-Schleife deklariert, brauchen Sie, um sie später zu befreien? Sie brauchen nur, um Speicher freizugeben, dass Sie mit GetString oder mit malloc reservieren. Also, wenn Sie gerade etwas sagen wollen - lassen Sie mich geschweiften Klammern jetzt so der gesamte Code verwandt ist. Wenn Sie etwas, wenn auch buggily, wie dies tat, char * t = s, Sie nicht zu kostenlosen T brauchen, weil t ohne Einbeziehung jede Erwähnung von malloc oder GetString. Wenn dagegen Sie dies getan haben, GetString, dann ja, möchten Sie kostenlos t brauchen. Und in der Tat ist Ihre einzige Chance, das zu tun jetzt in dieser Schleife für das gleiche Problem Spielraum dass wir in der Vergangenheit diskutiert. Sonst würdest Zuweisen von Speicher, Zuweisen von Speicher, Zuweisen von Speicher, und am Ende des Programms, weil Sie sich außerhalb der Schleife, t existiert nicht, aber man kann nie gesagt, das Betriebssystem dass Sie nicht brauchen, dass der Speicher nicht mehr. Und es dauerte nicht lange, für pset 4 oder 5 werden wir Sie mit einem Programm namens Valgrind auszustatten, was im Geiste gleich GDB, dass es etwas ist von einem geheimnisvollen Schnittstelle haben, aber ihr Zweck im Leben ist, Ihnen zu helfen. Und Valgrind ist ein Programm, das in der Zukunft suchen werden Ihre Programme Suche nach Speicherlecks, ob von GetString oder malloc, welche wir beginnen mit umso mehr, als wir mit der CS50-Bibliothek so viel zu stoppen. Wir haben endlich haben jetzt eine Art der Wortschatz und die Art der mentalen Modells in der Theorie mit denen diese gebrochenen Programm zu lösen. Also in diesem gebrochenen Programms arbeitet Swap Innenseite swap, aber es nie wirklich in den wichtigsten funktionierte, weil wichtigsten bestanden in x-und y-, Rückruf, und die wurden von übergebenen Werte, so zu sprechen. Kopien von ihnen gegeben wurden, um zu tauschen. Bis zum Ende des Swap hatte a und b der Tat ausgetauscht worden, aber natürlich x und y, wie wir am Montag diskutiert, war nicht. Also habe ich in grün hier vorschlagen, dass dies tatsächlich ist hier die Lösung. Und tatsächlich, lassen Sie mich zu bewegen meinen Sternen nur konsequent zu sein obwohl wiederum funktionell ist dies nicht relevant. In den kommenden Wochen werden wir erklären, wann und warum es nicht egal. So grün ist jetzt eine Lösung. Ehrlich gesagt, sieht es eine ganze Menge chaotischer, weil ich all diese Sterne haben. Lassen Sie mich darauf hinweisen, eine Sache. Die obere Linie hier, wo es heißt int * a und int * b ist grundsätzlich das gleiche tun, wie es schon immer. Es wird erklärt 2 Argumente oder Parameter zu tauschen, von denen das erste ein int Zeiger genannt, von denen die zweite ist ein int Zeiger namens b. Das einzige, was ist neu an dieser Stelle ist die Tatsache, dass es einen Stern gibt. Was bedeutet das? A ist nicht ein int ist b kein int. A ist die Adresse eines int ist und b die Adresse eines anderen int. Hier unten ist, wo gebe ich C erhält verwirrend. Jetzt verwenden wir einen Stern, aber es hat andere Bedeutung in diesem Zusammenhang. Weil wir nicht erklären Zeigern, wie wir hier sind, hier sind wir Dereferenzierung Dinge. Technisch so, der Stern in diesem Zusammenhang der erste, zweite und dritte Linie Innenseite Swap wird die Dereferenzierungsoperator, die bedeutet nur, dorthin zu gehen. So wie meine Finger folgten den Pfeil h, * Ein Mittel an diese Adresse gehen und mir die int, die es gibt. * B Mittel an die Adresse gehen und gib mir, was da ist. Also lasst uns neu zu zeichnen das Bild von Montag jetzt mit einem Stapel von Bildern, der Boden eine davon sein wird Hauptsache der obere davon wird Swap sein, so dass unsere Welt aussieht, wie Montag, wie diese. Hier ist ein Stück Erinnerung, dass Haupt verwenden wird. Recall von Montag, dass das Programm gerade 2 Variablen, nannte man x und ein als y, und ich hatte Legen Sie die Nummern 1 und 2 gibt. Nun, wenn ich wechseln, wie rufe ich habe am Montag, zuvor, wenn ich die rote Version des Programms verwendet, sieht das wie folgt aus, Ich habe 2 Parameter, a und b, und was haben wir hier und hier schreiben? Nur 1 und 2, wörtlich kopiert von x und y. Heute haben wir das ändern. Heute statt der Übergabe in ints a und b werden wir in 2-Adressen passieren. Diese Adressen geschieht auf ints zeigen, aber diese Adressen werden nicht ints sich. Sie sind Adressen. Es ist wie eine Postanschrift statt. So, jetzt müssen wir nur geben mir ein wenig mehr Details auf dem Bildschirm. Das ist mein Arbeitsspeicher des Computers, wie es war den ganzen Tag. Jetzt brauchen wir eine willkürliche Nummerierung. So lasst uns einfach sagen, nur durch Zufall, dass dieser Speicher-Adresse 123, 124 ist. Lasst uns einfach sagen, das ist 125, das ist 126, und so weiter, aber das ist völlig willkürlich. Wir brauchen nur etwas Numerierung in meiner Erinnerung. So wenn ich jetzt tatsächlich passieren in x-und y, ich werde nicht in x-und y passieren; Ich werde in der Postanschrift passieren, so zu sprechen, von x und y so dass das, was hier und hier gespeichert ist, nicht 1 und 2, aber wenn du mein kleiner Text sehen kann, bekommt, was hier und hier passiert? [Unverständlich Student Response] >> Genau. 123 wird hier und legte 124 wird hier setzen. Nun, da habe ich die Sterne in dieser ersten Zeile Weg bis hier oben, mein Programm weiß nur, dass 123 und 124, obwohl sie offensichtlich sind Zahlen dass jeder Mensch konnte bemerken, sollten sie als Adressen, numerischen Adressen interpretiert werden. Sie sind nicht an und für sich ints, sie sind Adressen, und das ist, weil ich explizit gesetzt haben die Sterne dort. So nun meine erste, zweite und dritte Zeile der eigentliche Code, was passiert hier? Ziehen wir den Rest des Bildes. Tmp ist wie es war am Montag. Nichts Besonderes tmp. Es ist nur eine lokale 32-Bit-Variable, und innerhalb davon bin ich anscheinend Speichern des Wertes * a. Nun, wenn ich gerade gesagt tmp = a, was würde ich hier setzen? >> [Schüler] 123. 123. Aber das ist nicht das, was ich tue. Ich sage tmp = * a. Ein Stern bedeutet, dorthin zu gehen. Also hier ist ein, 123. Wie gehe ich da? So tun, wie es ist ein Pfeil. Nun, da ist es, 1. Also, was wird in tmp gespeichert, offenbar? Nur 1. Also mit anderen Worten, ist tmp * a, * ein Mittel gehen an die Adresse, die derzeit in a, was offenbar 123. Okay, hier sind wir am Standort 123 sind, sehe ich die Nummer 1, so werde ich die Nummer 1 dort abzulegen. Nun, was kann ich in Zeile 2 zu tun, * a = * b? Dieser ist ein wenig komplizierter, denn nun was ist ein? Es ist 123. So * a ist wo? Genau dort, wo ich vorher war. So dorthin gehen. Okay. Jetzt, endlich, und dann schließlich diese beginnt Sinn zu machen, hoffentlich, * B bedeutet, was in b? 124. Also muss ich dorthin gehen, die 2. Also, was stelle ich wo? 2 geht in hier, weil * b geht in * a. Also werde ich das tun. Und schon können Sie sehen, vielleicht, dass wir so viel näher sind zur Lösung dieses dumme, einfache Problem richtig zum ersten Mal denn jetzt haben wir noch eine Erinnerung an das x war, haben wir 2 Kopien, zugegebenermaßen, von y, aber der Linie 3 jetzt sagt * b. Also hier ist b. * B Mittel dorthin zu gehen. Also, wo ist die Lage 124? Es ist offenbar hier. Also, was ich hier setzen? Offensichtlich tmp. So jetzt habe ich dies tun. Also habe ich ein hier und 2 hier. Und nun, was über all dies, die 123, die 124 und die 1? Sobald Swap zurückkehrt, ist dieser Speicher so gut wie verloren denn sobald Swap kehrt das Betriebssystem steht es frei, dass der Speicher wieder verwenden in der Zukunft. Nur Haupt-Speicher im unteren Bereich dieser sogenannten Stack steckt herum. Und so haben wir endlich nun eine funktionierende Version. Lassen Sie mich in swap.c gehen, und beachten Sie die folgenden. An der Spitze des Programms Ich habe mich verändert mein Prototyp zu sein int * a und int * b. So ist die einzige Sache, die ich geändert, um von Rot, was schlecht war, auf grün, was gut ist zu gehen, ist habe ich diese Sterne heute. Aber dann hier unten in Swap selbst. Ich musste kopieren, einfügen, was war nur auf der Folie. Ich habe ein Star hier, Stern -, dass entspricht dem Prototyp - und dann all diese Dinge haben jetzt stars außer tmp weil die Verwendung von einer temporären Variablen, gibt es nichts Neues gibt. Ich brauche nur temporärer Speicher für ein int. So brauchen wir nicht einen Stern gibt. Wir brauchen nur den Stern, so dass wir diese Art von willkürliche Grenze überqueren können zwischen diesen 2 Bildern in meinem Arbeitsspeicher des Computers. Aber eine letzte Sache muss sich ändern, und Sie können es erblickte bereits. Was andere Linie ist offensichtlich jetzt anders? >> [Schüler] & x. Ja, das ist so 25 die letzte Zeile des Codes muss ich für diese Änderung zu arbeiten. Vor einer Woche und sogar am Montag Zeile 25 so aussah, tauschen x und y, Und das war nur gebrochen, weil, wenn Sie sagen, swap (x, y) Sie geben Kopien von x und y zu tauschen, dann tut seine Sache, aber du bist nie wirklich ändern x und y sich. Also selbst wenn Sie noch nie dieses Zeichen vor dem Zeichen im Code gesehen, nur zu erraten. Was bedeutet das kaufmännische tun, offenbar? [Schüler] vertritt die Adresse. >> Vertritt die Adresse. So das kaufmännische sagt mir die Adresse von x. Wer weiß, wo es ist? Es passiert zu 123 sein. Es ist mir egal. Gib mir die Adresse von x. & Y bedeutet mir die Adresse von y. Und an diesem Punkt der Geschichte ist perfekt im Einklang mit dem Bild, das wir zogen vor einem Augenblick. Also ich gebe Hinweise, natürlich für mich, wenn ich anfing zu lernen diese, waren definitiv eines der schwierigsten Dinge, die mir in den Sinn herum wickeln. Aber klar, zumal wir das Spiel mit dieser Art von Dingen zu halten, wenn Sie es brechen, um diesen super einfache Art intellektuell uninteressant Probleme nur bewegen Zahlen um, die Antwort auf eine Menge Verwirrung mit Zeigern wirklich von diesen sehr grundlegenden Mechanik abgeleitet werden. Hier ist eine Adresse. Gehen Sie dort mit dem Stern. Oder umgekehrt, hier ist ein kaufmännisches. Finde heraus, was die Adresse tatsächlich ist. Gut. Also, wo ist all diesen Speicher aus? Wir haben gezogenen dieses Bild ein paar Mal, und ich halte viel versprechende kommen wir wieder dazu, aber hier ist die Darstellung der Arbeitsspeicher Ihres Computers das ist ein wenig mehr als unsere Tafel beschriftet ist hier. Der Text-Segment an der Spitze steht, was in Bezug auf Ihr Programm? [Unverständlich Student Response] >> Sorry? Sage es noch einmal. [Schüler] Das eigentliche Programm. >> Das eigentliche Programm. So ist die 0 und 1, dass Sie nach dem Schreiben C-Code kompiliert und dann ausgeführt Clang und Erzeugung 0s und 1s endet immer dort im Speicher versteckt denn wenn Sie einen Doppelklick auf ein Symbol auf Ihrem Mac oder PC oder führen Sie einen Befehl wie mario auf Ihre Aufforderung, Ihre 0s und 1s von der Festplatte in den Speicher geladen zu werden, so dass der Computer zu manipulieren können und führen sie schneller. So initialisierte Daten und nicht initialisierte Daten werden wir nicht viel über diejenigen, aber das sind nur globale Variablen. Initialisiert bedeutet, globale Variablen, die Sie Werte gab; initialisierte bedeutet, globale Variablen, die Sie noch nicht geben Werte an. Dann gibt es diese Umgebungsvariablen, die ich komplett winken meine Hand werde, aber sie sind da und speichert Dinge wie Ihren Benutzernamen und andere Art von niedrigeren Details. Aber die saftigsten Stücke von Ihrem Gedächtnis-Layout ist dieses Ding namens Stack und der Heap. Der Stapel wieder klar zu sein, ist der Speicher, die verwendet werden, wenn Funktionen aufgerufen werden ist, immer dann, wenn lokale Variablen und wann gibt es Parameter, die herumgereicht. All das geschieht in dem Stapel. Der Haufen haben wir nicht gesprochen, aber nehmen Sie eine Vermutung, die den Heap verwendet. Nur ein anderes Stück der Erinnerung. Es passiert hier oben gezogen werden, aber das ist eine willkürliche bildnerischen Konvention. Wer offenbar mit Speicher aus dem Heap für Woche? Es ist technisch möglich, aber indirekt. >> [Schüler] GetString. GetString und malloc. Also hier ist der grundlegende Unterschied. Sie wissen, in den letzten paar Wochen, wenn Sie Speicher benötigen, nur eine Variable deklarieren. Wenn Sie sehr viel Speicher benötigen, ein Array deklarieren direkt in Ihrer Funktion. Aber das Problem, das wir immer mit Blick habe, ist, wenn Sie Variablen lokal innerhalb von Funktionen, Sobald die Funktion zurückkehrt, was passiert mit dem Speicher und den Variablen? Nur eine Art ist es nicht mehr dir, nicht wahr? Es verschwindet einfach Art konzeptionell. Es ist immer noch physisch da, natürlich, aber es ist nicht mehr Ihr Recht zur Verwendung. Dies ist natürlich problematisch, wenn Sie die Funktionen im Leben schreiben wollen tatsächlich Speicher zuweisen und geben Sie es nicht sofort zurück. Case in point: GetString den Zweck im Leben ist, keine Ahnung im Voraus haben wie groß der String werde ich über die Tastatur einzugeben bin, aber es muss in der Lage sein, Speicher zu reservieren, David oder Hallo zu halten oder eine ganze Abhandlung, dass der Benutzer eingetippt haben So GetString wurde mit malloc. Malloc daher müssen nicht mit den Stapel; Stattdessen ist es mit diesem Ding namens Heap. Es gibt nichts anderes über den Speicher. Es ist nicht schneller oder langsamer oder so etwas. Es ist nur physisch an einem anderen Ort. Aber die Regel ist, dass der Speicher, auf dem Heap zugewiesen ist wird nie von dir weg genommen werden, bis Sie anrufen - take a guess - kostenlos. Im Gegensatz dazu jede Erinnerung fragen Sie für die auf dem Stapel nur ein Array deklarieren oder eine Variable deklarieren, wie wir seit Wochen schon dabei sind, dass standardmäßig landet auf dem Stapel. Und das funktioniert super 90% der Zeit, aber auf diesen selteneren Gelegenheiten wo Sie wollen, Speicher zu reservieren und halten Sie sie herum, dann müssen Sie eine Funktion wie malloc verwenden. Oder wir haben eine Funktion wie GetString, die wiederum verwendet malloc verwendet. Mal sehen, wo dies könnte brechen und dann werfen Sie einen Blick auf Binky. Wir kommen darauf zurück in die Zukunft. Hier ist ein super einfaches Programm, das in den ersten 2 Zeilen macht was? In Englisch, was diese ersten 2 Zeilen Code zu tun Innenseite main? [Unverständlich Studenten Antwort] Vorsichtig. Es gibt mir nicht die Adresse von x oder y. [Schüler] Gibt Zeiger auf ints. >> Gut. Gib mir 2 Zeiger auf Integer. In anderen Worten, gib mir 2 Stücke der Erinnerung, dass ich immer Zeichnung heute obwohl ich gelöscht es jetzt, als Quadrate. Gib mir 2 Stücke der Erinnerung, ein x genannt, bezeichnet ein y - ich früher nannte sie s und t - und was ist der Typ dieses Stück Erinnerung? Es wird um eine Adresse zu speichern. Es ist vom Typ int *. So die Adresse einer int wird schließlich in x leben, die Adresse einer int wird schließlich in y leben, aber zunächst, was drin von x und y? Wer weiß? Garbage Werte. Es hat nichts mit Zeigern zu tun. Wenn wir nicht genommen etwas gibt, wer was ist eigentlich es weiß? Nun x. Was passiert hier? Dies ist legit jetzt, weil x ist ein Zeiger. Es ist ein int *. Das heißt also, ich kann in x gesetzt die Adresse einiger Stück Speicher. Was bedeutet malloc zurückkehren? Perfekt, gibt es Adressen, die Adresse des ersten Bytes in einem ganzen Stück Speicher. Wie viele Bytes wird diese scheinbar Zuteilen beispielsweise in dem Gerät? Was ist in der Größe eines int? 4. Wenn Sie zurück zu Woche 1 denke, es ist nicht super wichtig, immer daran denken, dass aber in diesem Fall ist es nützlich zu wissen, 4 Bytes. So ist dies auf dem Heap 4 Byte Zuteilung und es ist Rücksenden der Adresse des ersten zu mir beliebig. Nun, was ist x zu tun? A * x = 42 ist zu tun, was? Wenn an diesem Punkt in der Geschichte haben wir x, die wie folgt aussieht mit einigen Müll Wert, dies ist nun y mit einigen Müll-Wert, jetzt in Zeile 3 Ich habe 4 Byte zugeordnet. Dieses Bild im wesentlichen wie folgt aussieht. Oder genauer gesagt, wenn dies beliebige Adresse 123, das ist, was unsere Geschichte jetzt aussieht. * X = 42 bedeutet jetzt was? Das bedeutet, rufen Sie die Adresse 123 und beziffern die Zahl 42 gibt. Ich brauche nicht diese Linien zu zeichnen, weil wir nicht tun Saiten. Ich sollte gerade geschrieben haben es so, und nur zur Demonstration willen, 42 als int Art nimmt eine Menge Platz, 4 Byte. Also das ist, was da passiert ist, aber es gibt ein Problem jetzt. * Y = 13. Was wird hier passieren? Das Problem ist, * y in unserem vereinfachten Welt bedeutet nur, rufen Sie die Adresse in y. Was ist in y? Es ist einige Müll Wert. Nehmen wir also an, dass Müll Wert 5551212 ist, etwas Verrücktes so. * Y Mittel gehen 5551212 anzugehen. Das ist wie hier. Es ist nicht vorhanden, zum Beispiel. So * y bekommt 13 bedeutet, dass ich versuche, 13 hier ziehen werde. Es existiert nicht. Ich habe das Segment der Tafel überschritten. Was bekomme ich? Das kryptische Nachricht Segmentation Fault, weil ich versuche, in den Speicher zu ein Wert wie 13 an einem Ort, der nicht existiert. Der Rest des Programms könnte okay, aber bis zu arbeiten bis zu diesem Zeitpunkt nicht. So wollen wir versuchen, diese Geschichte zu erzählen. Wir kommen wieder, um dass, sobald wir über hex gesprochen. Gehen wir zurück auf diese und schließen mit diesem Ding namens Binky, die Rückrufaktion ist ein Stanford-Professor zu Hause sitzen spielen mit claymation, die Geschichte von genau dem gleichen Programm zu erzählen. Es ist nur etwa 3 Minuten lang. Hier haben wir Binky. [Male Lautsprecher video] Hey Binky, aufzuwachen. Es ist Zeit für Zeiger Spaß. [Binky] Was ist das? Erfahren Sie mehr über Zeiger? Oh, goody! [Male speaker] Nun, um loszulegen, ich denke, wir werden ein paar Hinweise benötigen. [Binky] Okay. Dieser Code weist 2 Zeiger, die Zahlen zeigen können. [Male speaker] Okay. Nun, ich sehe die 2 Zeiger, aber sie scheinen nicht zu, etwas zu zeigen. [Binky] Das ist richtig. Zunächst müssen Zeiger auf nichts hinweisen. Die Dinge, die sie zeigen, sind aufgerufen pointees und deren Einrichtung ist ein separater Schritt. [Male speaker] Oh, rechts, rechts. Ich wusste, dass. Die pointees sind getrennt. Er, so wie Sie Zuweisung einer pointee? [Binky] Okay. Dieser Code weist ein neues Integer pointee, und dieser Teil setzt x auf ihn verweisen. [Male speaker] Hey, das sieht besser aus. So machen es etwas zu tun. >> [Binky] Okay. Ich werde Dereferenzierung des Zeigers x die Zahl 42 in seine pointee speichern. Für diesen Trick Ich brauche meinen Zauberstab der Dereferenzierung. [Male speaker] Ihr Zauberstab der Dereferenzierung? Das ist toll. [Binky] Dies ist, was der Code aussieht. Ich werde einfach eingerichtet die Anzahl und ... [Knall] [Male speaker] Hey schau, da geht es. Dabei eine Dereferenzierung von x folgt der Pfeil seine pointee zuzugreifen, in diesem Fall auf 42 in dort zu speichern. Hey, versuchen Sie es, um die Zahl 13 durch die anderen Zeiger, y zu speichern. [Binky] Okay. Ich geh hier zur y und erhalten Sie die Zahl 13 eingerichtet und nehmen Sie dann den Zauberstab der Dereferenzierung und einfach ... [Summton] Whoa! [Male speaker] Oh hey, das hat nicht funktioniert. Sprich, Binky, ich glaube nicht, Dereferenzierung y ist eine gute Idee weil die Einrichtung des pointee ist ein separater Schritt und ich glaube nicht, dass wir jemals getan hat. [Binky] Hmm, guter Punkt. [Male speaker] Yeah. Wir vergeben den Zeiger y aber wir haben nie legen Sie es auf eine pointee zeigen. [Binky] Hmm, sehr aufmerksam. [Male speaker] Hey, du siehst gut dort, Binky. Kann man das lösen, so dass y auf den gleichen pointee als x? >> [Binky] Sure. Ich werde mit meinem Zauberstab der Pointer Zuweisung. [Male speaker] Ist das zu einem Problem wie vorher? [Binky] Nein, berührt dies nicht die pointees. Es ändert nur ein Zeiger auf die gleiche Sache wie ein anderer Punkt. [Knall] [Male speaker] Oh, wie ich sehe. Jetzt y Punkte auf der gleichen Stelle wie x. So warten. Nun y fixiert ist. Es hat eine pointee. So können Sie versuchen, den Zauberstab der Dereferenzierung erneut, um die 13 über zu senden. [Binky] Uh, okay. Hier geht. [Knall] [Male speaker] Hey, schau dir das an. Jetzt Dereferenzierung Werke auf y. Und weil die Zeiger teilen werden, dass ein pointee, beide sehen 13. [Binky] Yeah, Sharing. Wie auch immer. So werden wir Plätze jetzt wechseln? [Male speaker] Oh look, wir sind aus der Zeit. >> [Binky] Aber - [Male speaker] Denken Sie daran, die 3-Zeiger Regeln. Nummer 1 ist die Grundstruktur, dass Sie einen Zeiger haben und es verweist auf eine pointee. Aber der Zeiger und pointee sind getrennt, und die häufiger Fehler ist die Einrichtung eines Zeigers aber zu vergessen, um ihm einen pointee. Number 2, beginnt Zeiger Dereferenzierung am Zeiger und folgt dessen Pfeil über seine pointee zugreifen. Wie wir alle wissen, funktioniert dies nur, wenn es eine pointee, welche Art von zurückkommt, um die Nummer 1 zu regieren. Number 3, nimmt Pointer Zuweisung eines Zeigers und ändert sie zu demselben pointee als weitere Zeiger zeigt. So nach der Abtretung, werden die 2 Zeiger auf denselben pointee zeigen. Manchmal, dass heißt Sharing. Und das ist alles dort ist zu ihm wirklich. Bye-bye jetzt. Dies ist Binky. Dies ist CS50. Wir sehen uns nächste Woche. [Applaus] [CS50.TV]