1 00:00:00,000 --> 00:00:01,110 >> [Musik zu spielen] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 David J. MALAN: In Ordnung. 4 00:00:11,650 --> 00:00:15,610 Dies ist CS50, und dies ist das Ende der Woche vier. 5 00:00:15,610 --> 00:00:19,420 Und eines der Themen heute ist, dass der digitalen Forensik, 6 00:00:19,420 --> 00:00:20,989 die Kunst der Wiederherstellung von Informationen. 7 00:00:20,989 --> 00:00:22,780 Und in der Tat, auch wenn Sie sind in der Mitte 8 00:00:22,780 --> 00:00:25,070 jetzt des Friedens bei Drei und Breakout, nächste Woche, 9 00:00:25,070 --> 00:00:27,880 der Fokus auf sein genau diese Domäne. 10 00:00:27,880 --> 00:00:30,686 >> So einer der coolsten Jobs, die ich jemals hatte, war zurück in Graduiertenschule, 11 00:00:30,686 --> 00:00:33,560 als ich für den lokalen Arbeits Middlesex County Bezirksstaatsanwalts 12 00:00:33,560 --> 00:00:34,950 Büro, macht Forensik zu arbeiten. 13 00:00:34,950 --> 00:00:37,450 So im Wesentlichen, das Massachusetts Staatspolizei, bei Gelegenheit, 14 00:00:37,450 --> 00:00:40,100 bei der Arbeit an Fällen wäre bringen in Dinge wie Festplatten 15 00:00:40,100 --> 00:00:42,185 und Disketten und Speicherkarten und dergleichen. 16 00:00:42,185 --> 00:00:44,060 Und sie würde die Hand zu mir und meinem Mentor, 17 00:00:44,060 --> 00:00:48,070 und unser Ziel war es, Beweise zu finden, ob es eine, auf diesen Medien. 18 00:00:48,070 --> 00:00:50,700 Jetzt könnten Sie gesehen haben Einblicke von dieser Welt der Forensik 19 00:00:50,700 --> 00:00:53,000 in den Medien, TV und Filme. 20 00:00:53,000 --> 00:00:55,730 Aber der Job, den ich hatte, und wage zu behaupten, dass die Welt, 21 00:00:55,730 --> 00:00:57,550 ist nicht ganz wie man es sehen würde. 22 00:00:57,550 --> 00:01:00,794 Werfen wir einen Blick auf, was Sie haben wahrscheinlich gesehen. 23 00:01:00,794 --> 00:01:01,460 [VIDEO PLAYBACK] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Jetzt wollen wir einen guten Blick auf Sie. 26 00:01:05,380 --> 00:01:06,850 >> [Musik zu spielen] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -Halten Es. 29 00:01:12,932 --> 00:01:13,657 Führen Sie das zurück. 30 00:01:13,657 --> 00:01:14,733 >> -wait Eine Minute. 31 00:01:14,733 --> 00:01:15,233 Gehen Sie nach rechts. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Es. 34 00:01:16,870 --> 00:01:17,369 Einfrieren, dass. 35 00:01:17,369 --> 00:01:17,930 Full-Screen. 36 00:01:17,930 --> 00:01:18,376 >> -OK. 37 00:01:18,376 --> 00:01:18,875 Einfrieren, dass. 38 00:01:18,875 --> 00:01:20,160 Auf, dass eine Straffung, ja? 39 00:01:20,160 --> 00:01:22,126 >> -vector In auf, dass Guy von dem Hinterrad. 40 00:01:22,126 --> 00:01:24,435 >> -zoom In genau hier an dieser Stelle. 41 00:01:24,435 --> 00:01:28,580 >> -Mit der richtigen Ausrüstung, die Bild kann vergrößert und geschärft werden. 42 00:01:28,580 --> 00:01:29,330 >> -Was Ist das? 43 00:01:29,330 --> 00:01:30,780 >> -Es Ist eine Steigerungsprogramm. 44 00:01:30,780 --> 00:01:32,170 >> -Kann Sie klar, dass Sie überhaupt? 45 00:01:32,170 --> 00:01:33,070 >> Weiß ich nicht. 46 00:01:33,070 --> 00:01:34,150 Lassen Sie uns zu verbessern es. 47 00:01:34,150 --> 00:01:35,440 >> -Verbessern Abschnitt A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Ich erhöhte das Detail, und-- 50 00:01:38,562 --> 00:01:40,020 -I Denke, es ist genug, um zu erhöhen. 51 00:01:40,020 --> 00:01:40,976 Lassen Sie es zu meinem Bildschirm. 52 00:01:40,976 --> 00:01:42,559 >> -I Verstärkt die Reflexion in ihrem Auge. 53 00:01:42,559 --> 00:01:44,322 -Let Dieses durchlaufen Video-Enhancement. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Können Sie verbessern das? 55 00:01:45,210 --> 00:01:45,710 >> -hang Auf. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -Ich Wurde auf dieser Reflexion arbeiten. 58 00:01:49,458 --> 00:01:50,402 >> -Es Ist jemand Reflexion. 59 00:01:50,402 --> 00:01:50,902 >> -Reflexion. 60 00:01:50,902 --> 00:01:52,870 -Es Ist ein Spiegelbild der das Gesicht des Mannes. 61 00:01:52,870 --> 00:01:53,694 >> -Der Reflexion! 62 00:01:53,694 --> 00:01:54,610 -Es Ist eine Reflexion. 63 00:01:54,610 --> 00:01:55,880 -zoom In auf dem Spiegel. 64 00:01:55,880 --> 00:01:57,860 Sie können eine Reflexion zu sehen. 65 00:01:57,860 --> 00:01:59,630 >> -Kann Verbessern Sie das Bild von hier? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 -Kann Sie es verbessern? 68 00:02:01,210 --> 00:02:02,190 -Kann Sie es verbessern? 69 00:02:02,190 --> 00:02:03,066 -Kann Erweitern wir das? 70 00:02:03,066 --> 00:02:03,898 -Kann Sie es verbessern? 71 00:02:03,898 --> 00:02:04,740 -Halten Auf einem zweiten. 72 00:02:04,740 --> 00:02:05,281 Ich werde zu verbessern. 73 00:02:05,281 --> 00:02:06,470 -zoom In an der Tür. 74 00:02:06,470 --> 00:02:06,970 -Fache 10. 75 00:02:06,970 --> 00:02:08,009 -zoom. 76 00:02:08,009 --> 00:02:08,509 -move In. 77 00:02:08,509 --> 00:02:09,340 -weitere. 78 00:02:09,340 --> 00:02:10,094 -wait, Zu stoppen. 79 00:02:10,094 --> 00:02:10,750 -stop. 80 00:02:10,750 --> 00:02:11,250 -PAUSE Es. 81 00:02:11,250 --> 00:02:13,542 -rotate Uns 75 Grad um die vertikale, bitte. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> -stop. 84 00:02:16,127 --> 00:02:19,330 Gehen Sie zurück zu dem Teil über der Tür wieder. 85 00:02:19,330 --> 00:02:21,420 >> -Haben Eine Bildverbesserung, die Bitmap kann? 86 00:02:21,420 --> 00:02:24,420 >> -Vielleicht Können wir die Pradeep Singh verwenden Methode, um in die Fenster sehen. 87 00:02:24,420 --> 00:02:25,902 >> -Der Software ist Stand der Technik. 88 00:02:25,902 --> 00:02:26,866 >> -Der Eigenwert ist aus. 89 00:02:26,866 --> 00:02:29,758 >> -Mit der rechten Kombination von algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> -Er Genommen Beleuchtung Algorithmen, um die nächste Ebene, 91 00:02:32,168 --> 00:02:34,110 und ich kann sie zu bedienen verbessern Sie dieses Foto. 92 00:02:34,110 --> 00:02:36,840 >> -Verschluss Auf und vergrößern die z-Achse. 93 00:02:36,840 --> 00:02:37,351 >> -Verbessern. 94 00:02:37,351 --> 00:02:37,850 Zu verbessern. 95 00:02:37,850 --> 00:02:38,720 -Verbessern. 96 00:02:38,720 --> 00:02:40,070 -Freeze Und zu verbessern. 97 00:02:40,070 --> 00:02:43,420 [END VIDEO PLAYBACK] 98 00:02:43,420 --> 00:02:45,830 David J. MALAN: Das sind also Alle Wörter, aber sie waren nicht 99 00:02:45,830 --> 00:02:47,870 in Sätzen richtig eingesetzt. 100 00:02:47,870 --> 00:02:52,370 Und in der Tat in der Zukunft, zu jeder Zeit, Bitte hören Sie jemand sagen, das Wort, 101 00:02:52,370 --> 00:02:54,250 "Verbessern", Kichern nur ein kleines bisschen. 102 00:02:54,250 --> 00:02:57,190 Weil, wenn Sie versuchen, zu verbessern, zum Beispiel ist das, was passiert. 103 00:02:57,190 --> 00:02:58,580 >> Also hier ist ein wunderschönes Foto. 104 00:02:58,580 --> 00:02:59,720 Dies ist CS50 eigenen Daven. 105 00:02:59,720 --> 00:03:03,740 Und nehme an, dass wir es wollten konzentrieren sich in der Augenzwinkern, 106 00:03:03,740 --> 00:03:05,870 oder die Reflexion des Bösewicht, die eindeutig war 107 00:03:05,870 --> 00:03:07,820 durch die Überwachungskamera eingefangen. 108 00:03:07,820 --> 00:03:10,330 Dies ist, was passiert, wenn Sie vergrößern auf ein Bild, 109 00:03:10,330 --> 00:03:14,060 nur eine endliche Anzahl von Bits zugeordnet. 110 00:03:14,060 --> 00:03:15,420 >> Das ist, was Sie erhalten würden. 111 00:03:15,420 --> 00:03:19,190 Und in der Tat, in Daven Auge ist, sondern vier, vielleicht sechs Pixel 112 00:03:19,190 --> 00:03:22,110 dass genau das, was komponieren wurde dort schimmern. 113 00:03:22,110 --> 00:03:25,890 So Problem Set Vier letztlich haben Sie, diese Welt zu erforschen, insbesondere 114 00:03:25,890 --> 00:03:28,090 von Natur aus etwas wir nennen Datei-I / O, wobei 115 00:03:28,090 --> 00:03:31,000 I / O ist nur eine andere Art von sagen Eingang und Ausgang. 116 00:03:31,000 --> 00:03:34,280 >> So bislang alle Interaktionen wir mit einem Computer gehabt haben 117 00:03:34,280 --> 00:03:36,770 weitgehend mit waren Ihre Tastatur und der Bildschirm, 118 00:03:36,770 --> 00:03:40,770 aber nicht so sehr mit der Festplatte, oder Speichern von Dateien über die, die Sie 119 00:03:40,770 --> 00:03:41,620 selbst schreiben. 120 00:03:41,620 --> 00:03:44,570 Ihre Programme haben bisher nicht zu schaffen, und speichern, 121 00:03:44,570 --> 00:03:46,270 und Aktualisierung ihrer eigenen Dateien. 122 00:03:46,270 --> 00:03:47,150 >> Nun, was ist eine Datei? 123 00:03:47,150 --> 00:03:48,105 Nun, so etwas wie ein JPEG. 124 00:03:48,105 --> 00:03:50,520 Dies ist ein Bild, das Sie vielleicht haben oder Upload auf Facebook, 125 00:03:50,520 --> 00:03:51,690 oder sehen überall im Web. 126 00:03:51,690 --> 00:03:54,460 In der Tat, dass wir einfach Foto Säge Daven war ein JPEG. 127 00:03:54,460 --> 00:03:57,570 Und was ist interessant über Dateien wie JPEGs 128 00:03:57,570 --> 00:04:02,170 ist, dass sie identifiziert werden können, typischerweise durch bestimmte Muster von Bits. 129 00:04:02,170 --> 00:04:05,200 >> Mit anderen Worten, was ist es, dass unterscheidet ein JPEG aus einem GIF 130 00:04:05,200 --> 00:04:08,109 von einem PING aus einem Word- Dokument aus einer Excel-Datei? 131 00:04:08,109 --> 00:04:09,900 Nun, es ist einfach anders Muster von Bits. 132 00:04:09,900 --> 00:04:12,820 Und diese verschiedenen Muster sind normalerweise zu Beginn dieser Dateien. 133 00:04:12,820 --> 00:04:18,200 >> So dass, wenn Sie Ihren Computer öffnet ein Wort doc, oder wenn ein Computer öffnet ein JPEG, 134 00:04:18,200 --> 00:04:20,940 es sieht typischerweise bei der erste mehrere Bits in der Datei. 135 00:04:20,940 --> 00:04:24,059 Und wenn es ein Muster erkennt, es sagt, oh, ein Bild dafür. 136 00:04:24,059 --> 00:04:25,850 Lassen Sie mich zeigen Sie es auf der Benutzer als Grafik. 137 00:04:25,850 --> 00:04:27,870 Oder, oh, das sieht aus wie ein Word-Dokument. 138 00:04:27,870 --> 00:04:30,480 Lassen Sie mich es dem Benutzer als einem Essay. 139 00:04:30,480 --> 00:04:33,020 >> So zum Beispiel, JPEGs, es stellt sich heraus, sind 140 00:04:33,020 --> 00:04:35,460 ziemlich anspruchsvolle unter der Haube. 141 00:04:35,460 --> 00:04:40,140 Aber die ersten drei Bytes in den meisten jedes JPEG beginnen mit diesen drei Zahlen. 142 00:04:40,140 --> 00:04:44,680 So Byte null, eins und zwei sind in der Fast jeder JPEG, 255, dann wird die Anzahl 143 00:04:44,680 --> 00:04:46,675 216, dann wird die Zahl 255. 144 00:04:46,675 --> 00:04:48,990 >> Und was Sie in der Lage sein, zu tun beginnen nächste Woche 145 00:04:48,990 --> 00:04:52,920 tatsächlich unter Stossen die Haube von Dateien wie JPEGs 146 00:04:52,920 --> 00:04:57,210 und wie Bitmap-Dateien, und zu sehen, was immer für wie lange 147 00:04:57,210 --> 00:04:58,650 Sie haben mit einem Computer gewesen. 148 00:04:58,650 --> 00:05:01,860 >> Aber was ist es in der Regel nicht wie Dezimalzahlen so geschrieben. 149 00:05:01,860 --> 00:05:04,620 Informatiker nicht neigen dazu, in Dezimal zu sprechen. 150 00:05:04,620 --> 00:05:06,139 Sie haben nicht wirklich in binärer sprechen. 151 00:05:06,139 --> 00:05:07,930 Normalerweise, wenn wir wollen, Zahlen auszudrücken, 152 00:05:07,930 --> 00:05:10,710 wir tatsächlich nutzen hexadezimal, die Sie sich erinnern können 153 00:05:10,710 --> 00:05:13,027 von, sagen wir, Problem-Set Eine, die in Frage gestellt 154 00:05:13,027 --> 00:05:14,610 Sie über ein anderes System nachdenken. 155 00:05:14,610 --> 00:05:17,170 >> Wir natürlich vertraut mit Nachkommastellen, Null bis Neun. 156 00:05:17,170 --> 00:05:18,215 Wir sprachen über binär. 157 00:05:18,215 --> 00:05:20,710 Und wir haben nicht wirklich so viel hier verwenden 158 00:05:20,710 --> 00:05:22,470 auf sich, weil Computer verwenden das. 159 00:05:22,470 --> 00:05:24,900 Aber Programmierer sehr Oft, aber nicht immer, 160 00:05:24,900 --> 00:05:29,360 hexadezimale, was bedeutet nur, Sie haben 16 Buchstaben im Alphabet Ihr, 161 00:05:29,360 --> 00:05:31,330 im Gegensatz zu zwei oder 10. 162 00:05:31,330 --> 00:05:34,530 >> So, wie Sie zählen zu höheren als neun in Hexadezimal? 163 00:05:34,530 --> 00:05:41,120 Sie gehen 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, nur durch Konvention. 164 00:05:41,120 --> 00:05:43,540 Aber was ist Schlüssel ist, dass jeder von diesen ist ein einzelnes Symbol. 165 00:05:43,540 --> 00:05:44,340 Es gibt keine 10. 166 00:05:44,340 --> 00:05:48,400 Es gibt keine 11 per se, da jedes Ihre Stellen, genau wie in Dezimal 167 00:05:48,400 --> 00:05:51,940 Und genau wie in binärer, sollte nur ein einzelner Charakter, durch Konvention. 168 00:05:51,940 --> 00:05:55,280 >> So dass dann das Alphabet haben wir zur Verfügung für hexadezimal. 169 00:05:55,280 --> 00:05:58,600 Also, was macht ein JPEG aussehen, wenn Sie waren zu schreiben, jene ersten drei 170 00:05:58,600 --> 00:06:01,980 Byte nicht als Dezimalzahl, aber beispielsweise als hexadezimalen? 171 00:06:01,980 --> 00:06:03,640 Und warum ist hex auch alles, was nützlich? 172 00:06:03,640 --> 00:06:05,290 >> Nun, ein kurzer Blick auf ein Beispiel. 173 00:06:05,290 --> 00:06:09,030 Also, wenn ich schreiben, die Bits, die stellen diese dezimal numbers-- 174 00:06:09,030 --> 00:06:12,450 könnte dies ein wenig rostig sein jetzt von ein paar Wochen zurück, 175 00:06:12,450 --> 00:06:14,820 aber der linke und der Richtige sind ziemlich einfach. 176 00:06:14,820 --> 00:06:17,990 255 war die größte Zahl, die wir konnte mit acht Bits repräsentieren. 177 00:06:17,990 --> 00:06:18,820 Es war nur Einsen. 178 00:06:18,820 --> 00:06:21,320 Also das einzige, das leicht ist Interessant ist auch die mittleren. 179 00:06:21,320 --> 00:06:24,700 Und wenn Sie Art tun sich die Mathe, werden Sie folgern, dass, ja, 180 00:06:24,700 --> 00:06:27,949 das Muster ein und Nullen repräsentiert 216. 181 00:06:27,949 --> 00:06:30,240 Also lasst uns einfach vor, für jetzt, dass diese korrekt sind. 182 00:06:30,240 --> 00:06:31,730 Aber warum ist das interessant? 183 00:06:31,730 --> 00:06:33,970 >> Nun, ein Byte, natürlich, ist acht Bits. 184 00:06:33,970 --> 00:06:38,980 Und es stellt sich heraus, dass, wenn Sie denken, ein Byte als zwei Stücke von vier Bits, 185 00:06:38,980 --> 00:06:39,500 so was. 186 00:06:39,500 --> 00:06:41,000 Lassen Sie mich nur etwas Platz hinzufügen. 187 00:06:41,000 --> 00:06:42,550 So vor, nach. 188 00:06:42,550 --> 00:06:46,520 Ich habe gerade etwas Leerraum hinzugefügt zur Visualisierung der hier willen. 189 00:06:46,520 --> 00:06:51,840 Wie können wir nun in repräsentieren, sagen wir, hexadezimal jeweils Quad von Bits, 190 00:06:51,840 --> 00:06:52,880 wobei jede Gruppe von vier Bits? 191 00:06:52,880 --> 00:06:56,420 >> So zum Beispiel auf der linken Seite jetzt haben wir 1111 in binär. 192 00:06:56,420 --> 00:07:00,420 Was ist diese Zahl in Dezimal-, wenn Sie die Mathematik zu tun? 193 00:07:00,420 --> 00:07:03,780 Sie haben die Einerstelle, die zu zweit Platz, die Vieren statt, und die Achter Platz. 194 00:07:03,780 --> 00:07:04,341 >> ZIELGRUPPE: 15. 195 00:07:04,341 --> 00:07:05,340 David J. MALAN: Es ist 15. 196 00:07:05,340 --> 00:07:08,340 Also, wenn wir acht plus vier plus zwei plus eins, bekommen wir 15. 197 00:07:08,340 --> 00:07:11,790 So konnte ich unten aufschreiben 15 1111, aber der springende Punkt hier 198 00:07:11,790 --> 00:07:13,190 hexadezimal, nicht dezimal. 199 00:07:13,190 --> 00:07:17,310 Also statt der Niederschrift 15, 1-5, Ich werde das in Hex zu schreiben, 200 00:07:17,310 --> 00:07:22,311 die, wenn Sie zurückdenken, wenn Sie Null bis f, was 15 sein wird? 201 00:07:22,311 --> 00:07:22,810 ZIELGRUPPE: f. 202 00:07:22,810 --> 00:07:24,434 David J. MALAN: So stellt sich heraus, es ist f. 203 00:07:24,434 --> 00:07:29,140 Und Sie können daran arbeiten heraus mit den Worten: Nun, wenn eine 10 ist, dann OK, f 15. 204 00:07:29,140 --> 00:07:33,250 Also ja, wir schreiben konnte Die gleiche Reihe von Zahlen als f f. 205 00:07:33,250 --> 00:07:35,750 Und dann, wenn wir ein bisschen Mathematik, wir folgern, dass das ist, d. 206 00:07:35,750 --> 00:07:38,650 Acht ist recht einfach, denn wir eine Eins in der Achter Platz. 207 00:07:38,650 --> 00:07:40,620 Und dann haben wir noch ein paar f f ist. 208 00:07:40,620 --> 00:07:44,669 >> Also, was Menschen dazu neigen, durch Konvention zu tun wenn sie verwenden hexadezimale ist sie nur 209 00:07:44,669 --> 00:07:47,710 schreibe ein wenig kurz und bündig, der meisten dieser weißen Raum loszuwerden. 210 00:07:47,710 --> 00:07:50,890 Und nur um super klar zu sein Leser, dass dies hexadezimal, 211 00:07:50,890 --> 00:07:54,670 die einfache Konvention unter Menschen wird Sie schreiben Null 212 00:07:54,670 --> 00:07:58,000 x, der keine andere Bedeutung hat als ein visueller Kennung, 213 00:07:58,000 --> 00:07:59,590 hier kommt ein Hex-Zahl. 214 00:07:59,590 --> 00:08:04,210 >> Und dann setzen Sie die beiden Ziffern, f f in diesem Fall, so d a ist, dann f f. 215 00:08:04,210 --> 00:08:06,700 So lange Rede kurzer Sinn, hexadezimale nur tendenziell 216 00:08:06,700 --> 00:08:11,990 nützlich zu sein, da jedes der Ziffern Null bis f, perfekt Linien 217 00:08:11,990 --> 00:08:13,880 mit einem Muster von vier Bits. 218 00:08:13,880 --> 00:08:18,080 >> Also, wenn Sie zwei hexadezimalen Ziffern haben, Null bis F, wieder und wieder, 219 00:08:18,080 --> 00:08:20,256 das gibt Ihnen perfekt acht Bits oder ein Byte. 220 00:08:20,256 --> 00:08:22,380 Also das ist, warum es dazu neigt, sein konventionell nützlich. 221 00:08:22,380 --> 00:08:24,990 Es gibt keine geistigen Inhalt wirklich darüber hinaus, 222 00:08:24,990 --> 00:08:27,010 außer seiner eigentlichen Programm. 223 00:08:27,010 --> 00:08:29,310 >> Jetzt JPEG sind nicht die einzige Dateiformate für Grafiken. 224 00:08:29,310 --> 00:08:33,230 Sie erinnern sich vielleicht, dass es Dateien wie diese in der Welt, 225 00:08:33,230 --> 00:08:34,830 zumindest von ein paar Jahre zurück. 226 00:08:34,830 --> 00:08:37,580 >> Also eigentlich war diese in Windows XP installiert 227 00:08:37,580 --> 00:08:39,960 auf Millionen PCs weltweit. 228 00:08:39,960 --> 00:08:43,000 Und das war eine Bitmap-Datei, BMP. 229 00:08:43,000 --> 00:08:47,690 Und eine Bitmap-Datei, wie Sie sehen werden neben Woche, bedeutet nur ein Muster aus Punkten, 230 00:08:47,690 --> 00:08:51,710 Pixel, wie sie genannt werden, Eine Karte auf Bits, wirklich. 231 00:08:51,710 --> 00:08:55,160 >> Also, was ist interessant, wenn auch, über dieses Dateiformat, BMP, ist 232 00:08:55,160 --> 00:08:58,590 dass unter der Haube, es hat mehr als nur drei Bytes 233 00:08:58,590 --> 00:09:01,020 dass seine Kopf komponieren, so zu sprechen, die ersten paar Bissen. 234 00:09:01,020 --> 00:09:03,330 Es sieht tatsächlich ein wenig auf den ersten Blick kompliziert. 235 00:09:03,330 --> 00:09:04,704 Und Sie werden diese in der P-Reihe zu sehen. 236 00:09:04,704 --> 00:09:06,810 Und immer etwas Insbesondere aus diesem jetzt 237 00:09:06,810 --> 00:09:10,720 ist nicht so wichtig, da nur die Tatsache, daß zu Beginn jedes Bitmap 238 00:09:10,720 --> 00:09:13,823 Datei, ein Grafikformat, es gibt eine ganze Reihe von Zahlen. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Jetzt Microsoft, die Autor von diesem Format 241 00:09:16,720 --> 00:09:18,820 neigt dazu, diejenigen nennen Dinge nicht ints und chars 242 00:09:18,820 --> 00:09:22,259 und schwimmt aber Worte und d Worte und sehnt sich und Bytes. 243 00:09:22,259 --> 00:09:23,800 Also sie sind nur verschiedene Datentypen. 244 00:09:23,800 --> 00:09:25,170 Sie sind verschiedene Namen für die gleiche Sache. 245 00:09:25,170 --> 00:09:26,740 Aber Sie werden feststellen, dass in P Set Vier sehen. 246 00:09:26,740 --> 00:09:31,450 >> Aber das ist nur zu sagen, dass, wenn ein Mensch doppelklickt etwas BMP-Datei auf seinem 247 00:09:31,450 --> 00:09:35,015 oder ihre Festplatte, und ein Fenster öffnet sich bis ihm oder ihr, dass Bild, das zeigt, 248 00:09:35,015 --> 00:09:38,500 das passiert ist, weil das Betriebs System vermutlich aufgefallen, nicht nur 249 00:09:38,500 --> 00:09:41,460 die BMP-Datei-Erweiterung im Dateinamen, 250 00:09:41,460 --> 00:09:45,010 sondern auch die Tatsache, dass es einige Konvention mit dem Muster der Bits 251 00:09:45,010 --> 00:09:47,490 am Anfang dieser Bitmap-Datei. 252 00:09:47,490 --> 00:09:50,270 >> Aber lassen Sie uns jetzt konzentrieren sich auf eine so komplizierte Datei, 253 00:09:50,270 --> 00:09:52,120 sondern auf so etwas wie dieses. 254 00:09:52,120 --> 00:09:55,190 Nehmen wir hier in GEdit, ich einfach nur die Anfänge 255 00:09:55,190 --> 00:09:57,070 von einem Programm, das sehr einfach ist. 256 00:09:57,070 --> 00:09:58,860 Ich habe einige beinhaltet bis oben. 257 00:09:58,860 --> 00:10:02,120 Jetzt habe ich # include "structs.h" aber Ich werde in einem Moment zurückkommen. 258 00:10:02,120 --> 00:10:03,974 Aber das ist jetzt für sinnvoll. 259 00:10:03,974 --> 00:10:05,890 Also das ist ein Programm, das geht zu implementieren 260 00:10:05,890 --> 00:10:07,335 wie das Standes Datenbank. 261 00:10:07,335 --> 00:10:09,710 So eine Datenbank von Studenten, und jeder Schüler in der Welt 262 00:10:09,710 --> 00:10:13,190 hat einen Namen und ein Haus und wahrscheinlich einige andere Sachen, aber wir werden es einfach zu halten. 263 00:10:13,190 --> 00:10:15,140 Jeder Student hat einen Namen und ein Haus. 264 00:10:15,140 --> 00:10:17,700 >> Also, wenn ich wollte schreiben Programm, dessen Zweck im Leben 265 00:10:17,700 --> 00:10:19,860 wurde nur von laufen Null auf bis zu drei, 266 00:10:19,860 --> 00:10:22,070 wenn es drei Studenten an der Harvard University. 267 00:10:22,070 --> 00:10:25,350 Und ich möchte nur, um mit GetString, jedes Schülers Namen und Haus, 268 00:10:25,350 --> 00:10:26,600 und dann einfach ausdrucken diejenigen aus. 269 00:10:26,600 --> 00:10:28,630 >> Das ist ein bisschen wie Woche Eins, jetzt Woche zwei Sachen, 270 00:10:28,630 --> 00:10:30,810 wo ich will nur für Schleife oder so ähnlich. 271 00:10:30,810 --> 00:10:34,500 Und ich möchte GetString rufen ein paar mal, und drucken Sie dann f ein paar mal. 272 00:10:34,500 --> 00:10:37,340 Also, wie könnte ich das tun, obwohl, wenn sowohl ein Name und ein Haus 273 00:10:37,340 --> 00:10:39,070 werden für jeden Schüler beteiligt? 274 00:10:39,070 --> 00:10:42,830 >> Also mein erster Instinkt könnte sein, um so etwas zu tun. 275 00:10:42,830 --> 00:10:49,620 Ich könnte zunächst sagen, gut, gib mir, sagen, ein Array von Strings genannt Namen. 276 00:10:49,620 --> 00:10:51,530 Und ich glaube nicht, dass ein Hard drei hier. 277 00:10:51,530 --> 00:10:53,064 Was will ich, dort zu setzen? 278 00:10:53,064 --> 00:10:55,730 So dass die Schüler, denn das ist nur eine Konstante an der Spitze erklärt, 279 00:10:55,730 --> 00:10:57,860 nur damit ich nicht zu codieren drei in mehreren Orten. 280 00:10:57,860 --> 00:11:00,859 Auf diese Weise, kann ich es an einem Ort ändern, und es wirkt sich eine Veränderung überall. 281 00:11:00,859 --> 00:11:04,470 Und dann könnte ich tun, String beherbergt Studenten. 282 00:11:04,470 --> 00:11:10,250 >> Und jetzt, ich könnte etwas tun, wie for (int i = 0; i 00:11:14,390 Also bin ich schnell tippen, aber das ist wohl bekannte Syntax jetzt. 284 00:11:14,390 --> 00:11:17,030 >> Und nun war dieser aktueller ist. 285 00:11:17,030 --> 00:11:22,890 Wenn ich in der i-ten setzen der Name des Studenten, ich glaube, ich dies tun. 286 00:11:22,890 --> 00:11:26,480 Und dann keine Namen aber Häuser Halterung I. 287 00:11:26,480 --> 00:11:29,930 Ich mache das, GetString, und lassen mich zurückgehen und diese Linie. 288 00:11:29,930 --> 00:11:30,430 Zustimmen? 289 00:11:30,430 --> 00:11:31,200 Nicht einverstanden sind? 290 00:11:31,200 --> 00:11:32,366 Es ist nicht sehr benutzerfreundlich. 291 00:11:32,366 --> 00:11:33,890 Ich habe nicht gesagt, der Benutzer, was zu tun ist. 292 00:11:33,890 --> 00:11:36,520 >> Aber jetzt, wenn ich auch wollte später, lassen Sie uns 293 00:11:36,520 --> 00:11:40,060 sagen wir, diese Dinge zu drucken out-- so TODO später. 294 00:11:40,060 --> 00:11:42,330 Ich werde mehr mit zu tun this-- dies ist wohl 295 00:11:42,330 --> 00:11:45,970 eine korrekte Umsetzung der immer Namen und Häuser, drei 296 00:11:45,970 --> 00:11:48,870 von ihnen insgesamt jeweils von einem Benutzer. 297 00:11:48,870 --> 00:11:51,280 >> Aber das ist nicht sehr gutes Design, oder? 298 00:11:51,280 --> 00:11:55,220 Was ist, wenn ein Schüler nicht nur einen Namen und ein Haus, sondern auch eine ID-Nummer, 299 00:11:55,220 --> 00:11:57,770 und eine Telefonnummer, und eine E-Mail-Adresse, 300 00:11:57,770 --> 00:12:00,280 und vielleicht eine Homepage, und vielleicht ein Twitter-Griff, 301 00:12:00,280 --> 00:12:03,730 und jede Anzahl von anderen Details mit einem Schüler oder einer Person verbunden, 302 00:12:03,730 --> 00:12:04,610 im Allgemeinen. 303 00:12:04,610 --> 00:12:07,720 Wie würden wir beginnen, hinzufügen Funktionalität zu diesem Programm? 304 00:12:07,720 --> 00:12:14,080 >> Nun, ich fühle mich wie der einfachste Weg, vielleicht sein, etwas zu tun, sagen wir mal, 305 00:12:14,080 --> 00:12:16,490 int ids Studenten. 306 00:12:16,490 --> 00:12:18,380 So kann ich alle ihre IDs in es gesetzt. 307 00:12:18,380 --> 00:12:22,240 Und dann, nach etwas wie Telefonnummern, 308 00:12:22,240 --> 00:12:24,400 Ich bin mir nicht sicher, wie man stellen, dass nur noch. 309 00:12:24,400 --> 00:12:30,280 Lassen Sie uns also vor, nur Anruf gehen Diese twittert STUDENTEN, die 310 00:12:30,280 --> 00:12:33,550 ist ein wenig seltsam, aber-- und ein paar mehr Felder. 311 00:12:33,550 --> 00:12:36,360 >> Ich habe angefangen, effektiv Kopieren Sie hier. 312 00:12:36,360 --> 00:12:39,416 Und das wird ziemlich wachsen unhandlich ziemlich schnell, oder? 313 00:12:39,416 --> 00:12:42,290 Wäre es nicht schön sein, wenn es in der Welt eine Datenstruktur bekannt 314 00:12:42,290 --> 00:12:45,600 nicht als int oder ein String, sondern etwas, höhere Ebene, eine Abstraktion, so 315 00:12:45,600 --> 00:12:47,570 zu sprechen, als Student bekannt? 316 00:12:47,570 --> 00:12:50,220 C nicht mit eingebautem kommen Funktionalität für Studenten, 317 00:12:50,220 --> 00:12:52,260 aber was, wenn ich wollte, dass es eine solche geben? 318 00:12:52,260 --> 00:12:55,640 >> Nun, es stellt sich heraus, ich bin zu gehen Öffnen einer Datei structs.h hier genannt, 319 00:12:55,640 --> 00:12:57,090 und Sie genau das tun können. 320 00:12:57,090 --> 00:12:58,290 Und wir werden damit beginnt jetzt. 321 00:12:58,290 --> 00:13:01,490 Und unter der Haube von P Set Drei, Sie haben bereits das getan, jetzt. 322 00:13:01,490 --> 00:13:05,920 Es gibt nicht so etwas wie eine g rect oder a g oval in der Programmiersprache C. 323 00:13:05,920 --> 00:13:10,570 >> Leute, die an der Stanford implementiert Datentypen mit diesem Ansatz hier 324 00:13:10,570 --> 00:13:13,900 erklärt ihre eigenen neuen Daten Arten mit einem neuen Stichwort 325 00:13:13,900 --> 00:13:16,744 genannt und eine andere Struktur nannte man typedef. 326 00:13:16,744 --> 00:13:19,660 Und in der Tat, obwohl die Syntax sieht von Sachen ein wenig anders 327 00:13:19,660 --> 00:13:23,550 wir zuvor gesehen haben, in Prinzip, es ist super einfach. 328 00:13:23,550 --> 00:13:25,297 >> Das bedeutet einfach nur "definieren einen Typ." 329 00:13:25,297 --> 00:13:27,255 Das wird eine sein Struktur und eine Struktur, 330 00:13:27,255 --> 00:13:29,400 ist wie ein Container für mehrere Dinge. 331 00:13:29,400 --> 00:13:31,780 Und diese Struktur wird um einen String aufgerufen Namen haben, 332 00:13:31,780 --> 00:13:33,210 und einen String aufgerufen Haus. 333 00:13:33,210 --> 00:13:37,520 Und nennen, nur für die Bequemlichkeit, diese ganze Datenstruktur Schüler. 334 00:13:37,520 --> 00:13:40,320 >> Also in dem Moment, Sie bekommen das Semikolon, haben Sie jetzt 335 00:13:40,320 --> 00:13:43,280 erstellt Ihren eigenen Daten Typ namens Student 336 00:13:43,280 --> 00:13:46,420 dass nun steht neben int, und float und char, und String, 337 00:13:46,420 --> 00:13:50,270 und g rect und g oval, und eine beliebige Anzahl andere Dinge, die Menschen erfunden haben. 338 00:13:50,270 --> 00:13:53,340 >> Also, was ist sinnvoll darüber jetzt ist, dass wenn ich wieder gehen 339 00:13:53,340 --> 00:13:57,430 0 konstruieren und beenden diese Umsetzung, die ich geschrieben habe 340 00:13:57,430 --> 00:14:02,080 im Voraus hier bemerken, dass alle der unvermeidlichen Unordnung, dass 341 00:14:02,080 --> 00:14:05,490 war kurz vor dem Start passiert, als ich aufgenommen Telefonnummern und zwitschert und alle 342 00:14:05,490 --> 00:14:07,370 diese anderen Dinge zu Definition eines Schülers, 343 00:14:07,370 --> 00:14:11,810 jetzt ist es kurz und bündig eingepackt nur als eine Reihe von Studenten. 344 00:14:11,810 --> 00:14:15,500 >> Und jeder dieser Schüler jetzt mehrere Dinge darin. 345 00:14:15,500 --> 00:14:16,930 So dass nur noch eine Frage verlässt. 346 00:14:16,930 --> 00:14:19,700 Wie kann man sich die Namen zu erhalten, und das Haus, und die ID, 347 00:14:19,700 --> 00:14:21,640 und was sonst ist Innenseite der Student? 348 00:14:21,640 --> 00:14:22,930 Super einfach, wie gut. 349 00:14:22,930 --> 00:14:25,730 Neue Syntax, aber eine einfache Idee. 350 00:14:25,730 --> 00:14:29,239 >> Sie einfach in den Index-Array wie wir letzte Woche und diese. 351 00:14:29,239 --> 00:14:31,030 Und was ist eindeutig die neues Stück von Syntax? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Nur., Was bedeutet, "innerhalb der go Struktur und bekommen das Feld mit dem Namen 354 00:14:35,880 --> 00:14:39,030 Name, bekommen die Feld namens Haus, erhalten die Feld namens Student. " 355 00:14:39,030 --> 00:14:41,940 >> So in P-Set Drei, wenn Sie noch an, dass, 356 00:14:41,940 --> 00:14:44,020 und die meisten Leute immer noch sind, erkennen, dass, wie Sie 357 00:14:44,020 --> 00:14:46,130 beginnen mit Dingen wie g und g rects Ovale 358 00:14:46,130 --> 00:14:50,201 und andere Dinge, die nicht zu scheinen, kommen von Woche null, eins oder zwei, 359 00:14:50,201 --> 00:14:52,950 erkennen, dass das ist, weil Stanford erklärt einige neue Datentypen. 360 00:14:52,950 --> 00:14:56,160 >> Und in der Tat, das ist genau, was wir zu tun, als auch, in P Set Four, wenn 361 00:14:56,160 --> 00:14:59,880 wir beginnen, mit den Dingen umzugehen wie Bilder, Bitmaps und mehr. 362 00:14:59,880 --> 00:15:02,882 Also das ist nur ein Teaser und ein mentales Modell für das, was noch kommen wird. 363 00:15:02,882 --> 00:15:04,590 Nun zögerte ich ein bisschen an diesem Morgen. 364 00:15:04,590 --> 00:15:09,560 Ich war irgendwie neugierig zu sehen, was Microsoft Tapete tatsächlich 365 00:15:09,560 --> 00:15:10,310 sieht aus wie heute. 366 00:15:10,310 --> 00:15:15,200 Und es stellt sich heraus, jemand im Jahr 2006 ging tatsächlich fast genau 367 00:15:15,200 --> 00:15:19,210 der gleichen Stelle, in der Realität fotografieren was aussieht wie, dass in diesen Tagen. 368 00:15:19,210 --> 00:15:21,380 Das Feld ist jetzt ein wenig überwuchert. 369 00:15:21,380 --> 00:15:24,850 >> So spricht nun der Bilder, Lassen Sie uns zurückbringen Daven hier 370 00:15:24,850 --> 00:15:26,890 auf dem Bildschirm und Nikolaus, und nur daran erinnern, 371 00:15:26,890 --> 00:15:30,540 , dass, wenn Sie möchten, um uns zum Mittagessen kommen an diesem Freitag, den Kopf auf unseren üblichen URL 372 00:15:30,540 --> 00:15:31,440 Hier. 373 00:15:31,440 --> 00:15:33,530 >> Also, wo sind wir stehen geblieben am Montag? 374 00:15:33,530 --> 00:15:35,140 Wir führten dieses Problem, oder? 375 00:15:35,140 --> 00:15:37,610 Das war scheinbar eine korrekte Umsetzung der Swap, 376 00:15:37,610 --> 00:15:40,460 wobei Sie die Einnahme zwei ints, eine genannt, nannte man b, 377 00:15:40,460 --> 00:15:44,130 tauschen sie, genau wie Laura hat hier auf der Bühne mit der Milch und dem Wasser, 378 00:15:44,130 --> 00:15:46,820 unter Verwendung eines temporären Variable oder eine leere Tasse, 379 00:15:46,820 --> 00:15:50,540 so dass wir in einem b und einem in setzen b ohne ein Chaos der Dinge. 380 00:15:50,540 --> 00:15:51,560 Wir verwendeten eine Variable. 381 00:15:51,560 --> 00:15:52,870 Es heißt Temperatur. 382 00:15:52,870 --> 00:15:55,520 >> Aber was war das Grund Problem mit diesem Code am Montag? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Was war das Problem? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Ja. 387 00:16:00,605 --> 00:16:01,970 >> ZIELGRUPPE: Es nimmt mehr Platz. 388 00:16:01,970 --> 00:16:04,719 >> David J. MALAN: Nimmt mehr Raum, denn ich bin mit einem variablen, 389 00:16:04,719 --> 00:16:05,400 und das ist OK. 390 00:16:05,400 --> 00:16:07,300 Das ist wahr, aber ich bin gehen zu sagen, das ist OK. 391 00:16:07,300 --> 00:16:10,030 Es ist nur 32 Bit in der großen Schema der Dinge, so dass nicht eine große Sache. 392 00:16:10,030 --> 00:16:10,655 Andere Gedanken? 393 00:16:10,655 --> 00:16:12,572 ZIELGRUPPE: Es tauscht nur die Variablen vor Ort. 394 00:16:12,572 --> 00:16:13,571 David J. MALAN: Genau. 395 00:16:13,571 --> 00:16:15,090 Es tauscht nur die Variablen vor Ort. 396 00:16:15,090 --> 00:16:18,173 Weil immer wenn Sie ein function-- nennen wenn ich die Schalen von Annenberg 397 00:16:18,173 --> 00:16:19,840 letzten Mal, haben Sie Haupt auf der Unterseite. 398 00:16:19,840 --> 00:16:23,560 Sobald Sie eine Funktion namens nennen Swap, Swap wird nicht x und y, 399 00:16:23,560 --> 00:16:24,400 die ursprünglichen Werte. 400 00:16:24,400 --> 00:16:26,392 Was bedeutet Swap wird, haben wir den Anspruch? 401 00:16:26,392 --> 00:16:27,100 ZIELGRUPPE: Kopien. 402 00:16:27,100 --> 00:16:28,090 David J. MALAN: Also Kopien von ihnen. 403 00:16:28,090 --> 00:16:31,120 So wird es eins und zwei, wenn Sie erinnern das Beispiel vom letzten Mal, 404 00:16:31,120 --> 00:16:34,730 sondern eine Kopie von einem und zwei , die erfolgreich ausgelagert werden. 405 00:16:34,730 --> 00:16:38,550 Aber leider am Ende, diese Werte sind die gleichen geblieben. 406 00:16:38,550 --> 00:16:41,880 So können wir diese mit unserer sehen neuen Freund, hoffentlich GDB, 407 00:16:41,880 --> 00:16:45,180 dass Sie oder die Transkriptionsfaktoren und Ca verfügen wurde der Sie zu wie folgt. 408 00:16:45,180 --> 00:16:51,210 >> Also keine Swap-Rückruf sieht like-- uns gelassen eröffnen this-- sieht so aus. 409 00:16:51,210 --> 00:16:54,160 Wir initialisiert x zu einem, y auf zwei. 410 00:16:54,160 --> 00:16:55,620 Hatte eine Reihe von Druck f ist. 411 00:16:55,620 --> 00:16:58,080 Aber dann, der Schlüssel Anruf hier war zu tauschen, die 412 00:16:58,080 --> 00:17:00,260 ist genau der Code, den wir gerade gesehen, vor einem Augenblick. 413 00:17:00,260 --> 00:17:03,180 Die auf den ersten richtig ist Blick, aber funktional, 414 00:17:03,180 --> 00:17:06,800 dieses Programm nicht funktionieren, weil es nicht dauerhaft tauschen x und y. 415 00:17:06,800 --> 00:17:10,190 >> Also lassen Sie uns das zu sehen, eine schnelle Aufwärm hier mit GDB, einem ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Ein Bündel von Informationen überwältigend, dass Ich werde jetzt loswerden mit Control L. 418 00:17:15,200 --> 00:17:17,516 Und jetzt bin ich zu gehen gehen Sie vor und führen Sie es. 419 00:17:17,516 --> 00:17:19,349 Und leider, dass war nicht so sinnvoll. 420 00:17:19,349 --> 00:17:22,355 Es lief das Programm innerhalb dieses Programm namens GDB, einen Debugger, 421 00:17:22,355 --> 00:17:23,730 aber es ließ mich nicht herumzustochern. 422 00:17:23,730 --> 00:17:26,229 >> Also, wie kann ich eigentlich pausieren Ausführung in diesem Programm? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 So brechen. 425 00:17:28,329 --> 00:17:32,340 Und ich konnte auf allen brechen Zeilennummer, eine, 10, 15. 426 00:17:32,340 --> 00:17:35,530 Aber ich kann auch symbolisch zu brechen mit den Worten Pause Main. 427 00:17:35,530 --> 00:17:38,980 Und das wird eine Pause gesetzt Punkt, offenbar in Zeile 16 in Haupt. 428 00:17:38,980 --> 00:17:40,050 Und wo ist die Linie 16? 429 00:17:40,050 --> 00:17:42,960 Gehen wir bis zum Code und gehen bis zu NOSWAP. 430 00:17:42,960 --> 00:17:46,930 Und in der Tat ist die Linie 16 die erste im Programm. 431 00:17:46,930 --> 00:17:52,130 >> So, jetzt, wenn ich voran gehen und Typ laufen diese Zeit, Enter, blieb es. 432 00:17:52,130 --> 00:17:53,080 Lassen Sie uns also herumzustochern. 433 00:17:53,080 --> 00:17:55,716 Drucken x-- warum ist x Null? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 Und ignorieren die Dollar-Zeichen. 436 00:17:57,830 --> 00:17:59,725 Das ist nur für Züchter Verwendung des Programms. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Warum ist x Null im Moment? 439 00:18:03,140 --> 00:18:03,640 Ja. 440 00:18:03,640 --> 00:18:07,061 >> ZIELGRUPPE: Es hielt direkt vor Linie 16, nicht wirklich auf der Leitung 16. 441 00:18:07,061 --> 00:18:08,060 David J. MALAN: Genau. 442 00:18:08,060 --> 00:18:11,630 GDB, die standardmäßig angehalten hat Ausführung kurz vor Linie 16. 443 00:18:11,630 --> 00:18:14,820 So ist es nicht ausgeführt, die bedeutet, x ist von einem unbekannten Wert. 444 00:18:14,820 --> 00:18:17,150 Und wir hatten Glück, dass es etwas sauber wie Null. 445 00:18:17,150 --> 00:18:20,310 So, jetzt, wenn ich als nächstes schreiben, nun ausgeführt es 16. 446 00:18:20,310 --> 00:18:22,000 Es wartet auf mich ausführen 17. 447 00:18:22,000 --> 00:18:23,400 Lassen Sie mich weiter und Druck x zu gehen. 448 00:18:23,400 --> 00:18:24,094 Es ist einer. 449 00:18:24,094 --> 00:18:25,260 Lassen Sie mich weiter und Druck y gehen. 450 00:18:25,260 --> 00:18:26,176 Was soll ich jetzt? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> ZIELGRUPPE: [unverständlich] 453 00:18:28,560 --> 00:18:29,165 >> David J. MALAN: Ein wenig lauter. 454 00:18:29,165 --> 00:18:30,040 >> ZIELGRUPPE: [unverständlich] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 David J. MALAN: Nicht ganz ein Konsens. 457 00:18:32,120 --> 00:18:34,760 Also ja, wir sehen einige Müll Wert. 458 00:18:34,760 --> 00:18:37,862 Nun ist es y 134514064. 459 00:18:37,862 --> 00:18:39,320 Nun, es ist nur einige Müll Wert. 460 00:18:39,320 --> 00:18:41,350 Mein Programm nutzt RAM für verschiedene Zwecke. 461 00:18:41,350 --> 00:18:42,350 Es gibt andere Funktionen. 462 00:18:42,350 --> 00:18:44,040 Andere Leute in meinem Computer geschrieben. 463 00:18:44,040 --> 00:18:46,789 Also diese Bits für benutzt worden andere Werte, und was ich sehe 464 00:18:46,789 --> 00:18:49,470 sind die Reste einiger vor Verwendung dieses Speichers. 465 00:18:49,470 --> 00:18:53,350 >> Also keine große Sache, denn sobald wie ich als nächstes schreiben und drucken Sie dann y, 466 00:18:53,350 --> 00:18:55,640 es ist initialisiert der Wert, den ich will. 467 00:18:55,640 --> 00:18:57,400 So, jetzt wollen wir voran gehen ein wenig schneller. 468 00:18:57,400 --> 00:18:58,540 N für den nächsten. 469 00:18:58,540 --> 00:18:59,570 Lassen Sie es wieder tun. 470 00:18:59,570 --> 00:19:00,530 Lassen Sie es wieder tun. 471 00:19:00,530 --> 00:19:02,404 Aber ich will nicht zu schlagen es hier, denn wenn ich 472 00:19:02,404 --> 00:19:05,110 wollen sehen, was los ist in Swap, was ist der Befehl? 473 00:19:05,110 --> 00:19:05,520 >> ZIELGRUPPE: Schritte. 474 00:19:05,520 --> 00:19:06,436 >> David J. MALAN: Schritte. 475 00:19:06,436 --> 00:19:09,800 Also diese Schritte mich in eine Funktion, anstatt über sie. 476 00:19:09,800 --> 00:19:12,270 Und jetzt ist es ein wenig kryptisch ehrlich gesagt, aber das ist nur 477 00:19:12,270 --> 00:19:14,581 sagen mir, ich bin in der Zeile 33 jetzt. 478 00:19:14,581 --> 00:19:15,580 Und lassen Sie uns wieder tun. 479 00:19:15,580 --> 00:19:16,080 Drucktemperatur. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Müll Werte negativ diesmal aber das ist nur noch ein Müll Wert. 482 00:19:20,170 --> 00:19:22,810 Lassen Sie uns also als nächstes tun, Drucktemperatur. 483 00:19:22,810 --> 00:19:27,130 Es ist mit 1 initialisiert, die war der Wert von x, auch bekannt als ein. 484 00:19:27,130 --> 00:19:29,110 >> Nun, wo sind unsere A und X her? 485 00:19:29,110 --> 00:19:32,510 Nun, in den Haupt bemerken wir bezeichnet diese Werte x und y. 486 00:19:32,510 --> 00:19:34,740 Wir haben dann an ihnen vorbei zu tauschen wie folgt. 487 00:19:34,740 --> 00:19:37,010 X war zuerst da, Komma y. 488 00:19:37,010 --> 00:19:40,020 Und dann konnte sie Swap-x und y nennen. 489 00:19:40,020 --> 00:19:42,630 Aber aus Gründen der Klarheit, ist es ruft sie a und b. 490 00:19:42,630 --> 00:19:45,970 Aber A und B werden nun sein Kopien von x bzw. y. 491 00:19:45,970 --> 00:19:50,660 >> Also, wenn ich wieder nach GDB, Temp ist jetzt ein und eine ist heute einer. 492 00:19:50,660 --> 00:19:56,130 Aber wenn ich als nächstes tun, und jetzt machen Druck a, a wurde bereits über bewegt. 493 00:19:56,130 --> 00:20:00,030 Die Milch ist in der ehemaligen gegossen worden Orangensaft ist Glas, oder umgekehrt. 494 00:20:00,030 --> 00:20:04,750 >> Und wenn ich als nächstes tun wieder, und jetzt wenn ich ausdrucken als Plausibilitätsprüfung, 495 00:20:04,750 --> 00:20:07,687 ein immer noch zwei, aber b ist nun ein. 496 00:20:07,687 --> 00:20:08,770 Ehrlich gesagt, es ist immer noch da. 497 00:20:08,770 --> 00:20:10,670 Es ist mir egal, welche Temperatur ist. 498 00:20:10,670 --> 00:20:16,850 Aber sobald ich jetzt geben, sagen wir mal, weiter zurück gehen, jetzt bin ich am Ende 499 00:20:16,850 --> 00:20:17,480 Das Programm. 500 00:20:17,480 --> 00:20:20,730 Und leider ist x immer noch einer und y noch zwei. 501 00:20:20,730 --> 00:20:22,272 >> Also, was war der Nutzen der GDB da? 502 00:20:22,272 --> 00:20:23,980 Es half nicht, mich zu beheben das Problem an sich, 503 00:20:23,980 --> 00:20:26,265 aber es hoffentlich mir helfen verstehen es durch die Realisierung 504 00:20:26,265 --> 00:20:30,000 dass ja, das ist meine Logik richtig, aber mein Code letztlich nicht mit 505 00:20:30,000 --> 00:20:31,450 eine dauerhafte Wirkung. 506 00:20:31,450 --> 00:20:34,570 Also das ist ein Problem, wir sind denn jetzt heute zu lösen. 507 00:20:34,570 --> 00:20:37,870 >> Aber lassen Sie es bekommen durch diese. 508 00:20:37,870 --> 00:20:39,230 String ist eine Lüge. 509 00:20:39,230 --> 00:20:41,860 Auch sie kein Datentyp das existiert in C. Es ist 510 00:20:41,860 --> 00:20:44,750 ein Synonym für einige Zeit für etwas anderes, 511 00:20:44,750 --> 00:20:47,300 und wir können zeigen, dass wie folgt. 512 00:20:47,300 --> 00:20:53,282 >> Lassen Sie mich gehen Sie vor und öffnen ein Programm namens vergleichen-0. 513 00:20:53,282 --> 00:20:56,240 Und eher als Typ dieses heraus, wir beginnen, um den Code zu Fuß 514 00:20:56,240 --> 00:20:58,040 Habe ich bereits geschrieben, aber es ist nur ein paar Zeilen. 515 00:20:58,040 --> 00:20:59,570 So ist dies vergleichen-0. 516 00:20:59,570 --> 00:21:02,380 Und das erste, was ich mache ist immer eine Textzeile. 517 00:21:02,380 --> 00:21:05,610 >> Beachten Sie aber, was ich bin dabei zum ersten Mal. 518 00:21:05,610 --> 00:21:07,910 Was ist anders klar über Linie 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 Eigentlich, warten Sie eine Minute. 521 00:21:11,402 --> 00:21:12,110 Dies ist kopier zwei. 522 00:21:12,110 --> 00:21:13,568 Das ist auch nicht das richtige Programm. 523 00:21:13,568 --> 00:21:14,780 Alle Rechte, Spoiler Alarm. 524 00:21:14,780 --> 00:21:16,890 Alles in Ordnung, so egal, dass. 525 00:21:16,890 --> 00:21:18,520 Das ist die Antwort auf eine künftige Frage. 526 00:21:18,520 --> 00:21:21,450 >> Hier ist zu vergleichen-0, und ich bin etwa um eine Textzeile zu bekommen. 527 00:21:21,450 --> 00:21:22,435 Programms wesentlich einfacher. 528 00:21:22,435 --> 00:21:23,560 Also das ist einfach. 529 00:21:23,560 --> 00:21:28,070 Das ist wie eine Woche, Woche zwei Sachen im Augenblick. string s = GetString. 530 00:21:28,070 --> 00:21:29,700 Nun, ich sage es noch einmal hier unten. 531 00:21:29,700 --> 00:21:31,830 String t = GetString. 532 00:21:31,830 --> 00:21:35,300 Und dann das letzte, was in dieser Programm, wie der Name schon sagt, 533 00:21:35,300 --> 00:21:37,090 ist werde ich versuchen, sie zu vergleichen. 534 00:21:37,090 --> 00:21:40,709 >> Also, wenn s, die erste Saite, gleich = t, dann bin ich 535 00:21:40,709 --> 00:21:42,250 sagen Sie das Gleiche geben. 536 00:21:42,250 --> 00:21:44,291 Else, ich werde sagen, Sie geben verschiedene Dinge. 537 00:21:44,291 --> 00:21:45,880 Lassen Sie uns also kompilieren und führen Sie dieses Programm. 538 00:21:45,880 --> 00:21:48,481 So stellen Sie vergleichen Null. 539 00:21:48,481 --> 00:21:48,980 Sieht gut aus. 540 00:21:48,980 --> 00:21:50,490 Keine Fehler Zusammenstellung. 541 00:21:50,490 --> 00:21:52,386 >> Lassen Sie mich jetzt voran gehen und geben ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Lassen Sie mich gehen Sie vor und sagen etwas : Daven und etwas: Rob. 544 00:21:59,220 --> 00:22:00,450 Und ich geben verschiedene Dinge. 545 00:22:00,450 --> 00:22:01,250 So weit, ist es gut. 546 00:22:01,250 --> 00:22:02,680 Programm scheint korrekt zu sein. 547 00:22:02,680 --> 00:22:03,880 >> Aber lassen Sie uns starten Sie es erneut. 548 00:22:03,880 --> 00:22:05,800 Sagen Sie etwas: Gabe. 549 00:22:05,800 --> 00:22:07,140 Sagen Sie etwas: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 In Ordnung. 552 00:22:09,020 --> 00:22:10,851 Vielleicht traf ich die Leertaste oder etwas flippig. 553 00:22:10,851 --> 00:22:11,600 Lassen Sie es wieder tun. 554 00:22:11,600 --> 00:22:13,020 So Zamyla. 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla. 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 Verschiedene Dinge. 559 00:22:17,330 --> 00:22:19,430 Also, was ist da los? 560 00:22:19,430 --> 00:22:23,200 >> Also haben wir diese zwei Zeilen Code, GetString zweimal genannt. 561 00:22:23,200 --> 00:22:25,760 Und dann bin ich einfach versuchen, zu vergleichen s und t. 562 00:22:25,760 --> 00:22:28,370 Aber was dann wirklich los ist? 563 00:22:28,370 --> 00:22:31,180 Nun, über meine Handschrift zu Metzger dieses Beispiel etwas. 564 00:22:31,180 --> 00:22:34,630 Und lassen Sie uns eigentlich werfen diese bis hier, wie gut. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> So haben wir eine Zeile wie string s = GetString. 567 00:22:45,712 --> 00:22:48,295 Also das ist einfach die erste interessante Linie von diesem Programm. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Aber was die ganze Zeit war geht unter der Haube? 570 00:22:52,974 --> 00:22:55,890 Nun, auf der linken Seite ist string, Das ist eine Art von Variablen, 571 00:22:55,890 --> 00:22:56,785 und es heißt s. 572 00:22:56,785 --> 00:23:00,019 Also ich weiß, dass dies mit Speicher oder RAM, in meinem Computer irgendwie. 573 00:23:00,019 --> 00:23:02,060 Also werde ich zu abstrakt ziehen, dass ein Quadrat. 574 00:23:02,060 --> 00:23:04,820 32 Bits, es stellt sich heraus, aber mehr dazu in der Zukunft. 575 00:23:04,820 --> 00:23:06,410 Und dann, was ist los hier? 576 00:23:06,410 --> 00:23:08,700 >> Nun, offensichtlich GetString Ruft eine Zeichenfolge von dem Benutzer. 577 00:23:08,700 --> 00:23:11,360 Und bekam GetString Zamyla oder Gabe oder Daven. 578 00:23:11,360 --> 00:23:14,640 Also wählen wir den ersten von denen, die Daven war. 579 00:23:14,640 --> 00:23:19,174 So effektiv, bekam, was GetString mich in diesem ersten Fall war D-a-v-e-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 Und dann, was hast es mir heimlich? 582 00:23:25,045 --> 00:23:25,920 ZIELGRUPPE: [unverständlich] 583 00:23:25,920 --> 00:23:28,720 David J. MALAN: Ja, die / 0 oder Null-Zeichen. 584 00:23:28,720 --> 00:23:30,550 So ist es effektiv gab mir einen String. 585 00:23:30,550 --> 00:23:34,550 Aber wir wissen bereits aus früheren sieht, dass ein String nur ein Array 586 00:23:34,550 --> 00:23:37,895 von Zeichen, und es ist von beendet Diese spezielle Wächter Charakter, / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Aber wenn das wahr ist und dies ist ein Quadrat, 589 00:23:42,310 --> 00:23:44,160 das ist eindeutig ein viel größeres Rechteck. 590 00:23:44,160 --> 00:23:46,830 Und in der Tat ist dies, Ich behaupte, nur 32 Bit. 591 00:23:46,830 --> 00:23:49,500 Und das ist deutlich mehr als 32 Bits, da dies wahrscheinlich 592 00:23:49,500 --> 00:23:51,583 acht plus acht plus acht plus acht plus acht, 593 00:23:51,583 --> 00:23:53,320 gerade weil der Bytes in ASCII. 594 00:23:53,320 --> 00:23:57,030 Wie zum Teufel sollen wir passen Daven in diese kleine Box hier? 595 00:23:57,030 --> 00:23:59,880 >> Nun, was ist eigentlich GetString tun? 596 00:23:59,880 --> 00:24:03,680 Nun, hier stellt dieses Gitter Speicher oder RAM meines Computers. 597 00:24:03,680 --> 00:24:07,564 Also lassen Sie uns sagen, dass wenn willkürlich jedes von diesen ist ein Byte, 598 00:24:07,564 --> 00:24:09,730 dann werden wir von jeder denken kann Byte als eine Adresse hat, 599 00:24:09,730 --> 00:24:13,830 wie 33 Oxford Street, oder 34 Oxford Street, Oxford Street oder 35. 600 00:24:13,830 --> 00:24:16,700 >> So wie Häuser haben Adressen und Gebäude haben Adressen, 601 00:24:16,700 --> 00:24:19,810 Dazu einzelnen Bytes Gedächtnis haben Adressen oder Nummern 602 00:24:19,810 --> 00:24:21,042 dass sie eindeutig zu identifizieren. 603 00:24:21,042 --> 00:24:22,000 Nun, dies ist willkürlich. 604 00:24:22,000 --> 00:24:25,370 Aber um es einfach zu halten, ich bin zu gehen hexadezimale nur durch Konvention, 605 00:24:25,370 --> 00:24:28,200 aber das bedeutet nichts anderes, 0x als "das ist hexadezimal." 606 00:24:28,200 --> 00:24:31,030 und ich werde dass der Anspruch des "D" endet in Byte Ein im Speicher. 607 00:24:31,030 --> 00:24:34,210 >> Ich habe nichts anderes passiert in Speicher, so Daven bekam den ersten Platz 608 00:24:34,210 --> 00:24:35,509 bei Byte One. 609 00:24:35,509 --> 00:24:36,800 Das also wird sich 0x2 sein. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Dies ist auf 0x3 gehen. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Das wird 0x4 sein. 614 00:24:41,800 --> 00:24:43,025 Dies ist auf 0x5 gehen. 615 00:24:43,025 --> 00:24:44,025 Das wird 0x6 sein. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Aber sobald Sie anfangen, über das, was der Computer tut 618 00:24:48,290 --> 00:24:50,710 unter der Haube, können Sie beginnen, schließen 619 00:24:50,710 --> 00:24:54,960 wie Sie vor einigen Jahren wäre C haben selbst implementiert. 620 00:24:54,960 --> 00:24:58,360 Was ist wohl GetString returning--, weil es 621 00:24:58,360 --> 00:25:00,946 fühlt sich an wie es ist nicht Zurück Daven per se 622 00:25:00,946 --> 00:25:03,320 weil er sicher nicht gehen in diesem kleinen box-- passen 623 00:25:03,320 --> 00:25:05,090 Also, was ist GetString wahrscheinlich zurückkehren? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> ZIELGRUPPE: [unverständlich] 626 00:25:08,920 --> 00:25:10,540 >> David J. MALAN: Die Lage des Daven. 627 00:25:10,540 --> 00:25:12,770 Und es ist das getan, seit Week One. 628 00:25:12,770 --> 00:25:16,150 Was ist wirklich GetString Rückkehr ist kein String, an sich. 629 00:25:16,150 --> 00:25:17,780 Das ist eine von den kleinen Notlügen. 630 00:25:17,780 --> 00:25:22,520 Es zurück die Adresse der String im Speicher, die eindeutige Adresse. 631 00:25:22,520 --> 00:25:24,820 Daven lebt bei 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Aber kurz und bündig, lebt Gavin bei 0x1, Adresse Nummer Eins. 633 00:25:29,310 --> 00:25:32,280 >> Also, was wird in diese setzen kleine Box dann, klar zu sein, 634 00:25:32,280 --> 00:25:35,930 ist nur die Adresse dieser Zeichenkette. 635 00:25:35,930 --> 00:25:38,110 Also die ganze Zeit, dies hat schon. 636 00:25:38,110 --> 00:25:41,650 Aber was diese Hinweise bei Jetzt ist, wenn alle S 637 00:25:41,650 --> 00:25:44,710 eine Zahl in der es, wer ist Sie zu stoppen, der Programmierer, 638 00:25:44,710 --> 00:25:47,970 aus, dass jeder beliebige Zahl in jede Variable und nur Springen 639 00:25:47,970 --> 00:25:49,080 zu diesem Teil des Speichers? 640 00:25:49,080 --> 00:25:51,320 Und in der Tat, wir werden sehen das ist eine Bedrohung nächsten Mal. 641 00:25:51,320 --> 00:25:53,500 >> Aber jetzt fühlt sich unzureichend. 642 00:25:53,500 --> 00:25:55,630 Wenn ich sage, hol mir ein String, mich Daven geben. 643 00:25:55,630 --> 00:25:57,230 Aber Sie müssen nicht wirklich geben mir Daven. 644 00:25:57,230 --> 00:25:59,310 Alles, was Sie mir geben, ist Daven-Adresse ein. 645 00:25:59,310 --> 00:26:04,310 Wie kann ich dann sicher wissen, Daven wo beginnt und ends-- 646 00:26:04,310 --> 00:26:07,140 die Geschichte wird immer weird-- wobei Daven beginnt und endet, 647 00:26:07,140 --> 00:26:10,435 und dann wird die nächste String im Speicher beginnt? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Nun, wenn Sie Übergabe sind mich der Anfang von Daven, 650 00:26:13,620 --> 00:26:17,230 im Wesentlichen, wie kann ich wissen wo das Ende sein Name ist? 651 00:26:17,230 --> 00:26:20,550 Das spezielle Null-Zeichen, die ist umso wichtiger jetzt 652 00:26:20,550 --> 00:26:23,040 wenn Strings unter der Haube einfach identifiziert 653 00:26:23,040 --> 00:26:25,820 eindeutig durch ihre Position in dem Speicher. 654 00:26:25,820 --> 00:26:28,130 Also die ganze Zeit, das ist was los war. 655 00:26:28,130 --> 00:26:32,470 >> Also, wenn wir jetzt zu betrachten der Code hier erklären 656 00:26:32,470 --> 00:26:35,790 wenn Sie die Fehler in Zeile 26 würde. 657 00:26:35,790 --> 00:26:39,560 Warum ist Zamyla und Zamyla anders? 658 00:26:39,560 --> 00:26:41,330 Warum ist Gabe und Gabe anders? 659 00:26:41,330 --> 00:26:42,154 Ja, auf der Rückseite. 660 00:26:42,154 --> 00:26:43,390 >> ZIELGRUPPE: Sie haben unterschiedliche Adressen. 661 00:26:43,390 --> 00:26:45,931 >> David J. MALAN: Ganz einfach, weil sie haben unterschiedliche Adressen. 662 00:26:45,931 --> 00:26:48,820 Denn wenn Sie GetString nennen wieder, was ich hier zu tun schnell, 663 00:26:48,820 --> 00:26:52,870 wenn dies die zweite Zeile, string t, wie ich in diesem Programm haben, 664 00:26:52,870 --> 00:26:55,030 gleich einen weiteren Anruf zu GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 Das nächste Mal rufe ich GetString, ich werde 667 00:26:58,670 --> 00:27:00,190 , um einen anderen Teil des Speichers zu erhalten. 668 00:27:00,190 --> 00:27:02,220 >> GetString ist erlaubt das Betriebs fragen 669 00:27:02,220 --> 00:27:03,800 System für mehr und mehr Speicher. 670 00:27:03,800 --> 00:27:07,894 Es wird nicht um das gleiche wiederverwenden sechs Bytes jedes einzelne Mal. 671 00:27:07,894 --> 00:27:09,810 Es wird eine neue zu bekommen Teil des Speichers, die 672 00:27:09,810 --> 00:27:12,780 bedeutet, t wird zu bekommen einen anderen Wert hier. 673 00:27:12,780 --> 00:27:15,380 >> Also, wenn ich s gleich = t, du bist nicht zu vergleichen 674 00:27:15,380 --> 00:27:17,880 D gegen diese und gegen A Diese und V dagegen. 675 00:27:17,880 --> 00:27:19,588 Sie vergleichen diese gegen diese, die 676 00:27:19,588 --> 00:27:24,020 ehrlich gesagt ist ziemlich useful-- useless-- ist ziemlich nutzlos, weil die wirklich 677 00:27:24,020 --> 00:27:25,830 kümmert, wo die Saiten in Erinnerung? 678 00:27:25,830 --> 00:27:26,850 >> Und in der Tat haben wir nicht. 679 00:27:26,850 --> 00:27:28,980 Und wir sind es nicht gewohnt, Start besonders fürsorglich. 680 00:27:28,980 --> 00:27:34,180 Nur in dem Ausmaß, dass Fehler auftreten können, und Sicherheitsbedrohungen können entstehen 681 00:27:34,180 --> 00:27:36,100 wir tatsächlich beginnen, sich dafür interessieren. 682 00:27:36,100 --> 00:27:37,230 Also lassen Sie dieses Problem beheben. 683 00:27:37,230 --> 00:27:39,650 Stellt sich heraus, können Sie es beheben Super einfach. 684 00:27:39,650 --> 00:27:42,600 >> Und lassen Sie eigentlich, bevor ich zeigen, dass wieder, was würden 685 00:27:42,600 --> 00:27:47,170 Sie, wenn in einer Klasse zu tun CS50, Sie implementieren und hatte 686 00:27:47,170 --> 00:27:48,600 ein Vergleich gegen zwei Saiten. 687 00:27:48,600 --> 00:27:51,440 Man kann deutlich nicht einfach s = t entspricht. 688 00:27:51,440 --> 00:27:54,090 Aber nur logisch, wie würden Sie diese Zeichenfolge vergleichen 689 00:27:54,090 --> 00:27:56,370 gegen diese Zeichenfolge unter Verwendung von C-Code? 690 00:27:56,370 --> 00:27:56,880 Ja. 691 00:27:56,880 --> 00:27:58,780 >> ZIELGRUPPE: Just do die for-Schleife [unverständlich] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 David J. MALAN: Perfect. 694 00:28:01,670 --> 00:28:02,900 ZIELGRUPPE: [unverständlich] 695 00:28:02,900 --> 00:28:03,310 David J. MALAN: Ja. 696 00:28:03,310 --> 00:28:05,390 Verwenden Sie einfach eine for-Schleife oder eine while-Schleife oder was auch immer. 697 00:28:05,390 --> 00:28:08,710 Aber gerade die Grundidee gelten, dass, wenn Dies ist ein Teil des Speichers oder eines Arrays 698 00:28:08,710 --> 00:28:11,590 und das ist, durchlaufen beide zur gleichen Zeit. 699 00:28:11,590 --> 00:28:12,960 Und vergleichen Sie die Buchstaben. 700 00:28:12,960 --> 00:28:14,260 >> Und man muss eine sein, habe wenig vorsichtig, weil man 701 00:28:14,260 --> 00:28:16,247 möchte nicht einen Finger in der Vergangenheit der anderen gehen 702 00:28:16,247 --> 00:28:18,080 weil eine Saite ist länger als der andere. 703 00:28:18,080 --> 00:28:21,380 So dass Sie gehen, um den Check zu wollen sind Dieser spezielle Wert am Ende, null. 704 00:28:21,380 --> 00:28:24,017 Aber es ist wirklich, in der Ende, so einfach ist das. 705 00:28:24,017 --> 00:28:26,100 Und ehrlich gesagt, wir brauchen nicht neu zu erfinden das Rad. 706 00:28:26,100 --> 00:28:27,960 Hier ist Version zwei. 707 00:28:27,960 --> 00:28:32,910 Und was ich hier zu sagen ist, dass Anstelle des Vergleichs s = t entspricht, 708 00:28:32,910 --> 00:28:38,964 Ich bin stattdessen sagen, wenn der String Vergleich von s Komma t gleich = 0 ist. 709 00:28:38,964 --> 00:28:40,130 Nun, was ist String vergleichen? 710 00:28:40,130 --> 00:28:43,046 >> Es stellt sich heraus, es ist eine Funktion, die kommt mit C, deren Zweck im Leben 711 00:28:43,046 --> 00:28:44,650 ist es, zwei Zeichenketten zu vergleichen. 712 00:28:44,650 --> 00:28:48,300 Und rühren, zu vergleichen, wenn wir lesen, seine man-Seite oder in der Dokumentation oder CS50 713 00:28:48,300 --> 00:28:50,630 Referenz, wird es einfach sagen, dass die Aufsehen 714 00:28:50,630 --> 00:28:55,730 Vergleichen gibt entweder eine negative Nummer oder eine positive Zahl oder Null ist, 715 00:28:55,730 --> 00:28:57,660 wobei Null bedeutet, dass sie gleich sind. 716 00:28:57,660 --> 00:28:58,570 >> Also nur eine Vermutung. 717 00:28:58,570 --> 00:29:00,390 Was könnte es bedeuten, wenn rühren vergleichen Renditen 718 00:29:00,390 --> 00:29:02,110 negativen Wert oder positiven Wert? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 ZIELGRUPPE: größer oder kleiner als. 721 00:29:04,285 --> 00:29:05,570 David J. MALAN: Ja, größer oder kleiner. 722 00:29:05,570 --> 00:29:08,640 Also, wenn Sie eine ganze sortieren wollte Reihe von Zeichenfolgen in einer dictionary-- 723 00:29:08,640 --> 00:29:12,975 als wir schließlich auf der road-- perfekte Funktion, um möglicherweise zu verwenden, 724 00:29:12,975 --> 00:29:15,850 weil es sich, das zu tun Vergleich von Strings für Sie, und sagen, 725 00:29:15,850 --> 00:29:20,060 Sie funktioniert eine kommt vor b, oder tut b vor einer alphabetisch kommen. 726 00:29:20,060 --> 00:29:21,490 Wir können genau das tun. 727 00:29:21,490 --> 00:29:23,620 >> Und merke ich eine andere tat was in diesem Beispiel. 728 00:29:23,620 --> 00:29:26,870 Was hat sich geändert höher in dieser Hauptfunktion? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 Char *. 731 00:29:29,350 --> 00:29:31,150 Und das ist, dass andere Notlüge. 732 00:29:31,150 --> 00:29:33,750 Die ganze Zeit, als Sie haben, schreibt Schnur, 733 00:29:33,750 --> 00:29:38,350 wir wurden heimlich umgeschrieben String als char *, so dass Klang tatsächlich 734 00:29:38,350 --> 00:29:39,270 Sie versteht. 735 00:29:39,270 --> 00:29:42,450 >> Mit anderen Worten, in CS50.h und wie wir schließlich sehen, 736 00:29:42,450 --> 00:29:45,950 wir haben ein Synonym namens String das ist das gleiche wie char *. 737 00:29:45,950 --> 00:29:49,910 Und jetzt, nur, dass die wissen, * In diesem Zusammenhang, zumindest, 738 00:29:49,910 --> 00:29:51,286 bedeutet die Adresse. 739 00:29:51,286 --> 00:29:52,210 >> Die Adresse von was? 740 00:29:52,210 --> 00:29:56,390 Nun, die Tatsache, dass ich sagte, char *, int und nicht * oder * schweben, 741 00:29:56,390 --> 00:30:00,820 bedeutet, dass char * ist die Adresse eines char. 742 00:30:00,820 --> 00:30:06,770 Also diese kleine Box hier, auch bekannt als String, ist wirklich der Typ char *, 743 00:30:06,770 --> 00:30:10,490 Das ist einfach eine andere Art zu sagen, In diesem Feld wird eine Adresse gehen. 744 00:30:10,490 --> 00:30:12,430 Und was bedeutet das Adresse beziehen sich auf? 745 00:30:12,430 --> 00:30:13,780 Offenbar ein Zeichen. 746 00:30:13,780 --> 00:30:16,410 >> Aber wir konnten absolut haben int * und andere Dinge. 747 00:30:16,410 --> 00:30:20,790 Aber jetzt ist char * wirklich das Beste unkompliziert und einem von Interesse. 748 00:30:20,790 --> 00:30:23,310 So dass dieses Problem wird steigen, aber erneut. 749 00:30:23,310 --> 00:30:24,830 >> Angenommen, ich dieses Programm für. 750 00:30:24,830 --> 00:30:27,670 Mal sehen, ob wir jetzt vorhersagen kann was ist los mit diesem Code. 751 00:30:27,670 --> 00:30:31,140 Also in diesem Programm, kopieren-0, Ich bin werde weitermachen und wieder anrufen 752 00:30:31,140 --> 00:30:34,190 GetString und den Wert in s. 753 00:30:34,190 --> 00:30:38,800 >> Und dann, warum mache ich das, nur als Erinnerung von Wochen Vergangenheit? 754 00:30:38,800 --> 00:30:40,960 Wir haben sagen, dass GetString manchmal null zurück. 755 00:30:40,960 --> 00:30:42,793 Was bedeutet es, wenn meine GetString null zurück? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Etwas ist schief gelaufen. 758 00:30:46,034 --> 00:30:48,950 Es bedeutet wohl der String ist auch groß, der Speicher des Computers. 759 00:30:48,950 --> 00:30:51,724 Es passiert super, super, super selten, aber es kann passieren. 760 00:30:51,724 --> 00:30:53,890 Wir wollen für sie zu überprüfen, und das ist alles, was wir tun. 761 00:30:53,890 --> 00:30:57,910 >> Weil wir jetzt sehen werden, wenn Sie dies nicht tun Beginn Check für gewöhnlich Dinge 762 00:30:57,910 --> 00:31:00,870 wie null, können Sie tatsächlich beginnen zu gehen 763 00:31:00,870 --> 00:31:03,106 Adressen im Speicher, die ungültig sind. 764 00:31:03,106 --> 00:31:05,980 Und wir beginnen zu induzieren sind mehr und mehr Segmentation Faults. 765 00:31:05,980 --> 00:31:08,360 Oder in einem Mac oder einem PC, nur Veranlassen eines Computers zum Aufhängen 766 00:31:08,360 --> 00:31:10,340 oder ein Programm zu frieren, möglicherweise. 767 00:31:10,340 --> 00:31:14,930 >> So, jetzt behaupten, ich in Kopie-0.c, dass ich werde diese Zeichenfolgen durch kopieren 768 00:31:14,930 --> 00:31:15,685 der Leitung 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 Und dann, ich werde an der Unterseite, dadurch gekennzeichnet 771 00:31:18,750 --> 00:31:21,430 hier, dass ich werde , einen von ihnen zu ändern. 772 00:31:21,430 --> 00:31:22,330 >> So merkt das. 773 00:31:22,330 --> 00:31:24,370 Ich rufe unseren alten Freund strlen. 774 00:31:24,370 --> 00:31:28,960 Und nur auf Englisch erklären was diese Linie 34 ist da? 775 00:31:28,960 --> 00:31:32,480 Was bedeutet t Halterung 0 stellen auf der linken Seite. 776 00:31:32,480 --> 00:31:32,980 Ja. 777 00:31:32,980 --> 00:31:34,339 >> ZIELGRUPPE: Erstes Zeichen von T? 778 00:31:34,339 --> 00:31:35,880 David J. MALAN: Erstes Zeichen von t. 779 00:31:35,880 --> 00:31:36,379 Das ist es. 780 00:31:36,379 --> 00:31:40,024 Erste Zeichen von t, ich will um die Großversion zuordnen 781 00:31:40,024 --> 00:31:41,190 des ersten Zeichens in t. 782 00:31:41,190 --> 00:31:43,200 Das ist also Kapital der erste Buchstabe. 783 00:31:43,200 --> 00:31:46,340 Und dann, das allerletzte, was ich tun In diesem Programm ist, dass ich behaupten, hier ist 784 00:31:46,340 --> 00:31:50,340 das Original, S, und hier ist die Kopie, t. 785 00:31:50,340 --> 00:31:54,610 >> Aber auf der Basis der Geschichte, die wir gerade erzählt, was Saiten wirklich sind, 786 00:31:54,610 --> 00:31:57,520 Was ist die Linie 28 wirklich tut, und was 787 00:31:57,520 --> 00:31:59,405 die daraus resultierende Fehler gehen auf dem Bildschirm sein? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Also zuerst, die erste Frage, 28. 790 00:32:03,500 --> 00:32:09,040 Was ist String t = s wirklich tun? 791 00:32:09,040 --> 00:32:16,430 Wenn man auf der linken Seite haben Seiten hier String t = s; 792 00:32:16,430 --> 00:32:19,400 das gibt mir eine Box hier und hier eine Box. 793 00:32:19,400 --> 00:32:25,530 Und angenommen, diese Adresse 0x, sagen wir mal, 50 dieses Mal, willkürlich. 794 00:32:25,530 --> 00:32:28,847 Was bedeutet String t = s tun unter der Haube? 795 00:32:28,847 --> 00:32:30,340 >> ZIELGRUPPE: [unverständlich] 796 00:32:30,340 --> 00:32:34,100 >> David J. MALAN: Es speichert die Speicher Adresse gibt, so geht es 0x50. 797 00:32:34,100 --> 00:32:37,980 Also, wenn jetzt, gehe ich in der ersten Zeichen in Großbuchstaben T und es, 798 00:32:37,980 --> 00:32:39,535 was soll ich tun, um effektiv zu s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Ich bin wirklich das Gleiche tun, oder? 801 00:32:43,450 --> 00:32:47,680 Denn wenn 0x50-- Adresse und gerecht, ich nicht viel Platz auf dem Board haben hier, 802 00:32:47,680 --> 00:32:51,750 aber davon ausgehen, dass dies hier unten 0x50, irgendwo im Speicher meines Computers. 803 00:32:51,750 --> 00:32:55,825 >> Und ich habe, zum Beispiel, Gabe hier in Kleinbuchstaben, wie diese. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 Und ich habe gesagt, t Halterung 0 wird aktiviert. 806 00:33:01,980 --> 00:33:04,860 Nun, t 0 Halterung ist der erste Buchstabe in t. 807 00:33:04,860 --> 00:33:07,840 So wenig g ist los groß geworden G. Aber das Problem 808 00:33:07,840 --> 00:33:09,410 ist, was ist auch, darauf hinzuweisen? 809 00:33:09,410 --> 00:33:10,300 >> ZIELGRUPPE: Das gleiche. 810 00:33:10,300 --> 00:33:11,841 >> David J. MALAN: exakt das gleiche Ding. 811 00:33:11,841 --> 00:33:16,342 So eine einfache Erklärung vielleicht, auch wenn die Syntax ist ein wenig seltsam. 812 00:33:16,342 --> 00:33:17,050 Also lassen Sie uns dies tun. 813 00:33:17,050 --> 00:33:20,210 Machen Kopie-0 und dann ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Sagen Sie etwas: Gabe. 816 00:33:24,110 --> 00:33:26,760 Und leider, sowohl von sie haben jetzt aktiviert wurde, 817 00:33:26,760 --> 00:33:29,500 aber für diesen Basiswert Grund dafür, dass wir einfach 818 00:33:29,500 --> 00:33:32,350 nun mit Adressen. 819 00:33:32,350 --> 00:33:36,470 >> So, wie wir beginnen address-- kein Wortspiel intended-- 820 00:33:36,470 --> 00:33:39,270 Wie können wir damit beginnen, richten Diese besondere Problem? 821 00:33:39,270 --> 00:33:44,400 Nun, in copy1.c, die Dinge laufen um ein wenig komplizierter. 822 00:33:44,400 --> 00:33:49,310 Aber ich würde behaupten, ein konzeptionell einfache Lösung. 823 00:33:49,310 --> 00:33:50,852 >> So schwer, auf den ersten Blick zu bekommen. 824 00:33:50,852 --> 00:33:53,560 Nicht einfach für die erste zu sein, Zeit, die Sie geben es aus, vielleicht, 825 00:33:53,560 --> 00:33:57,440 aber wenn das Problem ist, dass einfach tun, t = s nur 826 00:33:57,440 --> 00:33:59,694 kopiert die Adresse, was, wieder, wenn ich auf Sie wählen, 827 00:33:59,694 --> 00:34:02,110 wird sich die Lösung sein eigentlich eine Kopie für einen String? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> ZIELGRUPPE: Wir werden wahrscheinlich verwenden Sie eine Schleife wieder. 830 00:34:06,770 --> 00:34:06,890 >> David J. MALAN: Ja. 831 00:34:06,890 --> 00:34:08,390 Also werden wir, um eine Schleife wieder benötigen. 832 00:34:08,390 --> 00:34:11,800 Und weil, wenn wir kopieren wollen ein String s in eine andere Zeichenfolge, 833 00:34:11,800 --> 00:34:14,120 wir wahrscheinlich wollen, es zu tun Zeichen für Zeichen. 834 00:34:14,120 --> 00:34:17,199 Aber das Problem ist, wenn Dies ist ursprünglich s, 835 00:34:17,199 --> 00:34:22,159 Jetzt müssen wir explizit starten Zuweisen von Speicher für t. 836 00:34:22,159 --> 00:34:24,320 >> Mit anderen Worten, wir neu zeichnen diese ein letztes Mal. 837 00:34:24,320 --> 00:34:28,659 Wenn dies string s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 Und lassen wir diese hier, wie gut. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 Dies ist GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 Und dann ist das Bild etwas wie das wird sein wie zuvor, 844 00:34:43,860 --> 00:34:44,360 g-a-b-e / 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 Das sieht ein wenig so etwas wie dieses. 847 00:34:48,960 --> 00:34:53,650 Und s daher nennen wir das 0x50, und das wird auf 51, 52 sein. 848 00:34:53,650 --> 00:34:54,409 >> Das ist also 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 Und dann, ich weiß String t. 851 00:34:59,690 --> 00:35:02,450 In Erinnerung, das ist gerade dabei, geben Sie mir einen kleinen Platz wie diesem. 852 00:35:02,450 --> 00:35:04,080 Also, was ist der entscheidende Schritt ist jetzt? 853 00:35:04,080 --> 00:35:09,870 Wenn ich s in t zu kopieren, was Rohling brauchen wir, um hier zu füllen? 854 00:35:09,870 --> 00:35:12,050 Oder was brauchen wir, um tun auf einem hohen Niveau? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Ja? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Jemand? 859 00:35:17,020 --> 00:35:17,690 Ja. 860 00:35:17,690 --> 00:35:19,214 >> ZIELGRUPPE: Wir müssen [unverständlich]. 861 00:35:19,214 --> 00:35:21,380 David J. MALAN: Ja, wir müssen in dieser leere zu füllen. 862 00:35:21,380 --> 00:35:24,340 Ich kann nicht kopieren und dann Kapital Gabe Namen 863 00:35:24,340 --> 00:35:28,120 bis ich fragen, das Betriebssystem für einen anderen Teil des Speichers 864 00:35:28,120 --> 00:35:30,640 das ist mindestens so groß wie das Original. 865 00:35:30,640 --> 00:35:32,130 So dass lässt uns mit einer Frage. 866 00:35:32,130 --> 00:35:36,080 >> Wie frage ich das Betriebssystem nicht nur für eine kleine, einfache pointer-- 867 00:35:36,080 --> 00:35:38,530 dies heißt, ein Adresse, eine pointer-- nicht 868 00:35:38,530 --> 00:35:40,980 für eine einfache kleine Box wie nennt man das einen String? 869 00:35:40,980 --> 00:35:44,200 Wie kann ich das Betriebs fragen System für einen großen Teil des Speichers? 870 00:35:44,200 --> 00:35:48,430 Bisher habe ich nur bekommen das zurück indirekt durch den Aufruf GetString. 871 00:35:48,430 --> 00:35:50,740 Also, wie ist GetString sogar immer seine Erinnerung? 872 00:35:50,740 --> 00:35:53,430 >> Nun, es stellt sich heraus, dass es hier diese andere Funktion 873 00:35:53,430 --> 00:35:55,160 dass wir jetzt damit beginnen, zu verwenden. 874 00:35:55,160 --> 00:35:59,780 Nun, das sieht viel mehr kryptische than-- und ich bin der einzige, der es-- sehen können 875 00:35:59,780 --> 00:36:03,150 Diese Zeile sieht so kryptischer dann sollte es auf den ersten Blick. 876 00:36:03,150 --> 00:36:04,650 Aber lassen Sie uns necken sie auseinander. 877 00:36:04,650 --> 00:36:07,950 >> Auf der linken Seite habe ich char * t. 878 00:36:07,950 --> 00:36:13,280 Also in Deutsch, Englisch, beginnen wir zu formulieren richtige Sätze im Fachjargon. 879 00:36:13,280 --> 00:36:19,757 Also das ist die Zuteilung einer Variable vom Typ char * t genannt. 880 00:36:19,757 --> 00:36:21,090 Nun, was bedeutet das wirklich? 881 00:36:21,090 --> 00:36:23,881 >> Nun, das bedeutet, was soll ich in dieser Variable namens t setzen? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Eine Adresse eines char. 884 00:36:26,402 --> 00:36:28,360 Also das ist nur die einfacheren, vernünftiger Weise 885 00:36:28,360 --> 00:36:29,930 der Beschreibung der linken Seite. 886 00:36:29,930 --> 00:36:32,890 So dass diese Box schafft hier nur. 887 00:36:32,890 --> 00:36:34,760 So dass die rechte Seite, Vermutlich wird 888 00:36:34,760 --> 00:36:37,170 zu vergeben, dass größere Teil des Speichers, wie? 889 00:36:37,170 --> 00:36:38,340 Also lassen Sie necken diese auseinander. 890 00:36:38,340 --> 00:36:41,131 >> Es ist überwältigend auf den ersten Blick aber was ist los hier drinnen? 891 00:36:41,131 --> 00:36:43,740 Zunächst gibt es malloc, die ist offenbar unser neuer Freund, 892 00:36:43,740 --> 00:36:45,450 "Speicher zuweisen." 893 00:36:45,450 --> 00:36:49,560 Also das ist das Argument übergeben hinein, so ist es ein ziemlich großes Argument. 894 00:36:49,560 --> 00:36:50,970 Also lassen Sie necken diese auseinander. 895 00:36:50,970 --> 00:36:53,410 >> Strlen s natürlich darstellt the-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 ZIELGRUPPE: Die Anzahl der Zeichen. 898 00:36:55,600 --> 00:36:56,710 David J. MALAN: Nur die Anzahl der Zeichen s. 899 00:36:56,710 --> 00:36:59,040 So dass die Länge s der Original-Zeichenkette. 900 00:36:59,040 --> 00:37:00,350 So G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 So ist es wahrscheinlich in diesem Fall vier. 902 00:37:02,320 --> 00:37:05,485 Warum mache ich ein nach Aufruf strlen von s? 903 00:37:05,485 --> 00:37:06,360 ZIELGRUPPE: [unverständlich] 904 00:37:06,360 --> 00:37:07,590 David J. MALAN: Für die Sonder Null-Zeichen. 905 00:37:07,590 --> 00:37:11,260 Wenn Sie mich fragen, was ist die Länge der Gabe Namen, ich werde sagen, vier. 906 00:37:11,260 --> 00:37:14,480 Unter der Haube, aber ich brauche dass fünften Byte für den Nullzeichen. 907 00:37:14,480 --> 00:37:16,100 Also das ist, warum ich das tue die +1. 908 00:37:16,100 --> 00:37:21,730 >> Jetzt brauchen Sie nur, wenn Sie aktiv sind dies Programm auf einem anderen Computer als, sagen wir, 909 00:37:21,730 --> 00:37:24,610 die CS50 Gerät, wobei die Größe eines Zeichens 910 00:37:24,610 --> 00:37:26,350 könnte anders sein aus meiner eigenen computer-- 911 00:37:26,350 --> 00:37:30,590 stellt sich heraus, dass ich das nennen Operator sizeof, fragen Sie einfach den Computer, 912 00:37:30,590 --> 00:37:32,870 was der Größe eines char auf diesem Computer? 913 00:37:32,870 --> 00:37:37,400 >> Und durch Multiplizieren dieser fünf Beispiel von der Größe eines char, die 914 00:37:37,400 --> 00:37:40,440 auf den meisten Computern wird nur eine, malloc sein 915 00:37:40,440 --> 00:37:44,830 wird sich für mich diese große zuweisen Teil des Speichers hier auf der rechten Seite. 916 00:37:44,830 --> 00:37:47,140 Und es geht um return-- es ist ein function-- so ist es 917 00:37:47,140 --> 00:37:48,265 werde mir was zurück? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 ZIELGRUPPE: Die Adresse? 920 00:37:51,830 --> 00:37:53,709 David J. MALAN: Die Adresse von was? 921 00:37:53,709 --> 00:37:55,250 ZIELGRUPPE: der Speicher zugeordnet? 922 00:37:55,250 --> 00:37:56,450 David J. MALAN: Von den Speicher zugeordnet. 923 00:37:56,450 --> 00:37:59,189 Also ich habe keine Ahnung, ehrlich gesagt, wo dies geht, um am Ende. 924 00:37:59,189 --> 00:38:01,480 Ich werde vorschlagen, dass es wird bei 0x88 am Ende. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Völlig willkürlich, aber irgendwo anders als 0x50, 927 00:38:06,009 --> 00:38:08,800 Da das Betriebssystem, was Für mich Windows und Mac OS zu tun, ist 928 00:38:08,800 --> 00:38:11,230 stellen Sie sicher, dass es was mir verschiedene Stücke von RAM. 929 00:38:11,230 --> 00:38:14,210 >> Also das ist der Wert, wenn die Teil des Speichers könnte am Ende. 930 00:38:14,210 --> 00:38:16,060 Also das ist, was hier landet in, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 So, jetzt klar, kann ich verstehen daß dies nicht das Gleiche wie diese, 933 00:38:21,570 --> 00:38:23,960 weil sie auf Zeige verschiedene Stücke von Speicher. 934 00:38:23,960 --> 00:38:29,980 Also, wenn ich jetzt tatsächlich auf diese kopieren möchten in, machen wir Ihnen vorgeschlagenen Lösung. 935 00:38:29,980 --> 00:38:36,870 >> Lassen Sie uns gerade gehen, erstellen Sie eine for-Schleife, und tun t i Halterung bekommt s i Halterung. 936 00:38:36,870 --> 00:38:39,760 Weil ich jetzt verwenden können, Dieses Array-ähnlichen Notation, 937 00:38:39,760 --> 00:38:43,390 denn auch wenn malloc sehr generisch ordnet mir Speicher, 938 00:38:43,390 --> 00:38:45,290 Speicher ist nur zusammenhängende Bytes. 939 00:38:45,290 --> 00:38:47,240 Byte, Byte, Byte-, Zurück, um wieder zurück. 940 00:38:47,240 --> 00:38:50,030 >> Ich kann sicherlich als Programmierer behandeln es als ein Array, das 941 00:38:50,030 --> 00:38:55,090 bedeutet, ich kann diesen schließlich vertraut verwenden Notation von nur einigen eckigen Klammern. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Also lassen Sie mich es zu unterbrechen, weil Dies ist eine Menge auf einmal, auch 944 00:39:00,020 --> 00:39:03,530 obwohl die Grundidee zur Erinnerung ist, dass String, die ganze Zeit, 945 00:39:03,530 --> 00:39:05,550 ist keine neue Datentyp an sich bekannt. 946 00:39:05,550 --> 00:39:10,150 Es ist nur eine so genannte Zeiger, eine Adresse eines Zeichens, 947 00:39:10,150 --> 00:39:12,650 das bedeutet, es ist nur eine Zahl dass durch menschliche Konvention 948 00:39:12,650 --> 00:39:15,350 neigen wir dazu, wie 0x etwas zu schreiben. 949 00:39:15,350 --> 00:39:18,590 >> Aber es ist nur eine Nummer, wie 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 , die zu den zufällig Adresse CS Gebäudes. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Sie haben Fragen zu diesen Details? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Ja? 955 00:39:25,289 --> 00:39:28,530 >> ZIELGRUPPE: Warum müssen wir überprüfen, für t gleich null? 956 00:39:28,530 --> 00:39:30,740 >> David J. MALAN: Warum haben wir prüfen t gleich null? 957 00:39:30,740 --> 00:39:33,250 Wenn wir lesen, die documentation-- große question-- für malloc, 958 00:39:33,250 --> 00:39:37,020 es wird in Kleingedruckte zu sagen, manchmal malloc könnte null zurück, 959 00:39:37,020 --> 00:39:38,080 wie GetString. 960 00:39:38,080 --> 00:39:41,820 Und in der Tat, gibt GetString null Wenn wiederum liefert malloc null, 961 00:39:41,820 --> 00:39:43,130 weil GetString verwendet malloc. 962 00:39:43,130 --> 00:39:46,400 >> Und das könnte passieren, wenn das Betriebssystem, Mac OS, Windows, was auch immer, ist einfach 963 00:39:46,400 --> 00:39:48,130 aus der Erinnerung für Sie. 964 00:39:48,130 --> 00:39:49,820 Also das ist, was da passiert. 965 00:39:49,820 --> 00:39:52,910 >> Und lassen Sie mich zeigen eine andere Sache dass nur blasen könnte Ihre Meinung 966 00:39:52,910 --> 00:39:55,100 oder vollständig zu weit über die Linie. 967 00:39:55,100 --> 00:39:59,770 Aber lassen Sie mich nach oben ziehen elbe for-Schleife zum Kopieren, 968 00:39:59,770 --> 00:40:05,480 die vor einem Augenblick war Rückruf Diese. t i Konsole bekommt s i Halterung. 969 00:40:05,480 --> 00:40:06,740 >> Schön und benutzerfreundlich. 970 00:40:06,740 --> 00:40:09,330 Fühlt Woche zwei wieder. 971 00:40:09,330 --> 00:40:14,920 Aber diese Version tatsächlich sein kann wie dieses, das kryptische sieht neu geschrieben. 972 00:40:14,920 --> 00:40:18,280 Es ist eine Technik, die als Zeiger Arithmetik, Adresse Arithmetik. 973 00:40:18,280 --> 00:40:19,600 Aber warum funktioniert das? 974 00:40:19,600 --> 00:40:22,220 >> Jetzt ärgerlich, die Autoren von C entschied sich für 975 00:40:22,220 --> 00:40:25,070 Das Symbol * für verschiedene Zwecke. 976 00:40:25,070 --> 00:40:29,020 Wir haben gesehen, dass es schon einmal benutzt, char *, das bedeutet "geben Sie mir eine variable 977 00:40:29,020 --> 00:40:31,210 das wird sich enthalten die Adresse eines char. " 978 00:40:31,210 --> 00:40:33,990 So char * in diesem Zusammenhang bedeutet "geben Sie mir eine Variable." 979 00:40:33,990 --> 00:40:40,050 >> Leider, wenn Sie die * ohne verwenden ein Wort vor sich, wie char, 980 00:40:40,050 --> 00:40:41,905 es ist jetzt genannt Dereferenzierungsoperator. 981 00:40:41,905 --> 00:40:43,530 Und wir werden schon bald mehr davon zu sehen. 982 00:40:43,530 --> 00:40:44,930 Aber es bedeutet nur, "dorthin zu gehen." 983 00:40:44,930 --> 00:40:49,070 Es ist wie gesagt, wenn mich jemand übergeben auf ein Stück Papier ", 33 Oxford Street", 984 00:40:49,070 --> 00:40:53,830 wenn ich "* 33 Oxford Street", das heißt "Gehen Sie die Straße bis zum CS Gebäude." 985 00:40:53,830 --> 00:40:57,220 >> So * bedeutet nur, wenn es gehen es gibt kein Wort vor ihm. 986 00:40:57,220 --> 00:40:59,100 Also, was ist t, klar zu sein? 987 00:40:59,100 --> 00:41:03,250 t ist die Adresse des Blocks aus Speicher, der zu mir zurück gegeben wurde. 988 00:41:03,250 --> 00:41:06,650 s ist die Adresse von dem, was, klar zu sein, im Beispiel haben wir diskutiert, 989 00:41:06,650 --> 00:41:07,500 von Klein Gabe? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s ist die Adresse von-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 ZIELGRUPPE: Der String. 994 00:41:12,460 --> 00:41:14,126 David J. MALAN: Von Gabes ursprünglichen Namen. 995 00:41:14,126 --> 00:41:16,660 So ist es die Adresse des Dieses Teil des Speichers. 996 00:41:16,660 --> 00:41:22,220 Also, wenn ich sage, t + i-- i, Bekanntmachung, ist nur unser alter Freund. 997 00:41:22,220 --> 00:41:24,770 Es ist nur eine Indexvariable das ist die Iteration von Null auf bis 998 00:41:24,770 --> 00:41:26,960 um die Länge der Zeichenfolge s. 999 00:41:26,960 --> 00:41:30,367 Also es geht auf Null, dann eins sein, dann zwei, dann drei, dann vier. 1000 00:41:30,367 --> 00:41:33,200 Also lassen Sie uns zusammen diese neue Kratz wie Puzzleteile, wenn man will, 1001 00:41:33,200 --> 00:41:36,140 obwohl wiederum die Syntax ist weit mehr als obskuren Scratch. 1002 00:41:36,140 --> 00:41:39,522 Also t ist eine Adresse + Ich wird mich geben 1003 00:41:39,522 --> 00:41:42,480 eine Zahl, da es sich um Zahlen, die wir als Hex-Zeichnung worden. 1004 00:41:42,480 --> 00:41:43,560 Aber sie sind nur Zahlen. 1005 00:41:43,560 --> 00:41:49,960 >> Also, wenn die Adresse von T gesagt war 0x88, 0x88, was plus null. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Auch wenn Sie sich nicht wohl sind mit Sechskant noch, einen Vermutung. 1008 00:41:53,980 --> 00:41:54,410 >> ZIELGRUPPE: Das Original. 1009 00:41:54,410 --> 00:41:55,850 >> David J. MALAN: Noch 0x88. 1010 00:41:55,850 --> 00:41:58,910 Also, was bedeutet * 0x88 das? 1011 00:41:58,910 --> 00:42:02,670 Es bedeutet, "dorthin zu gehen", was bedeutet, effektiv, "Reiche deinen Finger her." 1012 00:42:02,670 --> 00:42:06,930 Und nun auf der rechten Seite von Dieser Ausdruck, * und dann in Pars, 1013 00:42:06,930 --> 00:42:11,586 s + i bedeutet s, was der ist Adresse hier von dem kleinen g. 1014 00:42:11,586 --> 00:42:16,220 s + 0 ist, natürlich, s, was s ist. 1015 00:42:16,220 --> 00:42:21,230 >> So, jetzt ist es * s, die wie * 33 Oxford Street bedeutet rufen Sie die Adresse 1016 00:42:21,230 --> 00:42:22,010 s. 1017 00:42:22,010 --> 00:42:24,170 Also hier ist dieser Finger der rechten Hand. 1018 00:42:24,170 --> 00:42:26,050 Also, was soll ich nur in das, was zu kopieren? 1019 00:42:26,050 --> 00:42:30,260 Das, was auf der rechten Seite, die ist gabe, wenig g hier in hier. 1020 00:42:30,260 --> 00:42:32,750 >> Und so ist die Wirkung dieser ersten Iteration der Schleife, 1021 00:42:32,750 --> 00:42:36,200 Sie vorgeschlagen, obwohl es scheint verrückt komplizierter als alles, was 1022 00:42:36,200 --> 00:42:42,110 wir zuvor gesehen haben, ist einfach zu sagen, gehen Sie hier und kopieren Sie dieses Zeichen hier. 1023 00:42:42,110 --> 00:42:44,700 Es gibt dir eine Karte, um den beiden Standorten. 1024 00:42:44,700 --> 00:42:46,130 >> Und wir werden viel mehr davon zu sehen. 1025 00:42:46,130 --> 00:42:50,600 Aber jetzt ist die Hoffnung, nur um stellen einige dieser grundlegenden Ideen. 1026 00:42:50,600 --> 00:42:53,550 Und in der Tat, schauen wir uns an eine endgültige Programm hier 1027 00:42:53,550 --> 00:42:57,480 und dann die versprochene claymation, das wird alles in Ordnung zu machen. 1028 00:42:57,480 --> 00:42:57,980 In Ordnung. 1029 00:42:57,980 --> 00:43:01,680 Also lassen Sie mich zu öffnen up-- es wir gehen. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Also lassen Sie mich- wir kommen wieder zu diesem Bild vor lang. 1032 00:43:05,440 --> 00:43:08,360 Lassen Sie mich hier eröffnen dieses letzte Beispiel. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> So, hier ist ein super, super Programm, das vollbringt 1035 00:43:12,710 --> 00:43:15,050 nichts im Leben, die die folgende tut. 1036 00:43:15,050 --> 00:43:18,740 Es erklärt ersten beiden Variablen x und y, die nicht dieses Mal sind Zahlen, 1037 00:43:18,740 --> 00:43:19,240 an sich. 1038 00:43:19,240 --> 00:43:20,448 Sie sind nicht Zahlen, an sich. 1039 00:43:20,448 --> 00:43:22,899 Sie sind offenbar int *. 1040 00:43:22,899 --> 00:43:25,690 Also einfach jemand, was bedeutet es, wenn Ihre Datentyp Ihrer Variablen, 1041 00:43:25,690 --> 00:43:26,860 ist vom Typ int * Sterne? 1042 00:43:26,860 --> 00:43:30,240 Das ist die Adresse einer int. 1043 00:43:30,240 --> 00:43:31,990 >> Also ich habe keine Ahnung, wo es noch ist. 1044 00:43:31,990 --> 00:43:35,150 Es bedeutet nur, "setzen, schließlich, die Adresse einer int hier. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, überall dort, wo es sich befindet Speicher wird eine Adresse dort vor sich geht. 1046 00:43:38,340 --> 00:43:40,200 Und das ist, was y sein wird, als auch. 1047 00:43:40,200 --> 00:43:44,920 >> Wenn ich jetzt sagen, x = malloc (sizeof (int)), das ist eine andere Art zu sagen, 1048 00:43:44,920 --> 00:43:49,000 hey Betriebssystem, über malloc, gib mir genug Speicher für die Größe 1049 00:43:49,000 --> 00:43:52,370 eines int, das ist wahrscheinlich gehen auf 32 Bit oder vier Bytes. 1050 00:43:52,370 --> 00:43:53,680 >> Also, was bedeutet malloc zurückkehren? 1051 00:43:53,680 --> 00:43:55,250 Malloc gibt eine Adresse. 1052 00:43:55,250 --> 00:43:57,020 Also, was ist los in x gespeichert werden? 1053 00:43:57,020 --> 00:44:00,600 Die Adresse der Brocken Speicher, die vier Bytes, dass malloc 1054 00:44:00,600 --> 00:44:03,360 nur für mich mit der Frage gefunden das Betriebssystem. 1055 00:44:03,360 --> 00:44:08,240 >> Jetzt unterdessen Linie vier hier der * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Nur klar zu sein, was ist los da unten? 1057 00:44:09,990 --> 00:44:11,530 Auf der linken Seite, * x. 1058 00:44:11,530 --> 00:44:13,610 das ist wie * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 So * x bedeutet was? 1060 00:44:15,523 --> 00:44:16,450 >> ZIELGRUPPE: Gehen Sie zu. 1061 00:44:16,450 --> 00:44:17,908 >> David J. MALAN: Gehen Sie an diese Adresse. 1062 00:44:17,908 --> 00:44:20,466 Wo immer das Stück Speicher ist, gehen Sie zu ihm. 1063 00:44:20,466 --> 00:44:21,979 Und setzen, was es offensichtlich? 1064 00:44:21,979 --> 00:44:22,520 ZIELGRUPPE: 42. 1065 00:44:22,520 --> 00:44:23,580 David J. MALAN: 42. 1066 00:44:23,580 --> 00:44:25,650 Alle Rechte, * y, gleiche Idee. 1067 00:44:25,650 --> 00:44:26,860 Rufen Sie die Adresse in y. 1068 00:44:26,860 --> 00:44:31,740 Legte die Zahl 13 gibt, aber was ist y im Moment? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 ZIELGRUPPE: Es gibt keine Speicher für y. 1071 00:44:34,630 --> 00:44:35,710 David J. MALAN: Es ist kein Speicher für y. 1072 00:44:35,710 --> 00:44:38,215 Also, was tut y wahrscheinlich enthalten, wie wir gesagt habe? 1073 00:44:38,215 --> 00:44:38,520 >> ZIELGRUPPE: Abfall. 1074 00:44:38,520 --> 00:44:39,480 >> David J. MALAN: Einige Müll Wert. 1075 00:44:39,480 --> 00:44:41,320 Nun, das ist Müll Wert immer noch eine Zahl. 1076 00:44:41,320 --> 00:44:43,160 Es kann immer noch fälschlicherweise für eine Adresse sein. 1077 00:44:43,160 --> 00:44:45,160 Es ist, als ob jemand kritzelte etwas nach unten, 1078 00:44:45,160 --> 00:44:48,002 und ich falsch interpretiert es als Bedeutung einige Gebäude auf der Straße. 1079 00:44:48,002 --> 00:44:50,460 Und wenn Sie nur versuchen, in zu gehen einige Gebäude, das Sie nicht besitzen, 1080 00:44:50,460 --> 00:44:53,710 oder einige Stück Speicher Sie nicht gegeben gewesen, hätte schlimme Dinge passieren. 1081 00:44:53,710 --> 00:44:57,740 Computer abstürzen oder eine andere unbestimmten Verhalten passieren könnte. 1082 00:44:57,740 --> 00:45:01,310 >> Also das Intro, dann ist es, diese Binky. 1083 00:45:01,310 --> 00:45:04,290 Ich erinnere mich noch, 20 einige ungerade Jahre später, 1084 00:45:04,290 --> 00:45:07,200 wo ich war, als ich endlich verstanden Zeiger. 1085 00:45:07,200 --> 00:45:09,520 >> Welches ist zu sagen, wenn Sie hier lassen in drei Minuten 1086 00:45:09,520 --> 00:45:12,170 und ich denke nicht Zeiger verstehen, erkennen 1087 00:45:12,170 --> 00:45:14,410 Ich habe für 20 erinnert Jahre für einige verrückte Grund 1088 00:45:14,410 --> 00:45:17,140 wann und warum es schließlich versenkt in, sitzend mit meiner Lehre 1089 00:45:17,140 --> 00:45:19,501 Kerl, Nishat Mehta in der Rückseite Eliot Dining Hall. 1090 00:45:19,501 --> 00:45:21,250 Nun, ich habe in Erinnerung Deshalb war 1091 00:45:21,250 --> 00:45:23,920 eines der Themen, die ich in Insbesondere kämpfte mit. 1092 00:45:23,920 --> 00:45:26,470 Und dann war es endlich geklickt haben, Ich wage zu sagen, wie viele Themen 1093 00:45:26,470 --> 00:45:27,460 schließlich will. 1094 00:45:27,460 --> 00:45:32,590 Und nun, zu machen, dass das Gefühl, die ganze glücklicher und umso überzeugender, 1095 00:45:32,590 --> 00:45:35,360 werfen wir einen letzten Blick in unsere letzten drei Minuten hier bei Binky, 1096 00:45:35,360 --> 00:45:37,675 von unserem Freund, Nick Parlante von der Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [VIDEO PLAYBACK] 1099 00:45:41,580 --> 00:45:42,750 >> -Hey, Binky. 1100 00:45:42,750 --> 00:45:43,500 Aufwachen! 1101 00:45:43,500 --> 00:45:45,960 Es ist Zeit für Zeiger Spaß. 1102 00:45:45,960 --> 00:45:47,012 >> -Was Ist das? 1103 00:45:47,012 --> 00:45:48,723 Erfahren Sie mehr über Zeiger? 1104 00:45:48,723 --> 00:45:50,580 Oh, gute sachen! 1105 00:45:50,580 --> 00:45:53,563 >> Nun, um zu beginnen, ich denke, wir sind gehen, um ein paar Zeiger müssen. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Dieser Code weist zwei Zeiger, das kann auf ganze Zahlen zeigen. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Nun, ich sehe die beiden Zeiger, aber sie scheinen nicht zu sein, die auf irgendetwas. 1110 00:46:02,140 --> 00:46:02,980 >> -Das Ist richtig. 1111 00:46:02,980 --> 00:46:05,100 Zunächst Zeigern nicht auf nichts. 1112 00:46:05,100 --> 00:46:08,030 Die Dinge, die sie werden als Punkt pointees und deren Einrichtung die 1113 00:46:08,030 --> 00:46:09,370 ein separater Schritt. 1114 00:46:09,370 --> 00:46:10,220 >> Oh, richtig, richtig. 1115 00:46:10,220 --> 00:46:10,950 Das wusste ich. 1116 00:46:10,950 --> 00:46:12,385 Die pointees sind getrennt. 1117 00:46:12,385 --> 00:46:14,315 Er, so wie Sie einen pointee zuordnen? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> -OK. 1120 00:46:15,960 --> 00:46:18,970 Nun, dieser Code ordnet eine neue Integer pointee, 1121 00:46:18,970 --> 00:46:20,950 und dieser Teil Sätze x auf ihn verweisen. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> -Hey, Dass besser aussieht. 1124 00:46:23,230 --> 00:46:25,060 So machen es etwas zu tun. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Ich werde den Zeiger dereferenzieren x zu Speichern Sie die Nummer 42 in seiner pointee. 1127 00:46:30,455 --> 00:46:32,830 Für diesen Trick, ich brauche meine Zauberstab dereferenzieren. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -Ihr Magic Wand von Dereferenzierung? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 Dass-- das ist großartig. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> Dieses wird, wie der Code aussieht. 1134 00:46:41,080 --> 00:46:44,110 Ich werde einfach die Nummer, und [POP] eingestellt 1135 00:46:44,110 --> 00:46:44,700 >> -Hey, Zu suchen. 1136 00:46:44,700 --> 00:46:46,140 Da geht es. 1137 00:46:46,140 --> 00:46:50,980 >> SO macht einen Dereferenzierung von x folgt der Pfeil auf seine pointee zugreifen. 1138 00:46:50,980 --> 00:46:53,160 In diesem Fall, ein Geschäft 42 drin. 1139 00:46:53,160 --> 00:46:57,710 Hey versuchen Sie es, um die Nummer zu speichern 13 durch die anderen Zeiger, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Ich werde einfach gehen hier auf y, und erhalten die Zahl 13 Einrichtung. 1142 00:47:03,270 --> 00:47:07,930 Und dann nehmen Sie die Wand von Dereferenzierung und nur [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> Oh! 1144 00:47:08,960 --> 00:47:09,500 >> Oh, hey! 1145 00:47:09,500 --> 00:47:11,090 Das hat nicht funktioniert. 1146 00:47:11,090 --> 00:47:15,630 Sagen, Binky, ich glaube nicht, dass die Dereferenzierung y ist eine gute Idee, weil Sie wissen, 1147 00:47:15,630 --> 00:47:17,850 Einrichten der pointee ist ein getrennter Schritt. 1148 00:47:17,850 --> 00:47:20,450 Und ich glaube nicht, dass wir je gemacht habe. 1149 00:47:20,450 --> 00:47:21,480 >> -Gute Punkt. 1150 00:47:21,480 --> 00:47:21,980 -Ja. 1151 00:47:21,980 --> 00:47:25,680 Wir vergeben den Zeiger y, aber wir nie stellen Sie ihn auf zu einem pointee zeigen. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Sehr aufmerksam. 1154 00:47:28,616 --> 00:47:30,240 -Hey, Du bist es gut aus, Binky. 1155 00:47:30,240 --> 00:47:33,400 Kann man das lösen, so dass y Punkte auf den gleichen pointee als x? 1156 00:47:33,400 --> 00:47:34,000 >> -sure. 1157 00:47:34,000 --> 00:47:36,780 Ich werde mein Zauberstab von Pointer Zuordnung. 1158 00:47:36,780 --> 00:47:38,740 >> -Ist Dass sein wird ein Problem wie vorher? 1159 00:47:38,740 --> 00:47:39,240 -no. 1160 00:47:39,240 --> 00:47:40,660 Dies berührt nicht die pointees. 1161 00:47:40,660 --> 00:47:44,450 Es ändert sich nur ein Zeiger auf zeigen auf die gleiche wie die andere. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, ich verstehe. 1163 00:47:45,450 --> 00:47:48,200 Jetzt y Punkte auf der gleichen Stelle wie x. 1164 00:47:48,200 --> 00:47:48,910 Also warten. 1165 00:47:48,910 --> 00:47:49,950 Nun wird y befestigt. 1166 00:47:49,950 --> 00:47:51,120 Es hat eine pointee. 1167 00:47:51,120 --> 00:47:54,510 So können Sie den Zauberstab der versuchen Dereferenzierung wieder um die 13 über zu senden. 1168 00:47:54,510 --> 00:47:56,510 >> -Uh, OK. 1169 00:47:56,510 --> 00:47:58,160 Hier geht es. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> -Hey, Schau dir das an. 1171 00:47:59,340 --> 00:48:00,750 Jetzt Dereferenzierung Arbeiten auf y. 1172 00:48:00,750 --> 00:48:04,991 Und da die Zeiger geben dass man pointee, sie beide sehen den 13. 1173 00:48:04,991 --> 00:48:05,490 -Ja. 1174 00:48:05,490 --> 00:48:06,870 Teilen, was auch immer. 1175 00:48:06,870 --> 00:48:08,820 So werden wir an Orte, jetzt wechseln? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, schau. 1177 00:48:09,440 --> 00:48:10,830 Wir sind aus der Zeit. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> -Just Erinnern die drei Zeiger Regeln. 1180 00:48:13,530 --> 00:48:16,560 Eine Zahl, die Grundstruktur ist, dass Sie einen Zeiger haben, 1181 00:48:16,560 --> 00:48:18,680 und er zeigt auf eine über pointee. 1182 00:48:18,680 --> 00:48:20,640 Aber der Zeiger und pointee sind getrennt, 1183 00:48:20,640 --> 00:48:22,610 und die gemeinsame Fehler ist die Einrichtung einen Zeiger, 1184 00:48:22,610 --> 00:48:25,000 aber zu vergessen, es eine pointee zu geben. 1185 00:48:25,000 --> 00:48:28,170 >> Nummer zwei, Zeiger Dereferenzierung beginnt an der Zeiger 1186 00:48:28,170 --> 00:48:31,050 und folgt dessen Pfeil über seine pointee zugreifen. 1187 00:48:31,050 --> 00:48:33,400 Wie wir alle wissen, diese funktioniert nur, wenn es 1188 00:48:33,400 --> 00:48:36,270 ein pointee, welche Art von erhält zurück zu Regel Nummer eins. 1189 00:48:36,270 --> 00:48:39,000 >> Nummer drei, Zeiger Zuordnung erfolgt ein Zeiger 1190 00:48:39,000 --> 00:48:42,320 und ändert es auf den Punkt pointee gleichen wie ein anderer Zeiger. 1191 00:48:42,320 --> 00:48:44,160 Also nach der Abtretung die beiden Zeiger 1192 00:48:44,160 --> 00:48:45,910 wird auf die gleiche pointee zeigen. 1193 00:48:45,910 --> 00:48:47,990 Manchmal, so nennt man Sharing. 1194 00:48:47,990 --> 00:48:49,740 Und das ist alles dort ist zu ihm, wirklich. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye jetzt. 1196 00:48:50,277 --> 00:48:51,110 [END VIDEO PLAYBACK] 1197 00:48:51,110 --> 00:48:52,568 David J. MALAN: Das ist es für CS50. 1198 00:48:52,568 --> 00:48:55,110 Wir sehen uns nächste Woche. 1199 00:48:55,110 --> 00:48:56,064