>> Sprecher 1: Hallo allerseits.
Wir werden, um loszulegen.
Ich glaube, die Leute sind immer noch Filterung in zu sein.
Aber im Interesse der Zeit, so können wir erhalten Sie Jungs von hier auf Zeit,
wir gehen zu starten.
Also willkommen in der CS50 Quiz 0 Bewertung.
Für diejenigen unter Ihnen, die nicht erkannt haben, noch haben Sie eine Frage am Mittwoch.
Woo-Hoo.
>> Wenn Sie noch nicht begonnen haben oder noch studieren haben noch nicht begriffen, dass diese vorhanden ist,
Vergangenheit Quiz und alle Informationen über die Ihr Quiz sind auf cs50.net/quizzes.
Es gibt ein paar ziemlich gute Sachen dort, Vergangenheit Quiz aus der letzten 10
Jahre sowie Informationen über dieses Quiz und Themen
dass abgedeckt werden.
Also lassen Sie uns beginnen.
>> So euch erinnern sich vielleicht daran, die erste Tag der Klasse David hatte diese Lampen auf.
So im Wesentlichen alles, was geht unter der Haube eines Computers
in binärer getan.
Binary bedeutet, was es klingt wie, 0 und 1 ist.
Es hat zwei Werte, dass dargestellt werden kann.
>> So wie in den ersten Tag des § als David machte Licht
Glühbirne auf darstellen, oder 1, unser Computer versteht binär als 0 und
1 ist, ein oder aus.
Grundlagen der Binary.
Jeder Ort vertreten ist in der Basis zwei.
So können Sie 2 bis 0 auf der ADD 1 auf die 2 bis hinauf.
>> Zu berechnen, was Ihre binäre ist, dezimal, folgen Sie einfach dieser Gleichung
Typ Sache.
Wenn Sie eine 1 in einem dieser Orte haben, Sie vermehren sich durch was auch immer
Basis ist es in, fügen Sie es auf, und Sie bekommen die dezimal.
Also das ist, wie man zählt bis 5 in binär.
Genau wie das, was wir tun, auf die letzten Folie, das ist, wie Sie es
1 bis 5 darstellen.
>> Ebenso wie nur Sie hinzufügen können und subtrahieren dezimal oder Basis 10, oder
wirklich keine Basis, auf hinzufügen können und subtrahieren in binär.
Genau das, was man erwarten würde, wenn Sie Fügen Sie die beiden auf, wenn er größer ist gleich
als 1 ist, tragen Sie eine 1 ist, machen es zu einem 0, und tun dem Zusatz, dass Art und Weise, nur
wie Sie mit regelmäßigen erwarten Dezimalzahl oder eine andere Basis.
Cool.
>> So wie ich schon sagte, alles, was geht unter der Haube unseres Computers
in 0-en und 1-en oder binär erfolgt.
So, wie wir zum Ausdruck bringen, zum Beispiel, Buchstaben oder Zahlen oder Zeichen?
Und die Antwort darauf ist ASCII.
>> ASCII ist eine Zuordnung zwischen den Zeichen dass wir in der Regel in der zu sehen
Englisch Sprache wie von A, B, C ist, unterstreichen, Bindestriche und
so etwas.
Und es Karten, die zu einem ASCII-Wert.
Eine ASCII-Wert ist nur eine Zahl, die können von Ihrem Computer zu verstehen.
Und genau wie Sie zusätzlich tun können, und Subtraktion mit Zahlen, die Sie tun können
sie mit ASCII-Werte.
>> So dass in diesem Beispiel, was wird diese ausdrucken?
Ja, so einfach A Raum B Raum C Raum D. Wo hast meine Maus gehen?
Beachten Sie einen int bei 65 zu definieren.
Und wenn Sie, dass mit Hilfe drucken Prozent C, werde es, dass als zu interpretieren
Charakter und druckt A.
>> Ebenso können Sie erklären können es als ein Zeichen.
Und wenn Sie es mit Hilfe Prozent drucken C, es werde das interpretieren, wie
Prozent D. Und wie können Sie eine hinzufügen Nummer, können Sie hinzufügen Zeichen sind
ASCII-Werte in diesem Fall.
>> So ein wenig Zeiger für alle.
5, als String, nicht tatsächlich gleich 5.
Also, wie könnten wir wandeln die String 5 auf die ganze Zahl 5?
Irgendwelche Ideen?
Ja.
>> Also, wenn wir 5 als String, können wir 0 zu subtrahieren.
Und das wird uns geben 5.
Und ähnlich, wenn wir 5 als ein integer, hinzufügen, dass auf den String 0.
Und das gibt uns die Zeichenfolge 5.
Cool.
>> Nun, zurück zu erinnern, wo ein Vortrag sprachen wir über Algorithmen.
Also, wie wollen wir eigentlich einen Computer interessante Dinge zu tun?
Sie wissen, nur Addition und Subtraktion Zahlen und Druck Dinge nicht
so spannend.
In der Regel wollen wir unser Computer an führen eine Art von Algorithmus.
Etwas mehr komplexe als nur einfache Arithmetik.
>> Ein Algorithmus ist nur eine Schritt für Schritt-Set von Anweisungen, wie Sie ausführen
eine bestimmte task--
Genau wie ein Rezept.
Sie könnten der erste Tag des erinnern Klasse, wo David hatte uns zählen ein Zimmer
von Menschen und wie viele Menschen waren im Zimmer.
Sie vielleicht Zählung verwendet werden einen nach dem anderen.
1, 2, 3, 4.
In diesem Fall ist ein linearer Algorithmus.
>> Aber David eingeführt einen Algorithmus für Sie, die Leute im Zimmer angerechnet
wo jeder steht auf, sagen Sie Ihrem Anzahl an eine andere Person, hinzufügen, dass
Anzahl auf, und eine Person setzt sich.
Und Sie das wiederholen.
Das ist eine Art von Algorithmus.
Wir können, wie effizient eine Analyse Algorithmus auf Basis ihrer Laufzeit.
Aber wir werden ein wenig sprechen dazu später mehr.
>> So können auch alle Algorithmen in Pseudocode beschrieben werden.
Pseudocode ist nur eine englische wie Syntax verwendet werden, um darzustellen
Programmiersprache.
Zum Beispiel, wenn man wollte, um einen Benutzer zu fragen Zu meinen Lieblingszahl erraten, wir
haben könnten als solche Pseudocode.
>> Holen Sie sich ein Nutzer zu erraten.
Wenn die Vermutung richtig ist, sagen Sie ihnen, sie korrekt sind, sonst sagen Sie ihnen,
sie sind nicht korrekt.
Und Pseudocode ist ein Weg vorge repräsentieren eine Idee oder einen Algorithmus.
So, jetzt wollen wir vielleicht wirklich schreiben dies in der Sprache, die der Computer
vielleicht Verständnis.
So konnten wir unsere Pseudocode schreiben und interpretieren, dass in den Quellcode.
>> So weit, muss im Quellcode haften zu einer bestimmten Syntax
Programmiersprache.
Und so weit, in CS50, haben wir worden, die meist c.
So könnte dies Quellcode für C liegen.
Später im Verlauf, Sie kommen nachts Kontakt mit anderen Programmier
Sprachen wie PHP.
Oder wenn Sie sogar anderen Klassen, die Sie vielleicht Java, Python oder sogar OCML tun.
Aber in unserer Programmiersprache C, das ist wie wir den Quellcode für schreiben
Der Pseudocode-Algorithmus, dass Ich habe gerade vorher beschrieben.
>> Wie funktioniert Ihr Computer tatsächlich das verstehen?
Wie ich schon sagte, ist es eigentlich nur versteht Nullen und Einsen.
Also wie kann es von der Quelle zu bekommen Code, um etwas, das sein kann,
verstanden?
Nun, wir haben etwas rief ein Compiler.
>> Wenn Sie in den meisten zurück erinnern Ihre pset- eine Art von Programm hatten Sie
in einem Punkt c-Datei geschrieben.
Und dann machen Sie geben würde.
Also, was ist zu machen zu tun?
>> Sie können eingeben, um Ihre kompilieren Programm, weil someone--
wer schrieb Ihre p Satz; wahrscheinlich David--
erstellt ein Makefile.
Und das sagt zu, zu wissen, zu laufen Ihre Compiler, genannt Klappern, das wird
kompilieren den Quellcode zu Objekt Code, der Nullen und Einsen ist,
dass Ihr Computer versteht.
Aber ein wenig später, gehen wir mehr in die Tiefe zu Compiler.
>> So erinnern pSoll 0, where-- ja, Sie haben eine Frage?
>> ZIELGRUPPE: [unverständlich]?
>> Sprecher 1: Ja.
Ich denke, dass sie tatsächlich sollte online sein.
Ja.
>> ZIELGRUPPE: Ist es wie [unverständlich]?
>> Sprecher 1: Es ist nicht.
Die sind auf cs50.net/quizzes.
>> ZIELGRUPPE: Slash Quiz, Schrägstrich 2013 Schrägstrich 0, und nur durch klicken
Quiz Quiz 2013 0, Rezensionsteil gleitet.
>> Sprecher 1: Ja, also, wenn Sie Jungs wollen nach oben ziehen und schauen Sie es auf Ihrem
eigenen Computer, das ist auch in Ordnung.
Sag das noch einmal.
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Ja, [unverständlich] die Dummy-Variable.
Oh, ja?
>> ZIELGRUPPE: [unverständlich]?
>> Sprecher 1: Nein, Streiks sind nicht auf die Prüfung.
Sorry, ihre Frage war, Streiks in der Prüfung.
Und es ist nicht.
So pSoll 0, Jungs sollten alle etwas mit kratz implementiert.
Und wir lernten einige grundlegende Programmier Bausteine ​​mit Kratzer.
>> Werfen wir also einen Blick auf einige dieser Bausteine
dass ein Programm zu machen.
Erste ist Booleschen Ausdruck.
Boolesche Ausdrücke sind Einsen und 0 oder irgend etwas, das hat
zwei mögliche Werte.
In diesem Fall, wahr oder falsch, oder ausschalten, und ja oder nein.
Ein Beispiel für eine einfache, sehr einfach, Programm, das eine Boolesche verwendet
Ausdruck hier oben.
>> Also, um für boolesche Ausdrücke nützlich sein, haben wir Boolesche Operatoren.
Diese Operatoren sind, die verwendet werden können, auf bestimmte Werte zu vergleichen.
So haben wir und oder nicht gleich, kleiner oder gleich, größer oder
gleich und kleiner als oder mehr.
Aber diese Betreiber sind nicht sehr nützlich es sei denn, wir können sie in Kombination
Bedingungen.
>> So euch vielleicht daran erinnern, von Grund auf neu und von Ihrem p setzt, dass wir
hatte Bedingungen.
Sie sind im Wesentlichen wie Gabeln in die Logik Ihres Programms,
führt, je nachdem ob eine Bedingung erfüllt ist.
So eine der Bedingungen, die wir hatten viele Male in diesem Kurs verwendet wird, ist die
wenn sonst, wenn, und sonst Bedingungen.
>> Hier ist ein Beispiel dafür, wie Sie können diese verwenden.
Hat jemand den Unterschied zwischen wissen nur verwenden, wenn alle Aussagen
Weg hinunter Verse if, else, wenn, und sonst kombiniert?
Ja?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Genau.
Also, wenn ich hatte, wenn den ganzen Weg hinunter diese Weg, auch wenn diese Bedingung zurück
wahr, es wird immer noch weiter Testen der nächsten zwei.
Während bei einer else-if, else Rechnung, wenn die, die true zurückgibt,
die anderen werden nicht geprüft.
Haben Sie Fragen dazu?
Cool.
>> So können Sie eine if-else eines anderes zu verwenden Aussage, wenn Sie wissen, dass es nur kann
Seien Sie einer dieser Fälle.
So dass wir, wenn x kleiner als 0 ist, ist es auf jeden Fall nicht zu sein
größer als 0 ist.
>> Als nächstes ein weiterer Baustein dass wir gelernt, sind Schleifen.
Wir haben drei Arten von Schleifen.
For-Schleifen, while-Schleifen, und tun, while-Schleifen.
Und in der Regel, wenn Sie sich hinsetzen, um etwas schreiben, um zu entscheiden, haben Sie
welche der drei, die Sie verwenden möchten.
So, wie wir entscheiden, welche?
>> Wir verwenden in der Regel eine for-Schleife, wenn wir wissen, wie oft wir wollen laufen
durch etwas oder wie oft wollen wir eine Aufgabe zu erfüllen.
Wir verwenden while-Schleifen, wenn wir einige Bedingung, um wahr zu Laufen zu halten zu sein.
Und wir benutzen, während sehr ähnlich Weile, aber wir unseren Code zu ausführen möchten
mindestens einmal.
>> So zu tun, während, was auch immer in der do ist wird immer mindestens ein Mal ausgeführt.
Der Erwägung, dass mit der Zeit, es kann gar nicht laufen, wenn die
Bedingung nicht erfüllt ist.
Haben Sie Fragen dazu?
>> So Struktur einer for-Schleife.
Ihr habt alle gesehen.
Sie initialisieren.
Sie haben eine Art von Zustand.
So zum Beispiel könnten wir initialisieren wie für i gleich 0 ist.
i kleiner als 10 ist.
Und i ++.
Sehr einfach eine, die wir getan haben.
>> Für eine while-Schleife, ähnlich, haben Sie eine Art der Initialisierung haben,
eine Art von Zustand und eine Art Update.
So können wir unsere for-Schleife auch umsetzen als while-Schleife mit diesem.
Und in ähnlicher Weise mit einer do while-Schleife, wir könnten einige Initialisierung haben,
etwas ausführen, aktualisieren Sie es, und dann überprüfen Sie die Bedingung.
>> So, jetzt funktioniert.
Wir haben alles zusammen.
Wir möchten Sie vielleicht einige schreiben Art von Funktion.
Gemeinsame Funktion, die Sie haben bereits gesehen, ist die Haupt.
Haupt eine Funktion ist.
Es hat einen Rückgabetyp int.
Es hat einen Funktionsnamen, Haupt.
Und es hat Argumente argc und argv.
So ist nur eine Hauptfunktion.
>> Andere Funktionen, die Sie verwendet haben, printf-- printf ist eine function--
Getint, toupper.
Aber diese zufällig gewesen sein von uns umgesetzt
eine Art Bibliothek.
Wenn euch daran erinnern, wie Diese CS50.h Bibliothek oder die
Standard-I / O-Bibliothek.
Ja, in Frage zu stellen?
>> ZIELGRUPPE: Ist Haupt nur innewohn c?
Ist es nur eine Art [unverständlich]?
>> Sprecher 1: Die Frage ist, wenn Haupt ist inhärent in c.
Und ja, alle Funktionen eine Hauptfunktion.
Es ist eine Art, die für den Computer zu wissen, wo Sie anfangen
Ausführen des Codes.
>> ZIELGRUPPE: Also würden Sie nicht [unverständlich]?
>> Sprecher 1: Nein.
Noch Fragen?
Cool.
So wie können Sie eine Funktion verwenden das ist für Sie geschrieben, können Sie auch
schreiben Sie Ihre eigene Funktion.
Dies ist eine Funktion, dass jemand geschrieben haben, um die Lautstärke zu berechnen
einer q, zum Beispiel.
Es gibt einen Rückgabetyp hier, in diesem Fall int, unsere Funktionsnamen q und unsere
Liste der Parameter.
>> Und beachten Sie, dass Sie die Daten zu schreiben Typ der Parameter, den Sie möchten
verwenden oder aber die Funktion nicht wissen, welche Art von
Parameter sollte ich akzeptieren.
So, in diesem Fall soll eine ganze Zahl als unsere Eingabe.
Warum also könnten wir wollen Funktionen nutzen?
>> Zunächst einmal, toll für Organisation.
Sie helfen brechen Sie den Code in mehr organisiert Stücke und machen
es leichter zu lesen.
Vereinfachung.
Das ist gut für das Design.
Wenn Sie lesen, ein Stück Code sind und die Hauptfunktion ist wirklich,
wirklich lange, es schwieriger sein könnte Grund über das, was vor sich geht.
Also, wenn Sie es nach unten in Funktionen zu brechen, es leichter zu lesen sein könnte.
Und wiederverwenden-Fähigkeit.
Wenn Sie ein Stück Code, dass Befinden genannt, oder führen Sie mehrmals,
statt umgeschrieben, die Code 10-mal Ihre Hauptfunktion, könnte man
möchte es wiederverwenden.
Und dann jedes Mal, dass Sie verwenden müssen Stück Code, rufen Sie die Funktion.
>> So, jetzt, wenn wir wieder zu kratzen erinnern, Wir sprachen auch über ein paar Konzepte,
von denen eine Gewinde.
Gewinde ist das Konzept der Mehrfach Codesequenzen
Ausführen gleichzeitig.
Also denken Sie zurück an Tag eins, wo David hatte euch zählen von der Anzahl der
Personen im Raum.
>> Wesentlichen, was los war auf alles von euch waren
laufen separate Threads.
Und diese Themen wurden zusammen kommen , eine Art von Antwort zu bekommen.
Auch in Scratch, wenn Sie mehrere Sprites, können Sie
haben eine Katze und einen Hund.
Und sie würden gleichzeitig sein den Betrieb ihrer eigenen Skripten.
Das ist ein Beispiel von Gewinden.
>> Und das andere Konzept, das war Kratz eingeführt war Veranstaltungen.
Und Ereignisse sind, wenn mehrere Teile Ihr Code miteinander kommunizieren.
In Scratch, das war, als Sie verwendet die Broadcast-Steuerung und das, wenn ich
Empfangsbausteine.
>> Und auch in Problem-Set 4, sahen wir ein bisschen von Veranstaltungen.
Ihr Jungs könnten verwendet haben die Gevent Bibliothek.
Und es gab eine Funktion waitForClick in dem Sie warteten
für den Benutzer zu klicken.
Und Sie hier klicken, wird in diesem Fall wäre die Veranstaltung und warten Klick ist Ihr
Event-Handler.
>> Und auch im gesamten Betrieb Ihrer psets und die Arbeit an Ihrem pset- Sie
könnte in Kontakt kam einige dieser Befehle.
Das ist, was Sie in Ihrem getippt Terminal-Fenster oder was auch immer Fenster
Das zeigt sich auf der g Bearbeitung auf, Wesentlichen, navigieren Sie Ihren Computer.
>> So zum Beispiel, LS listet die Inhalt eines Verzeichnisses.
Machen Verzeichnis ein neuer Ordner erstellt.
CD, Verzeichnis wechseln.
RM, zu entfernen, löscht eine Datei oder ein Verzeichnis.
Und entfernen Sie dann Verzeichnis Entfernt ein Verzeichnis.
>> ZIELGRUPPE: [unverständlich]?
>> Sprecher 1: Ja, sicher.
Sorry, war die Frage, ob Sie würde vorschlagen, setzen diese
auf dem Spickzettel.
Es könnte helfen.
Wenn Sie Platz haben, können Sie es anziehen.
Es ist auch nur in der Regel gut genug sich daran zu erinnern, weil, wenn Sie es verwenden,
möchten Sie vielleicht nur haben es gemerkt.
Das wird Ihnen das Leben viel einfacher.
Habe ich Ihre Frage beantworten?
>> So, jetzt sprachen wir ein wenig kurz über Bibliotheken.
Aber die beiden wichtigsten sind, die wir schon seit Verwendung bisher im Zuge sind
Standard-I / O und CS50.
Welche Dinge sind im Lieferumfang enthalten in der Standard-I / O-Bibliothek?
>> Ja, so weit wir printf benutzt habe.
In CS50, haben wir getint verwendet und GetString.
Und der Datentyp String geschieht auch in diesem CS50-Bibliothek deklariert werden.
Wir werden ein wenig mehr in die Tiefe zu sprechen wie Bibliotheken arbeiten und wie sie
Interaktion mit dem Rest des Codes.
Aber das sind die zwei wichtigsten sind, dass wir in Kontakt mit so weit kommen
der Kurs.
>> Typen.
Diese sind gut zu merken, wie viel Jeder Typ wird durch oder wie dargestellt
viele Bytes jeweils vom Typ requires--
int, 4 Byte; char, 1 Byte.
Schwimmer ist 4 Bytes.
Was ist ein Doppel?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Ja, so ein Schwimmer aber doppelt so groß.
Was lange?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: OK.
Was ist eine lange?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Ja, ein int verdoppeln.
Ja.
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Long [unverständlich].
Und dann eine lange, lange ist doppelt so.
>> ZIELGRUPPE: Nein, nein.
Eine lange ist nur ein int.
Es hängt von der Architektur bevor die [unverständlich]
int und haben die gleiche Größe.
[Unverständlich].
>> Sprecher 1: So eine lange und int gleich sind.
Und dann eine lange, lange ist das Doppelte der Int.
Cool.
Und dann, was ist der letzte Typ?
>> ZIELGRUPPE: Zeiger.
>> Sprecher 1: Ja, so haben wir gelernt, ein wenig über Zeiger.
Und unabhängig davon, was ein Zeiger ist Hinweis zu-- es könnte ein Zeichen sein Stern
oder ein int star--
es ist immer 4 Byte für einen Zeiger.
Fragen dazu?
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> Sprecher 1: So ein langer und ein int sind das gleiche in diesem CS50-Appliance.
>> ZIELGRUPPE: Das Gerät komplett austauschbar.
>> Sprecher 1: Ja.
So dann ist ein langer, langer Doppel ein int.
>> ZIELGRUPPE: Das ist die 32-Bit?
>> Sprecher 1: 32-Bit, ja.
>> ZIELGRUPPE: Also [unverständlich]?
>> Sprecher 1: Ja, wenn es nicht ausdrücklich sagen, du
sollte eine 32-Bit übernehmen.
>> ZIELGRUPPE: Es wäre etwas zu sagen wie unter der Annahme einer
Architektur, wie das Gerät.
Für 64-Bit, die einzigen Dinge, Änderung sind sehnt und Zeiger.
Beide [unverständlich].
>> Sprecher 1: Ja?
>> ZIELGRUPPE: Frage.
Also auf einer der Praxis Quiz, es fragt nach einem unsigned int.
Also, wie wäre das bestimmt werden von einem int [unverständlich]?
>> Sprecher 1: Ein unsigned ist auch in 4 Bytes.
Aber was ist anders an einem signierten int und ein unsigned int?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Richtig.
Man kann negative Werte darstellen.
Aber wie macht es das?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Ja, es spart 1 Bit, um das Zeichen zu repräsentieren.
Die unterzeichnete hat ein Bit, das stellt das Vorzeichen.
Und unsigned ist einfach aller Positiv.
>> ZIELGRUPPE: OK.
Also sagen Sie, dass ein Doppel ist doppelt so groß wie ein Schwimmer?
>> Sprecher 1: Doppel doppelt die Größe eines Schwimmers, ja.
>> ZIELGRUPPE: Wie funktioniert ein Zeiger eine lange, lange [unverständlich]?
>> Sprecher 1: Die Frage ist also, wie funktioniert der Zeiger auf eine lange long--
wie ist das nur vier Bytes ein langer, langer seinen 8 Bytes.
Also denken Sie daran, was ein Zeiger ist, Wesentlichen an der Basis Wert.
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Ja, so ein Zeiger ist nur ein Speicher.
So ist es nicht egal, wie viel Platz dass Zeiger verweist.
Es braucht nur 4 Byte den Überblick zu behalten von dieser Speicherstelle.
Noch Fragen?
Cool.
>> So das letzte, was ich habe ist die Standardausgabe.
Sie sollten sie häufig verwenden genug, dass Sie sich erinnern können.
Aber das ist, wenn wir printf beispiels.
Und wir haben diese Platzhalter, die wurden Format-Codes bezeichnet.
>> Also Prozent c char, i Prozent für int, und wir können auch d Prozent.
Es ist die gleiche Sache.
Aber im allgemeinen in CS50 wir versuchen Prozent die ich benutze.
Prozent f für float.
Ld Prozent für lange, lange und Prozent s für String.
>> Ebenso Wir haben mit ein paar dieser Escape-Sequenzen.
Zum Beispiel Backslash n für neue Zeile.
Dies ist nur für, wenn Sie die Formatierung sind Code für Print f.
Ja?
>> ZIELGRUPPE: Was ist für d Prozent?
>> Sprecher 1: So ist die Frage Ist das, was d Prozent für?
Prozent D ist für Ganzzahlen.
D Prozent Prozent und i gleich sind.
>> ZIELGRUPPE: Was ist der Unterschied zwischen Backslash Backslash n und r?
>> Sprecher 1: Die Frage ist also, was ist der Unterschied zwischen Spiel und n
spiel r?
Ich denke, Backslash r ist--
>> ZIELGRUPPE: Also Backslash r nur impliziert, kehrt zu dem Anfang der Zeile,
ohne tatsächlich zu einer neuen Zeile.
Also, wenn Sie einen Backslash r und Sie drucken zurück zum Anfang der Zeile
dann mehr Material zu drucken, die Sie überschreiben das Zeug, das ist bereits auf
[Unverständlich].
Wohingegen, n geht tatsächlich auf eine neue Linie und geht zu [unverständlich].
>> Sprecher 1: Nun, alle anderen Fragen?
In Ordnung.
Ich werde es die Hand von Dan, fortsetzen wird.
>> [Applaus]
>> DAN: Alle righty.
Also werde ich über eine andere breit reden Reihe von Ideen aus der Klasse, die sind
etwa Vertreter der Woche zwei und der Beginn der Woche drei Anfahren
mit Gießen, die nur ein Weg ist Behandeln Wert eines bestimmten Typs als
ein Wert von einem anderen Typ.
So können wir dies mit Zeichen zu tun ints, Schwimmern zu ints und
lange sehnt sich zu verdoppeln.
>> All diese Dinge können als Arten verwendet werden der Behandlung einiger numerischer Wert
minus char wie einige andere numerischen Wert.
So gibt es einige Probleme mit diesem, von Natürlich, die, wenn Sie werfen kommt
Dinge wie Schwimmer ints.
Also das ist ein bisschen komisch.
Wir haben einen Schwimmer, der 1,31 ist.
Wir multiplizieren sie mit 10.000.
Und dann haben wir es zu drucken als int.
Was bedeutet diese Ausgabe?
10.000 mal 1.31.
Also 13.000, das ist die Vermutung?
>> ZIELGRUPPE: Ich denke, es ist 10.000.
>> DAN: Also ich bin Multiplikation mit 10.000 bevor ich Gießen.
>> ZIELGRUPPE: Oh.
Würde dort nicht eine 9 sein und einige Zahlen 0?
>> DAN: Möglicherweise müssen einige seltsame Ziffern.
So richtig, es ist 1,3 mal 10.000.
Also das ist 13.000.
Und diese zusätzliche weird--
>> ZIELGRUPPE: 13.100.
>> DAN: 13.100.
Danke, Rob.
Und diese zusätzliche weirdness--
Diese 9,9--
ist einfach, weil dieses Casting endete Abrundung wo
es sollte nicht.
Ja.
>> ZIELGRUPPE: Das Casting passiert nach noch etwas?
>> DAN: Also, da ich diese im Druck, es bedeutet diese Multiplikation, bevor es
funktioniert das Casting.
>> ZIELGRUPPE: [unverständlich].
>> DAN: Ich denke, es würde zuerst gegossen, ja, die 10.000 wären.
Noch etwas?
Cool.
Also das ist 13.099.
Warum geschieht das?
Ungenauigkeit.
>> Schwimmer sind nicht perfekt.
Sie können nur Zahlen, um einen Betreiber bestimmte Anzahl von signifikanten Stellen.
Also, wenn wir uns auf auszudrucken 8 sig Feigen Diese Schwimmer, eine Art erhalten wir
hässlich suchen Nummer.
Und das ist, weil nicht genau 1.31 durch einfache dargestellt werden
Potenzen von zwei in der Maschine.
Also es endet unter dem nächsten raten, die bis Ende
ein wenig niedrig.
Sinnvoll?
Ok.
>> Nun schaltet sich eine andere Art der Dabei bedingte Anweisungen, wo alle
wir kümmern uns um eine einzelne Variable.
Also in diesem speziellen Beispiel, sind wir immer eine ganze Zahl von dem Benutzer.
Und dann sind wir bei der Suche was das ganze Zahl ist.
Vermutlich ist es die Nummer zwischen einem und vier.
Das ist, was wir für die Nachfrage.
>> So können Sie einen Schalter zu tun der Name variabel.
Dann können Sie sich Fälle von möglichen gesetzt Werte es sein könnte.
Also, falls einer, sagen, es ist niedrig.
Und dann brechen, um aus der Schaltzustand so
Sie nicht halten werde.
>> Im nächsten case--
so bei zwei und bei three--
wenn es bei beiden es gerade sinkt auf die erste Zeile Code sieht es als mit
Fall Drei bis es eine Pause sieht.
Also der Grund, warum Sie bei eins zu bekommen, um nur Druck niedrig ist, weil ich
haben diese Pause hier.
Wenn ich, sagen wir, ignorierte diese break-- wenn ich warf diese breakaway--
es wäre zu drucken niedrig, und dann wäre es Drucken Mitte, und dann ist es brechen würde.
>> Also Pausen sind ein wichtiger Bestandteil der Schaltzustände und
sollten sie da sein.
Etwaige Fälle, die nicht explizit angegeben werden werden durch die Standard gehandhabt
Fall in den Schalter und sollte gegossen werden.
>> ZIELGRUPPE: Also 1, 2, 3, und 4 würde n sein?
>> DAN: Werte, n kann.
Ja.
Ja?
>> ZIELGRUPPE: Also, wenn Sie , dass [unverständlich]?
>> DAN: Sie würde zu drucken niedrig, und dann es wäre Mitte zu drucken, und
dann wäre es zu brechen.
>> ZIELGRUPPE: Warum würde es drucken Mitte, wenn [unverständlich]?
>> DAN: Also alles unter einem Fall Vor der Pause fällt unter.
So ein Fall ist unter Druck bei eine als dies ist folgenden Druck.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Also diese Zahl ist nur eine bestimmte Wert, dass diese Variable
nehmen können, oder?
Heißt das Sinn?
Ja.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ja, bei beiden würden drucken Mitte und dann brechen.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ich denke, jeder?
Welche anderen Datentypen können Sie umschalten?
>> ZIELGRUPPE: Sie können wechseln über alle Datentypen.
Aber es bedeutet nur etwas mehr als Zeichen und ints und solche Sachen, weil
wenn Sie über einen Zeiger sind Schalt das nicht wirklich sinnvoll,
Umschalten Lasten, wenn es auch lassen Sie das tun, weil der Floating-Point-
in Präzision, würden Sie nicht wirklich wollen das sowieso tun.
So ziemlich viel, nur ints und Zeichen und solche Sachen.
>> DAN: Ja, ist es, wenn Sie explizite Werte, die Sie kennen, glaube ich, kann
dass ein Schalter ist eigentlich nützlich.
Gut?
Ok.
>> Scope ist der Bereich, der ein erklärter Variable erstreckt.
Also in diesem kleinen Stück Code ich habe, wäre es voller Fehler.
Und der Grund ist, dass ich diese int deklariert i innerhalb des Umfangs dieser for-Schleife.
Und dann versuche ich, Referenz, die i außerhalb der for-Schleife, dass Umfang.
>> Also im Grunde kann man über Umfang denken wie alles, was Sie erklären
mit in einem Satz von geschweiften Klammern nur existiert innerhalb dieser geschweiften Klammern.
Und wenn Sie versuchen, diese Variable außerhalb dieser geschweiften Klammern, werden Sie
erhalte eine Fehlermeldung des Compilers.
Ja?
>> ZIELGRUPPE: Also das man nicht arbeiten?
>> DAN: Das funktioniert nicht, ja.
Saiten.
String ein char *.
Sie sind genau die gleichen.
Sie sind nur Zeiger auf Zeichen.
Und alle Zeichenfolgen, die Sie haben sollten am Ende mit Backslash Null, das nur
a c Konvention.
>> Man nennt sie die NULL-Terminator.
Und NULL--
Hauptstadt N, U Kapital, Kapital L, Hauptstadt L--
ist nicht die gleiche wie die NULL-Terminator.
Dies ist ein Zeiger.
Dies ist ein Zeichen.
Sie sind sehr verschieden.
Daran erinnern.
Es wird auf der Quiz wahrscheinlich.
Ich habe nicht das Quiz gesehen.
Ja?
>> ZIELGRUPPE: Also NULL ist, sagen wir, der Zeiger?
>> DAN: Ja.
>> ZIELGRUPPE: Was bedeutet [unverständlich]?
>> DAN: Wenn, sagen wir, malloc wird aufgerufen, wenn Sie nicht genug Speicher, um zu bekommen
was auch immer Größe Sie fragen, malloc NULL zurück.
Es ist grundsätzlich immer dann, wenn eine Funktion soll einen Zeiger zurück, Sie
müssen gegen NULL, da überprüfen NULL ist ein ziemlich good--
es ist, eine Art, die Müll-Wert.
Es ist ein Null-Zeiger so weit wie zu gehen.
>> Immer, wenn Sie eine Funktion aufrufen, dass gibt einen Zeiger.
Sie gehen, um zu prüfen sein zu wollen sicher, dass der Zeiger nicht NULL
weil NULL ist sehr verbreitet.
Es ist eine Art von Müll Rückkehr.
Also, wenn etwas nicht richtig zu gehen, nur NULL zurück statt.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ja, und das ist diese.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Formulieren Sie es wie dieses.
Es ist der NULL-Terminator.
Es ist Klein N-U-L-L, wenn Sie buchstabieren es.
>> ZIELGRUPPE: Und ich ging einfach zurück und getestet.
Und wenn Sie versuchen, eine Floating-Point setzen Wert in einen Schalter, wird es auf Sie schreien
sagen, Aussage erfordert Ausdruck von Integer-Typ.
>> DAN: Dort gehen Sie.
Aber ja, was war die Frage noch mal?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Also Hauptstadt N, U Kapital, Kapital L, L ist die Hauptstadt eine tatsächliche c Sache.
Es ist der NULL-Zeiger und wird nur als solche behandelt werden.
Sie werden nicht immer versuchen, die Rechtschreib NULL-Zeichen und sehen jede
anders als diese.
Ja?
>> ZIELGRUPPE: Also Rückkehr zu verkohlen oder max etwas in den Anmerkungen, wäre es
verkörpern die gleiche Funktion als [unverständlich]?
>> ZIELGRUPPE: So beziehen Sie sich Rückkehr char max von getchar oder
was auch immer es ist?
>> ZIELGRUPPE: Ja.
>> ZIELGRUPPE: Ja, so die allgemeine Begriff für all die Dinge,
sind Sentinel-Werte.
So wie eine Rückkehr int max von getint und char max von getchar, ist es
soll wie, alles in Ordnung zu sein, wenn diese Dinge sind zu uns zurück,
etwas schief gelaufen.
>> Für Zeiger, wir haben nur zufällig Diese Wächter Wert, dass jeder
stimmt auf.
Und das ist das, was Sie zurück wenn etwas schief geht.
So char max ist, was wir mit etwas darstellen
wie NULL oder getchar.
>> ZIELGRUPPE: Also, wenn Sie die Prüfung getchar bist, könnten Sie einfach NULL setzen?
Würde das einen Unterschied machen?
>> DAN: Sie konnte nicht einfach mal NULL.
Sie müssten char max weil das überprüfen Rückgabewert der Funktion ist
ein Zeichen, das nicht ein Zeiger.
Ja?
>> Zielgruppe: Dieser Frage geht dahin, für die String-Länge.
Nicht, dass die NULL-Zeichen enthalten?
>> DAN: Nein
Und das ist tatsächlich, wie String-Länge weiß, zu stoppen, weil es durch geht
Ihr Array von Zeichen, bis es sieht ein NULL-Zeichen.
Und dann ist es wie alle Gut, ich bin fertig.
>> ZIELGRUPPE: [unverständlich] fünf?
>> DAN: Hallo würde fünf sein.
Yep.
So Arrays sind kontinuierliche Speicherblöcke.
Sie haben sofortigen Zugriff mit den Worten der Name des Arrays und dann in geschweiften
Hosenträger, was auch immer Index, den Sie gehen wollen auf, sind sie von Null indiziert durch
die Länge der Anordnung minus 1 ist.
>> Und sie sind durch die Art der das erklärte Sache, die Sie in die Speicherung sind
Array, der Name des Feldes, und Unabhängig von der Größe ist dieses Arrays.
Das ist also ein char-Array der Länge sechs, die diese Werte enthält.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ja.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Wenn Sie, was los ist in das Array schon gemacht.
So könnte man diese stattdessen angeben, wie sagen wir, char, was auch immer der Name des
Array ist, leere Klammern gleich lockig Klammer H Komma Komma E L L Komma Komma
O Komma NULL-Zeichen und geschweifte Klammer.
Das wäre auch eine Erklärung zu arbeiten.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Dann müssen Sie haben die Größe schon gemacht.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ja.
Alle righty.
Befehlszeilenargumente sind eine Möglichkeit, Eingaben aus dem Benutzer als
Argumente zur Haupt.
Haupt zwei Argumente.
Die Anzahl der Argumente, die sein wird entlang der Befehlszeile und eine bestandene
String-Vektor oder ein String-Array aller Argumente.
>> Wenn ich also etwa bezeichnet eine Funktion wie ein Punkt aus 1 Raum, 2 Raum, drei,
argc würde 4 sein.
Und die argv 0 würde ein Punkt aus sein.
Argv1 wäre 1.
argv2 wäre 2. argv3 wäre 3, in diesem speziellen Fall.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Das letzte Element im Array da das Array Länge argc Plus
einer der ARGB, das letzte Element ist der NULL-Zeiger.
Es ist argc plus 1.
Also in dem Fall, dass ich gesagt habe, es ist einfach 0 würde argv ist ein Punkt heraus.
argv 1 ist 1. argv2 ist 2. argv 3 3.
argv 4, die eine größere ist als arge wäre NULL.
>> Und das ist der NULL-Zeiger.
Ja.
Und das ist, weil String ist ein char Stern ist ein Zeiger.
So hat es die gleiche Art sein.
Ja?
>> ZIELGRUPPE: Zwei Fragen.
So dass man, was ist der Unterschied zwischen Diese und andere GetString als eine Art
in der Benutzer Motor?
Und zwei, wird gespeichert in Ihre letzten Speicher?
So wie, würde GetString sein [unverständlich]?
>> DAN: Wo ist es gespeichert?
Ich weiß nicht, wo sie gespeichert sind.
>> ZIELGRUPPE: Also, eigentlich, wissen Sie, wie jede Funktion, die Sie nennen es Argumente
im Stapel gespeichert?
So argc und argv sind Argumente, die Haupt und sie sind auf dem Stack, oder wirklich
nur über das, was Sie denken, wie der Start des Stapels.
Was war der andere Teil der Frage?
>> ZIELGRUPPE: Also, was ist die [unverständlich]?
>> DAN: Ja, es ist nur eine andere Art und Weise Erhalten von Eingaben durch den Benutzer.
Etwas effizienter und das hier ist es ist handlicher für Skripte, weil Sie
kann nur Argumente an Ihrem Haupt Funktion, anstatt zu warten,
für die Nutzer, wenn Sie nicht alle Benutzer.
>> ZIELGRUPPE: Und ja, bekommen Saiten wäre [unverständlich].
Es würde die Dinge, die Sie brauchen, zu speichern.
>> DAN: Ja?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ja, argv 0 enthält immer die Punkt Schrägstrich des Funktionsaufrufs.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ja, jedes der Argumente in NULL-Zeichen beendet, weil sie
Strings sind.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ja, das ist argv argc ein NULL-Zeiger.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Oh ja.
Ja, sorry.
>> ZIELGRUPPE: Also [unverständlich]?
>> DAN: Die Frage ist also, wenn Sie hatte die Befehlszeile Punkt Schrägstrich einen Punkt aus 1, 2,
Würde die Anzahl der Befehlszeile Argumente zwei sein, oder würde es drei sein?
>> ZIELGRUPPE: Ich denke, es funktioniert nicht wirklich wichtig sind.
Ich neige dazu zu sagen, oh, haben Sie sich nicht über Alle Befehlszeilenargumente, wenn
Offensichtlich ist die Funktion aufgerufen Sie.
Also ich neige dazu, stimmlich nicht auch die Funktion von der Kommandozeile
Argumente, auch wenn es in argv enthalten.
>> DAN: Aber wenn es auf der test--
yeah-- und auch, wenn Sie etwas zu sagen wie argc gleich 3 ist,
Sie sind in sicheren Stand.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ich denke, wenn statt der Aufruf dieser in arge und argv String Klammern
aber immer die gleichen Typen und gerade angerufen ihnen etwas anderes wie ein
und b, wäre es immer noch funktionieren?
Und es würde immer noch funktionieren, Sie würde just--
anstatt argc-- Sie würde a und b.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Also die Frage ist, ist GetString gehen in den Speicher im Heap speichern
weil GetString ist char *.
Es speichert Speicher im Heap, weil es ruft nun malloc im eigentlichen
Umsetzung der GetString.
OK, bewegen auf.
>> Sicherheit.
So wirklich sicher zu sein, auf keinen verlassen Sie ein und Sie niemand Zugang zu einem erlauben
Ihre Informationen, weshalb jeder baut ihren eigenen Maschinen,
ihre eigenen Betriebssysteme, die alle ihre Programme von Grund auf neu, und natürlich
zu keinen anderen Computern zu verbinden über das Internet.
Computer sind so unsicher.
Sie sind wirklich.
Wir haben mit anderen Menschen zu vertrauen.
>> Und die Idee der Sicherheit ist, dass Sie versucht, die Menge zu begrenzen
Vertrauen, das Sie brauchen.
Und eines der Mittel, die Sie tun ist durch Kryptographie.
Kryptographie ist im Wesentlichen wir haben Geheimnisse.
>> Manchmal müssen wir unsere Geheimnisse weitergeben entlang durch, sagen wir, das Internet oder
andere Dinge.
Und wir wollen die Leute nicht , diese Geheimnisse zu kennen.
So verschlüsseln wir unsere Geheimnisse in einer Weise, dass wir hoffen, dass niemand herausfinden.
>> So dass wir used--
im Verlauf dieser class--
Dinge wie Caesar-Chiffre und [Unverständlich], die beide sehr, sehr sind
unsicher Möglichkeiten der Verschlüsselung Dinge.
Sie sind einfach, herauszufinden, was sie sind und was Ihre Geheimnisse sind.
Die reale Welt wird wesentlich mehr komplizierte Verschlüsselungsverfahren.
Und wir werden nicht in zu erhalten viel mehr.
>> Debugging.
GDB ist die beste.
Ich werde das noch einmal betonen.
Verwenden GDB die ganze Zeit jeden Zeit haben Sie ein Problem.
Befehle, die in GDB nützlich sind, sind brechen, die Sie entweder eine Linie übergeben
Nummer, der Name einer Funktion, im Wesentlichen wo in Ihrem Code, den Sie beenden möchten,
und in der Lage, die Kontrolle zu nehmen.
>> Drucken erfolgt eine variable und druckt Was auch immer das ist, dass variable
Punkt in Ihrer Ausführung.
Weiter geht Ihre Ausführung entlang einem Schritt.
Und Schritt Schritte innerhalb einer Funktion in Ihrer Ausführung.
>> Andere Dinge werden laufen, das ist, wie Sie tatsächlich ausführen Ihrem Code.
Weiter nimmt alle erforderlichen Schritte , um zum nächsten Haltepunkt zu bekommen.
Und es gibt viele, viele andere.
Schauen sie auf.
Sie sind großartig.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ja, das ist ein Debugger.
So ein Debugger ist ein Programm, können Sie Ihr Programm debuggen.
Es ist nicht ein Programm, das für Bugs findet Sie, aber das wäre toll.
>> Und zuletzt ist für mich suchen.
So dass die Arten der Suche, die wir gesprochen etwa in dieser Klasse sind lineare Suche,
die nur ist, dass man durch jede aussehen Element des Suchraums, eines
Element in einer Zeit, bis Sie finden, was Sie für oder bis Sie suchen
das Ende Ihrer Suchraum, an dem Punkt, den Sie sagen, dass Sie nicht finden konnte,
das Element, das Sie gesucht haben.
Und das dauert im besten konstante Zeit, was 0 von 1 und im schlimmsten Fall linear
Zeit, die 0 für n ist.
>> Binäre Suche, die braucht schmutzige Elemente.
Sie gehen auf die Mitte des Elemente, sehen, ob das Element, das Sie suchen
größer oder kleiner ist als das Element Sie befinden sich auf der Mitte.
Es es ist größer, sagen Sie, dass der Boden Ihre Suchraum ist Ihr
aktuelle Position, die Mitte, und Sie den Prozess neu zu starten.
Wenn es kleiner, schauen Sie sagen, dass the-- ja, was ist los?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ja.
Jede Art von Art, die in beigebracht worden ist die Klasse ist Freiwild für den Test.
>> [Gelächter]
>> DAN: Und die Tatsache, dass Sie nicht gehabt haben um es für ein Problem-Set besitzen, es ist fair
Spiel für den Test.
>> ZIELGRUPPE: Können wir über sie gehen, wie zu--
>> DAN: Es wird übergegangen werden.
>> Sprecher 2: Die eigentliche Code für [Unverständlich] ist auf study.cs50.net.
Also, wenn Sie an der Praxis Problem zu suchen in der Merge-Sort-Seite
study.cs50.net besteht die Code für die Umsetzung Mergesort.
So müssen Sie nicht zu realisieren es sich heute Abend.
Aber stellen Sie sicher, dass Sie es nicht verstehen, als nur auswendig zu lernen.
>> ZIELGRUPPE: [unverständlich]?
>> Sprecher 2: Die Merge-Sort Seite auf study.cs50.net gibt es eine Praxis,
Problem, dass, wenn Sie durch den Klick Problem, am Ende befindet sich eine
Lösung, die die Zusammenführung ist Art Umsetzung.
Aber stellen Sie sicher, dass Sie es verstehen, und nicht nur auswendig zu lernen
oder kopieren Sie es auf.
>> ZIELGRUPPE: Und ein vollkommen gültig Problem für die Prüfung wäre
so etwas wie hier ist eine Liste.
Was bedeutet diese Liste wie nach aussehen einen Schritt der Auswahl Art oder
Insertion Sort oder was auch immer.
Eine volle Iteration der Liste.
Also selbst wenn Sie nicht am Ende brauchen, um Code für sie, um es zu verstehen müssen Sie
genug, zu wissen, wie es geht zu werden, die Änderung dieser Array.
>> DAN: Das ist es für mich.
>> [Applaus]
>> LUCAS: Hey alle.
Mein Name ist Lucas.
Ich werde über Rekursion sprechen, die alle die Sorten, die wir gelernt haben, und eine
wenig von allen Zeigern.
OK?
Also zunächst einmal, Rekursion.
Was bedeutet es, zu sagen, dass eine Funktion ist rekursiv?
>> ZIELGRUPPE: nennt sich.
>> LUCAS: OK, nennt sich selbst, ja.
So wie auf diesem Bild, zum Beispiel.
Es ist wie das Bild in von einem Bild und so weiter.
So zum Beispiel, können Sie als Dan have-- , was über binäre Such sprechen.
Ein Weg, in dem binäre Suche ist rekursive ist die Tatsache, dass Sie
versuchen, eine Zahl zu finden.
So können Sie gehen bis in die Mitte.
Und dann, wenn die Zahlen dort überprüfen Sie in der linken und in der rechten Seite.
>> Und dann, wenn Sie herausfinden, die Anzahl ist werde auf der linken Seite, ist es das gleiche
etwas wie tut die Suche erneut, aber nur auf der linken Seite der Liste.
Also das ist, wie es klingt wie es ist rekursiv.
Also das ist, warum Sie Jungs haben rekursive Lösung für Merge-Sort.
>> OK, also hier ist ein Beispiel.
Also sagen wir mal, dass ich wählen alle Zahlen von 1 bis n ist.
Ich merke, dass die Summe der n Zahl n plus n minus 1 bis 1.
Aber dann, wenn ich mir n minus 1 plus n minus 2 plus 1, das ist der gleiche
etwas wie Summieren Zahlen bis zu N minus 1 ist.
So kann ich die Summe von einer gleichen Summe sagen gleich n und die Summe von n minus 1 ist.
Heißt das Sinn?
>> Und ich würde auch etwas anderes haben genannt Basisfall, was das ist
die Summe der Zahlen bis Null Null.
Also, sobald ich auf die Anzahl zu bekommen Null, höre ich auf zu zählen.
Heißt das Sinn?
>> Also hier ist ein Beispiel, wie Ich kann umsetzen, dass.
So habe ich diese Funktion in einigen.
Das dauert eine ganze Zahl n.
Also hier bin erst prüfen, ob n weniger oder gleich Null.
So dass, wenn es weniger oder gleich Null ist, I Null zurück, was unsere Basisfall ist.
Ansonsten kann ich nur zurückgeben n plus die Summe der Zahlen von
ein bis n minus eins.
Sinnvoll?
Ok.
>> Also hier ist, wie es aussieht.
Sie haben Summe von 2 Gleichen 2 plus der Summe der 1.
Und einige von 1 1 plus die Summe der 0, die 0 ist.
Sinnvoll?
Also, wenn wir uns die Stapel von Ihrem Programm, das ist, wie es aussieht.
>> Erstens haben wir die Hauptfunktion.
Und dann die Hauptfunktion genannt Summe 2.
Und dann die Summe 2 wird sagen, oh, Summe 2 ist gleich 2 und die Summe von eins.
Also ich Summe von 1 hinzufügen, um den Stapel.
Und die Summe von 1 wird zu Summe nennen 0, die auch die hinzugefügt werden
auf den Stapel.
Und dann jede dieser sind diejenigen, die auf dem anderen haben, um zurückzukehren
vor die anderen können weitermachen.
>> So zum Beispiel, hier Summe von 0, Zunächst wird auf 0 zurück.
Und wählen Sie dann Summe von 1.
Dann Summe von 1 zu gehen zurück 1 bis 2 zu summieren.
Und schließlich Summe von 2 wird , um zum Haupt zurück 3.
Heißt das Sinn?
>> Es ist wirklich wichtig zu verstehen, wie der Stapel arbeiten und versuchen,
sehen, ob es Sinn macht.
OK, so Sortierung.
Also, warum ist die Sortierung wichtig, zunächst?
Warum sollten wir uns kümmern?
Anyone?
Geben Sie mir ein Beispiel nennen?
Ja?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Ja, OK.
So können Sie effizienter zu suchen.
Das ist ein guter Weg.
So, zum Beispiel, haben wir eine Menge von Dinge, eigentlich in unserem Leben,
geordnet sind.
Zum Beispiel, Wörterbücher.
>> Es ist sehr wichtig, alle haben Wörter in einer bestimmten Reihenfolge, dass wir
leicht zugänglich machen können.
Also das ist, was er sagte.
Sie können effizienter zu suchen.
Überlegen Sie, wie schwer es sein würde, um eine haben Wörterbuch, in dem die Wörter in
zufälliger Reihenfolge.
Sie haben, zu betrachten, so ziemlich, jedes einzelne Wort, bis Sie die
Wort, das Sie suchen.
>> Wenn Sie Facebook sind auch, wenn Sie Ihre Freunde suchen, sind Sie
gehen, um zu sehen, dass Facebook setzen Sie Ihre näher Freund ist auf der Oberseite die, die
dass Sie nicht zu, dass reden nicht viel.
Wenn Sie den ganzen Weg gehen, um den Boden des Ihr Freund Liste, wirst du sehen,
Menschen, die Sie wahrscheinlich noch nicht einmal erinnern, dass Sie Freunde mit sind.
Und das ist, weil Facebook sortiert Ihre Freunde auf, wie
schließen Sie sie sind.
>> Also, Daten zu organisieren.
Auch Pokemon.
Sie sehen also, dass alle Pokemons haben Nummern.
Und das ist, wie eine einfache Weg zum Zugreifen auf Daten.
>> ZIELGRUPPE: Zugriff auf Pokemon.
>> LUCAS: Ja.
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Yep.
OK, also Auswahl sortieren.
Auswahl Art wird sich die Auswahl kleinste Wert einer unsortierten Liste jedes
Zeit in jeder Iteration.
Es ist eine Art wie die Art, die Sie tun in Ihrem Kopf, wenn Sie versuchen,
Sortieren einer Liste auf der Hand.
>> Im Grunde ist alles, was Sie tun, Sie schauen für die kleinste Zahl.
Sie es in der sortierten Liste.
Und dann haben Sie für den Look nächste kleinste Zahl.
Und dann haben Sie weiterhin tun, daß und so weiter.
>> Also Auswahl Art ist im Grunde Sie Wählen Sie jedes Mal das kleinste
unsortierten Wert.
Gesetzt am Ende der sortierten Teil der Liste.
Und halten tun.
Also lassen Sie schnell sehen, was das sieht aus wie.
Also hier ist die sortiert und unsortierte Liste.
>> Also für die sortierte Liste von, es ist zunächst leer.
Und dann werde ich das wählen kleinste Zahl hier, die 2 ist.
So bekomme ich die Nummer 2 und ich in der Vorderseite der Liste.
Und dann habe ich für die nächstkleinere aussehen Element, das 3 ist.
Also habe ich es am Ende der sortierten Liste.
Und dann halte ich das tun.
Ich finde, 4 und legte es am Ende.
Finden Sie 5 und legte es am Ende.
>> Und, wie alle diese mal schauen, dass Ich sage, legte sie am Ende ist,
im Grunde, das Wechseln von zwei Werten.
OK?
Und dann die letzte, die Sie gerade haben ein weiteres Element.
So ist es bereits sortiert.
>> OK, so insertion sort.
Insertion Sort wirst du auch bist das Ding der mit einer sortiert und
eine unsortierte Liste.
Die einzige Sache ist, dass jedes Mal, dass Sie sind ein Element hinzufügt, um die sortierten
Liste, die Sie gerade das Element holen, dass ist vor der unsortierten Liste.
Und dann wirst du was finden sind Position sollte es in der sortiert werden
Teil der Liste.
>> Mal sehen, was das so ist das macht mehr Sinn.
Also zunächst, zum Beispiel, ich versuche , um die Nummer drei in der INSERT
sortierten Teil der Liste.
So dass die Liste nicht alles.
So kann ich einfach die Zahl 3 ist.
>> Nun, ich möchte, um die Zahl 5 hinzufügen das sortierte Teil der Liste.
Also schaue ich mir die Nummer 5.
Ich merke, dass es mehr als 3 ist.
Also ich weiß, dass es nach 3 sein.
Also habe ich 3 und 5.
>> Dann möchte ich die Nummer 2 ein.
Ich merke, dass die Nummer 2 ist eigentlich dauern dann sowohl 3 und 5.
So habe ich eigentlich, um es alle setzen Weise am Anfang der Liste.
So habe ich, der Art der, verschieben alle Elemente in der sortierten Liste, so kann ich
Platz machen für die Nummer 2 ist.
>> Dann sehe ich die Nummer 6.
Ich sehe, dass es nach 5 sein.
Also habe ich es dort.
Und schließlich, schaue ich mir die Nummer 4.
Und ich merke, es sollte zwischen 3 und 5 liegt.
Und dann habe ich es dort und Verschiebung alle anderen Elemente.
Sinnvoll?
>> Bubble Sort.
So Bubble-Sort ist im Grunde das, was du bist werde do-- wir nennen es Blase
Art, weil Sie durch die list-- gehen es ist eigentlich besser, wenn ich nur zeigen,
Sie möchten this--
und du wirst vergleichen sind benachbarte Zahlen.
Und du wirst zu tauschen sind ihre Positionen, wenn sie nicht
in der richtigen Reihenfolge.
>> Also im Grunde ist das, was zu gehen geschehen wird, ist hier beispielsweise,
Sie haben 8 und 6.
Sie wissen, dass die Sortierreihenfolge wird tatsächlich 6 und 5, oder?
So wirst du, um die Aufträge zu tauschen.
Dann sehe ich, 8 und 4 hier.
Und ich das gleiche tun.
Ich tauschen wieder.
Und schließlich, 2 und 8.
Ich tauschen sie auch.
>> Es heißt Bubble Sort, weil nach jeder dieser Iterationen eigentlich
die größte Zahl in der Liste bekommt alle die bis zum Ende der Liste.
Heißt das Sinn?
Weil es hält tauschen sie und bewegt ihn nach rechts.
>> OK, das ist so die zweite Iteration.
Es wäre dasselbe sein.
Ich werde eine Swap tun und dann wird die letzte.
Ich, dass es keine Swaps und die Liste wird sortiert.
So in Bubble Sort, halten wir im Grunde gehen Sie durch die Liste und tauschen
Dinge, bis ich merke, dass ich es nicht getan swaps tun, dass die Iteration, die
bedeutet, dass Liste bereits sortiert ist.
Sinnvoll?
>> Reden wir ein wenig über Laufzeit.
So seid ihr so ​​erinnern Big O, Omega, Theta und?
Ja?
OK, was ist Big O, erste von allen?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Ja, es ist ein Worst-Case genannt Laufzeit, das bedeutet nur, dass es
wie viel Sie erwarten, dass die Programm nehmen zu laufen.
Wie, in Bezug von--
in diesem case-- n.
Die Anzahl der Elemente in der Liste im schlimmsten Fall.
Wie im schlimmsten Fall möglich.
>> Also für Bubble Sort, zum Beispiel, Wir haben große O von N Square.
Warum haben wir das?
Warum ist Bubble Sort Big O N Square?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Ja, so der schlimmste Fall sein wird dass ich muss n Iterationen zu tun.
Also jeder der Iterationen zu gehen bis zum Ende zu bringen das größte Element
auf der Liste.
So der schlimmste Fall ist, dass ich das Ding n-mal zu tun.
Und für jede dieser Zeiten, ich muss n-Swaps zu tun, weil ich zum Vergleich
jeweils zwei Elementen.
Also das ist, warum es n Quadrat denn es ist n mal n.
>> Dann ist auch n quadratische Auswahl sortieren Denn für jede Iteration, ich
Blick auf jedes einzelne Element in der Liste.
Und dann finden die kleinste, was bedeutet, dass ich
Blick durch n Elemente.
Und ich muss da nicht, dass n-mal Ich muss alle n Elemente auswählen.
>> Eine Insertion Sort ist auch N Square weil im schlimmsten Fall wird
sein, eine, muss ich einfügen n Zahlen, oder?
Also ich weiß schon, dass ich werde n Iterationen.
Aber für jede dieser Zahlen, wenn ich auf alle Zahlen in aussehen
Die sortierte Liste und legen Sie sie den ganzen Weg im vorderen, wird diese n quadratisch
denn es wird n mal n wieder.
Sinnvoll?
Was ist mit Omega?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Es ist das beste Szenario.
So ist es wie in einer Menge Zeit für Sortierung, die besten Fall ist
wenn die Liste bereits sortiert.
So müssen Sie nicht wirklich nichts zu tun.
Bubble Sort hat die beste Fall von n ist.
Haben Sie Jungs wissen, warum?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Ja, wenn Sie im Auge behalten ob Daten Ration hatte keine Swaps oder
nicht, wenn Sie etwas haben, wie zu setzen dann, wenn es eine Iteration, wenn der
Liste bereits sortiert, im Grunde, Was passieren wird ist, dass ich zu gehen
versuchen, jede zwei tauschen benachbarten Elementen.
Ich werde sehen, dass es gibt keine Swaps.
Und ich sofort zurück.
>> Also es bedeutet, dass ich musste einfach gehen Sie durch die Liste einmal.
So ist es, weil ich mir n bei n Elementen.
Warum Auswahl Art N Square?
>> Ja, auch wenn die Liste sortiert, für jeder Iteration der Auswahl Art, ich
haben, um die minimale Element auszuwählen.
Das heißt also, dass ich, um zu suchen bei allen Elementen in der unsortierten
Liste und finden Sie die Mindest für jede Iteration.
Heißt das Sinn?
>> Und das Einsetzen Schwert n, weil in der Fall, dass ich versuche, um den Einsatz
Nummern und alle Zahlen, wenn ich versuchen, sie zu legen, sehe ich, dass sie
in der richtigen Position.
Ich habe nicht zu gehen überprüfen Sie alle anderen Zahlen in der unsortierten Liste.
Also das ist, warum es n sein.
Sinnvoll?
Und was ist Theta?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Was, sorry?
Sag es noch einmal.
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Genau.
Sie können, so dass nur die Auswahl zu sehen in Merge gespeichert Art haben thgr.
Und das ist, weil Sie nur Theta- wenn sowohl Big O und Omega sind die gleichen.
Ok.
Und schließlich verschmelzen sortieren ist in der log n.
>> Und dann, als Dan sagte, Merge sort ist eine Art, wie die gleiche Weise,
Sie binäre Suche zu tun.
So erhalten Sie die Liste.
Und du wirst in der Hälfte.
Und dann haben Sie sie schneiden in kleineren Hälften.
Und dann hast du ihnen zu verschmelzen.
Euch daran erinnern, dass, nicht wahr?
OK, wie er sagte.
>> OK, Zeiger.
Also, was ist ein Zeiger?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Eine Adresse.
Ok.
Ich weiß, dass David zeigt eine Reihe von Videos von Binky und Dinge zeigen
gegenseitig.
Aber Ich mag denken, von Zeigern als nur eine Adresse.
So ist es eine Variable, die gehen , um eine Adresse zu speichern.
>> So ist es gerade diese spezielle Variable dass vier Bytes lang.
Denken Sie daran, dass Zeiger auf alles ist immer vier Byte lange auf unser 32-Bit-
Maschine so der Fall das Gerät.
Und es hat nur die Lage einer Variable darin.
>> OK, also gibt es diese Erinnerung, im Grunde.
So dass jeder Speicherblock tatsächlich eine Label, das die Adresse der ist
Slotty Speicher.
Das heißt also, dass ich kann ein Zeiger auf
jeder dieser Adressen.
Also der Grund, warum wir Zeiger verwenden ist wenn ich den Ort erinnern
dass eine bestimmte Variable ist ein Speicher.
>> Und euch daran erinnern, dass einer von denen Fällen war, wenn ich eine Funktion
wenn ich wirklich wollen, dass Sie Swap für Reals, habe ich eigentlich
haben, um einen Zeiger zu senden.
Nicht die Variable.
Denkt ihr daran?
Der Unterschied between--
was ist der Name?
Aufruf per Wert und Berufung Bezug, oder?
>> OK, ja.
So rufen nach Wert.
Wenn Sie senden Sie einfach eine Variable auf Sie funktionieren nur das Senden eines Wertes.
Sie sind also eigentlich Senden eine Kopie der Variablen.
Und Ihr Programm wurscht etwa wenn die gleiche Variable tatsächlich
eine Kopie.
>> Und fordern von Referenz bedeutet, dass Ich bin eigentlich die Übermittlung einer Kopie der
Zeiger auf diese Variable.
Also es bedeutet, dass ich schicke die Position dieser Variablen.
So spüre ich, haben die Position des Variable, wenn ich rufe die Funktion
mit Zeigern, ich bin in der Lage, tatsächlich ändern Sie die Daten, die in Haupt war.
Sinnvoll?
>> Obwohl, ist der Zeiger um eine Kopie, die Zeiger noch die reale Adresse
die Variable, die ich ändern möchten.
Sinnvoll?
>> So Erstellung Zeiger.
Denken Sie daran, den Zeiger immer der Typ, der es zeigt
und dann zu einem Stern.
Und dann steckt man den Namen.
Also denken Sie daran, dass, wenn Sie was auch immer Sterne, es ist wie ein Zeiger auf
dass das, was variable Typ, den Sie hatten.
>> Also hier in Stern, zum Beispiel, ist es einen Zeiger und eine ganze Zahl ist.
Und dann char Stern ist ein Zeiger char Sterne und so weiter.
Ja?
>> ZIELGRUPPE: Was, wenn wir eine Zeiger auf n zu Stern x.
Ich weiß, dass schafft einen Zeiger auf x.
Ist es auch x eine ganze Zahl zu erklären?
>> LUCAS: OK, also, wenn Sie sagen, n-Sterne-x, du bist nicht die Schaffung eines Zeigers auf ein
Variable x.
Sie erstellen einen Zeiger namens x.
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Also wenn ich sage, n-Sterne-x, ich bin sagen, hey, in Erinnerung, ich bin zu gehen
erhalten Sie eine dieser drei Boxen.
Und ich werde sagen, dass die wird zu x ist, das ist
wird ein Zeiger sein.
Und etwas Interessantes über Zeiger ist, dass wir sagen, dass sie
4 Bytes für einen 32-Bit-Maschine.
Und der Grund dafür ist, dass 4 Bytes sind 32-Bit.
>> Und Maschinen, die 64 Bit eigentlich Zeiger haben Adressen
die 64 Bits lang sind.
So ist es nur, dass die Größe der Adressen in der Maschine unterschiedlich ist.
>> So Referenzierung und Dereferenzierung.
Es gibt zwei Operatoren, die Sie sollten daran denken, Jungs.
Die erste ist, Ampersand.
Die zweite ist Stern.
Verwirrt nicht von diesem Stern und diese Star, weil daran erinnern, dass in
diesem Fall müssen Sie n Stern.
>> Es ist wie eine ganze Ding zusammen.
Es gibt keine n Space Star.
So bedeutet es, dass es die Art.
Denken Sie daran, dass, wenn Sie Der veränderliche Stern, du bist
Gespräch über den Typ.
>> Wenn Sie nur Sterne und dann die haben Name der Variablen ist, bedeutet dies, dass
Sie Dereferenzierung des Zeigers, sind die bedeutet, dass Sie bei der suchen
Zeiger, der Suche nach der Adresse, es ist zeigt auf, gehen an diese Adresse,
und Blick auf, wenn Sie haben es.
So sage ich meinen Studenten, dass, wenn Sie Sterne, sollten Sie denken, dass es
die Abkürzung Gehalt.
>> Also, wenn Sie einen Zeiger haben, und Sie Sterne tun Zeiger, es ist die
Inhalt des Zeigers.
So dass Sie, was auch immer es ist zu zeigen gehen und Blick auf die konstanten Gehalt.
Und das kaufmännische ist die gleiche etwas wie Adresse.
>> Also wenn ich eine Variable a-- wie, lassen Sie uns sagen, dass ich ein int gleich 3--
wenn ich will, um die Adresse zu finden, dass Variable eine Erinnerung, kann ich nur tun,
Ampersand ein.
Also ist es eine Adresse.
Sinnvoll?
>> Also hier ist ein Beispiel.
Diese fehlt int b und int c.
So int a = 3 bedeutet, dass Ich werde in den Speicher zu gehen.
Und ich werde einen Slot finden und setzen die Zahl 3 hier.
>> Und dann int b = 4.
Ich werde das gleiche tun.
Zum Speicher und legte eine Reihe 4 in einer der Boxen.
Und int gleich 5.
Finden Sie eine andere Box und legte eine Reihe 5.
>> Also, was ist diese Zeile aus tun? n-Sterne-pa entspricht Ampersand ein.
Also zunächst einmal, n-Sterne-pa.
Was tut sie?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Ja, so n-Sterne-pa, zuerst, deklariert einen Zeiger namens pa.
Und dann ist es die Zuordnung der Wert der dass Zeiger auf die Adresse einer sein.
So ein Ampersand.
Dann, wenn ich Sterne pb, Was ist ein Stern pb?
>> Oh, sorry.
Dies wird auch fehlen. n-Sterne-pb.
Ich meine Sterne-PC.
Es tut mir leid.
Es ist die gleiche Sache.
Aber jetzt bin ich gut ar Schaffung eines Zeigers zu b und dann einen Zeiger auf c.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Ja.
Also, wenn Sie den Speicher gehen und Sie gehen die Box, die Bezeichner ist für pa,
Sie tatsächlich zu sehen eine Adresse ein.
OK?
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Ja, ist Zeiger eine Adresse.
Vergessen Sie nie, dass.
Es ist wie die wichtigsten Teil über Zeiger.
Es ist die Speicherung und Adresse bis zu einem gewissen variabel.
Noch etwas?
Noch Fragen?
Ok.
>> So Zeiger und Arrays.
Denken Sie daran, dass, wenn ich int Array 3, Im Grunde, was ich tue, ist, ich bin, Art
von und erklärte in einem Zeiger.
So Array ist ein bisschen wie ein Zeiger auf eine bestimmten Ort in Erinnerung, in der ich
für ganze Zahlen zugeordnet drei Slots.
Heißt das Sinn?
>> Also, wenn ich int Array 3, was ich bin Dabei Grundsätzlich schafft drei
Schlitze im Speicher.
Also habe ich nur drei Steckplätze finden im Speicher.
Also, wenn ich das tue, dann ein Star Array, es im Grunde bedeutet, den Inhalt des Array,
das heißt, ich löschen den Zeiger, ich gehe an diesen Ort, dass es auf den Hinweis,
und ich habe die Nummer eins.
>> Und dann, wenn ich Sterne Array plus 1, das ist das gleiche wie zu tun Array
Klammern ein, das bedeutet nur, ich gehe zu der Ort, den es zu zeigen.
Und dann die plus 1 Marken mich um eine Position.
Also gehe ich in diese Position, eigentlich, und legte die Nummer zwei.
>> Und dann, endlich, wenn ich Array plus 2, gehe ich dorthin, wo
Zeige Arrays an.
Und dann habe ich auf die Speicherblöcke zu bewegen.
Und dann habe ich die Nummer drei hier.
Ja?
>> ZIELGRUPPE: Also Sterne-Array ist einfach sagen, die erste Stelle.
Und Sie können 1, nur weil hinzuzufügen, Wir sind nur dann wirklich
verweisen, dass die erste Adresse.
>> LUCAS: Ja.
Warum haben wir zum Beispiel sagen, Array 0, Array 1 und Array 2?
Ich sage, warum Sie tun, 0, 1, 2, 3 anstelle von 1, 2, 3?
Einer der Gründe ist, ein Computer Programmierer lieber starten
Zählen von 0.
Beiden ist, denn wenn man Array 0 tun, es ist das gleiche wie zu tun Array
plus 0, was bedeutet, ich gehe zu , dass die Position, und ich nicht
überspringen alle Speicherblöcke.
Also ich habe keine Speicherblöcke zu bewegen.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Also ist sie zu fragen, was ist der Unterschied zwischen tun
dieser oder tun malloc.
Einer der Unterschiede ist, dass int Array 3 ist die Schaffung eines
Array auf dem Stapel.
Und wenn ich malloc tun, schafft auf dem Heap.
Heißt das Sinn?
>> Und wie funktioniert malloc eigentlich?
Warum also brauchen wir auch, um malloc verwenden?
Ihr Compiler Art von Figuren aus allen die Variablen, die Sie deklariert.
Und er schafft Raum für alle von ihnen in den Stapel.
So dass alle Ihre Variablen gehen irgendwo in dem Stapel sein.
So, hier ist die Umgebungsvariablen.
>> Also im Grunde, Raum für diese Variablen in Erinnerung an zuge
Kompilierung.
So bedeutet es, dass Ihr Computer all diese Variablen kennen
vorher.
Es braucht nicht zu wissen, welchen Wert Sie gehen in sie setzen.
Aber es muss wissen, wie viel Speicher Sie benötigen.
>> Aber jetzt lassen Sie uns sagen, dass zum Beispiel, Sie erstellen ein Array sind oder sich ein
Zeichenfolge, die Sie einnehmen von dem Benutzer.
Wie Sie wissen nicht, lange die Zeichenfolge sein wird, zum Beispiel.
So dass Sie nicht genau wissen, wie viele Speicherblöcke verteilen Sie, oder?
>> So dass es nicht wirklich Sinn für Sie sagen legte 100 Zeichen.
Und was dann, wenn der Benutzer schreibt 150?
Du wirst aufgeschraubt werden.
>> Also im Grunde, können Sie nicht sicher sein, wie viel Speicher Sie zuweisen müssen
wenn Sie das Programm kompilieren.
Sie weiß nur, dass auf die Laufzeit.
Also das ist, warum Sie die Haufen zu haben.
So der Haufen wird auf den Speicher haben die Sie während der Zuweisung sind
Dauer der Programmlauf.
>> Also im Grunde, wenn Sie malloc tun, was Sie tun, ist Speicher bei Zuteilung sind
Laufzeit, was bedeutet, dass Sie Entscheidung in diesem Moment, dass Sie
sollte, dass der Speicher.
Also das ist, wenn Sie es Zuweisung.
Heißt das Sinn?
>> Also denken Sie daran, der Stapel Variablen , die auf der Kompilierung erstellt.
Und dann hat der Heap-Variablen , die erstellt werden, wie Sie gehen
mit malloc, zum Beispiel.
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Also ist GetString werde malloc rufen.
Lassen Sie mich über malloc zu sprechen, und Ich werde GetString erklären.
So malloc dasselbe ist als Speicherzuweisung.
Also, es wird vergeben Speicher auf dem Heap.
Und es geht um einen Zeiger auf Rückkehr wo die Erinnerung wurde zugeordnet.
>> Also, wenn Sie do--
hier für example--
n-Sterne-Zeiger.
Und dann gleich Zeiger malloc Größe der Zoll mal 10.
Ich erstelle einen Zeiger.
Und dann bin ich, dass die Zuordnung Zeiger auf der Wert des Zeigers, die malloc
mir gibt.
>> Also ich frage malloc können Sie zuweisen Platz für 10 Ganzzahlen.
Das ist, was es sagt.
Und malloc gibt mir wieder ein Zeiger auf diesen Platz.
Sinnvoll?
Ok.
Ich Und GetString wird, im Grunde tut ein Aufruf von malloc, so dass Sie zuordnen können
Speicher während der Laufzeit.
>> Denken Sie daran, für null überprüfen weil malloc wird zu null zurück
wenn es keinen Speicher zuweisen.
Lassen Sie uns sagen, dass Sie für einen lächerlichen fragen Speichermenge.
Ihr Computer ist nicht sein der Lage, viel zuweisen, dass.
>> So malloc nur geht auf null zurück.
Also immer daran denken, wenn das Kontroll Zeiger, die Sie von malloc habe ist
null oder nicht, weil, wenn es ist, könnten Sie werden Dereferenzierung eines Zeigers und
dass Nebenfehler.
Und schließlich, nicht zu vergessen Ihre freien Speicher.
>> Malloc schafft Speicher im Heap.
Und Sie den Speicher frei haben bevor das Programm beendet.
OK, das ist alles für mich.
Sorry, Rob.
Danke.
>> [Applaus]
>> LUCAS: Irgendwelche letzten Fragen vor Rob kommt?
Nein?
Ja?
>> ZIELGRUPPE: Ich habe nicht gesehen dieses online.
Haben Sie es hochgeladen?
>> LUCAS: Ich denke, Dave ist bald hochzuladen.
>> Dave: Es wird bekannt gegeben.
>> LUCAS: Es wird online sein.
>> ZIELGRUPPE: Es ist oben.
>> LUCAS: Es ist oben?
Ok.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Ja, können Sie kostenlos alle sollten die Speicher, der in der Halde gelegt wird.
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Ja.
Jedes Mal, wenn eine Kultur malloc haben, Sie sollten eine Kultur frei haben
nach dem Gebrauchs diese Variable.
So malloc und free sind immer zusammen.
Ihre besten Freunde.
Ja.
Rob?
>> ROB: Ich werde schnell gehen.
Und auch das Video wird aufgestellt werden.
Ich habe das Mikro an.
>> OK, so Woche fünf Sachen.
Das erste, was wir haben, ist der Stapel.
Also denken Sie daran, dass es nur einen Stapel Bild pro aktiven Funktionsaufruf.
Wir werden das in einer zweiten zu sehen.
Und auch daran erinnern, was wirklich geht in jeder Stapelrahmen sein werden
die lokalen Variablen der Funktionen, die Argumente, die übergeben werden, in unserem
Funktionen, zusammen mit ein paar andere Dinge, die Sie nicht wirklich
sich Sorgen machen müssen.
>> Also hier ist ein Beispiel-Programm, wo, Bekanntmachung Haupt wird printfing die Rückkehr
Wert von foo 4.
foo wird nur gehen, um die Rückkehr Wert von 6 bar 4 Komma.
Und die Bar wird einige lokale eingestellt Variable n gleich 4 mal 6.
Und dann n zurück.
>> Lassen Sie uns also einen Blick auf die Stapel in ganz die eigentliche Iteration des Programms.
So gibt es die Unterseite unserer Stack.
Denken Sie daran, dass der Stapel wächst.
So an der Unterseite unserer Stapel, wir haben einen Stapelrahmen für Haupt.
Wenn das Programm startet, Haupt wird immer bei der sein
Unterseite unserer Stack.
>> Und was ist im Inneren unserer Stapelrahmen für Haupt?
Also auch wenn es keine lokalen Variablen, die Hauptsache, wie ich schon sagte,
wir haben arge und RGV nehmen Platz Innenseite der Hauptstapelrahmen.
Also Haupt geht jetzt um rufen Sie die Funktion foo.
Und das bedeutet, foo ist los bekommen ihren eigenen Stack-Frame.
>> So, jetzt haben wir innerhalb von sind die Funktion foo.
Und was muss gehen Stapelrahmen foo?
Nun, foo ein Argument n.
Und n gleich 4 ist da, dass ist das, was Haupt wird als Argument foo vorbei.
>> So, jetzt foo wird sich Bar an.
Was ist bar werde innen haben ihrer "Stack-Frame?
Es hat gleich 4 x y gleich sechs.
Das ist nicht alles, die wir gehen zu müssen, in der Stapelrahmen, weil bar
hat auch eine lokale Variable n.
Und n wir gehen gleich 24 gesetzt.
>> So, jetzt Bar wird zu n zurück.
So bar zurückkehrt 24 bis die Stapelrahmen foo.
Und weil Leiste wird nun wieder, dass bedeutet, dass wir knallen die Stapelrahmen
für bar von dem Stapel.
Also alle die Erinnerung, dass Bar gewesen mit ist jetzt vom Stapel.
>> Nun wird sich auch foo , um zum Haupt zurück 24.
So, jetzt, dass foo Rückkehr, die Speicher dass foo wurde mit seiner "
Stapelrahmen ist auch weg.
Und nun, Haupt wird sich printf nennen.
So ist nur ein weiterer printf-Funktion.
Wenn wir rufen printf, es geht um sein ein weiterer Stapelrahmen für die printf
Funktionsaufruf.
>> Was passieren wir printf?
Das ist was los zu gehen auf der Stapelrahmen.
Zumindest, wir vorbei dass i Prozent Schrägstrich-n und
Das Argument 24.
Es könnte mehr haben, es ist in Stapelrahmen wenn printf passiert zu sein, mit einigen
lokalen Variablen.
Wir wissen es nicht.
>> Aber all das geht in die printf Stapelrahmen.
Es wird die printf auszuführen.
Dann printf getan hat.
Es kommt wieder.
Schließlich Haupt ist getan.
Haupt zurückkehren wird.
Und dann unser Programm durchgeführt wird.
Ja?
>> ZIELGRUPPE: Sind Sie sehen [unverständlich]
Argumente [unverständlich]
Parameter?
>> ROB: So gibt es einen feinen Unterschied zwischen Argumenten und Parametern.
Und wirklich, gemeinsam sprechen, neigen die Menschen nur mischen sie sich die ganze Zeit.
Aber Parameter sind die formalen Namen der Dinge.
>> So argc und argv sind die Parameter zur Haupt.
Argumente sind, was Sie wirklich Pass in wie diese Parameter.
So gibt es, wenn ich rufe foo von 4, 4 ist das Argument, ich bin im Vorbeigehen.
Und der Parameter n, der Innen foo, nimmt den Wert 4
seit 4 war das Argument.
>> ZIELGRUPPE: [unverständlich]?
>> ROB: n ist eine lokale Variable zu sperren.
n ist immer noch lokal auf foo, aber es ist ein Parameter auf foo.
Es ist nicht eine lokale Variable.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: foo ist nur anrufen und Bar Rückkehr unabhängig bar zurück.
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Ja, nur um zu sehen, mehrere Stack-Frames.
Ja?
>> ZIELGRUPPE: Warum wurde foo genannt vor printf?
>> ROB: Warum wurde foo vor printf genannt?
So habe ich könnte stattdessen etwas getan wie int x gleich foo von 4
und dann gedruckt x.
Sondern kombinierte ich die Funktion rufen in die printf Argument.
>> Aber beachten Sie, dass wir nicht wirklich den Anruf an, bis wir printf ausführen
herauszufinden, was foo von 4 ist.
So werden wir diese bewerten.
Und nur einmal das erledigt gehen wieder zu kommen und zu bewerten diese.
Ja?
>> ZIELGRUPPE: Da sowohl bar [unverständlich]
Wert ist, warum haben wir nicht [unverständlich]?
>> ROB: Sie sollten vollständig int sein.
Das war nicht mehr als gefangen mehreren Durchgängen.
So sollte es int Bar und int foo da beide von denen
kehren Zahlen.
Leere ist nur, wenn sie nicht gehen Istwerte zurückliefern.
Ja?
>> ZIELGRUPPE: Wenn Sie eine Linie hatte oben die Rückkehr, [unverständlich]?
>> ROB: Eine Zeile über der Rendite?
>> ZIELGRUPPE: Ja.
Wie, wenn Sie tat printf und [unverständlich], würde es zweimal drucken?
>> ROB: Also innerhalb von foo?
Wenn wir eine printf hier richtig?
>> ZIELGRUPPE: Ja.
>> ROB: Also, wenn wir eine printf Recht hatte hier wäre es einmal zu drucken.
Da wir foo einmal richtig fordern hier, dann werden wir die printf getroffen.
Dann werden wir bar nennen.
Und dann wird foo zurück.
Und das ist es.
Wir haben nur je begegnen printf einmal.
Ja?
>> ZIELGRUPPE: [unverständlich]
printf Aufruf foo, weil wir zuerst Aufruf printf und dann sind wir vorbei
die Argumente.
>> ROB: Also in der Theorie, ist nicht printf Aufruf foo?
Also nein.
Nur die Reihenfolge, in c ist los führen diese Dinge ist, bevor wir
eine Funktion aufrufen, alle Argumente an die Funktion haben
vollständig ausgewertet werden.
So wird dieser vollständig ausgewertet?
Ja, es ist nur ein String.
Es ist nur ein Wert.
>> Dann müssen wir komplett bewerten diese.
Sobald dies geschehen ist, nun alle ihre Argumente werden ausgewertet.
Und jetzt können wir die Aufruf von printf.
Ja?
>> ZIELGRUPPE: Eine Frage.
Wenn Sie eine Lücke Funktion haben, müssen Sie haben Rückgabe Semikolon?
>> ROB: Sie müssen nicht eine Rückkehr Semikolon wenn Sie eine Funktion nichtig.
Ok.
So, jetzt einige Haufen Zeug.
Heap ist so, wie wir zu tun mit dynamischer Speicherverwaltung.
Und diese direkt im Gegensatz zu der Stapel, die wir nennen automatische
Speicherverwaltung.
>> So auf den Stapel, die Sie nie wirklich mit, wie die lokalen Variablen umgehen
werden geschoben und alle tauchte ab diese Stack-Frames und all das Zeug.
Sie haben keine Sorgen zu machen.
Es ist automatisch.
So der Haufen ist manuell.
Und die [unverständlich]
kommt von diesen Funktionen malloc und free.
>> Also hier ist ein anderes Programm.
Alles, was wir tun, ist mallocing eine ganze Zahl ist.
Wir es in die Speicherung Sterne-x.
Natürlich haben wir, um zu überprüfen zu sehen, wenn x ist null.
Dann werden wir gerade eingestellt, was x wird auf 50 zeigt.
Drucken, was zu zeigen ist x, print x, und dann frei x.
>> Also, wie ist das eigentlich gut aussehen wird wenn wir uns auf unsere Stack und Heap?
Also werden wir wieder starten.
Der Boden unserer Stapel wie zuvor.
Denken Sie daran, dass dir häufen direkt wendet sich gegen die Stapel?
So werden wir das haben Spitze unserer Haufen da oben.
>> So dass die Unterseite der Stapel, haben wir Stapelrahmen für unsere Haupt.
Es hat den Raum für argc, argv, und wir haben nun eine lokale Variable X, die
ist ein int Stern.
Also, wir werden durchlaufen durch dieses Programm.
Das erste, was wir haben, ist ein Aufruf von malloc.
>> Also machen wir einen Aufruf von malloc.
Malloc eine Funktion ist.
Es geht um einen Stack-Frame zu bekommen.
Was passieren wir von malloc?
Das wird nach innen zu gehen der Stapelrahmen.
Wir vorbei Größe n, die 4 ist.
So dass auf malloc übergeben.
>> Was bedeutet malloc tun?
Es packt uns etwas Platz auf dem Heap.
So werden wir auf den Heap zu gehen.
Und wir werden zu greifen 4 Bytes auf dem Heap.
So geben wir nur, dass eine beliebige Adresse.
0x123 Einfach so tun, dass ist ein Adresse, die auf dem Heap ist.
>> Also, was ist eigentlich in der die Bereich des Speichers an der Adresse Ox123?
Müll.
So haben wir nicht alles in ihm gespeichert.
So weit wir wissen, ist es könnte alles sein.
Sie sollten nicht davon ausgehen, es ist null.
Es ist sehr wahrscheinlich, nicht Null.
>> So, jetzt malloc Renditen.
Und was tun wir, wenn malloc zurückkehrt?
Wir setzen das, was er zurückkehrt.
Wir setzen x gleich, was es kehrt zurück.
Also was ist es der Rückkehr?
Es zurück 0x123 da dies die Adresse des Speicherblocks, dass sie
nur in dem Heap zugewiesen.
>> Also zurück 0x123 x geht jetzt eingestellt werden gleich 0x123, die, bildhaft,
wir häufig als x, der einen vorhandenen ziehen Pfeil nach diesem Block.
Aber x ist nur die Speicherung dieser Adresse.
So, jetzt müssen wir überprüfen, ob x ist null.
Es ist nicht null.
Wir geben vor, dass malloc gelungen.
>> So, jetzt Sterne-x gleich 50 ist.
So erinnert es bedeutet Sterne gehen an diese Adresse.
So 0x123 Wir gehen auf gehen an diese Adresse.
Also das bringt uns da oben.
Was tun wir an dieser Adresse?
Wir Speichern 50.
>> Also nach dieser Linie, ist das, was Dinge aussehen würde.
So, jetzt ist es nicht mehr Müll da oben.
Jetzt wissen wir, dass 50 ist, dass bestimmte Adresse, weil
setzen wir sie auf das.
OK?
So, jetzt werden wir f drucken.
>> Also zuerst werden wir Sterne x drucken.
Also, was ist Sterne-x?
Auch Sterne-x bedeutet, gehen Sie zu der Sache, dass x verweist.
So x speichert 0x123 Go dazu.
Wir erhalten 50.
So drucken Sie f, dass.
Und das bedeutet, es wird gedruckt 50.
Und dann, die zurückgibt.
>> Und dann haben wir die zweite printf.
Wir sind jetzt Prozent p.
Wenn Sie es nicht gesehen haben, das ist nur, wie Sie einen Zeiger zu drucken.
So haben wir i Prozent, Prozent f, und alle diejenigen, die bereits.
Also Prozent p, drucken Sie ein Zeiger.
>> X so ist ein Zeiger.
Also, wenn wir gehen, um x selbst zu drucken, wir Druck Was ist eigentlich in
x, der 0x123 ist also der erste Druck f Drucklegung 50.
Die zweite Druck f wird zu drucken 0x123 Ja?
>> ZIELGRUPPE: Haben Sie Prozent verwenden x, um einen Zeiger drucken?
>> ROB: Also haben Sie Prozent verwenden x, um einen Zeiger drucken?
So kann man aber nur x Prozent, in der Regel, denn wie, wenn Sie einige haben
integer und Sie drucken möchten es als Hexadezimalzahl.
Das ist, wie Sie das tun.
>> Ange Prozent würde d drucken als Dezimalzahl.
Das ist waren wir bekommen Prozent d. i ist nur Integer.
Prozent p spezifisch für Zeiger.
>> X so ist ein Zeiger.
Wir wollen Prozent p verwenden.
Aber Prozent x funktionieren könnte.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Ja.
Zumindest für diese call-- so dass ich hat es nicht in hier.
Aber diese beiden Argumente sind notwendigerweise Innere dieser Stapelrahmen
zusammen mit allen lokalen Variablen printf passiert zu sein mit.
Und dann der nächste Aufruf von printf jetzt innerhalb von printf Stapelrahmen ist
Prozent p Backslash n und unabhängig von der Wert von x, der 0x123 ist.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Es wird etwas drucken das sieht so aus.
>> ZIELGRUPPE: [unverständlich].
>> ROB: So druckt er in der Adressformular aus.
Es sieht aus wie eine Adresse.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Warum ist was?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Warum ist das Zeiger 4 Bytes?
So gibt es eine ganze Reihe von 0 hat vor diesem.
So ist es wirklich 0x0000000123.
Auf einem 64-Bit-System, gäbe es eine ganze Reihe von mehr Nullen.
Ja?
>> ZIELGRUPPE: [unverständlich].
>> ROB: Also der erste printf wird sich print--
>> ZIELGRUPPE: [unverständlich].
>> ROB: Ja, es geht um zu drucken welche x zu zeigen ist.
Stern sagt, was ist das Sache, die auf.
Packen es.
Also was ist es, die auf?
50.
Packen es.
Das ist, was wir zu drucken.
Der Erwägung, dass die nächste, wir sind nur Druck x selber.
Was im Inneren der f?
0x123.
Ok.
>> Und dann, endlich, haben wir die frei.
Was passieren wir zu befreien?
Wir vorbei x.
Diese Zeit habe ich eigentlich angezeigt in dem Stapelrahmen.
>> So dass wir das Bestehen der Wert 0x123 zu befreien.
So, jetzt kostenlos kennt, alles in Ordnung, Ich muss gehen bis zu dem Heap
und frei, dass der Speicher.
Es ist nicht mehr mit, was ist an der Adresse 0x123.
>> So frei ist, werde frei dass aus dem Haufen.
Jetzt ist unser Haufen ist wieder leer.
Wir haben keine Speicherlecks.
Jetzt kostenlos zurückkehren wird.
Beachten Sie, dass x ist immer noch 0x123.
Aber das ist jetzt nicht gültig Speicher.
Wir sollten nicht mehr dereferenzieren x.
Ja?
>> ZIELGRUPPE: Ist 0 zurück redundant?
>> ROB: Ist returen 0 redundant?
Ja.
Wir haben nur, dass es da wir haben eine Rück eine für Luft.
So ist es wie, ja, können gehören die return 0.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: So nach freien x, was passiert, wenn wir versuchen, den Zeiger dereferenzieren?
Es ist möglich, dass nichts schief geht.
Es ist möglich, dass wir immer noch 50.
>> Es ist möglich, auch, dass, dass der Speicher jetzt für etwas anderes verwendet.
So ist es nicht definiertes Verhalten.
Undefined und bedeutet nichts kann passieren.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Nein, also, wenn Sie zuweisen x auf etwas anderes.
Also, wenn wir hier die x gleich malloc etwas else--
malloc Größe event--
dann, dass Originalblock der Speicher wird nicht freigegeben.
Und wir haben offiziell verloren.
Das ist ein Speicherleck.
Wir haben alle Verweise verloren in diesem Speicherblock.
Also gibt es keine Möglichkeit, können wir jemals befreien sie.
OK, also dann wieder 0 Mitteln erfolgen.
>> Alles in Ordnung, so Stack-Überlauf.
Was ist die Idee hier?
Also denken Sie daran, wird Heap nach unten.
Stack steigt.
So war dies das Beispiel aus Vorlesung, Ich denke, an dem die Haupt ist gerade dabei,
rufen Sie diese Funktion foo, die gehen zu sich selbst rekursiv auf und rufen
immer wieder.
>> So Stack-Frames zu gehen genau die gleiche Arbeit.
So werden wir mit dem Haupt starten wie der Boden Stapelrahmen.
Dann wird sich Haupt foo nennen, die wird einen Stack-Frame zu bekommen.
>> Dann wird sich foo foo nennen wieder, die gehen, um zu bekommen
ein weiterer Stapelrahmen.
Und dann wieder und wieder, und wieder, und immer wieder, bis schließlich laufen wir
in dem Haufen.
Also das ist, wie wir ein Stapelüberlauf.
Und an diesem Punkt, seg Sie Schuld.
Oder Sie würde wirklich seg vor Fehler dieser Punkt aber ja.
>> ZIELGRUPPE: Ist die Kern Dump gleiche wie seg Schuld?
>> ROB: So werden Sie sehen, Segmentierung Fehler Kern geworfen.
Sie erhalten einen Core-Dump, wenn Sie seg Schuld.
Und es ist wie ein Dump aller Inhalt der aktuellen Speicher so
dass Sie versuchen, identifizieren kann warum Sie SEG gestört.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Also einen Segmentation Fault Mittel es gibt einen Stack-Überlauf.
Also nicht unbedingt.
Eine Segmentierungsfehler bedeutet, dass Sie Berühren Speicher in einer Weise,
Sie sollte nicht sein.
Also eine Möglichkeit, dass das passiert ist, wenn Sie Stack-Überlauf, beginnen wir berühren
Speicher in einer Weise, die wir nicht sein sollte.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Also innerhalb einer Endlosschleife.
Wie, das ist wie eine rekursive unendlich Schleife und so haben wir ein anderes bekommen
Stapelrahmen jedes Mal.
Aber gerade innerhalb eines regulären unendlich, während one--
Nun, lassen Sie uns nicht sogar drucken F--
etwas zu tun.
Was auch immer.
>> Wir gehen nicht zu sein, immer ein weiterer Stapelrahmen.
Wir gehen nur zu halten Looping über diesen einzigen Befehl.
Der Stapel wird nicht wachsen.
Es ist die Tatsache, dass jeder rekursive Anruf wird uns einen Stack-Frame.
Das ist, warum wir einen Stack-Überlauf zu bekommen.
Ja?
>> ZIELGRUPPE: Also, wenn Sie gesagt, die bekommen while-Schleife und dann [unverständlich]?
>> ROB: Also, wenn innerhalb der while-Schleife gab es eine printf, würden Sie immer noch
nicht seg Schuld.
Ich wollte einfach nicht, Dinge zu verwechseln.
Es wäre Schleife.
Sie würden einen einzelnen Stapel zu bekommen Rahmen für die printf.
>> Dann printf zurückkehren würde.
Dann können Sie wieder würden Schleife.
Sie würden einen einzelnen Stapel zu bekommen Rahmen für die printf.
Es würde zurückkehren.
Einzelstapelrahmen.
So dass Sie nicht immer diese unendliche häufen sich Stack-Frames.
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Ja.
Also das Stack-Überlauf passiert weil keine von diesen
Anrufe auf foo kehren zurück.
Also, wenn wir zurückkommen, dann würden wir beginnen zu verlieren Stack-Frames.
Und dann wären wir nicht in Stack-Überlauf.
Und das ist, warum Sie einen Basisfall müssen für Ihre persönliche Funktionen.
Ja?
>> ZIELGRUPPE: Ist der potenzielle Größe und die Stack für den Haufen das gleiche für
alle Programme?
>> ROB: Rund.
Ist die potenzielle Größe des Stapels und der Haufen das gleiche für alle Programme?
Rund.
Es gibt einige der Randomisierung bis wo beginnt der Stack und
wo der Haufen beginnt.
Wenn Sie zufällig eine ganze Menge haben globale Variablen und Dinge, könnte man
wegnehmen etwas Platz für Ihre Haufen.
>> Auf einem 64-Bit-System, können Sie praktisch haben unendlich Speicher.
Es gibt einfach so viel.
Zwischen 32 Bit und 64 Bit, dass ist ein bedeutender Unterschied.
>> Sie werden eine ganze Menge mehr zu bekommen Stack und Heap-Speicher auf einem 64-Bit-
System, weil es einfach mehr Adressen, die sie verwenden können.
Sondern auf einem einzelnen System, wird es ist etwa die gleiche Menge an Stapel
und Heap-Speicher.
In Ordnung.
>> Also letzte Sache ist, Zusammenstellung.
So sollten Sie diesen Prozess wissen.
Es gibt vier große Schritte.
Also der erste sollte leicht zu merken.
Pre-Processing.
Es hat die Vorwahl in ihm vor.
So ist es vor allem anderen kommt.
>> Das ist daran zu erinnern, ist der Hash.
So Hash definiert und Hash enthält in all diesen.
Das sind alle Pre-Prozessor Richtlinien.
Dies sind die Dinge, die den Vorprozessor nimmt.
>> Also, was macht ein Pre-Prozessor zu tun?
Es ist ein wirklich dumm Sache.
Allen ist es in der Lage sind, alle diese Kopieren und Ausschneiden und Einfügen-Operationen.
>> So umfasst Standard-Hash-i0 dot h.
Was ist das denn?
Es greifen die Standard-i0 dot h Datei und Einfügen in die Top
wo auch immer sie sagt, Hash enthält Standard i0 dot h.
>> Und jeder Hash definieren, dass wir gesehen, was ist das denn?
Seine Kopieren der Wert, den der Hash definiert ist als und Einfügen festgelegt, dass
wo immer Sie verwenden den Wert.
So der Präprozessor nur tut wirklich einfache textbasierte Operationen.
Es tut nichts, smart.
Also alles andere ist komplizierter.
>> Also jetzt, dass Präprozessor ist getan, wir eigentlich kompilieren.
Also, was hat der Zusammenstellung das?
Wir gehen jetzt von C-Code zu Assembler-Code.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Ja, fingen wir, dass.
So kompilieren.
Wir von C auf Montage gehen.
Das ist also eine eigentliche Sprache zu ändern.
Kompilieren selbst bedeutet, sich von einer Hochsprache zu
eine geringere Sprache.
>> Und c ist eine Hochsprache im Vergleich zur Montage.
Was ist die Montage?
Seine Anweisungen, die sind ziemlich viel, für Ihre CPU gemacht.
Aber der Computer immer noch nicht verstehen Montage.
Es versteht nur Einsen und Nullen.
Der nächste Schritt ist die Montage, die bringt uns von diesen Anweisungen,
Ihre CPU versteht und tatsächlich übersetzt sie, um
Die Einsen und Nullen.
>> Also C über die Montage bis binär.
Aber ich glaube nicht eine ausführbare Datei vorhanden.
Also denken Sie an den CS50-Bibliothek.
Wir haben euch mit einem binären vorgesehen diese CS50-Bibliothek, die GetString hat
und getint und das alles.
>> Aber der CS50 library--
an und für itself-- ist nicht ausführbar.
Es muss nicht eine Hauptfunktion.
Es ist nur ein Haufen von binären die Sie verwenden können.
So Verknüpfung ist, wie wir zusammen alle bringen dieser verschiedenen Binärdateien
in eine tatsächliche ausführbare.
Eine, die Sie geben können Punkt Schrägstrich einen Punkt aus.
>> Also das ist, wie die Datei, die Sie schrieb, - was auch immer Ihr Programm ist--
Ceaser Punkt c.
Aber jetzt ist es kompiliert auf binär.
So Caesar dot o.
Und das ist unser CS50 Bibliotheken binär.
Und sie kombiniert in einer einzigen ausführbaren Datei.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Also zuerst, denken Sie daran, der Hash enthalten ist eigentlich ein
Vorprozessor Schritt.
Aber das ist getrennt.
Wenn Sie nicht mit Funktionen, die keine sind außerhalb des einzigen Datei dann,
Nein, Sie müssen nichts verlinken da haben Sie alles.
>> Das heißt, wird in printf verknüpft.
Wenn Sie jemals printf verwenden, das ist etwas das muss in verknüpft werden
weil du nicht schreiben das nicht.
Und in der Tat automatisch printf in verknüpft.
Sie wissen, wie in der Befehlszeile oder wenn Sie Typ führen, Sie sehen, es haben
Strich l CS50, der Link hat in der CS50-Bibliothek?
Printf, und so was, wird in automatisch verknüpft werden.
Alle anderen Fragen auf irgendetwas?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Verknüpfung?
Wir haben eine ganze Reihe von verschiedene binäre Dateien.
Dies ist das bekannteste Beispiel dass wir verwenden, ist CS50-Bibliothek.
Wir haben für Sie und die gegebene Binary für dieses CS50-Bibliothek.
>> Sie wollen GetString verwenden in Ihrem Programm.
So können Sie gehen und GetString.
Aber ohne meine Binärcode für GetString, wenn Sie Ihren Code kompilieren
nach unten, kann man nicht wirklich laufen können Ihre Programm, weil GetString String ist
noch nicht vollständig definiert.
>> Es ist nur, wenn Sie in meinem binären verlinken dass GetString enthält, die jetzt alle
Recht, kann ich eigentlich GetString ausführen.
Meine Datei ist abgeschlossen.
Und ich kann diese ausführen.
Ja?
>> ZIELGRUPPE: Hat Verlinkung konvertieren die binäre auf executable?
Also selbst wenn Sie nicht über andere Bibliotheken, wäre es nicht noch sein
notwendig, um zu übersetzen die [unverständlich]?
>> ROB: Also eine ausführbare ist immer noch in binär.
Es ist nur die Kombination einer ganzen Haufen von Binärdateien.
>> ZIELGRUPPE: Vielen, vielen Dank.
>> ROB: Kein Problem.
Noch Fragen?
Ansonsten sind wir alle gesetzt.
In Ordnung.
Danke.
>> [Applaus]
>> ZIELGRUPPE: Danke.
>> ROB: Ja.