1 00:00:00,000 --> 00:00:03,395 >> [Música tocando] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 DAVID J. Malan: Isto é como un seminario hoxe calouro. 4 00:00:13,280 --> 00:00:14,060 Aceptar. 5 00:00:14,060 --> 00:00:15,024 Entón, moi chuvioso para fóra. 6 00:00:15,024 --> 00:00:17,690 Isto tende a ocorrer aos mércores, pero todo máis oportunidade 7 00:00:17,690 --> 00:00:18,700 para preguntas hoxe. 8 00:00:18,700 --> 00:00:22,210 Entón, imos comezar realmente co filme en só un momento. 9 00:00:22,210 --> 00:00:24,560 Pero imos comezar grandiosa como sempre. 10 00:00:24,560 --> 00:00:28,000 >> Este é CS50, e este é o fin de semana 4. 11 00:00:28,000 --> 00:00:30,820 Entón, se xa asistiu Televisión ou unha película na que 12 00:00:30,820 --> 00:00:34,690 hai algúns especialistas en informática e a policía, ou FBI, ou algunha axencia 13 00:00:34,690 --> 00:00:36,930 está intentando incorporarse algúns adversario, así, ten 14 00:00:36,930 --> 00:00:40,850 Probablemente xa escoitou a expresión "mellorar" en que de algunha maneira que técnico 15 00:00:40,850 --> 00:00:44,750 Magic amplía infinitamente zoom para ver os criminais 16 00:00:44,750 --> 00:00:48,640 identidade ou o número da tarxeta o mesmo brillo dun espello 17 00:00:48,640 --> 00:00:50,390 ou o brillo de ollos de alguén. 18 00:00:50,390 --> 00:00:55,196 Entón, en realidade, imos dar un ollo algunhas desas escenas de Hollywood. 19 00:00:55,196 --> 00:00:55,862 [REPRODUCIÓN DE VIDEO] 20 00:00:55,862 --> 00:00:59,243 -OK, Agora imos dar unha boa ollada en ti. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Segure-Lo. 23 00:01:07,415 --> 00:01:08,267 Executa iso de volta. 24 00:01:08,267 --> 00:01:09,121 >> -Espera un minuto. 25 00:01:09,121 --> 00:01:11,300 Desprácese á dereita. 26 00:01:11,300 --> 00:01:12,209 >> -Non, Que conxelar. 27 00:01:12,209 --> 00:01:12,750 -Pantalla completa. 28 00:01:12,750 --> 00:01:13,558 -OK, Que conxelar. 29 00:01:13,558 --> 00:01:14,820 -Tighten-Se en que, vai? 30 00:01:14,820 --> 00:01:16,530 -vector En que cara pola roda traseira. 31 00:01:16,530 --> 00:01:19,400 -zoom En dereito aquí neste lugar. 32 00:01:19,400 --> 00:01:22,846 -Con O equipo certo, a imaxe podería ser ampliada e afiada. 33 00:01:22,846 --> 00:01:24,065 -Que é iso? 34 00:01:24,065 --> 00:01:25,600 -É Un programa de mellora. 35 00:01:25,600 --> 00:01:26,860 -Pode-Se claro que calquera? 36 00:01:26,860 --> 00:01:27,890 -Eu Non sei. 37 00:01:27,890 --> 00:01:29,050 Imos melloralo. 38 00:01:29,050 --> 00:01:31,575 >> A6 sección -Aprimore. 39 00:01:31,575 --> 00:01:33,642 >> -I Aumentada o detalle, e- Creo que hai 40 00:01:33,642 --> 00:01:35,433 abondo para mellorar, liberalo para miña pantalla. 41 00:01:35,433 --> 00:01:37,080 -Eu Reforzada a reflexión nos seus ollos. 42 00:01:37,080 --> 00:01:38,830 >> -Imos Executar este través mellora de vídeo. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Pode mellorar isto? 44 00:01:40,100 --> 00:01:41,875 >> -Espera. 45 00:01:41,875 --> 00:01:44,010 >> -Eu Benvida a traballar sobre esta reflexión. 46 00:01:44,010 --> 00:01:44,995 >> A reflexión de -Alguém. 47 00:01:44,995 --> 00:01:45,495 -Reflection. 48 00:01:45,495 --> 00:01:47,399 -Hai Un reflexo da cara do home. 49 00:01:47,399 --> 00:01:48,065 -O Reflexión. 50 00:01:48,065 --> 00:01:48,981 -Hai Unha reflexión. 51 00:01:48,981 --> 00:01:50,600 -zoom En no espello. 52 00:01:50,600 --> 00:01:52,712 -Vostede Pode ver un reflexo. 53 00:01:52,712 --> 00:01:54,350 -Pode Vostede mellorar a imaxe a partir de aquí? 54 00:01:54,350 --> 00:01:55,370 -Pode Vostede mellorar o ben aquí? 55 00:01:55,370 --> 00:01:56,210 -Pode Vostede mellora-lo? 56 00:01:56,210 --> 00:01:56,900 Pode mellora-lo? 57 00:01:56,900 --> 00:01:57,870 >> -Podemos Mellorar iso? 58 00:01:57,870 --> 00:01:58,717 >> -Pode Vostede mellora-lo? 59 00:01:58,717 --> 00:02:00,050 -Mantenha Un segundo, eu vou mellorar. 60 00:02:00,050 --> 00:02:00,924 En -zoom na porta. 61 00:02:00,924 --> 00:02:01,700 -Times 10. 62 00:02:01,700 --> 00:02:02,586 -zoom. 63 00:02:02,586 --> 00:02:03,490 -move In. 64 00:02:03,490 --> 00:02:03,990 -Máis. 65 00:02:03,990 --> 00:02:04,690 Espera, pare. 66 00:02:04,690 --> 00:02:05,190 -Stop. 67 00:02:05,190 --> 00:02:05,970 -pause-lo. 68 00:02:05,970 --> 00:02:09,460 -Rotate Nos 75 graos en torno á vertical, por favor. 69 00:02:09,460 --> 00:02:10,962 -Stop. 70 00:02:10,962 --> 00:02:14,040 Voltar para a parte Sobre a porta, unha vez máis. 71 00:02:14,040 --> 00:02:15,860 >> -Got Un intensificador de imaxe que pode bitmap? 72 00:02:15,860 --> 00:02:18,776 >> Ei, quizais poidamos utilizar o Pradeep Sen método para ver nas fiestras. 73 00:02:18,776 --> 00:02:20,372 Software -Este é o estado da arte. 74 00:02:20,372 --> 00:02:21,845 >> -O Valor propio é desligado. 75 00:02:21,845 --> 00:02:24,300 >> -Con O dereito combinación de algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> Eliminación toma de -El algoritmos ao seguinte nivel, 77 00:02:26,755 --> 00:02:28,730 e podo usalos para mellorar esta foto. 78 00:02:28,730 --> 00:02:31,286 >> -Lock En e ampliar o eixe z. 79 00:02:31,286 --> 00:02:32,560 >> -Aprimore. 80 00:02:32,560 --> 00:02:33,100 >> -Aprimore. 81 00:02:33,100 --> 00:02:33,600 >> -Aprimore. 82 00:02:33,600 --> 00:02:34,960 -Freeze E mellorar. 83 00:02:34,960 --> 00:02:37,180 >> [FIN DE REPRODUCIÓN] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. Malan: Todo ben, entón todos estes son realmente palabras. 85 00:02:41,160 --> 00:02:44,450 Eles só están amarrados xuntos nun forma que non é realmente sensata. 86 00:02:44,450 --> 00:02:48,400 E, de feito, CS50 e cursos como tende a arruinar unha morea de televisión e películas 87 00:02:48,400 --> 00:02:48,900 Para ti. 88 00:02:48,900 --> 00:02:52,330 Porque cando estes expertos en informática están despexado termos e dicindo 89 00:02:52,330 --> 00:02:56,860 cousas extravagantes como vectores propios, eo eixe-z, 90 00:02:56,860 --> 00:02:59,572 e calquera número de outros realmente termos máis técnicos, 91 00:02:59,572 --> 00:03:02,030 realmente están só amarre palabras xuntas con demasiada frecuencia. 92 00:03:02,030 --> 00:03:05,020 É que unha das nosas esperanzas é que, como efectos secundarios de cursos toma 93 00:03:05,020 --> 00:03:08,245 como este, será máis persoas no mundo realmente ser capaz de pesar 94 00:03:08,245 --> 00:03:12,040 e só moi lixeiramente influír no calidade e precisión deses filmes? 95 00:03:12,040 --> 00:03:14,350 >> De feito, imos dar un ollo a realidade. 96 00:03:14,350 --> 00:03:18,070 Entón aquí está a foto do equipo Mary, un dos nosos compañeiros de ensino. 97 00:03:18,070 --> 00:03:20,050 E supoño que é sospeitoso de algo. 98 00:03:20,050 --> 00:03:23,730 E, con todo, hai un reflexo de algún anaco de evidencia no seu ollo, 99 00:03:23,730 --> 00:03:25,480 ou na reflexión dos seus lentes. 100 00:03:25,480 --> 00:03:30,760 Ben, se facemos exactamente como as películas propoñer, na que estamos zoom e "mellorar", 101 00:03:30,760 --> 00:03:34,080 esta é a cantidade de información é na cara de Mary 102 00:03:34,080 --> 00:03:36,795 cando captura unha imaxe con esa resolución orixinal. 103 00:03:36,795 --> 00:03:39,120 >> E, de feito, pode ver isto. 104 00:03:39,120 --> 00:03:41,900 E estes son o que son chamados píxeles, P-X-I-E-L-S, 105 00:03:41,900 --> 00:03:45,740 que é só unha praza tipicamente que é un punto que compón unha imaxe. 106 00:03:45,740 --> 00:03:49,200 E de volta o día, e, de feito, incluso hoxe con algunhas das TVs LED de hoxe 107 00:03:49,200 --> 00:03:51,950 ou televisores LCD, que ten un no seu cuarto ou na casa, 108 00:03:51,950 --> 00:03:55,100 se ir cara arriba super próximo a el, e especialmente se é unha televisión un pouco máis vello, 109 00:03:55,100 --> 00:03:58,760 probablemente pode incluso ver eses puntos e iso é o que compoñer unha imaxe. 110 00:03:58,760 --> 00:04:00,980 >> E non hai máis información que este. 111 00:04:00,980 --> 00:04:05,400 Poderiamos "mellorar", no sentido de suavización sobre as cousas e tipo de 112 00:04:05,400 --> 00:04:09,040 inferindo tipo de, tipo que cor debe ser preto aos ollos de Mary 113 00:04:09,040 --> 00:04:10,910 para que non é realmente tan pixelizada. 114 00:04:10,910 --> 00:04:14,510 Pero se eu continuar ampliando, non é a cara mal no seu ollo. 115 00:04:14,510 --> 00:04:16,600 Como iso é todo o información que temos. 116 00:04:16,600 --> 00:04:18,920 Non pode crear información a partir da nada. 117 00:04:18,920 --> 00:04:20,790 Había só un finito número de bits de alí. 118 00:04:20,790 --> 00:04:22,873 >> Así, no Conxunto de problemas 4, onde ten unha oportunidade 119 00:04:22,873 --> 00:04:24,580 xogar con este tipo de mundo. 120 00:04:24,580 --> 00:04:27,610 En Conxunto de Problemas 4, vai explotar o mundo de gráficos e forense, 121 00:04:27,610 --> 00:04:30,870 e realmente escribir código que recupera imaxes perdidas. 122 00:04:30,870 --> 00:04:33,510 Vai escribir un código que manipula imaxes existentes 123 00:04:33,510 --> 00:04:36,120 e, finalmente, entender o que é pasando baixo o capó. 124 00:04:36,120 --> 00:04:38,540 >> E, ao parecer, é realmente non tan complicado. 125 00:04:38,540 --> 00:04:41,320 Por exemplo, se quixésemos representan un rostro sorridente onde 126 00:04:41,320 --> 00:04:44,160 con eses píxeles negros, ou estes puntos negros, 127 00:04:44,160 --> 00:04:47,230 Ben, nós poderíamos simplemente representar Los como realmente un bitmap. 128 00:04:47,230 --> 00:04:50,040 E se nunca tiña oído falar que expresión bitmap, quizais 129 00:04:50,040 --> 00:04:52,330 agora comeza a facer unha pouco máis de sentido hoxe. 130 00:04:52,330 --> 00:04:53,580 >> Xa sabemos o que é un pouco. 131 00:04:53,580 --> 00:04:54,160 É 0 ou 1. 132 00:04:54,160 --> 00:04:56,201 E un mapa é só algo como un anaco de papel 133 00:04:56,201 --> 00:04:59,180 que lle dá direccións e ten quizais unha reixa de coordenadas x e y. 134 00:04:59,180 --> 00:05:00,540 Entón aquí está un mapa de bits. 135 00:05:00,540 --> 00:05:03,680 É un mapa de bits en que 1 é un parecer 136 00:05:03,680 --> 00:05:07,857 vai representar un pixel branco, e un 0 vai representar un pixel negro. 137 00:05:07,857 --> 00:05:09,440 Pero certamente podería lanzalo ao redor. 138 00:05:09,440 --> 00:05:11,648 Realmente non importa, Sempre que esteamos consistente. 139 00:05:11,648 --> 00:05:15,570 E aquí está como, en binary-- dentro de memoria dun ordenador, ou mesmo dentro 140 00:05:15,570 --> 00:05:18,160 dun ficheiro no seu disco drive-- pode almacenar 141 00:05:18,160 --> 00:05:20,240 a máis simple das imaxes da cara do smiley. 142 00:05:20,240 --> 00:05:23,990 Pero o que temos, por suposto, falta nesta imaxe? 143 00:05:23,990 --> 00:05:24,610 Cor, non? 144 00:05:24,610 --> 00:05:28,220 É un seguinte paso evidente ou centrado para mellorar este coa cor. 145 00:05:28,220 --> 00:05:32,230 Entón, por desgraza, con só un único bit, 0 ou 1, poderiamos representar cores. 146 00:05:32,230 --> 00:05:36,100 Isto podería ser vermello ou azul, ou Black, ou branco, ou verde, ou cor de rosa, 147 00:05:36,100 --> 00:05:37,420 ou calquera par de cores. 148 00:05:37,420 --> 00:05:40,860 Pero, para simplificar, imos simplemente asumir branco e negro. 149 00:05:40,860 --> 00:05:45,930 >> Entón, o que loxicamente que necesitamos se nós quere aplicar cor nunha imaxe? 150 00:05:45,930 --> 00:05:49,080 O que temos que facer? 151 00:05:49,080 --> 00:05:51,900 Coma se o factor limitante aquí é que, cun pouco só se pode 152 00:05:51,900 --> 00:05:55,977 representan dous estados, 0 ou 1, branco ou negro, o que quere facer? 153 00:05:55,977 --> 00:05:56,810 Audiencia: máis datos. 154 00:05:56,810 --> 00:05:58,813 DAVID J. Malan: máis bits, , Yeah máis datos, máis bits. 155 00:05:58,813 --> 00:06:01,440 E, de feito, iso é exactamente como imaxes en cor son representadas. 156 00:06:01,440 --> 00:06:05,120 En vez de usar un único bit, unha 0 ou 1 para cada pixel, cada punto, 157 00:06:05,120 --> 00:06:06,170 acaba de usar múltiple. 158 00:06:06,170 --> 00:06:09,660 Quizais use 8, quizais, máis comunmente utilizar 24 e, de feito, no Conxunto de problemas 159 00:06:09,660 --> 00:06:13,300 4, vai xogar con un arquivo formato que usa 24 bits normalmente. 160 00:06:13,300 --> 00:06:15,430 >> Pero a maioría de vostedes probablemente están familiarizado con JPEGs. 161 00:06:15,430 --> 00:06:17,460 Se xa tomadas unha foto no seu teléfono, 162 00:06:17,460 --> 00:06:20,360 ou enviados ou visto algo sobre Facebook ou Flickr, calquera número 163 00:06:20,360 --> 00:06:24,882 de sitios baseados en fotos, ten Probablemente xa viu unha imaxe JPEG antes. 164 00:06:24,882 --> 00:06:27,840 E ao parecer, este é o ficheiro formato que imos usar en PSet 4, 165 00:06:27,840 --> 00:06:30,340 en que vai ter que recuperar imaxes 166 00:06:30,340 --> 00:06:35,160 que eu accidentalmente borrados dun tarxeta de memoria corrompida na cámara, 167 00:06:35,160 --> 00:06:35,800 se quere. 168 00:06:35,800 --> 00:06:38,490 >> E parece que, a pesar de JPEG é moi sophisticated-- 169 00:06:38,490 --> 00:06:40,906 é moito máis sofisticado que os puntos en branco e negro 170 00:06:40,906 --> 00:06:44,480 vimos hai pouco, porque hai algoritmos sofisticados que realmente 171 00:06:44,480 --> 00:06:47,410 son usados ​​para comprimir un arquivo JPEG, para que pode ter un moi bo, 172 00:06:47,410 --> 00:06:49,832 calidade de imaxe, pero usando relativamente poucos bits. 173 00:06:49,832 --> 00:06:51,790 E nós imos voltar a compresión antes de tempo. 174 00:06:51,790 --> 00:06:56,280 Acontece que o primeiro tres bytes dun image-- JPEG 175 00:06:56,280 --> 00:07:02,750 non importa o que teña tomado unha foto de-- son os valores 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> Noutras palabras, se só ver que o patrón de bits, 177 00:07:05,990 --> 00:07:09,180 aquí representada como tres bytes, ou 24 bits en total, 178 00:07:09,180 --> 00:07:13,810 unha elevada probabilidade, pode inferir que está mirando para el este tres primeiros 179 00:07:13,810 --> 00:07:15,230 bytes dun JPEG. 180 00:07:15,230 --> 00:07:18,040 E iso é o que se coñece como a sinatura dun JPEG. 181 00:07:18,040 --> 00:07:20,540 Unha morea de formatos de ficheiro aí, tenden a comezar 182 00:07:20,540 --> 00:07:23,735 con certos estándares de 0s e 1s, para que Windows e Mac OS, e IOS, 183 00:07:23,735 --> 00:07:28,272 Android e saber que tipo de ficheiro que son, en suma ao ficheiro de chamada 184 00:07:28,272 --> 00:07:29,730 extensión que unha morea de arquivos teñen. 185 00:07:29,730 --> 00:07:32,590 Se ten .jpg, iso é outra pista para o equipo. 186 00:07:32,590 --> 00:07:35,310 >> Entón, imos agora mirar para este un pouco máis tecnicamente. 187 00:07:35,310 --> 00:07:37,390 Sabemos que o decimal sistema é de 0 a 9. 188 00:07:37,390 --> 00:07:38,740 Sabemos binario é 0 e 1. 189 00:07:38,740 --> 00:07:41,842 E se pensas que volta a PSet 0 tivemos que loitar con, 190 00:07:41,842 --> 00:07:43,800 para algo, algo chamado hexadecimal, 191 00:07:43,800 --> 00:07:47,320 onde ten 16 díxitos, 10, en vez de ou en vez de 2. 192 00:07:47,320 --> 00:07:50,405 E eses díxitos, por convención, son de 0 a 9 e, a continuación, unha 193 00:07:50,405 --> 00:07:55,040 mediante f, onde f representa o que número decimal, así como a sanidade rápida 194 00:07:55,040 --> 00:07:56,640 comprobar? 195 00:07:56,640 --> 00:07:57,610 Entón, 15. 196 00:07:57,610 --> 00:08:01,390 E un debe representar 10, só por natureza da orde que eu dei. 197 00:08:01,390 --> 00:08:04,350 É só unha convención arbitraria, pero é moi estándar. 198 00:08:04,350 --> 00:08:06,870 >> Polo tanto, se miramos para este patrón de tres bytes-- imos 199 00:08:06,870 --> 00:08:09,620 pode comezar a ollar para el de unha forma consistente coa forma como 200 00:08:09,620 --> 00:08:12,450 científicos da computación en xeral mirar e pensar sobre arquivos. 201 00:08:12,450 --> 00:08:15,580 Certamente pode pensar en arquivos 0s e 1s, e decimal, 202 00:08:15,580 --> 00:08:19,340 pero, en realidade, tendemos a usar binario ou, máis tipicamente hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 de volta de PSet 0. 204 00:08:20,760 --> 00:08:25,857 Entón deixe-me propor que 255, 216, e 255 son só estes patróns de 0s e 1s. 205 00:08:25,857 --> 00:08:28,440 E pode comprobar que se quere facer a matemática de Semana 0. 206 00:08:28,440 --> 00:08:30,810 Pero, por agora, só supor que se trata realmente correcta. 207 00:08:30,810 --> 00:08:33,850 Acaba reescrito tres decimal números como tres valores binarios. 208 00:08:33,850 --> 00:08:36,100 Agora o que eu vou facer é basta engadir un espazo en branco, 209 00:08:36,100 --> 00:08:37,266 só polo amor de lexibilidade. 210 00:08:37,266 --> 00:08:39,940 E observen, eu só vou para mover as cousas separadas. 211 00:08:39,940 --> 00:08:43,090 Polo tanto, antes de, despois, antes, despois. 212 00:08:43,090 --> 00:08:46,180 Eu estou facendo nada máis interesante que só estendendo para fóra cousas así 213 00:08:46,180 --> 00:08:50,380 que a notificación de cada conxunto de oito bocados agora dous conxuntos de catro bits. 214 00:08:50,380 --> 00:08:54,920 Isto é útil porque hexadecimal é particularmente elegante 215 00:08:54,920 --> 00:09:00,930 porque cada díxito hexadecimal entre 0 e F, ou, máis especificamente, 0 a 15, 216 00:09:00,930 --> 00:09:03,430 pode ser representada con exactamente catro anacos. 217 00:09:03,430 --> 00:09:07,960 Noutras palabras, se en hexadecimal quere representar un 0, é só 0000, 218 00:09:07,960 --> 00:09:08,780 catro ceros. 219 00:09:08,780 --> 00:09:13,997 E se quere representar 15, é 1111, que é catro bits. 220 00:09:13,997 --> 00:09:16,080 E se fai as contas, se este é o lugar queridos, 221 00:09:16,080 --> 00:09:18,210 este é o lugar 16s, que dará vocę-- 222 00:09:18,210 --> 00:09:19,960 si que está pasando a-- moito, en binario, 223 00:09:19,960 --> 00:09:23,660 que lle vai dar 15, queridos lugar, twos lugar, catro e oito lugar. 224 00:09:23,660 --> 00:09:26,821 Entón deixe-me propor que que conxunto de catro bits na esquerda 225 00:09:26,821 --> 00:09:28,070 é o que nós imos chamar f. 226 00:09:28,070 --> 00:09:30,110 É o maior número que pode representar con catro bits. 227 00:09:30,110 --> 00:09:33,300 E xa sabemos de hexadecimal, f é o maior díxitos en hexadecimal. 228 00:09:33,300 --> 00:09:36,020 Temos outro f alí, máis por alí dous. 229 00:09:36,020 --> 00:09:38,980 E de momento, pode ter en fe que eu fixen o dereito de Matemáticas 230 00:09:38,980 --> 00:09:41,890 e que a metade esquerda deses bits, 1101, 231 00:09:41,890 --> 00:09:43,980 é o mesmo que d en hexadecimal. 232 00:09:43,980 --> 00:09:46,490 E a man dereita, 1000, está só a 8. 233 00:09:46,490 --> 00:09:48,140 >> E iso é fácil de ver, non? 234 00:09:48,140 --> 00:09:51,670 A 8 represents-- é correcto debaixo daquel lugar oitos. 235 00:09:51,670 --> 00:09:56,040 Polo tanto, temos unha na columna oitos e nada nos fours, twos queridos ou. 236 00:09:56,040 --> 00:09:59,830 Entón, agora máis convencional, o ser humano tende para escribir díxitos hexadecimais como este, 237 00:09:59,830 --> 00:10:03,000 só esmaga-los xuntos, e entón prefixar-los con 0x. 238 00:10:03,000 --> 00:10:05,920 Isto significa máis que unha pista visual para un human-- 239 00:10:05,920 --> 00:10:10,350 aquí ven un value-- hexadecimal porque que non poderían ser evidente. 240 00:10:10,350 --> 00:10:13,629 >> O que significa dicir, en definitiva, que o estándar de ceros e uns, 241 00:10:13,629 --> 00:10:16,170 ou o patrón de hexadecimal díxitos equivalentemente que é 242 00:10:16,170 --> 00:10:18,990 comezará a buscar no Conxunto de problemas 4 é isto-- 243 00:10:18,990 --> 00:10:22,120 e do Conxunto de problemas 4 especificación andará Lo través deste en máis detail-- 244 00:10:22,120 --> 00:10:25,344 pero perciben como unha especie de misterioso como este pode parecer a primeira vista, 245 00:10:25,344 --> 00:10:27,010 vai comezar a ver moito iso. 246 00:10:27,010 --> 00:10:30,320 E, de feito, mesmo en GDB, a depurador introducimos o luns 247 00:10:30,320 --> 00:10:35,440 e Dan introduce no PSet 3, vai moitas veces para amosar-lle valores hexadecimais 248 00:10:35,440 --> 00:10:39,910 só porque eles tenden a ser máis convencional que decimal ou binario 249 00:10:39,910 --> 00:10:41,157 no mundo dos ordenadores. 250 00:10:41,157 --> 00:10:42,490 Agora imos poñer isto en contexto. 251 00:10:42,490 --> 00:10:48,040 Moitos de vostedes poden lembrar este imaxe aquí, que veu dunha cousa? 252 00:10:48,040 --> 00:10:51,240 Vista, polo que aínda antes do que que, Windows XP fixo esta estrea. 253 00:10:51,240 --> 00:10:52,620 Polo tanto, esta é unha fermosa paisaxe. 254 00:10:52,620 --> 00:10:55,940 E, de feito, se fuçar online-- Creo que é un artigo da Wikipedia, 255 00:10:55,940 --> 00:11:00,110 en que alguén moi sorprendente saíu atopamos a localización no mundo creado 256 00:11:00,110 --> 00:11:02,240 súa cámara en precisamente o dereito Place-- 257 00:11:02,240 --> 00:11:06,510 e que hoxe parece como-- pero é exactamente a mesma configuración. 258 00:11:06,510 --> 00:11:10,060 Esta imaxe, con todo, é un ficheiro chamado formato de mapa de bits, b-m-p. 259 00:11:10,060 --> 00:11:12,910 E nós estamos indo tomar un super- rápido ollar sobre o que iso significa. 260 00:11:12,910 --> 00:11:17,770 >> Pero bitmap é só un xeito diferente de imaxes que representan aínda usando píxeles 261 00:11:17,770 --> 00:11:19,580 en 0s e 1s, en última instancia. 262 00:11:19,580 --> 00:11:23,282 Pero polo ollar rápido, ten unha firma máis interesante 263 00:11:23,282 --> 00:11:24,490 ó final do ficheiro. 264 00:11:24,490 --> 00:11:26,670 Non é só tres bytes, no canto hai 265 00:11:26,670 --> 00:11:30,770 unha morea de modelos de bytes que teñen significado predeterminado. 266 00:11:30,770 --> 00:11:34,490 Por exemplo, en algún lugar na primeiros bytes dunha imaxe bitmap 267 00:11:34,490 --> 00:11:37,440 será o tamaño do imaxe, o ancho da imaxe, 268 00:11:37,440 --> 00:11:40,390 a altura da imaxe, de xeito metadatos útiles, se quere. 269 00:11:40,390 --> 00:11:43,940 Información útil que o Photoshop ou programar todos os gráficos que está a usar 270 00:11:43,940 --> 00:11:45,180 se realmente se preocupan. 271 00:11:45,180 --> 00:11:47,170 >> Entón, máis sobre isto en Problema xogo 4, pero esta 272 00:11:47,170 --> 00:11:49,220 é só para dicir que ao final do día 273 00:11:49,220 --> 00:11:52,390 todos os formatos de ficheiro que está a usar para arquivos de Microsoft Word anos--, 274 00:11:52,390 --> 00:11:55,820 Números arquivos, ficheiros de Excel calquera número de formatos de ficheiro 275 00:11:55,820 --> 00:11:57,770 que pode ter algún extensión de arquivo coñecidos 276 00:11:57,770 --> 00:12:00,130 son só 0s e 1s debaixo do capó. 277 00:12:00,130 --> 00:12:02,970 E o ser humano decidiron o que as convencións son, 278 00:12:02,970 --> 00:12:08,340 o que patróns de 0s e 1s representan arquivar unha palabra contra un arquivo de Excel, 279 00:12:08,340 --> 00:12:10,322 contra calquera número de outros formatos de ficheiro. 280 00:12:10,322 --> 00:12:12,780 Así, en PSet 4, vai ter un oportunidade de xogar con iso. 281 00:12:12,780 --> 00:12:14,405 >> Pero o que significa ter un struct. 282 00:12:14,405 --> 00:12:18,012 Este é realmente un agradable segue agora en C, que ten só un par 283 00:12:18,012 --> 00:12:20,220 características adicionais que non mirei aínda. 284 00:12:20,220 --> 00:12:24,230 É unha linguaxe moi pequeno e un dos as características agradables sobre C é un struct. 285 00:12:24,230 --> 00:12:27,300 Por exemplo, se quería represent-- imos 286 00:12:27,300 --> 00:12:33,690 di que quería ter unha variable que representa un alumno nalgún programa. 287 00:12:33,690 --> 00:12:37,330 Quizais estivese escribindo un curso programa de rexistro, ou núcleo de compra 288 00:12:37,330 --> 00:12:38,870 ferramenta, ou algo parecido. 289 00:12:38,870 --> 00:12:42,922 Cales son anacos de datos relacionados a un estudante que vén á mente? 290 00:12:42,922 --> 00:12:44,880 Como un estudante é representado con que valores? 291 00:12:44,880 --> 00:12:45,732 Si? 292 00:12:45,732 --> 00:12:46,940 Ten un nome como un estudante. 293 00:12:46,940 --> 00:12:48,900 O que máis fai un típico estudante ten? 294 00:12:48,900 --> 00:12:49,320 >> Audiencia: [inaudível] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. Malan: Entón, desculpe. 296 00:12:50,200 --> 00:12:50,660 >> Audiencia: Idade. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. Malan: Unha idade ou aniversario equivalentemente, si. 298 00:12:52,980 --> 00:12:53,557 Que mais? 299 00:12:53,557 --> 00:12:54,390 Audiencia: número de identificación? 300 00:12:54,390 --> 00:12:57,460 DAVID J. Malan: Entón un número de identificación, quizais un número de teléfono, quizais un dormitorio ou casa, 301 00:12:57,460 --> 00:12:58,670 ou facultade, ou algo parecido. 302 00:12:58,670 --> 00:13:01,820 Calquera número de anacos de datos que pode ter na súa lista de contactos 303 00:13:01,820 --> 00:13:03,890 é o que podería establecer un estudante. 304 00:13:03,890 --> 00:13:08,490 Entón, se nós queriamos facelo, o código, poderiamos facer algo simple como este. 305 00:13:08,490 --> 00:13:15,670 Podemos ter un programa para que ten, digamos, int main (void). 306 00:13:15,670 --> 00:13:18,920 E se eu queira representar un estudante podería ter, por exemplo, 307 00:13:18,920 --> 00:13:24,330 unha cadea chamada nome para ese estudante, unha cadea chamada dormitorio para ese estudante, 308 00:13:24,330 --> 00:13:26,900 quizais un int chamado ID para ese estudante. 309 00:13:26,900 --> 00:13:30,840 E por que eu estou usando corda, I Debe volver e poñer-se CS50.h. 310 00:13:30,840 --> 00:13:33,300 Poida que eu vou ter stdio.h. 311 00:13:33,300 --> 00:13:38,190 Entón deixe-me facer os cautelarmente e eu son vai chamar este student.c de momento 312 00:13:38,190 --> 00:13:40,080 e salva este. 313 00:13:40,080 --> 00:13:44,206 >> E agora podo facer algo con estas variables. 314 00:13:44,206 --> 00:13:46,830 E nós só estamos indo a escribir que, como un comentario no código pseudo, 315 00:13:46,830 --> 00:13:48,829 porque non é interesante o que facemos agora. 316 00:13:48,829 --> 00:13:51,242 OK, polo tanto, este é un programa que dalgún xeito almacena un estudante. 317 00:13:51,242 --> 00:13:53,450 O que quero facer, si quere almacenar dous estudantes? 318 00:13:53,450 --> 00:13:55,991 Entón, o meu primeiro instinto vai dar todo certo, agarde un minuto, 319 00:13:55,991 --> 00:14:01,920 se eu tivera outro alumno por que non me só facer nome da secuencia 2, secuencia de dormitorio 2, 320 00:14:01,920 --> 00:14:04,190 int id2. 321 00:14:04,190 --> 00:14:06,540 E fixemos gone polo que antes 322 00:14:06,540 --> 00:14:10,890 e cal foi a nosa solución para o que parece para ser unha especie de copia de masilla hackish 323 00:14:10,890 --> 00:14:11,555 traballo aquí? 324 00:14:11,555 --> 00:14:12,346 Audiencia: Unha matriz. 325 00:14:12,346 --> 00:14:13,830 DAVID J. Malan: Si, poderíamos usar unha matriz. 326 00:14:13,830 --> 00:14:15,620 Por aquí moi rapidamente pasa a ser difícil. 327 00:14:15,620 --> 00:14:18,453 Ten que clasificar de forma arbitraria comezar a nomear todas estas variables. 328 00:14:18,453 --> 00:14:22,190 E ti, o humano, ten que manter seguir o que corresponde Aceptar NAME2 329 00:14:22,190 --> 00:14:25,060 con dorm2 corresponde coa ID2. 330 00:14:25,060 --> 00:14:26,200 El só se fai unha desorde. 331 00:14:26,200 --> 00:14:29,350 Por iso, é moito máis fácil, recordar algunhas semanas 332 00:14:29,350 --> 00:14:34,300 só para ter que chamados nomes de cadea e quizais darnos tres delas. 333 00:14:34,300 --> 00:14:36,940 E entón quizais temos dormitorios cordas e teñen 334 00:14:36,940 --> 00:14:41,900 tres destes, ou cunha constante, int IDs e teñen tres delas. 335 00:14:41,900 --> 00:14:45,250 Pero aínda agora que se sente un pouco desleixado, certo. 336 00:14:45,250 --> 00:14:49,440 Estamos a falar de estudantes e aínda Realmente estou me deter sobre o nivel baixo 337 00:14:49,440 --> 00:14:50,470 detalles de implementación. 338 00:14:50,470 --> 00:14:52,790 O estudante é un nome e un dormitorio e ID. 339 00:14:52,790 --> 00:14:59,814 >> Por que non podo simplemente declarar unha variable chamado estudante e chamalo s. 340 00:14:59,814 --> 00:15:02,230 E se eu queira outro estudante, por que non eu só chamalo t. 341 00:15:02,230 --> 00:15:05,260 Ou, se eu queira un grupo enteiro de estudantes, por que non eu só 342 00:15:05,260 --> 00:15:09,740 dicir que teño toda unha clase de estudantes, e é tres deles. 343 00:15:09,740 --> 00:15:12,470 Noutras palabras, por que non podo vir co meu propio tipo de datos, chamado 344 00:15:12,470 --> 00:15:15,641 Estudantes, dentro dos cales é un nome, é un ID, é un dormitorio, 345 00:15:15,641 --> 00:15:16,890 é calquera número de outros campos. 346 00:15:16,890 --> 00:15:19,030 E resulta que pode facer exactamente isto. 347 00:15:19,030 --> 00:15:21,850 >> Entón C ten este recurso chamado struct. 348 00:15:21,850 --> 00:15:24,700 Isto é un recurso de linguaxe que nos permite facer exactamente isto. 349 00:15:24,700 --> 00:15:28,370 Eu estou indo a ir adiante e abrir structs.h 350 00:15:28,370 --> 00:15:32,299 onde estamos indo a ver o seguinte definición dun estudante. 351 00:15:32,299 --> 00:15:35,215 Acontece que - e este é mesmo máis simple do que o que implica un ID 352 00:15:35,215 --> 00:15:36,080 un momento atrás. 353 00:15:36,080 --> 00:15:39,120 Se quere vir cara arriba con o seu tipo de datos caseiro, 354 00:15:39,120 --> 00:15:42,750 e ademais de Int, e carbón animal e flotar e todos eses outros que existen, 355 00:15:42,750 --> 00:15:45,810 pode facelo literalmente escribindo typedef struct, 356 00:15:45,810 --> 00:15:47,880 a continuación, algunhas claves, dentro do cal 357 00:15:47,880 --> 00:15:51,460 lista das variables que quere asociar a esta nova datos personalizado 358 00:15:51,460 --> 00:15:55,670 escriba como un nome e un dormitorio, e logo, tras as claves 359 00:15:55,670 --> 00:15:57,860 dar un nome para o novo tipo de datos. 360 00:15:57,860 --> 00:15:59,220 Así, por exemplo, estudante. 361 00:15:59,220 --> 00:16:03,247 >> E o que é bo sobre iso agora é que se miramos o código correspondente, 362 00:16:03,247 --> 00:16:05,080 a convención, en primeiro lugar de todo, é poñer este 363 00:16:05,080 --> 00:16:08,230 nun ficheiro chamado algo dot h, un ficheiro de cabeceira, que non ten 364 00:16:08,230 --> 00:16:09,780 comezou a utilizarse nos moito. 365 00:16:09,780 --> 00:16:12,120 Pero imos comezar usando un pouco agora. 366 00:16:12,120 --> 00:16:18,650 E o que podemos facer con iso, en definitiva, nestas poucas liñas de código 367 00:16:18,650 --> 00:16:22,130 é declarar o que tipo de datos, un estudante. 368 00:16:22,130 --> 00:16:23,230 E agora imos usalo. 369 00:16:23,230 --> 00:16:27,274 >> Vou agora entrar en un arquivo chamado structs1.c. 370 00:16:27,274 --> 00:16:29,440 E imos dar un ollo a un algunhas características aquí. 371 00:16:29,440 --> 00:16:32,250 Entón, as cousas aquí enriba é principalmente familiar, e nós imos 372 00:16:32,250 --> 00:16:35,040 volver ao que non é familiarizado en só un momento. 373 00:16:35,040 --> 00:16:39,880 Isto, obviamente está incluída a miña propia arquivo de cabeceira, que é novo, así como, 374 00:16:39,880 --> 00:16:42,580 agás para PSet 3 onde, recall, temos helpers.h. 375 00:16:42,580 --> 00:16:45,150 Entón pode lembrar helpers.h #include. 376 00:16:45,150 --> 00:16:49,381 >> Por que eu estou usando comiñas no canto de corchetes angulares? 377 00:16:49,381 --> 00:16:50,630 Cando eu escollo entre eles? 378 00:16:50,630 --> 00:16:52,310 Case sempre eu parezo para usar soportes angulares. 379 00:16:52,310 --> 00:16:55,040 E entón, de súpeto, en liña de seis Estou usando comiñas dobres. 380 00:16:55,040 --> 00:16:55,860 Por que podería ser? 381 00:16:55,860 --> 00:16:56,700 Si? 382 00:16:56,700 --> 00:16:57,725 >> Audiencia: [inaudível] 383 00:16:57,725 --> 00:16:59,350 DAVID J. Malan: Isto é un real, o que? 384 00:16:59,350 --> 00:17:00,559 Audiencia: É na súa IDE. 385 00:17:00,559 --> 00:17:02,475 DAVID J. Malan: Si, que está no meu IDE real. 386 00:17:02,475 --> 00:17:05,690 E non imos debruzouse sobre o IDE, xa isto é só unha ferramenta que está a usar. 387 00:17:05,690 --> 00:17:08,119 Isto está no meu actual directorio, especificamente. 388 00:17:08,119 --> 00:17:11,647 Entón structs.h é o meu propio arquivo non instalado no IDE, 389 00:17:11,647 --> 00:17:14,480 no propio sistema operativo, ao contrario, está no meu directorio actual. 390 00:17:14,480 --> 00:17:16,910 Así, a convención é se quere para incluír o seu propio ficheiro de cabeceira, 391 00:17:16,910 --> 00:17:18,200 acaba de usar comiñas dobres. 392 00:17:18,200 --> 00:17:23,290 >> O que chamamos esa cousa en liña 8, dun modo xeral? 393 00:17:23,290 --> 00:17:25,200 Isto é o que? 394 00:17:25,200 --> 00:17:28,220 algo # define. 395 00:17:28,220 --> 00:17:31,040 Isto representa constantes, non? 396 00:17:31,040 --> 00:17:33,140 Se quere ter un valor no seu programa 397 00:17:33,140 --> 00:17:35,110 que use un todo chea de veces, é 398 00:17:35,110 --> 00:17:39,330 boa convención para inclui-lo para fóra, declaralo la, co símbolo de hash 399 00:17:39,330 --> 00:17:43,340 definir, a continuación, por convención, en todos maiúsculas word-- aínda que non sexa 400 00:17:43,340 --> 00:17:45,320 estrictamente necesario, pero é convención humana 401 00:17:45,320 --> 00:17:47,210 para capitalizar constantes de xeito que xa saltan fóra 402 00:17:47,210 --> 00:17:50,380 en ti visually-- espazo e entón o valor que quere ser 403 00:17:50,380 --> 00:17:52,250 equivalente ao que o nome da constante. 404 00:17:52,250 --> 00:17:56,110 Sen punto e coma, pero simplemente siga este estándar existe. 405 00:17:56,110 --> 00:17:57,770 >> Entón, o que estou facendo neste código real. 406 00:17:57,770 --> 00:18:00,660 Entón, imos dar un ollo o principal programa aquí. 407 00:18:00,660 --> 00:18:04,080 Na liña 12, porque eu incluíron structs.h, 408 00:18:04,080 --> 00:18:06,492 Agora teño Magic no meu eliminación dun novo tipo de datos. 409 00:18:06,492 --> 00:18:09,200 Eu só non teñen acceso á int, e char, e float, e corda, 410 00:18:09,200 --> 00:18:10,060 e azul e outros. 411 00:18:10,060 --> 00:18:12,470 Agora teño acceso a un tipo de datos do alumno. 412 00:18:12,470 --> 00:18:17,740 Así, en liña 12, eu estou quedando dous ideas-- un un tipo de datos personalizado e dous, 413 00:18:17,740 --> 00:18:18,940 utilizando unha matriz. 414 00:18:18,940 --> 00:18:21,700 E así, este programa se Quero realmente apoiar 415 00:18:21,700 --> 00:18:24,320 tres estudantes diferentes no meu programa, eu 416 00:18:24,320 --> 00:18:30,480 pode simplemente dicir me dea unha variable chamados alumnos, cada un dos cales 417 00:18:30,480 --> 00:18:32,970 é de estudantes tipo, que é o meu tipo de datos personalizado. 418 00:18:32,970 --> 00:18:35,890 E, especialmente, dáme tres dos na miña matriz. 419 00:18:35,890 --> 00:18:37,750 >> Entón, agora, o que facemos neste programa? 420 00:18:37,750 --> 00:18:40,670 Aquí é só un para a iteración de loop de 0 a 3, que é porque 421 00:18:40,670 --> 00:18:42,110 cal é o valor de estudantes é. 422 00:18:42,110 --> 00:18:44,420 Eu só estou pedindo ao usuario dáme o nome do alumno. 423 00:18:44,420 --> 00:18:48,090 E, a continuación, na liña 17, nós ter unha liña na maior parte da familia. 424 00:18:48,090 --> 00:18:50,370 Temos o noso vello amigo GetString á dereita. 425 00:18:50,370 --> 00:18:52,345 E o anaco de sintaxe é aparentemente nova, 426 00:18:52,345 --> 00:18:55,130 se nunca programado en C antes, e nunca usou as estruturas? 427 00:18:55,130 --> 00:18:55,510 Si? 428 00:18:55,510 --> 00:18:56,417 >> Audiencia O .name. 429 00:18:56,417 --> 00:18:57,500 DAVID J. Malan: O .name. 430 00:18:57,500 --> 00:19:01,220 Pero iso non é moi de un salto, porque agora os alumnos adaptador 431 00:19:01,220 --> 00:19:02,590 dálle o estudante i-th. 432 00:19:02,590 --> 00:19:04,730 E se queres mergullo dentro desta estrutura, 433 00:19:04,730 --> 00:19:09,490 non necesitará empregar un único período e a continuación, o nome da variable dentro, 434 00:19:09,490 --> 00:19:11,900 ou a propiedade dentro dese Quere ter acceso. 435 00:19:11,900 --> 00:19:14,816 Do mesmo xeito, a continuación, se eu, a continuación, solicitar que o usuario, dáme dormitorio do alumno, 436 00:19:14,816 --> 00:19:18,390 pode almacenar de forma semellante que cadea variábel dormitorio dentro 437 00:19:18,390 --> 00:19:19,940 de que a estrutura estudante. 438 00:19:19,940 --> 00:19:21,410 >> E agora as cousas están un pouco extravagante. 439 00:19:21,410 --> 00:19:24,420 E iso vai ollar quizais nun lote moi pronto. 440 00:19:24,420 --> 00:19:27,970 Pero vai ver isto moito máis en PSet 4, entón, basta ollar para el agora imos. 441 00:19:27,970 --> 00:19:33,364 Acontece que na liña 23 a través 38, o que pensas que eu estou facendo, quizais? 442 00:19:33,364 --> 00:19:35,530 Eu eliminar os comentarios para hoxe, pero a versión 443 00:19:35,530 --> 00:19:38,660 do código en liña referencia ten todos os comentarios. 444 00:19:38,660 --> 00:19:40,171 O que parece que estou facendo? 445 00:19:40,171 --> 00:19:42,530 >> Audiencia: Gardar o ficheiro con todas a información que o usuario inseriu. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. Malan: Si, exactamente, esta é unha nova forma 447 00:19:44,530 --> 00:19:46,370 que estamos a ver dous, Outra característica de C, 448 00:19:46,370 --> 00:19:48,700 en que podo crear meus propios arquivos. 449 00:19:48,700 --> 00:19:51,580 Ata agora, case todos os programas escribiu é apátrida. 450 00:19:51,580 --> 00:19:53,334 Así que está feito en execución, é iso. 451 00:19:53,334 --> 00:19:55,000 Non hai memoria ou recordo del. 452 00:19:55,000 --> 00:19:56,110 Non hai ningún ficheiro gardado. 453 00:19:56,110 --> 00:19:58,120 Pero se quere gardar entrada que ten 454 00:19:58,120 --> 00:20:02,100 pasou, como nun xogo ou un programa como este, ao parecer podemos facelo. 455 00:20:02,100 --> 00:20:04,360 E vai ver isto máis en PSet 4 e na Sección. 456 00:20:04,360 --> 00:20:08,661 Pero esta liña 23 esencialmente crea un ficheiro chamado students.csv. 457 00:20:08,661 --> 00:20:10,160 E pode ver iso antes. 458 00:20:10,160 --> 00:20:14,250 Aínda que nunca estudase CS antes, CSV é variables separadas por comas. 459 00:20:14,250 --> 00:20:19,000 É como un home moi pobre de versión dun arquivo de Excel, 460 00:20:19,000 --> 00:20:22,270 o que significa que pode ser aberto en Excel e en números de Apple, 461 00:20:22,270 --> 00:20:23,830 e ten liñas e columnas. 462 00:20:23,830 --> 00:20:26,485 Pero non é unha propiedade formato como Microsoft ou Apple. 463 00:20:26,485 --> 00:20:29,840 É só comas que separan o valores que veremos en un momento. 464 00:20:29,840 --> 00:20:31,010 >> E só dar un palpite. 465 00:20:31,010 --> 00:20:33,480 Na liña 23, no final, o meu segundo argumento 466 00:20:33,480 --> 00:20:37,700 a esta nova función chamada f aberto para ficheiro aberto é w. 467 00:20:37,700 --> 00:20:39,430 O que pode denotar w? 468 00:20:39,430 --> 00:20:40,022 Si? 469 00:20:40,022 --> 00:20:41,260 >> Audiencia: Permite que gravar o ficheiro? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. Malan: Deixa gravar o ficheiro. 471 00:20:42,630 --> 00:20:44,810 Polo tanto, hai un par de variantes que podemos conectar aquí. 472 00:20:44,810 --> 00:20:47,184 Pero se só quere ler o ficheiro, que é miralo 473 00:20:47,184 --> 00:20:50,010 e le-lo para a memoria, vostede non necesitará empregar entre comiñas "r". 474 00:20:50,010 --> 00:20:53,110 Se quere escribir para o ficheiro, use entre comiñas "w". 475 00:20:53,110 --> 00:20:55,190 Hai tamén é engadir e un par de outras cousas 476 00:20:55,190 --> 00:20:57,356 se quere modificar os ficheiros existentes. 477 00:20:57,356 --> 00:21:00,480 Agora imos seguir vendo este cousa, entón imos voltar á liña 24. 478 00:21:00,480 --> 00:21:02,640 NULL, ao parecer, é un valor especial que 479 00:21:02,640 --> 00:21:06,070 poden ser devoltos por certas funcións se algo foi wrong-- 480 00:21:06,070 --> 00:21:08,490 se o ficheiro non existe, se queda sen memoria, 481 00:21:08,490 --> 00:21:09,620 ou unha morea de outros erros. 482 00:21:09,620 --> 00:21:13,470 Pero, de momento, imos só supoñer que esa comprobación de erros é só convencional. 483 00:21:13,470 --> 00:21:17,090 Aquí na liña 26, eu estou iteración 0-3 sobre todos os meus alumnos. 484 00:21:17,090 --> 00:21:20,470 E este é o tipo de especie dunha nova función, fprintf, 485 00:21:20,470 --> 00:21:21,460 pero só dar un palpite. 486 00:21:21,460 --> 00:21:24,370 Se printf é só impresión unha cadea formatada, 487 00:21:24,370 --> 00:21:26,507 o que fprintf probablemente significa? 488 00:21:26,507 --> 00:21:27,590 Audiencia: Imprimir nun ficheiro. 489 00:21:27,590 --> 00:21:29,290 DAVID J. Malan: Imprimir un cadea formatada para un arquivo. 490 00:21:29,290 --> 00:21:31,180 Iso é o que a adicional f medios é ficheiro. 491 00:21:31,180 --> 00:21:36,420 E o novo primeiro argumento ten que ser a variable que representa o ficheiro. 492 00:21:36,420 --> 00:21:38,866 Entón só temos un formato corda así como printf. 493 00:21:38,866 --> 00:21:40,740 E aínda que esta sintaxe é novo, iso só 494 00:21:40,740 --> 00:21:44,610 significa conectar o nome do alumno, plugin do dormitorio estudantil e, a continuación, 495 00:21:44,610 --> 00:21:47,160 con fclose, pecha o arquivo. 496 00:21:47,160 --> 00:21:49,730 E entón lastly-- isto é novo e nós imos voltar a este 497 00:21:49,730 --> 00:21:53,240 antes long-- Estou liberando o estudante por razóns 498 00:21:53,240 --> 00:21:54,860 que pasou alí enriba. 499 00:21:54,860 --> 00:21:56,820 Pero imos volver para que, antes de long-- 500 00:21:56,820 --> 00:21:59,820 iso é debido a como é GetString realmente traballando baixo o capó. 501 00:21:59,820 --> 00:22:01,280 >> Entón, imos dar un ollo rápida aquí. 502 00:22:01,280 --> 00:22:04,380 Se eu escribir ls no meu directorio, notar que eu non fago 503 00:22:04,380 --> 00:22:09,360 ten un arquivo chamado students.csv, simplemente non existe, non existe. 504 00:22:09,360 --> 00:22:14,965 Entón, se eu agora compilar este programa, facer structs-1 ,. / Structs-1, 505 00:22:14,965 --> 00:22:20,570 e eu estou indo a ir adiante e escribir Andi, que vive en Berkeley na Universidade de Yale. 506 00:22:20,570 --> 00:22:26,350 Nós imos ter que Rob vive Thayer estes días. 507 00:22:26,350 --> 00:22:33,760 E imos chegar a onde é, penso eu, María está Mather, 508 00:22:33,760 --> 00:22:35,100 se eu ter lembrado correctamente. 509 00:22:35,100 --> 00:22:36,460 >> Polo tanto, nada parece ocorrer. 510 00:22:36,460 --> 00:22:40,680 Pero se eu escribir ls agora, hai students.csv. 511 00:22:40,680 --> 00:22:43,080 Imos adiante e students.csv aberto. 512 00:22:43,080 --> 00:22:46,050 Esta é unha vez un moi formato leve. 513 00:22:46,050 --> 00:22:49,570 Pero eu simplemente adoptou unha convención que eu teño dúas liñas e columnas aquí. 514 00:22:49,570 --> 00:22:52,020 A columna é primeiro primeiros nomes da xente. 515 00:22:52,020 --> 00:22:55,740 A segunda columna é o estudante de dormitorio, ou facultade, ou casa, ou outros adornos. 516 00:22:55,740 --> 00:22:57,900 E agora eu teño gardado ese permanentemente nun arquivo. 517 00:22:57,900 --> 00:22:59,280 >> Polo tanto, non é tan interesante. 518 00:22:59,280 --> 00:23:02,980 Pero este é só un trampolín agora para ser capaz de manter a información 519 00:23:02,980 --> 00:23:04,040 permanentemente. 520 00:23:04,040 --> 00:23:08,340 Entón imos ver agora o que máis podemos facer esas e outras características. 521 00:23:08,340 --> 00:23:10,729 Pero, primeiro, algunha pregunta? 522 00:23:10,729 --> 00:23:12,145 Isto foi moito, e iso foi rápido. 523 00:23:12,145 --> 00:23:16,131 Pero vai ver unha chea máis en PSet 4, ben. 524 00:23:16,131 --> 00:23:16,630 Si? 525 00:23:16,630 --> 00:23:19,360 >> Audiencia: Existe unha maneira de continuar a engadir nomes para o ficheiro? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. Malan: Boa pregunta. 527 00:23:19,880 --> 00:23:21,800 Existe unha maneira de continuar engadindo nomes para o ficheiro? 528 00:23:21,800 --> 00:23:22,340 Si. 529 00:23:22,340 --> 00:23:24,630 E, de feito, se acabar se re-abrir o ficheiro, 530 00:23:24,630 --> 00:23:26,780 usaría Cita unquote "a" por acréscimo, 531 00:23:26,780 --> 00:23:31,090 que quere só de engadir unha nova liña, a nova liña de novo e de novo, exactamente. 532 00:23:31,090 --> 00:23:32,010 Boa pregunta. 533 00:23:32,010 --> 00:23:32,950 Outras preguntas? 534 00:23:32,950 --> 00:23:33,450 Si? 535 00:23:33,450 --> 00:23:35,580 Audiencia: Se executou o programa de novo agora, 536 00:23:35,580 --> 00:23:38,000 sería continuar a engadir nomes para o arquivar ou sería abrir un novo ficheiro? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. Malan: Ah, boa pregunta. 538 00:23:38,740 --> 00:23:41,448 Se executou o programa de novo á dereita agora, quizais ingresaran en novos nomes, 539 00:23:41,448 --> 00:23:44,820 sería engadir ao ficheiro ou substituír o ficheiro? 540 00:23:44,820 --> 00:23:47,420 Este último, porque eu son non usar o modo de datos anexados. 541 00:23:47,420 --> 00:23:49,930 E porque son só cegamente abrir o ficheiro para escrita, 542 00:23:49,930 --> 00:23:51,310 é só ir para substituír o ficheiro. 543 00:23:51,310 --> 00:23:54,570 Entón, eu sería realmente cómpre facer é engadir, se eu queira realmente ter un longo prazo 544 00:23:54,570 --> 00:23:55,350 base de datos. 545 00:23:55,350 --> 00:23:58,220 >> Agora CSV é útil, francamente, mesmo para como se é writing-- 546 00:23:58,220 --> 00:24:00,100 e imos finalmente ver este a finais do semestre, cando 547 00:24:00,100 --> 00:24:01,455 usamos CSVs para outros fins. 548 00:24:01,455 --> 00:24:04,920 Se desexa almacenar todas as persoas que rexistrarte para un evento, 549 00:24:04,920 --> 00:24:07,420 ou se inscribiu para o alumno grupo, ou algo parecido, 550 00:24:07,420 --> 00:24:10,330 almacenar os datos neste tipo de formato é super cómodo. 551 00:24:10,330 --> 00:24:12,580 Porque, literalmente, se eu foron para descargar este arquivo. 552 00:24:12,580 --> 00:24:14,540 Podería double-- e imos realmente tentar iso 553 00:24:14,540 --> 00:24:16,720 se eu tivera Excel ou Numbers aquí. 554 00:24:16,720 --> 00:24:19,130 >> Vou botón dereito do rato ou control-clic meu arquivo. 555 00:24:19,130 --> 00:24:20,020 Whoops. 556 00:24:20,020 --> 00:24:21,830 Botón dereito do rato ou control click co meu arquivo. 557 00:24:21,830 --> 00:24:24,960 Imos, meu rato non está cooperando. 558 00:24:24,960 --> 00:24:32,694 Download-- vou descargar todos os ficheiros aquí para 559 00:24:32,694 --> 00:24:33,860 só así podo pegar este. 560 00:24:33,860 --> 00:24:37,850 E imos ver se funciona primeira vez students.csv-- 561 00:24:37,850 --> 00:24:39,310 Eu activada. 562 00:24:39,310 --> 00:24:41,360 Agora queren ver os meus contactos. 563 00:24:41,360 --> 00:24:44,310 Agora, eu teño que rexistrar. 564 00:24:44,310 --> 00:24:47,620 Vexa como é fácil usar CSVs? 565 00:24:47,620 --> 00:24:50,840 Si, mantéñase o actualizado. 566 00:24:50,840 --> 00:24:52,375 OK, agora estamos preparados para a clase. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, o que hai de novo? 569 00:25:00,370 --> 00:25:02,920 OK, pechar. 570 00:25:02,920 --> 00:25:04,750 Iso foi máxica. 571 00:25:04,750 --> 00:25:07,280 OK, agora temos que actualizar. 572 00:25:07,280 --> 00:25:10,890 E agora, se lle esqueceu o que arquivar I orixinalmente inaugurado, 573 00:25:10,890 --> 00:25:13,090 pero o que A-- alí imos nós. 574 00:25:13,090 --> 00:25:16,341 OK, entón agora temos un arquivo de Excel. 575 00:25:16,341 --> 00:25:18,290 Grazas. 576 00:25:18,290 --> 00:25:20,764 >> OK, entón o que eu fixen foi a parte fácil. 577 00:25:20,764 --> 00:25:23,930 Claro que eu podería preinstalado Excel ou Numbers, ou calquera programa. 578 00:25:23,930 --> 00:25:25,846 Pero iso é bo, porque agora podo manipular 579 00:25:25,846 --> 00:25:28,090 os datos nun formato estándar. 580 00:25:28,090 --> 00:25:30,294 >> Entón agora imos contexto pasar a onde paramos 581 00:25:30,294 --> 00:25:32,710 última vez, o que era para comezar para sacar rodinhas. 582 00:25:32,710 --> 00:25:34,543 Pero, primeiro, non fixo vexa este xantar antes 583 00:25:34,543 --> 00:25:38,150 está de novo pasando aquí no lume e Xeo en Cambridge, sitar en New Haven. 584 00:25:38,150 --> 00:25:43,150 ¡Rexístrate neste sitio o máis rápido posible CS50s para unirse a estudantes CS50 e empregados. 585 00:25:43,150 --> 00:25:46,090 >> Por iso, tomou rodinhas o luns como follows-- 586 00:25:46,090 --> 00:25:49,120 corda fose declarada en Biblioteca CS50s durante algún tempo. 587 00:25:49,120 --> 00:25:52,650 E é bo, porque permite nós para falar variables como 588 00:25:52,650 --> 00:25:54,660 palabras e frases completas e máis. 589 00:25:54,660 --> 00:25:56,710 Pero resulta cadea non existe. 590 00:25:56,710 --> 00:26:00,200 Isto é só un sinónimo ou un alias, que creamos para algo que 591 00:26:00,200 --> 00:26:03,780 en realidade, é un pouco máis técnico chamado un char *. 592 00:26:03,780 --> 00:26:07,900 >> E, de feito, vimos un exemplo dun programa o luns 593 00:26:07,900 --> 00:26:11,200 que non se comportou así como esperabamos. 594 00:26:11,200 --> 00:26:13,630 Este foi o arquivo, compararse 0. 595 00:26:13,630 --> 00:26:17,910 E lembrar que compararse 0, se Eu recompilar programa de luns 596 00:26:17,910 --> 00:26:22,670 e executar compararse 0 e escriba nai en minúscula e nai en minúsculas novo. 597 00:26:22,670 --> 00:26:25,320 O programa insistiu I escriba cousas diferentes, 598 00:26:25,320 --> 00:26:29,210 aínda que a nai, todo en minúsculas, é idéntica visualmente. 599 00:26:29,210 --> 00:26:31,990 Entón, cal foi a resposta curta por que o ordenador pensa 600 00:26:31,990 --> 00:26:34,500 estas dúas secuencias son diferentes? 601 00:26:34,500 --> 00:26:35,250 Si? 602 00:26:35,250 --> 00:26:36,534 >> Audiencia: [inaudível] 603 00:26:36,534 --> 00:26:37,450 DAVID J. Malan: Correcto. 604 00:26:37,450 --> 00:26:39,600 Entón, a nai, a primeira vez Eu escrebela no, está a ser 605 00:26:39,600 --> 00:26:42,710 almacenado nalgún lugar no meu ordenador de memoria, pero nun lugar diferente 606 00:26:42,710 --> 00:26:44,690 que a segunda vez que eu escribir nai. 607 00:26:44,690 --> 00:26:46,580 Agora que seguramente podería ser óptimo. 608 00:26:46,580 --> 00:26:49,205 O ordenador pode ser intelixente e realizar estas dúas cordas, hey, 609 00:26:49,205 --> 00:26:49,954 son idénticos. 610 00:26:49,954 --> 00:26:51,520 Deixe-me redundantemente almacena-lo. 611 00:26:51,520 --> 00:26:54,229 Pero os ordenadores non teñen isto optimización a menos que diga a eles para. 612 00:26:54,229 --> 00:26:56,061 Entón, por defecto, son só vai acabar 613 00:26:56,061 --> 00:26:57,670 en dous lugares diferentes na memoria. 614 00:26:57,670 --> 00:27:01,570 E así, para ser máis claro, cando nós comparamos as dúas cordas, 615 00:27:01,570 --> 00:27:03,950 O primeiro foi chamado s, o segundo foi chamado 616 00:27:03,950 --> 00:27:08,530 t, o que foi que eu especificamente comparando aquí na liña 13? 617 00:27:08,530 --> 00:27:09,494 Si. 618 00:27:09,494 --> 00:27:12,390 >> Audiencia: É o lugar da memoria que a variable pode apuntar. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. Malan: Exactamente, eu estaba comparando o lugar na memoria 620 00:27:14,900 --> 00:27:16,300 que estas variables apuntado. 621 00:27:16,300 --> 00:27:20,560 Entón, en concreto, a nai estaba en número de bytes 1 e 2, e 3, 622 00:27:20,560 --> 00:27:24,020 4-- e lembre-se porque a barra invertida 0 que ser todo o camiño ao final. 623 00:27:24,020 --> 00:27:29,420 E a outra instancia da nai, m-o-m, Foi no enderezo 10, 11, 12 e 13. 624 00:27:29,420 --> 00:27:33,100 Eu estaba comparando 1, ese enderezo, esa localización na memoria, 625 00:27:33,100 --> 00:27:35,160 contra 10, que é obviamente, non é o mesmo. 626 00:27:35,160 --> 00:27:36,260 1 non é 10. 627 00:27:36,260 --> 00:27:39,620 >> Polo tanto, este é agradable en que é moi sinxelo. 628 00:27:39,620 --> 00:27:42,870 Pero é problemático na medida en que parece que non conseguimos para comparar cadeas. 629 00:27:42,870 --> 00:27:44,930 Entón fundamentally-- e neste nivel baixo, 630 00:27:44,930 --> 00:27:47,300 se quería aplicar un programa para comparar 631 00:27:47,300 --> 00:27:50,270 dúas palabras separadas que o usuario escribiu en para a calidade, 632 00:27:50,270 --> 00:27:53,944 facer eles se aliñan para carbonizar char, só en termos xerais, 633 00:27:53,944 --> 00:27:55,360 o que necesitamos facer, ao parecer? 634 00:27:55,360 --> 00:27:57,940 Non é suficiente só para ollar os dous enderezos. 635 00:27:57,940 --> 00:27:58,860 O que necesitamos facer? 636 00:27:58,860 --> 00:27:59,360 Si? 637 00:27:59,360 --> 00:28:01,120 >> Audiencia: iterado a string [inaudível]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. Malan: Si, imos percorrer a cadea. 639 00:28:02,600 --> 00:28:05,808 Imos usar un loop, un loop while, ou o que sente máis cómodo. 640 00:28:05,808 --> 00:28:08,840 E se temos dúas cordas nalgún lugar na memoria, imos ollar para cada un de 641 00:28:08,840 --> 00:28:11,770 primeiro carácter, a continuación, cada segundo é personaxe, entón terceiro e cuarto, 642 00:28:11,770 --> 00:28:15,206 e quinto, ata chegar o valor especial sentinela? 643 00:28:15,206 --> 00:28:16,080 Audiencia: [inaudível] 644 00:28:16,080 --> 00:28:18,800 DAVID J. Malan: Si, a barra invertida cero, momento no que en calquera cadea 645 00:28:18,800 --> 00:28:20,100 Podemos decidir que é iso. 646 00:28:20,100 --> 00:28:21,970 Temos correspondido cada personaxe? 647 00:28:21,970 --> 00:28:22,990 Se non, volverá false. 648 00:28:22,990 --> 00:28:24,770 Se é así, return true. 649 00:28:24,770 --> 00:28:28,800 E entón iso é o que esta versión do programa compararse 1.c fai. 650 00:28:28,800 --> 00:28:31,677 É o mesmo que o que nós mirou luns, agás que eu teño 651 00:28:31,677 --> 00:28:34,760 se librar da palabra string-- aínda que non ten impact-- funcional todo 652 00:28:34,760 --> 00:28:37,450 Eu estou facendo agora eliminando algunhas rodinhas visuais, 653 00:28:37,450 --> 00:28:40,880 pero a ver claramente que s e t son enderezos. 654 00:28:40,880 --> 00:28:43,020 E iso é o que a estrela, o asterisco representa 655 00:28:43,020 --> 00:28:46,690 é un enderezo, tamén coñecido técnicamente máis como un punteiro. 656 00:28:46,690 --> 00:28:49,880 >> Entón, cando eu declarar s en liña 9 e dicir char * s, 657 00:28:49,880 --> 00:28:52,160 iso non significa darme unha corda. 658 00:28:52,160 --> 00:28:56,360 Isto significa darme unha variable cuxo propósito na vida é para gardar un enderezo. 659 00:28:56,360 --> 00:29:00,400 Porque eu estou a punto de poñer o dirección dunha cadea para el. 660 00:29:00,400 --> 00:29:03,500 E, de feito, GetString, para ser claro, non retorna un cadea. 661 00:29:03,500 --> 00:29:06,110 Ela non retorna nai barra invertida cero, per se. 662 00:29:06,110 --> 00:29:10,005 O que especificamente GetString e precisamente volver? 663 00:29:10,005 --> 00:29:10,880 Audiencia: [inaudível] 664 00:29:10,880 --> 00:29:14,080 DAVID J. Malan: un enderezo, o enderezo do primeiro carácter 665 00:29:14,080 --> 00:29:16,070 nalgunha corda que chegase. 666 00:29:16,070 --> 00:29:19,250 E agora estamos a ver a palabra chave especial de novo. 667 00:29:19,250 --> 00:29:20,640 E, eu aludiu a que antes. 668 00:29:20,640 --> 00:29:23,620 Isto vai ser bo convenio que veremos de novo e de novo agora. 669 00:29:23,620 --> 00:29:27,540 Estou comprobando para asegurarse de que s non é nulo e t non é nulo. 670 00:29:27,540 --> 00:29:30,100 Porque con base na miña realmente rápida mención anteriormente, 671 00:29:30,100 --> 00:29:35,510 o que pode significar, se non volve GetString un enderezo, pero de N-L-L-L, que é novo, 672 00:29:35,510 --> 00:29:36,990 algún valor especial? 673 00:29:36,990 --> 00:29:37,890 >> Audiencia: Erro. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. Malan: É un erro. 675 00:29:38,600 --> 00:29:39,550 Algo foi mal. 676 00:29:39,550 --> 00:29:41,341 E o que tipicamente pode ocorrer, especialmente 677 00:29:41,341 --> 00:29:45,162 co que se pode strings-- de lonxitude descoñecido en advance-- 678 00:29:45,162 --> 00:29:46,870 quizais os ordenadores dos sen memoria, quizais 679 00:29:46,870 --> 00:29:49,280 escribiu, de tal longa palabra ou frase 680 00:29:49,280 --> 00:29:51,880 ou pegado un gran ensaio tal hai non só a memoria suficiente. 681 00:29:51,880 --> 00:29:55,340 E así GetString non pode volver a dirección da cousa toda, 682 00:29:55,340 --> 00:29:56,620 polo que só volve nada. 683 00:29:56,620 --> 00:30:00,580 E el di que un erro ocorreu retornando o valor especial NULL. 684 00:30:00,580 --> 00:30:02,890 É a dirección cero, por así dicir. 685 00:30:02,890 --> 00:30:06,157 >> Agora, descóbrese C vén cun función que fai a iteración. 686 00:30:06,157 --> 00:30:09,240 Non hai que aplicar iso con un loop ou un loop while nós mesmos. 687 00:30:09,240 --> 00:30:11,150 Podemos utilizar unha función, chamado de forma sucinta, 688 00:30:11,150 --> 00:30:15,400 trasfega comp ou cadea de comparación, cuxa propósito na vida é facer exactamente isto. 689 00:30:15,400 --> 00:30:19,990 Vostede darlle dous punteiros, dous enderezos, e que vai para estes enderezos 690 00:30:19,990 --> 00:30:23,130 e entón comparar carta letra por letra para a calidade, 691 00:30:23,130 --> 00:30:26,610 parando só cando o que é verdade? 692 00:30:26,610 --> 00:30:31,540 Cando intuitivamente debe trasfega comp deixar a iteración, só para quedar claro? 693 00:30:31,540 --> 00:30:35,400 Cando chega unha barra invertida 0 en calquera corda, en que punto pode decidir 694 00:30:35,400 --> 00:30:38,910 ten todo combinado, ou houbo unha discrepancia? 695 00:30:38,910 --> 00:30:42,740 >> Entón, se nós funcionan este momento e tentar o noso partido pouco capitalización, 696 00:30:42,740 --> 00:30:49,260 así que comparar-1, ./compare-1, e escriba nai en minúsculas ambas veces. 697 00:30:49,260 --> 00:30:50,560 Agora é o mesmo. 698 00:30:50,560 --> 00:30:54,080 E se eu facelo de novo con minúsculas e entón quizais maiúsculas. 699 00:30:54,080 --> 00:30:56,720 Agora é realmente distingue entre maiúsculas e minúsculas. 700 00:30:56,720 --> 00:31:00,440 Entón, non tan difícil ou máxico, pero agora explicar 701 00:31:00,440 --> 00:31:03,140 o que está a suceder debaixo do capó. 702 00:31:03,140 --> 00:31:07,640 >> Entón, o que máis podemos extraer dende este tipo de lección? 703 00:31:07,640 --> 00:31:08,980 Entón, imos dar un ollo niso. 704 00:31:08,980 --> 00:31:15,380 Eu estou indo a ir adiante e escribir programa rápido aquí chamado copy-0. 705 00:31:15,380 --> 00:31:21,594 E agora imos ir adiante e, de feito, imos facer isto-- con copia-0, 706 00:31:21,594 --> 00:31:23,010 Bótalle un ollo ao que eu teño aquí. 707 00:31:23,010 --> 00:31:24,712 I primeiro informar ao usuario, diga algo. 708 00:31:24,712 --> 00:31:26,420 Entón eu recibín unha cadea e eu almacenado s. 709 00:31:26,420 --> 00:31:29,810 Entón eu comprobar que s é igual a é igual a NULL, pode voltar 1. 710 00:31:29,810 --> 00:31:31,590 Polo tanto, esta é só a comprobación de erros estándar. 711 00:31:31,590 --> 00:31:33,112 Nada interesante aconteceu. 712 00:31:33,112 --> 00:31:36,320 E, de feito, se nos livrarmos do erro a comprobación, esta parece ser unha semana de código 713 00:31:36,320 --> 00:31:36,985 no momento. 714 00:31:36,985 --> 00:31:39,110 Pero eu comecei a estar un pouco mellor sobre iso. 715 00:31:39,110 --> 00:31:43,340 >> Agora, na liña 16, unha semana, quizais día ata unha parella ou minutos, 716 00:31:43,340 --> 00:31:46,720 pódese dicir liña 16 é a creación dunha variable chamada t 717 00:31:46,720 --> 00:31:48,219 e copia é para el. 718 00:31:48,219 --> 00:31:50,010 E iso é un perfectamente takeaway razoable. 719 00:31:50,010 --> 00:31:51,560 Pero ser máis preciso momento. 720 00:31:51,560 --> 00:31:54,190 O que está a suceder na liña 16? 721 00:31:54,190 --> 00:31:56,170 O que está a ser copiado da dereita á esquerda? 722 00:31:56,170 --> 00:31:56,669 Si? 723 00:31:56,669 --> 00:31:58,490 Audiencia: É t obter un enderezo de s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. Malan: Exactamente, t está a recibir o seu enderezo de s. 725 00:32:01,220 --> 00:32:05,170 Así, para ser claro agora, se eu for de volta a ese exemplo anterior 726 00:32:05,170 --> 00:32:08,520 e eu sacar a cousa que eu escriba. 727 00:32:08,520 --> 00:32:11,640 E o que eu escriba em-- aquí está s, e aquí 728 00:32:11,640 --> 00:32:15,830 é o que eu escriba en algún lugar memoria, nai e, a continuación, unha barra invertida 729 00:32:15,830 --> 00:32:17,840 0 que se engade para min. 730 00:32:17,840 --> 00:32:23,060 O que eu almacenados aquí, recordo, este está na posición 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 iso é o que está actualmente en s. 732 00:32:24,655 --> 00:32:29,220 Polo tanto, na liña 16, digo me dea outra variable chamada t e tenda 733 00:32:29,220 --> 00:32:33,590 en polo valor de s, que fica almacenado aquí non vai mom 734 00:32:33,590 --> 00:32:35,480 senón só o número 1. 735 00:32:35,480 --> 00:32:38,520 >> Polo tanto, se miramos cara ao futuro neste programa agora, o que vai pasar? 736 00:32:38,520 --> 00:32:40,690 Entón, teña en conta que non hai esta función pode 737 00:32:40,690 --> 00:32:44,410 utilizaron este un tempo para César, ou Vigenère, ou que non en todos. 738 00:32:44,410 --> 00:32:48,170 Eu reclamo co meu printf, eu son vai capitalizar a copia t. 739 00:32:48,170 --> 00:32:51,616 Primeiro na liña 19, sanidade rápida verificación, comprobacións strlen a lonxitude de t. 740 00:32:51,616 --> 00:32:53,740 Porque eu non quero tentar capitalizar algo 741 00:32:53,740 --> 00:32:55,104 se non hai ningunha secuencia de alí. 742 00:32:55,104 --> 00:32:57,520 O usuario simplemente premer Intro, non hai nada para capitalizar. 743 00:32:57,520 --> 00:33:01,100 Entón eu non quero facer liña 21. 744 00:33:01,100 --> 00:33:05,758 Entón liña 21 está capitalizando que carta ao parecer en t? 745 00:33:05,758 --> 00:33:06,514 >> Audiencia: m? 746 00:33:06,514 --> 00:33:08,722 DAVID J. Malan: Mira como se fose copiar cal? 747 00:33:08,722 --> 00:33:09,486 Audiencia: 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, entón o primeiro m, porque aviso que estou 750 00:33:12,685 --> 00:33:14,935 pasando para toupper, que se nunca viu é 751 00:33:14,935 --> 00:33:16,980 só unha función para capitalizar como a súa entrada. 752 00:33:16,980 --> 00:33:20,240 t significa dar soporte de cero mo cero de t. 753 00:33:20,240 --> 00:33:22,550 E así como fai este cambio de imaxe, para ser claro? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 O que ten que ser reescrito ou alterado en relación a s e t e nai 756 00:33:29,160 --> 00:33:30,097 de cero barra invertida. 757 00:33:30,097 --> 00:33:31,470 >> Audiencia: [inaudível] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. Malan: Si, polo que este un aquí simplemente 759 00:33:34,030 --> 00:33:40,860 precisa mudar a-- corrixir isto-- Debe ser cambiado un capital m. 760 00:33:40,860 --> 00:33:44,330 Pero agora, mire a finais do programa, se eu imprimir 761 00:33:44,330 --> 00:33:49,800 s e t como eu limpar aquí, ver o que é ocorrerá imprimir e s t. 762 00:33:49,800 --> 00:33:54,310 Entón, faga copy-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Deixe-me ir adiante e escriba na nai en todas as minúsculas. 764 00:33:57,140 --> 00:34:00,140 Teña en conta o orixinal e a copia ser capitalizados. 765 00:34:00,140 --> 00:34:00,850 Por que? 766 00:34:00,850 --> 00:34:04,431 Ben, s e t son ambos a apuntar cara, se, o mesmo anaco de memoria. 767 00:34:04,431 --> 00:34:06,930 E, francamente, iso está quedando uninteresting-- realmente o feito 768 00:34:06,930 --> 00:34:09,150 que estamos a usar o enderezo de cero aquí. 769 00:34:09,150 --> 00:34:11,719 É dicir, eu realmente non me importa onde o material está na memoria. 770 00:34:11,719 --> 00:34:13,550 Sentímolo eu estou apagando un pouco máis. 771 00:34:13,550 --> 00:34:15,674 Pero eu realmente non me importa onde as cousas están na memoria. 772 00:34:15,674 --> 00:34:18,510 E así, de feito o que programadores tenden a pensar 773 00:34:18,510 --> 00:34:21,080 é que cando fala de un enderezo ou un punteiro, 774 00:34:21,080 --> 00:34:22,679 quen lle importa onde está na memoria. 775 00:34:22,679 --> 00:34:24,989 Eu non me importa se é en byte un ou mil millóns. 776 00:34:24,989 --> 00:34:27,920 Só me importa que esta variable é eficaz 777 00:34:27,920 --> 00:34:29,620 apuntando a que pedazo de memoria. 778 00:34:29,620 --> 00:34:33,350 E así, a partir de agora, máis que tergiversar sobre enderezos de memoria arbitrarias, imos 779 00:34:33,350 --> 00:34:36,710 pode comezar a deseñar punteiros como punteiros, como frechas. 780 00:34:36,710 --> 00:34:39,340 Entón, o que s e t realmente son, segundo este programa, 781 00:34:39,340 --> 00:34:42,130 por mor de como eu criei t, é só dúas variables separadas 782 00:34:42,130 --> 00:34:43,840 apuntando para o mesmo anaco de memoria. 783 00:34:43,840 --> 00:34:45,215 E non nos importa onde eles están. 784 00:34:45,215 --> 00:34:47,130 Así, podemos abstraerse ese detalle. 785 00:34:47,130 --> 00:34:48,780 >> Entón, como fago para solucionar isto? 786 00:34:48,780 --> 00:34:54,120 Se eu queira escribir unha versión da copia programa que realmente copia a secuencia de caracteres 787 00:34:54,120 --> 00:34:56,840 e capitalizar só o copia, só de forma intuitiva, 788 00:34:56,840 --> 00:34:59,766 o que ten que ser un Ingrediente para a nosa solución? 789 00:34:59,766 --> 00:35:00,640 Audiencia: [inaudível] 790 00:35:00,640 --> 00:35:01,420 DAVID J. Malan: Necesitamos unha cousa? 791 00:35:01,420 --> 00:35:01,820 Audiencia: Peza de memoria. 792 00:35:01,820 --> 00:35:03,280 DAVID J. Malan: Necesitamos outro anaco de memoria, non? 793 00:35:03,280 --> 00:35:05,360 Non sabemos como facelo aínda, necesariamente. 794 00:35:05,360 --> 00:35:11,330 Pero eu medio que ten que isto ocorre de xeito que a nai orixinal no caso de menor 795 00:35:11,330 --> 00:35:14,170 acaba nese anaco extra de memoria. 796 00:35:14,170 --> 00:35:19,770 E entón cando cambiar a copia, eu Non quero cambiar esa copia aquí. 797 00:35:19,770 --> 00:35:26,020 I en vez quere cambiar só este copia do orixinal, de xeito que permanece inalterada. 798 00:35:26,020 --> 00:35:27,980 >> Entón, imos ver como podemos facelo. 799 00:35:27,980 --> 00:35:31,800 En copy-1, que xa ten foi desposuído de comentario, 800 00:35:31,800 --> 00:35:33,250 pero é comentado en liña. 801 00:35:33,250 --> 00:35:36,710 Nós en vez facer a estes following-- liñas son idénticos, me unha corda 802 00:35:36,710 --> 00:35:38,340 e chamalo s. 803 00:35:38,340 --> 00:35:43,500 Pero agora imos ollar para un dos nosos máis complexo pero o último de complexidade 804 00:35:43,500 --> 00:35:47,340 por algún tempo, liña 16 fai exactamente iso. 805 00:35:47,340 --> 00:35:49,400 Polo tanto, se o seu cómodo co imaxe que drew-- 806 00:35:49,400 --> 00:35:51,790 déame un novo anaco de memoria, copiar todo para el, 807 00:35:51,790 --> 00:35:53,730 imos ver como podemos traducir isto para código. 808 00:35:53,730 --> 00:35:59,400 >> Así a liña 16, na parte esquerda, char * t dáme esa caixa por aquí. 809 00:35:59,400 --> 00:36:00,230 Isto é todo o que fai. 810 00:36:00,230 --> 00:36:03,240 No lado dereito, m alloc, ou malloc, 811 00:36:03,240 --> 00:36:06,480 é a distribución de memoria, super extravagante, un xeito enigmática de só dicir 812 00:36:06,480 --> 00:36:07,640 déame unha peza de memoria. 813 00:36:07,640 --> 00:36:09,290 Canta memoria necesitamos? 814 00:36:09,290 --> 00:36:10,910 Ben, é unha especie de gran expresión. 815 00:36:10,910 --> 00:36:12,570 Pero imos ver o que di aquí. 816 00:36:12,570 --> 00:36:15,940 Entón, iso, por suposto, é dar- me a lonxitude da corda de s. 817 00:36:15,940 --> 00:36:19,094 Entón, a nai debe ser o que? 818 00:36:19,094 --> 00:36:21,010 Entón, só tres, non? nai é de tres caracteres. 819 00:36:21,010 --> 00:36:22,830 Non contar co barra invertida cero cando 820 00:36:22,830 --> 00:36:25,960 falar a lonxitude dunha cadea é de feito, as letras visíbeis humanos. 821 00:36:25,960 --> 00:36:28,020 Entón nai, entón iso me dá 3. 822 00:36:28,020 --> 00:36:31,170 Pero agarde un minuto, eu agora estou engadindo 1. 823 00:36:31,170 --> 00:36:34,861 Por que realmente quero reservar 4 bytes e non só 3? 824 00:36:34,861 --> 00:36:35,360 Si? 825 00:36:35,360 --> 00:36:36,910 >> Audiencia: Para o valor de sentinela? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. Malan: Exactamente, para ese valor de sentinela. 827 00:36:38,951 --> 00:36:40,840 Á barra invertida cero, Necesito total de 4 bytes. 828 00:36:40,840 --> 00:36:42,870 Entón, eu teño da lonxitude da corda máis unha. 829 00:36:42,870 --> 00:36:45,400 E, a continuación, só para unha boa measure-- malia neste sistema, 830 00:36:45,400 --> 00:36:49,390 está sempre será 1-- digo multiplicar este por o tamaño dun carbón animal. 831 00:36:49,390 --> 00:36:51,552 Acontece que é sizeof un operador en C que 832 00:36:51,552 --> 00:36:53,260 só dille o número de bytes que é 833 00:36:53,260 --> 00:36:54,700 requirido para un determinado tipo de datos. 834 00:36:54,700 --> 00:36:57,740 Non funciona para matrices, normalmente, ás veces fai. 835 00:36:57,740 --> 00:36:59,210 Pero, no caso xeral, sen. 836 00:36:59,210 --> 00:37:02,330 Pero me vai dicir cantos bytes un char é, o que acaba sempre 1. 837 00:37:02,330 --> 00:37:04,080 Entón, iso é como multiplicar por 1. 838 00:37:04,080 --> 00:37:05,900 >> Liña de ollar tan super enigmático de código. 839 00:37:05,900 --> 00:37:09,320 Pero todo o que fai é dá me unha peza de memoria. 840 00:37:09,320 --> 00:37:13,590 Pero iso parece estar copiando algo no que a memoria? 841 00:37:13,590 --> 00:37:14,560 Aínda non. 842 00:37:14,560 --> 00:37:22,040 E entón o que fago na liña 22, e 23, 24, 25, así, eu simplemente facelo. 843 00:37:22,040 --> 00:37:23,760 E este é o tipo de material escolar vello agora. 844 00:37:23,760 --> 00:37:26,010 Isto é debido a PSet 2, onde está só movendo as cousas 845 00:37:26,010 --> 00:37:28,620 en torno á memoria, ou mellor, en cadeas. 846 00:37:28,620 --> 00:37:31,920 >> Entón, eu estou repetindo de 0 a a lonxitude da cadea s. 847 00:37:31,920 --> 00:37:37,820 E eu estou copiando o personaxe i-th n para o personaxe i-th en t. 848 00:37:37,820 --> 00:37:41,820 E porque, o programador, feita Asegúrese de reservar exactamente como moitos bytes 849 00:37:41,820 --> 00:37:44,600 como eu teño, é perfecto un a un. 850 00:37:44,600 --> 00:37:47,060 E eu copiar nai en minúsculas ao novo título. 851 00:37:47,060 --> 00:37:50,170 E entón, finalmente, fago esa liña. 852 00:37:50,170 --> 00:37:54,637 E así o efecto só é para capitalizar esta t aquí. 853 00:37:54,637 --> 00:37:56,470 Entón, unha morea de absorber, pero se considerar só 854 00:37:56,470 --> 00:37:58,220 o que realmente está a suceder por baixo do capuz 855 00:37:58,220 --> 00:38:00,880 é só movendo estes bytes arredor, todo o que 856 00:38:00,880 --> 00:38:06,617 é necesaria para resolver este problema é só para dar este anaco de memoria. 857 00:38:06,617 --> 00:38:08,450 Agora, co risco de esmagadora, deixe-me amosar 858 00:38:08,450 --> 00:38:13,200 outro exemplo que é case idénticas, excepto para esta 859 00:38:13,200 --> 00:38:14,350 liña de código. 860 00:38:14,350 --> 00:38:18,870 Polo tanto, esta é a versión de hackers deste programa, se quere. 861 00:38:18,870 --> 00:38:21,050 Pero imos só destilar Lo en o que está pasando. 862 00:38:21,050 --> 00:38:28,920 A liña 24 é usado para ser este t soporte i recibe soporte s i. 863 00:38:28,920 --> 00:38:33,370 Agora, eu estou cambiando isto para a estrela máis enigmática t 864 00:38:33,370 --> 00:38:36,280 máis 1 é igual a estrela máis 1 s. 865 00:38:36,280 --> 00:38:38,702 >> Entón o que está a suceder e por que temos un personaxe estrela? 866 00:38:38,702 --> 00:38:41,410 Vimos a estrela antes, e está a ser usado de forma diferente aquí. 867 00:38:41,410 --> 00:38:45,490 Xa vimos char *, agora estou vendo Unha estrela no inicio, e iso é OK. 868 00:38:45,490 --> 00:38:48,190 Pois parece que pode tipo de inferir só 869 00:38:48,190 --> 00:38:50,280 daqueles primeiro principios que está a suceder. 870 00:38:50,280 --> 00:38:53,860 Entón, só para quedar claro, o que é s? 871 00:38:53,860 --> 00:38:55,052 A semana pasada, foi unha cadea. 872 00:38:55,052 --> 00:38:56,260 Iso non é suficiente anymore. 873 00:38:56,260 --> 00:38:57,690 ¿Que é s, especialmente? 874 00:38:57,690 --> 00:38:58,590 >> Audiencia: [inaudível] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. Malan: É un punteiro. 876 00:38:59,881 --> 00:39:02,610 É o tipo de escola primeiro carácter ingresaran en nós. 877 00:39:02,610 --> 00:39:04,780 OK, o que é t? 878 00:39:04,780 --> 00:39:05,660 >> Audiencia: [inaudível] 879 00:39:05,660 --> 00:39:07,950 >> David J. Malan: A enderezo do primeiro byte 880 00:39:07,950 --> 00:39:10,490 en t, que pedazo de memoria realocada. 881 00:39:10,490 --> 00:39:14,720 Así, verifícase que, cando iteración de 0 diante ata a cadea 882 00:39:14,720 --> 00:39:17,424 length-- ante todo, i Comeza a 0, porque 883 00:39:17,424 --> 00:39:18,840 desta antiga escola para cousa loop. 884 00:39:18,840 --> 00:39:22,400 Entón, só para simplificar, imos supoñer que a primeira liña de código 885 00:39:22,400 --> 00:39:23,760 é realmente só iso, non. 886 00:39:23,760 --> 00:39:26,080 Se I é cero, cero, engadindo a algo presuntamente 887 00:39:26,080 --> 00:39:27,540 non vai ter un efecto. 888 00:39:27,540 --> 00:39:28,560 >> Entón, cal é a palabra? 889 00:39:28,560 --> 00:39:31,600 Acontece que a estrela operador neste contexto 890 00:39:31,600 --> 00:39:33,700 é o dereference operador, que é só 891 00:39:33,700 --> 00:39:37,530 un xeito elegante de dicir ir ao seguinte enderezo. 892 00:39:37,530 --> 00:39:42,080 Polo tanto, se s é a dirección do primeiro personaxe neste anaco de memoria, 893 00:39:42,080 --> 00:39:43,630 * S medios ir máis alá. 894 00:39:43,630 --> 00:39:45,630 E porque temos deseñada a imaxe deste xeito, 895 00:39:45,630 --> 00:39:47,430 pode adoptar o seguindo o modelo mental. 896 00:39:47,430 --> 00:39:51,030 Se esta é a s, e di * s * s, tipo de como ramplas e escaleiras, 897 00:39:51,030 --> 00:39:54,540 se se lembra do xogo desde a infancia, é como seguir este frecha e vai 898 00:39:54,540 --> 00:39:55,570 para o enderezo. 899 00:39:55,570 --> 00:39:57,080 >> * T é o mesmo. 900 00:39:57,080 --> 00:39:59,855 Entón comeza aquí, vai para o seu anaco. 901 00:39:59,855 --> 00:40:03,350 Non podo simplemente deseñar sobre Nesta pantalla desta forma. 902 00:40:03,350 --> 00:40:05,560 * T significa que ir aquí. 903 00:40:05,560 --> 00:40:08,830 E, a continuación, o loop for só dicindo mover ese personaxe aquí, 904 00:40:08,830 --> 00:40:11,330 mover ese personaxe aquí, mover ese personaxe aquí. 905 00:40:11,330 --> 00:40:12,890 Pero como podo facer iso incrementação? 906 00:40:12,890 --> 00:40:15,430 Necesito desfacer o que eu acaba de eliminar. 907 00:40:15,430 --> 00:40:18,140 Isto é o que normalmente se chama aritmética de punteiro, que 908 00:40:18,140 --> 00:40:20,040 significa matemáticas con enderezos. 909 00:40:20,040 --> 00:40:22,460 >> Se, neste loop for, Eu sigo incremento i, 910 00:40:22,460 --> 00:40:26,880 e s é un enderezo de correo t é un enderezo, se eu simplemente seguir engadindo 1, 911 00:40:26,880 --> 00:40:31,406 isto significa só seguir adiante, e para adiante, e para adiante na memoria. 912 00:40:31,406 --> 00:40:34,030 É como Oxford Street, o rúa que o edificio está no CS. 913 00:40:34,030 --> 00:40:36,490 Os edificios do CS é de 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Entón, se fose facer 33 Oxford Street máis 1, 915 00:40:39,870 --> 00:40:42,870 que o leva ata 34 Oxford Street, a continuación, 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 logo 36 Oxford Street, calquera que edificios realmente son - se os houbese. 917 00:40:46,380 --> 00:40:50,540 E así, iso é todo o que estamos facendo aquí coa aritmética de punteiro. 918 00:40:50,540 --> 00:40:53,820 >> Polo tanto, é un xeito super arcano de expresarnos. 919 00:40:53,820 --> 00:40:56,160 Pero todo o que está pasando debaixo da capa 920 00:40:56,160 --> 00:40:59,330 só está seguindo estes enderezos, como seguir un mapa, se quixeren, 921 00:40:59,330 --> 00:41:02,692 ou a raíz frechas como temos deseñado na pantalla. 922 00:41:02,692 --> 00:41:04,910 OK, unha morea de dixerir. 923 00:41:04,910 --> 00:41:10,410 Calquera pregunta sobre a sintaxe, conceptos, punteiros, malloc, ou semellantes. 924 00:41:10,410 --> 00:41:11,480 Si, aquí en primeiro lugar. 925 00:41:11,480 --> 00:41:13,755 >> Audiencia: Entón onde iso di * t é igual a toupper * t, 926 00:41:13,755 --> 00:41:15,575 é o que vai capitalizar todas as letras ou apenas-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. Malan: Ah, pregunta moi boa. 928 00:41:17,283 --> 00:41:19,805 Entón nesa liña aquí, 31, é que isto vai capitalizar 929 00:41:19,805 --> 00:41:21,430 a primeira letra ou de todas as cartas. 930 00:41:21,430 --> 00:41:23,460 Entón, imos responder a iso, vai de volta aos primeiros principios. 931 00:41:23,460 --> 00:41:26,168 E primeiros principios aquí quero dicir só tes que ir para as definicións básicas 932 00:41:26,168 --> 00:41:27,000 que toma parte. 933 00:41:27,000 --> 00:41:29,770 Entón toupper é unha función que capitalizar un char. 934 00:41:29,770 --> 00:41:30,530 Iso é todo. 935 00:41:30,530 --> 00:41:36,740 * T significa ir ao first-- ir ao enderezo en t. 936 00:41:36,740 --> 00:41:40,350 Así, na foto, se este é o anaco de memoria que alocados con malloc, 937 00:41:40,350 --> 00:41:43,310 e este é t, * t significa ir aquí. 938 00:41:43,310 --> 00:41:46,710 >> Mentres tanto, está pasando ese valor, minúsculas m 939 00:41:46,710 --> 00:41:50,040 para toupper, está a recibir de volta M maiúscula, onde poñelas? 940 00:41:50,040 --> 00:41:52,410 Está poñendo-o no mesmo lugar. 941 00:41:52,410 --> 00:41:55,540 E así por que a lóxica dos definicións básicas é só 942 00:41:55,540 --> 00:41:58,792 capitalizando a primeira letra a non ser que interactuar con i ou un 943 00:41:58,792 --> 00:42:02,000 loop ou un loop while, non vai para facer algo máis que preguntar iso. 944 00:42:02,000 --> 00:42:02,583 Boa pregunta. 945 00:42:02,583 --> 00:42:03,237 Si? 946 00:42:03,237 --> 00:42:05,369 >> Audiencia: Por que use o dereference método, no canto de 947 00:42:05,369 --> 00:42:05,979 matriz? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. Malan: Ah, boa pregunta. 949 00:42:07,395 --> 00:42:10,672 Por que usaría o dereference método, no canto do método de array? 950 00:42:10,672 --> 00:42:12,130 Ningunha razón en particular, para ser honesto. 951 00:42:12,130 --> 00:42:15,290 E, de feito, para este tipo de exemplo, dereito, 952 00:42:15,290 --> 00:42:17,556 Estou só discutindo facendo o programa máis complicado, 953 00:42:17,556 --> 00:42:19,680 Máis ollos están vidrosos, a xente a visitar a 954 00:42:19,680 --> 00:42:22,830 porque este parece super arcano, pero mesmo que está facendo o mesmo. 955 00:42:22,830 --> 00:42:26,695 E así, a verdade, esta é unha solución innecesariamente complexo visualmente 956 00:42:26,695 --> 00:42:27,320 ao problema. 957 00:42:27,320 --> 00:42:29,580 >> É aínda bo deseño, cinco de cinco para o proxecto, 958 00:42:29,580 --> 00:42:33,140 se é na franxa notación ou a notación de punteiro. 959 00:42:33,140 --> 00:42:36,299 Mas-- especialmente cando chegamos máis tarde no curso en PSet 5 960 00:42:36,299 --> 00:42:39,340 cando Implementar este dicionario que Eu mencionar un par de vezes-- 961 00:42:39,340 --> 00:42:42,300 imos realmente se preocupan o enderezos de memoria de baixo nivel 962 00:42:42,300 --> 00:42:44,140 que realmente entendemos Qué está a pasar. 963 00:42:44,140 --> 00:42:48,300 >> Pero, por agora, parece que este liña de código corchetes aquí cadrados 964 00:42:48,300 --> 00:42:49,900 non hai realmente. 965 00:42:49,900 --> 00:42:52,230 Son o que se chama azucre sintático, que 966 00:42:52,230 --> 00:42:58,390 é só un xeito estrañamente legal de dicir a compilador convértese corchetes ser 967 00:42:58,390 --> 00:43:00,420 que a expresión matemática. 968 00:43:00,420 --> 00:43:02,660 Polo tanto, é unha convención humana para poder escribir só 969 00:43:02,660 --> 00:43:04,220 estes soportes moi doado de usar. 970 00:43:04,220 --> 00:43:06,850 Pero o que o compilador, clang, está realmente facendo calquera momento 971 00:43:06,850 --> 00:43:10,970 escribe o que está en destaque na liña 24, debaixo da capa é realmente 972 00:43:10,970 --> 00:43:12,330 convertelo lo a este. 973 00:43:12,330 --> 00:43:16,200 É só máis prazeroso como un ser humano a ler e escribir código como liña 24. 974 00:43:16,200 --> 00:43:18,530 Pero, finalmente, os Rodas pequenas veñen off 975 00:43:18,530 --> 00:43:21,780 cando o propio confort está máis forte. 976 00:43:21,780 --> 00:43:27,240 >> Todo ben, entón recordar, a continuación, que este Era o tipo de maior problema 977 00:43:27,240 --> 00:43:27,807 Deparamo-nos. 978 00:43:27,807 --> 00:43:30,640 E iso é o que desencadeou todo este conversa maldita sobre punteiros, 979 00:43:30,640 --> 00:43:32,340 e enderezos, e copiando cousas. 980 00:43:32,340 --> 00:43:35,410 Foi porque tropezou este problema parvo, parvo, polo cal 981 00:43:35,410 --> 00:43:38,830 Eu apliquei logically-- con Lauren aquí na demo eo zume de laranxa 982 00:43:38,830 --> 00:43:43,770 no milk-- un perfectamente algorithmically función correcta 983 00:43:43,770 --> 00:43:47,010 para cambiar dúas variables ' valores, pero a maldita cousa 984 00:43:47,010 --> 00:43:50,550 non teñen ningunha persistente, ou permanente, efecto sobre o meu código. 985 00:43:50,550 --> 00:43:51,820 >> E por que isto? 986 00:43:51,820 --> 00:43:54,650 En poucas palabras, por que é isto implantación de cambio 987 00:43:54,650 --> 00:43:58,740 loxicamente correcta, pero non ten impacto sobre as variables que son pasados ​​para el, 988 00:43:58,740 --> 00:44:01,119 como x e y a principal? 989 00:44:01,119 --> 00:44:02,410 Cal era a esencia da cuestión? 990 00:44:02,410 --> 00:44:02,909 Si? 991 00:44:02,909 --> 00:44:05,532 Audiencia: Por variable feito copias da variable no pase 992 00:44:05,532 --> 00:44:06,240 a través da función. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. Malan: Exactamente, cando pasa variables nunha función, ou argumentos 994 00:44:09,060 --> 00:44:11,030 nunha función, son pasou por copia, que 995 00:44:11,030 --> 00:44:14,770 significa que comeza un idéntico á procura patrón de bits para cada X e Y, 996 00:44:14,770 --> 00:44:15,955 chamado aquí ae b. 997 00:44:15,955 --> 00:44:18,080 E pode facer calquera cousa quere con estas copias, 998 00:44:18,080 --> 00:44:20,657 pero eles van ter ningún efecto sobre a función de chamada. 999 00:44:20,657 --> 00:44:22,990 E, de feito, que extraemos imaxe na pantalla, Lembre 1000 00:44:22,990 --> 00:44:25,520 última vez, en que se realmente pensar sobre o que é 1001 00:44:25,520 --> 00:44:28,570 pasando baixo o hood-- se esta é a memoria do seu ordenador, 1002 00:44:28,570 --> 00:44:31,650 e aquí é o anaco de memoria que está a ser usada para o principal, 1003 00:44:31,650 --> 00:44:34,020 este é o anaco de memoria que está a ser utilizada para intercambio, 1004 00:44:34,020 --> 00:44:37,090 e así mesmo se principal ten dúas variables, X e Y, 1005 00:44:37,090 --> 00:44:41,840 de intercambio pode idéntica á procura valores, ambos os cales son 1 e 2, 1006 00:44:41,840 --> 00:44:44,520 pero son totalmente diferentes anacos de memoria. 1007 00:44:44,520 --> 00:44:46,130 >> Entón, necesitamos unha solución para iso. 1008 00:44:46,130 --> 00:44:51,580 E, francamente, parece que temos agora ten unha solución a este problema, non. 1009 00:44:51,580 --> 00:44:55,760 Agora temos a capacidade de manipular as cousas por medio de enderezos 1010 00:44:55,760 --> 00:44:59,310 e, unha especie de ramplas e escaleiras estilo, siga estas frechas 1011 00:44:59,310 --> 00:45:02,820 e ir a calquera lugar que queremos na memoria, non poderiamos nós 1012 00:45:02,820 --> 00:45:06,220 solucionar este problema pasando de principal de intercambiar 1013 00:45:06,220 --> 00:45:09,650 non os valores que queremos intercambio, pero só de forma intuitiva 1014 00:45:09,650 --> 00:45:11,630 o que poderiamos pasar cambiar no seu canto? 1015 00:45:11,630 --> 00:45:12,620 >> [Interpoñendo voces] 1016 00:45:12,620 --> 00:45:15,244 >> DAVID J. Malan: Por que non só pasalo os enderezos, non? 1017 00:45:15,244 --> 00:45:17,470 Por que non imos dar un cambio mapa do tesouro, se quixeren, 1018 00:45:17,470 --> 00:45:20,950 que leva-o para o reais valores x e y. 1019 00:45:20,950 --> 00:45:24,340 Imos intercambio, realmente cambiar eses bits orixinais, no canto de 1020 00:45:24,340 --> 00:45:26,797 só de paso copias dos bits. 1021 00:45:26,797 --> 00:45:29,130 E así, de feito, que é o que se vai ser a solución. 1022 00:45:29,130 --> 00:45:31,899 Esta versión é aquí claramente malo e fallo. 1023 00:45:31,899 --> 00:45:35,190 E agora, a primeira vista, só mira como nós engadimos unha morea de estrelas aleatoriamente 1024 00:45:35,190 --> 00:45:37,106 e cruzou os dedos que ía compilar. 1025 00:45:37,106 --> 00:45:38,460 Pero sería agora compilar. 1026 00:45:38,460 --> 00:45:40,090 >> Pero imos ver o que significan estas cousas. 1027 00:45:40,090 --> 00:45:43,990 E, por desgraza, os autores de C podería escoller outro símbolo 1028 00:45:43,990 --> 00:45:46,380 para facer deste un pouco máis clara, pero o operador estrela 1029 00:45:46,380 --> 00:45:48,610 ten un significado diferente en dous contextos diferentes. 1030 00:45:48,610 --> 00:45:50,890 E vimos que logo, pero imos distinguir. 1031 00:45:50,890 --> 00:45:55,310 >> Así, na parte superior alí, cando eu mudei a eb 1032 00:45:55,310 --> 00:46:00,470 de ser int de na malo versión para int estrelas, a e b, 1033 00:46:00,470 --> 00:46:01,740 Anteriormente, foron enteiros. 1034 00:46:01,740 --> 00:46:05,752 Que son a e b agora en o bo, versión verde? 1035 00:46:05,752 --> 00:46:06,900 Son enderezos. 1036 00:46:06,900 --> 00:46:09,610 Enderezos de que, para ser claro? 1037 00:46:09,610 --> 00:46:10,770 Enderezos de enteiros. 1038 00:46:10,770 --> 00:46:12,520 Así, o feito de que eu son dicindo medios int estrela 1039 00:46:12,520 --> 00:46:15,440 este é o enderezo de un enteiro, especificamente. 1040 00:46:15,440 --> 00:46:19,120 >> Entón agora notar nas liñas de código, outra cousa tamén cambiou. 1041 00:46:19,120 --> 00:46:22,770 tmp segue sendo o mesmo, porque é só o número enteiro temporal, 1042 00:46:22,770 --> 00:46:24,110 ningunha máxica memoria alí. 1043 00:46:24,110 --> 00:46:26,370 Pero unha empresa precisa dunha estrela. 1044 00:46:26,370 --> 00:46:28,560 E, de feito, as outra mención de a e b, 1045 00:46:28,560 --> 00:46:31,780 entender que todo o que é cambiar de vermello a verde 1046 00:46:31,780 --> 00:46:34,209 é que eu estou prefixing as variables con estrelas. 1047 00:46:34,209 --> 00:46:35,750 Porque eu non quero copiar ae b. 1048 00:46:35,750 --> 00:46:40,350 Porque se eu só copiar a eb e intercambio a e b, o que realmente cambiar? 1049 00:46:40,350 --> 00:46:43,760 Só enderezos, quero cambiar o que está en estes enderezos. 1050 00:46:43,760 --> 00:46:44,860 Quero ir máis alá. 1051 00:46:44,860 --> 00:46:48,000 E así o operador estrela dentro da miña función, 1052 00:46:48,000 --> 00:46:51,700 non dentro da lista de parámetros, significa que ir para estes enderezos 1053 00:46:51,700 --> 00:46:54,490 e realmente cambiar estes valores. 1054 00:46:54,490 --> 00:46:56,500 >> Entón, o que fai a imaxe agora ollar como no seu lugar. 1055 00:46:56,500 --> 00:47:03,250 Ben, en vez diso estou pasando por A e B non 1 e 2-- 1056 00:47:03,250 --> 00:47:05,790 En realidade, eu teño engadir outra definición aquí. 1057 00:47:05,790 --> 00:47:09,030 Entón supoño que este anaco de memoria está na posición 10. 1058 00:47:09,030 --> 00:47:12,960 >> Esta é a situación 11, pero este é un pouco de unha simplificación, 1059 00:47:12,960 --> 00:47:18,900 Agora teño dúas opcións pasar x e y é pasar seus enderezos? 1060 00:47:18,900 --> 00:47:22,500 Se eu pasar os seus enderezos como este, eu só 1061 00:47:22,500 --> 00:47:25,390 Agora necesitamos aplicar de intercambio por o código verde 1062 00:47:25,390 --> 00:47:29,080 de xeito que, cando se ve un e cando b ve, non só copiar a eb 1063 00:47:29,080 --> 00:47:30,540 e mover o leite e zume de laranxa. 1064 00:47:30,540 --> 00:47:32,664 O zume de laranxa e leite metáfora agora rompe, 1065 00:47:32,664 --> 00:47:35,060 porque estes son vasos de mapas de líquido e non. 1066 00:47:35,060 --> 00:47:37,750 Nós en vez que ir para tratar 10 e nós 1067 00:47:37,750 --> 00:47:42,420 que ir para xestionar 11, e a continuación, realizar esa lóxica cambio. 1068 00:47:42,420 --> 00:47:45,580 >> Así, a lóxica é a mesma, pero necesitamos un xeito lixeiramente diferente 1069 00:47:45,580 --> 00:47:47,160 de acceder a estas variables. 1070 00:47:47,160 --> 00:47:52,400 E así, ao final, o que o programa ten que mirar como é iso. 1071 00:47:52,400 --> 00:47:56,610 En swap.c literalmente copiados e pegado a versión verde. 1072 00:47:56,610 --> 00:47:58,450 Pero eu teño que facer un cambio. 1073 00:47:58,450 --> 00:48:00,180 Non é suficiente só para cambiar intercambio. 1074 00:48:00,180 --> 00:48:03,830 Que outra liña de código necesito cambiar? 1075 00:48:03,830 --> 00:48:04,330 Si? 1076 00:48:04,330 --> 00:48:05,770 >> Audiencia: Onde leva os argumentos. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. Malan: Onde que leva o seu argumento. 1078 00:48:07,603 --> 00:48:09,985 Entón, se eu rolar ata a Main, I Non pode simplemente pasar x e y, 1079 00:48:09,985 --> 00:48:12,820 e, eu prometer, o último peza de nova sintaxe hoxe. 1080 00:48:12,820 --> 00:48:17,200 Necesito pasar non xe y, pero a dirección de X e Y. 1081 00:48:17,200 --> 00:48:20,400 E ao parecer, o símbolo que os autores do C escolleu 1082 00:48:20,400 --> 00:48:23,860 é se usa un e comercial aquí, non para ser confundido co bit a bit e comercial, 1083 00:48:23,860 --> 00:48:27,130 se usa un e comercial aquí e un e comercial aquí, 1084 00:48:27,130 --> 00:48:29,570 esta figura para fóra para vostede, cal é a dirección de x, 1085 00:48:29,570 --> 00:48:31,740 quizais é 10, cal é o enderezo de y, é posible que 1086 00:48:31,740 --> 00:48:35,400 11, e pasa os no seu lugar. 1087 00:48:35,400 --> 00:48:37,210 >> Así, unha gran cantidade de absorber toda dunha vez. 1088 00:48:37,210 --> 00:48:40,190 Pero imos ver agora rapidamente nosas restantes catro minutos 1089 00:48:40,190 --> 00:48:42,150 onde as cousas poden dar mal. 1090 00:48:42,150 --> 00:48:45,120 E como un aparte, en realidade, Eu tomei esta imaxe, 1091 00:48:45,120 --> 00:48:46,920 TF tomei esta imaxe dun ou dous anos. 1092 00:48:46,920 --> 00:48:49,190 Entón que é o canto de atrás de Eliot Comedor. 1093 00:48:49,190 --> 00:48:52,310 Os punteiros son quizais o máis difícil tema que nós Cubrimos en CS50. 1094 00:48:52,310 --> 00:48:54,810 Entón, se se preocupa o tipo de inclinación é como é posible que 1095 00:48:54,810 --> 00:48:56,770 máis dun stick de hockey así, entender 1096 00:48:56,770 --> 00:49:00,160 nós estamos achegando de un pico en termos de complexidade conceptual. 1097 00:49:00,160 --> 00:49:02,300 >> E eu traio este foto, porque eu xuro 1098 00:49:02,300 --> 00:49:05,920 a deus, no outono de 1996, cando eu asumir CS50 co meu compañeiro de ensino, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, el me sentou-se na canto do Eliot D. Hall durante o xantar, 1100 00:49:09,620 --> 00:49:12,330 ou cea, ou algo para tratar para me axudar a entender punteiros. 1101 00:49:12,330 --> 00:49:16,520 E este é o lugar onde eu estaba semanas despois que foi introducida en charla cando 1102 00:49:16,520 --> 00:49:18,170 Finalmente entender punteiros. 1103 00:49:18,170 --> 00:49:20,590 E eu estou esperanzas de que esta vai facer clic moito máis cedo para ti. 1104 00:49:20,590 --> 00:49:23,540 Pero entender iso absolutamente entre os temas máis sofisticados 1105 00:49:23,540 --> 00:49:24,420 nós miramos. 1106 00:49:24,420 --> 00:49:25,819 Pero é entre os máis poderosos. 1107 00:49:25,819 --> 00:49:28,860 E cando obtelo, é realmente todo só vai finalmente chegar xuntos. 1108 00:49:28,860 --> 00:49:31,460 Así, a certeza de que non fai necesitamos todos pía hoxe. 1109 00:49:31,460 --> 00:49:32,980 >> Entón aquí está o último programa imos ollar. 1110 00:49:32,980 --> 00:49:35,605 E imos rematar con unha rápidas tres minutos de claymation 1111 00:49:35,605 --> 00:49:37,030 feita polo noso amigo, Nick parlante. 1112 00:49:37,030 --> 00:49:41,440 Aquí está o programa, que en os dous primeiros liñas declara unha variable x e y. 1113 00:49:41,440 --> 00:49:44,780 Ambos os cales son enderezos de enteiros, punteiros aka. 1114 00:49:44,780 --> 00:49:48,125 Nós, entón, reservar o suficiente memoria para almacenar un int 1115 00:49:48,125 --> 00:49:51,344 e almacenar a dirección en que a memoria de x. 1116 00:49:51,344 --> 00:49:53,260 Entón, é aínda máis sinxela que o exemplo anterior. 1117 00:49:53,260 --> 00:49:56,100 Déame catro bytes de memoria, que é o tamaño dun int, 1118 00:49:56,100 --> 00:49:58,000 e poñer este enderezo en x. 1119 00:49:58,000 --> 00:50:01,070 Esta liña aquí significa ir ao enderezo en x 1120 00:50:01,070 --> 00:50:05,270 e poñer o significado vida, o número 42 alí. 1121 00:50:05,270 --> 00:50:07,710 Pero esta liña me preocupa. 1122 00:50:07,710 --> 00:50:12,620 Protagonizar y significa ir ao enderezo en y, e poñer o número 13 desdichados alí. 1123 00:50:12,620 --> 00:50:15,780 Por que é perigoso, neste punto nas story-- aínda que rapidamente dixo 1124 00:50:15,780 --> 00:50:17,980 nas nosas minutos minguantes aqui-- por que é malo 1125 00:50:17,980 --> 00:50:19,660 para min dicir, ir ao enderezo en y? 1126 00:50:19,660 --> 00:50:21,077 >> Audiencia: non Ten [inaudível]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. Malan: Non teño poñer calquera cousa en y. 1128 00:50:22,910 --> 00:50:25,520 Entón, cal é o valor de y, neste punto da historia? 1129 00:50:25,520 --> 00:50:26,570 Non temos idea. 1130 00:50:26,570 --> 00:50:29,190 É un valor de lixo e non sei Binky. 1131 00:50:29,190 --> 00:50:32,532 Se poderíamos rematar con esta nota. 1132 00:50:32,532 --> 00:50:34,832 >> [REPRODUCIÓN DE VIDEO] 1133 00:50:34,832 --> 00:50:36,500 >> Ei, Binky, acorde. 1134 00:50:36,500 --> 00:50:39,140 É hora para o desfrute punteiro. 1135 00:50:39,140 --> 00:50:40,210 >> -Que é iso? 1136 00:50:40,210 --> 00:50:41,690 Máis información sobre punteiros? 1137 00:50:41,690 --> 00:50:43,570 Oh, Goody. 1138 00:50:43,570 --> 00:50:46,600 >> Ben, para comezar, eu creo que estamos Vai ter un par de agullas. 1139 00:50:46,600 --> 00:50:47,380 >> -OK. 1140 00:50:47,380 --> 00:50:51,120 Este código aloca dous punteiros que pode ligar a números enteiros. 1141 00:50:51,120 --> 00:50:53,557 >> -OK, Ben vexo o dous punteiros, pero 1142 00:50:53,557 --> 00:50:55,140 non parecen estar apuntando para calquera cousa. 1143 00:50:55,140 --> 00:50:55,970 >> -É Correcto. 1144 00:50:55,970 --> 00:50:58,100 Inicialmente punteiros non ligan con nada. 1145 00:50:58,100 --> 00:51:00,950 As cousas que ligan con son chamado pointees e configuralo los 1146 00:51:00,950 --> 00:51:02,330 é un paso separado. 1147 00:51:02,330 --> 00:51:03,210 >> Ah, non, non. 1148 00:51:03,210 --> 00:51:03,940 Eu sabía. 1149 00:51:03,940 --> 00:51:05,730 Os pointees son separados. 1150 00:51:05,730 --> 00:51:08,310 Entón, como reservar un pointee? 1151 00:51:08,310 --> 00:51:11,960 >> -Ok, Ben este aloca código unha nova pointee enteiro, 1152 00:51:11,960 --> 00:51:15,050 e iso define Parte X para apuntar para el. 1153 00:51:15,050 --> 00:51:16,240 >> Ei, que parece mellor. 1154 00:51:16,240 --> 00:51:17,743 Así facelo facer algo. 1155 00:51:17,743 --> 00:51:23,580 >> -OK, Eu vou cancelar o punteiro x para almacenar o número 42 na súa pointee. 1156 00:51:23,580 --> 00:51:27,130 Para este truco, vou ter a miña vara máxica de dereferencing. 1157 00:51:27,130 --> 00:51:30,200 >> -O Seu Varinha máxica de dereferencing? 1158 00:51:30,200 --> 00:51:32,310 Uh, iso, iso é gran. 1159 00:51:32,310 --> 00:51:34,270 >> -Este É o que o código parece. 1160 00:51:34,270 --> 00:51:35,970 Eu só vou facer que o número correo 1161 00:51:35,970 --> 00:51:37,070 >> [POP SOUND] 1162 00:51:37,070 --> 00:51:39,140 >> Ei, mira alí vai. 1163 00:51:39,140 --> 00:51:43,980 Entón, facendo unha dereference en x segue a frecha para acceder ao pointee. 1164 00:51:43,980 --> 00:51:46,150 Neste caso, para almacenar 42 en alí. 1165 00:51:46,150 --> 00:51:50,700 Hey, proba usalo para almacenar o número 13 a través do outro punteiro, y. 1166 00:51:50,700 --> 00:51:51,840 >> -OK. 1167 00:51:51,840 --> 00:51:56,270 Eu só vou pasar por riba aquí para y, e obter o número 13 set up. 1168 00:51:56,270 --> 00:52:00,380 E, a continuación, tomar a vara de dereferencing e apenas-- 1169 00:52:00,380 --> 00:52:01,646 >> [Buzzer SOUND] 1170 00:52:01,646 --> 00:52:04,080 >> Oh, hey que non funcionou. 1171 00:52:04,080 --> 00:52:06,470 Diga, uh, Binky, non creo dereferencing 1172 00:52:06,470 --> 00:52:10,850 y é unha boa idea, porque a configuración o pointee é un paso separado. 1173 00:52:10,850 --> 00:52:12,480 E non creo que nunca fixen iso. 1174 00:52:12,480 --> 00:52:14,620 >> Hmm, bo punto. 1175 00:52:14,620 --> 00:52:19,810 >> -Si, Alocamos o punteiro, y, pero nunca define-lo para ligar a un pointee. 1176 00:52:19,810 --> 00:52:21,590 >> Hmm, moi observador. 1177 00:52:21,590 --> 00:52:23,215 Ei, está a buscar boa alí, Binky. 1178 00:52:23,215 --> 00:52:26,390 Pode resolve-lo así que os puntos y ao mesmo pointee como x. 1179 00:52:26,390 --> 00:52:29,290 >> -Claro, Eu uso a miña vara máxica de asignación de punteiro. 1180 00:52:29,290 --> 00:52:31,970 >> -É Que será un problema, como antes? 1181 00:52:31,970 --> 00:52:33,790 >> Non, este non toca nas pointees. 1182 00:52:33,790 --> 00:52:35,840 Só cambia un punteiro para apuntar para o mesmo coisa-- 1183 00:52:35,840 --> 00:52:36,465 >> [Estalo] 1184 00:52:36,465 --> 00:52:37,450 -Como outro. 1185 00:52:37,450 --> 00:52:38,440 >> Ah, eu vexo. 1186 00:52:38,440 --> 00:52:41,200 Agora y apunta para o mesmo lugar que x. 1187 00:52:41,200 --> 00:52:42,950 Entón, agarde, agora y é fixo. 1188 00:52:42,950 --> 00:52:44,110 Ten un pointee. 1189 00:52:44,110 --> 00:52:47,779 Entón podes probar a vara de dereferencing novo para enviar a 13 over. 1190 00:52:47,779 --> 00:52:51,110 >> Ah, OK, aquí vai. 1191 00:52:51,110 --> 00:52:52,330 >> Ei, mira isto. 1192 00:52:52,330 --> 00:52:53,570 Agora dereferencing obras sobre y. 1193 00:52:53,570 --> 00:52:57,900 E por que os punteiros están compartindo que un pointee, os dous ven a 13. 1194 00:52:57,900 --> 00:52:59,952 >> -Si, Compartir, uh, calquera que sexa. 1195 00:52:59,952 --> 00:53:01,535 Entón, imos cambiar de lugar agora? 1196 00:53:01,535 --> 00:53:03,730 >> -Ah, Mira que estamos fóra do tempo. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Só Lembrar as tres regras de punteiro. 1199 00:53:06,520 --> 00:53:09,550 Número 1, a estrutura básica é que ten un punteiro, 1200 00:53:09,550 --> 00:53:11,630 e apunta ata un pointee. 1201 00:53:11,630 --> 00:53:13,740 Pero o punteiro e pointee son separados. 1202 00:53:13,740 --> 00:53:15,620 E o erro común é a creación dun punteiro 1203 00:53:15,620 --> 00:53:18,000 pero para esqueza darlle un pointee. 1204 00:53:18,000 --> 00:53:21,170 >> Número 2, dereferencing punteiro comeza o punteiro 1205 00:53:21,170 --> 00:53:24,020 e segue a súa frecha sobre para ter acceso ao seu pointee. 1206 00:53:24,020 --> 00:53:27,815 Como todos sabemos, iso só funciona se hai é un pointee, que tipo de recibe de volta 1207 00:53:27,815 --> 00:53:29,260 a regra número 1. 1208 00:53:29,260 --> 00:53:31,990 >> Número 3, punteiro asignación leva un punteiro 1209 00:53:31,990 --> 00:53:35,330 e cambia-lo para apuntar para o pointee mesmo como outro punteiro. 1210 00:53:35,330 --> 00:53:37,150 Así, tras a concesión, os dous punteiros 1211 00:53:37,150 --> 00:53:40,927 ha apuntar ao mesmo pointee, Ás veces iso é chamado de reparto. 1212 00:53:40,927 --> 00:53:42,510 E iso é todo o que existe para ela, realmente. 1213 00:53:42,510 --> 00:53:43,130 Bye-bye agora. 1214 00:53:43,130 --> 00:53:43,475 >> [FIN DE REPRODUCIÓN] 1215 00:53:43,475 --> 00:53:44,830 >> DAVID J. Malan: Isto é todo para CS50. 1216 00:53:44,830 --> 00:53:46,246 Grazas ao Profesor Nick parlante. 1217 00:53:46,246 --> 00:53:47,730 Imos velo a próxima semana. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [MÚSICA Electrónica DE XOGO] 1220 00:53:56,435 --> 00:57:22,775