1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Woche 4, Fortsetzung] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Harvard University] 3 00:00:04,240 --> 00:00:07,290 [Dies ist CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Dies ist CS50, und das ist das Ende der Woche 4. 5 00:00:11,290 --> 00:00:14,030 So eine gute Nachricht und eine schlechte Nachricht. 6 00:00:14,030 --> 00:00:26,240 Keine Vorlesung am Montag, setzen kein Problem nächste Woche. [Schüler jubeln] 7 00:00:26,240 --> 00:00:28,680 Du wirst doch nicht zu mögen, wohin dieses geht. 8 00:00:28,680 --> 00:00:31,590 Aber wir haben diese statt am kommenden Mittwoch, 9 00:00:31,590 --> 00:00:37,740 und es gibt auch pro Lehrplan 1 Freitag Vortrag am kommenden Freitag, so dass wir auf dem richtigen Weg zu bleiben. 10 00:00:37,740 --> 00:00:40,580 Aber alles wird wie gewohnt gefilmt werden, so keine Sorgen machen. 11 00:00:40,580 --> 00:00:44,100 >> Und im Hinblick auf die Quiz-0, was wir in Richtung Ende der Woche zu tun 12 00:00:44,100 --> 00:00:47,140 basiert auf der natürlich die Homepage cs50.net eine Erklärung veröffentlichen 13 00:00:47,140 --> 00:00:50,160 welche Art von Erwartungen, die Sie haben sollten, wenn es um die erste Quiz kommt. 14 00:00:50,160 --> 00:00:55,100 In der Regel wird es Multiple Choice, Richtig-Falsch, kurze Antwort, kurze Kodierung Probleme. 15 00:00:55,100 --> 00:00:57,360 Du wirst doch nicht zu erwarten, um das Äquivalent zu implementieren 16 00:00:57,360 --> 00:01:00,030 ein Problem, dass Sie auf einem pset zu sehen, für die Sie einen Computer 17 00:01:00,030 --> 00:01:03,240 und ein Debugger und dergleichen, aber es wird kleine Kodierung Probleme. 18 00:01:03,240 --> 00:01:06,900 >> Und in der Tat, sind der beste Führer, um ein Gefühl von dem, was CS50 Quiz bekommen, wie 19 00:01:06,900 --> 00:01:09,180 wird cs50.net gehen, zum Quizzes Link gehen, 20 00:01:09,180 --> 00:01:11,920 und Sie können sehen die vergangenen Jahre im Wert von Tests. 21 00:01:11,920 --> 00:01:16,600 Nur erkennen, dass der Lehrplan nicht immer das gleiche über die Jahre. 22 00:01:16,600 --> 00:01:18,510 Manchmal fügen wir, manchmal subtrahieren, 23 00:01:18,510 --> 00:01:20,670 Wenn Sie also etwas Thema auf einer von denen alte Quiz 24 00:01:20,670 --> 00:01:25,380 dass Sie keine Ahnung, was es redet haben, ist es entweder, dass wir es zu bedecken 25 00:01:25,380 --> 00:01:27,210 oder dass wir nicht abdecken. 26 00:01:27,210 --> 00:01:31,110 Aber in der Form von Bewertungen, an diesem Sonntag, Montag und Dienstag 27 00:01:31,110 --> 00:01:34,770 sowie einem Kurs-weiten Review-Sitzung am Sonntagabend - 28 00:01:34,770 --> 00:01:37,500 Zeit und Ort auf der natürlich die Homepage bekannt gegeben - 29 00:01:37,500 --> 00:01:40,120 Sie alle haben die Möglichkeit, mit dem Verlauf der Lehre Stipendiaten überprüfen 30 00:01:40,120 --> 00:01:44,830 Das Material für dieses Jahr, sowohl im Schnitt und als Full-Klasse, 31 00:01:44,830 --> 00:01:48,400 und diese werden wie üblich gefilmt als gut. 32 00:01:48,400 --> 00:01:53,380 >> Gut. So ohne weiteres, ein Kommentar über Pass / Fail und Add / Drop. 33 00:01:53,380 --> 00:01:57,980 Sie können meine Notizen gesehen haben letzte Nacht, und das ist wirklich nur ein paar zusätzliche Sicherheit 34 00:01:57,980 --> 00:02:01,250 dass, wenn Sie zählen zu den besonders weniger komfortabel oder irgendwo dazwischen 35 00:02:01,250 --> 00:02:04,870 und du fühlst dich nur ein wenig über den Kopf, 36 00:02:04,870 --> 00:02:08,430 erkennen, dass ist ja ganz normal, und es gibt eine breite Unterstützung Struktur vorhanden, 37 00:02:08,430 --> 00:02:13,530 von denen Bürozeiten waren darauf bedacht, auf die Verbesserung der umso mehr pro meine email letzte Nacht, 38 00:02:13,530 --> 00:02:16,520 und zu erkennen, dass eine Option wie Pass / für eine Klasse wie folgt fehl 39 00:02:16,520 --> 00:02:21,540 wirklich als einen Mechanismus, um den Rand ausziehen eines Kurses, wie dies bedeutete, 40 00:02:21,540 --> 00:02:24,200 so dass wiederum, wenn Sie verbringen diese 10, 15, 20 Stunden 41 00:02:24,200 --> 00:02:28,160 nur versuchen, etwas pset an die Arbeit, und Sie wissen, dass Sie 90-95% der Weg dorthin 42 00:02:28,160 --> 00:02:32,100 Sie können aber nicht gefunden, einige verdammte Bug in einer Pass / Fail-Modell, das Art ist okay. 43 00:02:32,100 --> 00:02:36,230 >> Die Idee ist, dass mit diesem Mechanismus können Sie dann konzentrieren sich auf Ihre anderen pset 44 00:02:36,230 --> 00:02:39,530 oder schlafen oder was immer es ist, dass man auf das konzentrieren, wollen. 45 00:02:39,530 --> 00:02:43,390 So erkennen, dass Sie bis zum kommenden Dienstag haben - technisch 5. Montag, 46 00:02:43,390 --> 00:02:50,840 aber es ist ein Feiertag, so am kommenden Dienstag - aus Lichthupenschalter / Fail abgestufte oder umgekehrt. 47 00:02:50,840 --> 00:02:54,450 Und wenn du wirklich am Abgrund und der Drop ganz denken, 48 00:02:54,450 --> 00:02:56,440 Sie fangen mich nach Vorlesung oder schreiben Sie mir eine Notiz. 49 00:02:56,440 --> 00:02:59,990 Wir würden auf mindestens Chat lieben, bevor Sie adieu mitzubieten. 50 00:02:59,990 --> 00:03:03,470 Gut. Also haben wir angefangen, die Stützräder off letzten Zeit. 51 00:03:03,470 --> 00:03:06,030 Insbesondere konzentrierten wir uns auf String. 52 00:03:06,030 --> 00:03:09,740 String ist etwas, das in der CS50-Bibliothek deklariert ist, 53 00:03:09,740 --> 00:03:14,340 speziell in dieser Datei namens cs50.h die wir beginnen, in dieser und nächste Woche aussehen. 54 00:03:14,340 --> 00:03:17,250 Aber String ist eigentlich nur eine Vereinfachung der etwas 55 00:03:17,250 --> 00:03:20,980 das ist ein wenig mehr arcanely als char * beschrieben. 56 00:03:20,980 --> 00:03:24,090 Char wir kennen. Es ist nur ein einzelnes Zeichen. 57 00:03:24,090 --> 00:03:28,010 Aber * ab Montag bezeichnet, was? >> [Student] Ein Zeiger. 58 00:03:28,010 --> 00:03:31,290 Ein Zeiger. Und was ist ein Zeiger? >> [Schüler] Eine Adresse. 59 00:03:31,290 --> 00:03:33,420 >> Es ist wie eine Adresse, eine Stelle im Speicher. 60 00:03:33,420 --> 00:03:35,910 Was ist eine Adresse oder einen Ort oder Speicher? 61 00:03:35,910 --> 00:03:40,290 Wieder haben uns alle Laptops mit einem Gig oder 2 Gigabyte RAM wahrscheinlich in diesen Tagen, 62 00:03:40,290 --> 00:03:44,160 und das bedeutet, Sie haben eine Milliarde oder 2 Milliarden Bytes im Wert von Speicher. 63 00:03:44,160 --> 00:03:46,240 Und es ist nicht wirklich wichtig, was es physisch aussieht, 64 00:03:46,240 --> 00:03:51,220 sondern auf den Glauben nehmen, dass man all Anzahl der einzelnen Bytes, dass Sie Ihren eigenen Laptop hat - 65 00:03:51,220 --> 00:03:54,580 Dies ist Byte 0 dieses Byte 1 ist, ist dieses Byte 2 Mrd. - 66 00:03:54,580 --> 00:03:56,100 und das ist genau das, was ein Computer macht. 67 00:03:56,100 --> 00:04:00,030 Wenn Sie Speicherplatz reservieren für ein einzelnes Zeichen, zum Beispiel, 68 00:04:00,030 --> 00:04:02,480 hat es natürlich irgendwo leben in den Arbeitsspeicher Ihres Computers, 69 00:04:02,480 --> 00:04:05,860 und vielleicht ist es bei Byte Nummer 12345, 70 00:04:05,860 --> 00:04:08,470 und das ist irgendwo hier in den Arbeitsspeicher Ihres Computers. 71 00:04:08,470 --> 00:04:12,630 Und die Adresse dann von diesem Charakter ist 12345. 72 00:04:12,630 --> 00:04:16,140 >> Jetzt, in der Woche von 0 bis jetzt so weit, wir haben nicht wirklich etwas 73 00:04:16,140 --> 00:04:19,170 wo im Speicher die Dinge gespeichert, weil wir normalerweise Symbole, 74 00:04:19,170 --> 00:04:22,540 Variablen und Arrays tatsächlich auf unsere Daten zu erhalten. 75 00:04:22,540 --> 00:04:24,950 Aber ab Montag und umso mehr heute, bist du jetzt gehen zu müssen 76 00:04:24,950 --> 00:04:27,710 umso mehr expressive Fähigkeiten mit Schreiben von Programmen 77 00:04:27,710 --> 00:04:31,330 um wirklich zu manipulieren Speicher eines Computers aber Sie sehen, passen, 78 00:04:31,330 --> 00:04:33,720 für beide gute Zwecke und schlecht, 79 00:04:33,720 --> 00:04:39,620 Bugs ist ein sehr häufiges Ergebnis an dieser Stelle in das Erlernen dieses Zeug. 80 00:04:39,620 --> 00:04:42,460 Aber was bedeutet es wirklich, ein char * sein? 81 00:04:42,460 --> 00:04:46,140 Fahren wir zurück zu - und wir kommen wieder zum Binky wie versprochen heute. 82 00:04:46,140 --> 00:04:48,670 Lassen Sie uns auf ein einfaches Beispiel hier. 83 00:04:48,670 --> 00:04:53,060 Lassen Sie mich diese Datei als compare.c, und lass mich einfach ein wenig Template Code hier 84 00:04:53,060 --> 00:05:00,490 so gehören stdio.h, lassen Sie mich auch mir selbst gehören cs50.h. Ich werde in bis es zu vergrößern. 85 00:05:00,490 --> 00:05:05,850 Lassen Sie mich mit dem Schreiben beginnen wichtigsten int main (void), und jetzt will ich so etwas wie dies zu tun: 86 00:05:05,850 --> 00:05:13,520 printf ("Gib mir einen String:") und dann verwende ich string s wird GetString 87 00:05:13,520 --> 00:05:16,750 um einen String vom Benutzer zu bekommen, dann werde ich um den Benutzer für ein anderes bitten. 88 00:05:16,750 --> 00:05:21,870 ("Gib mir noch eine Zeichenfolge:") und ich werde sie über GetString dazu kommen zu fragen. 89 00:05:21,870 --> 00:05:27,020 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. 90 00:05:27,020 --> 00:05:30,030 So GetString, und jetzt habe ich wollen einfach nur eine Plausibilitätsprüfung tun, und ich werde sagen: 91 00:05:30,030 --> 00:05:39,770 if (s == t) dann bin ich gerade dabei, den Benutzer printf erzählen ("Du dasselbe \ n eingegeben!"); 92 00:05:39,770 --> 00:05:45,520 sonst werde ich ausdrucken etwas wie ("Du hast etwas anderes! \ n") 93 00:05:45,520 --> 00:05:48,460 oder was auch immer das Urteil sein. So etwas Ähnliches. 94 00:05:48,460 --> 00:05:52,200 Dann wie gewohnt, werde ich 0 zurück, die nur bedeutete, dass nichts Schlimmes passiert ist, 95 00:05:52,200 --> 00:05:54,400 und ich werde weitermachen und Kompilieren und Ausführen dieses Programms. 96 00:05:54,400 --> 00:05:56,540 >> Aber am Montag liefen wir dieses Programm, 97 00:05:56,540 --> 00:06:00,420 und tatsächlich wurde gesagt, dass HALLO nicht hallo und tschüss ist kein Abschied. 98 00:06:00,420 --> 00:06:03,140 Das Verhalten, das wir sahen, war ein wenig mehr wie diese. 99 00:06:03,140 --> 00:06:11,450 Lassen Sie mich in mein Quellverzeichnis, zoom in hier, und wir haben zu vergleichen. 100 00:06:11,450 --> 00:06:14,570 Zusammengestellt okay. Lassen Sie mich laufen zu vergleichen. Gib mir einen String: HALLO. 101 00:06:14,570 --> 00:06:16,300 Gib mir noch eine Zeichenfolge: HALLO. 102 00:06:16,300 --> 00:06:18,000 Sie tippte etwas anderes! 103 00:06:18,000 --> 00:06:22,650 Nun, lassen Sie mich versuchen, etwas einfacher, wie 50, 50. Sie tippte etwas anderes! 104 00:06:22,650 --> 00:06:25,740 hallo, hallo. So klar ist was los hier. 105 00:06:25,740 --> 00:06:28,440 Aber was war die Erklärung dafür, warum? 106 00:06:28,440 --> 00:06:33,850 Offenbar ist die Linie 12 komplett dysfunktional. 107 00:06:34,300 --> 00:06:39,430 Was ist das grundlegende Problem hier? Yeah. >> [Schüler] Es vergleicht die Adressen. 108 00:06:39,430 --> 00:06:41,850 Ja, genau. Es ist eigentlich Vergleichen der Adressen 109 00:06:41,850 --> 00:06:44,580 in denen HALLO und HALLO gespeichert werden. 110 00:06:44,580 --> 00:06:48,290 Es ist nicht zu vergleichen die Buchstaben HALLO wieder und wieder, 111 00:06:48,290 --> 00:06:52,370 weil das, was wirklich passiert ist, die ganze Zeit wir haben mit GetString - 112 00:06:52,370 --> 00:06:56,130 Diese Tafel ist wieder unser Arbeitsspeicher des Computers, 113 00:06:56,130 --> 00:07:00,100 und sagen wir ich nenne GetString nach der Deklaration einer Variablen s. 114 00:07:00,100 --> 00:07:01,930 Was macht mein Gedächtnis aussehen? 115 00:07:01,930 --> 00:07:07,070 Lasst uns willkürlich sagen, dass s so aussieht. Es ist ein Quadrat. 116 00:07:07,070 --> 00:07:09,040 Und so ziemlich jede Zeit habe ich ein Stück Erinnerung auf dem Bildschirm gezeichnet 117 00:07:09,040 --> 00:07:12,860 wenn es 32 Bit ist Ich zeichne Plätze wie das, weil in der Tat in das Gerät, 118 00:07:12,860 --> 00:07:17,380 ein Zeiger, um eine Adresse, beträgt 32 Bits. Es ist das gleiche wie ein int. 119 00:07:17,380 --> 00:07:19,420 Das kann basierend auf Computersystems variieren. 120 00:07:19,420 --> 00:07:24,630 Diejenigen von euch, vage mit der Tatsache vertraut, dass Ihr Mac oder PC 64 Bit ist es, 121 00:07:24,630 --> 00:07:28,120 das tatsächlich bedeutet, dass Ihr Computer mit 64-Bit-Zeiger, 122 00:07:28,120 --> 00:07:33,730 64-Bit-Adressen, und unter den upsides davon ist Ihr Computer 123 00:07:33,730 --> 00:07:35,560 kann viel mehr RAM als damals haben. 124 00:07:35,560 --> 00:07:39,240 Lange Rede kurzer Sinn, wieder in den Tag, wenn die Computer nur 32 Bit 125 00:07:39,240 --> 00:07:42,740 Adressen darstellen, die größte Anzahl von Bytes, die Sie darstellen könnte 126 00:07:42,740 --> 00:07:46,280 in diesem Fall war, was, wenn Sie 32-Bit haben? 127 00:07:46,280 --> 00:07:49,590 So 4 Milliarden, rechts, da 2 der 32 4 Milliarden. 128 00:07:49,590 --> 00:07:51,370 Diese Zahl hat sich im Laufe worden wiederkehrend. 129 00:07:51,370 --> 00:07:55,240 >> Also, wenn Sie nur 32 Bits, die höchste Zahl, die Sie zu zählen können, ist rund 4 Milliarden Euro. 130 00:07:55,240 --> 00:07:58,750 Aber das war eine grundlegende Einschränkung von Computern bis vor ein paar Jahren 131 00:07:58,750 --> 00:08:01,180 denn wenn man zählen nur so hoch wie 4 Milliarden 132 00:08:01,180 --> 00:08:05,270 es spielt keine Rolle, wenn Sie 8 Gigabyte RAM oder sogar 5 Gigabyte RAM zu kaufen; 133 00:08:05,270 --> 00:08:07,780 könnt ihr nicht zählen, dass hoch, so dass es sinnlos war. 134 00:08:07,780 --> 00:08:11,430 Man konnte nur auf die ersten 3 oder 4 Gigabyte Arbeitsspeicher Ihres Computers. 135 00:08:11,430 --> 00:08:14,410 Das ist weniger ein Problem, jetzt, und Sie können MacBook Pros und Dells kaufen 136 00:08:14,410 --> 00:08:17,680 mit 8 Gigabyte RAM oder mehr in diesen Tagen. 137 00:08:17,680 --> 00:08:24,100 Aber wenn ich ganz einfach in diesem Programm zuzuordnen einen Zeiger, genannt ein Zeiger s, 138 00:08:24,100 --> 00:08:28,370 es könnte, wie dies auf den Bildschirm schauen, weil wir tatsächlich zu schälen zurück diese Schicht müssen. 139 00:08:28,370 --> 00:08:33,520 Ich sage immer Saite, aber ab Montag, string ist wirklich char *, 140 00:08:33,520 --> 00:08:35,590 die Adresse einiger Charakter. 141 00:08:35,590 --> 00:08:39,280 Werfen wir also, dass die Ausbildung Rad ab, obwohl wir weiterhin mit GetString für jetzt. 142 00:08:39,280 --> 00:08:42,600 Also habe ich erklärt, s, und das ist ein Stück Speicher, 32 Bit. 143 00:08:42,600 --> 00:08:47,370 Was ist hier im Speicher standardmäßig? >> [Unverständlich Studenten Antwort] 144 00:08:47,370 --> 00:08:50,040 Was ist das? >> [Schüler] Garbage. >> Garbage. Genau. 145 00:08:50,040 --> 00:08:54,610 Wenn Sie der Programmierer nicht stellen einen Wert in einer Variablen, wer weiß, was es ist? 146 00:08:54,610 --> 00:08:57,990 Manchmal muss man Glück haben und es ist 0, welche Art von einem schönen, sauberen Default-Wert, 147 00:08:57,990 --> 00:09:00,310 aber wie wir Montag sah, manchmal ist es völliger Unsinn, 148 00:09:00,310 --> 00:09:04,130 einige wirklich große positive oder negative Zahl, von wo kam? 149 00:09:05,350 --> 00:09:07,010 Yeah. >> [Schüler] Die Funktion vor. >> Ja. 150 00:09:07,010 --> 00:09:10,170 >> Oft ist die Funktion, die aufgerufen werden, bevor, weil erinnern konnte, 151 00:09:10,170 --> 00:09:13,920 wie Sie Funktionen in Erinnerung rufen, nehmen sie mehr und mehr Raum von unten nach oben, 152 00:09:13,920 --> 00:09:17,040 und sobald die Funktion zurückkehrt, wird diese Erinnerung wiederverwendet 153 00:09:17,040 --> 00:09:20,890 mit dem nächsten Kerl, der aufgerufen wird, wird die mit Ihrem gleichen Schicht des Speichers. 154 00:09:20,890 --> 00:09:23,450 Und wenn Sie nach links Müll dort vorherigen Werte, 155 00:09:23,450 --> 00:09:28,190 könnten wir s als mit etwas Wert, wenn wir wirklich nicht gesetzt haben dort nichts zu verwechseln. 156 00:09:28,190 --> 00:09:30,960 Also unsere RAM an diesem Punkt sieht wie folgt aus. 157 00:09:30,960 --> 00:09:36,030 Jetzt auf der rechten Seite der Linie 7 nennen wir GetString, 158 00:09:36,030 --> 00:09:40,150 Which wir haben jetzt tun seit Wochen, aber was ist GetString wirklich tun? 159 00:09:40,150 --> 00:09:43,350 GetString geschrieben von der CS50 Personal ist ein wenig intelligenter 160 00:09:43,350 --> 00:09:46,500 , dass, sobald der Benutzer startet Eingabe-Tasten und ENTER drückt, 161 00:09:46,500 --> 00:09:50,010 GetString Zahlen, wie viele Anschläge hat der Benutzer Hit, 162 00:09:50,010 --> 00:09:53,360 wie viele Zeichen muss ich RAM für zuzuweisen. 163 00:09:53,360 --> 00:09:55,660 Und wo das RAM kommt, wer weiß? 164 00:09:55,660 --> 00:09:58,930 Es ist irgendwo in Ihrem Computer 2 Gigabyte oder was der Erinnerung. 165 00:09:58,930 --> 00:10:05,200 Aber lassen Sie uns annehmen, dass die Computer-Raum für das Wort HALLO gefunden hier. 166 00:10:05,200 --> 00:10:08,710 Das Wort, das ich geschrieben war H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 Und wenn wir daraus ziehen als eine Abfolge von Zeichen, könnten wir es so machen. 168 00:10:13,510 --> 00:10:17,860 Aber ich muss 1 extra tun. Was gehört am Ende einer Zeichenfolge in C? 169 00:10:17,860 --> 00:10:20,710 Das Null-Zeichen, die wir schreiben, wie \ 0. 170 00:10:20,710 --> 00:10:23,980 Es ist technisch die Zahl 0, aber der Backslash macht den klareren 171 00:10:23,980 --> 00:10:28,150 dass dies ist buchstäblich die Zahl 0, die ganze Zahl 0; 172 00:10:28,150 --> 00:10:32,440 Es ist zum Beispiel nicht, quote-unquote 0, dass Sie vielleicht über die Tastatur einzugeben. 173 00:10:32,440 --> 00:10:33,940 Das ist also HALLO. 174 00:10:33,940 --> 00:10:36,350 >> Und was haben wir gesagt am Montag, dass eine Funktion wie GetString 175 00:10:36,350 --> 00:10:39,580 tatsächlich wieder all diese Woche? 176 00:10:39,580 --> 00:10:43,960 Es ist nicht wieder einen String per se, weil das nicht wirklich eine Bedeutung haben 177 00:10:43,960 --> 00:10:47,710 da Strings existieren nicht. Sie sind eine Art der Herstellung in der CS50-Bibliothek. 178 00:10:47,710 --> 00:10:51,300 Was ist wirklich ein String ist, technisch? >> [Schüler] Es ist das erste Zeichen. 179 00:10:51,300 --> 00:10:55,950 Genau. Es ist ganz einfach die Adresse des ersten Zeichens, dass der Benutzer eingetippt 180 00:10:55,950 --> 00:11:02,810 Also, wenn mein Wort HELLO es endet bei Byte Nummer 123 und dann auf Byte-Zahl 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, und so weiter, wenn ich lediglich die Anzahl meiner Bytes von 0 an aufwärts, 182 00:11:08,320 --> 00:11:12,650 was wirklich GetString kehrt zurück ist buchstäblich die Nummer 123. 183 00:11:12,650 --> 00:11:19,270 Also, was wird in s gesetzt ist die Nummer 123, nicht der Buchstabe H, nicht das Wort HALLO, 184 00:11:19,270 --> 00:11:23,130 ganz einfach die Adresse, an die ich finden kann, den ersten Buchstaben des HALLO. 185 00:11:23,130 --> 00:11:26,500 Aber das heißt nicht wie genug zu sein scheinen. Ich fragte Sie nach einer Zeichenkette, nicht ein Zeichen. 186 00:11:26,500 --> 00:11:32,970 So, wie wir oder der Computer weiß, dass ELLO Art zusammen mit dem H kommen? 187 00:11:35,760 --> 00:11:37,460 Was ist die Art von Vereinbarung, die wir haben? Yeah. 188 00:11:37,460 --> 00:11:40,100 [Schüler] Es hält Erzählen selbst, einige weitere Zeichen zu finden. >> Genau. 189 00:11:40,100 --> 00:11:44,570 >> Es ist das Mensch-Computer-Konvention, wodurch, wenn Sie mit Strings zu tun haben, 190 00:11:44,570 --> 00:11:49,410 ansonsten nun als char bekannten Sterne, müssen Sie einfach, um herauszufinden, 191 00:11:49,410 --> 00:11:54,350 wo das Ende jeder Saite im Leben ist, indem wirklich nur Iteration über sie mit einer for-Schleife 192 00:11:54,350 --> 00:11:57,820 eine while-Schleife, was auch immer, so dass, wenn Sie das Ende des Strings 193 00:11:57,820 --> 00:12:02,160 Sie können jetzt von dem abzuleiten, oh war das ganze Wort HALLO. 194 00:12:02,160 --> 00:12:04,820 Diejenigen von euch, mit vorheriger Programmierung Erfahrung könnte in Java kennen 195 00:12:04,820 --> 00:12:09,880 Sie können einfach anrufen. Länge und in anderen Sprachen können Sie Länge oder ähnliches nennen. 196 00:12:09,880 --> 00:12:14,060 Das ist, weil in vielen Sprachen, vor allem Dinge genannt objektorientierten Sprachen, 197 00:12:14,060 --> 00:12:18,580 die Länge von etwas Art eingekapselt des Stückes der Daten selbst, 198 00:12:18,580 --> 00:12:24,000 so wie wir gekapselt IDs und die Namen und Häuser innerhalb eines Schülers am Montag. 199 00:12:24,000 --> 00:12:28,700 Aber C ist viel niedrigeren Niveau. Es gibt keine Objekte oder Klassen, wenn Sie diese Begriffe gehört habe zuvor. 200 00:12:28,700 --> 00:12:31,490 Alles, was Sie wirklich Speicheradressen. 201 00:12:31,490 --> 00:12:35,540 Also das ist eine Art der altmodischen Art der Darstellung interessanter Datenstrukturen. 202 00:12:35,540 --> 00:12:38,760 Dein Startwert wie die Adresse des ersten Zeichens 203 00:12:38,760 --> 00:12:42,340 und dann nur einige willkürliche Konvention, dass jeder stimmt zu folgen. 204 00:12:42,340 --> 00:12:46,420 Also, wie ist Stringlänge umgesetzt, haben wir vor? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, die einige von euch haben jetzt ein paar Mal verwendet. Es ist ziemlich einfach, nicht wahr? 206 00:12:51,360 --> 00:12:53,060 Es ist wie 2 Zeilen Code. 207 00:12:53,060 --> 00:12:56,140 Es ist so ziemlich eine for-Schleife von einer Art, vielleicht mit einem zusätzlichen lokalen Variablen. 208 00:12:56,140 --> 00:13:00,540 Aber strlen hat nur einen Zeiger zu nehmen und dann auf die Suche nach \ 0. 209 00:13:00,540 --> 00:13:05,190 >> Und sobald er sie findet, kann die Gesamtanzahl von Schritten, die ihn in dieser Zeichenfolge getroffen ist. 210 00:13:05,190 --> 00:13:07,150 So können wir daraus schließen, was sich weiter. 211 00:13:07,150 --> 00:13:11,850 Nehmen wir also erkläre ich t, ​​wie ich in der Zeile 10 gemacht habe. 212 00:13:11,850 --> 00:13:14,280 Dies ist einige Müll Wert. Wer weiß, auf den ersten? 213 00:13:14,280 --> 00:13:18,490 Aber auf der rechten Seite der Linie von 10 Ich rufe GetString wieder. 214 00:13:18,490 --> 00:13:20,050 Wer weiß, wo endet es? 215 00:13:20,050 --> 00:13:23,830 Lasst uns willkürlich sagen, dass das Betriebssystem Platz für sie Weg hierher gefunden. 216 00:13:23,830 --> 00:13:28,610 Ich bin zufällig zufälligerweise geben H-E-L-L-O wieder 217 00:13:28,610 --> 00:13:31,260 und so können wir ziehen die gleiche Art von Bild. 218 00:13:31,260 --> 00:13:34,290 Aber die Tatsache, dass ich neu gezeichnet dieses Bild habe ist gewollt 219 00:13:34,290 --> 00:13:37,720 denn das ist eine andere HALLO als diese. 220 00:13:37,720 --> 00:13:43,920 Also hier könnte dies location 456 sein, das ist 457, und so weiter. 221 00:13:43,920 --> 00:13:47,170 Also, was wird gebracht, wo das Fragezeichen einmal war? 222 00:13:47,170 --> 00:13:50,190 In diesem Fall 456. 223 00:13:50,190 --> 00:13:53,540 Wir sammeln diese Zahlen willkürlich denn wirklich nach dem heutigen 224 00:13:53,540 --> 00:13:57,110 wir werden nicht so sehr darum, was die Adresse von etwas ist. 225 00:13:57,110 --> 00:14:02,690 Alles, was wir kümmern uns ist, dass wir herausfinden können, die Adresse einiger Stück Daten wie HALLO. 226 00:14:02,690 --> 00:14:07,100 >> Also wirklich, was die meisten Menschen in der Informatik zu tun, wenn man über Speicheradressen 227 00:14:07,100 --> 00:14:10,210 und reden über Zeiger gesagt, 228 00:14:10,210 --> 00:14:14,220 anstatt die Mühe herauszufinden, 123 - who cares, wo dieses Zeug tatsächlich ist, 229 00:14:14,220 --> 00:14:17,440 Wir wissen nur, dass es an einem gewissen numerischen Adresse - 230 00:14:17,440 --> 00:14:22,180 vereinfachen wir die Welt und nur sagen, dass s auf diesem Charakter zeigen 231 00:14:22,180 --> 00:14:25,080 und t ist dieses Zeichen zeigt. 232 00:14:25,080 --> 00:14:27,430 Und die Tatsache, dass es ein Pfeil ist ganz vorsätzliche 233 00:14:27,430 --> 00:14:31,610 weil jetzt buchstäblich s und t bei H weisenden am anderen H weisenden 234 00:14:31,610 --> 00:14:34,720 Denn am Ende des Tages, spielt es keine Rolle, was die Adresse ist, 235 00:14:34,720 --> 00:14:40,240 aber es ist nicht egal, dass wir die Möglichkeit, diese Adresse mit einem Stück des Codes zu äußern. 236 00:14:40,240 --> 00:14:42,730 Wir haben nicht wirklich diese Adressen manipuliert nur noch 237 00:14:42,730 --> 00:14:47,770 so werden wir sehen, wo wir einwerfen und sortieren von Dingen zu tun mit Zeigern 238 00:14:47,770 --> 00:14:52,030 aber jetzt in Zeile 12 wahrsten Sinne des Wortes, welche Werte vergleichen wir 239 00:14:52,030 --> 00:14:55,500 nach dieser Geschichte in Zeile 12? 240 00:14:56,570 --> 00:15:01,290 Wir sagen ist 123 gleich gleich 456? Und das ist definitiv nicht der Fall. 241 00:15:01,290 --> 00:15:05,320 Und auch konzeptionell, ist dieser Zeiger definitiv nicht das gleiche, da dies 242 00:15:05,320 --> 00:15:09,500 weil Sie als GetString zweimal, und GetString nicht versucht sein super clever, 243 00:15:09,500 --> 00:15:12,470 es nicht versuchen zu erkennen, oh, du HALLO vor 5 Minuten eingegeben; 244 00:15:12,470 --> 00:15:15,090 lassen Sie mich Ihnen den gleichen Zeiger als ich Ihnen vor, 245 00:15:15,090 --> 00:15:18,450 es ist nur weist ein neues Stück Speicher jedes Mal, wenn Sie es nennen. 246 00:15:18,450 --> 00:15:20,350 >> So, wie wir dieses Problem beheben? 247 00:15:20,350 --> 00:15:24,270 Wenn übergeordnete möchte ich die Saiten HALLO und HALLO vergleichen - 248 00:15:24,270 --> 00:15:28,680 Ich weiß nichts über die Zeiger kümmern - wie gehe ich über die Beantwortung der Frage gehen, 249 00:15:28,680 --> 00:15:31,980 hat der User geben die gleiche Sache? Was ist notwendig? Yeah. 250 00:15:31,980 --> 00:15:35,200 [Student] Verwenden Sie eine Funktion. >> Ich kann mit einer Funktion aus der Box. 251 00:15:35,200 --> 00:15:38,170 Ich kann mit einer Funktion namens strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 nur die gekürzte Version des Sagens Zeichenfolge vergleichen. 253 00:15:41,190 --> 00:15:45,070 Und wenn wir in zu gehen, zum Beispiel, vergleichen 2, welches unter den heutigen Handouts, 254 00:15:45,070 --> 00:15:46,690 I genau das tun. 255 00:15:46,690 --> 00:15:51,750 Ich hielt alles das gleiche von der Linie 1 auf bis zu 26 oder so, 256 00:15:51,750 --> 00:15:54,360 und jetzt feststellen, dieser Teil hat nur ein wenig verändert. 257 00:15:54,360 --> 00:15:57,690 Lassen Sie ignorieren Linie 28 für einen Moment und konzentrieren sich nur auf diesen einen. 258 00:15:57,690 --> 00:16:00,410 Was haben wir gesagt am Montag, dass str compare tut? 259 00:16:00,410 --> 00:16:05,200 Es übernimmt die Prozess, 2 Zeiger, s und t in diesem Fall, 260 00:16:05,200 --> 00:16:08,480 Art praktisch die Umsetzung ihrer Finger auf die 2 Buchstaben, 261 00:16:08,480 --> 00:16:11,530 und was sie tun müssen, ist so etwas wie eine while-Schleife oder einer for-Schleife 262 00:16:11,530 --> 00:16:16,050 und er sagt, das sind die gleichen? Wenn ja, bewegt sie die Finger oder die Zeiger vorwärts. 263 00:16:16,050 --> 00:16:17,970 Sind das die gleichen, diese gleich, diese gleich, 264 00:16:17,970 --> 00:16:22,710 diese gleich, diese gleich? Und ooh, ich bin am Ende der Schnur an beiden s und t. 265 00:16:22,710 --> 00:16:26,780 Ich habe keine Widersprüche gefunden. Ja, diese Strings die gleiche. 266 00:16:26,780 --> 00:16:31,940 Und was bedeutet str vergleichen zurück, wenn 2 Strings gleich sind, offenbar? Zero. 267 00:16:31,940 --> 00:16:35,900 So 0 ist gut in diesem Fall, denn wenn es -1 oder +1, 268 00:16:35,900 --> 00:16:40,560 das bedeutet, dass s nur zufällig vor t alphabetisch oder nach t kommen. 269 00:16:40,560 --> 00:16:43,760 Und warum wäre das nützlich sein, um eine Funktion, die Ihnen sagt, welche Zeichenfolge kommt vor haben 270 00:16:43,760 --> 00:16:46,720 oder nach in einem Wörterbuch? 271 00:16:46,720 --> 00:16:48,740 [Schüler] Searching. >> Suchen und Sortieren. 272 00:16:48,740 --> 00:16:51,730 >> So kann man Dinge wie binäre Suche oder bubble sort tun oder Mergesort 273 00:16:51,730 --> 00:16:53,230 wo man die Dinge zu vergleichen. 274 00:16:53,230 --> 00:16:56,420 Bisher haben wir Art geschnitten einige Ecken und nur zum Sortieren sprach 275 00:16:56,420 --> 00:16:59,430 im Kontext von Zahlen, weil es schön und einfach zu reden, 276 00:16:59,430 --> 00:17:02,430 aber man kann sicherlich Zeichenfolgen vergleichen, Apfel und Banane, 277 00:17:02,430 --> 00:17:05,349 denn wenn apple ist bekannt, dass vor der Banane zu kommen, ähnlich, 278 00:17:05,349 --> 00:17:09,319 können Sie verschieben Strings um im Speicher wie Rob tat mit Mergesort im Video 279 00:17:09,319 --> 00:17:15,880 und wir haben hier auf der Bühne mit der Auswahl sortieren, Insertion Sort und Bubble-Sort. 280 00:17:15,880 --> 00:17:18,710 So wo sonst können wir das? Lasst uns versuchen. 281 00:17:18,710 --> 00:17:23,980 Lasst Art vergessen, dass Lektion für einen Moment und versuchen Sie es jetzt und kopieren 1.c die folgenden tun. 282 00:17:23,980 --> 00:17:26,800 In Zeile 21 Ich sage Druck etwas, 283 00:17:26,800 --> 00:17:28,520 dann bin ich immer einen String vom Benutzer 284 00:17:28,520 --> 00:17:30,690 dann bin ich checking this. 285 00:17:30,690 --> 00:17:33,620 Wir haben nicht wirklich in diese Gewohnheit noch bekommen, aber lasst uns jetzt tun. 286 00:17:33,620 --> 00:17:40,990 Lasst uns tatsächlich abziehen dieser Schicht. Das ist wirklich char *. Dieser Kerl ist wirklich char *. 287 00:17:40,990 --> 00:17:45,690 Also, was bedeutet es, wenn s == NULL werden überprüft? 288 00:17:45,690 --> 00:17:48,380 Es stellt sich heraus, dass, wenn Sie eine Funktion aufrufen, wie GetString 289 00:17:48,380 --> 00:17:51,540 oder ganz allgemein fragen Sie einfach einen Computer, um Ihnen einige Speicher, 290 00:17:51,540 --> 00:17:53,030 etwas schief gehen könnte. 291 00:17:53,030 --> 00:17:56,630 Man könnte verrückt sein und bitten Sie den Computer für einen Terabyte Speicher 292 00:17:56,630 --> 00:18:01,780 indem er für Billionen von Bytes im Speicher, die einfach nicht in der Computer nicht vorhanden sind, 293 00:18:01,780 --> 00:18:05,130 aber GetString und andere Funktionen benötigen einen Weg schreien dich an 294 00:18:05,130 --> 00:18:06,820 wenn Sie schon zu viel gefragt. 295 00:18:06,820 --> 00:18:10,450 Und die Art und Weise GetString tut, ist, wenn Sie mehr Speicher gebeten haben 296 00:18:10,450 --> 00:18:14,250 als es in den Computer, auch wenn diese super, super geringe Wahrscheinlichkeit ist 297 00:18:14,250 --> 00:18:17,730 weil keiner von uns gehen, um eine Billion Zeichen eingeben und dann die Eingabetaste drücken, 298 00:18:17,730 --> 00:18:21,980 aber geringer Wahrscheinlichkeit auch sein mag, will ich noch für sie nur für den Fall zu überprüfen, 299 00:18:21,980 --> 00:18:26,120 und die besonderen Wert, dass GetString, Antwort, und andere Funktionen wieder 300 00:18:26,120 --> 00:18:30,630 wenn etwas schief gegangen ist in allen Caps NULL. 301 00:18:30,630 --> 00:18:36,520 >> Und was ist NULL? NULL passiert einfach so, um einen Zeiger zu repräsentieren. Es ist Speicheradresse 0. 302 00:18:36,520 --> 00:18:40,800 Die Welt entschieden, dass willkürlich, wenn dies ist mein Arbeitsspeicher des Computers - wissen Sie was? - 303 00:18:40,800 --> 00:18:46,260 werden wir nur 1 Byte eines jeden Arbeitsspeicher des Computers zu stehlen, und das ist die Lage 0. 304 00:18:46,260 --> 00:18:49,560 Wir werden ihm einen Spitznamen NULL, und wir werden zu versprechen 305 00:18:49,560 --> 00:18:52,660 dass wir nie wirklich gestellt realen Daten gibt 306 00:18:52,660 --> 00:18:56,770 weil wir einfach willkürlich brauchen einen besonderen Wert, 0, aka NULL, 307 00:18:56,770 --> 00:19:00,230 so dass wir an Anwender schreien, wenn etwas schief geht. 308 00:19:00,230 --> 00:19:03,590 Ansonsten könnten Sie nicht wissen, 0 bedeutet, legte hier etwas 309 00:19:03,590 --> 00:19:05,490 oder bedeutet es etwas schief gelaufen? 310 00:19:05,490 --> 00:19:09,190 Wir müssen alle einig, dass NULL bedeutet nichts zurückgegeben wurde, 311 00:19:09,190 --> 00:19:11,700 keine tatsächliche Adresse zurückgegeben wurde. 312 00:19:11,700 --> 00:19:15,210 Nun, hier bin ich nur die Annahme meiner menschlichen Konvention ich wieder ein von den wichtigsten 313 00:19:15,210 --> 00:19:17,040 wenn etwas schief geht. 314 00:19:17,040 --> 00:19:20,650 Das ist, weil Haupt Rückkehr Konvention ist auf 0, wenn gute zurückkehren, 315 00:19:20,650 --> 00:19:22,990 1 oder einen anderen Wert, wenn schlecht. 316 00:19:22,990 --> 00:19:28,200 Aber GetString und jede Funktion, die sich im Speicher NULL zurück, wenn etwas schlecht geht. 317 00:19:28,200 --> 00:19:33,480 >> Okay. Also leider, Zeile 27, super einfach, obwohl es völlig versäumt, die Zeichenfolge zu kopieren. 318 00:19:33,480 --> 00:19:35,740 Warum? Wir können sehen, das wie folgt. 319 00:19:35,740 --> 00:19:40,120 Ich bin in Zeile 27, die sich als eine Kopie von s und nannte es t. 320 00:19:40,120 --> 00:19:45,790 Also ich bin nicht die Benutzer zu fragen 2 Strings diesmal, ich sage nur den Wert in s 321 00:19:45,790 --> 00:19:47,870 sollte in t sowie genommen werden. 322 00:19:47,870 --> 00:19:52,890 So jetzt nur noch zu zeigen, wie gebrochene dies in Zeile 29 weiter, was soll ich tun? 323 00:19:52,890 --> 00:19:56,980 Ich ersten Prüfung, ob die Länge von t größer als 0 ist. 324 00:19:56,980 --> 00:19:59,330 Es gibt einige Zeichen gibt. Der Benutzer eingegeben etwas in. 325 00:19:59,330 --> 00:20:03,410 Was ist die Linie 32 zu tun, offenbar? 326 00:20:03,410 --> 00:20:08,910 [Unverständlich Student Response] >> Richtig. Sie können Art schließen sie aus, was ich sagte es tut. 327 00:20:08,910 --> 00:20:13,200 Aber technisch ist, was diese tun? t [0] stellt dar, was? 328 00:20:13,200 --> 00:20:15,140 [Schüler] Die 0. Charakter. >> [Malan] Die 0. Charakter. 329 00:20:15,140 --> 00:20:19,620 Oder, human-like, das erste Zeichen in t, was immer das ist, H vielleicht in diesem Fall. 330 00:20:19,620 --> 00:20:24,990 Und toupper tut, was es sagt. Es nutzt die 0. Charakter t und es ändert sich. 331 00:20:24,990 --> 00:20:28,430 So bedeutet dies, nehmen Sie die 0. Charakter t, machen es Großbuchstaben 332 00:20:28,430 --> 00:20:30,320 und steckte es wieder in der gleichen Lage. 333 00:20:30,320 --> 00:20:35,540 Also, wenn ich hallo geben in Kleinbuchstaben, sollte dies die Kleinbuchstaben h zu einer Kapitalerhöhung H. ändern 334 00:20:35,540 --> 00:20:41,400 Aber das Problem ist, dass in den Zeilen 35 und 36, was ich zu tun habe auszudrucken für uns s und t. 335 00:20:41,400 --> 00:20:43,120 Und was ist Ihre Vermutung? 336 00:20:43,120 --> 00:20:47,250 Was mache ich eigentlich vor sich geht, um zu sehen, ob ich in Kleinbuchstaben in hallo getippt? 337 00:20:47,250 --> 00:20:52,280 Was wird gedruckt werden? >> [Unverständlich Student Response] >> Was ist das? 338 00:20:52,280 --> 00:20:58,360 [Schüler] Big H und der Rest klein. >> Der große H und der Rest für die kleine, s oder t? 339 00:20:58,360 --> 00:21:03,170 [Schüler] Both. >> Beides. Genau. Also lasst uns sehen, was hier los ist. 340 00:21:03,170 --> 00:21:08,380 >> Lassen Sie mich gehen Sie vor und erstellen diese. Dies ist copy1, so stellen copy1. Gut. 341 00:21:08,380 --> 00:21:14,840 Zoom in. Lassen Sie mich gehen Sie vor und führen Sie copy1, Enter, Sag etwas: hallo in Kleinbuchstaben. 342 00:21:14,840 --> 00:21:19,570 Es aktiviert die Kopie, aber es scheint aktiviert die ursprüngliche als auch, 343 00:21:19,570 --> 00:21:22,070 denn das, was jetzt passiert in dieser Geschichte? 344 00:21:22,070 --> 00:21:27,030 In Zeile 27 Ich weiß nicht wirklich zu sein scheinen Kopieren der Zeichenkette, 345 00:21:27,030 --> 00:21:30,450 aber auch wenn Sie vielleicht intuitiv gehofft haben, dass der Fall zu sein, 346 00:21:30,450 --> 00:21:33,680 Wenn Sie zu diesem Bild denken, was wirklich habe ich getan? 347 00:21:33,680 --> 00:21:35,410 Hälfte des Bildes ist die gleiche. 348 00:21:35,410 --> 00:21:39,390 Also lasst uns zurück in die Zeit so aus, dass t noch nicht in der Geschichte existieren. 349 00:21:39,390 --> 00:21:43,160 S kann in der Geschichte gibt, aber wir Kleinbuchstaben hallo diese Zeit. 350 00:21:43,160 --> 00:21:46,710 Also lassen Sie mich zu beheben, was ich eigentlich getippt in. 351 00:21:46,710 --> 00:21:51,280 In diesem Fall haben wir hier h-E-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Wir werden es als eine Folge von Zeichen zu ziehen, legte meine Trennlinien hier und mein \ 0. 353 00:21:58,050 --> 00:22:05,980 Also das ist, wo wir so bald wie Linie 1 sind über 24-ish, geben oder nehmen, ausgeführt wurden. 354 00:22:05,980 --> 00:22:07,800 Dies ist das Bild von meinem Speicher. 355 00:22:07,800 --> 00:22:10,800 Als ich in die Linie 27 zu bekommen, was geschieht dann? 356 00:22:10,800 --> 00:22:14,730 Genau wie vorher, bekomme ich einen Zeiger, die ich als dieses Quadrat zu zeichnen werde. 357 00:22:14,730 --> 00:22:19,740 Es heißt t. Und was ist der Wert standardmäßig? Wer weiß? Einige Müll Wert. 358 00:22:19,740 --> 00:22:22,060 >> Also werde ich abstrakt, dass weg wie ein Fragezeichen. 359 00:22:22,060 --> 00:22:27,670 Und sobald die rechte Seite der Linie 27 führt, was soll ich setzen Innenseite t? 360 00:22:27,670 --> 00:22:30,770 Dasselbe, was in s ist. 361 00:22:30,770 --> 00:22:34,120 Also, wenn wir für einen Augenblick zu entfernen diese Abstraktion des Pfeils, und wir sagen, 362 00:22:34,120 --> 00:22:40,330 oh, ist dieser Speicher Ladeadresse 123, wenn Sie sagen, t erhält s, Semikolon, 363 00:22:40,330 --> 00:22:42,700 Sie buchstäblich setzen 123 hier. 364 00:22:42,700 --> 00:22:45,200 Nun, wenn wir solche Vereinfachung unserer Welt wieder mit Bildern, 365 00:22:45,200 --> 00:22:48,750 was du wirklich getan ist nur ein weiterer Pfeil, um Ihre Welt hinzugefügt 366 00:22:48,750 --> 00:22:52,910 Das ist von t bis exakt das gleiche String zeigt. 367 00:22:52,910 --> 00:22:59,730 Also, wenn in Zeile 31 und 32 ich tatsächlich über die Änderung t [0] gehen, 368 00:22:59,730 --> 00:23:05,580 was ist t [0] offenbar gleichbedeutend mit jetzt? s [0] 369 00:23:05,580 --> 00:23:07,030 Also das ist alles, was passiert ist. 370 00:23:07,030 --> 00:23:09,900 Und obwohl diese Art der fühlt sich ein wenig niedrigem Niveau und arcane 371 00:23:09,900 --> 00:23:12,760 und diese Art von Gefühl, vielleicht intuitiv dies sollte nur gearbeitet haben - 372 00:23:12,760 --> 00:23:15,410 Ich habe Kopien der Dinge vor gemacht und es funktionierte einfach - 373 00:23:15,410 --> 00:23:18,590 wenn Sie tatsächlich darüber nachdenken, was ein String ist wirklich, es ist ein char *. 374 00:23:18,590 --> 00:23:21,700 Nun, was ist das? Es ist die Adresse eines Charakters. 375 00:23:21,700 --> 00:23:24,930 Dann vielleicht macht es mehr Sinn, dass, wenn Sie versuchen, etwas zu tun 376 00:23:24,930 --> 00:23:29,220 Super scheinbar einfache wie diese, ist alles was Sie tun Kopieren einer Speicheradresse. 377 00:23:29,220 --> 00:23:32,530 Sie sind nicht wirklich etwas zu tun mit der Zeichenfolge sich. 378 00:23:32,530 --> 00:23:37,500 Also selbst wenn Sie keine Ahnung haben, wie Sie dieses Problem lösen im Code 379 00:23:37,500 --> 00:23:45,080 hohem Niveau, konzeptionell, was wir tun müssen, damit ta originalgetreue Kopie s, offenbar? 380 00:23:46,670 --> 00:23:48,820 Yeah. >> [Schüler] Gib es einen neuen Standort? >> Genau. 381 00:23:48,820 --> 00:23:50,800 >> Wir müssen den t eine neue Lage. 382 00:23:50,800 --> 00:23:55,230 Wir müssen irgendwie eine Welt schaffen, in dem wir einen neuen Block arbeiten, 383 00:23:55,230 --> 00:24:00,090 die gerade der Übersichtlichkeit halber werde ich direkt unter diesem ein zu ziehen, aber es muss nicht dort zu sein. 384 00:24:00,090 --> 00:24:04,880 Aber es braucht, um die gleiche Größe haben, also werde ich diese vertikalen Linien an der gleichen Stelle zu ziehen. 385 00:24:04,880 --> 00:24:09,720 Es ist in Ordnung, wenn dies alles Müll zunächst. Wer weiß, was da war? 386 00:24:09,720 --> 00:24:13,850 Aber Schritt 1 gehen zu müssen, werden mir so viel Speicher geben, wie ich brauche 387 00:24:13,850 --> 00:24:18,630 eine Kopie hallo passen, dann herauszufinden, wie man die h hier kopieren, die E hier 388 00:24:18,630 --> 00:24:20,390 l die hier und so weiter. 389 00:24:20,390 --> 00:24:24,880 Aber dies sollte bereits das Gefühl ein wenig offensichtlich, auch wenn einige Details noch abstrakt. 390 00:24:24,880 --> 00:24:28,690 Um diese Zeichenfolge in diese zu kopieren, ist es nur eine for-Schleife oder eine while-Schleife 391 00:24:28,690 --> 00:24:31,580 oder etwas, mit dem Sie umso vertraut habe. 392 00:24:31,580 --> 00:24:35,970 Also lasst uns versuchen. Lassen Sie mich in copy2.c gehen. 393 00:24:35,970 --> 00:24:43,270 In copy2.c haben wir fast das gleiche Programm, außer für die Linie 27. 394 00:24:43,270 --> 00:24:47,260 Es sieht ein wenig komplex, aber wenn wir brechen sie Stück für Stück, 395 00:24:47,260 --> 00:24:48,950 Die linke Seite ist gleich. 396 00:24:48,950 --> 00:24:52,790 Char * t schafft dieses Ding in Erinnerung, wenn auch mit einem Fragezeichen 397 00:24:52,790 --> 00:24:54,680 weil wir keine Ahnung haben, was da ist standardmäßig aktiviert. 398 00:24:54,680 --> 00:24:57,920 Auf der rechten Seite sind wir jetzt eine neue Funktion malloc, 399 00:24:57,920 --> 00:25:00,640 für Speicher zuzuweisen, geben Sie mir Speicher, 400 00:25:00,640 --> 00:25:06,900 und es anscheinend dauert, wie viele Argumente, wie viele Dinge in Klammern? 401 00:25:09,660 --> 00:25:12,130 Ich hörte Gemurmel von 1 und 2, aber es ist nur 1. 402 00:25:12,130 --> 00:25:15,320 Es gibt kein Komma, das gibt es nur 1 Sache in den Klammern bedeutet. 403 00:25:15,320 --> 00:25:17,720 Auch wenn es noch andere Klammern, lassen Sie mich unterstreichen 404 00:25:17,720 --> 00:25:21,460 was drin ist der äußersten Klammern, und es ist dieser Ausdruck: 405 00:25:21,460 --> 00:25:25,880 (Strlen (s) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Also, wenn wir tatsächlich denken, daß diese durch, wird dieser Spruch mir die Länge von s. 407 00:25:29,190 --> 00:25:34,440 Warum bin ich, obwohl, Zugabe von 1 auf die Länge? >> [Unverständlich Studenten Antwort] 408 00:25:34,440 --> 00:25:40,200 Genau. Wir brauchen Platz für diesen Kerl am Heck, das sechste Zeichen, die kein Englisch Bedeutung hat 409 00:25:40,200 --> 00:25:42,250 aber spezielle programmatische Bedeutung. 410 00:25:42,250 --> 00:25:46,800 >> Also brauchen wir ein + 1 dafür, weil strlen gibt die menschliche Erwartung der Länge, 411 00:25:46,800 --> 00:25:50,890 hallo oder 5, bedeutet es nicht geben Ihnen die zusätzliche Null-Zeichen. 412 00:25:50,890 --> 00:25:52,980 Also habe ich manuell hinzufügen dies mit + 1. 413 00:25:52,980 --> 00:25:56,060 Und dann diese, * Größe (char), haben wir nicht gesehen hatte. 414 00:25:56,060 --> 00:25:57,480 Dies ist technisch nicht eine Funktion. 415 00:25:57,480 --> 00:26:04,150 Es ist ein spezielles Schlüsselwort, die gerade erfahren Sie, was die Größe von einigen Datentyp auf einem Computer 416 00:26:04,150 --> 00:26:06,980 denn in Wirklichkeit haben einige von uns 32-Bit-Computern. 417 00:26:06,980 --> 00:26:10,900 Ich habe eine ziemlich alten Computer zu Hause, und es nutzt nur 32 Bit auf Zeiger darstellen. 418 00:26:10,900 --> 00:26:13,900 Und so, wenn ich Größe eines Datentyps hat, könnte es 32 Bits. 419 00:26:13,900 --> 00:26:18,300 Aber wenn ich mit meinem neuen ausgefallenen Computer bin, könnte ich wieder einen Wert von 64 Bit 420 00:26:18,300 --> 00:26:20,510 für so etwas wie eine Adresse. 421 00:26:20,510 --> 00:26:25,400 Also in diesem Fall, um nur super sicher zu sein, werden wir nicht zu hart Code so etwas wie - 422 00:26:25,400 --> 00:26:28,740 Nun, was ist von der Größe eines char nach dem, was wir bisher gesagt haben? 423 00:26:28,740 --> 00:26:34,450 Wir haben ziemlich viel gesagt mündlich, dass sie 1 Byte ist, und das ist ziemlich wahr auf der ganzen Linie. 424 00:26:34,450 --> 00:26:37,000 Aber noch einmal, neigen Annahmen, schlecht zu sein. 425 00:26:37,000 --> 00:26:40,850 Sie führen zu buggy Software, wenn Menschen nutzen die Software in einer Weise, sie nicht gedacht. 426 00:26:40,850 --> 00:26:44,750 Lassen Sie uns also abstrakte diese weg und nur mehr allgemein sagen, 427 00:26:44,750 --> 00:26:46,830 Ich brauche so viele Stücke der Erinnerung 428 00:26:46,830 --> 00:26:50,210 und jeder Block arbeiten sollte gleich der Größe eines Zeichens, 429 00:26:50,210 --> 00:26:54,870 das ist in Wirklichkeit gleich 1 in diesem Fall, aber es ist ein allgemeiner Weise es zu schreiben. 430 00:26:54,870 --> 00:27:00,460 Also, wenn das Wort hallo, ist, wie viele Bytes malloc offenbar hallo zuweisen? 431 00:27:00,460 --> 00:27:04,980 [Schüler] Six. >> Six. Genau so viele wie Fragezeichen auf dem Bildschirm haben. 432 00:27:04,980 --> 00:27:07,800 Und dann nehmen Sie ein jetzt Vermutung auf Ihr Verständnis von GetString Basis 433 00:27:07,800 --> 00:27:12,790 was bedeutet malloc wahrscheinlich zurückkehren? >> [Schüler] Eine Adresse. 434 00:27:12,790 --> 00:27:17,020 Eine Adresse von was? Der erste Block des Speichers. 435 00:27:17,020 --> 00:27:20,670 >> Wir haben keine Ahnung, was da ist, weil eine andere Funktion 436 00:27:20,670 --> 00:27:23,010 konnten, wurden mit diesen Speicher zuvor. 437 00:27:23,010 --> 00:27:28,380 Aber malloc wie GetString, liefert die Adresse des ersten Bytes des Speichers 438 00:27:28,380 --> 00:27:30,540 dass es beiseite für Sie eingerichtet. 439 00:27:30,540 --> 00:27:38,380 Allerdings ist, was sie nicht tun in dieser Rohling mit einem Backslash Nullzeichen füllen 440 00:27:38,380 --> 00:27:43,030 weil es stellt sich heraus, Sie malloc verwenden können, um nichts zuordnen: ints, Strings, Arrays, 441 00:27:43,030 --> 00:27:45,700 Schwimmer, Student Strukturen. 442 00:27:45,700 --> 00:27:47,750 Sie können malloc komplett generisch verwenden. 443 00:27:47,750 --> 00:27:51,470 Es kümmert sich nicht oder müssen wissen, was Sie Zuweisen von Speicher für. 444 00:27:51,470 --> 00:27:55,810 So wäre es vermessen für malloc ein \ 0 setzen 445 00:27:55,810 --> 00:27:58,340 am Ende eines jeden Stück Speicher es Ihnen 446 00:27:58,340 --> 00:28:02,620 weil diese \ 0 Sache ist nur eine Konvention für Streicher. 447 00:28:02,620 --> 00:28:06,310 Es nicht für ints verwendet, es ist nicht für Schwimmer verwendet, ist es nicht für Studenten verwendet. 448 00:28:06,310 --> 00:28:11,730 Und so ist die gotcha mit malloc ist, dass die Belastung ganz auf Sie der Programmierer 449 00:28:11,730 --> 00:28:16,790 zu erinnern, wie viele Bytes Ihnen zugeordnet und nicht immer eine for-Schleife 450 00:28:16,790 --> 00:28:21,570 oder eine while-Schleife und gehen vorbei an der Grenze des Stück Speicher, die Sie erhalten haben. 451 00:28:21,570 --> 00:28:23,540 Anders gesagt, sobald Sie Speicher zuweisen, 452 00:28:23,540 --> 00:28:28,510 Sie können nicht fragen, das Betriebssystem, oh, übrigens, wie groß der ein Stück der Erinnerung war das? 453 00:28:28,510 --> 00:28:32,080 Es ist völlig bis zu Ihnen zu erinnern, wenn Sie diesen Wert benötigen. 454 00:28:32,080 --> 00:28:34,330 >> Also mal sehen, wie ich diesen Speicher zu verwenden fortzufahren. 455 00:28:34,330 --> 00:28:38,430 In Zeile 28 und 29, warum mache ich das? 456 00:28:39,850 --> 00:28:42,260 Nur insgesamt Plausibilitätsprüfung. 457 00:28:42,260 --> 00:28:45,110 Nur für den Fall etwas schief gelaufen ist, bitte ich um ein paar verrückte Menge an Speicher 458 00:28:45,110 --> 00:28:48,690 oder ich habe so viele Dinge auf dem Computer ausgeführt, dass es einfach nicht genug Speicher, 459 00:28:48,690 --> 00:28:51,780 so etwas wie, dass ich zumindest will für null überprüfen. 460 00:28:51,780 --> 00:28:55,260 In Wirklichkeit werden die meisten Computer geben Ihnen die Illusion, dass jedes Programm 461 00:28:55,260 --> 00:28:57,080 kann die Gesamtheit Ihrer RAM zu verwenden, 462 00:28:57,080 --> 00:29:00,740 aber auch so, wenn der Benutzer in einem verrückten langen Schnur vielleicht weil sie ein schlechter Kerl 463 00:29:00,740 --> 00:29:03,440 und sie tatsächlich versuchen, Ihr Programm oder hack in sie abstürzen, 464 00:29:03,440 --> 00:29:07,300 Sie wollen mindestens den Rückgabewert von malloc und ob es gleich null. 465 00:29:07,300 --> 00:29:11,630 Und wenn doch, lass uns einfach jetzt beenden, weil ich nicht weiß, was in diesem Fall zu tun. 466 00:29:11,630 --> 00:29:13,950 Wie kopiere ich den String? Es gibt ein paar Möglichkeiten, dies zu tun. 467 00:29:13,950 --> 00:29:18,850 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. 468 00:29:18,850 --> 00:29:23,110 >> Lassen Sie mich zunächst herauszufinden, was die Länge von s ist. 469 00:29:23,110 --> 00:29:26,930 Ich konnte dies in der Schleife gesetzt haben, sondern ich legte es hier für Klarheit. 470 00:29:26,930 --> 00:29:30,610 So n speichert nun die Länge der ursprünglichen Zeichenfolge, die anscheinend 5. 471 00:29:30,610 --> 00:29:35,290 Da ist in meinem for-Schleife Ich bin von 0 Iteration auf bis zu n, 472 00:29:35,290 --> 00:29:40,940 und bei jeder Iteration Ich stelle s [i] Innenseite t [i]. 473 00:29:40,940 --> 00:29:45,060 Also das ist, was ich mit meinen 2 Finger zeigt auf den Saiten, bevor impliziert. 474 00:29:45,060 --> 00:29:49,260 Da diese for-Schleife wie diese, ich werde das Kopieren h in hier, 475 00:29:49,260 --> 00:29:52,890 e in hier l in hier, weil dies s, ist dies t. 476 00:29:52,890 --> 00:29:58,770 Und dann schließlich in Zeile 35, warum mache ich das? 477 00:29:58,770 --> 00:30:03,770 Ich muss sicherstellen, dass ich die Beendigung der String t. 478 00:30:03,770 --> 00:30:06,170 Und ich habe es auf diese Weise zu super explizit. 479 00:30:06,170 --> 00:30:09,510 Aber vorzuschlagen, jemand, wenn Sie könnten, einen anderen Weg, dies zu tun. 480 00:30:09,510 --> 00:30:13,930 Ich weiß nicht wirklich brauchen, Zeile 35. Es gibt einen anderen Weg, um dies zu tun. 481 00:30:13,930 --> 00:30:18,880 Yeah. >> [Unverständlich Student Response] >> Sag es lauter. 482 00:30:18,880 --> 00:30:20,960 [Student] Weniger als oder gleich. >> Genau. 483 00:30:20,960 --> 00:30:24,450 Wir könnten nur sagen, weniger als oder gleich n, die in der Regel schlecht gewesen ist 484 00:30:24,450 --> 00:30:28,190 weil fast immer, wenn wir gehen bis zu einer gleich dem, was wir sind gezählt 485 00:30:28,190 --> 00:30:30,000 wir gehen ein Schritt zu weit. 486 00:30:30,000 --> 00:30:32,170 Aber denken Sie daran hat, wie viele Bytes vergeben wir? 487 00:30:32,170 --> 00:30:37,210 Wir zugeordnet strlen von s, so 5 + 1 für insgesamt sechs. 488 00:30:37,210 --> 00:30:39,980 Also in diesem Fall könnten wir etwas tun 489 00:30:39,980 --> 00:30:46,450 so dass wir kopiert nicht nur die hallo, sondern auch die \ 0 am Ende. 490 00:30:46,450 --> 00:30:49,860 Alternativ könnten wir eine Funktion namens str Kopie, strcpy, 491 00:30:49,860 --> 00:30:51,700 aber das wäre nicht annähernd so viel Spaß machen. 492 00:30:51,700 --> 00:30:54,000 Aber das ist alles es tut unter der Haube. 493 00:30:54,000 --> 00:30:56,050 Dann endlich, wir tun das gleiche wie vorher. 494 00:30:56,050 --> 00:31:01,620 Ich Kapital t und dann behaupte ich, dass die ursprüngliche wie dieses und die Kopie sieht so aussieht. 495 00:31:01,620 --> 00:31:08,570 So versuchen wir das jetzt. Lassen Sie mich hier zu gehen. Machen copy2. Wir vergrößern und führen copy2. 496 00:31:08,570 --> 00:31:13,840 Ich werde in hallo Kleinbuchstaben einzugeben, und zwar bekomme ich Kleinbuchstaben hallo wie das Original 497 00:31:13,840 --> 00:31:16,930 sondern das Kapital hallo für die Kopie. 498 00:31:16,930 --> 00:31:20,300 Aber ich bin noch nicht fertig nur noch. Ich muss 1 letzte, was hier zu tun. 499 00:31:20,300 --> 00:31:28,000 46 und 47 ist deutlich freigegeben werden kann, aber was bedeutet das eigentlich? 500 00:31:28,000 --> 00:31:33,250 Was mache ich, meinst du, indem Linie 46 und Linie 47? 501 00:31:33,250 --> 00:31:38,900 Welche Auswirkungen hat das denn? Yeah. 502 00:31:38,900 --> 00:31:43,140 [Unverständlich Student Response] >> Genau. 503 00:31:43,140 --> 00:31:46,380 >> Sie sind nur zu sagen das Betriebssystem, hey, danke für dieses Speichers. 504 00:31:46,380 --> 00:31:48,320 Jetzt können Sie es für jemand anderes. 505 00:31:48,320 --> 00:31:50,790 Und hier ist ein perfektes Beispiel für Müll Werte. 506 00:31:50,790 --> 00:31:55,430 Ich habe gerade diesen Speicher verwendet werden, um aufzuschreiben, das Wort Hallo in 2 Plätze, 507 00:31:55,430 --> 00:31:57,490 hier, hier, hier und hier. 508 00:31:57,490 --> 00:32:00,910 Dies ist also h-E-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Aber dann rufe ich die Leitung 46 und die Leitung 47, und Sie wissen, was dort geschieht im Hinblick auf dem Bild? 510 00:32:06,960 --> 00:32:10,010 Eigentlich warten, dieses Bild ist die alte. 511 00:32:10,010 --> 00:32:12,550 Sobald wir die Kopie zu machen, ist dieser Kerl tatsächlich zeigt sich hier, 512 00:32:12,550 --> 00:32:16,110 also lasst entfernen Sie die Zahlen und nur abstrakte weg, als unsere Pfeile wieder. 513 00:32:16,110 --> 00:32:19,370 Was passiert in diesem Bild, wenn ich kostenlos telefonieren? 514 00:32:19,370 --> 00:32:22,750 [Unverständlich Student Response] >> Nicht einmal. 515 00:32:22,750 --> 00:32:29,510 Wenn ich frei auf s und t nennen - eine Art Fangfrage - dieses Bild überhaupt nicht ändern 516 00:32:29,510 --> 00:32:33,880 da ruft s und ruft t sagt nur das Betriebssystem, 517 00:32:33,880 --> 00:32:39,010 hey, können Sie diesen Speicher wieder zu verwenden, aber es ändert daran nichts zu null 518 00:32:39,010 --> 00:32:41,840 oder einige Sonderzeichen, ist es nicht dies zu ändern, 519 00:32:41,840 --> 00:32:47,350 es ändert nicht die h oder e oder l oder l oder o in beiden Orten etwas anderes. 520 00:32:47,350 --> 00:32:51,610 In Bezug auf das Bild, sobald Sie kostenlos, es ändert sich nichts nennen. 521 00:32:51,610 --> 00:32:56,570 Und darin liegt der Ursprung von Müll Werte, denn wenn ich später in diesem Programm 522 00:32:56,570 --> 00:33:01,010 stellen Sie das Betriebssystem mehr Speicher mit GetString oder malloc oder so ähnlich 523 00:33:01,010 --> 00:33:04,900 und das Betriebssystem sagt, sicher, ich 12 Byte Speicher nur befreit haben up, 524 00:33:04,900 --> 00:33:08,080 nutzen diese, was wirst du zu übergeben? 525 00:33:08,080 --> 00:33:10,830 Du wirst übergab ein Stück Erinnerung, dass wir in der Regel ziehen würde 526 00:33:10,830 --> 00:33:13,700 mit Fragezeichen, aber was sind die Fragezeichen? 527 00:33:13,700 --> 00:33:17,000 Sie zufällig h-E-l-l-o, h-E-l-l-o sein. 528 00:33:17,000 --> 00:33:20,940 Dies sind unsere neue Garbage-Werte so bald wie Sie sich befreien, dass der Speicher. 529 00:33:20,940 --> 00:33:22,750 >> Es gibt eine reale Welt stillschweigend auch hier. 530 00:33:22,750 --> 00:33:24,720 Dies geschieht mit RAM zu tun, aber Ihre Computer 531 00:33:24,720 --> 00:33:26,720 tatsächlich tun die gleiche Sache mit der Festplatte. 532 00:33:26,720 --> 00:33:30,620 Wir werden über diese insbesondere sprechen Sie mit einem zukünftiges Problem Satz, der auf Forensik konzentriert. 533 00:33:30,620 --> 00:33:36,170 Aber was passiert eigentlich, wenn Sie einige sensible Finanzdaten-Datei auf Ihrem Desktop haben 534 00:33:36,170 --> 00:33:39,600 oder einige skizzenhafte JPEG und Sie ziehen Sie es in den Papierkorb, 535 00:33:39,600 --> 00:33:44,390 was passiert, wenn Sie es ziehen in den Papierkorb oder in den Papierkorb? 536 00:33:44,390 --> 00:33:47,240 Sie wusste, was ich redete. [Gelächter] 537 00:33:47,240 --> 00:33:52,370 Was passiert, wenn Sie diese Hinweise in Ihrem Papierkorb oder Mülleimer gezogen haben? 538 00:33:52,370 --> 00:33:55,920 [Unverständlich Studenten Antwort] 539 00:33:55,920 --> 00:33:58,000 Nun, so vorsichtig. Was passiert, wenn Sie das tun? 540 00:33:58,000 --> 00:34:01,030 Die kurze Antwort ist nichts, oder? 541 00:34:01,030 --> 00:34:04,790 Sketchy oder sensible Datei noch nur da sitzen irgendwo in Ihrer Festplatte. 542 00:34:04,790 --> 00:34:07,940 Die meisten von uns haben zumindest die harte Tour, dass Sie Ihren Papierkorb entleeren müssen gelernt 543 00:34:07,940 --> 00:34:10,429 oder Ihrem Papierkorb tatsächlich Dateien löschen. 544 00:34:10,429 --> 00:34:13,440 Und in der Tat, wenn Sie die rechte Maustaste oder Steuern Klick auf Ihre Mülleimer 545 00:34:13,440 --> 00:34:15,580 oder wählen Sie Datei, Empty Trash oder was auch immer 546 00:34:15,580 --> 00:34:21,420 und Sie tatsächlich leeren den Papierkorb oder Papierkorb, was tatsächlich passiert, dann zu diesem Bild? 547 00:34:22,810 --> 00:34:25,969 Mehr nichts. Also nichts passiert eigentlich auf der Festplatte. 548 00:34:25,969 --> 00:34:30,880 >> Und wenn wir vorübergehend nur abschweifen und schreiben - ich werde einfach die Rückseite dieser. 549 00:34:30,880 --> 00:34:34,639 So, jetzt wird die Geschichte aus dem RAM, die in dem Programme existieren ändern 550 00:34:34,639 --> 00:34:39,250 während Sie sie wollen, auf die Festplatte, die ist, wo sie langfristig gespeichert werden 551 00:34:39,250 --> 00:34:42,920 selbst wenn der Strom ausfällt, denn jetzt - und wir kommen wieder, diese in die Zukunft - 552 00:34:42,920 --> 00:34:46,380 lasst uns einfach behaupten, dass dies die Festplatte im Inneren des Computers stellt 553 00:34:46,380 --> 00:34:50,110 weil wieder in den Tag sie verwendet, um Kreisscheiben werden, ähnlich wie Disketten. 554 00:34:50,110 --> 00:34:55,130 Also, wenn Sie einige sensible Excel-Datei zu tun, könnte es bis dieses Stück Speicher 555 00:34:55,130 --> 00:34:59,770 auf Festplatte Ihres Computers, und ich bin einfach nur Zeichnen gleichen willkürlichen 1s und 0s. 556 00:34:59,770 --> 00:35:03,970 Wenn Sie die Datei so ziehen Sie Ihre Mülleimer oder Papierkorb, 557 00:35:03,970 --> 00:35:07,750 buchstäblich nichts passiert, weil Apple und Microsoft haben gerade beschlossen, 558 00:35:07,750 --> 00:35:10,450 die Mülleimer und Papierkorb ist wirklich nur eine vorübergehende Platzhalter. 559 00:35:10,450 --> 00:35:14,710 Vielleicht schließlich das OS wird es für Sie zu leeren, aber in der Regel ist es nicht tun, 560 00:35:14,710 --> 00:35:17,090 zumindest bis Sie wirklich wenig Platz sind. 561 00:35:17,090 --> 00:35:20,870 >> Allerdings, wenn Sie Papierkorb leeren oder leeren Papierkorb zu gehen, 562 00:35:20,870 --> 00:35:23,460 ähnlich, passiert nichts an diesem Bild. 563 00:35:23,460 --> 00:35:28,590 Alles, was geschieht, ist an anderer Stelle auf Ihrem Computer, es ist eine Art Tisch. 564 00:35:28,590 --> 00:35:35,400 Es ist eine Art wie ein kleiner Spickzettel, die, dass, sagen wir, Resume.doc sagt, 565 00:35:35,400 --> 00:35:40,920 so Ihren Lebenslauf in einer Microsoft Word-Datei verwendet werden, um an der Stelle 123 auf Ihrer Festplatte zu leben, 566 00:35:40,920 --> 00:35:43,710 nicht im Speicher und nicht im RAM, sondern auf Ihrer Festplatte, 567 00:35:43,710 --> 00:35:49,050 und Ihre skizzenhaften JPEG Leben auf 456 und Ihre Excel-Datei lebt auf 789 oder wo auch immer. 568 00:35:49,050 --> 00:35:53,640 Wenn Sie Dateien löschen, indem tatsächlich Leeren des Papierkorbs oder dem Papierkorb, 569 00:35:53,640 --> 00:35:59,530 Dieses Bild ändert sich nicht. Die 0 und 1 auf Ihrer Festplatte nicht überall hingehen. 570 00:35:59,530 --> 00:36:03,930 Aber dieser Tisch, dieses kleine Datenbank sortiert, ändert sich. 571 00:36:03,930 --> 00:36:08,750 Wenn Sie Ihren Lebenslauf löschen, ist es, als ob die Datei in einem gewissen Sinn gelöscht wird, 572 00:36:08,750 --> 00:36:12,790 aber der Computer tut, ist vergessen, wo das Ding lebt auf Ihrer Festplatte. 573 00:36:12,790 --> 00:36:17,870 Die 0 und 1, die Ihren Lebenslauf oder eine dieser anderen Dateien zu komponieren sind noch intakt. 574 00:36:17,870 --> 00:36:21,960 >> Also, wenn Sie tat dies versehentlich, es gibt noch eine Nicht-Null-Wahrscheinlichkeit 575 00:36:21,960 --> 00:36:25,800 dass Sie Ihre Daten wiederherstellen mit Norton Utilities oder eine kommerzielle Software 576 00:36:25,800 --> 00:36:29,810 deren Zweck im Leben zu finden ist 0 und 1, die Art der zu Waisen geworden sind, 577 00:36:29,810 --> 00:36:33,300 hier aber vergessen Sie hier links, so dass Sie Ihre Daten zurück bekommen kann. 578 00:36:33,300 --> 00:36:38,410 Oder forensische Ermittler bei der Polizei oder FBI würde tatsächlich einen Festplatte 579 00:36:38,410 --> 00:36:42,550 und tatsächlich nach Mustern von 0 und 1, die aussehen wie JPEGs, wie Excel-Dateien zu suchen aussehen, 580 00:36:42,550 --> 00:36:46,400 und erholen sie auf diese Weise, auch wenn der Computer hat sie dort vergessen. 581 00:36:46,400 --> 00:36:49,820 Der einzige Weg, wirklich zu löschen, wie wir in der Zukunft besprechen, 582 00:36:49,820 --> 00:36:54,190 ist zu schrubben oder wischen Sie die Datei oder Festplatte - 583 00:36:54,190 --> 00:36:56,540 Man kann nicht wirklich loszuwerden, die 0 und 1 584 00:36:56,540 --> 00:36:59,440 denn sonst würden Sie mit einem Gigabyte Festplatte zu starten 585 00:36:59,440 --> 00:37:02,380 und Sie würden am Ende mit einem Megabyte Festplatte, wenn Sie ständig das Löschen wurden, 586 00:37:02,380 --> 00:37:04,380 wörtlich 0s und 1s. 587 00:37:04,380 --> 00:37:06,310 Also, was würden Sie tun, wenn Sie wirklich wollen, um Ihre Spuren zu verwischen 588 00:37:06,310 --> 00:37:10,510 und das grundlegende Problem ist, dass es noch 0 und 1 auf der Festplatte? 589 00:37:10,510 --> 00:37:14,930 Ich sehe jemanden gestikulierend, dass Sie physisch zu brechen das Gerät. Das wird funktionieren. 590 00:37:14,930 --> 00:37:19,600 [Gelächter] Aber wenn das ist irgendwie eine teure Lösung, was wäre vernünftiger sein? 591 00:37:19,600 --> 00:37:23,270 Yeah. >> [Schüler] überschreiben. >> Überschreiben sie mit was? >> [Schüler] Andere Daten. 592 00:37:23,270 --> 00:37:29,070 Andere Daten. Sie können einfach überschreiben Festplatte mit 0s oder 1s oder alle 0s, alle 1s. 593 00:37:29,070 --> 00:37:31,230 >> Und das ist in der Tat, was einige der Software tut. 594 00:37:31,230 --> 00:37:33,570 Sie können kaufen, Software oder sogar kostenlose Software, 595 00:37:33,570 --> 00:37:36,610 und selbst in den Mac OS diesen Tagen gebaut, weniger in Windows, 596 00:37:36,610 --> 00:37:38,660 ist die Fähigkeit, sicher zu löschen. 597 00:37:38,660 --> 00:37:41,960 Eigentlich, wenn Sie alle laufen heute nach Hause wollen, wenn Sie einen Mac haben und tun dies, 598 00:37:41,960 --> 00:37:45,740 wenn du schon ein paar Sachen in Ihrem Papierkorb können, können Sie Papierkorb sicher entleeren, 599 00:37:45,740 --> 00:37:47,610 die genau das tut. 600 00:37:47,610 --> 00:37:53,350 Anstatt nur zu löschen Dateien hier ist es nicht löschen Sie die 0 und 1 hier 601 00:37:53,350 --> 00:38:01,240 vielmehr es ändert sie alle z. B. auf 0s und Punkt, Punkt, Punkt. 602 00:38:01,240 --> 00:38:05,330 So ein Ihrer zukünftigen pset wird tatsächlich absichtlich Daten wiederherstellen - 603 00:38:05,330 --> 00:38:08,430 Fotos, die wir von Menschen, Orte und Dinge auf dem Campus getroffen 604 00:38:08,430 --> 00:38:12,810 für die wir machen eine forensische Bild von einer Digitalkamera Speicherkarte 605 00:38:12,810 --> 00:38:17,120 das ist genau die gleiche Idee - und du musst herausgefordert, tatsächlich finden werden 606 00:38:17,120 --> 00:38:20,160 die Muster, die JPEGs stellen auf Ihrer Festplatte, 607 00:38:20,160 --> 00:38:23,610 ähnlich wie dieser ehemalige Schüler, dessen E-Mail-las ich vor ein paar Wochen hat 608 00:38:23,610 --> 00:38:25,860 seine Schwester Fotografien erholen. 609 00:38:25,860 --> 00:38:30,300 Warum nehmen wir nicht einen 5-minütigen Pause hier, und wir werden mit mehr Speicher neu zu gruppieren. 610 00:38:33,030 --> 00:38:38,610 Also hier ist, wo die Dinge ein wenig kniffligen bekommen, aber dies ist eine sehr mächtige Schritt 611 00:38:38,610 --> 00:38:40,480 zum Verständnis dieses umso mehr. 612 00:38:40,480 --> 00:38:42,900 Hier ist ein Programm namens pointers.c. 613 00:38:42,900 --> 00:38:45,430 Es ist unter den heutigen Beispielcode. 614 00:38:45,430 --> 00:38:51,280 Beachten Sie, dass in den ersten paar Zeilen 19 bis 22, alles, was wir tun so etwas wie GetString ist 615 00:38:51,280 --> 00:38:54,460 und Zurückgeben einer Adresse, Speichern derselben in n. 616 00:38:54,460 --> 00:38:58,380 Fortan für pset sogar 3, wenn Sie wollen, aber pset 4 und auf 617 00:38:58,380 --> 00:39:01,030 wo Sie anfangen, diese Ausbildung Räder selbst zu nehmen, 618 00:39:01,030 --> 00:39:04,030 es gibt keinen Grund zu behaupten, dass Strings mehr gibt. 619 00:39:04,030 --> 00:39:07,030 Es ist sicherlich in Ordnung, starten Sie einfach sagen char *. 620 00:39:07,030 --> 00:39:12,610 >> Nebenbei, in Online-Referenzen und Bücher, die Sie oft sehen den Stern neben der Variablen. 621 00:39:12,610 --> 00:39:15,600 Vielleicht sehen Sie sogar Räume um beide Seiten davon. 622 00:39:15,600 --> 00:39:17,680 Alle von ihnen sind funktionsgerecht. 623 00:39:17,680 --> 00:39:21,180 Für jetzt aber, wir auf diesem Ansatz zu standardisieren, um super klar 624 00:39:21,180 --> 00:39:24,000 dass char * ist wie gesagt Zeichenzeiger. 625 00:39:24,000 --> 00:39:25,680 Das ist der Datentyp. 626 00:39:25,680 --> 00:39:28,730 Und dann der Name der Variablen s in diesem Fall. 627 00:39:28,730 --> 00:39:31,180 So haben wir einen String bekommen und wir haben es nannte s. 628 00:39:31,180 --> 00:39:35,180 Und dann hier unten bemerken, dass ich tatsächlich tun ein bisschen Betrug. 629 00:39:35,180 --> 00:39:39,080 Dies wird Pointer-Arithmetik, welche Art von super einfach aufgerufen wird. 630 00:39:39,080 --> 00:39:41,790 Es bedeutet nur, addieren und subtrahieren Zahlen Zeiger. 631 00:39:41,790 --> 00:39:43,660 Aber dies tatsächlich funktioniert. 632 00:39:43,660 --> 00:39:49,170 Dieses Programm scheint druckt die Zeichenfolge s 1 Zeichen pro Zeile, so dass das Endergebnis - 633 00:39:49,170 --> 00:39:54,920 Nur so können wir verderben, wohin dieses geht, machen Zeiger laufen Zeiger, lassen Sie mich hineinzuzoomen 634 00:39:54,920 --> 00:39:58,940 Nun lassen Sie mich geben so etwas wie HALLO und Typ eingeben 635 00:39:58,940 --> 00:40:01,080 und es gibt 1 Zeichen pro Zeile. 636 00:40:01,080 --> 00:40:04,730 Bis vor einer Sekunde, würden wir dies mit eckigen Klammern getan haben. 637 00:40:04,730 --> 00:40:09,760 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 638 00:40:09,760 --> 00:40:11,950 mit einem Backslash n am Ende jeder Zeile. 639 00:40:11,950 --> 00:40:16,800 Aber dieses Programm ist anders. Dieses Programm verwendet, buchstäblich, Arithmetik. 640 00:40:16,800 --> 00:40:18,860 Also, was ist denn hier los? 641 00:40:18,860 --> 00:40:24,720 Zunächst bevor diese Schleife selbst ausführt, was nur klar zu sein, ist tatsächlich s? 642 00:40:24,720 --> 00:40:27,270 S? >> [Schüler] Eine Adresse. >> Eine Adresse. 643 00:40:27,270 --> 00:40:32,980 >> Und es ist die Adresse, im Falle von hallo, das erste Zeichen in dem Wort ist, die H. 644 00:40:32,980 --> 00:40:37,370 Also s ist, in diesem besonderen Beispiel die Adresse h. 645 00:40:37,370 --> 00:40:41,850 Also, was bedeutet es, s do + i? 646 00:40:41,850 --> 00:40:46,280 Nun beginnt i bei 0 in dieser for-Schleife. Wir haben das schon oft getan. 647 00:40:46,280 --> 00:40:49,760 I gehen wird bis zu der Länge des Strings, offensichtlich. 648 00:40:49,760 --> 00:40:53,950 Also bei der ersten Iteration dieser Schleife, i 0 offensichtlich. 649 00:40:53,950 --> 00:41:01,740 So ist dieser Ausdruck sagen s + i - vielmehr s +0--das ist offensichtlich nur s. 650 00:41:01,740 --> 00:41:04,320 Also, was ist * s hier? 651 00:41:04,320 --> 00:41:08,530 Jetzt sind wir mit dem Stern in eine etwas andere Weise. 652 00:41:08,530 --> 00:41:13,080 Lassen Sie mich gehen Sie vor und loszuwerden t, weil wir getan reden t und Kopien s. 653 00:41:13,080 --> 00:41:15,540 Jetzt wollen wir nur eine Geschichte, die s erzählen. 654 00:41:15,540 --> 00:41:20,090 Und so in diesem Moment, nachdem Typ string, sieht unsere Welt ganz wie es zuvor 655 00:41:20,090 --> 00:41:26,630 mit nur s Speichern der Adresse h und ganz allgemein zeigend auf der Saite Hallo. 656 00:41:26,630 --> 00:41:33,170 Wenn ich jetzt eine Zeile wie * (s + i), lasst uns das auszuprobieren. 657 00:41:33,170 --> 00:41:40,140 So * (s + i). Lassen Sie mich zu vereinfachen, weil dies 0, so ist dies * (s +0). 658 00:41:40,140 --> 00:41:43,790 Nun, warten Sie eine Minute. Weiter vereinfachen. Dies ist * (n). 659 00:41:43,790 --> 00:41:47,020 Nun, jetzt die Klammern Art dumm sind, so dass nun lasst uns einfach tun * s. 660 00:41:47,020 --> 00:41:50,540 Also in der ersten Iteration von dieser Schleife, die Linie, die ist hervorgehoben, 26, 661 00:41:50,540 --> 00:41:53,650 ist so ziemlich gleichwertig Bedrucken dies. 662 00:41:53,650 --> 00:41:56,040 Was ist der Datentyp * s? 663 00:41:56,040 --> 00:42:00,770 In diesem Zusammenhang, da die Sterne zufällig neben dem s selbst sein, 664 00:42:00,770 --> 00:42:04,930 sondern insbesondere, weil wir nicht mehr erklären s, 665 00:42:04,930 --> 00:42:09,730 wir sind nicht die Schaffung eines variablen mehr, es gibt keine Erwähnung von char * in Zeile 26, 666 00:42:09,730 --> 00:42:14,280 es gibt keine Erwähnung der Schlüsselwort string, sind wir nur mit einer Variable namens s, 667 00:42:14,280 --> 00:42:19,650 es stellt sich heraus jetzt die Sterne etwas anderes hat und, zugegebenermaßen, verwirrend Bedeutung. 668 00:42:19,650 --> 00:42:26,590 * S bedeutet hier rufen Sie die Adresse in s und Druck, was da ist. 669 00:42:26,590 --> 00:42:33,750 So s hier ist, ist * s - Art wie Rutschen und Leitern, folgen Sie dem Pfeil - hier. 670 00:42:33,750 --> 00:42:35,850 Also das ist * s. 671 00:42:35,850 --> 00:42:39,060 >> Was also wird bei der ersten Iteration der Schleife in der Leitung 26 gedruckt? 672 00:42:39,060 --> 00:42:42,170 Drucke ich% c, die Platzhalter für ein Zeichen ist, 673 00:42:42,170 --> 00:42:48,520 dann ein \ n für eine neue Zeile. * (S + i), wobei i 0 ist genau dies. 674 00:42:48,520 --> 00:42:53,670 Also, was char mache ich Platz für% c? H. 675 00:42:53,670 --> 00:42:56,900 In der nächsten Iteration der Schleife - kann man wohl sehen, wohin das führt - 676 00:42:56,900 --> 00:43:01,350 die nächste Iteration i 1 ist offensichtlich, so bedeutet dies, s +1, 677 00:43:01,350 --> 00:43:05,580 und dann jetzt ich brauche die Klammern, weil jetzt der Stern muss sagen, 678 00:43:05,580 --> 00:43:08,620 gehen Speicheradresse s +1. 679 00:43:08,620 --> 00:43:14,170 Was ist s? Lassen Sie uns rollen zurück in der Zeit und sagen dieser Pfeil ist nun eigentlich nicht tun uns keinen Gefallen. 680 00:43:14,170 --> 00:43:18,450 Lasst uns genauer sagen, dass dies ist das Speichern der Zahl 123 681 00:43:18,450 --> 00:43:25,110 weil der Beginn dieser Zeichenfolge hallo, ist diese Adresse 123, ist dies 124, und so weiter. 682 00:43:25,110 --> 00:43:30,550 Also auf der zweiten Iteration, wenn ich sage, s +1, das ist wie gesagt 123 ein, 683 00:43:30,550 --> 00:43:35,340 sonst als 124 bekannt, so was char auf dem zweiten Iteration wird gedruckt? 684 00:43:35,340 --> 00:43:37,850 E an der Speicheradresse 124. 685 00:43:37,850 --> 00:43:44,440 Dann + wieder, 125, 126, 127, und diese Schleife zum Glück stoppt, bevor wir hier bekommen 686 00:43:44,440 --> 00:43:49,040 weil ich bin mit strlen, um sicherzustellen, dass ich nicht gezählt zu hoch. 687 00:43:49,040 --> 00:43:50,810 So auch das ist es. 688 00:43:50,810 --> 00:43:55,000 Auch dies ist so, als ob wir vor einer Woche getan. 689 00:43:55,000 --> 00:43:59,200 Lassen Sie mich schreiben Sie es auf die Zeile unter, obwohl wir nicht wollen, beides zu tun. 690 00:43:59,200 --> 00:44:02,500 Dies ist identisch nun dazu. 691 00:44:02,500 --> 00:44:08,310 >> Also auch wenn s ein String ist, wie wir gefordert haben es seit Wochen, ist s wirklich ein char *. 692 00:44:08,310 --> 00:44:13,270 Also, wenn wir zu super anal sein wollen, ist es wirklich richtig, den besonderen Charakter schreiben 693 00:44:13,270 --> 00:44:17,490 bei der i-ten Stelle mit diesen numerischen Adressen und diesen Stern-Operator, 694 00:44:17,490 --> 00:44:20,470 aber ehrlich gesagt, das ist nur so viel sauberer. Also das ist nicht schlecht. 695 00:44:20,470 --> 00:44:26,720 Kein Grund, damit aufzuhören Linie 27 hier, aber 26 ist funktional gleich, 696 00:44:26,720 --> 00:44:31,570 und es ist funktional gleich aus genau den Gründen, dass wir schon so weit zu diskutieren. 697 00:44:31,570 --> 00:44:33,650 Und schließlich ist 29 nur eine gute Praxis. 698 00:44:33,650 --> 00:44:38,420 Aufruf frei von s bedeutet, dass jetzt gibst du die Erinnerung, dass GetString gab dir 699 00:44:38,420 --> 00:44:41,630 weil wieder, wie ich bereits erwähnt Montag, GetString Wochen 700 00:44:41,630 --> 00:44:44,180 wurde die Einführung eines Fehlers in Ihren Code. 701 00:44:44,180 --> 00:44:46,490 Ihr Code seit Wochen Speicherlecks hatten 702 00:44:46,490 --> 00:44:49,970 wobei Sie haben gefragt GetString für Speicher, aber Sie haben nie geben es zurück. 703 00:44:49,970 --> 00:44:53,410 Und das wurde bewusst von uns gewählten pädagogisch 704 00:44:53,410 --> 00:44:55,880 weil es einfach zu viel zu früh auf zu denken. 705 00:44:55,880 --> 00:44:57,710 Aber jetzt brauchen wir mehr Symmetrie. 706 00:44:57,710 --> 00:45:00,830 Wenn Sie den Computer stellen für Speicher, wie es der Fall für die GetString, 707 00:45:00,830 --> 00:45:02,820 wie es der Fall offenbar malloc, 708 00:45:02,820 --> 00:45:07,970 Sie müssen nun für pset 4 Weiterreise auch kostenlos ein solcher Speicher. 709 00:45:07,970 --> 00:45:11,650 Beachten Sie dies anders zu sagen int n. 710 00:45:11,650 --> 00:45:15,040 Sie brauchen nicht, dies zu befreien, weil du nicht angerufen hast GetString 711 00:45:15,040 --> 00:45:16,890 und du hast nicht angerufen malloc. 712 00:45:16,890 --> 00:45:20,610 >> Und selbst wenn Sie angerufen GetInt als wir schließlich sehen, 713 00:45:20,610 --> 00:45:25,520 GetInt keinen Speicher für Sie, weil Sie tatsächlich passieren kann rund Zahlen 714 00:45:25,520 --> 00:45:29,430 und schwimmt und Zeichen genau so, wie wir uns seit Wochen habe tun. 715 00:45:29,430 --> 00:45:33,960 Strings sind jedoch etwas Besonderes, weil sie wirklich die Verkettung von mehreren chars sind. 716 00:45:33,960 --> 00:45:37,450 So sind sie eben anders aus chars und schwimmt und ints und dergleichen. 717 00:45:37,450 --> 00:45:39,980 Aber kommen wir zurück zu dieser vor langer. 718 00:45:39,980 --> 00:45:44,920 Fragen dann auf dieser Anfang von Zeigern? Yeah. 719 00:45:44,920 --> 00:45:49,690 [Unverständlich Studenten stellen] 720 00:45:49,690 --> 00:45:51,440 Ah, sehr gute Frage. 721 00:45:51,440 --> 00:45:55,790 Eines der wenigen Dinge, C tatsächlich für Sie, ist die bequeme, 722 00:45:55,790 --> 00:46:00,110 ist es herausfindet, für Sie, was die Größe des Datentyps 723 00:46:00,110 --> 00:46:03,060 und dann tut diese Art der Vermehrung für Sie. 724 00:46:03,060 --> 00:46:06,610 Dies ist irrelevant im Fall von Zeichen, weil fast immer ein Zeichen ist 1 Byte, 725 00:46:06,610 --> 00:46:08,150 so dass diese einfach funktioniert. 726 00:46:08,150 --> 00:46:11,220 Aber im Interesse der Diskussion, ob man tatsächlich Drucken Zahlen 727 00:46:11,220 --> 00:46:15,500 und Sie versuchen zu drucken einen Wert s, die bei einem ganzzahligen verwies, 728 00:46:15,500 --> 00:46:20,720 Sie ähnlich müssten nicht + 4 do * i, nur weil ein int 4 Byte. 729 00:46:20,720 --> 00:46:25,780 Zeigerarithmetik bedeutet, dass C und der Compiler alle, dass Mathematik für Sie tun. 730 00:46:25,780 --> 00:46:29,190 Alles, was Sie zu kümmern ist das Zählen in eine Art der menschlichen Sinne. Yeah. 731 00:46:29,190 --> 00:46:35,200 [Schüler] Wenn Sie eine Zeichenfolge erklären Inneren eine for-Schleife, haben Sie später befreien? 732 00:46:35,200 --> 00:46:36,760 Gute Frage. 733 00:46:36,760 --> 00:46:41,390 >> Wenn Sie eine Zeichenfolge innerhalb der for-Schleife deklariert, brauchen Sie, um sie später zu befreien? 734 00:46:41,390 --> 00:46:47,520 Sie brauchen nur, um Speicher freizugeben, dass Sie mit GetString oder mit malloc reservieren. 735 00:46:47,520 --> 00:46:53,110 Also, wenn Sie gerade etwas sagen wollen - lassen Sie mich geschweiften Klammern jetzt so der gesamte Code verwandt ist. 736 00:46:53,110 --> 00:46:58,580 Wenn Sie etwas, wenn auch buggily, wie dies tat, char * t = s, 737 00:46:58,580 --> 00:47:03,450 Sie nicht zu kostenlosen T brauchen, weil t ohne Einbeziehung jede Erwähnung von malloc oder GetString. 738 00:47:03,450 --> 00:47:08,960 Wenn dagegen Sie dies getan haben, GetString, dann ja, möchten Sie kostenlos t brauchen. 739 00:47:08,960 --> 00:47:14,350 Und in der Tat ist Ihre einzige Chance, das zu tun jetzt in dieser Schleife für das gleiche Problem Spielraum 740 00:47:14,350 --> 00:47:16,060 dass wir in der Vergangenheit diskutiert. 741 00:47:16,060 --> 00:47:18,830 Sonst würdest Zuweisen von Speicher, Zuweisen von Speicher, Zuweisen von Speicher, 742 00:47:18,830 --> 00:47:21,230 und am Ende des Programms, weil Sie sich außerhalb der Schleife, 743 00:47:21,230 --> 00:47:24,240 t existiert nicht, aber man kann nie gesagt, das Betriebssystem 744 00:47:24,240 --> 00:47:26,750 dass Sie nicht brauchen, dass der Speicher nicht mehr. 745 00:47:26,750 --> 00:47:30,430 Und es dauerte nicht lange, für pset 4 oder 5 werden wir Sie mit einem Programm namens Valgrind auszustatten, 746 00:47:30,430 --> 00:47:34,160 was im Geiste gleich GDB, dass es etwas ist von einem geheimnisvollen Schnittstelle haben, 747 00:47:34,160 --> 00:47:35,750 aber ihr Zweck im Leben ist, Ihnen zu helfen. 748 00:47:35,750 --> 00:47:39,380 Und Valgrind ist ein Programm, das in der Zukunft suchen werden Ihre Programme 749 00:47:39,380 --> 00:47:42,550 Suche nach Speicherlecks, ob von GetString oder malloc, 750 00:47:42,550 --> 00:47:47,800 welche wir beginnen mit umso mehr, als wir mit der CS50-Bibliothek so viel zu stoppen. 751 00:47:47,800 --> 00:47:53,030 Wir haben endlich haben jetzt eine Art der Wortschatz und die Art der mentalen Modells in der Theorie 752 00:47:53,030 --> 00:47:55,170 mit denen diese gebrochenen Programm zu lösen. 753 00:47:55,170 --> 00:47:59,410 >> Also in diesem gebrochenen Programms arbeitet Swap Innenseite swap, 754 00:47:59,410 --> 00:48:05,280 aber es nie wirklich in den wichtigsten funktionierte, weil wichtigsten bestanden in x-und y-, Rückruf, 755 00:48:05,280 --> 00:48:07,260 und die wurden von übergebenen Werte, so zu sprechen. 756 00:48:07,260 --> 00:48:09,330 Kopien von ihnen gegeben wurden, um zu tauschen. 757 00:48:09,330 --> 00:48:12,520 Bis zum Ende des Swap hatte a und b der Tat ausgetauscht worden, 758 00:48:12,520 --> 00:48:16,120 aber natürlich x und y, wie wir am Montag diskutiert, war nicht. 759 00:48:16,120 --> 00:48:19,940 Also habe ich in grün hier vorschlagen, dass dies tatsächlich ist hier die Lösung. 760 00:48:19,940 --> 00:48:22,640 Und tatsächlich, lassen Sie mich zu bewegen meinen Sternen nur konsequent zu sein 761 00:48:22,640 --> 00:48:24,440 obwohl wiederum funktionell ist dies nicht relevant. 762 00:48:24,440 --> 00:48:28,730 In den kommenden Wochen werden wir erklären, wann und warum es nicht egal. 763 00:48:28,730 --> 00:48:30,600 So grün ist jetzt eine Lösung. 764 00:48:30,600 --> 00:48:33,700 Ehrlich gesagt, sieht es eine ganze Menge chaotischer, weil ich all diese Sterne haben. 765 00:48:33,700 --> 00:48:35,380 Lassen Sie mich darauf hinweisen, eine Sache. 766 00:48:35,380 --> 00:48:40,040 Die obere Linie hier, wo es heißt int * a und int * b 767 00:48:40,040 --> 00:48:42,820 ist grundsätzlich das gleiche tun, wie es schon immer. 768 00:48:42,820 --> 00:48:47,070 Es wird erklärt 2 Argumente oder Parameter zu tauschen, 769 00:48:47,070 --> 00:48:49,940 von denen das erste ein int Zeiger genannt, 770 00:48:49,940 --> 00:48:53,100 von denen die zweite ist ein int Zeiger namens b. 771 00:48:53,100 --> 00:48:55,770 Das einzige, was ist neu an dieser Stelle ist die Tatsache, dass es einen Stern gibt. 772 00:48:55,770 --> 00:48:59,340 >> Was bedeutet das? A ist nicht ein int ist b kein int. 773 00:48:59,340 --> 00:49:04,100 A ist die Adresse eines int ist und b die Adresse eines anderen int. 774 00:49:04,100 --> 00:49:06,980 Hier unten ist, wo gebe ich C erhält verwirrend. 775 00:49:06,980 --> 00:49:09,790 Jetzt verwenden wir einen Stern, aber es hat andere Bedeutung in diesem Zusammenhang. 776 00:49:09,790 --> 00:49:13,150 Weil wir nicht erklären Zeigern, wie wir hier sind, 777 00:49:13,150 --> 00:49:15,500 hier sind wir Dereferenzierung Dinge. 778 00:49:15,500 --> 00:49:21,520 Technisch so, der Stern in diesem Zusammenhang der erste, zweite und dritte Linie Innenseite Swap 779 00:49:21,520 --> 00:49:24,560 wird die Dereferenzierungsoperator, die bedeutet nur, dorthin zu gehen. 780 00:49:24,560 --> 00:49:27,400 So wie meine Finger folgten den Pfeil h, 781 00:49:27,400 --> 00:49:31,100 * Ein Mittel an diese Adresse gehen und mir die int, die es gibt. 782 00:49:31,100 --> 00:49:34,250 * B Mittel an die Adresse gehen und gib mir, was da ist. 783 00:49:34,250 --> 00:49:40,730 Also lasst uns neu zu zeichnen das Bild von Montag jetzt mit einem Stapel von Bildern, 784 00:49:40,730 --> 00:49:43,130 der Boden eine davon sein wird Hauptsache 785 00:49:43,130 --> 00:49:47,600 der obere davon wird Swap sein, 786 00:49:47,600 --> 00:49:50,880 so dass unsere Welt aussieht, wie Montag, wie diese. 787 00:49:50,880 --> 00:49:53,620 Hier ist ein Stück Erinnerung, dass Haupt verwenden wird. 788 00:49:53,620 --> 00:49:56,520 >> Recall von Montag, dass das Programm gerade 2 Variablen, 789 00:49:56,520 --> 00:50:01,930 nannte man x und ein als y, und ich hatte Legen Sie die Nummern 1 und 2 gibt. 790 00:50:01,930 --> 00:50:06,580 Nun, wenn ich wechseln, wie rufe ich habe am Montag, 791 00:50:06,580 --> 00:50:11,000 zuvor, wenn ich die rote Version des Programms verwendet, sieht das wie folgt aus, 792 00:50:11,000 --> 00:50:17,470 Ich habe 2 Parameter, a und b, und was haben wir hier und hier schreiben? 793 00:50:17,470 --> 00:50:21,160 Nur 1 und 2, wörtlich kopiert von x und y. 794 00:50:21,160 --> 00:50:23,070 Heute haben wir das ändern. 795 00:50:23,070 --> 00:50:28,510 Heute statt der Übergabe in ints a und b werden wir in 2-Adressen passieren. 796 00:50:28,510 --> 00:50:34,290 Diese Adressen geschieht auf ints zeigen, aber diese Adressen werden nicht ints sich. 797 00:50:34,290 --> 00:50:37,330 Sie sind Adressen. Es ist wie eine Postanschrift statt. 798 00:50:37,330 --> 00:50:40,580 So, jetzt müssen wir nur geben mir ein wenig mehr Details auf dem Bildschirm. 799 00:50:40,580 --> 00:50:43,250 Das ist mein Arbeitsspeicher des Computers, wie es war den ganzen Tag. 800 00:50:43,250 --> 00:50:45,120 Jetzt brauchen wir eine willkürliche Nummerierung. 801 00:50:45,120 --> 00:50:50,580 So lasst uns einfach sagen, nur durch Zufall, dass dieser Speicher-Adresse 123, 124 ist. 802 00:50:50,580 --> 00:50:55,660 Lasst uns einfach sagen, das ist 125, das ist 126, und so weiter, aber das ist völlig willkürlich. 803 00:50:55,660 --> 00:50:58,590 Wir brauchen nur etwas Numerierung in meiner Erinnerung. 804 00:50:58,590 --> 00:51:04,030 So wenn ich jetzt tatsächlich passieren in x-und y, ich werde nicht in x-und y passieren; 805 00:51:04,030 --> 00:51:08,400 Ich werde in der Postanschrift passieren, so zu sprechen, von x und y 806 00:51:08,400 --> 00:51:11,870 so dass das, was hier und hier gespeichert ist, nicht 1 und 2, 807 00:51:11,870 --> 00:51:16,030 aber wenn du mein kleiner Text sehen kann, bekommt, was hier und hier passiert? 808 00:51:16,030 --> 00:51:23,340 [Unverständlich Student Response] >> Genau. 123 wird hier und legte 124 wird hier setzen. 809 00:51:23,340 --> 00:51:28,910 >> Nun, da habe ich die Sterne in dieser ersten Zeile Weg bis hier oben, 810 00:51:28,910 --> 00:51:34,340 mein Programm weiß nur, dass 123 und 124, obwohl sie offensichtlich sind Zahlen 811 00:51:34,340 --> 00:51:40,160 dass jeder Mensch konnte bemerken, sollten sie als Adressen, numerischen Adressen interpretiert werden. 812 00:51:40,160 --> 00:51:43,250 Sie sind nicht an und für sich ints, sie sind Adressen, 813 00:51:43,250 --> 00:51:46,120 und das ist, weil ich explizit gesetzt haben die Sterne dort. 814 00:51:46,120 --> 00:51:51,360 So nun meine erste, zweite und dritte Zeile der eigentliche Code, was passiert hier? 815 00:51:51,360 --> 00:51:53,380 Ziehen wir den Rest des Bildes. 816 00:51:53,380 --> 00:51:56,980 Tmp ist wie es war am Montag. Nichts Besonderes tmp. 817 00:51:56,980 --> 00:52:03,060 Es ist nur eine lokale 32-Bit-Variable, und innerhalb davon bin ich anscheinend Speichern des Wertes * a. 818 00:52:03,060 --> 00:52:08,580 Nun, wenn ich gerade gesagt tmp = a, was würde ich hier setzen? >> [Schüler] 123. 819 00:52:08,580 --> 00:52:10,370 123. Aber das ist nicht das, was ich tue. 820 00:52:10,370 --> 00:52:13,670 Ich sage tmp = * a. Ein Stern bedeutet, dorthin zu gehen. 821 00:52:13,670 --> 00:52:19,370 Also hier ist ein, 123. Wie gehe ich da? So tun, wie es ist ein Pfeil. 822 00:52:19,370 --> 00:52:24,460 Nun, da ist es, 1. Also, was wird in tmp gespeichert, offenbar? Nur 1. 823 00:52:24,460 --> 00:52:29,620 Also mit anderen Worten, ist tmp * a, * ein Mittel gehen an die Adresse, die derzeit in a, 824 00:52:29,620 --> 00:52:31,320 was offenbar 123. 825 00:52:31,320 --> 00:52:33,910 >> Okay, hier sind wir am Standort 123 sind, sehe ich die Nummer 1, 826 00:52:33,910 --> 00:52:35,670 so werde ich die Nummer 1 dort abzulegen. 827 00:52:35,670 --> 00:52:39,020 Nun, was kann ich in Zeile 2 zu tun, * a = * b? 828 00:52:39,020 --> 00:52:44,570 Dieser ist ein wenig komplizierter, denn nun was ist ein? Es ist 123. 829 00:52:44,570 --> 00:52:50,220 So * a ist wo? Genau dort, wo ich vorher war. So dorthin gehen. Okay. 830 00:52:50,220 --> 00:52:53,420 Jetzt, endlich, und dann schließlich diese beginnt Sinn zu machen, hoffentlich, 831 00:52:53,420 --> 00:53:00,280 * B bedeutet, was in b? 124. Also muss ich dorthin gehen, die 2. 832 00:53:00,280 --> 00:53:03,430 Also, was stelle ich wo? 833 00:53:03,430 --> 00:53:10,100 2 geht in hier, weil * b geht in * a. Also werde ich das tun. 834 00:53:10,100 --> 00:53:13,120 Und schon können Sie sehen, vielleicht, dass wir so viel näher sind 835 00:53:13,120 --> 00:53:17,710 zur Lösung dieses dumme, einfache Problem richtig zum ersten Mal 836 00:53:17,710 --> 00:53:20,920 denn jetzt haben wir noch eine Erinnerung an das x war, 837 00:53:20,920 --> 00:53:23,230 haben wir 2 Kopien, zugegebenermaßen, von y, 838 00:53:23,230 --> 00:53:25,850 aber der Linie 3 jetzt sagt * b. 839 00:53:25,850 --> 00:53:31,080 Also hier ist b. * B Mittel dorthin zu gehen. Also, wo ist die Lage 124? 840 00:53:31,080 --> 00:53:35,560 Es ist offenbar hier. Also, was ich hier setzen? Offensichtlich tmp. 841 00:53:35,560 --> 00:53:39,600 So jetzt habe ich dies tun. Also habe ich ein hier und 2 hier. 842 00:53:39,600 --> 00:53:43,560 Und nun, was über all dies, die 123, die 124 und die 1? 843 00:53:43,560 --> 00:53:47,910 Sobald Swap zurückkehrt, ist dieser Speicher so gut wie verloren 844 00:53:47,910 --> 00:53:51,070 denn sobald Swap kehrt das Betriebssystem 845 00:53:51,070 --> 00:53:54,190 steht es frei, dass der Speicher wieder verwenden in der Zukunft. 846 00:53:54,190 --> 00:53:58,870 Nur Haupt-Speicher im unteren Bereich dieser sogenannten Stack steckt herum. 847 00:53:58,870 --> 00:54:01,470 >> Und so haben wir endlich nun eine funktionierende Version. 848 00:54:01,470 --> 00:54:06,310 Lassen Sie mich in swap.c gehen, und beachten Sie die folgenden. 849 00:54:06,310 --> 00:54:11,280 An der Spitze des Programms Ich habe mich verändert mein Prototyp zu sein int * a und int * b. 850 00:54:11,280 --> 00:54:15,000 So ist die einzige Sache, die ich geändert, um von Rot, was schlecht war, auf grün, was gut ist zu gehen, 851 00:54:15,000 --> 00:54:17,350 ist habe ich diese Sterne heute. 852 00:54:17,350 --> 00:54:21,520 Aber dann hier unten in Swap selbst. Ich musste kopieren, einfügen, was war nur auf der Folie. 853 00:54:21,520 --> 00:54:24,140 Ich habe ein Star hier, Stern -, dass entspricht dem Prototyp - 854 00:54:24,140 --> 00:54:27,930 und dann all diese Dinge haben jetzt stars außer tmp 855 00:54:27,930 --> 00:54:30,680 weil die Verwendung von einer temporären Variablen, gibt es nichts Neues gibt. 856 00:54:30,680 --> 00:54:33,040 Ich brauche nur temporärer Speicher für ein int. 857 00:54:33,040 --> 00:54:34,820 So brauchen wir nicht einen Stern gibt. 858 00:54:34,820 --> 00:54:39,310 Wir brauchen nur den Stern, so dass wir diese Art von willkürliche Grenze überqueren können 859 00:54:39,310 --> 00:54:42,900 zwischen diesen 2 Bildern in meinem Arbeitsspeicher des Computers. 860 00:54:42,900 --> 00:54:45,630 Aber eine letzte Sache muss sich ändern, und Sie können es erblickte bereits. 861 00:54:45,630 --> 00:54:48,810 Was andere Linie ist offensichtlich jetzt anders? >> [Schüler] & x. 862 00:54:48,810 --> 00:54:53,270 >> Ja, das ist so 25 die letzte Zeile des Codes muss ich für diese Änderung zu arbeiten. 863 00:54:53,270 --> 00:54:58,360 Vor einer Woche und sogar am Montag Zeile 25 so aussah, tauschen x und y, 864 00:54:58,360 --> 00:55:02,020 Und das war nur gebrochen, weil, wenn Sie sagen, swap (x, y) 865 00:55:02,020 --> 00:55:05,660 Sie geben Kopien von x und y zu tauschen, dann tut seine Sache, 866 00:55:05,660 --> 00:55:09,080 aber du bist nie wirklich ändern x und y sich. 867 00:55:09,080 --> 00:55:12,880 Also selbst wenn Sie noch nie dieses Zeichen vor dem Zeichen im Code gesehen, 868 00:55:12,880 --> 00:55:15,860 nur zu erraten. Was bedeutet das kaufmännische tun, offenbar? 869 00:55:15,860 --> 00:55:17,890 [Schüler] vertritt die Adresse. >> Vertritt die Adresse. 870 00:55:17,890 --> 00:55:21,160 So das kaufmännische sagt mir die Adresse von x. 871 00:55:21,160 --> 00:55:25,590 Wer weiß, wo es ist? Es passiert zu 123 sein. Es ist mir egal. Gib mir die Adresse von x. 872 00:55:25,590 --> 00:55:28,340 & Y bedeutet mir die Adresse von y. 873 00:55:28,340 --> 00:55:34,450 Und an diesem Punkt der Geschichte ist perfekt im Einklang mit dem Bild, das wir zogen vor einem Augenblick. 874 00:55:34,450 --> 00:55:38,310 >> Also ich gebe Hinweise, natürlich für mich, wenn ich anfing zu lernen diese, 875 00:55:38,310 --> 00:55:40,570 waren definitiv eines der schwierigsten Dinge, die mir in den Sinn herum wickeln. 876 00:55:40,570 --> 00:55:43,760 Aber klar, zumal wir das Spiel mit dieser Art von Dingen zu halten, 877 00:55:43,760 --> 00:55:48,030 wenn Sie es brechen, um diesen super einfache Art intellektuell uninteressant Probleme 878 00:55:48,030 --> 00:55:52,270 nur bewegen Zahlen um, die Antwort auf eine Menge Verwirrung mit Zeigern 879 00:55:52,270 --> 00:55:56,590 wirklich von diesen sehr grundlegenden Mechanik abgeleitet werden. 880 00:55:56,590 --> 00:55:59,070 Hier ist eine Adresse. Gehen Sie dort mit dem Stern. 881 00:55:59,070 --> 00:56:03,830 Oder umgekehrt, hier ist ein kaufmännisches. Finde heraus, was die Adresse tatsächlich ist. 882 00:56:03,830 --> 00:56:06,270 Gut. 883 00:56:06,270 --> 00:56:09,000 Also, wo ist all diesen Speicher aus? 884 00:56:09,000 --> 00:56:12,360 Wir haben gezogenen dieses Bild ein paar Mal, und ich halte viel versprechende kommen wir wieder dazu, 885 00:56:12,360 --> 00:56:14,920 aber hier ist die Darstellung der Arbeitsspeicher Ihres Computers 886 00:56:14,920 --> 00:56:17,420 das ist ein wenig mehr als unsere Tafel beschriftet ist hier. 887 00:56:17,420 --> 00:56:21,590 Der Text-Segment an der Spitze steht, was in Bezug auf Ihr Programm? 888 00:56:21,590 --> 00:56:26,090 [Unverständlich Student Response] >> Sorry? Sage es noch einmal. 889 00:56:26,090 --> 00:56:28,660 [Schüler] Das eigentliche Programm. >> Das eigentliche Programm. 890 00:56:28,660 --> 00:56:32,430 >> So ist die 0 und 1, dass Sie nach dem Schreiben C-Code kompiliert und dann ausgeführt Clang 891 00:56:32,430 --> 00:56:35,910 und Erzeugung 0s und 1s endet immer dort im Speicher versteckt 892 00:56:35,910 --> 00:56:38,570 denn wenn Sie einen Doppelklick auf ein Symbol auf Ihrem Mac oder PC 893 00:56:38,570 --> 00:56:43,010 oder führen Sie einen Befehl wie mario auf Ihre Aufforderung, Ihre 0s und 1s von der Festplatte 894 00:56:43,010 --> 00:56:45,700 in den Speicher geladen zu werden, so dass der Computer zu manipulieren können 895 00:56:45,700 --> 00:56:47,540 und führen sie schneller. 896 00:56:47,540 --> 00:56:50,880 So initialisierte Daten und nicht initialisierte Daten werden wir nicht viel über diejenigen, 897 00:56:50,880 --> 00:56:52,420 aber das sind nur globale Variablen. 898 00:56:52,420 --> 00:56:54,710 Initialisiert bedeutet, globale Variablen, die Sie Werte gab; 899 00:56:54,710 --> 00:56:59,300 initialisierte bedeutet, globale Variablen, die Sie noch nicht geben Werte an. 900 00:56:59,300 --> 00:57:01,900 Dann gibt es diese Umgebungsvariablen, die ich komplett winken meine Hand werde, 901 00:57:01,900 --> 00:57:04,860 aber sie sind da und speichert Dinge wie Ihren Benutzernamen 902 00:57:04,860 --> 00:57:08,090 und andere Art von niedrigeren Details. 903 00:57:08,090 --> 00:57:12,880 Aber die saftigsten Stücke von Ihrem Gedächtnis-Layout ist dieses Ding namens Stack und der Heap. 904 00:57:12,880 --> 00:57:17,470 Der Stapel wieder klar zu sein, ist der Speicher, die verwendet werden, wenn Funktionen aufgerufen werden ist, 905 00:57:17,470 --> 00:57:19,710 immer dann, wenn lokale Variablen 906 00:57:19,710 --> 00:57:22,120 und wann gibt es Parameter, die herumgereicht. 907 00:57:22,120 --> 00:57:24,490 All das geschieht in dem Stapel. 908 00:57:24,490 --> 00:57:29,570 Der Haufen haben wir nicht gesprochen, aber nehmen Sie eine Vermutung, die den Heap verwendet. 909 00:57:31,120 --> 00:57:32,690 Nur ein anderes Stück der Erinnerung. 910 00:57:32,690 --> 00:57:36,620 Es passiert hier oben gezogen werden, aber das ist eine willkürliche bildnerischen Konvention. 911 00:57:36,620 --> 00:57:41,670 Wer offenbar mit Speicher aus dem Heap für Woche? 912 00:57:41,670 --> 00:57:44,830 Es ist technisch möglich, aber indirekt. >> [Schüler] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString und malloc. Also hier ist der grundlegende Unterschied. 914 00:57:47,950 --> 00:57:51,300 >> Sie wissen, in den letzten paar Wochen, wenn Sie Speicher benötigen, nur eine Variable deklarieren. 915 00:57:51,300 --> 00:57:54,560 Wenn Sie sehr viel Speicher benötigen, ein Array deklarieren direkt in Ihrer Funktion. 916 00:57:54,560 --> 00:57:59,620 Aber das Problem, das wir immer mit Blick habe, ist, wenn Sie Variablen lokal innerhalb von Funktionen, 917 00:57:59,620 --> 00:58:05,340 Sobald die Funktion zurückkehrt, was passiert mit dem Speicher und den Variablen? 918 00:58:05,340 --> 00:58:09,620 Nur eine Art ist es nicht mehr dir, nicht wahr? Es verschwindet einfach Art konzeptionell. 919 00:58:09,620 --> 00:58:13,950 Es ist immer noch physisch da, natürlich, aber es ist nicht mehr Ihr Recht zur Verwendung. 920 00:58:13,950 --> 00:58:17,160 Dies ist natürlich problematisch, wenn Sie die Funktionen im Leben schreiben wollen 921 00:58:17,160 --> 00:58:20,440 tatsächlich Speicher zuweisen und geben Sie es nicht sofort zurück. 922 00:58:20,440 --> 00:58:24,180 Case in point: GetString den Zweck im Leben ist, keine Ahnung im Voraus haben 923 00:58:24,180 --> 00:58:26,390 wie groß der String werde ich über die Tastatur einzugeben bin, 924 00:58:26,390 --> 00:58:30,390 aber es muss in der Lage sein, Speicher zu reservieren, David oder Hallo zu halten 925 00:58:30,390 --> 00:58:32,860 oder eine ganze Abhandlung, dass der Benutzer eingetippt haben 926 00:58:32,860 --> 00:58:35,280 So GetString wurde mit malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc daher müssen nicht mit den Stapel; 928 00:58:38,910 --> 00:58:40,770 Stattdessen ist es mit diesem Ding namens Heap. 929 00:58:40,770 --> 00:58:44,430 Es gibt nichts anderes über den Speicher. Es ist nicht schneller oder langsamer oder so etwas. 930 00:58:44,430 --> 00:58:46,570 Es ist nur physisch an einem anderen Ort. 931 00:58:46,570 --> 00:58:50,120 >> Aber die Regel ist, dass der Speicher, auf dem Heap zugewiesen ist 932 00:58:50,120 --> 00:58:56,180 wird nie von dir weg genommen werden, bis Sie anrufen - take a guess - kostenlos. 933 00:58:56,180 --> 00:59:00,510 Im Gegensatz dazu jede Erinnerung fragen Sie für die auf dem Stapel nur ein Array deklarieren 934 00:59:00,510 --> 00:59:03,320 oder eine Variable deklarieren, wie wir seit Wochen schon dabei sind, 935 00:59:03,320 --> 00:59:05,640 dass standardmäßig landet auf dem Stapel. 936 00:59:05,640 --> 00:59:09,550 Und das funktioniert super 90% der Zeit, aber auf diesen selteneren Gelegenheiten 937 00:59:09,550 --> 00:59:12,470 wo Sie wollen, Speicher zu reservieren und halten Sie sie herum, 938 00:59:12,470 --> 00:59:14,730 dann müssen Sie eine Funktion wie malloc verwenden. 939 00:59:14,730 --> 00:59:19,370 Oder wir haben eine Funktion wie GetString, die wiederum verwendet malloc verwendet. 940 00:59:19,370 --> 00:59:23,300 Mal sehen, wo dies könnte brechen und dann werfen Sie einen Blick auf Binky. 941 00:59:23,300 --> 00:59:25,820 Wir kommen darauf zurück in die Zukunft. 942 00:59:25,820 --> 00:59:29,270 Hier ist ein super einfaches Programm, das in den ersten 2 Zeilen macht was? 943 00:59:29,270 --> 00:59:33,460 In Englisch, was diese ersten 2 Zeilen Code zu tun Innenseite main? 944 00:59:33,460 --> 00:59:35,600 [Unverständlich Studenten Antwort] 945 00:59:35,600 --> 00:59:37,880 Vorsichtig. Es gibt mir nicht die Adresse von x oder y. 946 00:59:37,880 --> 00:59:41,840 [Schüler] Gibt Zeiger auf ints. >> Gut. Gib mir 2 Zeiger auf Integer. 947 00:59:41,840 --> 00:59:45,130 In anderen Worten, gib mir 2 Stücke der Erinnerung, dass ich immer Zeichnung heute 948 00:59:45,130 --> 00:59:46,950 obwohl ich gelöscht es jetzt, als Quadrate. 949 00:59:46,950 --> 00:59:50,000 Gib mir 2 Stücke der Erinnerung, ein x genannt, bezeichnet ein y - 950 00:59:50,000 --> 00:59:54,320 ich früher nannte sie s und t - und was ist der Typ dieses Stück Erinnerung? 951 00:59:54,320 --> 00:59:57,160 Es wird um eine Adresse zu speichern. 952 00:59:57,160 --> 00:59:59,110 Es ist vom Typ int *. 953 00:59:59,110 --> 01:00:01,630 >> So die Adresse einer int wird schließlich in x leben, 954 01:00:01,630 --> 01:00:03,860 die Adresse einer int wird schließlich in y leben, 955 01:00:03,860 --> 01:00:08,460 aber zunächst, was drin von x und y? Wer weiß? Garbage Werte. 956 01:00:08,460 --> 01:00:10,180 Es hat nichts mit Zeigern zu tun. 957 01:00:10,180 --> 01:00:12,720 Wenn wir nicht genommen etwas gibt, wer was ist eigentlich es weiß? 958 01:00:12,720 --> 01:00:18,950 Nun x. Was passiert hier? Dies ist legit jetzt, weil x ist ein Zeiger. Es ist ein int *. 959 01:00:18,950 --> 01:00:21,870 Das heißt also, ich kann in x gesetzt die Adresse einiger Stück Speicher. 960 01:00:21,870 --> 01:00:25,120 Was bedeutet malloc zurückkehren? Perfekt, gibt es Adressen, 961 01:00:25,120 --> 01:00:28,510 die Adresse des ersten Bytes in einem ganzen Stück Speicher. 962 01:00:28,510 --> 01:00:31,140 Wie viele Bytes wird diese scheinbar Zuteilen beispielsweise in dem Gerät? 963 01:00:31,140 --> 01:00:33,510 Was ist in der Größe eines int? 4. 964 01:00:33,510 --> 01:00:36,600 Wenn Sie zurück zu Woche 1 denke, es ist nicht super wichtig, immer daran denken, dass 965 01:00:36,600 --> 01:00:38,870 aber in diesem Fall ist es nützlich zu wissen, 4 Bytes. 966 01:00:38,870 --> 01:00:41,770 So ist dies auf dem Heap 4 Byte Zuteilung 967 01:00:41,770 --> 01:00:46,110 und es ist Rücksenden der Adresse des ersten zu mir beliebig. 968 01:00:46,110 --> 01:00:47,700 Nun, was ist x zu tun? 969 01:00:47,700 --> 01:00:52,200 A * x = 42 ist zu tun, was? 970 01:00:52,200 --> 01:00:57,150 Wenn an diesem Punkt in der Geschichte haben wir x, die wie folgt aussieht mit einigen Müll Wert, 971 01:00:57,150 --> 01:01:04,120 dies ist nun y mit einigen Müll-Wert, jetzt in Zeile 3 Ich habe 4 Byte zugeordnet. 972 01:01:04,120 --> 01:01:06,950 Dieses Bild im wesentlichen wie folgt aussieht. 973 01:01:06,950 --> 01:01:12,010 Oder genauer gesagt, wenn dies beliebige Adresse 123, das ist, was unsere Geschichte jetzt aussieht. 974 01:01:12,010 --> 01:01:23,940 * X = 42 bedeutet jetzt was? Das bedeutet, rufen Sie die Adresse 123 und beziffern die Zahl 42 gibt. 975 01:01:23,940 --> 01:01:26,220 Ich brauche nicht diese Linien zu zeichnen, weil wir nicht tun Saiten. 976 01:01:26,220 --> 01:01:29,480 >> Ich sollte gerade geschrieben haben es so, und nur zur Demonstration willen, 977 01:01:29,480 --> 01:01:33,240 42 als int Art nimmt eine Menge Platz, 4 Byte. 978 01:01:33,240 --> 01:01:35,960 Also das ist, was da passiert ist, aber es gibt ein Problem jetzt. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Was wird hier passieren? 980 01:01:40,580 --> 01:01:46,470 Das Problem ist, * y in unserem vereinfachten Welt bedeutet nur, rufen Sie die Adresse in y. 981 01:01:46,470 --> 01:01:48,590 Was ist in y? Es ist einige Müll Wert. 982 01:01:48,590 --> 01:01:53,150 Nehmen wir also an, dass Müll Wert 5551212 ist, etwas Verrücktes so. 983 01:01:53,150 --> 01:01:56,750 * Y Mittel gehen 5551212 anzugehen. 984 01:01:56,750 --> 01:02:00,450 Das ist wie hier. Es ist nicht vorhanden, zum Beispiel. 985 01:02:00,450 --> 01:02:05,310 So * y bekommt 13 bedeutet, dass ich versuche, 13 hier ziehen werde. Es existiert nicht. 986 01:02:05,310 --> 01:02:08,790 Ich habe das Segment der Tafel überschritten. Was bekomme ich? 987 01:02:08,790 --> 01:02:14,930 Das kryptische Nachricht Segmentation Fault, weil ich versuche, in den Speicher zu 988 01:02:14,930 --> 01:02:19,470 ein Wert wie 13 an einem Ort, der nicht existiert. 989 01:02:19,470 --> 01:02:23,900 Der Rest des Programms könnte okay, aber bis zu arbeiten bis zu diesem Zeitpunkt nicht. 990 01:02:23,900 --> 01:02:25,350 So wollen wir versuchen, diese Geschichte zu erzählen. 991 01:02:25,350 --> 01:02:27,830 Wir kommen wieder, um dass, sobald wir über hex gesprochen. 992 01:02:27,830 --> 01:02:30,290 Gehen wir zurück auf diese und schließen mit diesem Ding namens Binky, 993 01:02:30,290 --> 01:02:33,710 die Rückrufaktion ist ein Stanford-Professor zu Hause sitzen spielen mit claymation, 994 01:02:33,710 --> 01:02:36,380 die Geschichte von genau dem gleichen Programm zu erzählen. 995 01:02:36,380 --> 01:02:40,580 Es ist nur etwa 3 Minuten lang. Hier haben wir Binky. 996 01:02:40,580 --> 01:02:45,030 [Male Lautsprecher video] Hey Binky, aufzuwachen. Es ist Zeit für Zeiger Spaß. 997 01:02:45,030 --> 01:02:50,080 [Binky] Was ist das? Erfahren Sie mehr über Zeiger? Oh, goody! 998 01:02:50,080 --> 01:02:53,700 [Male speaker] Nun, um loszulegen, ich denke, wir werden ein paar Hinweise benötigen. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Okay. Dieser Code weist 2 Zeiger, die Zahlen zeigen können. 1000 01:02:57,890 --> 01:03:02,220 [Male speaker] Okay. Nun, ich sehe die 2 Zeiger, aber sie scheinen nicht zu, etwas zu zeigen. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Das ist richtig. Zunächst müssen Zeiger auf nichts hinweisen. 1002 01:03:05,550 --> 01:03:09,270 Die Dinge, die sie zeigen, sind aufgerufen pointees und deren Einrichtung ist ein separater Schritt. 1003 01:03:09,270 --> 01:03:12,330 [Male speaker] Oh, rechts, rechts. Ich wusste, dass. Die pointees sind getrennt. 1004 01:03:12,330 --> 01:03:15,630 Er, so wie Sie Zuweisung einer pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Okay. Dieser Code weist ein neues Integer pointee, und dieser Teil setzt x auf ihn verweisen. 1006 01:03:21,510 --> 01:03:23,500 [Male speaker] Hey, das sieht besser aus. 1007 01:03:23,500 --> 01:03:26,030 So machen es etwas zu tun. >> [Binky] Okay. 1008 01:03:26,030 --> 01:03:30,300 Ich werde Dereferenzierung des Zeigers x die Zahl 42 in seine pointee speichern. 1009 01:03:30,300 --> 01:03:34,410 Für diesen Trick Ich brauche meinen Zauberstab der Dereferenzierung. 1010 01:03:34,410 --> 01:03:38,610 [Male speaker] Ihr Zauberstab der Dereferenzierung? Das ist toll. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Dies ist, was der Code aussieht. Ich werde einfach eingerichtet die Anzahl und ... [Knall] 1012 01:03:44,230 --> 01:03:46,100 [Male speaker] Hey schau, da geht es. 1013 01:03:46,100 --> 01:03:50,990 Dabei eine Dereferenzierung von x folgt der Pfeil seine pointee zuzugreifen, 1014 01:03:50,990 --> 01:03:53,230 in diesem Fall auf 42 in dort zu speichern. 1015 01:03:53,230 --> 01:03:57,630 Hey, versuchen Sie es, um die Zahl 13 durch die anderen Zeiger, y zu speichern. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Okay. Ich geh hier zur y und erhalten Sie die Zahl 13 eingerichtet 1017 01:04:03,250 --> 01:04:08,360 und nehmen Sie dann den Zauberstab der Dereferenzierung und einfach ... [Summton] Whoa! 1018 01:04:08,360 --> 01:04:10,980 [Male speaker] Oh hey, das hat nicht funktioniert. 1019 01:04:10,980 --> 01:04:14,870 >> Sprich, Binky, ich glaube nicht, Dereferenzierung y ist eine gute Idee 1020 01:04:14,870 --> 01:04:17,880 weil die Einrichtung des pointee ist ein separater Schritt 1021 01:04:17,880 --> 01:04:19,850 und ich glaube nicht, dass wir jemals getan hat. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, guter Punkt. 1023 01:04:21,770 --> 01:04:26,640 [Male speaker] Yeah. Wir vergeben den Zeiger y aber wir haben nie legen Sie es auf eine pointee zeigen. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, sehr aufmerksam. 1025 01:04:28,780 --> 01:04:30,690 [Male speaker] Hey, du siehst gut dort, Binky. 1026 01:04:30,690 --> 01:04:34,160 Kann man das lösen, so dass y auf den gleichen pointee als x? >> [Binky] Sure. 1027 01:04:34,160 --> 01:04:37,100 Ich werde mit meinem Zauberstab der Pointer Zuweisung. 1028 01:04:37,100 --> 01:04:39,070 [Male speaker] Ist das zu einem Problem wie vorher? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Nein, berührt dies nicht die pointees. 1030 01:04:40,840 --> 01:04:44,780 Es ändert nur ein Zeiger auf die gleiche Sache wie ein anderer Punkt. [Knall] 1031 01:04:44,780 --> 01:04:48,570 [Male speaker] Oh, wie ich sehe. Jetzt y Punkte auf der gleichen Stelle wie x. 1032 01:04:48,570 --> 01:04:51,140 So warten. Nun y fixiert ist. Es hat eine pointee. 1033 01:04:51,140 --> 01:04:54,520 So können Sie versuchen, den Zauberstab der Dereferenzierung erneut, um die 13 über zu senden. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, okay. Hier geht. [Knall] 1035 01:04:58,130 --> 01:05:01,250 [Male speaker] Hey, schau dir das an. Jetzt Dereferenzierung Werke auf y. 1036 01:05:01,250 --> 01:05:05,200 Und weil die Zeiger teilen werden, dass ein pointee, beide sehen 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Yeah, Sharing. Wie auch immer. 1038 01:05:06,910 --> 01:05:08,880 >> So werden wir Plätze jetzt wechseln? 1039 01:05:08,880 --> 01:05:11,420 [Male speaker] Oh look, wir sind aus der Zeit. >> [Binky] Aber - 1040 01:05:11,420 --> 01:05:13,880 [Male speaker] Denken Sie daran, die 3-Zeiger Regeln. 1041 01:05:13,880 --> 01:05:18,630 Nummer 1 ist die Grundstruktur, dass Sie einen Zeiger haben und es verweist auf eine pointee. 1042 01:05:18,630 --> 01:05:23,120 Aber der Zeiger und pointee sind getrennt, und die häufiger Fehler ist die Einrichtung eines Zeigers 1043 01:05:23,120 --> 01:05:25,680 aber zu vergessen, um ihm einen pointee. 1044 01:05:25,680 --> 01:05:29,580 Number 2, beginnt Zeiger Dereferenzierung am Zeiger und folgt dessen Pfeil über 1045 01:05:29,580 --> 01:05:31,060 seine pointee zugreifen. 1046 01:05:31,060 --> 01:05:34,340 Wie wir alle wissen, funktioniert dies nur, wenn es eine pointee, 1047 01:05:34,340 --> 01:05:36,460 welche Art von zurückkommt, um die Nummer 1 zu regieren. 1048 01:05:36,460 --> 01:05:39,870 Number 3, nimmt Pointer Zuweisung eines Zeigers und ändert sie 1049 01:05:39,870 --> 01:05:42,390 zu demselben pointee als weitere Zeiger zeigt. 1050 01:05:42,390 --> 01:05:45,890 So nach der Abtretung, werden die 2 Zeiger auf denselben pointee zeigen. 1051 01:05:45,890 --> 01:05:47,800 Manchmal, dass heißt Sharing. 1052 01:05:47,800 --> 01:05:50,910 >> Und das ist alles dort ist zu ihm wirklich. Bye-bye jetzt. 1053 01:05:50,910 --> 01:05:55,840 Dies ist Binky. Dies ist CS50. Wir sehen uns nächste Woche. [Applaus] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]