1 00:00:00,000 --> 00:00:03,395 >> [REPRODUCCIÓ DE MÚSICA] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 DAVID J. Malan: Això és com un seminari de primer any a l'actualitat. 4 00:00:13,280 --> 00:00:14,060 D'ACORD. 5 00:00:14,060 --> 00:00:15,024 Així que molt plujós terme. 6 00:00:15,024 --> 00:00:17,690 Això tendeix a ocórrer els dimecres, però encara més oportunitat 7 00:00:17,690 --> 00:00:18,700 per a preguntes avui. 8 00:00:18,700 --> 00:00:22,210 Així que anem a començar en realitat amb la pel·lícula en un moment. 9 00:00:22,210 --> 00:00:24,560 Però anem a començar amb grandiloqüència com sempre. 10 00:00:24,560 --> 00:00:28,000 >> Això és CS50, i això És el cap de setmana 4. 11 00:00:28,000 --> 00:00:30,820 Així que si alguna vegada has vist La TV o una pel·lícula en la qual 12 00:00:30,820 --> 00:00:34,690 hi ha alguns experts en informàtica i la policia o l'FBI, o alguna agència 13 00:00:34,690 --> 00:00:36,930 està tractant de prendre una mica de adversari, així, que hi hagi 14 00:00:36,930 --> 00:00:40,850 probablement escoltat l'expressió "millorar" per la qual aquest tècnic d'alguna manera 15 00:00:40,850 --> 00:00:44,750 zooms màgicament en infinitament per poder veure els criminals 16 00:00:44,750 --> 00:00:48,640 identitat o el número de matrícula fins i tot en la brillantor d'un mirall 17 00:00:48,640 --> 00:00:50,390 o la brillantor dels ulls d'algú. 18 00:00:50,390 --> 00:00:55,196 Així que de fet, anem a fer una ullada a algunes d'aquestes escenes de Hollywood. 19 00:00:55,196 --> 00:00:55,862 [REPRODUCCIÓ DE VÍDEO] 20 00:00:55,862 --> 00:00:59,243 -ok, Ara anem a obtenir un bon cop d'ull. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Aguanta-ho. 23 00:01:07,415 --> 00:01:08,267 Corre que tornar. 24 00:01:08,267 --> 00:01:09,121 >> -Espera un minut. 25 00:01:09,121 --> 00:01:11,300 Anar a la dreta. 26 00:01:11,300 --> 00:01:12,209 >> -No, Congelar això. 27 00:01:12,209 --> 00:01:12,750 -Pantalla completa. 28 00:01:12,750 --> 00:01:13,558 -ok, Congelar això. 29 00:01:13,558 --> 00:01:14,820 Endurirà fins en això, oi? 30 00:01:14,820 --> 00:01:16,530 -Vector En el qual noi per la roda del darrere. 31 00:01:16,530 --> 00:01:19,400 -Zoom En aquí en aquest lloc. 32 00:01:19,400 --> 00:01:22,846 -Amb L'equip adequat, la imatge podria ser ampliat i aguditzat. 33 00:01:22,846 --> 00:01:24,065 -Què és això? 34 00:01:24,065 --> 00:01:25,600 -És Un programa de millora. 35 00:01:25,600 --> 00:01:26,860 -Pots És clar que qualsevol? 36 00:01:26,860 --> 00:01:27,890 -No ho sé. 37 00:01:27,890 --> 00:01:29,050 Anem a millorar-lo. 38 00:01:29,050 --> 00:01:31,575 >> Secció A6 -Millorar. 39 00:01:31,575 --> 00:01:33,642 >> -I Millora el detall, i- Crec que hi ha 40 00:01:33,642 --> 00:01:35,433 suficient per millorar, alliberar la meva pantalla. 41 00:01:35,433 --> 00:01:37,080 -I Va millorar la reflexió en el seu ull. 42 00:01:37,080 --> 00:01:38,830 >> -Anem A executar això a través de millora de vídeo. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Pots millorar això? 44 00:01:40,100 --> 00:01:41,875 >> -Espera. 45 00:01:41,875 --> 00:01:44,010 >> -He Estat treballant en aquesta reflexió. 46 00:01:44,010 --> 00:01:44,995 >> La reflexió de -Algú. 47 00:01:44,995 --> 00:01:45,495 -Reflexió. 48 00:01:45,495 --> 00:01:47,399 -Hi Ha Un reflex de la cara de l'home. 49 00:01:47,399 --> 00:01:48,065 -La Reflexió. 50 00:01:48,065 --> 00:01:48,981 -Hi Ha Una reflexió. 51 00:01:48,981 --> 00:01:50,600 -Zoom En el mirall. 52 00:01:50,600 --> 00:01:52,712 -Vostè Pot veure un reflex. 53 00:01:52,712 --> 00:01:54,350 -Pot A millorar la imatge d'aquí? 54 00:01:54,350 --> 00:01:55,370 -Pot Que ho millorar aquí? 55 00:01:55,370 --> 00:01:56,210 -Pots Potenciar-? 56 00:01:56,210 --> 00:01:56,900 Pots millorar? 57 00:01:56,900 --> 00:01:57,870 >> -Podem Millorem això? 58 00:01:57,870 --> 00:01:58,717 >> -Pots Potenciar-? 59 00:01:58,717 --> 00:02:00,050 -Mantenir En un segon, vaig a Millorar. 60 00:02:00,050 --> 00:02:00,924 -Zoom A la porta. 61 00:02:00,924 --> 00:02:01,700 -els Temps 10. 62 00:02:01,700 --> 00:02:02,586 -Zoom. 63 00:02:02,586 --> 00:02:03,490 -Avançar. 64 00:02:03,490 --> 00:02:03,990 -Més. 65 00:02:03,990 --> 00:02:04,690 -Espera, Aturi. 66 00:02:04,690 --> 00:02:05,190 -Stop. 67 00:02:05,190 --> 00:02:05,970 -PAUSE Ella. 68 00:02:05,970 --> 00:02:09,460 Ens -Girar 75 graus al voltant de la vertical, per favor. 69 00:02:09,460 --> 00:02:10,962 -Stop. 70 00:02:10,962 --> 00:02:14,040 Tornar a la part sobre la porta, de nou. 71 00:02:14,040 --> 00:02:15,860 >> -Got Un promotor d'imatge que pot mapa de bits? 72 00:02:15,860 --> 00:02:18,776 >> -Escolta, Potser podem fer servir el Pradeep Mètode de Sen per veure per les finestres. 73 00:02:18,776 --> 00:02:20,372 Programari -Aquest és l'estat de la tècnica. 74 00:02:20,372 --> 00:02:21,845 >> -El Valor propi està apagat. 75 00:02:21,845 --> 00:02:24,300 >> -Amb La dreta combinació de algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> Eliminació presa de -Ell algoritmes per al següent nivell, 77 00:02:26,755 --> 00:02:28,730 i puc utilitzar-los per millorar aquesta fotografia. 78 00:02:28,730 --> 00:02:31,286 >> -Lock Encesa i ampliar l'eix z. 79 00:02:31,286 --> 00:02:32,560 >> -Millorar. 80 00:02:32,560 --> 00:02:33,100 >> -Millorar. 81 00:02:33,100 --> 00:02:33,600 >> -Millorar. 82 00:02:33,600 --> 00:02:34,960 -Freeze I millorar. 83 00:02:34,960 --> 00:02:37,180 >> [FI DE REPRODUCCIÓ] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. Malan: Molt bé, així tots aquests són en realitat paraules. 85 00:02:41,160 --> 00:02:44,450 Només estan enfilats en un de manera que no és en realitat sensible. 86 00:02:44,450 --> 00:02:48,400 I, de fet, CS50 i cursos com és tendeix a arruïnar un munt de TV i pel·lícules 87 00:02:48,400 --> 00:02:48,900 per a tu. 88 00:02:48,900 --> 00:02:52,330 Perquè quan els experts en informàtica es recitar termes i dient 89 00:02:52,330 --> 00:02:56,860 coses de luxe com vectors propis, i l'eix z, 90 00:02:56,860 --> 00:02:59,572 i qualsevol nombre d'una altra en realitat termes més tècnics, 91 00:02:59,572 --> 00:03:02,030 que realment estan simplement tensant paraules juntes amb massa freqüència. 92 00:03:02,030 --> 00:03:05,020 És això una de les nostres esperances és que, com un efecte secundari de prendre cursos 93 00:03:05,020 --> 00:03:08,245 com aquest, ho farà més persones al món realment sigui capaç de pesar en 94 00:03:08,245 --> 00:03:12,040 i només molt lleugerament influir en el la qualitat i l'exactitud d'aquestes pel·lícules? 95 00:03:12,040 --> 00:03:14,350 >> De fet, anem a fer una ullada a la realitat. 96 00:03:14,350 --> 00:03:18,070 Així que aquí està la foto personal de Maria, un dels nostres companys docents. 97 00:03:18,070 --> 00:03:20,050 I suposo que és sospitós d'alguna cosa. 98 00:03:20,050 --> 00:03:23,730 I, no obstant, hi ha un indici de alguna peça d'evidència en el seu ull, 99 00:03:23,730 --> 00:03:25,480 o en el reflex de les ulleres. 100 00:03:25,480 --> 00:03:30,760 Bé, si ho fem exactament com les pel·lícules proposar, en el qual ens acostem i "millorem", 101 00:03:30,760 --> 00:03:34,080 això és la quantitat d'informació és en el rostre de Maria 102 00:03:34,080 --> 00:03:36,795 quan es captura una imatge amb la resolució original. 103 00:03:36,795 --> 00:03:39,120 >> I, de fet, es pot veure aquests punts. 104 00:03:39,120 --> 00:03:41,900 I aquests són els que són denominats píxels, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 que és només una plaça típicament que és un punt que compon una imatge. 106 00:03:45,740 --> 00:03:49,200 I de tornada en el dia, i de fet encara avui amb alguns dels televisors LED d'avui 107 00:03:49,200 --> 00:03:51,950 o televisors de plasma, si tens una a la seva habitació oa la llar, 108 00:03:51,950 --> 00:03:55,100 si puges molt a prop seu, i especialment si es tracta d'un televisor una mica més gran, 109 00:03:55,100 --> 00:03:58,760 és probable que fins i tot es pot veure aquests punts i això és el que compondre una imatge. 110 00:03:58,760 --> 00:04:00,980 >> I no hi ha més la informació que això. 111 00:04:00,980 --> 00:04:05,400 Podríem "millorar", en el sentit de suavitzar les coses una i tipus de 112 00:04:05,400 --> 00:04:09,040 inferir la classe de, classe del que color ha d'estar al costat dels ulls de Maria 113 00:04:09,040 --> 00:04:10,910 pel que no és en realitat tan pixelada. 114 00:04:10,910 --> 00:04:14,510 Però si segueixo zoom, hi ha és el dolent de la pel·lícula als ulls. 115 00:04:14,510 --> 00:04:16,600 Igual que és tant informació que tenim. 116 00:04:16,600 --> 00:04:18,920 No pot crear Informació del no-res. 117 00:04:18,920 --> 00:04:20,790 Només hi ha una finita nombre de bits allà. 118 00:04:20,790 --> 00:04:22,873 >> Així que en el problema 4 set, on vostè té una oportunitat 119 00:04:22,873 --> 00:04:24,580 jugar amb aquest tipus de món. 120 00:04:24,580 --> 00:04:27,610 En el problema setembre 4, explorarà la món dels gràfics i anàlisi forense, 121 00:04:27,610 --> 00:04:30,870 i en realitat escriure codi que recupera imatges perdudes. 122 00:04:30,870 --> 00:04:33,510 Vas a escriure codi que manipula imatges existents 123 00:04:33,510 --> 00:04:36,120 i, finalment, entendre el que està passant per sota de la caputxa. 124 00:04:36,120 --> 00:04:38,540 >> I, resulta que, en realitat no tan complicat. 125 00:04:38,540 --> 00:04:41,320 Per exemple, si volguéssim representar una cara somrient en 126 00:04:41,320 --> 00:04:44,160 amb aquests píxels negres, o aquests punts negres, 127 00:04:44,160 --> 00:04:47,230 així, podríem simplement representar com un veritable mapa de bits. 128 00:04:47,230 --> 00:04:50,040 I si havia sentit parlar alguna vegada que mapa de bits expressió, potser 129 00:04:50,040 --> 00:04:52,330 ara comença a fer una poc més avui sentit. 130 00:04:52,330 --> 00:04:53,580 >> Ja sabem el que una mica és. 131 00:04:53,580 --> 00:04:54,160 És 0 o 1. 132 00:04:54,160 --> 00:04:56,201 I un mapa és només una cosa com un tros de paper 133 00:04:56,201 --> 00:04:59,180 que ofereix adreces i té potser una quadrícula de x i y coordenades. 134 00:04:59,180 --> 00:05:00,540 Així que aquí és un mapa de bits. 135 00:05:00,540 --> 00:05:03,680 És un mapa de bits mitjançant el qual un 1 es aparentment 136 00:05:03,680 --> 00:05:07,857 passant de representar un píxel blanc, i un 0 va representar un píxel negre. 137 00:05:07,857 --> 00:05:09,440 Però sens dubte podríem donar-li la volta al voltant. 138 00:05:09,440 --> 00:05:11,648 Realment no importa el Mentre estiguem consistent. 139 00:05:11,648 --> 00:05:15,570 I aquí és com, a l'interior binary-- de la memòria d'un ordinador, o fins i tot a l'interior 140 00:05:15,570 --> 00:05:18,160 d'un arxiu en el seu disc drive-- podries guardar 141 00:05:18,160 --> 00:05:20,240 el més simple d'imatges de cares somrients. 142 00:05:20,240 --> 00:05:23,990 Però, ¿què som nosaltres, per descomptat, mancat d'aquesta imatge? 143 00:05:23,990 --> 00:05:24,610 Color, no? 144 00:05:24,610 --> 00:05:28,220 És un següent pas obvi o millora per millorar això amb color. 145 00:05:28,220 --> 00:05:32,230 Així que per desgràcia amb un sol poc, 0 o 1, que podria representar el color. 146 00:05:32,230 --> 00:05:36,100 Això podria ser de color vermell o blau, o negre, o blanc, o verd o rosa, 147 00:05:36,100 --> 00:05:37,420 o qualsevol parells de colors. 148 00:05:37,420 --> 00:05:40,860 No obstant això, per simplificar, anem a simplement assumir blanc i negre. 149 00:05:40,860 --> 00:05:45,930 >> Així que el que lògicament necessitem si volem vol aplicar color a una imatge? 150 00:05:45,930 --> 00:05:49,080 Què hem de fer? 151 00:05:49,080 --> 00:05:51,900 Igual que si el factor limitant aquí és que amb un bit només es pot 152 00:05:51,900 --> 00:05:55,977 representar dos estats, 0 o 1, blanc o negre, què vols que faci? 153 00:05:55,977 --> 00:05:56,810 AUDIÈNCIA: Més dades. 154 00:05:56,810 --> 00:05:58,813 DAVID J. Malan: més bits, yeah més dades, més bits. 155 00:05:58,813 --> 00:06:01,440 I, de fet, això és exactament com imatges en color estan representats. 156 00:06:01,440 --> 00:06:05,120 En lloc d'utilitzar un sol bit, un 0 o 1 per a cada píxel, cada punt, 157 00:06:05,120 --> 00:06:06,170 només ha d'utilitzar múltiples. 158 00:06:06,170 --> 00:06:09,660 Utilitzar Tal 8, potser, més comunament utilitzar 24, i de fet, en la Sèrie de problemes 159 00:06:09,660 --> 00:06:13,300 4, ¿vols jugar amb un arxiu format de 24 bits que utilitza normalment. 160 00:06:13,300 --> 00:06:15,430 >> Però la majoria de vostès probablement familiaritzats amb els fitxers JPEG. 161 00:06:15,430 --> 00:06:17,460 Si alguna vegada has pres una foto al seu telèfon, 162 00:06:17,460 --> 00:06:20,360 o pujat o ha vist alguna cosa en Facebook o Flickr, qualsevol nombre 163 00:06:20,360 --> 00:06:24,882 de llocs web basats en les fotos, no tens Probablement vist una imatge JPEG abans. 164 00:06:24,882 --> 00:06:27,840 I resulta que, aquest és l'arxiu format que utilitzarem en PSet 4, 165 00:06:27,840 --> 00:06:30,340 pel qual es va a ha de recuperar imatges 166 00:06:30,340 --> 00:06:35,160 que he esborrat accidentalment d'un targeta de memòria danyada a la cambra, 167 00:06:35,160 --> 00:06:35,800 si es vol. 168 00:06:35,800 --> 00:06:38,490 >> I resulta que tot i que JPEG és bastant sophisticated-- 169 00:06:38,490 --> 00:06:40,906 és molt més sofisticat que els punts blancs i negres 170 00:06:40,906 --> 00:06:44,480 que vam veure fa un moment, perquè hi ha algoritmes realitat de fantasia que 171 00:06:44,480 --> 00:06:47,410 s'utilitzen per comprimir un JPEG, per la qual que es pot tenir una molt bona, 172 00:06:47,410 --> 00:06:49,832 qualitat d'imatge, però utilitzant relativament pocs bits. 173 00:06:49,832 --> 00:06:51,790 I tornarem a compressió en poc temps. 174 00:06:51,790 --> 00:06:56,280 Resulta que la primera 3 bytes en un image-- JPEG 175 00:06:56,280 --> 00:07:02,750 no importa el que vostè ha pres una fotografia de-- són els valors 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> En altres paraules, si només veure que el patró de bits, 177 00:07:05,990 --> 00:07:09,180 representat aquí com de tres bytes o 24 bits en total, 178 00:07:09,180 --> 00:07:13,810 amb alta probabilitat es pot inferir que vostè està buscant en aquesta primera de tres 179 00:07:13,810 --> 00:07:15,230 bytes d'un fitxer JPEG. 180 00:07:15,230 --> 00:07:18,040 I això és el que es coneix com la signatura d'un JPEG. 181 00:07:18,040 --> 00:07:20,540 Una gran quantitat de formats d'arxiu per aquí tendeixen a començar 182 00:07:20,540 --> 00:07:23,735 amb certs patrons de 0s i 1s, perquè Windows i Mac OS i iOS, 183 00:07:23,735 --> 00:07:28,272 i Android sap quin tipus d'arxiu que són, a més de l'arxiu de trucada 184 00:07:28,272 --> 00:07:29,730 extensió que una gran quantitat d'arxius té. 185 00:07:29,730 --> 00:07:32,590 Si ha .jpg, això és una altra pista a l'ordinador. 186 00:07:32,590 --> 00:07:35,310 >> Així que anem ara mira això una mica més tècnicament. 187 00:07:35,310 --> 00:07:37,390 Sabem que el decimal sistema és del 0 al 9. 188 00:07:37,390 --> 00:07:38,740 Sabem binari és 0 i 1. 189 00:07:38,740 --> 00:07:41,842 I si vostè pensa de nou a PSet 0, vam haver de lluites amb, 190 00:07:41,842 --> 00:07:43,800 per una mica, una mica anomenat hexadecimal, 191 00:07:43,800 --> 00:07:47,320 on vostè té 16 dígits, en lloc de 10 o en lloc de 2. 192 00:07:47,320 --> 00:07:50,405 I aquestes xifres, per convenció, són del 0 al 9 i després un 193 00:07:50,405 --> 00:07:55,040 a través de f, on f representa el que nombre decimal, igual que un seny ràpida 194 00:07:55,040 --> 00:07:56,640 comprovar? 195 00:07:56,640 --> 00:07:57,610 Per tant, 15. 196 00:07:57,610 --> 00:08:01,390 I una cosa que ha de representar el 10, just per naturalesa de l'ordre que he donat. 197 00:08:01,390 --> 00:08:04,350 És només una convenció arbitrària, però és bastant estàndard. 198 00:08:04,350 --> 00:08:06,870 >> Així que si ens fixem en aquest patró 3 bytes-- anem 199 00:08:06,870 --> 00:08:09,620 acaba de començar a mirar d'una manera consistent amb la forma 200 00:08:09,620 --> 00:08:12,450 científics de la computació en general mirar i pensar sobre els arxius. 201 00:08:12,450 --> 00:08:15,580 Per descomptat que pot pensar arxius en 0s i 1s, i decimal, 202 00:08:15,580 --> 00:08:19,340 però en realitat, tendim a usar binària o més típicament hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 de tornada de PSet 0. 204 00:08:20,760 --> 00:08:25,857 Així que permetin-me proposo 255, 216, i 255 són només aquests patrons de 0s i 1s. 205 00:08:25,857 --> 00:08:28,440 I es pot comprovar això si volen fer els càlculs de la Setmana 0. 206 00:08:28,440 --> 00:08:30,810 Però, per ara, només assumir que això és correcte. 207 00:08:30,810 --> 00:08:33,850 Jo només he reescrit de tres decimals nombres com tres valors binaris. 208 00:08:33,850 --> 00:08:36,100 Ara el que faré és només ha d'afegir una mica d'espai blanc, 209 00:08:36,100 --> 00:08:37,266 només pel bé de la llegibilitat. 210 00:08:37,266 --> 00:08:39,940 I fixeu-vos, jo només vaig per moure coses a part. 211 00:08:39,940 --> 00:08:43,090 Així que abans, després, abans, després. 212 00:08:43,090 --> 00:08:46,180 Jo estic fent res interessant una altra que només la difusió de les coses de manera 213 00:08:46,180 --> 00:08:50,380 que la notificació cada conjunt de vuit anys bits és ara dos conjunts de quatre bits. 214 00:08:50,380 --> 00:08:54,920 Això és útil perquè hexadecimal és particularment moda 215 00:08:54,920 --> 00:09:00,930 perquè cada dígit hexadecimal de 0 a f, o més específicament de 0 a 15, 216 00:09:00,930 --> 00:09:03,430 pot ser representada amb exactament quatre bits. 217 00:09:03,430 --> 00:09:07,960 En altres paraules, en hexadecimal si vol representar un 0, és només 0000, 218 00:09:07,960 --> 00:09:08,780 quatre zeros. 219 00:09:08,780 --> 00:09:13,997 I si vostè vol representar 15, és 1,111, que és de quatre bits. 220 00:09:13,997 --> 00:09:16,080 I si es fan els comptes, si aquest és el lloc de les unitats, 221 00:09:16,080 --> 00:09:18,210 aquest és el lloc 16, això va a donar usted-- 222 00:09:18,210 --> 00:09:19,960 més aviat, que va A-- ho sento, en binari, 223 00:09:19,960 --> 00:09:23,660 això va a donar 15, benvolguts lloc, twos lloc, a quatre potes i vuits lloc. 224 00:09:23,660 --> 00:09:26,821 Així que permetin-me proposo que un conjunt de quatre bits de l'esquerra 225 00:09:26,821 --> 00:09:28,070 és el que anem a trucar a f. 226 00:09:28,070 --> 00:09:30,110 És el major nombre que pot representar amb quatre bits. 227 00:09:30,110 --> 00:09:33,300 I ja sabem de hexadecimal, f és la més gran de dígits en hexadecimal. 228 00:09:33,300 --> 00:09:36,020 Tenim un altre f allà, 2 més enllà. 229 00:09:36,020 --> 00:09:38,980 I per ara, acaba de prendre en la fe que he fet el dret de matemàtiques 230 00:09:38,980 --> 00:09:41,890 i que la meitat esquerra d'aquests bits, 1101, 231 00:09:41,890 --> 00:09:43,980 és el mateix que d en hexadecimal. 232 00:09:43,980 --> 00:09:46,490 I la mà dreta, 1000, és a 8. 233 00:09:46,490 --> 00:09:48,140 >> I que un fàcil de veure, no? 234 00:09:48,140 --> 00:09:51,670 El 8 represents-- és correcte sota d'aquest lloc vuits. 235 00:09:51,670 --> 00:09:56,040 Així que tenim una a la columna de l'vuits i res en les quatre potes, dues en dues estimats o. 236 00:09:56,040 --> 00:09:59,830 Així que ara més convencional, els éssers humans tendeixen escriure dígits hexadecimals com aquest, 237 00:09:59,830 --> 00:10:03,000 només els aplastas junts, i després se'ls prefix 0x. 238 00:10:03,000 --> 00:10:05,920 No vol dir res que no sigui una pista visual a un human-- 239 00:10:05,920 --> 00:10:10,350 aquí ve un value-- hexadecimal perquè pot ser que no d'una altra manera seria obvi. 240 00:10:10,350 --> 00:10:13,629 >> És a dir, en última instància, que el patró de zeros i uns, 241 00:10:13,629 --> 00:10:16,170 o el patró de hexadecimal dígits equivalentment que ets 242 00:10:16,170 --> 00:10:18,990 va començar a buscar en Butlletí de problemes 4 és esto-- 243 00:10:18,990 --> 00:10:22,120 i el problema 4 set spec caminarà a través d'això amb més detail-- 244 00:10:22,120 --> 00:10:25,344 però s'adonen com una mena de arcà com això podria semblar a primera vista, 245 00:10:25,344 --> 00:10:27,010 vas a començar a veure això molt. 246 00:10:27,010 --> 00:10:30,320 I de fet, fins i tot en GDB, el depurador vam introduir el dilluns 247 00:10:30,320 --> 00:10:35,440 i Dan introdueix en PSet 3, va sovint li mostrarà valors hexadecimals 248 00:10:35,440 --> 00:10:39,910 només perquè tendeixen a ser més convencional que decimal o binari 249 00:10:39,910 --> 00:10:41,157 en el món de les computadores. 250 00:10:41,157 --> 00:10:42,490 Ara anem a posar això en context. 251 00:10:42,490 --> 00:10:48,040 Molts de vostès poden recordar això imatge aquí, que va venir de què? 252 00:10:48,040 --> 00:10:51,240 Vista, per la qual cosa fins i tot abans del que que, Windows XP van fer aquest debut. 253 00:10:51,240 --> 00:10:52,620 Així que aquest és un bell paisatge. 254 00:10:52,620 --> 00:10:55,940 I de fet, si treus el cap al voltant online-- Crec que és un article de Wikipedia, 255 00:10:55,940 --> 00:11:00,110 en on algú molt sorprenentment va sortir trobat aquest lloc en el món creat 256 00:11:00,110 --> 00:11:02,240 la seva càmera en precisament el lloc-- dret 257 00:11:02,240 --> 00:11:06,510 i això avui sembla com-- però és exactament la mateixa configuració. 258 00:11:06,510 --> 00:11:10,060 Aquesta imatge, però, està en un arxiu format anomenat mapa de bits, b-m-p. 259 00:11:10,060 --> 00:11:12,910 I anem a prendre un super ràpid cop d'ull al que això significa. 260 00:11:12,910 --> 00:11:17,770 >> Però de mapa de bits és només una forma diferent de imatges que representen encara amb píxels 261 00:11:17,770 --> 00:11:19,580 en 0 i 1, en última instància. 262 00:11:19,580 --> 00:11:23,282 Però al ràpid cop d'ull, té una signatura més interessant 263 00:11:23,282 --> 00:11:24,490 en el principi de l'arxiu. 264 00:11:24,490 --> 00:11:26,670 No es tracta només de tres bytes, en lloc hi ha 265 00:11:26,670 --> 00:11:30,770 un munt de patrons de bytes que han determinat significat. 266 00:11:30,770 --> 00:11:34,490 Per exemple, en algun lloc de la primers bytes de la imatge de mapa de bits 267 00:11:34,490 --> 00:11:37,440 va ser la mida de la imatge, l'amplada de la imatge, 268 00:11:37,440 --> 00:11:40,390 l'altura de la imatge, per la metadades útils, si es vol. 269 00:11:40,390 --> 00:11:43,940 Informació útil que Photoshop o qualsevol gràfic programa que utilitza 270 00:11:43,940 --> 00:11:45,180 en realitat podria preocupar-se. 271 00:11:45,180 --> 00:11:47,170 >> Així més sobre això en Problema 4 set, però això 272 00:11:47,170 --> 00:11:49,220 és només per dir que al final del dia 273 00:11:49,220 --> 00:11:52,390 tots els formats d'arxiu que vostè ha estat utilitzant per als arxius de Microsoft Word anys--, 274 00:11:52,390 --> 00:11:55,820 Números arxius, arxius d'Excel, qualsevol nombre de formats d'arxiu 275 00:11:55,820 --> 00:11:57,770 que podria tenir alguna extensió d'arxiu conegut 276 00:11:57,770 --> 00:12:00,130 són només 0s i 1s sota el capó. 277 00:12:00,130 --> 00:12:02,970 I els éssers humans han decidit el que les convencions són, 278 00:12:02,970 --> 00:12:08,340 el que els patrons de 0s i 1s representen presentar una paraula davant d'un arxiu d'Excel, 279 00:12:08,340 --> 00:12:10,322 davant de qualsevol nombre d'altres formats d'arxiu. 280 00:12:10,322 --> 00:12:12,780 Així que en PSet 4, tindrà un oportunitat de jugar amb això. 281 00:12:12,780 --> 00:12:14,405 >> Però què significa tenir una estructura. 282 00:12:14,405 --> 00:12:18,012 Això és realment una bona segue ara en C, que té només un parell 283 00:12:18,012 --> 00:12:20,220 característiques d'addicionals que no hem mirat encara. 284 00:12:20,220 --> 00:12:24,230 És una molt petita llengua i un les característiques bones de C és una estructura. 285 00:12:24,230 --> 00:12:27,300 Per exemple, si vostè volgut represent-- anem 286 00:12:27,300 --> 00:12:33,690 Dius que volia tenir una variable que representa un estudiant en algun programa. 287 00:12:33,690 --> 00:12:37,330 Potser estigués escrivint un curs programa de registre, o de compres nucli 288 00:12:37,330 --> 00:12:38,870 eina, o alguna cosa així. 289 00:12:38,870 --> 00:12:42,922 Quins són peces de dades relacionades a un estudiant que ve a la ment? 290 00:12:42,922 --> 00:12:44,880 Com un estudiant és representat amb quins valors? 291 00:12:44,880 --> 00:12:45,732 Sí? 292 00:12:45,732 --> 00:12:46,940 Vostè té un nom com a estudiant. 293 00:12:46,940 --> 00:12:48,900 ¿Què més ha un estudiant típic? 294 00:12:48,900 --> 00:12:49,320 >> AUDIÈNCIA: [inaudible] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. Malan: Així que, ho sento. 296 00:12:50,200 --> 00:12:50,660 >> AUDIÈNCIA: Edat. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. Malan: Una edat o aniversari equivalentment, si. 298 00:12:52,980 --> 00:12:53,557 Què més? 299 00:12:53,557 --> 00:12:54,390 AUDIÈNCIA: número d'identificació? 300 00:12:54,390 --> 00:12:57,460 DAVID J. Malan: Així que un número d'identificació, potser un número de telèfon, potser un dormitori, o casa, 301 00:12:57,460 --> 00:12:58,670 o la universitat, o alguna cosa així. 302 00:12:58,670 --> 00:13:01,820 Qualsevol nombre de peces de dades que que pugui tenir en la seva llista de contactes 303 00:13:01,820 --> 00:13:03,890 és el que es podria definir un estudiant. 304 00:13:03,890 --> 00:13:08,490 Així que si el que volíem fer això, en el codi, que podríem fer una cosa tan simple com això. 305 00:13:08,490 --> 00:13:15,670 Pot ser que tinguem un programa perquè té diguem, int main (void). 306 00:13:15,670 --> 00:13:18,920 I si vull representar una estudiant que podria tenir, per exemple, 307 00:13:18,920 --> 00:13:24,330 una cadena anomenat nom per a aquest estudiant, una cadena anomenada dormitori per a aquest estudiant, 308 00:13:24,330 --> 00:13:26,900 potser un int anomenat ID per a aquest estudiant. 309 00:13:26,900 --> 00:13:30,840 I perquè estic fent servir cordes, em hagi de tornar enrere i aguantar CS50.h. 310 00:13:30,840 --> 00:13:33,300 Potser necessitaré stdio.h. 311 00:13:33,300 --> 00:13:38,190 Així que permetin-me preventivament faig aquestes i estic va a cridar a aquest student.c per ara 312 00:13:38,190 --> 00:13:40,080 i guardi aquest. 313 00:13:40,080 --> 00:13:44,206 >> I ara puc fer alguna cosa amb aquestes variables. 314 00:13:44,206 --> 00:13:46,830 I només anem a escriure que com un comentari en pseudo codi, 315 00:13:46,830 --> 00:13:48,829 perquè no és interessant el que fem de moment. 316 00:13:48,829 --> 00:13:51,242 Acceptar, de manera que aquest és un programa que d'alguna manera emmagatzema un estudiant. 317 00:13:51,242 --> 00:13:53,450 Què és el que vull fer si voleu emmagatzemar dos estudiants? 318 00:13:53,450 --> 00:13:55,991 Així que el meu primer instint va a estar bé, espera un minut, 319 00:13:55,991 --> 00:14:01,920 si tinc un altre estudiant per què no fer jo acaba de fer nom de la cadena 2, cadena de dormitori 2, 320 00:14:01,920 --> 00:14:04,190 int ID2. 321 00:14:04,190 --> 00:14:06,540 I ho hem fet s'ha anat per això abans 322 00:14:06,540 --> 00:14:10,890 i el que era la nostra solució al que sembla a ser una mena de pasta de còpia hackish 323 00:14:10,890 --> 00:14:11,555 feina aquí? 324 00:14:11,555 --> 00:14:12,346 AUDIÈNCIA: Una matriu. 325 00:14:12,346 --> 00:14:13,830 DAVID J. Malan: Sí, podríem utilitzar una matriu. 326 00:14:13,830 --> 00:14:15,620 Feu això molt ràpidament es torna difícil de manejar. 327 00:14:15,620 --> 00:14:18,453 Vostè ha d'ordenar de manera arbitrària iniciar nomenar totes aquestes variables. 328 00:14:18,453 --> 00:14:22,190 I vostè, l'ésser humà, ha de mantenir seguiment que correspon OK nom2 329 00:14:22,190 --> 00:14:25,060 amb dorm2 correspon amb ID2. 330 00:14:25,060 --> 00:14:26,200 Només es converteix en un desastre. 331 00:14:26,200 --> 00:14:29,350 Així que és molt més fàcil, recordar des de fa unes setmanes, 332 00:14:29,350 --> 00:14:34,300 només haver de anomenats noms de cadena i potser ens doni tres d'ells. 333 00:14:34,300 --> 00:14:36,940 I llavors potser tenim dormitoris cadena i tenen 334 00:14:36,940 --> 00:14:41,900 tres d'ells, o amb una constant, int identificadors i tenen tres d'ells. 335 00:14:41,900 --> 00:14:45,250 Però fins i tot ara, això se sent una mica descuidat, dreta. 336 00:14:45,250 --> 00:14:49,440 Estem parlant dels estudiants i no obstant això, Estic realment aturar-se al nivell baix 337 00:14:49,440 --> 00:14:50,470 detalls d'implementació. 338 00:14:50,470 --> 00:14:52,790 L'estudiant és un nom i una residència d'estudiants i la identificació. 339 00:14:52,790 --> 00:14:59,814 >> Per què no puc simplement declarar una variable cridar estudiant i en diuen és. 340 00:14:59,814 --> 00:15:02,230 I si vull un altre estudiant, ¿Per què no simplement ho dic t. 341 00:15:02,230 --> 00:15:05,260 O si vull un munt dels estudiants, per què no ho faig jo només 342 00:15:05,260 --> 00:15:09,740 dir que tinc tota una classe de estudiants, i és tres d'ells. 343 00:15:09,740 --> 00:15:12,470 En altres paraules, per què no puc anar amb el meu propi tipus de dades, anomenada 344 00:15:12,470 --> 00:15:15,641 Els estudiants, dins dels quals és un nom, és una identificació, és una residència d'estudiants, 345 00:15:15,641 --> 00:15:16,890 és qualsevol nombre d'altres camps. 346 00:15:16,890 --> 00:15:19,030 I resulta que pot fer exactament això. 347 00:15:19,030 --> 00:15:21,850 >> Així que C té aquesta característica anomenada struct. 348 00:15:21,850 --> 00:15:24,700 Aquesta és una característica d'un llenguatge que ens permet fer exactament això. 349 00:15:24,700 --> 00:15:28,370 Vaig a seguir endavant i obrir structs.h 350 00:15:28,370 --> 00:15:32,299 on veurem el següent definició d'un estudiant. 351 00:15:32,299 --> 00:15:35,215 Resulta - i aquest és fins i tot més senzill que el que implica un ID 352 00:15:35,215 --> 00:15:36,080 fa un moment. 353 00:15:36,080 --> 00:15:39,120 Si vols arribar a el seu tipus de dades feta a casa, 354 00:15:39,120 --> 00:15:42,750 i més de int i carbó i surar i tots aquests altres que existeixen, 355 00:15:42,750 --> 00:15:45,810 vostè pot fer-ho, literalment, escriure typedef struct, 356 00:15:45,810 --> 00:15:47,880 a continuació, algunes claus, dins dels quals vostè 357 00:15:47,880 --> 00:15:51,460 una llista de les variables que desitja associar amb aquestes noves dades a mesura 358 00:15:51,460 --> 00:15:55,670 escrigui com un nom i un dormitori, i després després de les claus 359 00:15:55,670 --> 00:15:57,860 li dones un nom al nou tipus de dades. 360 00:15:57,860 --> 00:15:59,220 Així, per exemple, dels estudiants. 361 00:15:59,220 --> 00:16:03,247 >> I el que és bo d'això és que ara si ens fixem en el codi corresponent, 362 00:16:03,247 --> 00:16:05,080 la convenció, primer de tots, és posar aquest 363 00:16:05,080 --> 00:16:08,230 en un arxiu anomenat mica dot h, un arxiu de capçalera, que no tenim 364 00:16:08,230 --> 00:16:09,780 començat a fer servir nosaltres mateixos massa. 365 00:16:09,780 --> 00:16:12,120 Però anem a començar usant una mica ara. 366 00:16:12,120 --> 00:16:18,650 I el que podem fer amb això, en última instància, en aquestes poques línies de codi 367 00:16:18,650 --> 00:16:22,130 es declari exactament això tipus de dades, un estudiant. 368 00:16:22,130 --> 00:16:23,230 I ara anem a utilitzar la mateixa. 369 00:16:23,230 --> 00:16:27,274 >> Vaig ara a entrar en un arxiu anomenat structs1.c. 370 00:16:27,274 --> 00:16:29,440 I anem a fer una ullada a una algunes característiques aquí. 371 00:16:29,440 --> 00:16:32,250 Així les coses aquí és sobretot familiar, i anem a 372 00:16:32,250 --> 00:16:35,040 tornar al que no ho és familiar en un moment. 373 00:16:35,040 --> 00:16:39,880 Per descomptat, això és incloent la meva pròpia arxiu de capçalera, que és nou, així, 374 00:16:39,880 --> 00:16:42,580 a excepció de PSet 3 on, retir, tenim helpers.h. 375 00:16:42,580 --> 00:16:45,150 Així que vostè pot recordar helpers.h #include. 376 00:16:45,150 --> 00:16:49,381 >> Per què encara estic fent servir cometes en lloc de claus angulars? 377 00:16:49,381 --> 00:16:50,630 Quan puc triar entre ells? 378 00:16:50,630 --> 00:16:52,310 Gairebé sempre em sembla utilitzar parèntesis angulars. 379 00:16:52,310 --> 00:16:55,040 I després, de sobte, en línia de sis estic fent servir cometes dobles. 380 00:16:55,040 --> 00:16:55,860 Per què podria ser? 381 00:16:55,860 --> 00:16:56,700 Sí? 382 00:16:56,700 --> 00:16:57,725 >> AUDIÈNCIA: [inaudible] 383 00:16:57,725 --> 00:16:59,350 DAVID J. Malan: Això és un real, què? 384 00:16:59,350 --> 00:17:00,559 AUDIÈNCIA: Això està en el seu IDE. 385 00:17:00,559 --> 00:17:02,475 DAVID J. Malan: Sí, això és en el meu IDE real. 386 00:17:02,475 --> 00:17:05,690 I no habiten en l'IDE, perquè això és només una eina que estic fent servir. 387 00:17:05,690 --> 00:17:08,119 Això és al meu actual directori, específicament. 388 00:17:08,119 --> 00:17:11,647 Així structs.h és el meu propi arxiu no s'instal·la a l'IDE, 389 00:17:11,647 --> 00:17:14,480 en el sistema operatiu en si mateix, sinó que és en el meu directori actual. 390 00:17:14,480 --> 00:17:16,910 Així que la convenció és que si vols per incloure el seu propi arxiu de capçalera, 391 00:17:16,910 --> 00:17:18,200 només ha d'utilitzar cometes dobles. 392 00:17:18,200 --> 00:17:23,290 >> Com es diu això en línia 8, en termes generals? 393 00:17:23,290 --> 00:17:25,200 Això és el que? 394 00:17:25,200 --> 00:17:28,220 alguna cosa #define. 395 00:17:28,220 --> 00:17:31,040 Això representa constants, oi? 396 00:17:31,040 --> 00:17:33,140 Si vostè vol tenir un valor en el seu programa 397 00:17:33,140 --> 00:17:35,110 que s'utilitza en la seva totalitat munt de vegades, és 398 00:17:35,110 --> 00:17:39,330 bona convenció per factoritzar a terme, ha de declarar, amb el símbol de hash 399 00:17:39,330 --> 00:17:43,340 definir, llavors, per convenció, en tot majúscules paraula-- encara que no és 400 00:17:43,340 --> 00:17:45,320 estrictament necessari, però és convenció humana 401 00:17:45,320 --> 00:17:47,210 per capitalitzar constants perquè salten 402 00:17:47,210 --> 00:17:50,380 de manera que l'espai i el visually-- llavors el valor que desitja ser 403 00:17:50,380 --> 00:17:52,250 equivalent a nom d'aquesta constant. 404 00:17:52,250 --> 00:17:56,110 No mengi, però simplement seguir aquest patró d'allà. 405 00:17:56,110 --> 00:17:57,770 >> Així que el que estic fent en aquest codi real. 406 00:17:57,770 --> 00:18:00,660 Així que donem una ullada a el programa principal aquí. 407 00:18:00,660 --> 00:18:04,080 A la línia 12 perquè jo s'han inclòs structs.h, 408 00:18:04,080 --> 00:18:06,492 Ara tinc màgicament al meu disposició un nou tipus de dades. 409 00:18:06,492 --> 00:18:09,200 Jo no només tinc accés a int, i char, i el flotador, i la cadena, 410 00:18:09,200 --> 00:18:10,060 i blau i altres. 411 00:18:10,060 --> 00:18:12,470 Ara tinc accés a un tipus de dades dels estudiants. 412 00:18:12,470 --> 00:18:17,740 Així, en la línia 12, que estic combinant dos ideas-- només un tipus de dades personalitzades i dos, 413 00:18:17,740 --> 00:18:18,940 utilitzant una matriu. 414 00:18:18,940 --> 00:18:21,700 I així, en aquest programa si Vull donar suport realitat 415 00:18:21,700 --> 00:18:24,320 tres estudiants de diferents en el meu programa, 416 00:18:24,320 --> 00:18:30,480 simplement pot dir-me una variable anomenats estudiants, cadascun dels quals 417 00:18:30,480 --> 00:18:32,970 és dels estudiants de tipus, que és el meu tipus de dades personalitzat. 418 00:18:32,970 --> 00:18:35,890 I, en concret, dóna'm tres d'ells en el meu matriu. 419 00:18:35,890 --> 00:18:37,750 >> Així que ara, què fem en aquest programa? 420 00:18:37,750 --> 00:18:40,670 Heus aquí només per a la iteració del bucle de 0 a 3, perquè això és 421 00:18:40,670 --> 00:18:42,110 qual cosa el valor dels estudiants és. 422 00:18:42,110 --> 00:18:44,420 Només estic demanant a l'usuari dóna'm el nom de l'estudiant. 423 00:18:44,420 --> 00:18:48,090 I després, en la línia 17, que tenir una línia sobretot familiar. 424 00:18:48,090 --> 00:18:50,370 Tenim el nostre vell amic GetString a la dreta. 425 00:18:50,370 --> 00:18:52,345 ¿I quin tros de sintaxi és aparentment nova, 426 00:18:52,345 --> 00:18:55,130 si mai has programat en C abans, i mai han utilitzat les estructures? 427 00:18:55,130 --> 00:18:55,510 Sí? 428 00:18:55,510 --> 00:18:56,417 >> AUDIÈNCIA: El .name. 429 00:18:56,417 --> 00:18:57,500 DAVID J. Malan: El .name. 430 00:18:57,500 --> 00:19:01,220 Però això no és massa d'un salt, perquè ara els estudiants suport d'E 431 00:19:01,220 --> 00:19:02,590 li dóna a l'estudiant d'ordre i. 432 00:19:02,590 --> 00:19:04,730 I si vols bussejar dins d'aquesta estructura, 433 00:19:04,730 --> 00:19:09,490 només ha d'utilitzar un sol període i a continuació, el nom de la variable dins, 434 00:19:09,490 --> 00:19:11,900 o la propietat dins d'aquest Vols tenir accés a. 435 00:19:11,900 --> 00:19:14,816 De la mateixa manera llavors, si a continuació, demanar al usuari, dóna'm residència de l'estudiant, 436 00:19:14,816 --> 00:19:18,390 es pot emmagatzemar de manera similar que cadena en la variable de residència a l'interior 437 00:19:18,390 --> 00:19:19,940 que l'estructura dels estudiants. 438 00:19:19,940 --> 00:19:21,410 >> I ara les coses es posen una mica de fantasia. 439 00:19:21,410 --> 00:19:24,420 I això es va a veure en potser un munt bastant aviat. 440 00:19:24,420 --> 00:19:27,970 Però veuràs això molt més en PSet 4, per la qual cosa anem a simplement mirar a ara. 441 00:19:27,970 --> 00:19:33,364 Resulta que en la línia 23 a través 38, què creus que potser estic fent? 442 00:19:33,364 --> 00:19:35,530 He tret els comentaris per avui, però la versió 443 00:19:35,530 --> 00:19:38,660 del codi en línia per referència té tots els comentaris. 444 00:19:38,660 --> 00:19:40,171 Què em sembla que estic fent? 445 00:19:40,171 --> 00:19:42,530 >> AUDIÈNCIA: Guardar l'arxiu amb tot la informació que l'usuari ha introduït. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. Malan: Sí, exactament, aquesta és una nova forma 447 00:19:44,530 --> 00:19:46,370 que estem veient dues, una altra característica de C, 448 00:19:46,370 --> 00:19:48,700 mitjançant el qual puc crear els meus propis arxius. 449 00:19:48,700 --> 00:19:51,580 Fins ara, gairebé tots els programes que has escrit és apàtrida. 450 00:19:51,580 --> 00:19:53,334 Tan aviat com es fa córrer, això és tot. 451 00:19:53,334 --> 00:19:55,000 No hi ha memòria o record d'ella. 452 00:19:55,000 --> 00:19:56,110 No hi ha cap fitxer desat. 453 00:19:56,110 --> 00:19:58,120 Però si vostè vol guardar entrada que té 454 00:19:58,120 --> 00:20:02,100 succeït, com en un joc o un programa així, resulta que podem fer-ho. 455 00:20:02,100 --> 00:20:04,360 I veuràs això més en PSet 4 i en la Secció. 456 00:20:04,360 --> 00:20:08,661 Però aquesta línia 23 essencialment crea un arxiu anomenat students.csv. 457 00:20:08,661 --> 00:20:10,160 I que podria haver vist això abans. 458 00:20:10,160 --> 00:20:14,250 Fins i tot si mai has estudiat CS abans, CSV és de variables separades per comes. 459 00:20:14,250 --> 00:20:19,000 És com una molt pobre home versió d'un arxiu d'Excel, 460 00:20:19,000 --> 00:20:22,270 el que significa que es pot obrir en Excel i en Nombres d'Apple, 461 00:20:22,270 --> 00:20:23,830 i té files i columnes. 462 00:20:23,830 --> 00:20:26,485 Però no és una propietat format com Microsoft o Apple. 463 00:20:26,485 --> 00:20:29,840 Són només les comes que separen el valors que veurem en un moment. 464 00:20:29,840 --> 00:20:31,010 >> I acaba de prendre una conjectura. 465 00:20:31,010 --> 00:20:33,480 En la línia 23, en el mateix final, el meu segon argument 466 00:20:33,480 --> 00:20:37,700 a aquesta nova funció anomenada f obert per obrir l'arxiu és w. 467 00:20:37,700 --> 00:20:39,430 El que podria denotar w? 468 00:20:39,430 --> 00:20:40,022 Sí? 469 00:20:40,022 --> 00:20:41,260 >> AUDIÈNCIA: Se li permet escriure al fitxer? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. Malan: Permet s'escriu al fitxer. 471 00:20:42,630 --> 00:20:44,810 Així que hi ha un parell de variants que podem endollar aquí. 472 00:20:44,810 --> 00:20:47,184 Però si el que vols llegir l'arxiu, és mirar- 473 00:20:47,184 --> 00:20:50,010 i llegir-lo en la memòria, només ha d'utilitzar cometes "r". 474 00:20:50,010 --> 00:20:53,110 Si voleu escriure al arxiu, utilitzeu cometes "w". 475 00:20:53,110 --> 00:20:55,190 També ha annexar i un parell d'altres coses 476 00:20:55,190 --> 00:20:57,356 si voleu modificar els arxius existents. 477 00:20:57,356 --> 00:21:00,480 Ara seguirem veient a aquesta cosa, llavors ens tornarà a la línia 24. 478 00:21:00,480 --> 00:21:02,640 NULL, resulta, és un valor especial que 479 00:21:02,640 --> 00:21:06,070 poden ser retornats per certes funcions si alguna cosa ha anat wrong-- 480 00:21:06,070 --> 00:21:08,490 si el fitxer no existeix, si t'has quedat sense memòria, 481 00:21:08,490 --> 00:21:09,620 o un munt d'altres errors. 482 00:21:09,620 --> 00:21:13,470 Però per ara, anem a suposar que aquesta és la comprovació d'errors simplement convencional. 483 00:21:13,470 --> 00:21:17,090 Aquí, a la línia 26, que estic iteració de 0 a 3 sobre tots els meus estudiants. 484 00:21:17,090 --> 00:21:20,470 I això és una espècie de classe d'una nova funció, fprintf, 485 00:21:20,470 --> 00:21:21,460 però només prendre una conjectura. 486 00:21:21,460 --> 00:21:24,370 Si printf és només d'impressió una cadena amb format, 487 00:21:24,370 --> 00:21:26,507 ¿Què significa probablement fprintf? 488 00:21:26,507 --> 00:21:27,590 AUDIÈNCIA: Imprimir a un fitxer. 489 00:21:27,590 --> 00:21:29,290 DAVID J. Malan: Imprimiu una cadena amb format a un fitxer. 490 00:21:29,290 --> 00:21:31,180 Això és el que la taxa addicional mitjans f és arxiu. 491 00:21:31,180 --> 00:21:36,420 I el nou primer argument ha de ser la variable que representa el fitxer. 492 00:21:36,420 --> 00:21:38,866 Llavors només tenim un format cadena com printf. 493 00:21:38,866 --> 00:21:40,740 I tot i que aquest la sintaxi és nou, això només 494 00:21:40,740 --> 00:21:44,610 significa connectar el nom de l'estudiant, plug-in de la residència d'estudiants, i després 495 00:21:44,610 --> 00:21:47,160 amb fclose, tanqueu el fitxer. 496 00:21:47,160 --> 00:21:49,730 I després lastly-- això és nou i tornarem a aquest 497 00:21:49,730 --> 00:21:53,240 abans long-- estic alliberant l'estudiant per raons 498 00:21:53,240 --> 00:21:54,860 això va passar per sobre d'allà. 499 00:21:54,860 --> 00:21:56,820 Però tornarem a que abans de long-- 500 00:21:56,820 --> 00:21:59,820 això és a causa de com és GetString en realitat treballen sota de la campana. 501 00:21:59,820 --> 00:22:01,280 >> Així que anem a fer una ullada ràpida aquí. 502 00:22:01,280 --> 00:22:04,380 Si escric ls en el meu directori, adonar que no ho faig 503 00:22:04,380 --> 00:22:09,360 tenir un arxiu anomenat students.csv, simplement no hi ha, no existeix. 504 00:22:09,360 --> 00:22:14,965 Així que si ara puc compilar aquest programa, fer estructures-1 ,. / Estructures-1, 505 00:22:14,965 --> 00:22:20,570 i jo vaig a seguir endavant i escriure Andi, que viu a Berkeley a Yale. 506 00:22:20,570 --> 00:22:26,350 Haurem de Rob viu en Thayer aquests dies. 507 00:22:26,350 --> 00:22:33,760 I arribarem amb el lloc on és, crec, Maria està en Mather, 508 00:22:33,760 --> 00:22:35,100 si he recordat correctament. 509 00:22:35,100 --> 00:22:36,460 >> Així que res sembla succeir. 510 00:22:36,460 --> 00:22:40,680 Però si escric ls ara, hi ha students.csv. 511 00:22:40,680 --> 00:22:43,080 Seguirem endavant i students.csv oberta. 512 00:22:43,080 --> 00:22:46,050 Això és de nou una molt format d'arxiu de pes lleuger. 513 00:22:46,050 --> 00:22:49,570 Però simplement he adoptat una convenció que tinc dues files i columnes aquí. 514 00:22:49,570 --> 00:22:52,020 La primera columna és primers noms de les persones. 515 00:22:52,020 --> 00:22:55,740 La segona columna és l'estudiant de dormitori, o universitat, o una casa, o el que sigui. 516 00:22:55,740 --> 00:22:57,900 I ara m'he estalviat aquest permanentment en un arxiu. 517 00:22:57,900 --> 00:22:59,280 >> Així que no és tan interessant. 518 00:22:59,280 --> 00:23:02,980 Però això és només un esglaó en el camí ara de ser capaç de mantenir la informació 519 00:23:02,980 --> 00:23:04,040 de forma permanent. 520 00:23:04,040 --> 00:23:08,340 Així que anem a veure ara què més podem veure amb aquestes i altres característiques. 521 00:23:08,340 --> 00:23:10,729 Però primer, qualsevol pregunta? 522 00:23:10,729 --> 00:23:12,145 Això era molt, i això va ser ràpid. 523 00:23:12,145 --> 00:23:16,131 Però veuràs un munt més en PSet 4, també. 524 00:23:16,131 --> 00:23:16,630 Sí? 525 00:23:16,630 --> 00:23:19,360 >> AUDIÈNCIA: Hi ha una manera de seguir afegint noms a aquest arxiu? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. Malan: Bona pregunta. 527 00:23:19,880 --> 00:23:21,800 Hi ha una manera de continuar afegint noms a aquest arxiu? 528 00:23:21,800 --> 00:23:22,340 Sí. 529 00:23:22,340 --> 00:23:24,630 I, de fet, si al final fins a tornar a obrir l'arxiu, 530 00:23:24,630 --> 00:23:26,780 vostè utilitzaria cotització fi de la cita "a" per afegir, 531 00:23:26,780 --> 00:23:31,090 que acaba d'afegir una nova línia, 1 nova línia una vegada i una altra, exactament. 532 00:23:31,090 --> 00:23:32,010 Bona pregunta. 533 00:23:32,010 --> 00:23:32,950 Altres preguntes? 534 00:23:32,950 --> 00:23:33,450 Sí? 535 00:23:33,450 --> 00:23:35,580 AUDIÈNCIA: Si va executar el programa de nou en aquest moment, 536 00:23:35,580 --> 00:23:38,000 caldria seguir afegint noms a la Arxiu o hauria d'obrir un nou arxiu? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. Malan: Ah, bona pregunta. 538 00:23:38,740 --> 00:23:41,448 Si va executar el programa de nou a la dreta Ara, potser escrit en nous noms, 539 00:23:41,448 --> 00:23:44,820 caldria afegir a l'arxiu o sobreescriure l'arxiu? 540 00:23:44,820 --> 00:23:47,420 Això últim, perquè estic No s'utilitza el mode d'agregació. 541 00:23:47,420 --> 00:23:49,930 I perquè estic cegament obrir l'arxiu per a escriptura, 542 00:23:49,930 --> 00:23:51,310 que només va a sobreescriure l'arxiu. 543 00:23:51,310 --> 00:23:54,570 Així que jo de fet que hagi de fer és afegir, si jo vull tenir en realitat un llarg termini 544 00:23:54,570 --> 00:23:55,350 base de dades. 545 00:23:55,350 --> 00:23:58,220 >> Ara CSV és útil, francament, fins i tot per com si ets writing-- 546 00:23:58,220 --> 00:24:00,100 i finalment veurem aquest més tard en el semestre quan 547 00:24:00,100 --> 00:24:01,455 fem servir CSVs per a altres fins. 548 00:24:01,455 --> 00:24:04,920 Si voleu emmagatzemar tota la gent que s'han registrat per algun esdeveniment, 549 00:24:04,920 --> 00:24:07,420 o inscrit per la seva estudiant grup, o alguna cosa així, 550 00:24:07,420 --> 00:24:10,330 emmagatzemar les dades en aquest tipus de format és molt pràctic. 551 00:24:10,330 --> 00:24:12,580 A causa que, literalment, si eren per descarregar aquest arxiu. 552 00:24:12,580 --> 00:24:14,540 Podia double-- i anem a tractar aquesta realitat 553 00:24:14,540 --> 00:24:16,720 si tinc Excel o números aquí. 554 00:24:16,720 --> 00:24:19,130 >> Vaig a botó dret del ratolí o control clic en el meu arxiu. 555 00:24:19,130 --> 00:24:20,020 Vaja. 556 00:24:20,020 --> 00:24:21,830 Feu clic dret o control clic en el meu arxiu. 557 00:24:21,830 --> 00:24:24,960 Anem, el meu ratolí no està cooperant. 558 00:24:24,960 --> 00:24:32,694 Download-- vaig a descarregar tots els arxius d'aquí, així 559 00:24:32,694 --> 00:24:33,860 perquè jo pugui prendre aquest. 560 00:24:33,860 --> 00:24:37,850 I anem a veure si això funciona students.csv-- primera vegada 561 00:24:37,850 --> 00:24:39,310 He activat. 562 00:24:39,310 --> 00:24:41,360 Ara volen veure els meus contactes. 563 00:24:41,360 --> 00:24:44,310 Ara, m'he de registrar. 564 00:24:44,310 --> 00:24:47,620 Vegi el fàcil que és utilitzar CSV? 565 00:24:47,620 --> 00:24:50,840 Sí, segueix així fins a la data. 566 00:24:50,840 --> 00:24:52,375 OK, ara estem preparats per a la classe. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, què hi ha de nou? 569 00:25:00,370 --> 00:25:02,920 OK, a prop. 570 00:25:02,920 --> 00:25:04,750 Va ser màgic. 571 00:25:04,750 --> 00:25:07,280 Bé, ara hem de actualitzar. 572 00:25:07,280 --> 00:25:10,890 I ara, es va oblidar del que presento vaig obrir originalment, 573 00:25:10,890 --> 00:25:13,090 però el que A-- aquí anem. 574 00:25:13,090 --> 00:25:16,341 OK, així que ara tenim un arxiu d'Excel. 575 00:25:16,341 --> 00:25:18,290 Gràcies. 576 00:25:18,290 --> 00:25:20,764 >> OK, així que el que vaig fer va ser la part fàcil. 577 00:25:20,764 --> 00:25:23,930 Per descomptat que podria haver instal·lat prèviament Excel o Numbers, o qualsevol programa. 578 00:25:23,930 --> 00:25:25,846 Però això és bo, perquè ara puc manipular 579 00:25:25,846 --> 00:25:28,090 les dades en un format estàndard. 580 00:25:28,090 --> 00:25:30,294 >> Així que ara anem context canviar a on ho vam deixar 581 00:25:30,294 --> 00:25:32,710 l'última vegada, que anava a començar per enlairar les rodes d'entrenament. 582 00:25:32,710 --> 00:25:34,543 Però primer, no ho vas fer veure aquest dinar anterior 583 00:25:34,543 --> 00:25:38,150 de nou està succeint aquí a Foc i Gel a Cambridge, Sitar a New Haven. 584 00:25:38,150 --> 00:25:43,150 Registra't a la pàgina web CS50s ASAP per unir-se als estudiants CS50 i el personal. 585 00:25:43,150 --> 00:25:46,090 >> Així que prenem les rodes d'entrenament fos el dilluns a causa de follows-- 586 00:25:46,090 --> 00:25:49,120 cordes ha estat declarat en Biblioteca CS50s durant algun temps. 587 00:25:49,120 --> 00:25:52,650 I és bo, perquè permet que parlem de les variables com 588 00:25:52,650 --> 00:25:54,660 paraules i frases completes i més. 589 00:25:54,660 --> 00:25:56,710 Però resulta que la cadena no existeix. 590 00:25:56,710 --> 00:26:00,200 Això és només un sinònim o un àlies, que hem creat una cosa que 591 00:26:00,200 --> 00:26:03,780 en realitat és una mica més tècnica anomenada char *. 592 00:26:03,780 --> 00:26:07,900 >> I de fet, vam veure un exemple d'un programa d'aquest dilluns 593 00:26:07,900 --> 00:26:11,200 que no es va comportar bastant com esperàvem. 594 00:26:11,200 --> 00:26:13,630 Aquest va ser l'arxiu, comparar-0. 595 00:26:13,630 --> 00:26:17,910 I recorden que comparar-0, si Jo recompilar el programa de dilluns 596 00:26:17,910 --> 00:26:22,670 i executar compari-0 i el tipus de mare a minúscules, i la mare en minúscules nou. 597 00:26:22,670 --> 00:26:25,320 El programa va insistir que escriure coses diferents, 598 00:26:25,320 --> 00:26:29,210 tot i que la mare, tot en minúscules, és idèntic visualment. 599 00:26:29,210 --> 00:26:31,990 Llavors, ¿quina va ser la resposta curta per què l'equip pensa 600 00:26:31,990 --> 00:26:34,500 aquestes dues cadenes són diferents? 601 00:26:34,500 --> 00:26:35,250 Sí? 602 00:26:35,250 --> 00:26:36,534 >> AUDIÈNCIA: [inaudible] 603 00:26:36,534 --> 00:26:37,450 DAVID J. Malan: Correcte. 604 00:26:37,450 --> 00:26:39,600 Així, la mare, el primer cop Escric en ella, està sent 605 00:26:39,600 --> 00:26:42,710 emmagatzemada en algun lloc del meu equip memòria, però en una ubicació diferent 606 00:26:42,710 --> 00:26:44,690 que la segona vegada que escric en mare. 607 00:26:44,690 --> 00:26:46,580 Ara sense dubte és optimitzat. 608 00:26:46,580 --> 00:26:49,205 L'equip podria ser intel·ligent i donar-se compte d'aquestes dues cadenes, hey, 609 00:26:49,205 --> 00:26:49,954 són idèntics. 610 00:26:49,954 --> 00:26:51,520 Permetin-me no redundant emmagatzemar-lo. 611 00:26:51,520 --> 00:26:54,229 Però els ordinadors no fan això optimització llevat que digui que ho facin. 612 00:26:54,229 --> 00:26:56,061 Així que, per defecte, que són només va a acabar 613 00:26:56,061 --> 00:26:57,670 en dos llocs diferents en la memòria. 614 00:26:57,670 --> 00:27:01,570 I així, per ser més clar, quan comparem les dues cadenes, 615 00:27:01,570 --> 00:27:03,950 El primer va ser anomenat s, el segon va ser anomenat 616 00:27:03,950 --> 00:27:08,530 t, el que era específicament I comparant aquí a la línia 13? 617 00:27:08,530 --> 00:27:09,494 Sí. 618 00:27:09,494 --> 00:27:12,390 >> AUDIÈNCIA: És el lloc en la memòria que la variable apuntarà a. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. Malan: Exactament, jo era comparant el lloc en la memòria 620 00:27:14,900 --> 00:27:16,300 aquelles variables que apuntaven a. 621 00:27:16,300 --> 00:27:20,560 Així en concret, si la mare estava en el byte número 1, i 2, i 3, 622 00:27:20,560 --> 00:27:24,020 i 4-- perquè recorden la barra invertida 0 ha de ser tot el camí al final. 623 00:27:24,020 --> 00:27:29,420 I l'altra instància de la mare, m-o-m, va ser en la direcció 10, 11, 12 i 13. 624 00:27:29,420 --> 00:27:33,100 Jo estava comparant 1, aquesta direcció, que la ubicació en la memòria, 625 00:27:33,100 --> 00:27:35,160 contra 10, que és òbviament no és el mateix. 626 00:27:35,160 --> 00:27:36,260 1 no és 10. 627 00:27:36,260 --> 00:27:39,620 >> Així que això és agradable en què és bastant senzill. 628 00:27:39,620 --> 00:27:42,870 Però és problemàtic en la mesura sembla que no podem comparar cadenes. 629 00:27:42,870 --> 00:27:44,930 Així fundamentally-- i en aquest baix nivell, 630 00:27:44,930 --> 00:27:47,300 si vostè vol posar en pràctica un programa per comparar 631 00:27:47,300 --> 00:27:50,270 dues paraules separades que la usuari ha escrit quant a qualitat, 632 00:27:50,270 --> 00:27:53,944 fan que s'alineen carbó per char, només en termes generals, 633 00:27:53,944 --> 00:27:55,360 ¿Què és el que hem de fer, pel que es veu? 634 00:27:55,360 --> 00:27:57,940 No n'hi ha prou només per mirar aquestes dues direccions. 635 00:27:57,940 --> 00:27:58,860 Què necessitem fer? 636 00:27:58,860 --> 00:27:59,360 Sí? 637 00:27:59,360 --> 00:28:01,120 >> AUDIÈNCIA: Iterar a través la cadena [inaudible]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. Malan: Sí, anem a iterar a través de la cadena. 639 00:28:02,600 --> 00:28:05,808 Utilitzarem un bucle for, un bucle while, o el que està més còmode. 640 00:28:05,808 --> 00:28:08,840 I si tenim dues cadenes en algun lloc en la memòria, donem una ullada a cadascun 641 00:28:08,840 --> 00:28:11,770 primer caràcter, llavors cada un és segon caràcter, a continuació, tercer, i quart, 642 00:28:11,770 --> 00:28:15,206 i cinquè, fins que va colpejar quin valor especial sentinella? 643 00:28:15,206 --> 00:28:16,080 AUDIÈNCIA: [inaudible] 644 00:28:16,080 --> 00:28:18,800 DAVID J. Malan: Sí, la barra invertida zero, en el punt, ja sigui en cadena de 645 00:28:18,800 --> 00:28:20,100 podem decidir que això és tot. 646 00:28:20,100 --> 00:28:21,970 Hem aparellat cada personatge? 647 00:28:21,970 --> 00:28:22,990 En cas contrari, retorna fals. 648 00:28:22,990 --> 00:28:24,770 Si és així, torneu realitat. 649 00:28:24,770 --> 00:28:28,800 I això és exactament el que aquesta versió del programa compara-1.c fa. 650 00:28:28,800 --> 00:28:31,677 És idèntic al que mirat dilluns excepte que he I 651 00:28:31,677 --> 00:28:34,760 lliurat de la paraula string-- encara que no té impact-- funcional tot 652 00:28:34,760 --> 00:28:37,450 Que estic fent ara és l'eliminació algunes rodes d'entrenament visual, 653 00:28:37,450 --> 00:28:40,880 sinó per veure clarament que s i t són direccions. 654 00:28:40,880 --> 00:28:43,020 I això és el que l'estrella, l'asterisc, representa 655 00:28:43,020 --> 00:28:46,690 és una adreça, també coneguda més tècnicament com un punter. 656 00:28:46,690 --> 00:28:49,880 >> Així que quan em declaro en s la línia 9 i dir char * s, 657 00:28:49,880 --> 00:28:52,160 això no vol dir que em donés una cadena. 658 00:28:52,160 --> 00:28:56,360 Això vol dir que em doni una variable el propòsit en la vida és emmagatzemar una adreça. 659 00:28:56,360 --> 00:29:00,400 Perquè jo estic a punt de posar el direcció d'una cadena en el mateix. 660 00:29:00,400 --> 00:29:03,500 I, en efecte, GetString, per ser clar, no retorna una cadena. 661 00:29:03,500 --> 00:29:06,110 No retorna mare barra invertida zero, per se. 662 00:29:06,110 --> 00:29:10,005 Què significa GetString específicament i tornar precisament? 663 00:29:10,005 --> 00:29:10,880 AUDIÈNCIA: [inaudible] 664 00:29:10,880 --> 00:29:14,080 DAVID J. Malan: Una adreça, la direcció del primer caràcter 665 00:29:14,080 --> 00:29:16,070 en alguna cadena s'ha aconseguit. 666 00:29:16,070 --> 00:29:19,250 I pel que ara estem veient una paraula clau especial de nou. 667 00:29:19,250 --> 00:29:20,640 I, vaig al·ludir a aquesta abans. 668 00:29:20,640 --> 00:29:23,620 Això serà bo de convencions que anem a veure una vegada i una altra ara. 669 00:29:23,620 --> 00:29:27,540 Estic comprovant per assegurar-se que s no és nul i t no és nul. 670 00:29:27,540 --> 00:29:30,100 A causa de que la base de la meva realitat menció ràpida abans, 671 00:29:30,100 --> 00:29:35,510 el que podria significar si GetString no torna una adreça, però N-O-L-L, que és de nou, 672 00:29:35,510 --> 00:29:36,990 algun valor especial? 673 00:29:36,990 --> 00:29:37,890 >> AUDIÈNCIA: Error. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. Malan: És un error. 675 00:29:38,600 --> 00:29:39,550 Alguna cosa ha anat malament. 676 00:29:39,550 --> 00:29:41,341 I el que normalment que podria succeir, especialment 677 00:29:41,341 --> 00:29:45,162 amb el que podria ser strings-- de longitud desconeguda en advance-- 678 00:29:45,162 --> 00:29:46,870 potser els equips dels sense memòria, potser 679 00:29:46,870 --> 00:29:49,280 que ha escrit de tal llarga paraula o frase 680 00:29:49,280 --> 00:29:51,880 o enganxat un gran assaig tals que no hi ha prou memòria. 681 00:29:51,880 --> 00:29:55,340 I així GetString no pot tornar la direcció de tot l'assumpte, 682 00:29:55,340 --> 00:29:56,620 de manera que només retorna res. 683 00:29:56,620 --> 00:30:00,580 I diu un error ha ocorregut retornant el valor especial NULL. 684 00:30:00,580 --> 00:30:02,890 És l'adreça de zero, per així dir-ho. 685 00:30:02,890 --> 00:30:06,157 >> Ara resulta que C ve amb un funció que fa que iteració. 686 00:30:06,157 --> 00:30:09,240 No tenim per implementar això amb un bucle o un bucle while nosaltres mateixos. 687 00:30:09,240 --> 00:30:11,150 Podem utilitzar una funció, anomenada de manera succinta, 688 00:30:11,150 --> 00:30:15,400 regiri un esborrany, o cadena comparar, la propòsit en la vida és fer exactament això. 689 00:30:15,400 --> 00:30:19,990 Se li dóna dos punters, dues direccions, i va a anar a aquestes adreces 690 00:30:19,990 --> 00:30:23,130 i després comparar carta per lletra per lletra per la qualitat, 691 00:30:23,130 --> 00:30:26,610 detenint-se només quan el que és veritat? 692 00:30:26,610 --> 00:30:31,540 Quan intuïtivament d'agitar un esborrany deixen d'iteració, per ser clars? 693 00:30:31,540 --> 00:30:35,400 Quan es realitza una barra invertida 0 en qualsevol cadena, en el punt es pot decidir 694 00:30:35,400 --> 00:30:38,910 té tot igualat, o ha hagut una discrepància? 695 00:30:38,910 --> 00:30:42,740 >> Per tant, si correm això ara i tractar el nostre petit joc de capitalització, 696 00:30:42,740 --> 00:30:49,260 així que compari-1, ./compare-1, i escrigui mare en minúscules en ambdues ocasions. 697 00:30:49,260 --> 00:30:50,560 Ara és el mateix. 698 00:30:50,560 --> 00:30:54,080 I si ho faig de nou amb minúscula i després potser majúscules. 699 00:30:54,080 --> 00:30:56,720 Ara en veritat distingeix entre majúscules i minúscules. 700 00:30:56,720 --> 00:31:00,440 Així que no és tan difícil o màgic, però sí ara explicar 701 00:31:00,440 --> 00:31:03,140 el que està passant sota de la campana. 702 00:31:03,140 --> 00:31:07,640 >> Llavors, què més es pot extreure que d'aquest tipus de lliçó? 703 00:31:07,640 --> 00:31:08,980 Així que anem a fer una ullada a això. 704 00:31:08,980 --> 00:31:15,380 Vaig a seguir endavant i escriure una programa ràpid aquí anomenat còpia-0. 705 00:31:15,380 --> 00:31:21,594 I ara anem a seguir endavant i de fet farem esto-- amb el còpia-0, 706 00:31:21,594 --> 00:31:23,010 fer una ullada al que tinc aquí. 707 00:31:23,010 --> 00:31:24,712 La primera vegada que dic que l'usuari, dir alguna cosa. 708 00:31:24,712 --> 00:31:26,420 Llavors si una cadena i vaig guardar en s. 709 00:31:26,420 --> 00:31:29,810 Llavors puc comprovar si s és igual a és igual a NULL, simplement tornar 1. 710 00:31:29,810 --> 00:31:31,590 Així que això és només la comprovació d'errors estàndard. 711 00:31:31,590 --> 00:31:33,112 Res interessant ha succeït. 712 00:31:33,112 --> 00:31:36,320 I de fet, si ens desfem de l'error xecs, això s'assembla a la setmana 1 codi 713 00:31:36,320 --> 00:31:36,985 en el moment. 714 00:31:36,985 --> 00:31:39,110 Però he començat a aconseguir un mica millor per això. 715 00:31:39,110 --> 00:31:43,340 >> Ara bé, en la línia 16, fa una setmana, potser dia fins i tot un parell de minuts o fa, 716 00:31:43,340 --> 00:31:46,720 es podria dir la línia 16 és la creació d'una variable anomenada t 717 00:31:46,720 --> 00:31:48,219 i la còpia és en ella. 718 00:31:48,219 --> 00:31:50,010 I això és una perfecta menjar per emportar raonable. 719 00:31:50,010 --> 00:31:51,560 Però més exactament ara. 720 00:31:51,560 --> 00:31:54,190 El que està succeint en la línia 16? 721 00:31:54,190 --> 00:31:56,170 El que està sent copiat de dreta a esquerra? 722 00:31:56,170 --> 00:31:56,669 Sí? 723 00:31:56,669 --> 00:31:58,490 AUDIÈNCIA: És t rebent una adreça de s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. Malan: Exactament, t és aconseguir la direcció de s. 725 00:32:01,220 --> 00:32:05,170 Així que per ser clar ara, si em vaig de nou a aquest exemple anterior 726 00:32:05,170 --> 00:32:08,520 i extrec el que he escrit en. 727 00:32:08,520 --> 00:32:11,640 I el que he vaig escriure en-- aquí està s, i aquí 728 00:32:11,640 --> 00:32:15,830 és el que he escrit en algun lloc de la memòria, la mare i després una barra invertida 729 00:32:15,830 --> 00:32:17,840 0 que s'agrega per a mi. 730 00:32:17,840 --> 00:32:23,060 El vaig guardar aquí, recordar, això és en la posició 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 això és el que hi ha actualment al s. 732 00:32:24,655 --> 00:32:29,220 Així que si en la línia 16, dic dóna'm una altra variable anomenada ti botiga 733 00:32:29,220 --> 00:32:33,590 en en el valor de s, el s'emmagatzema aquí no serà mare 734 00:32:33,590 --> 00:32:35,480 sinó només el número 1. 735 00:32:35,480 --> 00:32:38,520 >> Així que si mirem cap al futur en aquest programa ara, ¿què passarà? 736 00:32:38,520 --> 00:32:40,690 Així que observi que hi ha aquesta funció podria 737 00:32:40,690 --> 00:32:44,410 han fet servir aquest temps enrere per César, o Vigenère, o potser no del tot. 738 00:32:44,410 --> 00:32:48,170 Jo reclamo amb la meva printf, estic va capitalitzar la còpia t. 739 00:32:48,170 --> 00:32:51,616 Primer a la línia 19, el seny ràpida control, controls strlen la longitud del t. 740 00:32:51,616 --> 00:32:53,740 Perquè jo no vull tractar de capitalitzar alguna cosa 741 00:32:53,740 --> 00:32:55,104 si no hi ha cadena d'allà. 742 00:32:55,104 --> 00:32:57,520 Si l'usuari només cal prémer Enter, no hi ha res per treure profit. 743 00:32:57,520 --> 00:33:01,100 Així que no vull fer la línia 21. 744 00:33:01,100 --> 00:33:05,758 Així que la línia 21 està capitalitzant quina lletra, pel que sembla, en t? 745 00:33:05,758 --> 00:33:06,514 >> AUDIÈNCIA: m? 746 00:33:06,514 --> 00:33:08,722 DAVID J. Malan: Sembla com si fos la còpia quin? 747 00:33:08,722 --> 00:33:09,486 AUDIÈNCIA: m. 748 00:33:09,486 --> 00:33:10,450 DAVID J. Malan: Uh, m. 749 00:33:10,450 --> 00:33:12,685 OK, així que la primera m, degut avís que estic 750 00:33:12,685 --> 00:33:14,935 passant a ToUpper, que si mai has vist és 751 00:33:14,935 --> 00:33:16,980 només una funció de capitalitzar com la seva entrada. 752 00:33:16,980 --> 00:33:20,240 t suport de zero significa donar em el caràcter zero del t. 753 00:33:20,240 --> 00:33:22,550 I llavors, com funciona això canvi d'imatge, per ser clar? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Què es necessita per ser reescrit o modificat respecte de s i t i la mare 756 00:33:29,160 --> 00:33:30,097 zero barra invertida. 757 00:33:30,097 --> 00:33:31,470 >> AUDIÈNCIA: [inaudible] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. Malan: Sí, així que aquest aquí simplement 759 00:33:34,030 --> 00:33:40,860 necessita per canviar-A-- fixar esto-- ha de canviar-se a una capital m. 760 00:33:40,860 --> 00:33:44,330 Però ara, i mira endavant en el programa, si imprimeixo 761 00:33:44,330 --> 00:33:49,800 s i t com puc netejar aquí, veure el que hi ha passarà imprimint s i t. 762 00:33:49,800 --> 00:33:54,310 Així que copia-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Déjame anar endavant i escric en mare en minúscules. 764 00:33:57,140 --> 00:34:00,140 Observi l'original i la còpia s'han capitalitzat. 765 00:34:00,140 --> 00:34:00,850 Per què? 766 00:34:00,850 --> 00:34:04,431 Bé, s i t són els dos apunten a, si es vol, la mateixa quantitat de memòria. 767 00:34:04,431 --> 00:34:06,930 I, francament, això s'està posant Realment uninteresting-- el fet 768 00:34:06,930 --> 00:34:09,150 que estem utilitzant zero direcció aquí. 769 00:34:09,150 --> 00:34:11,719 Vull dir, no m'importa on la matèria està en la memòria. 770 00:34:11,719 --> 00:34:13,550 Ho sento, estic esborrant una mica massa. 771 00:34:13,550 --> 00:34:15,674 Però jo no m'importa on són les coses a la memòria. 772 00:34:15,674 --> 00:34:18,510 I així, de fet, el que programadors tendeixen a pensar 773 00:34:18,510 --> 00:34:21,080 és que quan es parla de una adreça, o un punter, 774 00:34:21,080 --> 00:34:22,679 a qui li importa on està en la memòria. 775 00:34:22,679 --> 00:34:24,989 No m'importa si és en byte un o mil milions. 776 00:34:24,989 --> 00:34:27,920 Jo només m'importa que aquesta variable és efectivament 777 00:34:27,920 --> 00:34:29,620 assenyalant en aquest tros de memòria. 778 00:34:29,620 --> 00:34:33,350 I així, a partir d'ara, en lloc d'objecció sobre les adreces de memòria arbitràries, anem a 779 00:34:33,350 --> 00:34:36,710 simplement començar a dibuixar punters com punters, com fletxes. 780 00:34:36,710 --> 00:34:39,340 Així que el que S i T són en realitat, d'acord amb aquest programa, 781 00:34:39,340 --> 00:34:42,130 per la forma en què he creat t, és només dues variables separades 782 00:34:42,130 --> 00:34:43,840 assenyalant al mateix tros de memòria. 783 00:34:43,840 --> 00:34:45,215 I no ens importa on es trobin. 784 00:34:45,215 --> 00:34:47,130 Així que podem abstreure aquest detall. 785 00:34:47,130 --> 00:34:48,780 >> Llavors, com puc solucionar això? 786 00:34:48,780 --> 00:34:54,120 Si vull escriure una versió de la còpia programa que en realitat copia la cadena 787 00:34:54,120 --> 00:34:56,840 i capitalitza només el còpia, simplement intuïtivament, 788 00:34:56,840 --> 00:34:59,766 el que ha d'haver una ingredient per a la nostra solució? 789 00:34:59,766 --> 00:35:00,640 AUDIÈNCIA: [inaudible] 790 00:35:00,640 --> 00:35:01,420 DAVID J. Malan: Necessitem un què? 791 00:35:01,420 --> 00:35:01,820 AUDIÈNCIA: Tros de la memòria. 792 00:35:01,820 --> 00:35:03,280 DAVID J. Malan: Necessitem altra part de la memòria, no? 793 00:35:03,280 --> 00:35:05,360 No sabem com fer-ho, però, necessàriament. 794 00:35:05,360 --> 00:35:11,330 Però quin tipus de necessitat que això passi de manera que la mare original en cas de baixa 795 00:35:11,330 --> 00:35:14,170 acaba en aquest tros extra de memòria. 796 00:35:14,170 --> 00:35:19,770 I després quan canvi la còpia, jo no volen canviar aquesta còpia aquí. 797 00:35:19,770 --> 00:35:26,020 Jo en canvi vull canviar només això còpia perquè l'original no es modifica. 798 00:35:26,020 --> 00:35:27,980 >> Així que, anem a veure com podem fer això. 799 00:35:27,980 --> 00:35:31,800 En copy-1, que ja té estat desposseït de comentari, 800 00:35:31,800 --> 00:35:33,250 però es comenta en línia. 801 00:35:33,250 --> 00:35:36,710 En el seu lloc fem la following-- aquests línies són idèntics, porta-me'n una cadena 802 00:35:36,710 --> 00:35:38,340 i en diuen és. 803 00:35:38,340 --> 00:35:43,500 Però ara anem a veure un dels nostres més complex, però l'últim de la complexitat 804 00:35:43,500 --> 00:35:47,340 per un temps, la línia 16 fa exactament això. 805 00:35:47,340 --> 00:35:49,400 Així que si la seva còmoda, amb la foto acabem drew-- 806 00:35:49,400 --> 00:35:51,790 dóna'm un nou tros de memòria, copiar tot en ell, 807 00:35:51,790 --> 00:35:53,730 anem a veure com traduïm això a codi. 808 00:35:53,730 --> 00:35:59,400 >> Així que la línia 16, al costat de la mà esquerra, char * t em dóna aquesta caixa aquí. 809 00:35:59,400 --> 00:36:00,230 Això és tot el que fa. 810 00:36:00,230 --> 00:36:03,240 A la part dreta, m alloc o malloc, 811 00:36:03,240 --> 00:36:06,480 és l'assignació de memòria, super luxós, una forma críptica de dir simplement 812 00:36:06,480 --> 00:36:07,640 dóna'm un tros de memòria. 813 00:36:07,640 --> 00:36:09,290 Quanta memòria necessitem? 814 00:36:09,290 --> 00:36:10,910 Bé, és una mena de gran expressió. 815 00:36:10,910 --> 00:36:12,570 Però anem a veure el que diu aquí. 816 00:36:12,570 --> 00:36:15,940 Així que això, per descomptat, és donar me la longitud de cadena del s. 817 00:36:15,940 --> 00:36:19,094 Així, la mare ha de ser què? 818 00:36:19,094 --> 00:36:21,010 Així que només tres, no? mare és de tres caràcters. 819 00:36:21,010 --> 00:36:22,830 No comptem el barra invertida zero quan 820 00:36:22,830 --> 00:36:25,960 parlar de la longitud d'una cadena que és en realitat les lletres visibles humans. 821 00:36:25,960 --> 00:36:28,020 Així que la mare, així que això em dóna 3. 822 00:36:28,020 --> 00:36:31,170 Però esperi un minut, jo ara estic afegint 1. 823 00:36:31,170 --> 00:36:34,861 Per què en realitat vull assignar els 4 bytes i no només 3? 824 00:36:34,861 --> 00:36:35,360 Sí? 825 00:36:35,360 --> 00:36:36,910 >> AUDIÈNCIA: Per al valor sentinella? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. Malan: Exactament, per aquest valor sentinella. 827 00:36:38,951 --> 00:36:40,840 Per a la barra invertida zero, Necessito 4 bytes en total. 828 00:36:40,840 --> 00:36:42,870 Així que necessito la longitud de la cadena més 1. 829 00:36:42,870 --> 00:36:45,400 I a continuació, només per al bé measure-- tot i que en aquest sistema, 830 00:36:45,400 --> 00:36:49,390 Sempre serà 1-- que estic dient multiplicar aquest per la grandària d'un char. 831 00:36:49,390 --> 00:36:51,552 Resulta que és sizeof un operador en C que 832 00:36:51,552 --> 00:36:53,260 només te la diu nombre de bytes que és 833 00:36:53,260 --> 00:36:54,700 requerida per a un cert tipus de dades. 834 00:36:54,700 --> 00:36:57,740 No funciona per a les matrius, típicament, de vegades ho fa. 835 00:36:57,740 --> 00:36:59,210 Però en el cas general, no. 836 00:36:59,210 --> 00:37:02,330 Però em dirà quants bytes d'un Char és, que resulta és sempre 1. 837 00:37:02,330 --> 00:37:04,080 Així que això és com multiplicar per 1. 838 00:37:04,080 --> 00:37:05,900 >> Línia de mira tan super críptica de codi. 839 00:37:05,900 --> 00:37:09,320 Però tot el que fa és dóna mi un tros de memòria. 840 00:37:09,320 --> 00:37:13,590 Però tampoc sembla estar copiant res en aquesta memòria? 841 00:37:13,590 --> 00:37:14,560 Encara no. 842 00:37:14,560 --> 00:37:22,040 I així, què tinc a la línia 22 i 23, 24, 25, bé, jo simplement faig això. 843 00:37:22,040 --> 00:37:23,760 I això és una espècie de antic coses de l'escola ara. 844 00:37:23,760 --> 00:37:26,010 Això és com PSet 2, on estàs movent coses 845 00:37:26,010 --> 00:37:28,620 voltant en la memòria, o més aviat en les cadenes. 846 00:37:28,620 --> 00:37:31,920 >> Així que estic iteració de 0 a la longitud de la cadena s. 847 00:37:31,920 --> 00:37:37,820 I estic copiant el caràcter d'ordre i en s en el caràcter d'ordre i en t. 848 00:37:37,820 --> 00:37:41,820 I perquè jo, el programador, va fer Assegureu-vos d'assignar exactament tants bytes 849 00:37:41,820 --> 00:37:44,600 ja que necessito, és perfecte un-a-one relació. 850 00:37:44,600 --> 00:37:47,060 I copio mare en minúscules a la nova. 851 00:37:47,060 --> 00:37:50,170 I després, finalment, faig aquesta línia. 852 00:37:50,170 --> 00:37:54,637 I pel que l'efecte és només per capitalitzar aquest t aquí. 853 00:37:54,637 --> 00:37:56,470 Així que molt d'absorbir, però si només consideres 854 00:37:56,470 --> 00:37:58,220 el que realment està passant de sota el capó 855 00:37:58,220 --> 00:38:00,880 s'acaba de moure aquests bytes voltant, tot el que 856 00:38:00,880 --> 00:38:06,617 que es necessita per resoldre aquest problema és just per donar a aquest tros de la memòria. 857 00:38:06,617 --> 00:38:08,450 Ara amb el risc de aclaparadora, deixa mostrar 858 00:38:08,450 --> 00:38:13,200 un altre exemple que és gairebé idèntica, a excepció d'aquest 859 00:38:13,200 --> 00:38:14,350 línia de codi. 860 00:38:14,350 --> 00:38:18,870 Així que aquesta és la versió pirata d'aquest programa, si es vol. 861 00:38:18,870 --> 00:38:21,050 Però anem a destil·lar en el que està passant. 862 00:38:21,050 --> 00:38:28,920 Línia 24 solia ser aquest t suport d'I aconsegueix s abraçadora i. 863 00:38:28,920 --> 00:38:33,370 Ara, vaig a canviar això a l'estrella molt més críptic t 864 00:38:33,370 --> 00:38:36,280 més 1 és igual a l'estrella s més 1. 865 00:38:36,280 --> 00:38:38,702 >> Així que el que està passant i per què tenim un personatge estrella? 866 00:38:38,702 --> 00:38:41,410 Hem vist l'estrella abans, i s'està utilitzant de manera diferent aquí. 867 00:38:41,410 --> 00:38:45,490 Anteriorment vam veure char *, ara que estic veient Una estrella al principi, i això està bé. 868 00:38:45,490 --> 00:38:48,190 Perquè resulta que pot tipus d'inferir només 869 00:38:48,190 --> 00:38:50,280 dels primer principis del que està passant. 870 00:38:50,280 --> 00:38:53,860 Així que perquè quedi clar, el que és s? 871 00:38:53,860 --> 00:38:55,052 La setmana passada, era una cadena. 872 00:38:55,052 --> 00:38:56,260 Això no n'hi ha prou. 873 00:38:56,260 --> 00:38:57,690 Què és s, específicament? 874 00:38:57,690 --> 00:38:58,590 >> AUDIÈNCIA: [inaudible] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. Malan: És un punter. 876 00:38:59,881 --> 00:39:02,610 És l'adreça del primer caràcter que va escriure en. 877 00:39:02,610 --> 00:39:04,780 OK, quin és t? 878 00:39:04,780 --> 00:39:05,660 >> AUDIÈNCIA: [inaudible] 879 00:39:05,660 --> 00:39:07,950 >> DAVID J. Malan: La direcció del primer byte 880 00:39:07,950 --> 00:39:10,490 en t, que parteix de la memòria reasignada. 881 00:39:10,490 --> 00:39:14,720 Així que resulta que quan iterar des de 0 fins a la cadena 882 00:39:14,720 --> 00:39:17,424 longitud-- en primer lloc, i comença a 0, ja que 883 00:39:17,424 --> 00:39:18,840 d'aquesta vella escola pel bucle. 884 00:39:18,840 --> 00:39:22,400 Així que per simplicitat, anem a assumir que la primera línia de codi 885 00:39:22,400 --> 00:39:23,760 és realment només això, la dreta. 886 00:39:23,760 --> 00:39:26,080 Si i és zero, afegint zero a alguna cosa presumiblement 887 00:39:26,080 --> 00:39:27,540 no va a tenir un efecte. 888 00:39:27,540 --> 00:39:28,560 >> Llavors, què és aquesta paraula? 889 00:39:28,560 --> 00:39:31,600 Resulta que l'estrella operador en aquest context 890 00:39:31,600 --> 00:39:33,700 és la dereference operador, que és just 891 00:39:33,700 --> 00:39:37,530 una forma elegant de dir anar a la següent adreça. 892 00:39:37,530 --> 00:39:42,080 Així que si s és la direcció de la primera personatge en aquesta part de la memòria, 893 00:39:42,080 --> 00:39:43,630 * S mitjans hi van. 894 00:39:43,630 --> 00:39:45,630 I perquè hem dibuixat la imatge d'aquesta manera, 895 00:39:45,630 --> 00:39:47,430 pot adoptar el següent model mental. 896 00:39:47,430 --> 00:39:51,030 Si això és s, i dius * s * s, alguna cosa així com rampes i escales, 897 00:39:51,030 --> 00:39:54,540 si vostè recorda el joc de la infància, és com seguir la fletxa i anar 898 00:39:54,540 --> 00:39:55,570 a la direcció. 899 00:39:55,570 --> 00:39:57,080 >> * T és la mateixa cosa. 900 00:39:57,080 --> 00:39:59,855 Així que comença aquí, aneu al seu tros. 901 00:39:59,855 --> 00:40:03,350 No puc dibuixar en aquesta pantalla d'aquesta manera. 902 00:40:03,350 --> 00:40:05,560 * T vol dir anar aquí. 903 00:40:05,560 --> 00:40:08,830 I després, el bucle for és només dient moure aquest personatge aquí, 904 00:40:08,830 --> 00:40:11,330 moure aquest personatge aquí, moure aquest personatge aquí. 905 00:40:11,330 --> 00:40:12,890 Però, com ho faig incrementación? 906 00:40:12,890 --> 00:40:15,430 He de desfer el que acaba d'eliminar. 907 00:40:15,430 --> 00:40:18,140 Això és el que normalment es coneix aritmètica de punters, que 908 00:40:18,140 --> 00:40:20,040 significa matemàtiques amb direccions. 909 00:40:20,040 --> 00:40:22,460 >> Si, en aquest bucle, Segueixo incrementant i, 910 00:40:22,460 --> 00:40:26,880 i s és una adreça i t és un direcció, si jo segueixo afegint 1, 911 00:40:26,880 --> 00:40:31,406 això només significa seguir endavant, i cap endavant, i endavant en la memòria. 912 00:40:31,406 --> 00:40:34,030 És com Oxford Street, el carrer que l'edifici està en CS. 913 00:40:34,030 --> 00:40:36,490 Els edificis CS està en 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Així que si anés a fer 33 Oxford Street, més 1, 915 00:40:39,870 --> 00:40:42,870 que porta a 34 Oxford Street, després 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 llavors 36 Oxford Street, qualssevol que edificis són en realitat - si és que existeixen. 917 00:40:46,380 --> 00:40:50,540 I així, això és tot el que estem fent aquí amb l'aritmètica de punters. 918 00:40:50,540 --> 00:40:53,820 >> Així que és una manera estupenda arcana d'expressar-nos. 919 00:40:53,820 --> 00:40:56,160 Però tot el que està succeint sota de la campana 920 00:40:56,160 --> 00:40:59,330 és només seguir aquestes direccions, com seguir un mapa, si es vol, 921 00:40:59,330 --> 00:41:02,692 o seguint les fletxes com hem dibuixat a la pantalla. 922 00:41:02,692 --> 00:41:04,910 OK, una gran quantitat de digerir. 923 00:41:04,910 --> 00:41:10,410 Qualsevol pregunta sobre la sintaxi, els conceptes, punters, malloc, o similars. 924 00:41:10,410 --> 00:41:11,480 Sí, per aquí primer. 925 00:41:11,480 --> 00:41:13,755 >> AUDIÈNCIA: Llavors, on que diu * t és igual a ToUpper * t, 926 00:41:13,755 --> 00:41:15,575 és que va a capitalitzar totes les lletres o sol-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. Malan: Ah, molt bona pregunta. 928 00:41:17,283 --> 00:41:19,805 Així que en aquesta línia d'aquí, 31, ¿Això va a capitalitzar 929 00:41:19,805 --> 00:41:21,430 la primera lletra o la totalitat de les lletres. 930 00:41:21,430 --> 00:41:23,460 Així que anem a respondre que a l'anar tornar als primers principis. 931 00:41:23,460 --> 00:41:26,168 I els primers principis aquí em refereixo només cal anar a les definicions bàsiques 932 00:41:26,168 --> 00:41:27,000 del que està involucrat. 933 00:41:27,000 --> 00:41:29,770 Així ToUpper és una funció que capitalitza un char. 934 00:41:29,770 --> 00:41:30,530 Això és tot. 935 00:41:30,530 --> 00:41:36,740 * T vol dir anar al primer-- anar a la direcció en t. 936 00:41:36,740 --> 00:41:40,350 Per tant, en la imatge, si aquest és el tros de la memòria ens van assignar amb malloc, 937 00:41:40,350 --> 00:41:43,310 i això és t, * t vol dir anar aquí. 938 00:41:43,310 --> 00:41:46,710 >> Mentrestant, vostè està passant aquest valor, minúscules m 939 00:41:46,710 --> 00:41:50,040 a ToUpper, que està rebent de tornada M majúscula, on estàs posant ell? 940 00:41:50,040 --> 00:41:52,410 Estàs posant en aquest mateix lloc. 941 00:41:52,410 --> 00:41:55,540 I així perquè la lògica d'aquells definicions bàsiques és només 942 00:41:55,540 --> 00:41:58,792 majúscula la primera lletra llevat que iterar amb i o un 943 00:41:58,792 --> 00:42:02,000 de llaç o un bucle while, no va per fer alguna cosa més del que demanes. 944 00:42:02,000 --> 00:42:02,583 Bona pregunta. 945 00:42:02,583 --> 00:42:03,237 Sí? 946 00:42:03,237 --> 00:42:05,369 >> AUDIÈNCIA: Per què s'utilitza el dereference mètode en lloc de 947 00:42:05,369 --> 00:42:05,979 la matriu? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. Malan: Ah, bona pregunta. 949 00:42:07,395 --> 00:42:10,672 Per què utilitzar el dereference mètode en lloc del mètode de matriu? 950 00:42:10,672 --> 00:42:12,130 No hi ha cap raó en particular, per ser honest. 951 00:42:12,130 --> 00:42:15,290 I, de fet, per a aquest classe d'exemple, a la dreta, 952 00:42:15,290 --> 00:42:17,556 Només estic argumentant fer la programa més complicat, 953 00:42:17,556 --> 00:42:19,680 més ulls estan vidriosos, la gent està mirant 954 00:42:19,680 --> 00:42:22,830 perquè això es veu super arcà, però tot i que està fent el mateix. 955 00:42:22,830 --> 00:42:26,695 I així, francament, es tracta d'una solució innecessàriament visualment complexa 956 00:42:26,695 --> 00:42:27,320 al problema. 957 00:42:27,320 --> 00:42:29,580 >> Segueix sent un bon disseny, cinc de cinc per al disseny, 958 00:42:29,580 --> 00:42:33,140 ja sigui en el suport notació o la notació punter. 959 00:42:33,140 --> 00:42:36,299 Però- especialment quan arribem més tard en el curs de PSet maig 960 00:42:36,299 --> 00:42:39,340 quan posem en pràctica aquest diccionari que He esmentat un parell de vegades-- 961 00:42:39,340 --> 00:42:42,300 anem realment es preocupen per la adreces de memòria de baix nivell 962 00:42:42,300 --> 00:42:44,140 que realment entenem què està passant. 963 00:42:44,140 --> 00:42:48,300 >> Però, per ara, resulta que aquesta línia de codi entre parèntesis aquí quadrats 964 00:42:48,300 --> 00:42:49,900 en realitat no existeix. 965 00:42:49,900 --> 00:42:52,230 Ells són el que s'anomena sucre sintàctic, que 966 00:42:52,230 --> 00:42:58,390 és només una manera estranyament freda de dir la compilador converteix claudàtors siguin 967 00:42:58,390 --> 00:43:00,420 que l'expressió matemàtica. 968 00:43:00,420 --> 00:43:02,660 Així que és una convenció humana per poder simplement escriure 969 00:43:02,660 --> 00:43:04,220 aquests suports molt fàcil d'utilitzar. 970 00:43:04,220 --> 00:43:06,850 Però el que el compilador, so metàl·lic, que realment està fent qualsevol moment 971 00:43:06,850 --> 00:43:10,970 escriviu el que està ressaltat en línia 24, sota la capella que és realment 972 00:43:10,970 --> 00:43:12,330 la conversió a això. 973 00:43:12,330 --> 00:43:16,200 És només més plaent com un ésser humà a llegir i escriure codi com la línia 24. 974 00:43:16,200 --> 00:43:18,530 Però amb el temps els rodes d'entrenament també es desprenen 975 00:43:18,530 --> 00:43:21,780 quan la pròpia comoditat es fa més fort. 976 00:43:21,780 --> 00:43:27,240 >> Molt bé, així que recordar llavors que aquest Era el tipus de problema més gran 977 00:43:27,240 --> 00:43:27,807 ens trobem. 978 00:43:27,807 --> 00:43:30,640 I això és el que va provocar tot aquest maleïda conversa sobre els punters, 979 00:43:30,640 --> 00:43:32,340 i adreces, i coses d'copiat. 980 00:43:32,340 --> 00:43:35,410 Va ser perquè ens va espatllar sobre aquesta estúpida, estúpida qüestió, de manera que 981 00:43:35,410 --> 00:43:38,830 He implementat logically-- amb Lauren aquí a la demo i el suc de taronja 982 00:43:38,830 --> 00:43:43,770 en el milk-- 1 perfectament funció algorísmica correcta 983 00:43:43,770 --> 00:43:47,010 per al bombament de dues variables ' valors, però la maleïda cosa 984 00:43:47,010 --> 00:43:50,550 no tenia cap persistent o permanent, efecte en el meu codi. 985 00:43:50,550 --> 00:43:51,820 >> ¿I per què va ser això? 986 00:43:51,820 --> 00:43:54,650 En poques paraules, per què és això implementació de bescanvi 987 00:43:54,650 --> 00:43:58,740 lògicament correcte, però no té cap impacte sobre les variables que es passen a la mateixa, 988 00:43:58,740 --> 00:44:01,119 com x i y per a la principal? 989 00:44:01,119 --> 00:44:02,410 Quina va ser l'essència de la qüestió? 990 00:44:02,410 --> 00:44:02,909 Sí? 991 00:44:02,909 --> 00:44:05,532 AUDIÈNCIA: A causa de la variable fa còpies de la variable en la passada 992 00:44:05,532 --> 00:44:06,240 a través de la funció. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. Malan: Exactament, quan es passa variables en una funció, o arguments 994 00:44:09,060 --> 00:44:11,030 en una funció, són aprovada per còpia, que 995 00:44:11,030 --> 00:44:14,770 vol dir que vostè obté un aspecte idèntic patró de bits per a tots dos X i Y, 996 00:44:14,770 --> 00:44:15,955 anomenat aquí a i b. 997 00:44:15,955 --> 00:44:18,080 I vostè pot fer qualsevol cosa que vulgui amb aquestes còpies, 998 00:44:18,080 --> 00:44:20,657 però van a tenir cap efecte sobre la funció de trucada. 999 00:44:20,657 --> 00:44:22,990 I, de fet, dibuixem que imatge a la pantalla, el record 1000 00:44:22,990 --> 00:44:25,520 l'última vegada, pel que si vostè realment pensar en el que és 1001 00:44:25,520 --> 00:44:28,570 passant per sota de la hood-- si això és la memòria de l'equip, 1002 00:44:28,570 --> 00:44:31,650 i aquí hi ha la part de memòria que s'utilitza per al principal, 1003 00:44:31,650 --> 00:44:34,020 aquesta és la part de memòria que s'utilitza per a l'intercanvi, 1004 00:44:34,020 --> 00:44:37,090 i té pel que fins i tot si principal dues variables, X i Y, 1005 00:44:37,090 --> 00:44:41,840 intercanvi podria tenir mirant idèntica valors, tots dos dels quals són 1 i 2, 1006 00:44:41,840 --> 00:44:44,520 però són completament diferents trossos de memòria. 1007 00:44:44,520 --> 00:44:46,130 >> Així que tenim una solució a això. 1008 00:44:46,130 --> 00:44:51,580 I, francament, sembla que ara tenir una solució a aquest problema, a la dreta. 1009 00:44:51,580 --> 00:44:55,760 Si ara tenim la capacitat de manipular les coses a través de les adreces 1010 00:44:55,760 --> 00:44:59,310 i, tipus de rampes i escales estil, seguiu aquestes fletxes 1011 00:44:59,310 --> 00:45:02,820 i anar a on vulguem en la memòria, ¿no ens 1012 00:45:02,820 --> 00:45:06,220 resoldre aquest problema passant de principal per intercanviar 1013 00:45:06,220 --> 00:45:09,650 no els valors que volen swap, però només intuïtivament 1014 00:45:09,650 --> 00:45:11,630 ¿Què podríem passar per canviar el seu lloc? 1015 00:45:11,630 --> 00:45:12,620 >> [Interposant VEUS] 1016 00:45:12,620 --> 00:45:15,244 >> DAVID J. Malan: Per què no ho fem només passar-ho les direccions, oi? 1017 00:45:15,244 --> 00:45:17,470 Per què no li donem una permuta mapa del tresor, si es vol, 1018 00:45:17,470 --> 00:45:20,950 que condueix a la valors reals x i y. 1019 00:45:20,950 --> 00:45:24,340 Anem swap, en realitat canviar aquests bits originals, en lloc de 1020 00:45:24,340 --> 00:45:26,797 de pas còpies dels bits. 1021 00:45:26,797 --> 00:45:29,130 I així, de fet, això és el que hi ha serà la solució. 1022 00:45:29,130 --> 00:45:31,899 Aquesta versió aquí és clarament dolent i defectuós. 1023 00:45:31,899 --> 00:45:35,190 I ara, a primera vista, que només es veu com hem afegit un munt d'estrelles a l'atzar 1024 00:45:35,190 --> 00:45:37,106 i va creuar els dits que seria compilar. 1025 00:45:37,106 --> 00:45:38,460 Però, seria ara compilar. 1026 00:45:38,460 --> 00:45:40,090 >> Però anem a veure què vol dir això. 1027 00:45:40,090 --> 00:45:43,990 I, per desgràcia, els autors de C podria haver triat un altre símbol 1028 00:45:43,990 --> 00:45:46,380 per fer això una mica més clara, però l'operador estrella 1029 00:45:46,380 --> 00:45:48,610 té significat diferent en dos contextos diferents. 1030 00:45:48,610 --> 00:45:50,890 I hem vist tant, però anem a distingir. 1031 00:45:50,890 --> 00:45:55,310 >> Així que a la part superior hi ha, quan he canviat a i b 1032 00:45:55,310 --> 00:46:00,470 de ser int de la mala versió a int estrelles, a i b, 1033 00:46:00,470 --> 00:46:01,740 Anteriorment, es sencers. 1034 00:46:01,740 --> 00:46:05,752 Quins són aib ara el bé, la versió verda? 1035 00:46:05,752 --> 00:46:06,900 Són direccions. 1036 00:46:06,900 --> 00:46:09,610 Direccions del que, per ser clar? 1037 00:46:09,610 --> 00:46:10,770 Adreces de nombres enters. 1038 00:46:10,770 --> 00:46:12,520 Així que el fet que sóc dient mitjans int estrella 1039 00:46:12,520 --> 00:46:15,440 aquesta és l'adreça de un enter, específicament. 1040 00:46:15,440 --> 00:46:19,120 >> Així que ara compte en les línies de codi, alguna cosa més ha canviat gaire. 1041 00:46:19,120 --> 00:46:22,770 tmp segueix sent el mateix, perquè és sols un nombre sencer temporal, 1042 00:46:22,770 --> 00:46:24,110 hi ha màgia memòria allí. 1043 00:46:24,110 --> 00:46:26,370 Però ara necessita una estrella. 1044 00:46:26,370 --> 00:46:28,560 I, de fet, cada una altra menció de a i b, 1045 00:46:28,560 --> 00:46:31,780 adonar que tot el que és canviar de vermell a verd 1046 00:46:31,780 --> 00:46:34,209 és que estic anteposant les variables amb les estrelles. 1047 00:46:34,209 --> 00:46:35,750 Perquè jo no vull copiar a i b. 1048 00:46:35,750 --> 00:46:40,350 Perquè si jo copio a i b i d'intercanvi aib, què estic fet el canvi? 1049 00:46:40,350 --> 00:46:43,760 A només direccions, vull canviar el que està en aquestes direccions. 1050 00:46:43,760 --> 00:46:44,860 Vull anar-hi. 1051 00:46:44,860 --> 00:46:48,000 I pel que l'operador de l'estrella dins de la meva funció, 1052 00:46:48,000 --> 00:46:51,700 no dins de la llista de paràmetres, implica que vagi a aquestes adreces 1053 00:46:51,700 --> 00:46:54,490 i en realitat canviar aquests valors. 1054 00:46:54,490 --> 00:46:56,500 >> Llavors, què fa la foto ara veurà com el seu lloc. 1055 00:46:56,500 --> 00:47:03,250 Bé, si en comptes estic passant per A i B no 1 i 2-- 1056 00:47:03,250 --> 00:47:05,790 Jo realment necessito afegir una altra definició aquí. 1057 00:47:05,790 --> 00:47:09,030 Així que suposo que aquest tros de la memòria està en la posició 10. 1058 00:47:09,030 --> 00:47:12,960 >> Això és en la posició 11, però això és una mica d'una simplificació, 1059 00:47:12,960 --> 00:47:18,900 Ara tinc dues opcions fan que passi x ei o puc passar les seves adreces? 1060 00:47:18,900 --> 00:47:22,500 Si pas les seves adreces com aquest, només 1061 00:47:22,500 --> 00:47:25,390 ara hem de posar en pràctica intercanvi pel codi de color verd 1062 00:47:25,390 --> 00:47:29,080 de manera que quan es veu una i quan b veu, no només has de copiar a i b 1063 00:47:29,080 --> 00:47:30,540 i moure la llet i suc de taronja. 1064 00:47:30,540 --> 00:47:32,664 El suc de la llet i taronja metàfora ara es trenca, 1065 00:47:32,664 --> 00:47:35,060 perquè aquestes són les tasses dels mapes de líquids i no. 1066 00:47:35,060 --> 00:47:37,750 Nosaltres en canvi hem d'anar per fer front a 10 i ens 1067 00:47:37,750 --> 00:47:42,420 hagi d'anar al front 11, i a continuació, realitzar aquesta lògica intercanvi. 1068 00:47:42,420 --> 00:47:45,580 >> Així que la lògica és la mateixa, però necessitem una manera lleugerament diferent 1069 00:47:45,580 --> 00:47:47,160 d'accedir a aquestes variables. 1070 00:47:47,160 --> 00:47:52,400 I així, al final, el que el programa s'ha de veure com és això. 1071 00:47:52,400 --> 00:47:56,610 En swap.c copiat literalment, i enganxar la versió verda. 1072 00:47:56,610 --> 00:47:58,450 Però he de fer un canvi. 1073 00:47:58,450 --> 00:48:00,180 No n'hi ha prou només per canviar d'intercanvi. 1074 00:48:00,180 --> 00:48:03,830 Quina altra línia de codi Què he de canviar? 1075 00:48:03,830 --> 00:48:04,330 Sí? 1076 00:48:04,330 --> 00:48:05,770 >> AUDIÈNCIA: On pren els arguments. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. Malan: On pren el seu argument. 1078 00:48:07,603 --> 00:48:09,985 Així que si em desplaço fins principal, em no només pot passar en x i y, 1079 00:48:09,985 --> 00:48:12,820 i, ho prometo, l'última peça de nova sintaxi avui. 1080 00:48:12,820 --> 00:48:17,200 He de passar no xi i, però la direcció de x i y. 1081 00:48:17,200 --> 00:48:20,400 I resulta que, el símbol que els autors de C van escollir 1082 00:48:20,400 --> 00:48:23,860 és si s'utilitza un signe aquí, no per s'ha de confondre amb el signe bit a bit, 1083 00:48:23,860 --> 00:48:27,130 si s'utilitza un símbol d'unió aquí i un signe aquí, 1084 00:48:27,130 --> 00:48:29,570 això s'adona que, ¿Quina és la direcció de x, 1085 00:48:29,570 --> 00:48:31,740 potser és 10, quin és el direcció de i, potser és 1086 00:48:31,740 --> 00:48:35,400 11, i passa aquells al seu lloc. 1087 00:48:35,400 --> 00:48:37,210 >> Així que molt d'absorbir tots alhora. 1088 00:48:37,210 --> 00:48:40,190 Però vegem ara ràpidament els nostres quatre minuts per al final 1089 00:48:40,190 --> 00:48:42,150 on les coses poden sortir malament. 1090 00:48:42,150 --> 00:48:45,120 I com un a part, en realitat Vaig prendre aquesta imatge, 1091 00:48:45,120 --> 00:48:46,920 TF va prendre aquesta fotografia d'un any o dos enrere. 1092 00:48:46,920 --> 00:48:49,190 Així que aquesta és la cantonada posterior d'Eliot Dining Hall. 1093 00:48:49,190 --> 00:48:52,310 Els punters són potser els més difícils tema que cobrim en CS50. 1094 00:48:52,310 --> 00:48:54,810 Així que si vostè es preocupa el tipus del pendent és com potser és 1095 00:48:54,810 --> 00:48:56,770 més d'un pal d'hoquei així, donar-se compte 1096 00:48:56,770 --> 00:49:00,160 estem a punt de tipus d'un pic a termes de la complexitat conceptual. 1097 00:49:00,160 --> 00:49:02,300 >> I porto a col·lació aquest foto, perquè et juro 1098 00:49:02,300 --> 00:49:05,920 a déu, en la tardor de 1996, quan vaig prendre CS50 amb el meu company d'ensenyament, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, em va asseure a la cantonada del Eliot D. Hall durant el dinar, 1100 00:49:09,620 --> 00:49:12,330 o el sopar, o alguna cosa per intentar per ajudar-me a entendre punters. 1101 00:49:12,330 --> 00:49:16,520 I aquí és on vaig estar setmanes després que es va introduir en la conferència quan 1102 00:49:16,520 --> 00:49:18,170 Finalment vaig entendre punters. 1103 00:49:18,170 --> 00:49:20,590 I tinc l'esperança que aquest farem clic molt abans per a vostè. 1104 00:49:20,590 --> 00:49:23,540 Però adonar-se'n absolutament entre els temes més sofisticats 1105 00:49:23,540 --> 00:49:24,420 hem vist. 1106 00:49:24,420 --> 00:49:25,819 Però és un dels més poderosos. 1107 00:49:25,819 --> 00:49:28,860 I quan ho aconsegueixes, és realment tot només va a finalment s'uneixen. 1108 00:49:28,860 --> 00:49:31,460 Així que pot estar segur que no ho fa necessitarà tota lavabo a l'actualitat. 1109 00:49:31,460 --> 00:49:32,980 >> Així que aquí està l'últim programa veurem. 1110 00:49:32,980 --> 00:49:35,605 I anem a acabar amb una ràpids tres minuts d'animació amb plastilina 1111 00:49:35,605 --> 00:49:37,030 presa per el nostre amic, Nick Parlant. 1112 00:49:37,030 --> 00:49:41,440 Aquí hi ha un programa, que en els dos primers línies declara una variable x i y. 1113 00:49:41,440 --> 00:49:44,780 Tots dos dels quals són adreces d'enters, punters AKA. 1114 00:49:44,780 --> 00:49:48,125 A continuació, assignar suficient memòria per emmagatzemar un int 1115 00:49:48,125 --> 00:49:51,344 i emmagatzemar la direcció que la memòria en x. 1116 00:49:51,344 --> 00:49:53,260 Per tant, és encara més simple que l'exemple anterior. 1117 00:49:53,260 --> 00:49:56,100 Dóna'm 4 bytes de memòria, aquest és la mida d'un int, 1118 00:49:56,100 --> 00:49:58,000 i posar aquesta direcció en x. 1119 00:49:58,000 --> 00:50:01,070 Aquesta línia vol dir aquí anar a l'adreça de x 1120 00:50:01,070 --> 00:50:05,270 i posar el significat de la vida, el número 42 allà. 1121 00:50:05,270 --> 00:50:07,710 Però aquesta línia em preocupa. 1122 00:50:07,710 --> 00:50:12,620 Star i significa anar a la direcció en i, i posar el nombre de mala sort 13 allà. 1123 00:50:12,620 --> 00:50:15,780 Per què és perillós, en aquest punt en la història- encara que va dir ràpidament 1124 00:50:15,780 --> 00:50:17,980 en els nostres últims minuts aquí-- per què és dolent 1125 00:50:17,980 --> 00:50:19,660 per a mi dir, anar a la direcció d'i? 1126 00:50:19,660 --> 00:50:21,077 >> AUDIÈNCIA: No té [inaudible]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. Malan: Jo no tinc posar res en i. 1128 00:50:22,910 --> 00:50:25,520 Llavors, quin és el valor de i, en aquest punt de la història? 1129 00:50:25,520 --> 00:50:26,570 No tenim ni idea. 1130 00:50:26,570 --> 00:50:29,190 És cert valor d'escombraries i ni sap Binky. 1131 00:50:29,190 --> 00:50:32,532 Si poguéssim acabar amb aquesta nota. 1132 00:50:32,532 --> 00:50:34,832 >> [REPRODUCCIÓ DE VÍDEO] 1133 00:50:34,832 --> 00:50:36,500 >> -Escolta, Binky, desperta. 1134 00:50:36,500 --> 00:50:39,140 És temps per a la diversió punter. 1135 00:50:39,140 --> 00:50:40,210 >> -Què és això? 1136 00:50:40,210 --> 00:50:41,690 Assabenti dels punters? 1137 00:50:41,690 --> 00:50:43,570 Oh, llaminadura. 1138 00:50:43,570 --> 00:50:46,600 >> -Bé, Per començar, crec que estem necessitarà un parell de punters. 1139 00:50:46,600 --> 00:50:47,380 >> -D'ACORD. 1140 00:50:47,380 --> 00:50:51,120 Aquest codi assigna dos punters que pot apuntar a nombres enters. 1141 00:50:51,120 --> 00:50:53,557 >> -ok, Així veig el dos punters, però ells 1142 00:50:53,557 --> 00:50:55,140 no semblen estar apuntant a res. 1143 00:50:55,140 --> 00:50:55,970 >> -Això És cert. 1144 00:50:55,970 --> 00:50:58,100 Inicialment punters no connecti amb res. 1145 00:50:58,100 --> 00:51:00,950 Les coses que apunten són anomenada pointees i la que van ser creats 1146 00:51:00,950 --> 00:51:02,330 és un pas separat. 1147 00:51:02,330 --> 00:51:03,210 >> -Oh, Dreta, dreta. 1148 00:51:03,210 --> 00:51:03,940 Ho sabia. 1149 00:51:03,940 --> 00:51:05,730 Els pointees estan separats. 1150 00:51:05,730 --> 00:51:08,310 Llavors, com assignar un pointee? 1151 00:51:08,310 --> 00:51:11,960 >> -ok, Bé aquest codi assigna un nou pointee nombre enter, 1152 00:51:11,960 --> 00:51:15,050 i aquesta part fixa xa apunten a aquesta. 1153 00:51:15,050 --> 00:51:16,240 >> -Escolta, Que es veu millor. 1154 00:51:16,240 --> 00:51:17,743 Així que faci alguna cosa. 1155 00:51:17,743 --> 00:51:23,580 >> -ok, Vaig a eliminar la referència del punter x per emmagatzemar el nombre 42 en la seva pointee. 1156 00:51:23,580 --> 00:51:27,130 Per aquest truc, necessitaré el meu vareta màgica de l'eliminació de referències. 1157 00:51:27,130 --> 00:51:30,200 >> -La Seva Vareta màgica de l'eliminació de referències? 1158 00:51:30,200 --> 00:51:32,310 Uh, això, això és genial. 1159 00:51:32,310 --> 00:51:34,270 >> -Això És el que el codi es sembla. 1160 00:51:34,270 --> 00:51:35,970 Vaig a configurar el nombre i- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SO] 1162 00:51:37,070 --> 00:51:39,140 >> -Escolta, Mira aquí va. 1163 00:51:39,140 --> 00:51:43,980 Així, fent un dereference en x segueix la fletxa per accedir al seu pointee. 1164 00:51:43,980 --> 00:51:46,150 En aquest cas, per emmagatzemar 42 allà. 1165 00:51:46,150 --> 00:51:50,700 Hey, intenteu fer servir per emmagatzemar el nombre 13 a través de l'altre punter, i. 1166 00:51:50,700 --> 00:51:51,840 >> -D'ACORD. 1167 00:51:51,840 --> 00:51:56,270 Vaig a anar per aquí ai, i obtenir el número 13 de posada en marxa. 1168 00:51:56,270 --> 00:52:00,380 I després prendre la vareta de eliminació de referències i sol-- 1169 00:52:00,380 --> 00:52:01,646 >> [Buzzer SOUND] 1170 00:52:01,646 --> 00:52:04,080 >> Oh, bé això no va funcionar. 1171 00:52:04,080 --> 00:52:06,470 Digui, uh, Binky, no ho faig pensar eliminació de referències 1172 00:52:06,470 --> 00:52:10,850 i és una bona idea, perquè l'establiment el pointee és un pas separat. 1173 00:52:10,850 --> 00:52:12,480 I jo no crec que mai vam fer. 1174 00:52:12,480 --> 00:52:14,620 >> -Hmm, Bon punt. 1175 00:52:14,620 --> 00:52:19,810 >> -Sí, Ens van assignar el punter, i, però mai ens vam posar a apuntar a un pointee. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Molt observador. 1177 00:52:21,590 --> 00:52:23,215 -Escolta, Et veus bé allà, Binky. 1178 00:52:23,215 --> 00:52:26,390 ¿Es pot arreglar perquè els punts I a la mateixa pointee com x. 1179 00:52:26,390 --> 00:52:29,290 >> -És Clar, Jo faig servir el meu vareta màgica d'assignació de punter. 1180 00:52:29,290 --> 00:52:31,970 >> -És Que serà un problema, igual que abans? 1181 00:52:31,970 --> 00:52:33,790 >> -No, Això no toca els pointees. 1182 00:52:33,790 --> 00:52:35,840 Només canvia un punter perquè apunti a la mateixa cosa-- 1183 00:52:35,840 --> 00:52:36,465 >> [Popping SO] 1184 00:52:36,465 --> 00:52:37,450 --com altra. 1185 00:52:37,450 --> 00:52:38,440 >> -Oh, ja ho veig. 1186 00:52:38,440 --> 00:52:41,200 Ara I apunta al mateix lloc que x. 1187 00:52:41,200 --> 00:52:42,950 Així, espera, ara i es fixa. 1188 00:52:42,950 --> 00:52:44,110 Té un pointee. 1189 00:52:44,110 --> 00:52:47,779 Així que vostè pot provar la vareta de eliminació de referències tornar a enviar el 13 més. 1190 00:52:47,779 --> 00:52:51,110 >> Oh, bé, aquí va. 1191 00:52:51,110 --> 00:52:52,330 >> Escolta, mira això. 1192 00:52:52,330 --> 00:52:53,570 Ara dereferencing obres en i. 1193 00:52:53,570 --> 00:52:57,900 I pel fet que els punters estan compartint que un pointee, tots dos veuen el 13. 1194 00:52:57,900 --> 00:52:59,952 >> -Sí, Compartir, eh, el que sigui. 1195 00:52:59,952 --> 00:53:01,535 Per tant, anem a canviar de lloc ara? 1196 00:53:01,535 --> 00:53:03,730 >> Oh, mira que estem fora de temps. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Només Recorda les tres regles de punter. 1199 00:53:06,520 --> 00:53:09,550 Número 1, l'estructura bàsica és que vostè té un punter, 1200 00:53:09,550 --> 00:53:11,630 i apunta a un pointee. 1201 00:53:11,630 --> 00:53:13,740 Però el punter i pointee estan separats. 1202 00:53:13,740 --> 00:53:15,620 I l'error comú és la creació d'un punter 1203 00:53:15,620 --> 00:53:18,000 però que s'oblidi de donar-li una pointee. 1204 00:53:18,000 --> 00:53:21,170 >> Número 2, desreferència punter comença en el punter 1205 00:53:21,170 --> 00:53:24,020 i segueix el seu ratolí a sobre per accedir al seu pointee. 1206 00:53:24,020 --> 00:53:27,815 Com tots sabem, això només funciona si hi ha és un pointee, quin tipus de torni 1207 00:53:27,815 --> 00:53:29,260 a la regla número 1. 1208 00:53:29,260 --> 00:53:31,990 >> Número 3, punter assignació té un punter 1209 00:53:31,990 --> 00:53:35,330 i canvia a apuntar a la pointee mateix com un altre punter. 1210 00:53:35,330 --> 00:53:37,150 Així que després de la cessió, els dos punters 1211 00:53:37,150 --> 00:53:40,927 apuntarà a la mateixa pointee, De vegades això es diu compartir. 1212 00:53:40,927 --> 00:53:42,510 I això és tot el que cal fer, de veritat. 1213 00:53:42,510 --> 00:53:43,130 Adéu ara. 1214 00:53:43,130 --> 00:53:43,475 >> [FI DE REPRODUCCIÓ] 1215 00:53:43,475 --> 00:53:44,830 >> DAVID J. Malan: Això és tot per CS50. 1216 00:53:44,830 --> 00:53:46,246 Gràcies al professor Nick Parlant. 1217 00:53:46,246 --> 00:53:47,730 Ens veiem la setmana que ve. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [REPRODUCCIÓ DE MÚSICA ELECTRÒNICA] 1220 00:53:56,435 --> 00:57:22,775