1 00:00:00,000 --> 00:00:03,395 >> [Musikwiedergabe] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 David J. MALAN: Das ist wie ein Neuling Seminar heute. 4 00:00:13,280 --> 00:00:14,060 OK. 5 00:00:14,060 --> 00:00:15,024 So sehr regnerisch aus. 6 00:00:15,024 --> 00:00:17,690 Dieser neigt dazu, am Mittwoch geschehen, aber umso Gelegenheit 7 00:00:17,690 --> 00:00:18,700 Fragen heute. 8 00:00:18,700 --> 00:00:22,210 Lassen Sie uns also beginnen, tatsächlich mit dem Film in nur einem Augenblick. 9 00:00:22,210 --> 00:00:24,560 Aber wir werden wie immer großartig zu starten. 10 00:00:24,560 --> 00:00:28,000 >> Dies CS50 und dies ist das Ende der Woche 4. 11 00:00:28,000 --> 00:00:30,820 Also, wenn Sie jemals gesehen haben Fernsehen oder einen Film, wobei 12 00:00:30,820 --> 00:00:34,690 es gibt einige Computer-Experten und die Polizei oder FBI oder eine Agentur 13 00:00:34,690 --> 00:00:36,930 versucht, etwas zu fangen Gegner, gut, haben Sie 14 00:00:36,930 --> 00:00:40,850 vermutlich gehört, den Ausdruck "zu verbessern" wobei die Techniker irgendwie 15 00:00:40,850 --> 00:00:44,750 magisch zoomt stufenlos weit, um die Verbrecher zu sehen 16 00:00:44,750 --> 00:00:48,640 Identität oder das Kennzeichen selbst in den Schimmer eines Spiegels 17 00:00:48,640 --> 00:00:50,390 oder der Schimmer von jemandes Auge. 18 00:00:50,390 --> 00:00:55,196 Also ja, lassen Sie uns einen Blick auf ein paar solche Szenen aus Hollywood. 19 00:00:55,196 --> 00:00:55,862 [VIDEO PLAYBACK] 20 00:00:55,862 --> 00:00:59,243 -OK, Jetzt lassen Sie uns einen guten Blick auf Sie. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Halte es. 23 00:01:07,415 --> 00:01:08,267 Führen Sie das zurück. 24 00:01:08,267 --> 00:01:09,121 >> -Warte eine Minute. 25 00:01:09,121 --> 00:01:11,300 Geh rechts. 26 00:01:11,300 --> 00:01:12,209 >> -Es, Gefriert, dass. 27 00:01:12,209 --> 00:01:12,750 -Vollbild. 28 00:01:12,750 --> 00:01:13,558 -OK, Einfrieren, dass. 29 00:01:13,558 --> 00:01:14,820 Up auf, dass eine Straffung, werden Sie? 30 00:01:14,820 --> 00:01:16,530 -vector In auf, dass Kerl vom Hinterrad. 31 00:01:16,530 --> 00:01:19,400 -zoom In hier an dieser Stelle. 32 00:01:19,400 --> 00:01:22,846 -Mit Der richtigen Ausrüstung, die Bild konnte erweitert und geschärft werden. 33 00:01:22,846 --> 00:01:24,065 -Was ist das? 34 00:01:24,065 --> 00:01:25,600 -Es Ist eine Steigerungsprogramm. 35 00:01:25,600 --> 00:01:26,860 -Kann Sie klar, dass Sie überhaupt? 36 00:01:26,860 --> 00:01:27,890 -Ich weiß es nicht. 37 00:01:27,890 --> 00:01:29,050 Lassen Sie uns zu verbessern es. 38 00:01:29,050 --> 00:01:31,575 >> -Verbessern Abschnitt A6. 39 00:01:31,575 --> 00:01:33,642 >> -I Verbessert das Detail, und-- Ich glaube, es gibt 40 00:01:33,642 --> 00:01:35,433 genug, um zu verbessern, lassen Sie ihn zu meinem Bildschirm. 41 00:01:35,433 --> 00:01:37,080 -I Verbessert die Reflexion in ihrem Auge. 42 00:01:37,080 --> 00:01:38,830 >> -Let Dieses durchlaufen Video-Enhancement. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Können Sie verbessern das? 44 00:01:40,100 --> 00:01:41,875 >> -Abwarten. 45 00:01:41,875 --> 00:01:44,010 >> -Ich Wurde auf dieser Reflexion arbeitet. 46 00:01:44,010 --> 00:01:44,995 >> -Someone Reflexion. 47 00:01:44,995 --> 00:01:45,495 -Reflexion. 48 00:01:45,495 --> 00:01:47,399 -Es Ist ein Spiegelbild der das Gesicht des Mannes. 49 00:01:47,399 --> 00:01:48,065 -Die Reflexion. 50 00:01:48,065 --> 00:01:48,981 -Es Ist eine Reflexion. 51 00:01:48,981 --> 00:01:50,600 -ZOOM In auf dem Spiegel. 52 00:01:50,600 --> 00:01:52,712 -Sie Können ein Spiegelbild zu sehen. 53 00:01:52,712 --> 00:01:54,350 -Kann Verbessern Sie das Bild von hier? 54 00:01:54,350 --> 00:01:55,370 -Kann Man ihn verbessern hier richtig? 55 00:01:55,370 --> 00:01:56,210 -Kann Man es verbessern? 56 00:01:56,210 --> 00:01:56,900 Können Sie es verbessern? 57 00:01:56,900 --> 00:01:57,870 >> -Kann Erweitern wir das? 58 00:01:57,870 --> 00:01:58,717 >> -Kann Man es verbessern? 59 00:01:58,717 --> 00:02:00,050 -Halten Auf einer zweiten, ich werde zu verbessern. 60 00:02:00,050 --> 00:02:00,924 -ZOOM In an der Tür. 61 00:02:00,924 --> 00:02:01,700 -Zeiten 10. 62 00:02:01,700 --> 00:02:02,586 -zoom. 63 00:02:02,586 --> 00:02:03,490 -Einziehen. 64 00:02:03,490 --> 00:02:03,990 -Mehr. 65 00:02:03,990 --> 00:02:04,690 -wait, Zu stoppen. 66 00:02:04,690 --> 00:02:05,190 -Stopp. 67 00:02:05,190 --> 00:02:05,970 -PAUSE Es. 68 00:02:05,970 --> 00:02:09,460 -rotate Uns 75 Grad um die vertikale, bitte. 69 00:02:09,460 --> 00:02:10,962 -Stopp. 70 00:02:10,962 --> 00:02:14,040 Zurück zum Teil über der Tür, noch einmal. 71 00:02:14,040 --> 00:02:15,860 >> -Haben Sie einen Bildverstärker, die Bitmap kann? 72 00:02:15,860 --> 00:02:18,776 >> -Hey, Vielleicht können wir die Pradeep verwenden Sen Methode, um in die Fenster zu sehen. 73 00:02:18,776 --> 00:02:20,372 -Diese Software ist Stand der Technik. 74 00:02:20,372 --> 00:02:21,845 >> -Die Eigenwert ist ausgeschaltet. 75 00:02:21,845 --> 00:02:24,300 >> -Mit Der rechten Kombination von algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> -Er Genommen Eliminierung Algorithmen, um die nächste Stufe, 77 00:02:26,755 --> 00:02:28,730 und ich kann sie zu bedienen erweitern Sie dieses Foto. 78 00:02:28,730 --> 00:02:31,286 >> -Verschluss Auf und vergrößern den z-Achse. 79 00:02:31,286 --> 00:02:32,560 >> -Verbessern. 80 00:02:32,560 --> 00:02:33,100 >> -Verbessern. 81 00:02:33,100 --> 00:02:33,600 >> -Verbessern. 82 00:02:33,600 --> 00:02:34,960 -Freeze Und zu verbessern. 83 00:02:34,960 --> 00:02:37,180 >> [END PLAYBACK] 84 00:02:37,180 --> 00:02:41,160 >> David J. MALAN: Okay, so alle, die sind eigentlich Worte. 85 00:02:41,160 --> 00:02:44,450 Sie sind einfach zusammen in eine aufgereiht Weise, die nicht wirklich sinnvoll ist. 86 00:02:44,450 --> 00:02:48,400 Und in der Tat, CS50 und Kurse, wie es neigt dazu, eine Menge von TV und Filmen zu ruinieren 87 00:02:48,400 --> 00:02:48,900 für dich. 88 00:02:48,900 --> 00:02:52,330 Denn wenn dieser Computer-Experten sind leiern Bedingungen und sagen 89 00:02:52,330 --> 00:02:56,860 Lust Dinge wie Eigenvektoren und die z-Achse, 90 00:02:56,860 --> 00:02:59,572 und jede Anzahl von anderen eigentlich mehr Fachbegriffe, 91 00:02:59,572 --> 00:03:02,030 sie sind wirklich nur Bespannen Wörter zusammen allzu oft. 92 00:03:02,030 --> 00:03:05,020 Ist, dass einer unserer Hoffnung ist, dass, als Nebeneffekt der Teilnahme an Kursen 93 00:03:05,020 --> 00:03:08,245 wie diese, werden mehr Menschen in der Welt tatsächlich in der Lage, um in wiegen 94 00:03:08,245 --> 00:03:12,040 und nur immer so leicht beeinflussen die Qualität und Genauigkeit dieser Filme? 95 00:03:12,040 --> 00:03:14,350 >> In der Tat, werfen wir einen Blick auf die Realität. 96 00:03:14,350 --> 00:03:18,070 So, hier ist das Personal Foto Mary, einer unserer Lehr Stipendiaten. 97 00:03:18,070 --> 00:03:20,050 Und angenommen, sie ist von etwas vermutet. 98 00:03:20,050 --> 00:03:23,730 Und doch gibt es einen Schimmer von einige Beweismittel in ihren Augen, 99 00:03:23,730 --> 00:03:25,480 oder in der Reflexion ihre Brille. 100 00:03:25,480 --> 00:03:30,760 Nun, wenn wir genau das tun, wie die Filme vorzuschlagen, bei dem wir zu vergrößern und "verbessern", 101 00:03:30,760 --> 00:03:34,080 Das ist, wie viel Information ist in Marys Gesicht 102 00:03:34,080 --> 00:03:36,795 wenn Sie ein Bild zu erfassen mit dieser Auflösung. 103 00:03:36,795 --> 00:03:39,120 >> Und in der Tat, können Sie diese Punkte zu sehen. 104 00:03:39,120 --> 00:03:41,900 Und das sind, was sind Pixel genannt, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 Das ist nur ein Quadrat in der Regel das ist ein Punkt, der ein Bild komponiert. 106 00:03:45,740 --> 00:03:49,200 Und wieder in den Tag, und tatsächlich sogar heute mit einigen der heutigen LED-Fernseher 107 00:03:49,200 --> 00:03:51,950 oder LCD-Fernseher, wenn du hast einem auf Ihrem Zimmer oder in der Wohnung, 108 00:03:51,950 --> 00:03:55,100 wenn Sie gehen ganz nah, und vor allem, wenn es ist ein etwas älteres TV, 109 00:03:55,100 --> 00:03:58,760 Sie können sich wahrscheinlich sogar sehen diese Punkte und das ist, was ein Bild zu komponieren. 110 00:03:58,760 --> 00:04:00,980 >> Und es gibt nicht mehr Informationen als diese. 111 00:04:00,980 --> 00:04:05,400 Wir könnten "zu verbessern", im Sinne von Glätten Dinge immer und Art 112 00:04:05,400 --> 00:04:09,040 Ableiten Art, Art, was Farbe sollte neben Marien Auge 113 00:04:09,040 --> 00:04:10,910 so dass es nicht tatsächlich so pixelig. 114 00:04:10,910 --> 00:04:14,510 Aber wenn ich immer Zoomen gibt ist der Bösewicht in ihrem Auge. 115 00:04:14,510 --> 00:04:16,600 Wie das ist alles Informationen, die wir haben. 116 00:04:16,600 --> 00:04:18,920 Sie können keine Informationen aus dem Nichts. 117 00:04:18,920 --> 00:04:20,790 Es gibt nur eine endliche Anzahl von Bits besteht. 118 00:04:20,790 --> 00:04:22,873 >> So in Übungsblatt 4, wobei Sie die Möglichkeit haben, 119 00:04:22,873 --> 00:04:24,580 um mit dieser Art der Welt zu spielen. 120 00:04:24,580 --> 00:04:27,610 In Problem Set 4 erfahren Sie, die Welt der Grafiken und Forensik, 121 00:04:27,610 --> 00:04:30,870 und tatsächlich Code schreiben dass erholt verlorene Bilder. 122 00:04:30,870 --> 00:04:33,510 Du wirst Code schreiben, dass manipuliert vorhandene Bilder 123 00:04:33,510 --> 00:04:36,120 und schließlich zu verstehen, was ist geht unter der Haube. 124 00:04:36,120 --> 00:04:38,540 >> Und stellt sich heraus, es ist eigentlich nicht so kompliziert. 125 00:04:38,540 --> 00:04:41,320 Zum Beispiel, wenn wir wollten stellen ein Smiley-Gesicht, wo 126 00:04:41,320 --> 00:04:44,160 mit diesen schwarzen Pixeln, oder diese schwarze Punkte, 127 00:04:44,160 --> 00:04:47,230 gut, wir einfach darstellen könnte sie als wirklich ein Bitmap. 128 00:04:47,230 --> 00:04:50,040 Und wenn Sie jemals davon gehört hatte Ausdruck Bitmap, vielleicht 129 00:04:50,040 --> 00:04:52,330 Jetzt beginnt eine zu machen wenig mehr Sinn, heute. 130 00:04:52,330 --> 00:04:53,580 >> Wir wissen bereits, was ein bisschen ist. 131 00:04:53,580 --> 00:04:54,160 Es ist 0 oder 1. 132 00:04:54,160 --> 00:04:56,201 Und eine Karte ist nur etwas wie ein Stück Papier 133 00:04:56,201 --> 00:04:59,180 das gibt Ihnen Richtungen und hat vielleicht ein Raster von x- und y-Koordinaten. 134 00:04:59,180 --> 00:05:00,540 So, hier ist eine Bitmap. 135 00:05:00,540 --> 00:05:03,680 Es ist eine Karte von Bits wobei a 1 ist anscheinend 136 00:05:03,680 --> 00:05:07,857 werde ein weißes Pixel darstellen, und eine 0 wird, um ein schwarzes Pixel darzustellen. 137 00:05:07,857 --> 00:05:09,440 Aber wir könnten sicherlich drehen Sie sie um. 138 00:05:09,440 --> 00:05:11,648 Es spielt eigentlich keine Rolle, so solange wir konsequent. 139 00:05:11,648 --> 00:05:15,570 Und hier ist, wie, in binary-- innen Arbeitsspeicher eines Computers, oder sogar in 140 00:05:15,570 --> 00:05:18,160 einer Datei auf Ihrer Fest drive-- könnten Sie speichern 141 00:05:18,160 --> 00:05:20,240 die einfachsten Smiley Bilder. 142 00:05:20,240 --> 00:05:23,990 Aber was sollen wir, natürlich, fehlt in diesem Bild? 143 00:05:23,990 --> 00:05:24,610 Farbe, nicht wahr? 144 00:05:24,610 --> 00:05:28,220 Es ist offensichtlich, dass die nächste Stufe oder Verbesserung, dies mit Farbe zu verbessern. 145 00:05:28,220 --> 00:05:32,230 Also leider mit nur einem einzigen bit, 0 oder 1, wir könnten Farbe darzustellen. 146 00:05:32,230 --> 00:05:36,100 Das könnte rot oder blau sein, oder schwarz oder weiß, oder grün oder rosa, 147 00:05:36,100 --> 00:05:37,420 oder irgendwelche Farbenpaare. 148 00:05:37,420 --> 00:05:40,860 Aber der Einfachheit halber werden wir einfach davon ausgehen, schwarz und weiß. 149 00:05:40,860 --> 00:05:45,930 >> Also, was logischerweise müssen wir, wenn wir wollen Farbe in einem Bild zu implementieren? 150 00:05:45,930 --> 00:05:49,080 Was müssen wir machen? 151 00:05:49,080 --> 00:05:51,900 Wie, wenn der begrenzende Faktor hier ist, dass mit einem Bit können Sie nur 152 00:05:51,900 --> 00:05:55,977 repräsentieren zwei Zustände 0 oder 1, weiß oder schwarz, was wollen Sie tun? 153 00:05:55,977 --> 00:05:56,810 ZIELGRUPPE: Mehr Daten. 154 00:05:56,810 --> 00:05:58,813 David J. MALAN: Mehr Bits, ja mehr Daten, mehr Bits. 155 00:05:58,813 --> 00:06:01,440 Und in der Tat, das ist genau, wie Farbbilder werden dargestellt. 156 00:06:01,440 --> 00:06:05,120 Verwenden, anstatt ein einzelnes Bit, ein 0 oder 1 für jedes Pixel, wobei jeder Punkt, 157 00:06:05,120 --> 00:06:06,170 Sie benutzen Sie einfach mehrere. 158 00:06:06,170 --> 00:06:09,660 Vielleicht verwenden 8, vielleicht, besser bekannt verwenden 24, und in der Tat, in Übungsblatt 159 00:06:09,660 --> 00:06:13,300 4, werden Sie mit einer Datei zu spielen Format 24 Bits typischerweise verwendet. 160 00:06:13,300 --> 00:06:15,430 >> Aber die meisten von Ihnen sind wahrscheinlich vertraut mit JPEGs. 161 00:06:15,430 --> 00:06:17,460 Wenn Sie jemals gemacht hätten ein Foto auf Ihrem Telefon, 162 00:06:17,460 --> 00:06:20,360 oder hochgeladen oder sehen etwas auf Facebook oder Flickr, eine beliebige Anzahl 163 00:06:20,360 --> 00:06:24,882 der Foto-Websites, haben Sie wahrscheinlich ein JPEG-Bild gesehen. 164 00:06:24,882 --> 00:06:27,840 Und es stellt sich heraus, dass dies die Datei Format werden wir in PSet 4 verwenden, 165 00:06:27,840 --> 00:06:30,340 wodurch du zu gehen haben, um Bilder zu erholen 166 00:06:30,340 --> 00:06:35,160 dass ich aus Versehen von einem gelöschten beschädigten Speicherkarte in der Kamera, 167 00:06:35,160 --> 00:06:35,800 wenn du möchtest. 168 00:06:35,800 --> 00:06:38,490 >> Und es stellt sich heraus, dass, obwohl JPEG ist ziemlich sophisticated-- 169 00:06:38,490 --> 00:06:40,906 es ist viel anspruchsvoller als die schwarzen und weißen Punkten 170 00:06:40,906 --> 00:06:44,480 wir vorhin gesehen haben, denn es gibt tatsächlich Lust Algorithmen, 171 00:06:44,480 --> 00:06:47,410 werden verwendet, um einen JPEG komprimieren, so dass Sie ein wirklich schöner machen können, 172 00:06:47,410 --> 00:06:49,832 Bildqualität, aber unter Verwendung von relativ wenige Bits. 173 00:06:49,832 --> 00:06:51,790 Und wir werden zurückkommen Kompressions es dauerte nicht lange. 174 00:06:51,790 --> 00:06:56,280 Es stellt sich heraus, daß die erste drei Bytes in einem JPEG image-- 175 00:06:56,280 --> 00:07:02,750 egal, was Sie ein Foto aufgenommen haben von-- sind die Werte 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> Mit anderen Worten, wenn Sie gerade sehen, dass Muster von Bits, 177 00:07:05,990 --> 00:07:09,180 hier als drei vertreten Bytes oder 24 Bits insgesamt, 178 00:07:09,180 --> 00:07:13,810 mit hoher Wahrscheinlichkeit kann man folgern, dass Sie sind auf es auf diese ersten drei suchen 179 00:07:13,810 --> 00:07:15,230 Bytes einer JPEG. 180 00:07:15,230 --> 00:07:18,040 Und das ist, was ist bekannt nach der Unterzeichnung eines JPEG. 181 00:07:18,040 --> 00:07:20,540 Viele Dateiformate da draußen sind in der Regel starten 182 00:07:20,540 --> 00:07:23,735 mit bestimmten Mustern von 0 und 1, so dass Windows und Mac OS und iOS, 183 00:07:23,735 --> 00:07:28,272 Android und wissen, welche Art von Datei, die sie sind, zusätzlich zu dem sogenannten Datei 184 00:07:28,272 --> 00:07:29,730 Erweiterung, dass viele Dateien haben. 185 00:07:29,730 --> 00:07:32,590 Wenn Sie .jpg haben, das ist, ein weiterer Hinweis auf den Computer. 186 00:07:32,590 --> 00:07:35,310 >> Also lassen Sie uns nun einen Blick auf diese ein wenig technisch. 187 00:07:35,310 --> 00:07:37,390 Wir wissen, das Dezimal System von 0 bis 9. 188 00:07:37,390 --> 00:07:38,740 Wir wissen, binär 0 und 1. 189 00:07:38,740 --> 00:07:41,842 Und wenn Sie denken, PSet zurück 0 hatten wir Sie mit zu ringen, 190 00:07:41,842 --> 00:07:43,800 für ein wenig, etwas, genannt hexadezimal, 191 00:07:43,800 --> 00:07:47,320 wo Sie haben 16 Stellen, anstelle von 10 oder anstelle von 2. 192 00:07:47,320 --> 00:07:50,405 Und jene Ziffern, durch Konvention, sind von 0 bis 9 und dann eine 193 00:07:50,405 --> 00:07:55,040 bis f, wobei f, was Dezimalzahl, ebenso wie eine schnelle geistige Gesundheit 194 00:07:55,040 --> 00:07:56,640 überprüfen? 195 00:07:56,640 --> 00:07:57,610 So, 15. 196 00:07:57,610 --> 00:08:01,390 Und ein Muss 10 nur durch die Betreiber, Art der Bestellung, die ich gegeben habe. 197 00:08:01,390 --> 00:08:04,350 Es ist nur eine willkürliche Konvention aber es ist ziemlich Standard. 198 00:08:04,350 --> 00:08:06,870 >> Also, wenn wir auf diesem Muster von drei bytes-- uns gelassen 199 00:08:06,870 --> 00:08:09,620 starten Sie einfach, es zu sehen in Einklang mit how 200 00:08:09,620 --> 00:08:12,450 Informatiker der Regel schauen und denken über Dateien. 201 00:08:12,450 --> 00:08:15,580 Sie können sicherlich zu denken Dateien in 0s und 1s und dezimal, 202 00:08:15,580 --> 00:08:19,340 aber in Wirklichkeit ist, neigen wir dazu binäre verwenden oder typischer hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 zurück von PSet 0. 204 00:08:20,760 --> 00:08:25,857 Also lassen Sie mich schlagen vor, 255, 216 und 255 sind nur diese Muster von 0 und 1. 205 00:08:25,857 --> 00:08:28,440 Und Sie können dies überprüfen, wenn Sie wollen die Mathematik von Woche 0 zu tun. 206 00:08:28,440 --> 00:08:30,810 Aber für jetzt, einfach davon ausgehen, dass dies in der Tat richtig. 207 00:08:30,810 --> 00:08:33,850 Ich habe gerade drei Dezimalstellen umgeschrieben Zahlen als drei binäre Werte. 208 00:08:33,850 --> 00:08:36,100 Nun, was ich zu tun ist, fügen Sie einfach einige Leerraum, 209 00:08:36,100 --> 00:08:37,266 nur zur besseren Lesbarkeit willen. 210 00:08:37,266 --> 00:08:39,940 Und beachtet, Ich werde einfach die Dinge bewegen sich auseinander. 211 00:08:39,940 --> 00:08:43,090 So vor, nach vor, nach. 212 00:08:43,090 --> 00:08:46,180 Ich bin nichts Interessantes anderen tun als nur die Verbreitung Dinge so 213 00:08:46,180 --> 00:08:50,380 Hinweis, dass jeder Satz von acht Bits ist nun zwei Gruppen von vier Bits. 214 00:08:50,380 --> 00:08:54,920 Dies ist nützlich, weil hexadezimalen Besonders modisch 215 00:08:54,920 --> 00:09:00,930 weil jede Hexadezimalzahl zwischen 0 und f oder insbesondere 0 bis 15, 216 00:09:00,930 --> 00:09:03,430 dargestellt werden kann mit genau vier Bits. 217 00:09:03,430 --> 00:09:07,960 Mit anderen Worten, wenn man in hexadezimaler wollen eine 0 darstellen, ist es nur 0000, 218 00:09:07,960 --> 00:09:08,780 vier Nullen. 219 00:09:08,780 --> 00:09:13,997 Und wenn Sie repräsentieren 15 möchten, es ist 1111, die vier Bits ist. 220 00:09:13,997 --> 00:09:16,080 Und wenn Sie die Mathematik zu tun, ob dies der Ort, diejenigen, 221 00:09:16,080 --> 00:09:18,210 dies ist der Ort, 16s, das wird sich geben Sie-- 222 00:09:18,210 --> 00:09:19,960 sondern das wird zu-- sorry, in binärer, 223 00:09:19,960 --> 00:09:23,660 das wird Ihnen 15, diejenigen statt, Zweien Ort, Vieren und Achter Platz. 224 00:09:23,660 --> 00:09:26,821 Also lassen Sie mich schlagen vor, dass Set von vier Bits auf der linken Seite 225 00:09:26,821 --> 00:09:28,070 ist das, was wir werden f rufen. 226 00:09:28,070 --> 00:09:30,110 Es ist die größte Zahl, die Sie kann mit vier Bits stellen. 227 00:09:30,110 --> 00:09:33,300 Und wir von hexadezimalen wissen bereits, f ist die größte Ziffer in hexadezimal. 228 00:09:33,300 --> 00:09:36,020 Wir haben eine andere f dort ankamen, zwei weitere drüben. 229 00:09:36,020 --> 00:09:38,980 Und jetzt, auf den Glauben zu nehmen dass ich die Mathematik richtig gemacht 230 00:09:38,980 --> 00:09:41,890 und dass die linke Hälfte dieser Bits, 1101, 231 00:09:41,890 --> 00:09:43,980 ist das gleiche wie in d hexadezimal. 232 00:09:43,980 --> 00:09:46,490 Und die rechte Hand, 1000, ist nur 8. 233 00:09:46,490 --> 00:09:48,140 >> Und dass man die leicht nach rechts zu sehen? 234 00:09:48,140 --> 00:09:51,670 Die 8 represents-- richtig ist unter diesem Achter Platz. 235 00:09:51,670 --> 00:09:56,040 Also haben wir eine in der Achter Spalte und nichts in den Vieren, zu zweit oder Einsen. 236 00:09:56,040 --> 00:09:59,830 So, jetzt mehr konventionell, Menschen neigen dazu, In den hexadezimalen Ziffern so zu schreiben, 237 00:09:59,830 --> 00:10:03,000 Sie gerade zerquetschen sie zusammen, und dann können Sie sie mit 0x voranstellen. 238 00:10:03,000 --> 00:10:05,920 Es bedeutet nichts anderes, als einen visuellen Hinweis auf ein human-- 239 00:10:05,920 --> 00:10:10,350 hier kommt eine hexadezimale value-- da es sonst nicht klar sein könnte. 240 00:10:10,350 --> 00:10:13,629 >> Welche also letztlich, dass das Muster von Nullen und Einsen, 241 00:10:13,629 --> 00:10:16,170 oder das Muster der hexadezimalen Stellen äquivalent, dass Sie 242 00:10:16,170 --> 00:10:18,990 gehen auf die Suche nach in Übungsblatt 4 this-- 243 00:10:18,990 --> 00:10:22,120 und das Problem Set 4-Spezifikation wird zu Fuß Sie durch diese in mehr detail-- 244 00:10:22,120 --> 00:10:25,344 sondern als eine Art geheimnisvollen wie realisieren dies könnte auf den ersten Blick, 245 00:10:25,344 --> 00:10:27,010 Sie gehen zu sehen, beginnen diese sehr. 246 00:10:27,010 --> 00:10:30,320 Und in der Tat auch in GDB, die Debugger am Montag haben wir 247 00:10:30,320 --> 00:10:35,440 und Dan bringt in PSet 3, wird zu oft zeigen Ihnen Hexadezimalwerte 248 00:10:35,440 --> 00:10:39,910 gerade weil sie dazu neigen, mehr betragen, konventionelle als dezimal oder binär 249 00:10:39,910 --> 00:10:41,157 in der Welt der Computer. 250 00:10:41,157 --> 00:10:42,490 Jetzt lassen wir diese in einen Kontext. 251 00:10:42,490 --> 00:10:48,040 Viele von Euch werden sich daran erinnern bild hier, was von dem, was kam? 252 00:10:48,040 --> 00:10:51,240 Vista, so dass selbst früher als dass, tat Windows XP dieses Debüt. 253 00:10:51,240 --> 00:10:52,620 Also das ist eine schöne Landschaft. 254 00:10:52,620 --> 00:10:55,940 Und in der Tat, wenn Sie herumzustochern online-- Ich denke, es ist ein Wikipedia-Artikel, 255 00:10:55,940 --> 00:11:00,110 wobei jemand ganz erstaunlich ging Fanden Sie diese Position in der Welt einzurichten 256 00:11:00,110 --> 00:11:02,240 seine Kamera in genau der richtige place-- 257 00:11:02,240 --> 00:11:06,510 und dies sieht heute aber like-- es ist genau die gleiche Einstellung. 258 00:11:06,510 --> 00:11:10,060 Dieses Bild ist jedoch, in einer Datei, Format namens Bitmap, b-m-p. 259 00:11:10,060 --> 00:11:12,910 Und wir werden ein Super nehmen kurzen Blick auf, was das bedeutet. 260 00:11:12,910 --> 00:11:17,770 >> Aber Bitmap ist nur eine andere Art, , die Bilder immer noch mit Pixel 261 00:11:17,770 --> 00:11:19,580 in 0 und 1, letztendlich. 262 00:11:19,580 --> 00:11:23,282 Aber bei schnellen Blick, hat es ein interessanter Unterschrift 263 00:11:23,282 --> 00:11:24,490 am Anfang der Datei. 264 00:11:24,490 --> 00:11:26,670 Es ist nicht nur drei Bytes, sondern es gibt 265 00:11:26,670 --> 00:11:30,770 eine ganze Reihe von Mustern von Bytes Diese Bedeutung vorbestimmten haben. 266 00:11:30,770 --> 00:11:34,490 Beispielsweise irgendwo in der ersten Bytes einer Bitmap 267 00:11:34,490 --> 00:11:37,440 wird sich die Größe der zu sein Bild, die Breite des Bildes, 268 00:11:37,440 --> 00:11:40,390 die Höhe des Bildes, so dass nützliche Metadaten, wenn man so will. 269 00:11:40,390 --> 00:11:43,940 Praktische Informationen, dass Photoshop oder jedem Grafikprogramm Sie verwenden 270 00:11:43,940 --> 00:11:45,180 könnte tatsächlich interessieren. 271 00:11:45,180 --> 00:11:47,170 >> Also mehr dazu in Problem Set 4, aber das 272 00:11:47,170 --> 00:11:49,220 ist nur zu sagen, dass am Ende des Tages 273 00:11:49,220 --> 00:11:52,390 alle Dateiformate Sie bislang verwendet haben für Jahre-- Microsoft Word-Dateien, 274 00:11:52,390 --> 00:11:55,820 Numbers-Dateien, Excel-Dateien, eine beliebige Anzahl von Dateiformaten 275 00:11:55,820 --> 00:11:57,770 das könnte einige haben bekannte Dateierweiterung 276 00:11:57,770 --> 00:12:00,130 sind nur 0 und 1 unter der Haube. 277 00:12:00,130 --> 00:12:02,970 Und Menschen haben beschlossen, was die Konventionen sind, 278 00:12:02,970 --> 00:12:08,340 welche Muster von 0 und 1 repräsentieren eine Word-Datei gegen eine Excel-Datei, 279 00:12:08,340 --> 00:12:10,322 gegen eine beliebige Anzahl von anderen Dateiformaten. 280 00:12:10,322 --> 00:12:12,780 So in PSet 4, werden Sie eine haben, Gelegenheit, mit, dass zu spielen. 281 00:12:12,780 --> 00:12:14,405 >> Aber was bedeutet es, eine Struktur zu haben. 282 00:12:14,405 --> 00:12:18,012 Dies ist eigentlich eine nette segue jetzt in C, die nur ein paar hat 283 00:12:18,012 --> 00:12:20,220 von zusätzlichen Funktionen, haben wir nicht noch sah. 284 00:12:20,220 --> 00:12:24,230 Es ist eine ziemlich kleine Sprache und einer der die nette Features zu C ist eine Struktur. 285 00:12:24,230 --> 00:12:27,300 Zum Beispiel, wenn man wollte represent-- lassen 286 00:12:27,300 --> 00:12:33,690 sagen, dass Sie eine Variable haben wollte, dass stellt ein Student in einem gewissen Programm. 287 00:12:33,690 --> 00:12:37,330 Vielleicht waren Sie einen Kurs zu schreiben Registrierungsprogramm, oder Kern-Shopping 288 00:12:37,330 --> 00:12:38,870 Werkzeug, oder so ähnlich. 289 00:12:38,870 --> 00:12:42,922 Was sind Stücke von Daten im Zusammenhang an einen Studenten, die in den Sinn kommen? 290 00:12:42,922 --> 00:12:44,880 Wie ein Schüler mit, welche Werte vertreten? 291 00:12:44,880 --> 00:12:45,732 Ja? 292 00:12:45,732 --> 00:12:46,940 Sie haben einen Namen als Student. 293 00:12:46,940 --> 00:12:48,900 Was braucht ein typisches Studenten haben? 294 00:12:48,900 --> 00:12:49,320 >> ZIELGRUPPE: [unverständlich] 295 00:12:49,320 --> 00:12:50,200 >> David J. MALAN: Also, sorry. 296 00:12:50,200 --> 00:12:50,660 >> Publikum: Alter. 297 00:12:50,660 --> 00:12:52,980 >> David J. MALAN: Eine Alters oder Geburtstags äquivalent yep. 298 00:12:52,980 --> 00:12:53,557 Was sonst? 299 00:12:53,557 --> 00:12:54,390 ZIELGRUPPE: ID-Nummer? 300 00:12:54,390 --> 00:12:57,460 David J. MALAN: So eine ID-Nummer, vielleicht eine Telefonnummer, vielleicht ein Schlafsaal, oder Haus, 301 00:12:57,460 --> 00:12:58,670 oder Fachhochschule, oder so ähnlich. 302 00:12:58,670 --> 00:13:01,820 Eine beliebige Anzahl von Stücken von Daten, Sie in Ihrer Kontaktliste haben könnte 303 00:13:01,820 --> 00:13:03,890 ist das, was vielleicht einen Studenten zu definieren. 304 00:13:03,890 --> 00:13:08,490 Wenn wir dies tun, in Code wollte, wir könnten etwas Einfaches wie dies zu tun. 305 00:13:08,490 --> 00:13:15,670 Wir könnten ein Programm, damit haben hat lassen Sie uns sagen, int main (void). 306 00:13:15,670 --> 00:13:18,920 Und wenn ich will, für einen student Ich hätte zum Beispiel 307 00:13:18,920 --> 00:13:24,330 ein String genannt Namen für diesen Schüler, ein String genannt Wohnheim für die Schüler, 308 00:13:24,330 --> 00:13:26,900 vielleicht ein int namens ID für die Schüler. 309 00:13:26,900 --> 00:13:30,840 Und weil ich mit Schnur, I brauchen, um zurück zu gehen und Aufmachungen CS50.h. 310 00:13:30,840 --> 00:13:33,300 Vielleicht werde ich stdio.h müssen. 311 00:13:33,300 --> 00:13:38,190 Lassen Sie mich also präventiv tun diejenigen, und ich bin werde diese student.c für jetzt anrufen 312 00:13:38,190 --> 00:13:40,080 und speichern Sie diese. 313 00:13:40,080 --> 00:13:44,206 >> Und jetzt kann ich etwas tun Mit diesen Variablen. 314 00:13:44,206 --> 00:13:46,830 Und wir sind gerade dabei, zu schreiben dass als Kommentar in Pseudo-Code, 315 00:13:46,830 --> 00:13:48,829 denn es ist nicht interessant was wir jetzt tun. 316 00:13:48,829 --> 00:13:51,242 OK, das ist so ein Programm, speichert irgendwie einen Studenten. 317 00:13:51,242 --> 00:13:53,450 Was will ich, wenn ich zu tun wollen zwei Studenten zu speichern? 318 00:13:53,450 --> 00:13:55,991 Also mein erster Instinkt wird um alles in Ordnung zu sein, warten Sie eine Minute, 319 00:13:55,991 --> 00:14:01,920 wenn ich einen anderen Schüler, warum nicht ich nur 2 string name, string Wohnheim 2 zu tun, 320 00:14:01,920 --> 00:14:04,190 int id2. 321 00:14:04,190 --> 00:14:06,540 Und wir haben gone getan auf diesem Weg vor 322 00:14:06,540 --> 00:14:10,890 und was war unsere Lösung zu dem, was scheint, Art von einem hackish kopieren und einfügen zu sein 323 00:14:10,890 --> 00:14:11,555 Job hier? 324 00:14:11,555 --> 00:14:12,346 ZIELGRUPPE: Ein Array. 325 00:14:12,346 --> 00:14:13,830 David J. MALAN: Ja, wir ein Array verwenden. 326 00:14:13,830 --> 00:14:15,620 Rechts dies sehr schnell unhandlich. 327 00:14:15,620 --> 00:14:18,453 Sie müssen sich beliebig sortieren von starten Namensgebung alle diese Variablen. 328 00:14:18,453 --> 00:14:22,190 Und Sie, der Mensch, haben zu halten Track, der OK name2 entspricht 329 00:14:22,190 --> 00:14:25,060 mit dorm2 entspricht id2. 330 00:14:25,060 --> 00:14:26,200 Es wird nur ein Durcheinander. 331 00:14:26,200 --> 00:14:29,350 So ist es viel einfacher, Rückruf von vor ein paar Wochen, 332 00:14:29,350 --> 00:14:34,300 nur mit den genannten Zeichenfolgennamen und vielleicht geben uns drei davon. 333 00:14:34,300 --> 00:14:36,940 Und dann vielleicht wir String-Schlafsäle und haben 334 00:14:36,940 --> 00:14:41,900 drei davon, oder mit einem konstanten, int-IDs und drei von denen. 335 00:14:41,900 --> 00:14:45,250 Aber auch jetzt das fühlt sich an ein wenig schlampig, rechts. 336 00:14:45,250 --> 00:14:49,440 Wir freuen uns über Schüler und doch sprechen Ich bin wirklich Wohnung auf dem niedrigen Niveau 337 00:14:49,440 --> 00:14:50,470 Implementierungsdetails. 338 00:14:50,470 --> 00:14:52,790 Der Student ist ein Name und ein Wohnheim und ID. 339 00:14:52,790 --> 00:14:59,814 >> Warum kann ich nicht einfach nur eine Variable zu deklarieren genannt Student und nennen es s. 340 00:14:59,814 --> 00:15:02,230 Und wenn ich einen anderen Schüler, warum nicht ich nenne es nicht einfach t. 341 00:15:02,230 --> 00:15:05,260 Oder wenn ich eine ganze Reihe von Studenten, warum ich nicht einfach 342 00:15:05,260 --> 00:15:09,740 sagen, ich habe eine ganze Klasse von Studenten, und es ist drei von ihnen. 343 00:15:09,740 --> 00:15:12,470 Mit anderen Worten, warum kann ich nicht kommen up mit meinen eigenen Datentyp, genannt 344 00:15:12,470 --> 00:15:15,641 Die Schüler, von denen im Inneren ist ein Name, ist eine ID, ein Wohnheim, 345 00:15:15,641 --> 00:15:16,890 ist eine beliebige Anzahl von anderen Bereichen. 346 00:15:16,890 --> 00:15:19,030 Und es stellt sich heraus Sie kann genau das tun. 347 00:15:19,030 --> 00:15:21,850 >> So C hat dieses Feature namens struct. 348 00:15:21,850 --> 00:15:24,700 Das ist eine Sprache-Funktion, die ermöglicht es uns, genau dies zu tun. 349 00:15:24,700 --> 00:15:28,370 Ich werde weitermachen und eröffnen structs.h 350 00:15:28,370 --> 00:15:32,299 wohin wir gehen, um das zu sehen folgende Definition eines Studenten. 351 00:15:32,299 --> 00:15:35,215 Es stellt sich heraus - und diese sogar einfacher als die eines mit einer ID 352 00:15:35,215 --> 00:15:36,080 vor einem Moment. 353 00:15:36,080 --> 00:15:39,120 Wenn Sie kommen mit möchten Ihre hausgemachten Datentyp, 354 00:15:39,120 --> 00:15:42,750 und zusätzlich zu int und char und schweben und all diese anderen, die es gibt, 355 00:15:42,750 --> 00:15:45,810 können Sie dies tun, indem sie buchstäblich Schreiben typedef struct, 356 00:15:45,810 --> 00:15:47,880 dann einige geschweiften Klammern, innerhalb dessen Sie 357 00:15:47,880 --> 00:15:51,460 Liste der Variablen, die Sie wollen, assoziieren mit diesem neuen benutzerdefinierten Daten 358 00:15:51,460 --> 00:15:55,670 Geben Sie wie ein Name und ein Studentenwohnheim, und dann nach den geschweiften Klammern 359 00:15:55,670 --> 00:15:57,860 Sie einen Namen für den neuen Datentyp zu geben. 360 00:15:57,860 --> 00:15:59,220 So, zum Beispiel, Student. 361 00:15:59,220 --> 00:16:03,247 >> Und was ist schön, jetzt darüber ist, dass wenn wir auf den entsprechenden Code, 362 00:16:03,247 --> 00:16:05,080 die Konvention, erste Vor allem ist zu bereiten 363 00:16:05,080 --> 00:16:08,230 in einer Datei namens etwas Punkt h, eine Header-Datei, die wir nicht haben 364 00:16:08,230 --> 00:16:09,780 begann mit uns zu viel. 365 00:16:09,780 --> 00:16:12,120 Aber wir werden beginnen mit jetzt ziemlich viel. 366 00:16:12,120 --> 00:16:18,650 Und was wir damit machen können, letztlich in diesen wenigen Zeilen Code 367 00:16:18,650 --> 00:16:22,130 ist genau das zu erklären Datentyp, ein Student. 368 00:16:22,130 --> 00:16:23,230 Und jetzt nutzen es zulassen. 369 00:16:23,230 --> 00:16:27,274 >> Ich werde jetzt in zu gehen eine Datei namens structs1.c. 370 00:16:27,274 --> 00:16:29,440 Und lassen Sie uns einen Blick auf ein einige Merkmale hier. 371 00:16:29,440 --> 00:16:32,250 Also das Zeug hier oben ist meist vertraut, und wir schicken 372 00:16:32,250 --> 00:16:35,040 kommen zurück, um, was nicht vertraut in nur einem Augenblick. 373 00:16:35,040 --> 00:16:39,880 Das ist natürlich auch meine eigene Header-Datei, die neu ist, als auch, 374 00:16:39,880 --> 00:16:42,580 Ausnahme PSet 3, wo, Recall, haben wir helpers.h. 375 00:16:42,580 --> 00:16:45,150 Sie könnten also #include helpers.h wieder zu verwenden. 376 00:16:45,150 --> 00:16:49,381 >> Warum aber soll ich mit Zitaten statt der eckigen Klammern? 377 00:16:49,381 --> 00:16:50,630 Wann muss ich zwischen ihnen wählen? 378 00:16:50,630 --> 00:16:52,310 Fast immer ich scheine In den eckigen Klammern verwenden. 379 00:16:52,310 --> 00:16:55,040 Und dann, ganz plötzlich auf Reihensechs Ich bin mit doppelten Anführungszeichen. 380 00:16:55,040 --> 00:16:55,860 Warum könnte das sein? 381 00:16:55,860 --> 00:16:56,700 Ja? 382 00:16:56,700 --> 00:16:57,725 >> ZIELGRUPPE: [unverständlich] 383 00:16:57,725 --> 00:16:59,350 David J. MALAN: Das ist eine tatsächliche, was? 384 00:16:59,350 --> 00:17:00,559 ZIELGRUPPE: Das ist in der IDE. 385 00:17:00,559 --> 00:17:02,475 David J. MALAN: Ja, das ist in meinem eigentlichen IDE. 386 00:17:02,475 --> 00:17:05,690 Und lassen Sie uns nicht auf dem IDE zu wohnen, weil das ist nur ein Werkzeug, das ich verwende. 387 00:17:05,690 --> 00:17:08,119 Das ist in meinem aktuellen Verzeichnis spezifisch. 388 00:17:08,119 --> 00:17:11,647 So structs.h ist meine eigene Datei nicht in der IDE installiert 389 00:17:11,647 --> 00:17:14,480 in dem Betriebssystem selbst, sondern es ist in meinem aktuellen Verzeichnis. 390 00:17:14,480 --> 00:17:16,910 Also der Konvention ist, wenn Sie wollen eigene Header-Datei enthalten, 391 00:17:16,910 --> 00:17:18,200 verwenden Sie einfach Anführungszeichen. 392 00:17:18,200 --> 00:17:23,290 >> Was machen wir dieses Ding nennen in Linie 8, allgemein gesprochen? 393 00:17:23,290 --> 00:17:25,200 Das ist was? 394 00:17:25,200 --> 00:17:28,220 #define etwas. 395 00:17:28,220 --> 00:17:31,040 Dies stellt Konstanten, oder? 396 00:17:31,040 --> 00:17:33,140 Wenn Sie eine haben wollen Wert in Ihrem Programm 397 00:17:33,140 --> 00:17:35,110 dass Sie eine ganze verwenden paar Mal, es ist 398 00:17:35,110 --> 00:17:39,330 gute Konvention, sie ausklammern, deklarieren, mit dem Hash-Symbol 399 00:17:39,330 --> 00:17:43,340 zu definieren, dann, durch Konvention, in allen Großbuchstaben word-- wenn es nicht 400 00:17:43,340 --> 00:17:45,320 unbedingt erforderlich ist, aber Es ist die menschliche Konvention 401 00:17:45,320 --> 00:17:47,210 Konstanten nutzen so dass sie herausspringen 402 00:17:47,210 --> 00:17:50,380 bei Ihnen Platz visually-- und dann wird der Wert, den Sie wollen sicher sein 403 00:17:50,380 --> 00:17:52,250 äquivalent zu Namen, die konstant ist. 404 00:17:52,250 --> 00:17:56,110 Kein Semikolon, aber Sie einfach folgen diesem Muster gibt. 405 00:17:56,110 --> 00:17:57,770 >> So was mache ich in diesem eigentlichen Code. 406 00:17:57,770 --> 00:18:00,660 Werfen wir also einen Blick auf das Hauptprogramm hier. 407 00:18:00,660 --> 00:18:04,080 In Zeile 12, weil ich haben structs.h enthalten, 408 00:18:04,080 --> 00:18:06,492 Ich habe jetzt magisch an meinem Entsorgungs ein neuer Datentyp. 409 00:18:06,492 --> 00:18:09,200 Ich meine nicht nur Zugriff auf int, und Saibling und float und string, 410 00:18:09,200 --> 00:18:10,060 und Blau und andere. 411 00:18:10,060 --> 00:18:12,470 Ich habe jetzt den Zugang zu Student-Datentyp. 412 00:18:12,470 --> 00:18:17,740 So in Zeile 12, ich bin die Kombination von zwei ideas-- man einen benutzerdefinierten Datentyp und zwei, 413 00:18:17,740 --> 00:18:18,940 Verwendung eines Arrays. 414 00:18:18,940 --> 00:18:21,700 Und so in diesem Programm, wenn Ich möchte eigentlich unterstützen 415 00:18:21,700 --> 00:18:24,320 drei Studenten in meinem Programm, I 416 00:18:24,320 --> 00:18:30,480 kann einfach sagen, gib mir eine variable genannt Studenten, von denen jede 417 00:18:30,480 --> 00:18:32,970 ist vom Typ Studenten, die ist mein benutzerdefinierten Datentyp. 418 00:18:32,970 --> 00:18:35,890 Und insbesondere, gib mir drei davon in meinem Array. 419 00:18:35,890 --> 00:18:37,750 >> So, jetzt was tun wir in diesem Programm zu tun? 420 00:18:37,750 --> 00:18:40,670 Hier ist nur eine for-Schleife Iteration 0-3, denn das ist 421 00:18:40,670 --> 00:18:42,110 was den Wert der Studierenden ist. 422 00:18:42,110 --> 00:18:44,420 Ich bin nur der Benutzer aufgefordert geben Sie mir den Namen des Studenten. 423 00:18:44,420 --> 00:18:48,090 Und dann in Zeile 17, die wir haben eine meist vertrauten Leitung. 424 00:18:48,090 --> 00:18:50,370 Wir haben unser alter Freund GetString rechts. 425 00:18:50,370 --> 00:18:52,345 Und was für Stück Syntax ist offenbar neue, 426 00:18:52,345 --> 00:18:55,130 wenn Sie noch nie in C programmiert, bevor, und haben noch nie die Strukturen verwendet? 427 00:18:55,130 --> 00:18:55,510 Ja? 428 00:18:55,510 --> 00:18:56,417 >> Publikum: Die .name. 429 00:18:56,417 --> 00:18:57,500 David J. MALAN: Die .name. 430 00:18:57,500 --> 00:19:01,220 Aber das ist nicht zu viel von einem Sprung, denn jetzt Studenten Halterung I 431 00:19:01,220 --> 00:19:02,590 gibt Ihnen die i-te Schüler. 432 00:19:02,590 --> 00:19:04,730 Und wenn Sie tauchen wollen innerhalb dieser Struktur, 433 00:19:04,730 --> 00:19:09,490 Sie nur eine einzige Zeitraum zu nutzen und dann wird der Name der Variable, innen, 434 00:19:09,490 --> 00:19:11,900 oder Eigentum im Inneren, Sie wollen den Zugang zu bekommen. 435 00:19:11,900 --> 00:19:14,816 Ebenso dann, wenn ich dann aufgefordert, die Benutzer, geben Sie mir den Studenten im Studentenwohnheim, 436 00:19:14,816 --> 00:19:18,390 Sie ähnlich speichern kann, dass String im Wohnheim Variable innerhalb 437 00:19:18,390 --> 00:19:19,940 dieser Studentenstruktur. 438 00:19:19,940 --> 00:19:21,410 >> Und jetzt die Dinge ein wenig Phantasie. 439 00:19:21,410 --> 00:19:24,420 Und das wird sich freuen bei vielleicht eine Menge ziemlich bald. 440 00:19:24,420 --> 00:19:27,970 Aber Sie werden diese weit mehr in PSet sehen 4, so lassen Sie uns nur einen Blick auf ihn jetzt. 441 00:19:27,970 --> 00:19:33,364 Es stellt sich heraus, dass in Zeile 23 durch 38, was denken Sie, ich bin vielleicht gerade? 442 00:19:33,364 --> 00:19:35,530 Ich habe die Kommentare entfernt für heute, aber die Version 443 00:19:35,530 --> 00:19:38,660 des Codes online Referenz hat alle Kommentare. 444 00:19:38,660 --> 00:19:40,171 Was muss ich scheinen zu tun? 445 00:19:40,171 --> 00:19:42,530 >> Publikum: Das Speichern der Datei mit allen die Informationen, die der Benutzer eingegeben. 446 00:19:42,530 --> 00:19:44,530 >> David J. MALAN: Ja, genau, ist dies eine neue Art 447 00:19:44,530 --> 00:19:46,370 , dass wir sehen, zwei, Ein weiteres Merkmal der C, 448 00:19:46,370 --> 00:19:48,700 wodurch kann ich meine eigenen Dateien erstellen. 449 00:19:48,700 --> 00:19:51,580 Bisher fast jedes Programm Sie haben geschrieben staatenlos. 450 00:19:51,580 --> 00:19:53,334 Sobald es fertig ist läuft, das ist es. 451 00:19:53,334 --> 00:19:55,000 Es gibt keinen Speicher oder Erinnerung daran. 452 00:19:55,000 --> 00:19:56,110 Es gibt kein Datei gespeichert. 453 00:19:56,110 --> 00:19:58,120 Aber wenn Sie zu wollen, sparen Eingang, verfügt 454 00:19:58,120 --> 00:20:02,100 passiert, wie in einem Spiel oder ein Programm so, stellt sich heraus, wir können dies tun. 455 00:20:02,100 --> 00:20:04,360 Und du wirst diese mehr zu sehen in PSet 4 und in Abschnitt. 456 00:20:04,360 --> 00:20:08,661 Aber diese Linie 23 im wesentlichen erstellt eine Datei namens students.csv. 457 00:20:08,661 --> 00:20:10,160 Und Sie vielleicht schon gesehen haben. 458 00:20:10,160 --> 00:20:14,250 Auch wenn Sie noch nie studiert CS vor, CSV ist durch Kommata getrennte Variablen. 459 00:20:14,250 --> 00:20:19,000 Es ist wie ein sehr armen Mannes Version einer Excel-Datei, 460 00:20:19,000 --> 00:20:22,270 was bedeutet, dass es geöffnet werden konnte in Excel und im Apple-Zahlen, 461 00:20:22,270 --> 00:20:23,830 und es besteht aus Reihen und Spalten. 462 00:20:23,830 --> 00:20:26,485 Aber es ist nicht ein proprietäres Format wie Microsoft oder Apple. 463 00:20:26,485 --> 00:20:29,840 Es ist nur das Komma trennen Werte, die wir gleich sehen werden. 464 00:20:29,840 --> 00:20:31,010 >> Und nehmen Sie nur eine Vermutung. 465 00:20:31,010 --> 00:20:33,480 In Zeile 23, zumin Ende, mein zweites Argument 466 00:20:33,480 --> 00:20:37,700 auf diese neue Funktion f für die Datei geöffnet geöffnet ist w. 467 00:20:37,700 --> 00:20:39,430 Was könnte w bezeichnen? 468 00:20:39,430 --> 00:20:40,022 Ja? 469 00:20:40,022 --> 00:20:41,260 >> Publikum: Es lässt Sie in die Datei zu schreiben? 470 00:20:41,260 --> 00:20:42,630 >> David J. MALAN: Es lässt Sie schreiben in die Datei. 471 00:20:42,630 --> 00:20:44,810 Es gibt also ein paar Varianten dass wir hier kann einstecken. 472 00:20:44,810 --> 00:20:47,184 Aber wenn Sie nur lesen wollen die Datei, ist, dass es betrachten 473 00:20:47,184 --> 00:20:50,010 und lesen Sie es in den Speicher, die Sie benutzen Sie einfach Zitat unquote "r". 474 00:20:50,010 --> 00:20:53,110 Wenn Sie auf die schreiben wollen Datei, Zitat verwenden Sie unquote "w". 475 00:20:53,110 --> 00:20:55,190 Es ist auch anzuhängen und ein paar andere Dinge, 476 00:20:55,190 --> 00:20:57,356 wenn Sie wollen, um vorhandene Dateien zu modifizieren. 477 00:20:57,356 --> 00:21:00,480 Jetzt werden wir halten dies sah Sache, dann kommen wir wieder in die Linie 24. 478 00:21:00,480 --> 00:21:02,640 NULL, es sich herausstellt, ein spezieller Wert, 479 00:21:02,640 --> 00:21:06,070 kann durch bestimmte Funktionen zurückgegeben werden wenn etwas wrong-- gegangen 480 00:21:06,070 --> 00:21:08,490 wenn die Datei nicht existiert, wenn Sie über genügend Arbeitsspeicher ausgeführt habe, 481 00:21:08,490 --> 00:21:09,620 oder ein paar andere Fehler. 482 00:21:09,620 --> 00:21:13,470 Aber jetzt lasst uns einfach davon ausgehen, dass diese ist nur herkömmliche Fehlerprüfung. 483 00:21:13,470 --> 00:21:17,090 Hier in der Leitung 26, ich bin Iteration 0-3 über alle meine Schüler. 484 00:21:17,090 --> 00:21:20,470 Und das ist Art von Art einer neuen Funktion fprintf, 485 00:21:20,470 --> 00:21:21,460 sondern einfach nur eine Vermutung. 486 00:21:21,460 --> 00:21:24,370 Wenn printf ist nur Druck einen formatierten String, 487 00:21:24,370 --> 00:21:26,507 Was bedeutet fprintf wahrscheinlich das? 488 00:21:26,507 --> 00:21:27,590 ZIELGRUPPE: Drucken in eine Datei. 489 00:21:27,590 --> 00:21:29,290 David J. MALAN: Drucken formatierten String in eine Datei. 490 00:21:29,290 --> 00:21:31,180 Das ist, was die zusätzliche f Mittel-Datei. 491 00:21:31,180 --> 00:21:36,420 Und der neue erste Argument muss es sein die Variable, die die Datei darstellt. 492 00:21:36,420 --> 00:21:38,866 Dann werden wir einfach nur einen Format String wie printf. 493 00:21:38,866 --> 00:21:40,740 Und obwohl dies Syntax ist neu, das nur 494 00:21:40,740 --> 00:21:44,610 Mittel, die in den Namen des Studenten stecken, Plug-in Studentenwohnheim, und dann 495 00:21:44,610 --> 00:21:47,160 mit fclose, schließen Sie die Datei. 496 00:21:47,160 --> 00:21:49,730 Und dann lastly-- das ist neu und wir werden darauf zurückkommen 497 00:21:49,730 --> 00:21:53,240 vor long-- Ich befreien der Student aus Gründen 498 00:21:53,240 --> 00:21:54,860 das passiert ist da oben. 499 00:21:54,860 --> 00:21:56,820 Aber wir kommen wieder zu derjenigen vor long-- 500 00:21:56,820 --> 00:21:59,820 das ist, weil, wie GetString ist tatsächlich arbeiten unter der Haube. 501 00:21:59,820 --> 00:22:01,280 >> Werfen wir also einen Blick hier. 502 00:22:01,280 --> 00:22:04,380 Wenn ich ls in meinem Verzeichnis, feststellen, dass ich nicht 503 00:22:04,380 --> 00:22:09,360 haben eine Datei namens students.csv, einfach nicht da, ist nicht vorhanden. 504 00:22:09,360 --> 00:22:14,965 Also, wenn ich jetzt dieses Programm zu kompilieren, machen structs-1,. / structs-1, 505 00:22:14,965 --> 00:22:20,570 und ich werde weitermachen und geben Sie Andi, der in Berkeley an der Yale lebt. 506 00:22:20,570 --> 00:22:26,350 Wir werden Rob haben, die lebt in Thayer in diesen Tagen. 507 00:22:26,350 --> 00:22:33,760 Und lassen Sie kommen mit denen ist, glaube ich, ist Maria in Mather, 508 00:22:33,760 --> 00:22:35,100 wenn ich das richtig in Erinnerung habe. 509 00:22:35,100 --> 00:22:36,460 >> So scheint nichts zu passieren. 510 00:22:36,460 --> 00:22:40,680 Aber wenn ich ls jetzt, gibt es students.csv. 511 00:22:40,680 --> 00:22:43,080 Lassen Sie uns weiter und offener students.csv gehen. 512 00:22:43,080 --> 00:22:46,050 Dies ist wiederum eine sehr Leichtbau-Dateiformat. 513 00:22:46,050 --> 00:22:49,570 Aber ich habe einfach angenommen eine Konvention dass ich zwei Zeilen und Spalten Sie hier. 514 00:22:49,570 --> 00:22:52,020 Die erste Spalte ist Vornamen der Menschen. 515 00:22:52,020 --> 00:22:55,740 In der zweiten Spalte ist die Schüler- Wohnheim oder Fachschule und Haus, oder was. 516 00:22:55,740 --> 00:22:57,900 Und jetzt habe ich diese gespeichert dauerhaft in einer Datei. 517 00:22:57,900 --> 00:22:59,280 >> Also ist es nicht so interessant. 518 00:22:59,280 --> 00:23:02,980 Aber das ist nur ein Sprungbrett jetzt um in der Lage, Informationen fortbestehen 519 00:23:02,980 --> 00:23:04,040 dauerhaft. 520 00:23:04,040 --> 00:23:08,340 Also mal sehen, was nun mehr können wir zu tun mit diesen und anderen Funktionen. 521 00:23:08,340 --> 00:23:10,729 Aber zuerst, irgendwelche Fragen? 522 00:23:10,729 --> 00:23:12,145 Das war eine Menge, und das war schnell. 523 00:23:12,145 --> 00:23:16,131 Aber du wirst eine Menge zu sehen Weitere in PSet 4, wie gut. 524 00:23:16,131 --> 00:23:16,630 Ja? 525 00:23:16,630 --> 00:23:19,360 >> Publikum: Gibt es eine Möglichkeit, um weiterhin Hinzufügen von Namen zu dieser Datei? 526 00:23:19,360 --> 00:23:19,880 >> David J. MALAN: Gute Frage. 527 00:23:19,880 --> 00:23:21,800 Gibt es eine Möglichkeit, um fortzufahren Hinzufügen von Namen zu dieser Datei? 528 00:23:21,800 --> 00:23:22,340 Ja. 529 00:23:22,340 --> 00:23:24,630 Und in der Tat, wenn Sie am Ende up Wieder Öffnen der Datei, 530 00:23:24,630 --> 00:23:26,780 Sie Zitat verwenden würden unquote "a" für Anfügen, 531 00:23:26,780 --> 00:23:31,090 die nur hinzufügen, würde eine neue Zeile ein neue Linie wieder und wieder, genau. 532 00:23:31,090 --> 00:23:32,010 Gute Frage. 533 00:23:32,010 --> 00:23:32,950 Andere Fragen? 534 00:23:32,950 --> 00:23:33,450 Ja? 535 00:23:33,450 --> 00:23:35,580 Publikum: Wenn Sie lief der Programm erneut im Augenblick, 536 00:23:35,580 --> 00:23:38,000 wäre es zu halten Hinzufügen von Namen, um die Datei oder wäre es öffnen, eine neue Datei? 537 00:23:38,000 --> 00:23:38,740 >> David J. MALAN: Ah, gute Frage. 538 00:23:38,740 --> 00:23:41,448 Wenn Sie das Programm erneut rechts ran nun, vielleicht in neue Namen eingegeben haben, 539 00:23:41,448 --> 00:23:44,820 wäre es zu der Datei hinzufügen oder überschreiben Sie die Datei? 540 00:23:44,820 --> 00:23:47,420 Letzteres, weil ich nicht mit Append-Modus. 541 00:23:47,420 --> 00:23:49,930 Und weil ich einfach blind Öffnen der Datei zum Schreiben, 542 00:23:49,930 --> 00:23:51,310 ist es nur geht, um die Datei zu überschreiben. 543 00:23:51,310 --> 00:23:54,570 Also ich würde ja tun müssen, ist anzufügen, wenn ich wirklich eine langfristige 544 00:23:54,570 --> 00:23:55,350 Datenbank. 545 00:23:55,350 --> 00:23:58,220 >> Jetzt CSV ist nützlich, ehrlich gesagt, auch für wie wenn Sie writing-- 546 00:23:58,220 --> 00:24:00,100 und wir werden schließlich sehen dies später im Semester, wenn 547 00:24:00,100 --> 00:24:01,455 wir CSVs für andere Zwecke. 548 00:24:01,455 --> 00:24:04,920 Wenn Sie all die Menschen speichern möchten , die auf ein Ereignis registriert haben, 549 00:24:04,920 --> 00:24:07,420 oder für Ihre Studenten unterzeichnet Gruppe, oder so ähnlich, 550 00:24:07,420 --> 00:24:10,330 Speichern der Daten in dieser Art von Format ist super bequem. 551 00:24:10,330 --> 00:24:12,580 Da buchstäblich, wenn ich waren, um diese Datei herunterzuladen. 552 00:24:12,580 --> 00:24:14,540 Ich double-- könnte und wir tatsächlich versuchen diese 553 00:24:14,540 --> 00:24:16,720 wenn ich Excel oder Numbers hier. 554 00:24:16,720 --> 00:24:19,130 >> Ich bin auf der rechten Maustaste los oder Steuerungstaste auf Datei. 555 00:24:19,130 --> 00:24:20,020 Whoops. 556 00:24:20,020 --> 00:24:21,830 Rechts-Klick oder Control-Klick meiner Datei. 557 00:24:21,830 --> 00:24:24,960 Komm schon, ist meine Maus nicht zusammen. 558 00:24:24,960 --> 00:24:32,694 Download-- ich zu gehen downloaden Sie alle Dateien hier so 559 00:24:32,694 --> 00:24:33,860 nur so kann ich diese ein zu greifen. 560 00:24:33,860 --> 00:24:37,850 Und mal sehen, ob das funktioniert students.csv-- ersten Mal 561 00:24:37,850 --> 00:24:39,310 Ich habe aktiviert. 562 00:24:39,310 --> 00:24:41,360 Jetzt wollen sie meine Kontakte sehen. 563 00:24:41,360 --> 00:24:44,310 Nun, ich muss zu registrieren. 564 00:24:44,310 --> 00:24:47,620 Sehen Sie, wie einfach es ist, CSVs benutzen? 565 00:24:47,620 --> 00:24:50,840 Ja, halten Sie auf dem Laufenden. 566 00:24:50,840 --> 00:24:52,375 OK, jetzt sind wir bereit für die Klasse. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, was ist neu? 569 00:25:00,370 --> 00:25:02,920 OK, in der Nähe. 570 00:25:02,920 --> 00:25:04,750 Das war magisch. 571 00:25:04,750 --> 00:25:07,280 OK, wir haben jetzt zu aktualisieren. 572 00:25:07,280 --> 00:25:10,890 Und jetzt, vergessen, was es Datei ich ursprünglich eröffnet, 573 00:25:10,890 --> 00:25:13,090 aber was es a-- wir gehen. 574 00:25:13,090 --> 00:25:16,341 OK, so jetzt haben wir eine Excel-Datei. 575 00:25:16,341 --> 00:25:18,290 Danke. 576 00:25:18,290 --> 00:25:20,764 >> OK, also was ich tat, war der einfache Teil. 577 00:25:20,764 --> 00:25:23,930 Natürlich konnte ich vorinstalliert haben Excel oder Numbers, oder was auch immer Programm. 578 00:25:23,930 --> 00:25:25,846 Aber das ist schön, weil jetzt kann ich manipulieren 579 00:25:25,846 --> 00:25:28,090 die Daten in einem Standardformat. 580 00:25:28,090 --> 00:25:30,294 >> Kontext So, jetzt lassen wechseln Sie zu, wo wir aufgehört haben 581 00:25:30,294 --> 00:25:32,710 letzten Mal, was zu beginnen war ausziehen Stützräder. 582 00:25:32,710 --> 00:25:34,543 Aber zuerst, hast du nicht finden Sie in diesem früheren Mittagessen 583 00:25:34,543 --> 00:25:38,150 ist wieder passiert hier bei Feuer und Ice in Cambridge, Sitar in New Haven. 584 00:25:38,150 --> 00:25:43,150 Registrieren auf CS50s Website so schnell wie möglich In den CS50 Studenten und Mitarbeiter zu verbinden. 585 00:25:43,150 --> 00:25:46,090 >> Also nahmen wir Stützräder off am Montag als follows-- 586 00:25:46,090 --> 00:25:49,120 Saite befindet sich im deklariert CS50s Bibliothek für einige Zeit. 587 00:25:49,120 --> 00:25:52,650 Und es ist schön, weil es uns zu Variablen als reden 588 00:25:52,650 --> 00:25:54,660 kompletten Wörter und Sätze und mehr. 589 00:25:54,660 --> 00:25:56,710 Aber es stellt sich heraus, String ist nicht vorhanden. 590 00:25:56,710 --> 00:26:00,200 Das ist nur ein Synonym oder ein Alias, dass wir für etwas geschaffen haben, dass 591 00:26:00,200 --> 00:26:03,780 tatsächlich ist ein wenig technische genannt char *. 592 00:26:03,780 --> 00:26:07,900 >> Und in der Tat, ein Beispiel haben wir gesehen, eines Programms am Montag, 593 00:26:07,900 --> 00:26:11,200 das hat nicht ganz so verhalten wir erwartet hatten. 594 00:26:11,200 --> 00:26:13,630 Dies war der Datei vergleichen-0. 595 00:26:13,630 --> 00:26:17,910 Und daran erinnern, dass zu vergleichen-0, wenn I-Programm Montag neu kompilieren 596 00:26:17,910 --> 00:26:22,670 und führen zu vergleichen-0 und geben mom in Kleinbuchstaben, und Mama in Kleinbuchstaben erneut. 597 00:26:22,670 --> 00:26:25,320 Das Programm bestand ich darauf, Geben Sie verschiedene Dinge, 598 00:26:25,320 --> 00:26:29,210 auch wenn Mama, alle in Kleinbuchstaben, ist optisch identisch. 599 00:26:29,210 --> 00:26:31,990 Also, was war die kurze Antwort dafür, warum der Computer denkt, 600 00:26:31,990 --> 00:26:34,500 diese beiden Strings sind anders? 601 00:26:34,500 --> 00:26:35,250 Ja? 602 00:26:35,250 --> 00:26:36,534 >> ZIELGRUPPE: [unverständlich] 603 00:26:36,534 --> 00:26:37,450 David J. MALAN: Richtig. 604 00:26:37,450 --> 00:26:39,600 Also, Mama, das erste Mal, Ich geben Sie es in, wird 605 00:26:39,600 --> 00:26:42,710 irgendwo in meinem Computer gespeichert Speicher, sondern in einem anderen Ort 606 00:26:42,710 --> 00:26:44,690 als das zweite Mal, dass ich geben mom. 607 00:26:44,690 --> 00:26:46,580 Jetzt ist es mit Sicherheit konnte optimiert werden. 608 00:26:46,580 --> 00:26:49,205 Das System könnte klug sein und erkennen, diese beiden Saiten, hey, 609 00:26:49,205 --> 00:26:49,954 sie sind identisch. 610 00:26:49,954 --> 00:26:51,520 Lassen Sie mich nicht redundant zu speichern. 611 00:26:51,520 --> 00:26:54,229 Aber Computer nicht, das zu tun Optimierung, wenn Sie sie zu erzählen. 612 00:26:54,229 --> 00:26:56,061 Also, standardmäßig sind sie nur gehen, um am Ende 613 00:26:56,061 --> 00:26:57,670 an zwei verschiedenen Stellen im Speicher. 614 00:26:57,670 --> 00:27:01,570 Und so, um mehr klar ist, wenn sein verglichen wir die beiden Zeichenfolgen, 615 00:27:01,570 --> 00:27:03,950 die ersten genannt wurde s, das zweite genannt wurde 616 00:27:03,950 --> 00:27:08,530 t, was gesagt war ich Vergleichen Sie hier in Zeile 13? 617 00:27:08,530 --> 00:27:09,494 Ja. 618 00:27:09,494 --> 00:27:12,390 >> Publikum: Es ist der Ort im Speicher daß die Variable verweisen auf. 619 00:27:12,390 --> 00:27:14,900 >> David J. MALAN: Genau, ich war Vergleichen der Platz im Speicher 620 00:27:14,900 --> 00:27:16,300 dass diese Variablen zeigte auf. 621 00:27:16,300 --> 00:27:20,560 So gesagt, war, wenn Mama auf Byte Nummer 1, und 2 und 3, 622 00:27:20,560 --> 00:27:24,020 und 4-- da erinnere mich an den umgekehrten Schrägstrich 0 muss ganz am Ende zu sein. 623 00:27:24,020 --> 00:27:29,420 Und die andere Instanz von Mama, m-o-m, wurde auf die Adresse 10, 11, 12 und 13. 624 00:27:29,420 --> 00:27:33,100 Ich war den Vergleich 1, die Adresse, diese Stelle im Speicher, 625 00:27:33,100 --> 00:27:35,160 gegen 10, das offensichtlich nicht die gleichen. 626 00:27:35,160 --> 00:27:36,260 1 nicht 10. 627 00:27:36,260 --> 00:27:39,620 >> Also das ist schön, dass es ist ziemlich einfach. 628 00:27:39,620 --> 00:27:42,870 Aber es ist insofern problematisch, als Wir können nicht scheinen, um Zeichenfolgen zu vergleichen. 629 00:27:42,870 --> 00:27:44,930 So fundamentally-- und auf diesem niedrigen Niveau, 630 00:27:44,930 --> 00:27:47,300 wenn Sie zu implementieren wollte ein Programm, um zu vergleichen 631 00:27:47,300 --> 00:27:50,270 zwei Worte, die der Benutzer hat in für die Qualitäts eingegeben haben, 632 00:27:50,270 --> 00:27:53,944 tun sie line up für char char, nur in allgemeiner Form, 633 00:27:53,944 --> 00:27:55,360 was müssen wir tun, scheinbar? 634 00:27:55,360 --> 00:27:57,940 Es reicht nicht, nur um Schauen Sie sich diese beiden Adressen. 635 00:27:57,940 --> 00:27:58,860 Was müssen wir tun? 636 00:27:58,860 --> 00:27:59,360 Ja? 637 00:27:59,360 --> 00:28:01,120 >> ZIELGRUPPE: Durchlaufen die Zeichenfolge [unverständlich]. 638 00:28:01,120 --> 00:28:02,600 >> David J. MALAN: Ja, lassen Sie uns durchlaufen Sie die Zeichenkette. 639 00:28:02,600 --> 00:28:05,808 Lassen Sie uns eine for-Schleife, einer while-Schleife, oder was auch immer Sie am bequemsten mit. 640 00:28:05,808 --> 00:28:08,840 Und wenn wir zwei Strings irgendwo kam im Speicher, schauen wir uns an jedem der 641 00:28:08,840 --> 00:28:11,770 erste Zeichen, dann ist jeder zweite Charakter, dann dritte und vierte, 642 00:28:11,770 --> 00:28:15,206 und fünften, bis wir was spezielle Sentinel-Wert? 643 00:28:15,206 --> 00:28:16,080 ZIELGRUPPE: [unverständlich] 644 00:28:16,080 --> 00:28:18,800 David J. MALAN: Ja, der Backslash Null ist, an welcher Stelle in entweder String 645 00:28:18,800 --> 00:28:20,100 können wir entscheiden, das ist es. 646 00:28:20,100 --> 00:28:21,970 Haben wir abgestimmt jeden einzelnen Charakter? 647 00:28:21,970 --> 00:28:22,990 Wenn nicht, dann false zurück. 648 00:28:22,990 --> 00:28:24,770 Wenn ja, return true. 649 00:28:24,770 --> 00:28:28,800 Und das ist also genau das, was diese Version des Programms vergleichen-1.c tut. 650 00:28:28,800 --> 00:28:31,677 Es ist identisch mit dem, was wir sah Montag außer, dass ich 651 00:28:31,677 --> 00:28:34,760 losgeworden des Wortes string-- obwohl daß keine funktionelle impact-- allen 652 00:28:34,760 --> 00:28:37,450 Ich jetzt mache ist das Entfernen Einige visuelle Stützräder, 653 00:28:37,450 --> 00:28:40,880 aber klar, dass zu sehen s und t Adressen. 654 00:28:40,880 --> 00:28:43,020 Und das ist, was der Stern, der Stern, stellt 655 00:28:43,020 --> 00:28:46,690 eine Adresse ist, ansonsten bekannter technisch als Zeiger. 656 00:28:46,690 --> 00:28:49,880 >> Also, wenn ich erkläre s auf Zeile 9 und sagen, char * s, 657 00:28:49,880 --> 00:28:52,160 das bedeutet nicht, geben Sie mir eine Saite. 658 00:28:52,160 --> 00:28:56,360 Das bedeutet, geben Sie mir eine Variable, deren Ziel im Leben ist, um eine Adresse zu speichern. 659 00:28:56,360 --> 00:29:00,400 Da ich zu dem setzen Adresse einer Zeichenfolge hinein. 660 00:29:00,400 --> 00:29:03,500 Und in der Tat, GetString, zu sein klare, nicht einen String zurück. 661 00:29:03,500 --> 00:29:06,110 Dabei spielt es keine Mutter zurückkehren Backslash Null, per se. 662 00:29:06,110 --> 00:29:10,005 Was bedeutet speziell GetString und präzise zurückgeben? 663 00:29:10,005 --> 00:29:10,880 ZIELGRUPPE: [unverständlich] 664 00:29:10,880 --> 00:29:14,080 David J. MALAN: Eine Adresse, die Adresse des ersten Zeichens 665 00:29:14,080 --> 00:29:16,070 in einigen Zeichenkette, die es bekommen hat. 666 00:29:16,070 --> 00:29:19,250 Und nun sehen wir ein spezielles Schlüsselwort erneut. 667 00:29:19,250 --> 00:29:20,640 Und, angespielt I dieser früher. 668 00:29:20,640 --> 00:29:23,620 Das wird eine gute Konvention sein dass wir jetzt wieder und wieder zu sehen. 669 00:29:23,620 --> 00:29:27,540 Ich überprüfe, um sicherzustellen, dass s nicht null ist und t nicht null ist. 670 00:29:27,540 --> 00:29:30,100 Da auf meinem basiert wirklich schnelle Erwähnung früher, 671 00:29:30,100 --> 00:29:35,510 , was bedeuten könnte, wenn GetString liefert nicht eine Adresse, aber N-U-L-L, die wiederum, 672 00:29:35,510 --> 00:29:36,990 einigen besonderen Wert? 673 00:29:36,990 --> 00:29:37,890 >> ZIELGRUPPE: Fehler. 674 00:29:37,890 --> 00:29:38,600 >> David J. MALAN: Es ist ein Fehler aufgetreten. 675 00:29:38,600 --> 00:29:39,550 Etwas ist schief gelaufen. 676 00:29:39,550 --> 00:29:41,341 Und was in der Regel könnte passieren, vor allem 677 00:29:41,341 --> 00:29:45,162 mit strings-- dem auch sein mag unbekannter Länge in advance-- 678 00:29:45,162 --> 00:29:46,870 vielleicht die Computer ' aus der Erinnerung, vielleicht 679 00:29:46,870 --> 00:29:49,280 Sie in eine solche typisierte Lang Wort oder einen Satz 680 00:29:49,280 --> 00:29:51,880 oder eingefügt einen so großen Essay es gibt einfach nicht genug Speicher. 681 00:29:51,880 --> 00:29:55,340 Und so GetString nicht zurückkehren die Adresse der ganzen Sache, 682 00:29:55,340 --> 00:29:56,620 so dass es nur gibt nichts zurück. 683 00:29:56,620 --> 00:30:00,580 Und es sagt, ist ein Fehler passiert durch Rücksendung der Spezial-NULL-Wert. 684 00:30:00,580 --> 00:30:02,890 Es ist die Null-Adresse, so zu sprechen. 685 00:30:02,890 --> 00:30:06,157 >> Jetzt stellt sich heraus, C kommt mit einer Funktion, dass die Iteration tut. 686 00:30:06,157 --> 00:30:09,240 Wir haben nicht, dies mit zu implementieren eine for-Schleife oder einer while-Schleife selbst. 687 00:30:09,240 --> 00:30:11,150 Wir können eine Funktion zu verwenden, kurz und bündig genannt wird, 688 00:30:11,150 --> 00:30:15,400 rühren Layout-Datei oder String vergleichen, dessen Ziel im Leben ist es, genau das zu tun. 689 00:30:15,400 --> 00:30:19,990 Sie geben ihm zwei Zeiger, zwei Adressen, und es wird an diese Adressen zu gehen 690 00:30:19,990 --> 00:30:23,130 und vergleichen Sie dann Buchstabe für Buchstabe für Buchstabe für Qualität, 691 00:30:23,130 --> 00:30:26,610 Stoppen nur, wenn, was wahr ist? 692 00:30:26,610 --> 00:30:31,540 Wenn intuitiv sollte comp rühren Stop Iteration, nur klar zu sein? 693 00:30:31,540 --> 00:30:35,400 Wenn sie trifft einen umgekehrten Schrägstrich 0 entweder Schnur, an welcher Stelle es entscheiden kann, 694 00:30:35,400 --> 00:30:38,910 hat alles aufeinander abgestimmt, oder hat es eine Diskrepanz? 695 00:30:38,910 --> 00:30:42,740 >> Also, wenn wir laufen diese nun und versuchen unsere kleine Kapitalisierung Spiel, 696 00:30:42,740 --> 00:30:49,260 so stellen Sie vergleichen-1, ./compare-1 und geben mom in Klein beide Male. 697 00:30:49,260 --> 00:30:50,560 Jetzt ist es das Gleiche. 698 00:30:50,560 --> 00:30:54,080 Und wenn ich es wieder tun mit Kleinbuchstaben und dann vielleicht in Großbuchstaben. 699 00:30:54,080 --> 00:30:56,720 Nun ist es in der Tat unterscheidet zwischen Groß- und Kleinschreibung. 700 00:30:56,720 --> 00:31:00,440 Also nicht allzu schwer oder magisch, aber es muss jetzt erklären, 701 00:31:00,440 --> 00:31:03,140 was los ist unter der Haube. 702 00:31:03,140 --> 00:31:07,640 >> Also, was können wir noch zu extrahieren von dieser Art von Unterricht? 703 00:31:07,640 --> 00:31:08,980 Werfen wir also einen Blick auf diese. 704 00:31:08,980 --> 00:31:15,380 Ich werde weitermachen und schreiben ein Schnellprogramm kopier 0 hier genannt. 705 00:31:15,380 --> 00:31:21,594 Und jetzt weiter und tatsächlich loslassen lass es uns tun this-- mit Kopie-0, 706 00:31:21,594 --> 00:31:23,010 einen Blick auf das, was ich hier habe. 707 00:31:23,010 --> 00:31:24,712 Ich zum ersten Mal den Benutzer zu sagen, etwas sagen. 708 00:31:24,712 --> 00:31:26,420 Dann bekomme ich einen String und ich es in s gespeichert. 709 00:31:26,420 --> 00:31:29,810 Dann ich überprüfen, wenn s gleich ist gleich NULL, nur 1 zurückzukehren. 710 00:31:29,810 --> 00:31:31,590 So ist dies nur Standard-Fehlerprüfung. 711 00:31:31,590 --> 00:31:33,112 Nichts Interessantes passiert ist. 712 00:31:33,112 --> 00:31:36,320 Und in der Tat, wenn wir uns des Fehlers zu befreien Prüfen, das sieht aus wie Woche 1 Code 713 00:31:36,320 --> 00:31:36,985 Im Moment. 714 00:31:36,985 --> 00:31:39,110 Aber ich habe damit begonnen, eine zu bekommen wenig besser darüber. 715 00:31:39,110 --> 00:31:43,340 >> Jetzt in Zeile 16, vor einer Woche, vielleicht sogar ein paar Tage oder Stunden, 716 00:31:43,340 --> 00:31:46,720 man könnte sagen, Linie 16 Erstellen einer Variable namens t 717 00:31:46,720 --> 00:31:48,219 und Kopieren s hinein. 718 00:31:48,219 --> 00:31:50,010 Und das ist ein perfekt angemessenen Lieferservice. 719 00:31:50,010 --> 00:31:51,560 Aber jetzt genauer. 720 00:31:51,560 --> 00:31:54,190 Was passiert in Zeile 16? 721 00:31:54,190 --> 00:31:56,170 Was wird immer kopiert von rechts nach links? 722 00:31:56,170 --> 00:31:56,669 Ja? 723 00:31:56,669 --> 00:31:58,490 ZIELGRUPPE: Ist t bekommen eine Adresse s? 724 00:31:58,490 --> 00:32:01,220 >> David J. MALAN: Genau, t wird immer die Adresse s. 725 00:32:01,220 --> 00:32:05,170 So, um nun klar sein, wenn ich gehe zurück zu diesem früheren Beispiel 726 00:32:05,170 --> 00:32:08,520 und ich ziehen die Sache, die ich eingetippt. 727 00:32:08,520 --> 00:32:11,640 Und was habe ich getippt in-- hier ist s, und hier, 728 00:32:11,640 --> 00:32:15,830 ist, was ich in irgendwo in getippten Speicher, Mama und dann ein Backslash 729 00:32:15,830 --> 00:32:17,840 0, die für mich gegeben hat. 730 00:32:17,840 --> 00:32:23,060 Was ich in hier gespeichert sind, zu erinnern, dies ist bei Position 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 das ist, was zur Zeit in s. 732 00:32:24,655 --> 00:32:29,220 Also, wenn auf der Leitung 16, sage ich mir eine weitere Variable t und speichern 733 00:32:29,220 --> 00:32:33,590 in auf den Wert von s, was wird hier abgelegt wird nicht mom 734 00:32:33,590 --> 00:32:35,480 sondern nur die Nummer 1. 735 00:32:35,480 --> 00:32:38,520 >> Also, wenn wir nach vorne schauen in diesem Programm Nun, was wird passieren? 736 00:32:38,520 --> 00:32:40,690 So bemerken, dass es mit dieser Funktion könnte 737 00:32:40,690 --> 00:32:44,410 haben dies vor einiger Zeit für Caesar verwendet, oder Vigenere, oder vielleicht gar nicht. 738 00:32:44,410 --> 00:32:48,170 Ich behaupte mit meiner printf, bin ich gehen, um die Kopie t Kapital zu schlagen. 739 00:32:48,170 --> 00:32:51,616 Erste in der Reihe 19, Schnell sanity zu überprüfen, strlen Kontrollen der Länge t. 740 00:32:51,616 --> 00:32:53,740 Weil ich nicht möchte versuchen, etwas zu nutzen 741 00:32:53,740 --> 00:32:55,104 wenn es keinen String gibt. 742 00:32:55,104 --> 00:32:57,520 Wenn der Benutzer einfach Enter drücken, es gibt nichts zu profitieren. 743 00:32:57,520 --> 00:33:01,100 Also ich möchte nicht, um die Leitung 21 zu tun. 744 00:33:01,100 --> 00:33:05,758 So Leitung 21 Kapitalisierung welcher Buchstabe, offenbar, in t? 745 00:33:05,758 --> 00:33:06,514 >> ZIELGRUPPE: m? 746 00:33:06,514 --> 00:33:08,722 David J. MALAN: Es sieht aus wie es Kopier welche? 747 00:33:08,722 --> 00:33:09,486 ZIELGRUPPE: m. 748 00:33:09,486 --> 00:33:10,450 David J. MALAN: Äh, m. 749 00:33:10,450 --> 00:33:12,685 OK, so dass die erste m, weil Ankündigung, dass ich 750 00:33:12,685 --> 00:33:14,935 vorbei an ToUpper, die wenn Sie noch nie gesehen, es ist 751 00:33:14,935 --> 00:33:16,980 nur eine Funktion an Kapital als seine Eingabe. 752 00:33:16,980 --> 00:33:20,240 t Halterung Null bedeutet geben mir die Null-Charakter t. 753 00:33:20,240 --> 00:33:22,550 Und so wie funktioniert das Bildwechsel, klar zu sein? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Was muss umgeschrieben oder umzuziehen in Bezug auf s und t und Mama 756 00:33:29,160 --> 00:33:30,097 Backslash Null. 757 00:33:30,097 --> 00:33:31,470 >> ZIELGRUPPE: [unverständlich] 758 00:33:31,470 --> 00:33:34,030 >> David J. MALAN: Ja, so diese hier einfach 759 00:33:34,030 --> 00:33:40,860 muss geändert zu-- beheben this-- erhalten muss auf eine Kapital m umziehen. 760 00:33:40,860 --> 00:33:44,330 Aber jetzt, später aussehen in der Programm, wenn ich drucken 761 00:33:44,330 --> 00:33:49,800 s und t wie reinige ich hier, schau, was ist passieren Ausdrucken von s und t. 762 00:33:49,800 --> 00:33:54,310 So stellen Sie copy-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Lassen Sie mich gehen Sie vor und geben Sie im mom nur aus Kleinbuchstaben. 764 00:33:57,140 --> 00:34:00,140 Beachten Sie, sowohl die ursprüngliche und die Kopie aktiviert wurden. 765 00:34:00,140 --> 00:34:00,850 Warum? 766 00:34:00,850 --> 00:34:04,431 Nun, s und t beide zeigte auf, wenn man so will, das gleiche Teil des Speichers. 767 00:34:04,431 --> 00:34:06,930 Und ehrlich gesagt, das ist immer wirklich uninteresting-- die Tatsache, 768 00:34:06,930 --> 00:34:09,150 dass wir mit der Adresse Null hier. 769 00:34:09,150 --> 00:34:11,719 Ich meine, ich weiß nicht wirklich, wo Zeug ist in Erinnerung. 770 00:34:11,719 --> 00:34:13,550 Sorry, ich bin das Löschen ein wenig zu viel. 771 00:34:13,550 --> 00:34:15,674 Aber ich weiß nicht wirklich, wo die Dinge sind im Speicher. 772 00:34:15,674 --> 00:34:18,510 Und so, in der Tat, was Programmierer neigen dazu, zu denken, 773 00:34:18,510 --> 00:34:21,080 ist, dass, wenn Sie reden eine Adresse oder einen Zeiger, 774 00:34:21,080 --> 00:34:22,679 wer sich interessiert, wo es im Speicher ist. 775 00:34:22,679 --> 00:34:24,989 Es ist mir egal, ob es an Byte eines oder eine Milliarde. 776 00:34:24,989 --> 00:34:27,920 Ich kümmere mich nur, dass diese Variable ist effektiv 777 00:34:27,920 --> 00:34:29,620 zeigt auf diesem Teil des Speichers. 778 00:34:29,620 --> 00:34:33,350 Und so, von nun an, anstatt kleinlich über beliebige Speicheradressen, lassen Sie uns 779 00:34:33,350 --> 00:34:36,710 starten Sie einfach den Zeiger ziehen als Zeiger als Pfeile. 780 00:34:36,710 --> 00:34:39,340 Also, was s und t wirklich sind, Nach diesem Programm, 781 00:34:39,340 --> 00:34:42,130 weil, wie ich geschaffen t, es ist nur zwei Variablen 782 00:34:42,130 --> 00:34:43,840 zeigt auf dem gleichen Teil des Speichers. 783 00:34:43,840 --> 00:34:45,215 Und wir kümmern uns nicht, wo sie sind. 784 00:34:45,215 --> 00:34:47,130 So können wir abstrahieren diesem Detail. 785 00:34:47,130 --> 00:34:48,780 >> So wie ich das beheben? 786 00:34:48,780 --> 00:34:54,120 Wenn ich eine Version der Kopie zu schreiben Programm, das tatsächlich kopiert die Zeichenfolge 787 00:34:54,120 --> 00:34:56,840 und nutzt nur den Kopie, nur intuitiv, 788 00:34:56,840 --> 00:34:59,766 was muss doch eine sein Bestandteil, um unsere Lösung? 789 00:34:59,766 --> 00:35:00,640 ZIELGRUPPE: [unverständlich] 790 00:35:00,640 --> 00:35:01,420 David J. MALAN: Wir brauchen ein was? 791 00:35:01,420 --> 00:35:01,820 ZIELGRUPPE: Klumpen des Speichers. 792 00:35:01,820 --> 00:35:03,280 David J. MALAN: Wir brauchen ein anderer Teil des Speichers, nicht wahr? 793 00:35:03,280 --> 00:35:05,360 Wir wissen nicht, wie man tun es noch, unbedingt. 794 00:35:05,360 --> 00:35:11,330 Aber ich irgendwie müssen dies so geschehen, dass die ursprüngliche Mutter in Kleinbuchstaben 795 00:35:11,330 --> 00:35:14,170 landet in den extra Teil des Speichers. 796 00:35:14,170 --> 00:35:19,770 Und als ich dann die Kopie ändern, ich wollen nicht diese Kopie ändern. 797 00:35:19,770 --> 00:35:26,020 I statt, um nur diese zu ändern Kopie, so dass das Original unverändert. 798 00:35:26,020 --> 00:35:27,980 >> Also, lassen Sie uns sehen, wie wir das tun. 799 00:35:27,980 --> 00:35:31,800 In copy-1, die bereits wurde der Kommentar abgestreift, 800 00:35:31,800 --> 00:35:33,250 aber Online kommentierte. 801 00:35:33,250 --> 00:35:36,710 Wir stattdessen tun die following-- diese Linien identisch sind, hol mir einen String 802 00:35:36,710 --> 00:35:38,340 und nennen es s. 803 00:35:38,340 --> 00:35:43,500 Aber jetzt einen Blick auf eines unserer lassen komplex, aber der letzte der Komplexität 804 00:35:43,500 --> 00:35:47,340 für eine Weile, Zeile 16 macht genau dieses. 805 00:35:47,340 --> 00:35:49,400 Also, wenn Ihr bequem mit der Bild, das wir gerade drew-- 806 00:35:49,400 --> 00:35:51,790 gib mir einen neuen Teil des Speichers, kopieren alles hinein, 807 00:35:51,790 --> 00:35:53,730 mal sehen, wie wir übersetzen, dass, um Code. 808 00:35:53,730 --> 00:35:59,400 >> So Leitung 16, auf der linken Seite, char * t gibt mir diese Box auf hier. 809 00:35:59,400 --> 00:36:00,230 Das ist alles, es tut. 810 00:36:00,230 --> 00:36:03,240 Auf der rechten Seite, m alloc oder malloc, 811 00:36:03,240 --> 00:36:06,480 ist die Speicherzuweisung, super schickes, eine kryptische Art, nur sagen, 812 00:36:06,480 --> 00:36:07,640 geben Sie mir einen Teil des Speichers. 813 00:36:07,640 --> 00:36:09,290 Wie viel Speicher brauchen wir? 814 00:36:09,290 --> 00:36:10,910 Nun, das ist eine Art große Ausdruck. 815 00:36:10,910 --> 00:36:12,570 Aber mal sehen, was es sagt hier. 816 00:36:12,570 --> 00:36:15,940 Also das, natürlich, zu geben mir die Stringlänge von s. 817 00:36:15,940 --> 00:36:19,094 Also, Mama sollte es was? 818 00:36:19,094 --> 00:36:21,010 Also nur drei, oder? Mama ist drei Zeichen. 819 00:36:21,010 --> 00:36:22,830 Sie zählen nicht die Backslash Null, wenn Sie 820 00:36:22,830 --> 00:36:25,960 sprechen über die Länge eines Strings ist es eigentlich die menschliche sichtbaren Buchstaben. 821 00:36:25,960 --> 00:36:28,020 So Mama, so gibt mir 3. 822 00:36:28,020 --> 00:36:31,170 Aber warten Sie eine Minute, ich bin jetzt Zugabe von 1. 823 00:36:31,170 --> 00:36:34,861 Warum muss ich eigentlich zu wollen, zuzuweisen 4 Bytes und nicht nur 3? 824 00:36:34,861 --> 00:36:35,360 Ja? 825 00:36:35,360 --> 00:36:36,910 >> Gruppe: für die Sentinel-Wert? 826 00:36:36,910 --> 00:36:38,951 >> David J. MALAN: Genau, für die Sentinel-Wert. 827 00:36:38,951 --> 00:36:40,840 Für den umgekehrten Schrägstrich Null, Ich muss 4 Byte insgesamt. 828 00:36:40,840 --> 00:36:42,870 Also muss ich die Länge der Schnur plus 1. 829 00:36:42,870 --> 00:36:45,400 Und dann nur für eine gute measure-- obwohl in diesem System, 830 00:36:45,400 --> 00:36:49,390 es immer sein wird 1-- ich sage, multiplizieren Sie diese mit der Größe eines char. 831 00:36:49,390 --> 00:36:51,552 Stellt sich heraus, sizeof ist ein Operator in C, dass 832 00:36:51,552 --> 00:36:53,260 nur sagt Ihnen, die Anzahl von Bytes, ist 833 00:36:53,260 --> 00:36:54,700 für einen bestimmten Datentyp benötigt. 834 00:36:54,700 --> 00:36:57,740 Es ist nicht für Arrays arbeiten, Typischerweise manchmal tut. 835 00:36:57,740 --> 00:36:59,210 Aber im allgemeinen Fall, Nr. 836 00:36:59,210 --> 00:37:02,330 Aber es wird mir sagen, wie viele Bytes ein char ist, die entpuppt sich immer 1. 837 00:37:02,330 --> 00:37:04,080 Das ist also, wie Multiplikation mit 1. 838 00:37:04,080 --> 00:37:05,900 >> So super kryptischen suchen Codezeile. 839 00:37:05,900 --> 00:37:09,320 Aber alles, was sie tut ist verleiht mich ein Teil des Speichers. 840 00:37:09,320 --> 00:37:13,590 Aber ist es zu sein scheinen kopiert alles in diesem Speicher? 841 00:37:13,590 --> 00:37:14,560 Noch nicht. 842 00:37:14,560 --> 00:37:22,040 Und so was muss ich auf der Leitung 22 und 23, 24, 25, gut, habe ich einfach tun. 843 00:37:22,040 --> 00:37:23,760 Und das ist eine Art alte Schulsachen bekommen. 844 00:37:23,760 --> 00:37:26,010 Dies ist wie PSet 2, wobei Dazu zählt die Mitnahme Dinge sind 845 00:37:26,010 --> 00:37:28,620 rund im Speicher, oder besser gesagt in Zeichenfolgen. 846 00:37:28,620 --> 00:37:31,920 >> Also ich bin Iteration von 0 bis die Länge der Zeichenfolge s. 847 00:37:31,920 --> 00:37:37,820 Und ich bin das Kopieren der i-te Zeichen in s in das i-te Zeichen in t. 848 00:37:37,820 --> 00:37:41,820 Und weil ich, der Programmierer, machte Achten Sie darauf, genau so, wie viele Bytes zuzuweisen 849 00:37:41,820 --> 00:37:44,600 wie ich brauche, ist es perfekt Eins-zu-Eins-Beziehung. 850 00:37:44,600 --> 00:37:47,060 Und ich kopieren mom in Kleinbuchstaben in die neue. 851 00:37:47,060 --> 00:37:50,170 Und dann schließlich ich diese Zeile. 852 00:37:50,170 --> 00:37:54,637 Und so ist der Effekt nur um dieses t nutzen Sie hier. 853 00:37:54,637 --> 00:37:56,470 So viel zu absorbieren, aber wenn Sie gerade betrachten 854 00:37:56,470 --> 00:37:58,220 was wirklich los ist auf unter der Haube 855 00:37:58,220 --> 00:38:00,880 befindet sich nur bewegen diese Bytes um, alles, 856 00:38:00,880 --> 00:38:06,617 wird benötigt, um dieses Problem zu lösen, nur, um uns diesen Teil des Speichers. 857 00:38:06,617 --> 00:38:08,450 Jetzt auf die Gefahr hin überwältigend, lassen Sie mich 858 00:38:08,450 --> 00:38:13,200 einem anderen Beispiel, das ist fast identisch ist, mit Ausnahme dieses einen 859 00:38:13,200 --> 00:38:14,350 Codezeile. 860 00:38:14,350 --> 00:38:18,870 Das ist also der Hacker-Version dieses Programms, wenn man so will. 861 00:38:18,870 --> 00:38:21,050 Aber lasst uns einfach zu destillieren es in das, was vor sich geht. 862 00:38:21,050 --> 00:38:28,920 Zeile 24 verwendet, um dieses t sein Halterung i erhält s Halterung i. 863 00:38:28,920 --> 00:38:33,370 Jetzt bin ich der Veränderung dieser zu die viel mehr kryptische Sterne t 864 00:38:33,370 --> 00:38:36,280 plus 1 entspricht-Sterne-s plus 1. 865 00:38:36,280 --> 00:38:38,702 >> Also, was passiert und warum haben wir einen Stern Charakter? 866 00:38:38,702 --> 00:38:41,410 Wir haben den Stern gesehen und es verwendet wird hier anders. 867 00:38:41,410 --> 00:38:45,490 Wir haben vorher gesehen char *, jetzt bin ich zu sehen, ein zu Beginn Star, und das ist OK. 868 00:38:45,490 --> 00:38:48,190 Denn es stellt sich heraus, wir kann Art von nur folgern, 869 00:38:48,190 --> 00:38:50,280 von jenen ersten Prinzipien, was los ist. 870 00:38:50,280 --> 00:38:53,860 Also nur klar zu sein, was ist s? 871 00:38:53,860 --> 00:38:55,052 Letzte Woche war es ein String. 872 00:38:55,052 --> 00:38:56,260 Das funktioniert nicht mehr ausreichen. 873 00:38:56,260 --> 00:38:57,690 Was ist s, speziell? 874 00:38:57,690 --> 00:38:58,590 >> ZIELGRUPPE: [unverständlich] 875 00:38:58,590 --> 00:38:59,881 >> David J. MALAN: Es ist ein Zeiger. 876 00:38:59,881 --> 00:39:02,610 Es ist die Adresse des erste Zeichen eingegeben haben wir in. 877 00:39:02,610 --> 00:39:04,780 OK, was ist t? 878 00:39:04,780 --> 00:39:05,660 >> ZIELGRUPPE: [unverständlich] 879 00:39:05,660 --> 00:39:07,950 >> David J. MALAN: Die Adresse des ersten Bytes 880 00:39:07,950 --> 00:39:10,490 in t, dass Teil des Speichers neu zugeordnet. 881 00:39:10,490 --> 00:39:14,720 So stellt sich heraus, dass, wenn wir iterieren von 0 an bis zur Zeichenfolge 882 00:39:14,720 --> 00:39:17,424 length-- zuallererst i beginnt bei 0, weil 883 00:39:17,424 --> 00:39:18,840 dieser alten Schule für Schleife Sache. 884 00:39:18,840 --> 00:39:22,400 Also nur der Einfachheit halber, lassen Sie uns davon ausgehen, dass die erste Zeile des Codes 885 00:39:22,400 --> 00:39:23,760 ist wirklich nur diese, richtig. 886 00:39:23,760 --> 00:39:26,080 Wenn i gleich Null ist, indem Null etwas vermutlich 887 00:39:26,080 --> 00:39:27,540 wird nicht um einen Effekt zu haben. 888 00:39:27,540 --> 00:39:28,560 >> Also, was ist dieses Sprichwort? 889 00:39:28,560 --> 00:39:31,600 Es stellt sich heraus, dass die Sterne Betreiber in diesem Kontext 890 00:39:31,600 --> 00:39:33,700 ist die Dereferenzierung Betreiber, die gerade ist 891 00:39:33,700 --> 00:39:37,530 eine andere Art zu sagen gehen an folgende Adresse. 892 00:39:37,530 --> 00:39:42,080 So dass, wenn s die Adresse des ersten Zeichen in diesem Teil des Speichers, 893 00:39:42,080 --> 00:39:43,630 * s Mittel gehen dorthin. 894 00:39:43,630 --> 00:39:45,630 Und weil wir gezeichnet haben das Bild auf diese Weise, 895 00:39:45,630 --> 00:39:47,430 Sie können die anzunehmen Folgende mentales Modell. 896 00:39:47,430 --> 00:39:51,030 Wenn dies s, und Sie sagen, * s * s eine Art, wie Rutschen und Leitern, 897 00:39:51,030 --> 00:39:54,540 wenn Sie sich erinnern, das Spiel aus der Kindheit, ist wie folgen diesem Pfeil und gehen 898 00:39:54,540 --> 00:39:55,570 an die Adresse. 899 00:39:55,570 --> 00:39:57,080 >> * t ist die gleiche. 900 00:39:57,080 --> 00:39:59,855 So starten Sie hier, gehen Sie zu ihrem Stück. 901 00:39:59,855 --> 00:40:03,350 Ich kann nicht einfach zurückgreifen dieser Bildschirm auf diese Weise. 902 00:40:03,350 --> 00:40:05,560 * t bedeutet, hier zu gehen. 903 00:40:05,560 --> 00:40:08,830 Und dann ist die for-Schleife nur sagen, bewegen diese Figur hier, 904 00:40:08,830 --> 00:40:11,330 bewegen diese Figur hier, bewegen Sie dieses Zeichen hier. 905 00:40:11,330 --> 00:40:12,890 Aber wie kann ich diese Inkrementierung tun? 906 00:40:12,890 --> 00:40:15,430 Ich muss rückgängig machen, was ich gerade gelöscht. 907 00:40:15,430 --> 00:40:18,140 Dies ist, was allgemein als Pointer-Arithmetik, die 908 00:40:18,140 --> 00:40:20,040 bedeutet Mathe mit Adressen. 909 00:40:20,040 --> 00:40:22,460 >> Wenn in diesem for-Schleife, Ich halte Inkrementieren i, 910 00:40:22,460 --> 00:40:26,880 und s ist eine Adresse, und t eine Adresse, wenn ich einfach weiter Zugabe von 1, 911 00:40:26,880 --> 00:40:31,406 das bedeutet nur, vorwärts sich zu bewegen, und nach vorn, und nach vorn in den Speicher. 912 00:40:31,406 --> 00:40:34,030 Es ist wie Oxford Street, die Straße, die die CS-Gebäude befindet sich auf. 913 00:40:34,030 --> 00:40:36,490 Die CS Gebäude ist auf 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Also, wenn Sie zu tun, 33 waren Oxford Street plus 1, 915 00:40:39,870 --> 00:40:42,870 das bringt Sie 34 Oxford Street, dann 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 dann 36 Oxford Street, was diejenigen, Gebäude wirklich sind - sofern sie existieren. 917 00:40:46,380 --> 00:40:50,540 Und so, das ist alles wir tun hier mit Zeigerarithmetik. 918 00:40:50,540 --> 00:40:53,820 >> Also ist es ein super obskure Weise Ausdrucks uns. 919 00:40:53,820 --> 00:40:56,160 Aber alles, was passiert, unter der Haube 920 00:40:56,160 --> 00:40:59,330 Nur die folgenden Adressen, wie nach einer Karte, wenn man so will, 921 00:40:59,330 --> 00:41:02,692 oder im Anschluss an die Pfeile, wie wir auf dem Bildschirm gezeichnet habe. 922 00:41:02,692 --> 00:41:04,910 OK, eine Menge zu verdauen. 923 00:41:04,910 --> 00:41:10,410 Jede Frage zur Syntax, Konzepte, Zeiger malloc oder dergleichen. 924 00:41:10,410 --> 00:41:11,480 Ja, hier zuerst. 925 00:41:11,480 --> 00:41:13,755 >> Publikum: So, wo das sagt * t gleich toupper * t, 926 00:41:13,755 --> 00:41:15,575 ist, dass gehen, um zu profitieren alle Buchstaben oder just-- 927 00:41:15,575 --> 00:41:17,283 >> David J. MALAN: Ah, wirklich gute Frage. 928 00:41:17,283 --> 00:41:19,805 So in dieser Linie hier, 31, das wird zu profitieren 929 00:41:19,805 --> 00:41:21,430 der erste Buchstabe oder die Gesamtheit der Briefe. 930 00:41:21,430 --> 00:41:23,460 Lassen Sie uns also antworten, dass, indem Sie zurück zur ersten Prinzipien. 931 00:41:23,460 --> 00:41:26,168 Und ersten Prinzipien hier meine ich nur auf die grundlegenden Definitionen gehen 932 00:41:26,168 --> 00:41:27,000 von dem, was beteiligt. 933 00:41:27,000 --> 00:41:29,770 So toupper ist eine Funktion, dass nutzt eine char. 934 00:41:29,770 --> 00:41:30,530 Das ist alles. 935 00:41:30,530 --> 00:41:36,740 * t bedeutet, gehen Sie zum first-- rufen Sie die Adresse in t. 936 00:41:36,740 --> 00:41:40,350 Also, in dem Bild, ob dies der Klumpen Speicher wir zugeteilt mit malloc, 937 00:41:40,350 --> 00:41:43,310 und das ist t, * t bedeutet, gehen Sie hier. 938 00:41:43,310 --> 00:41:46,710 >> Unterdessen übergeben Sie dieser Wert, Kleinbuchstaben m 939 00:41:46,710 --> 00:41:50,040 um toupper, Sie wieder einlassen Hauptstadt M, wo willst du es setzen? 940 00:41:50,040 --> 00:41:52,410 Sie setzen es in der gleichen Lage. 941 00:41:52,410 --> 00:41:55,540 Und so von dieser Logik derer, grundlegenden Definitionen ist es nur 942 00:41:55,540 --> 00:41:58,792 Großbuchstaben beginn wenn Sie mit i oder ein laufen 943 00:41:58,792 --> 00:42:02,000 for-Schleife oder einer while-Schleife, wird es nicht nichts mehr, als Sie fragen zu tun. 944 00:42:02,000 --> 00:42:02,583 Gute Frage. 945 00:42:02,583 --> 00:42:03,237 Ja? 946 00:42:03,237 --> 00:42:05,369 >> Publikum: Warum haben Sie die dereferenzieren Methode, anstatt 947 00:42:05,369 --> 00:42:05,979 das Array? 948 00:42:05,979 --> 00:42:07,395 >> David J. MALAN: Ah, gute Frage. 949 00:42:07,395 --> 00:42:10,672 Warum würden Sie das dereferenzieren verwenden Methode anstelle der Array-Verfahren? 950 00:42:10,672 --> 00:42:12,130 Keinen besonderen Grund, um ehrlich zu sein. 951 00:42:12,130 --> 00:42:15,290 Und in der Tat dafür Art beispielsweise, rechts, 952 00:42:15,290 --> 00:42:17,556 Ich bin einfach nur dem Argument macht die Programm komplizierter, 953 00:42:17,556 --> 00:42:19,680 mehr Augen über Verglasung, Menschen bist gerade 954 00:42:19,680 --> 00:42:22,830 denn dies sieht super obskuren, aber obwohl es das gleiche tun. 955 00:42:22,830 --> 00:42:26,695 Und so, ehrlich gesagt, ist dies ein unnötigerweise visuell komplexe Lösung 956 00:42:26,695 --> 00:42:27,320 für das Problem. 957 00:42:27,320 --> 00:42:29,580 >> Es ist immer noch ein gutes Design, fünf von fünf für den Entwurf, 958 00:42:29,580 --> 00:42:33,140 ob es in der Halterung Notation oder die Zeigernotation. 959 00:42:33,140 --> 00:42:36,299 Aber-- vor allem, wenn wir bekommen im späteren Verlauf in PSet 5 960 00:42:36,299 --> 00:42:39,340 wenn wir realisieren, dass Wörterbuch, Ich habe ein paar times-- erwähnt 961 00:42:39,340 --> 00:42:42,300 wir werden tatsächlich über die Pflege geringe Speicheradressen 962 00:42:42,300 --> 00:42:44,140 dass wir wirklich verstehen, Was ist los. 963 00:42:44,140 --> 00:42:48,300 >> Aber für jetzt, stellt sich heraus, dass dies Codezeile hier eckigen Klammern 964 00:42:48,300 --> 00:42:49,900 nicht wirklich existieren. 965 00:42:49,900 --> 00:42:52,230 Sie sind, was heißt syntaktischer Zucker, die 966 00:42:52,230 --> 00:42:58,390 ist nur eine unheimlich coole Art zu sagen, die Compiler wandelt eckigen Klammern zu sein 967 00:42:58,390 --> 00:43:00,420 dass mathematischen Ausdruck. 968 00:43:00,420 --> 00:43:02,660 Also ist es eine menschliche Konvention in der Lage, einfach zu schreiben 969 00:43:02,660 --> 00:43:04,220 diese sehr benutzerfreundlich Klammern. 970 00:43:04,220 --> 00:43:06,850 Aber was ist der Compiler, Klang, ist wirklich keine Zeit zu tun 971 00:43:06,850 --> 00:43:10,970 Sie schreiben, was in Zeile markiert 24, unter der Haube ist es wirklich 972 00:43:10,970 --> 00:43:12,330 Umwandlung in diese. 973 00:43:12,330 --> 00:43:16,200 Es ist einfach angenehmer als Mensch lesen und schreiben Code wie Linie 24. 974 00:43:16,200 --> 00:43:18,530 Aber schließlich diejenigen, Stützräder zu kommen off 975 00:43:18,530 --> 00:43:21,780 wenn das eigene Komfort wird stärker. 976 00:43:21,780 --> 00:43:27,240 >> In Ordnung, so erinnern, dann, dass diese war die Art von größte Problem 977 00:43:27,240 --> 00:43:27,807 stießen wir auf. 978 00:43:27,807 --> 00:43:30,640 Und das ist, was löste die ganze verdammt Gespräch über Zeiger, 979 00:43:30,640 --> 00:43:32,340 und Adressen und Kopieren Dinge. 980 00:43:32,340 --> 00:43:35,410 Es war, weil wir darüber stolpern Diese dummen, dummen Frage, wobei 981 00:43:35,410 --> 00:43:38,830 I umgesetzt logically-- mit Lauren hier oben auf der Demo und der Orangensaft 982 00:43:38,830 --> 00:43:43,770 im milk-- ein perfekt algorithmisch einwandfreie Funktion 983 00:43:43,770 --> 00:43:47,010 für den Austausch von zwei Variablen ' Werte, aber das verdammte Ding 984 00:43:47,010 --> 00:43:50,550 hatten keine anhaltenden oder permanent, Wirkung auf mein Code. 985 00:43:50,550 --> 00:43:51,820 >> Und warum war das? 986 00:43:51,820 --> 00:43:54,650 Auf den Punkt gebracht, warum ist das Umsetzung der Swap- 987 00:43:54,650 --> 00:43:58,740 logisch korrekt, aber hat keinen Einfluss auf die Variablen, die ihr übergeben werden, 988 00:43:58,740 --> 00:44:01,119 wie x und y für die wichtigsten? 989 00:44:01,119 --> 00:44:02,410 Was war der Kern des Problems? 990 00:44:02,410 --> 00:44:02,909 Ja? 991 00:44:02,909 --> 00:44:05,532 Publikum: Da variabel gemacht Kopien der Variablen in dem Durchgang 992 00:44:05,532 --> 00:44:06,240 Through-Funktion. 993 00:44:06,240 --> 00:44:09,060 >> David J. MALAN: Genau, wenn Sie vorbei Variablen in einer Funktion oder Argumente 994 00:44:09,060 --> 00:44:11,030 in eine Funktion, sie sind kopieren, übergeben die 995 00:44:11,030 --> 00:44:14,770 bedeutet, dass Sie eine identische suchen zu erhalten Muster von Bits für x und y, 996 00:44:14,770 --> 00:44:15,955 hier als a und b. 997 00:44:15,955 --> 00:44:18,080 Und Sie können alles tun, Sie wollen mit dieser Kopien, 998 00:44:18,080 --> 00:44:20,657 aber sie gehen nicht zu haben, Wirkung auf die aufrufende Funktion. 999 00:44:20,657 --> 00:44:22,990 Und in der Tat, erstellten wir, dass Bild auf dem Bildschirm, Rückruf 1000 00:44:22,990 --> 00:44:25,520 letzten Mal, wobei, wenn Sie wirklich über das, was denken 1001 00:44:25,520 --> 00:44:28,570 geht unter dem hood-- wenn dies ist den Arbeitsspeicher Ihres Computers, 1002 00:44:28,570 --> 00:44:31,650 und ab hier ist der Brocken Speicher, die für Haupt verwendet, 1003 00:44:31,650 --> 00:44:34,020 dies ist die Batzen Speicher wird für Swap benutzt, 1004 00:44:34,020 --> 00:44:37,090 und so, auch wenn Haupt hat zwei Variablen x und y, 1005 00:44:37,090 --> 00:44:41,840 Swap haben könnten identische suchen Werte, die beide 1 und 2, 1006 00:44:41,840 --> 00:44:44,520 aber sie sind komplett verschiedene Stücke von Speicher. 1007 00:44:44,520 --> 00:44:46,130 >> Also brauchen wir eine Lösung für dieses. 1008 00:44:46,130 --> 00:44:51,580 Und ehrlich gesagt, ist es, dass wir jetzt den Anschein, haben eine Lösung für dieses Problem, rechts. 1009 00:44:51,580 --> 00:44:55,760 Wenn wir nun die Möglichkeit haben, Dinge zu manipulieren haft Adressen 1010 00:44:55,760 --> 00:44:59,310 und Art von Rutschen und Leitern Stil folgendermaßen Pfeile 1011 00:44:59,310 --> 00:45:02,820 und gehen überall wir wollen im Gedächtnis, konnte nicht wir 1012 00:45:02,820 --> 00:45:06,220 dieses Problem dadurch zu lösen, Übergang von Haupt zu tauschen 1013 00:45:06,220 --> 00:45:09,650 nicht die Werte wollen wir Swap, sondern nur intuitiv 1014 00:45:09,650 --> 00:45:11,630 was könnte passieren wir, anstatt zu tauschen? 1015 00:45:11,630 --> 00:45:12,620 >> [Zwischen Stimmen] 1016 00:45:12,620 --> 00:45:15,244 >> David J. MALAN: Warum wir nicht einfach übergeben Sie die Adressen, richtig? 1017 00:45:15,244 --> 00:45:17,470 Warum geben Sie nicht uns Swap ein Schatzkarte, wenn man so will, 1018 00:45:17,470 --> 00:45:20,950 , dass es führt zu der Ist-Werte x und y. 1019 00:45:20,950 --> 00:45:24,340 Lassen Sie uns tauschen, tatsächlich ändern jene ursprünglichen Bits, anstatt 1020 00:45:24,340 --> 00:45:26,797 nur auf der Durch Kopien der Bits. 1021 00:45:26,797 --> 00:45:29,130 Und so, in der Tat, das ist, was ist gehen, um die Lösung sein. 1022 00:45:29,130 --> 00:45:31,899 Diese Version finden Sie hier eindeutig schlecht und fehlerhaft. 1023 00:45:31,899 --> 00:45:35,190 Und nun, auf den ersten Blick, es sieht einfach wie wir soeben einen Haufen von Sternen nach dem Zufallsprinzip 1024 00:45:35,190 --> 00:45:37,106 und überquerte den Fingern dass es zu kompilieren. 1025 00:45:37,106 --> 00:45:38,460 Aber wäre es jetzt zu kompilieren. 1026 00:45:38,460 --> 00:45:40,090 >> Aber mal sehen, was das ist. 1027 00:45:40,090 --> 00:45:43,990 Und leider die Autoren C könnte ein anderes Symbol gewählt haben, 1028 00:45:43,990 --> 00:45:46,380 um diese ein wenig zu machen klarer, aber die Sterne Betreiber 1029 00:45:46,380 --> 00:45:48,610 hat andere Bedeutung in zwei unterschiedlichen Kontexten. 1030 00:45:48,610 --> 00:45:50,890 Und wir beide gesehen haben, aber wir unterscheiden. 1031 00:45:50,890 --> 00:45:55,310 >> So an der Spitze gibt, wenn ich a und b verändert 1032 00:45:55,310 --> 00:46:00,470 andere als int in der schlechten Version auf int Sterne, a und b, 1033 00:46:00,470 --> 00:46:01,740 Zuvor wurden ganze Zahlen. 1034 00:46:01,740 --> 00:46:05,752 Was sind A und B nun in die gute, grüne Version? 1035 00:46:05,752 --> 00:46:06,900 Sie sind Adressen. 1036 00:46:06,900 --> 00:46:09,610 Adressen von dem, was, klar zu sein? 1037 00:46:09,610 --> 00:46:10,770 Adressen von ganzen Zahlen. 1038 00:46:10,770 --> 00:46:12,520 Also die Tatsache, dass ich sagen int Sterne Mittel 1039 00:46:12,520 --> 00:46:15,440 Dies ist die Adresse des eine ganze Zahl, nämlich. 1040 00:46:15,440 --> 00:46:19,120 >> So, jetzt feststellen, in den Code-Zeilen, etwas hat sich verändert. 1041 00:46:19,120 --> 00:46:22,770 tmp gleich bleibt, weil es ist nur die vorübergehende ganze Zahl ist, 1042 00:46:22,770 --> 00:46:24,110 kein Memory-Magie gibt. 1043 00:46:24,110 --> 00:46:26,370 Aber eine muss nun einen Stern. 1044 00:46:26,370 --> 00:46:28,560 Und, in der Tat, jedes weitere Erwähnung von a und b, 1045 00:46:28,560 --> 00:46:31,780 feststellen, dass alles, was von rot nach grün 1046 00:46:31,780 --> 00:46:34,209 ist, dass ich voranstellen diese Variablen mit Sternen. 1047 00:46:34,209 --> 00:46:35,750 Weil ich möchte nicht a und b zu kopieren. 1048 00:46:35,750 --> 00:46:40,350 Denn wenn ich kopieren Sie einfach a und b und Swap- a und b, was mache ich eigentlich Swapping? 1049 00:46:40,350 --> 00:46:43,760 Nur Adressen, möchte ich tauschen Was ist an diesen Adressen. 1050 00:46:43,760 --> 00:46:44,860 Ich will dahin. 1051 00:46:44,860 --> 00:46:48,000 Und so ist die Sternoperator Innenseite meiner Funktion 1052 00:46:48,000 --> 00:46:51,700 nicht in der Parameterliste, bedeutet, dass Sie an diese Adressen zu gehen 1053 00:46:51,700 --> 00:46:54,490 und tatsächlich, diese Werte zu ändern. 1054 00:46:54,490 --> 00:46:56,500 >> Was bedeutet das Bild Jetzt aussehen statt. 1055 00:46:56,500 --> 00:47:03,250 Nun, wenn ich anstatt vorbei in A und B nicht gleich 1 und 2-- 1056 00:47:03,250 --> 00:47:05,790 Ich wirklich brauchen, um hinzuzufügen, eine weitere Definition hier. 1057 00:47:05,790 --> 00:47:09,030 So nehme an, dass dieses Stück der Speicher ist an der Stelle 10. 1058 00:47:09,030 --> 00:47:12,960 >> Dies ist an der Stelle 11, jedoch diese ist ein bisschen wie eine Vereinfachung, 1059 00:47:12,960 --> 00:47:18,900 Ich habe jetzt zwei Möglichkeiten tun ich pass x und y oder übergeben ich ihre Adressen? 1060 00:47:18,900 --> 00:47:22,500 Wenn ich übergeben ihre Adressen wie diese, ich habe gerade 1061 00:47:22,500 --> 00:47:25,390 müssen nun umsetzen Swap pro grünen Code 1062 00:47:25,390 --> 00:47:29,080 so dass, wenn er sieht ein, und wenn es b sieht, ist es nicht einfach kopieren a und b 1063 00:47:29,080 --> 00:47:30,540 und bewegen Sie die Milch und Orangensaft. 1064 00:47:30,540 --> 00:47:32,664 Die Milch und Orangensaft Metapher bricht nun nach unten, 1065 00:47:32,664 --> 00:47:35,060 denn das sind Tassen von flüssigen und nicht die Karten. 1066 00:47:35,060 --> 00:47:37,750 Wir brauchen statt zu gehen bis 10, und wir adressieren 1067 00:47:37,750 --> 00:47:42,420 gehen müssen zur Adresse 11, und führen Sie diese Auslagerungslogik. 1068 00:47:42,420 --> 00:47:45,580 >> So ist die Logik die gleiche, aber wir brauchen eine etwas andere Weise 1069 00:47:45,580 --> 00:47:47,160 für den Zugriff auf diese Variablen. 1070 00:47:47,160 --> 00:47:52,400 Und so dass am Ende, was die Programm hat zu schauen, wie das ist. 1071 00:47:52,400 --> 00:47:56,610 In swap.c wörtlich kopiert und klebte die grüne Version. 1072 00:47:56,610 --> 00:47:58,450 Aber ich muss eine Änderung vorzunehmen. 1073 00:47:58,450 --> 00:48:00,180 Es reicht nicht, nur um Swap ändern. 1074 00:48:00,180 --> 00:48:03,830 Welche anderen Codezeile muss ich ändern? 1075 00:48:03,830 --> 00:48:04,330 Ja? 1076 00:48:04,330 --> 00:48:05,770 >> ZIELGRUPPE: Wo es die Argumente übernimmt. 1077 00:48:05,770 --> 00:48:07,603 >> David J. MALAN: Wo es nimmt ihr Argument. 1078 00:48:07,603 --> 00:48:09,985 Also, wenn ich nach oben zum Haupt, I können nicht nur in x und y übergeben, 1079 00:48:09,985 --> 00:48:12,820 und, das verspreche ich, die letzte Stück neue Syntax heute. 1080 00:48:12,820 --> 00:48:17,200 Ich brauche, um in nicht x passieren und y aber die Adresse von x und y. 1081 00:48:17,200 --> 00:48:20,400 Und es stellt sich heraus, das Symbol dass die Autoren der C gewählt 1082 00:48:20,400 --> 00:48:23,860 ist, wenn Sie ein kaufmännisches Und hier verwenden, um nicht zu mit dem bitweise Und-Zeichen verwechselt werden, 1083 00:48:23,860 --> 00:48:27,130 wenn Sie ein Und-Zeichen verwenden hier und ein kaufmännisches hier, 1084 00:48:27,130 --> 00:48:29,570 Dieses findet heraus für Sie, was ist die Adresse von x, 1085 00:48:29,570 --> 00:48:31,740 vielleicht ist es 10, was ist das Adresse y, vielleicht ist es 1086 00:48:31,740 --> 00:48:35,400 11, und leitet die im statt. 1087 00:48:35,400 --> 00:48:37,210 >> So viel auf einmal zu absorbieren. 1088 00:48:37,210 --> 00:48:40,190 Aber mal sehen nun schnell in unsere verbleibenden 4 Minuten 1089 00:48:40,190 --> 00:48:42,150 wo die Dinge schief gehen. 1090 00:48:42,150 --> 00:48:45,120 Und nebenbei, eigentlich Ich machte dieses Foto, 1091 00:48:45,120 --> 00:48:46,920 TF machte dieses Foto, ein oder zwei Jahren. 1092 00:48:46,920 --> 00:48:49,190 Das ist also der hinteren Ecke von Eliot Dining Hall. 1093 00:48:49,190 --> 00:48:52,310 Zeiger sind vielleicht die härteste Thema, das wir abdecken in CS50. 1094 00:48:52,310 --> 00:48:54,810 Also, wenn Sie die Art Sorgen der Hang ist wie vielleicht ist es 1095 00:48:54,810 --> 00:48:56,770 mehr von einem Hockeyschläger wie diese, zu realisieren 1096 00:48:56,770 --> 00:49:00,160 wir Art von kurz vor einem Gipfel in Bedingungen der konzeptionellen Komplexität. 1097 00:49:00,160 --> 00:49:02,300 >> Und ich bringen diese Foto, denn ich schwöre, 1098 00:49:02,300 --> 00:49:05,920 zu Gott, im Herbst 1996, als ich CS50 mit meiner Lehre Kerl, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, setzte er mich in die Ecke des Eliot D. Halle während des Mittagessens, 1100 00:49:09,620 --> 00:49:12,330 oder Abendessen, oder etwas zu versuchen mir zu helfen, Hinweise zu verstehen. 1101 00:49:12,330 --> 00:49:16,520 Und das ist, wo ich war Wochen nach es in der Vorlesung, wenn eingeführt wurde 1102 00:49:16,520 --> 00:49:18,170 Ich endlich verstanden, Zeiger. 1103 00:49:18,170 --> 00:49:20,590 Und ich bin zuversichtlich, dass diese wird viel früher für Sie klicken. 1104 00:49:20,590 --> 00:49:23,540 Aber weiß, das absolut zu die anspruchsvollere Themen 1105 00:49:23,540 --> 00:49:24,420 wir angeschaut habe. 1106 00:49:24,420 --> 00:49:25,819 Aber es ist zu den mächtigsten. 1107 00:49:25,819 --> 00:49:28,860 Und wenn Sie es erhalten, es ist wirklich alles, nur gehen, um endlich zusammen kommen. 1108 00:49:28,860 --> 00:49:31,460 Also seien Sie versichert, es funktioniert nicht müssen alle Körper mehr. 1109 00:49:31,460 --> 00:49:32,980 >> Also hier ist das letzte Programm wir gehen, zu betrachten. 1110 00:49:32,980 --> 00:49:35,605 Und wir werden mit einem Ende Schnell drei Minuten claymation 1111 00:49:35,605 --> 00:49:37,030 von unserem Freund, Nick Parlante gemacht. 1112 00:49:37,030 --> 00:49:41,440 Hier ist ein Programm, das auf der Oberseite zwei Leitungen deklariert eine Variable x und y. 1113 00:49:41,440 --> 00:49:44,780 Wobei beide Adressen von ganzen Zahlen, AKA Zeigern. 1114 00:49:44,780 --> 00:49:48,125 Wir haben dann zuzuteilen genug Speicher in einen int speichern 1115 00:49:48,125 --> 00:49:51,344 und speichern Sie die Adresse dieses Speichers in x. 1116 00:49:51,344 --> 00:49:53,260 Also, es ist sogar noch einfacher als das Beispiel zuvor. 1117 00:49:53,260 --> 00:49:56,100 Gebt mir vier Byte, das ist die Größe eines int, 1118 00:49:56,100 --> 00:49:58,000 und bringe diese Adresse in x. 1119 00:49:58,000 --> 00:50:01,070 Diese Linie bedeutet hier, rufen Sie die Adresse in x 1120 00:50:01,070 --> 00:50:05,270 und legte die Bedeutung von Leben, die Zahl 42 gibt. 1121 00:50:05,270 --> 00:50:07,710 Aber diese Linie macht mir Sorgen. 1122 00:50:07,710 --> 00:50:12,620 Sterne y bedeutet, rufen Sie die Adresse in y, und setzen Sie die Unglückszahl 13 da. 1123 00:50:12,620 --> 00:50:15,780 Warum ist es gefährlich, zu diesem Zeitpunkt in den story-- wenn auch schnell erzählt 1124 00:50:15,780 --> 00:50:17,980 in unserer schwind Minuten hier-- warum ist es schlecht 1125 00:50:17,980 --> 00:50:19,660 für mich zu sagen, an die Adresse in y gehen? 1126 00:50:19,660 --> 00:50:21,077 >> Publikum: Sie müssen nicht [unverständlich]. 1127 00:50:21,077 --> 00:50:22,910 David J. MALAN: Ich habe keine, setzen alles in y. 1128 00:50:22,910 --> 00:50:25,520 Also, was ist der Wert von y, an diesem Punkt in der Geschichte? 1129 00:50:25,520 --> 00:50:26,570 Wir haben keine Ahnung. 1130 00:50:26,570 --> 00:50:29,190 Es ist einige Müllwert und auch nicht Binky kennen. 1131 00:50:29,190 --> 00:50:32,532 Wenn wir auf dieser Note zu beenden. 1132 00:50:32,532 --> 00:50:34,832 >> [VIDEO PLAYBACK] 1133 00:50:34,832 --> 00:50:36,500 >> -Hey, Binky, wach auf. 1134 00:50:36,500 --> 00:50:39,140 Es ist Zeit für Zeiger Spaß. 1135 00:50:39,140 --> 00:50:40,210 >> -Was ist das? 1136 00:50:40,210 --> 00:50:41,690 Erfahren Sie mehr über Zeiger? 1137 00:50:41,690 --> 00:50:43,570 Oh, gute sachen. 1138 00:50:43,570 --> 00:50:46,600 >> Nun, um zu beginnen, ich denke, wir sind gehen, um ein paar Hinweise müssen. 1139 00:50:46,600 --> 00:50:47,380 >> -OK. 1140 00:50:47,380 --> 00:50:51,120 Dieser Code weist zwei Zeiger das kann auf ganze Zahlen zeigen. 1141 00:50:51,120 --> 00:50:53,557 >> -OK, Auch ich sehe die zwei Zeiger, aber sie 1142 00:50:53,557 --> 00:50:55,140 scheinen nicht zu sein, die auf nichts. 1143 00:50:55,140 --> 00:50:55,970 >> -Das ist richtig. 1144 00:50:55,970 --> 00:50:58,100 Zunächst Zeiger nicht auf nichts. 1145 00:50:58,100 --> 00:51:00,950 Die Dinge, die sie verweisen, sind genannt pointees und deren Einrichtung 1146 00:51:00,950 --> 00:51:02,330 ist ein getrennter Schritt. 1147 00:51:02,330 --> 00:51:03,210 >> Oh, richtig, richtig. 1148 00:51:03,210 --> 00:51:03,940 Ich wusste, dass. 1149 00:51:03,940 --> 00:51:05,730 Die pointees sind getrennt. 1150 00:51:05,730 --> 00:51:08,310 So wie Sie eine pointee zuzuweisen? 1151 00:51:08,310 --> 00:51:11,960 >> -OK, Auch dieser Code zuweist ein neues Integer pointee, 1152 00:51:11,960 --> 00:51:15,050 und dieser Teil Sätze x auf ihn verweisen. 1153 00:51:15,050 --> 00:51:16,240 >> -Hey, Dass besser aussieht. 1154 00:51:16,240 --> 00:51:17,743 So machen es etwas zu tun. 1155 00:51:17,743 --> 00:51:23,580 >> -OK, Ich werde den Zeiger dereferenzieren x zu speichern die Zahl 42 in seine pointee. 1156 00:51:23,580 --> 00:51:27,130 Für diesen Trick, ich brauche meine Zauberstab der Dereferenzierung. 1157 00:51:27,130 --> 00:51:30,200 >> -Ihre Zauberstab der Dereferenzierung? 1158 00:51:30,200 --> 00:51:32,310 Äh,, das ist großartig. 1159 00:51:32,310 --> 00:51:34,270 >> -Dies Ist, was der Code aussieht. 1160 00:51:34,270 --> 00:51:35,970 Ich werde einfach die Nummer eingestellt und-- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SOUND] 1162 00:51:37,070 --> 00:51:39,140 >> -Hey, Dort zu suchen geht. 1163 00:51:39,140 --> 00:51:43,980 Also, tun eine Dereferenzierung auf x folgt der Pfeil auf seine pointee zuzugreifen. 1164 00:51:43,980 --> 00:51:46,150 In diesem Fall auf 42 in dort zu speichern. 1165 00:51:46,150 --> 00:51:50,700 Hey, versuchen Sie es, um die Nummer zu speichern 13 durch die anderen Zeiger, y. 1166 00:51:50,700 --> 00:51:51,840 >> -OK. 1167 00:51:51,840 --> 00:51:56,270 Ich werde einfach gehen hier auf y, und nutzen Sie die Nummer 13 Einrichtung. 1168 00:51:56,270 --> 00:52:00,380 Und dann mit dem Zauberstab aus Dereferenzierung und just-- 1169 00:52:00,380 --> 00:52:01,646 >> [Signalton] 1170 00:52:01,646 --> 00:52:04,080 >> Oh, hey das hat nicht funktioniert. 1171 00:52:04,080 --> 00:52:06,470 Sagen, äh, Binky, weiß ich nicht denke Dereferenzierung 1172 00:52:06,470 --> 00:52:10,850 y ist eine gute Idee, weil die Einstellung up der pointee ist ein separater Schritt. 1173 00:52:10,850 --> 00:52:12,480 Und ich glaube nicht, dass wir jemals getan haben. 1174 00:52:12,480 --> 00:52:14,620 >> -Hmm, Guter Punkt. 1175 00:52:14,620 --> 00:52:19,810 >> -Ja, Zugeteilt wir den Zeiger, y, aber wir nie setzen Sie ihn auf auf eine pointee zeigen. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Sehr aufmerksam. 1177 00:52:21,590 --> 00:52:23,215 -Hey, Du bist es gut aus, Binky. 1178 00:52:23,215 --> 00:52:26,390 Können Sie das Problem zu beheben, so dass y Punkte zu derselben pointee als x. 1179 00:52:26,390 --> 00:52:29,290 >> -sure, Benutze ich meinen Zauberstab der Zeigerzuweisung. 1180 00:52:29,290 --> 00:52:31,970 >> -Ist, Dass wird eine sein, Problem, wie vorher? 1181 00:52:31,970 --> 00:52:33,790 >> Nein, dies nicht zu berühren die pointees. 1182 00:52:33,790 --> 00:52:35,840 Es ändert sich nur ein Zeiger auf die gleiche thing-- zeigen 1183 00:52:35,840 --> 00:52:36,465 >> [Knall] 1184 00:52:36,465 --> 00:52:37,450 --as anderen. 1185 00:52:37,450 --> 00:52:38,440 >> Oh, ich verstehe. 1186 00:52:38,440 --> 00:52:41,200 Jetzt y Punkte auf der gleichen Stelle wie x. 1187 00:52:41,200 --> 00:52:42,950 Also, warten Sie, nun y festgelegt ist. 1188 00:52:42,950 --> 00:52:44,110 Es hat eine pointee. 1189 00:52:44,110 --> 00:52:47,779 So können Sie den Zauberstab der versuchen wieder dereferenzieren, um die 13 über zu senden. 1190 00:52:47,779 --> 00:52:51,110 >> Oh, OK, hier geht. 1191 00:52:51,110 --> 00:52:52,330 >> -Hey, Sehen Sie, dass. 1192 00:52:52,330 --> 00:52:53,570 Jetzt Dereferenzierung Arbeiten auf y. 1193 00:52:53,570 --> 00:52:57,900 Und weil die Zeiger Sharing dass man pointee, beide finden Sie in der 13. 1194 00:52:57,900 --> 00:52:59,952 >> -Ja, Sharing, äh, was auch immer. 1195 00:52:59,952 --> 00:53:01,535 Also, wir gehen an Orte jetzt wechseln? 1196 00:53:01,535 --> 00:53:03,730 >> Oh, freuen wir aus der Zeit sind. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Nur Erinnern die drei Zeiger Regeln. 1199 00:53:06,520 --> 00:53:09,550 Nummer 1, der Grundstruktur ist, dass Sie einen Zeiger haben, 1200 00:53:09,550 --> 00:53:11,630 und es weist über zu einem pointee. 1201 00:53:11,630 --> 00:53:13,740 Aber der Zeiger und pointee sind getrennt. 1202 00:53:13,740 --> 00:53:15,620 Und die gemeinsame Fehler ist die Einrichtung eines Zeigers 1203 00:53:15,620 --> 00:53:18,000 aber vergessen Sie es ein pointee zu geben. 1204 00:53:18,000 --> 00:53:21,170 >> Nummer 2, Pointer Dereferenzierung beginnt an der Zeiger 1205 00:53:21,170 --> 00:53:24,020 und folgt dessen Pfeil über seine pointee zuzugreifen. 1206 00:53:24,020 --> 00:53:27,815 Wie wir alle wissen, das funktioniert nur, wenn es ist ein pointee, die Art der zurückkommt 1207 00:53:27,815 --> 00:53:29,260 Nummer 1 herrschen. 1208 00:53:29,260 --> 00:53:31,990 >> Zahl 3, Zeiger Zuordnung erfolgt ein Zeiger 1209 00:53:31,990 --> 00:53:35,330 und ändert es, um zu dem Punkt, gleichen pointee als eine andere Zeiger. 1210 00:53:35,330 --> 00:53:37,150 So nach der Abtretung, die beiden Zeiger 1211 00:53:37,150 --> 00:53:40,927 wird auf die gleiche pointee Punkt manchmal, dass heißt Sharing. 1212 00:53:40,927 --> 00:53:42,510 Und das ist alles dort ist zu ihm, wirklich. 1213 00:53:42,510 --> 00:53:43,130 Bye-bye jetzt. 1214 00:53:43,130 --> 00:53:43,475 >> [END PLAYBACK] 1215 00:53:43,475 --> 00:53:44,830 >> David J. MALAN: Das ist es für CS50. 1216 00:53:44,830 --> 00:53:46,246 Dank Professor Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Wir sehen uns nächste Woche. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [Elektronische Musik zu spielen] 1220 00:53:56,435 --> 00:57:22,775