1 00:00:00,000 --> 00:00:01,110 >> [MÚSICA DE XOGO] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J. Malan: Todo ben. 4 00:00:11,650 --> 00:00:15,610 Este é CS50, e este é o final da cuarta semana. 5 00:00:15,610 --> 00:00:19,420 E un dos temas hoxe é a de forense dixital, 6 00:00:19,420 --> 00:00:20,989 técnica de recuperar a información. 7 00:00:20,989 --> 00:00:22,780 E, de feito, moi aínda está no medio 8 00:00:22,780 --> 00:00:25,070 agora da Paz en Tres e Breakout, a próxima semana, 9 00:00:25,070 --> 00:00:27,880 o foco será en precisamente neste ámbito. 10 00:00:27,880 --> 00:00:30,686 >> Entón, un dos traballos máis legais que eu xa tivo foi en posgrao, 11 00:00:30,686 --> 00:00:33,560 cando estaba a traballar para o lugar, Middlesex County District Attorney 12 00:00:33,560 --> 00:00:34,950 oficina, facendo forense traballar. 13 00:00:34,950 --> 00:00:37,450 Entón, basicamente, o Massachusetts Policía do Estado, na ocasión, 14 00:00:37,450 --> 00:00:40,100 cando se traballa en casos sería traer cousas como discos duros 15 00:00:40,100 --> 00:00:42,185 e disquetes e tarxetas de memoria e similares. 16 00:00:42,185 --> 00:00:44,060 E eles ían entrega-los para min e meu mentor, 17 00:00:44,060 --> 00:00:48,070 eo noso obxectivo era atopar probas, se había algún, nestes medios. 18 00:00:48,070 --> 00:00:50,700 Reflexos Agora, pode ver deste mundo da ciencia forense 19 00:00:50,700 --> 00:00:53,000 nos medios, televisión e cine. 20 00:00:53,000 --> 00:00:55,730 Pero o traballo que eu tiña, e atrévome a dicir que o mundo, 21 00:00:55,730 --> 00:00:57,550 non é ben así que ve-lo. 22 00:00:57,550 --> 00:01:00,794 Imos dar un ollo ao que probablemente xa viu. 23 00:01:00,794 --> 00:01:01,460 [REPRODUCIÓN] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Agora, imos dar unha boa ollada en ti. 26 00:01:05,380 --> 00:01:06,850 >> [MÚSICA DE XOGO] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -Segure El. 29 00:01:12,932 --> 00:01:13,657 Correr de volta. 30 00:01:13,657 --> 00:01:14,733 >> Espere un minuto. 31 00:01:14,733 --> 00:01:15,233 Vaia á dereita. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Hai. 34 00:01:16,870 --> 00:01:17,369 Conxelar iso. 35 00:01:17,369 --> 00:01:17,930 Pantalla -Full. 36 00:01:17,930 --> 00:01:18,376 >> -OK. 37 00:01:18,376 --> 00:01:18,875 Conxelar iso. 38 00:01:18,875 --> 00:01:20,160 -Tighten-Se sobre iso, vai? 39 00:01:20,160 --> 00:01:22,126 >> -vector En en que cara pola roda traseira. 40 00:01:22,126 --> 00:01:24,435 >> -zoom En dereito aquí neste lugar. 41 00:01:24,435 --> 00:01:28,580 >> -Con O equipo certo, o imaxe pode ser máis grande e afiada. 42 00:01:28,580 --> 00:01:29,330 >> -Cal Que é iso? 43 00:01:29,330 --> 00:01:30,780 >> -É Un programa de mellora. 44 00:01:30,780 --> 00:01:32,170 >> -Consegue Suposto se procede? 45 00:01:32,170 --> 00:01:33,070 >> Non o sei. 46 00:01:33,070 --> 00:01:34,150 Imos melloralo. 47 00:01:34,150 --> 00:01:35,440 >> -Aprimore Sección A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Eu aumentei o detalle, e-- 50 00:01:38,562 --> 00:01:40,020 -Penso Hai abondo para mellorar. 51 00:01:40,020 --> 00:01:40,976 Liberalos lo para a pantalla do ordenador. 52 00:01:40,976 --> 00:01:42,559 >> I Reforzada a reflexión nos seus ollos. 53 00:01:42,559 --> 00:01:44,322 -Imos Executar este medio perfeccionamento de vídeo. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Pode mellorar isto? 55 00:01:45,210 --> 00:01:45,710 >> -hang en. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> Eu Benvida a traballar sobre esta reflexión. 58 00:01:49,458 --> 00:01:50,402 >> Reflexo de alguén -Hai. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 -Hai Un reflexo da cara do home. 61 00:01:52,870 --> 00:01:53,694 >> Reflexión -The! 62 00:01:53,694 --> 00:01:54,610 -Hai Unha reflexión. 63 00:01:54,610 --> 00:01:55,880 -zoom En no espello. 64 00:01:55,880 --> 00:01:57,860 Podes ver un reflexo. 65 00:01:57,860 --> 00:01:59,630 >> Vostede-pode mellorar a imaxe dende aquí? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 Vostede-pode mellora-lo? 68 00:02:01,210 --> 00:02:02,190 Vostede-pode mellora-lo? 69 00:02:02,190 --> 00:02:03,066 -Podemos Mellorar iso? 70 00:02:03,066 --> 00:02:03,898 Vostede-pode mellora-lo? 71 00:02:03,898 --> 00:02:04,740 -Segure Un segundo. 72 00:02:04,740 --> 00:02:05,281 Vou mellorar. 73 00:02:05,281 --> 00:02:06,470 -zoom En na porta. 74 00:02:06,470 --> 00:02:06,970 -Times 10. 75 00:02:06,970 --> 00:02:08,009 -Zoom. 76 00:02:08,009 --> 00:02:08,509 -Mover En. 77 00:02:08,509 --> 00:02:09,340 -Máis. 78 00:02:09,340 --> 00:02:10,094 Espere, pare. 79 00:02:10,094 --> 00:02:10,750 Pare. 80 00:02:10,750 --> 00:02:11,250 -PAUSE El. 81 00:02:11,250 --> 00:02:13,542 -Rotate Nos 75 graos en torno á vertical, por favor. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> Pare. 84 00:02:16,127 --> 00:02:19,330 Voltar para a parte sobre a porta de novo. 85 00:02:19,330 --> 00:02:21,420 >> -Ten Un intensificador de imaxe que pode bitmap? 86 00:02:21,420 --> 00:02:24,420 >> -Talvez Podemos usar o Pradeep Singh método para ver nas fiestras. 87 00:02:24,420 --> 00:02:25,902 >> -The Software é o estado da arte. 88 00:02:25,902 --> 00:02:26,866 >> -The Autovalor está desactivado. 89 00:02:26,866 --> 00:02:29,758 >> -Con Dereita combinación de algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Iluminación tomadas -El algoritmos para o seguinte nivel, 91 00:02:32,168 --> 00:02:34,110 e podo usalos para mellorar esta foto. 92 00:02:34,110 --> 00:02:36,840 >> -lock On e ampliar o eixe z. 93 00:02:36,840 --> 00:02:37,351 >> -Aprimore. 94 00:02:37,351 --> 00:02:37,850 Mellorar. 95 00:02:37,850 --> 00:02:38,720 -Aprimore. 96 00:02:38,720 --> 00:02:40,070 -Freeze E mellorar. 97 00:02:40,070 --> 00:02:43,420 [FIN REPRODUCIÓN DE VIDEO] 98 00:02:43,420 --> 00:02:45,830 DAVID J. Malan: Entón, estas son todas as palabras, pero non eran 99 00:02:45,830 --> 00:02:47,870 usado en frases correctamente. 100 00:02:47,870 --> 00:02:52,370 E, de feito, no futuro, a calquera hora, por favor, escoita a alguén dicir a palabra, 101 00:02:52,370 --> 00:02:54,250 "Mellorar", rir un pouco. 102 00:02:54,250 --> 00:02:57,190 Porque cando se trata de mellorar, por exemplo, iso é o que pasa. 103 00:02:57,190 --> 00:02:58,580 >> Entón aquí vai unha foto fermoso. 104 00:02:58,580 --> 00:02:59,720 Isto é propio Daven de CS50. 105 00:02:59,720 --> 00:03:03,740 E supoña que queriamos centrar na brillo nos ollos, 106 00:03:03,740 --> 00:03:05,870 ou a reflexión do bandido que estaba claramente 107 00:03:05,870 --> 00:03:07,820 capturada pola cámara de seguridade. 108 00:03:07,820 --> 00:03:10,330 Isto é o que pasa cando aumentar o zoom nunha imaxe que 109 00:03:10,330 --> 00:03:14,060 ten só un número finito de bits asociados. 110 00:03:14,060 --> 00:03:15,420 >> Isto é o que ía estar. 111 00:03:15,420 --> 00:03:19,190 E, de feito, está no ollo do Daven é, pero catro, quizais seis píxeles 112 00:03:19,190 --> 00:03:22,110 que compoñen o que foi brillo alí. 113 00:03:22,110 --> 00:03:25,890 Entón Problem Set Catro acabará por ter explorar este mundo, especialmente 114 00:03:25,890 --> 00:03:28,090 pola natureza de algo que chamamos ficheiro E /, onde 115 00:03:28,090 --> 00:03:31,000 i / o é só un xeito elegante de dicindo entrada e saída. 116 00:03:31,000 --> 00:03:34,280 >> Entón, ata agora, as interaccións que tivemos con un ordenador 117 00:03:34,280 --> 00:03:36,770 ser en gran parte co seu teclado e pantalla, 118 00:03:36,770 --> 00:03:40,770 pero non tanto co disco duro, ou gravar os ficheiros ademais dos que 119 00:03:40,770 --> 00:03:41,620 vostede mesmo escribir. 120 00:03:41,620 --> 00:03:44,570 Os seus programas, ata agora, ten non chegou a crear e gardar, 121 00:03:44,570 --> 00:03:46,270 e actualización dos seus propios arquivos. 122 00:03:46,270 --> 00:03:47,150 >> Ben, o que é un arquivo? 123 00:03:47,150 --> 00:03:48,105 Ben, algo así como un JPEG. 124 00:03:48,105 --> 00:03:50,520 Esta é unha imaxe que pode ter ou subir a Facebook, 125 00:03:50,520 --> 00:03:51,690 ou ver en calquera lugar na web. 126 00:03:51,690 --> 00:03:54,460 De feito, esta imaxe que acabamos de serra de Daven foi un JPEG. 127 00:03:54,460 --> 00:03:57,570 E o que é interesante sobre arquivos como JPEGs 128 00:03:57,570 --> 00:04:02,170 é que poden ser identificados, tipicamente, por certos patróns de bits. 129 00:04:02,170 --> 00:04:05,200 >> Noutras palabras, que é o que distingue un JPEG dende un GIF 130 00:04:05,200 --> 00:04:08,109 dende un Ping desde unha palabra documento a partir dun arquivo de Excel? 131 00:04:08,109 --> 00:04:09,900 Ben, é só diferente patróns de bits. 132 00:04:09,900 --> 00:04:12,820 E eses patróns diferentes son xeralmente no inicio destes ficheiros. 133 00:04:12,820 --> 00:04:18,200 >> Así que cando o computador abre unha Palabra doc, ou cando un ordenador abre un JPEG, 134 00:04:18,200 --> 00:04:20,940 parece tipicamente na primeiro de varios bits no ficheiro. 135 00:04:20,940 --> 00:04:24,059 E se recoñece un defecto, el di, oh, esta é unha imaxe. 136 00:04:24,059 --> 00:04:25,850 Deixe-me presenta-lo ao o usuario como un gráfico. 137 00:04:25,850 --> 00:04:27,870 Ou, oh, iso parece un documento de Word. 138 00:04:27,870 --> 00:04:30,480 Deixe-me amosar ao usuario como un ensaio. 139 00:04:30,480 --> 00:04:33,020 >> Así, por exemplo, JPEGs, ao parecer, son 140 00:04:33,020 --> 00:04:35,460 moi sofisticado debaixo do capó. 141 00:04:35,460 --> 00:04:40,140 Pero os tres primeiros bytes en case todas as JPEG comezar con estes tres números. 142 00:04:40,140 --> 00:04:44,680 Así byte cero, un, dous e son, en máis cada JPEG, 255, entón o número 143 00:04:44,680 --> 00:04:46,675 216, a continuación, o número 255. 144 00:04:46,675 --> 00:04:48,990 >> E o que vai ser capaz para comezar a facer a próxima semana 145 00:04:48,990 --> 00:04:52,920 é, en realidade, cutucando por baixo a capa de arquivos como JPEGs 146 00:04:52,920 --> 00:04:57,210 e como ficheiros de mapa de bits, e vendo o que sempre estivo aí durante tanto tempo 147 00:04:57,210 --> 00:04:58,650 como está a usar un ordenador. 148 00:04:58,650 --> 00:05:01,860 >> Pero o que está aí non é tipicamente escrito como números decimais como este. 149 00:05:01,860 --> 00:05:04,620 Os científicos da computación non tenden a falar en decimal. 150 00:05:04,620 --> 00:05:06,139 Realmente non falan en binario. 151 00:05:06,139 --> 00:05:07,930 Normalmente, cando queremos para expresar números, 152 00:05:07,930 --> 00:05:10,710 nós realmente usar hexadecimal, que pode lembrar 153 00:05:10,710 --> 00:05:13,027 de, digamos, Conxunto de Problemas Un deles, que desafiou 154 00:05:13,027 --> 00:05:14,610 pensar nun sistema diferente. 155 00:05:14,610 --> 00:05:17,170 >> Nós, por suposto, está familiarizado con decimal, de cero a nove. 156 00:05:17,170 --> 00:05:18,215 Nós falamos sobre binario. 157 00:05:18,215 --> 00:05:20,710 E nós realmente non teñen usar moito aquí 158 00:05:20,710 --> 00:05:22,470 en diante, porque os ordenadores irán usar iso. 159 00:05:22,470 --> 00:05:24,900 Pero os desenvolvedores van moi moitas veces, pero non sempre, 160 00:05:24,900 --> 00:05:29,360 usar hexadecimal, o que significa só ten 16 letras no alfabeto, 161 00:05:29,360 --> 00:05:31,330 en oposición a dúas ou 10. 162 00:05:31,330 --> 00:05:34,530 >> Entón, como contar ata máis de nove en hexadecimal? 163 00:05:34,530 --> 00:05:41,120 Vai 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, só por convención. 164 00:05:41,120 --> 00:05:43,540 Pero o que é fundamental é que cada destes é un único símbolo. 165 00:05:43,540 --> 00:05:44,340 Non hai 10. 166 00:05:44,340 --> 00:05:48,400 Non hai 11, por si só, xa que cada dos seus díxitos, así como en decimal 167 00:05:48,400 --> 00:05:51,940 e, así como no sistema binario, que só ser un personaxe único, por convención. 168 00:05:51,940 --> 00:05:55,280 >> Para que, entón, é o alfabeto que temos á nosa disposición para hexadecimal. 169 00:05:55,280 --> 00:05:58,600 Entón, o que un JPEG ollar como se eran para escribir os tres primeiros 170 00:05:58,600 --> 00:06:01,980 non bytes como decimal, pero, por exemplo, como hexadecimal? 171 00:06:01,980 --> 00:06:03,640 E por que é hex mesmo tan útil? 172 00:06:03,640 --> 00:06:05,290 >> Ben, unha rápida ollo a un exemplo. 173 00:06:05,290 --> 00:06:09,030 Entón, se eu escribir os bits que representan estes números de decimal 174 00:06:09,030 --> 00:06:12,450 isto pode ser un pouco enferrujado agora dalgunhas semanas, 175 00:06:12,450 --> 00:06:14,820 pero o esquerdo e o un dereito é moi sinxelo. 176 00:06:14,820 --> 00:06:17,990 255 foi o maior que o número podería representar con oito bits. 177 00:06:17,990 --> 00:06:18,820 Era todo queridos. 178 00:06:18,820 --> 00:06:21,320 Entón, a única que se lixeiramente interesante é o do medio. 179 00:06:21,320 --> 00:06:24,700 E se tipo de facer a matemáticas, vai deducir que, de feito, 180 00:06:24,700 --> 00:06:27,949 este patrón de un e ceros representa 216. 181 00:06:27,949 --> 00:06:30,240 Entón imos estipular para agora que estes son correctos. 182 00:06:30,240 --> 00:06:31,730 Pero por que isto é interesante? 183 00:06:31,730 --> 00:06:33,970 >> Ben, un byte, por suposto, é de oito bits. 184 00:06:33,970 --> 00:06:38,980 E verifícase que se pensar dun byte de dous bloques de catro bits, 185 00:06:38,980 --> 00:06:39,500 así. 186 00:06:39,500 --> 00:06:41,000 Déixeme só engadir un pouco de espazo. 187 00:06:41,000 --> 00:06:42,550 Entón, antes, despois. 188 00:06:42,550 --> 00:06:46,520 Acabo de engadir un espazo en branco polo amor de visualización aquí. 189 00:06:46,520 --> 00:06:51,840 Como podemos agora representar en, digamos, hexadecimal cada catro de bits, 190 00:06:51,840 --> 00:06:52,880 cada conxunto de catro bits? 191 00:06:52,880 --> 00:06:56,420 >> Así, por exemplo, na parte esquerda agora temos 1111 en binario. 192 00:06:56,420 --> 00:07:00,420 Cal é ese número en decimal, se fai a matemática? 193 00:07:00,420 --> 00:07:03,780 Ten a casa das unidades, o lugar dous, o lugar de catro, eo lugar oitos. 194 00:07:03,780 --> 00:07:04,341 >> Audiencia: 15. 195 00:07:04,341 --> 00:07:05,340 DAVID J. Malan: É 15. 196 00:07:05,340 --> 00:07:08,340 Entón, se facemos oito catro dous máis un, temos 15. 197 00:07:08,340 --> 00:07:11,790 Entón, eu podería escribir 15 baixo 1111, pero o punto aquí 198 00:07:11,790 --> 00:07:13,190 é hexadecimal, non decimal. 199 00:07:13,190 --> 00:07:17,310 Entón, en vez de escribir 15, 1-5, Vou escribir isto en hexadecimal, 200 00:07:17,310 --> 00:07:22,311 que se ollar cara atrás, se ten cero a f, o que é 15 será? 201 00:07:22,311 --> 00:07:22,810 Audiencia: f. 202 00:07:22,810 --> 00:07:24,434 DAVID J. Malan: Entón non é que a súa f. 203 00:07:24,434 --> 00:07:29,140 E pode solucionar isto, dicindo: así, se un é 10, entón OK, f é 15. 204 00:07:29,140 --> 00:07:33,250 Entón, en realidade, poderiamos reescribir este mesmo conxunto de números como f f. 205 00:07:33,250 --> 00:07:35,750 E entón, se facemos un pouco de matemáticas, imos deducir que isto é d. 206 00:07:35,750 --> 00:07:38,650 Oito é moi fácil, porque ter un no lugar oitos. 207 00:07:38,650 --> 00:07:40,620 E entón, temos unha parella máis f f do. 208 00:07:40,620 --> 00:07:44,669 >> Entón, o que os seres humanos tenden a facer por convención cando usan hexadecimal é que simplemente 209 00:07:44,669 --> 00:07:47,710 escribir este un pouco máis sucinta, se librar da maior parte deste espazo en branco. 210 00:07:47,710 --> 00:07:50,890 E só para ser super claro para lectores que esta é hexadecimal, 211 00:07:50,890 --> 00:07:54,670 a simple convención entre seres humanos é escribir de cero 212 00:07:54,670 --> 00:07:58,000 x, que non ten outro significado que un identificador visual, 213 00:07:58,000 --> 00:07:59,590 aquí vén un número hexadecimal. 214 00:07:59,590 --> 00:08:04,210 >> E entón, se pon os dous díxitos, f f neste caso, a continuación, d a, entón f f. 215 00:08:04,210 --> 00:08:06,700 Entón, longa historia curta, hexadecimal só tende 216 00:08:06,700 --> 00:08:11,990 para ser útil porque cada un dos seus díxitos, de cero a f, perfectamente liñas 217 00:08:11,990 --> 00:08:13,880 arriba con un nivel de catro bits. 218 00:08:13,880 --> 00:08:18,080 >> Entón, se ten dous díxitos hexadecimais, cero a F, unha e outra vez, 219 00:08:18,080 --> 00:08:20,256 que lle dá perfectamente oito bits ou un byte. 220 00:08:20,256 --> 00:08:22,380 Entón é por iso que tende a convencionalmente ser útil. 221 00:08:22,380 --> 00:08:24,990 Non hai intelectual contido moi ademais, 222 00:08:24,990 --> 00:08:27,010 distinta da súa real utilidade. 223 00:08:27,010 --> 00:08:29,310 >> Agora JPEGs non son o único formatos de ficheiro para gráficos. 224 00:08:29,310 --> 00:08:33,230 Debe lembrar que hai arquivos como este no mundo, 225 00:08:33,230 --> 00:08:34,830 polo menos desde hai uns anos. 226 00:08:34,830 --> 00:08:37,580 >> Polo tanto, este foi realmente instalado en Windows XP 227 00:08:37,580 --> 00:08:39,960 en millóns de PCs de todo o mundo. 228 00:08:39,960 --> 00:08:43,000 E este era un arquivo de mapa de bits, BMP. 229 00:08:43,000 --> 00:08:47,690 E un ficheiro de mapa de bits, como podes ver no seguinte semana, só significa un patrón de puntos, 230 00:08:47,690 --> 00:08:51,710 píxeles, como son chamados, Un mapa en anacos, en realidade. 231 00:08:51,710 --> 00:08:55,160 >> Entón, o que é interesante, con todo, sobre o formato de arquivo, BMP, é 232 00:08:55,160 --> 00:08:58,590 que debaixo do capó, el ten máis que tres bytes 233 00:08:58,590 --> 00:09:01,020 que compoñer seu cabeceira, así dicir, as primeiras mordidas. 234 00:09:01,020 --> 00:09:03,330 El realmente parece un pouco complicado a primeira vista. 235 00:09:03,330 --> 00:09:04,704 E vai ver iso no conxunto P. 236 00:09:04,704 --> 00:09:06,810 E recibir algo especial deste momento 237 00:09:06,810 --> 00:09:10,720 non é tan importante, como só o feito que, ao comezo de cada bitmap 238 00:09:10,720 --> 00:09:13,823 ficheiro, un formato gráfico, hai unha morea de números. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Agora, Microsoft, a autor deste formato, 241 00:09:16,720 --> 00:09:18,820 tende a chamar os As cousas non enteiros e caracteres 242 00:09:18,820 --> 00:09:22,259 e carrozas, pero palabras e d palabras e ansia e bytes. 243 00:09:22,259 --> 00:09:23,800 Entón, son só diferentes tipos de datos. 244 00:09:23,800 --> 00:09:25,170 Son nomes diferentes para o mesmo. 245 00:09:25,170 --> 00:09:26,740 Pero vai ver que en I Set Four. 246 00:09:26,740 --> 00:09:31,450 >> Pero isto é só para dicir que se un ser humano clic dúas veces nalgún arquivo bmp no seu 247 00:09:31,450 --> 00:09:35,015 ou o seu disco duro, e unha ventá se abre up mostrando-lle que a imaxe, 248 00:09:35,015 --> 00:09:38,500 isto aconteceu porque a operación sistema presuntamente notado non só 249 00:09:38,500 --> 00:09:41,460 a extensión do ficheiro bmp o nome do ficheiro, 250 00:09:41,460 --> 00:09:45,010 pero tamén o feito de que hai algúns convenio para o estándar de bits 251 00:09:45,010 --> 00:09:47,490 no inicio deste arquivo bitmap. 252 00:09:47,490 --> 00:09:50,270 >> Pero imos agora concentrar-se en un arquivo complicado tal, 253 00:09:50,270 --> 00:09:52,120 pero en algo como isto. 254 00:09:52,120 --> 00:09:55,190 Supoña que aquí en gedit, I só ten o comezo 255 00:09:55,190 --> 00:09:57,070 dun programa que é moi sinxelo. 256 00:09:57,070 --> 00:09:58,860 Teño algunhas inclúe enriba. 257 00:09:58,860 --> 00:10:02,120 Agora eu teño "structs.h" # include pero Vou volver a iso nun momento. 258 00:10:02,120 --> 00:10:03,974 Pero isto é útil para agora. 259 00:10:03,974 --> 00:10:05,890 Polo tanto, este é un programa que vai aplicar 260 00:10:05,890 --> 00:10:07,335 como base de datos do rexistro. 261 00:10:07,335 --> 00:10:09,710 Así, unha base de datos de alumnos, e cada alumno no mundo 262 00:10:09,710 --> 00:10:13,190 ten un nome e unha casa e, probablemente, algúns outras cousas, pero imos mantelo simple. 263 00:10:13,190 --> 00:10:15,140 Cada estudante ten un nome e unha casa. 264 00:10:15,140 --> 00:10:17,700 >> Entón, se eu quería escribir un programa cuxo obxectivo na vida 265 00:10:17,700 --> 00:10:19,860 foi só para facer unha iteración do zerar en ata tres, 266 00:10:19,860 --> 00:10:22,070 se hai tres estudantes na Universidade de Harvard. 267 00:10:22,070 --> 00:10:25,350 E eu só quero incorporarse, usando GetString, O nome de cada alumno e da casa, 268 00:10:25,350 --> 00:10:26,600 e despois é só imprimir os para fóra. 269 00:10:26,600 --> 00:10:28,630 >> Esta é unha especie de Semana One, Two Week cousas agora, 270 00:10:28,630 --> 00:10:30,810 onde eu só quero unha para loop ou algo parecido. 271 00:10:30,810 --> 00:10:34,500 E quero chamar GetString algúns veces, e logo imprimir f algunhas veces. 272 00:10:34,500 --> 00:10:37,340 Entón, como eu podería facelo, con todo, cando un nome e unha casa 273 00:10:37,340 --> 00:10:39,070 están implicados para cada alumno? 274 00:10:39,070 --> 00:10:42,830 >> Entón, o meu primeiro instinto pode ser para facer algo así. 275 00:10:42,830 --> 00:10:49,620 Podería dicir en primeiro lugar, así, deixa-me, dicir, unha matriz de cadeas chamados nomes. 276 00:10:49,620 --> 00:10:51,530 E eu non quero un hardcode tres aquí. 277 00:10:51,530 --> 00:10:53,064 O que quero poñer alí? 278 00:10:53,064 --> 00:10:55,730 Para que os alumnos, porque iso é só unha constante declarado na parte superior, 279 00:10:55,730 --> 00:10:57,860 só para que eu non teño que codificar tres en varios lugares. 280 00:10:57,860 --> 00:11:00,859 Desta forma, podo mudalo un lugar, e iso afecta un cambio en todas as partes. 281 00:11:00,859 --> 00:11:04,470 E entón, eu podería facer cadea alberga alumnos. 282 00:11:04,470 --> 00:11:10,250 >> E agora, eu podería facer algo así for (int i = 0; i 00:11:14,390 Entón, eu estou escribindo rápido, pero iso é probablemente familiar sintaxe agora. 284 00:11:14,390 --> 00:11:17,030 >> E agora, este foi máis recente. 285 00:11:17,030 --> 00:11:22,890 Se eu queira poñer no i-th nome do alumno, eu creo que eu fago iso. 286 00:11:22,890 --> 00:11:26,480 E entón, non os nomes pero casas adaptador. 287 00:11:26,480 --> 00:11:29,930 Fago iso, GetString, e deixar me volver atrás e corrixir esta liña. 288 00:11:29,930 --> 00:11:30,430 Acordo? 289 00:11:30,430 --> 00:11:31,200 Desacordo? 290 00:11:31,200 --> 00:11:32,366 Non é moi doado de usar. 291 00:11:32,366 --> 00:11:33,890 Eu non dixen que o usuario o que facer. 292 00:11:33,890 --> 00:11:36,520 >> Pero agora, se eu tamén quería máis tarde, imos 293 00:11:36,520 --> 00:11:40,060 digamos, imprimir estas cousas out-- así TODO posterior. 294 00:11:40,060 --> 00:11:42,330 Vou facer máis con isso-- este sen dúbida é 295 00:11:42,330 --> 00:11:45,970 unha correcta execución recibindo nomes e casas, tres 296 00:11:45,970 --> 00:11:48,870 do total de cada un deles, a partir dun usuario. 297 00:11:48,870 --> 00:11:51,280 >> Pero iso non é moi bo deseño, non? 298 00:11:51,280 --> 00:11:55,220 E se un alumno non ten só un nome e unha casa, pero tamén un número de identificación, 299 00:11:55,220 --> 00:11:57,770 e un número de teléfono, e un enderezo de correo electrónico, 300 00:11:57,770 --> 00:12:00,280 e quizais un páxina principal, e quizais unha alza Twitter, 301 00:12:00,280 --> 00:12:03,730 e calquera número de outros detalles asociado con un alumno ou unha persoa, 302 00:12:03,730 --> 00:12:04,610 de modo máis xeral. 303 00:12:04,610 --> 00:12:07,720 Como é que nós comezamos a engadir funcionalidade deste programa? 304 00:12:07,720 --> 00:12:14,080 >> Ben, eu sinto que o xeito máis simple pode ser para facer algo así, por exemplo, 305 00:12:14,080 --> 00:12:16,490 int id alumnos. 306 00:12:16,490 --> 00:12:18,380 Polo tanto, podo poñer todos os seus IDs alí. 307 00:12:18,380 --> 00:12:22,240 E, a continuación, para algo como números de teléfono, 308 00:12:22,240 --> 00:12:24,400 Eu non sei como representa que só aínda. 309 00:12:24,400 --> 00:12:30,280 Entón, imos adiante e só chamada este twitters alumnos, o que 310 00:12:30,280 --> 00:12:33,550 É un pouco raro, mas-- e máis unha morea campos. 311 00:12:33,550 --> 00:12:36,360 >> Comece a efectivamente copiar e pegar aquí. 312 00:12:36,360 --> 00:12:39,416 E iso vai medrar moi pesado moi rapidamente, non? 313 00:12:39,416 --> 00:12:42,290 Non sería bo se houbese en todo o mundo unha estrutura de datos coñecida 314 00:12:42,290 --> 00:12:45,600 non como un int ou unha corda, pero algo nivel superior, unha abstracción, de xeito 315 00:12:45,600 --> 00:12:47,570 dicir, coñecido como un alumno? 316 00:12:47,570 --> 00:12:50,220 C non veu con built-in función para os estudantes, 317 00:12:50,220 --> 00:12:52,260 pero e se eu quería darlle tal? 318 00:12:52,260 --> 00:12:55,640 >> Ben, ao parecer, eu vou abrir un ficheiro chamado structs.h aquí, 319 00:12:55,640 --> 00:12:57,090 e pode facer exactamente isto. 320 00:12:57,090 --> 00:12:58,290 E imos comezar a facelo agora. 321 00:12:58,290 --> 00:13:01,490 E debaixo do capó de I Conxunto Tres, xa veño facendo iso agora. 322 00:13:01,490 --> 00:13:05,920 Non existe tal cousa como un g ret ou un g oval na linguaxe de programación C. 323 00:13:05,920 --> 00:13:10,570 >> Persoal da Stanford aplicado aqueles tipos de datos usando esta visión aquí, 324 00:13:10,570 --> 00:13:13,900 declarando a súa propia novos datos tipo usando un novo contrasinal 325 00:13:13,900 --> 00:13:16,744 chamada estrutura e outra un chamado typedef. 326 00:13:16,744 --> 00:13:19,660 E, de feito, aínda que a sintaxe parece un pouco diferente a partir de material 327 00:13:19,660 --> 00:13:23,550 que xa vimos antes, en principio, é super sinxelo. 328 00:13:23,550 --> 00:13:25,297 >> Isto significa só "definir un tipo." 329 00:13:25,297 --> 00:13:27,255 Isto vai ser un estrutura, e unha estrutura 330 00:13:27,255 --> 00:13:29,400 é como un recipiente para varias cousas. 331 00:13:29,400 --> 00:13:31,780 E esa estrutura para ter unha secuencia chamada nome, 332 00:13:31,780 --> 00:13:33,210 e unha serie chamada casa. 333 00:13:33,210 --> 00:13:37,520 E imos chamar, só por conveniencia, esta estrutura de datos enteira estudante. 334 00:13:37,520 --> 00:13:40,320 >> Así, no momento que comeza a o punto e coma, ten agora 335 00:13:40,320 --> 00:13:43,280 creou o seu propio datos tipo chamado estudante 336 00:13:43,280 --> 00:13:46,420 que agora está á beira de int, e float e char, e corda, 337 00:13:46,420 --> 00:13:50,270 e g rect, e g oval, e calquera número doutras cousas que a xente inventaron. 338 00:13:50,270 --> 00:13:53,340 >> Entón, o que é útil sobre esta agora é que se eu volver 339 00:13:53,340 --> 00:13:57,430 á estrutura 0 e rematar esta implantación, o que escribín 340 00:13:57,430 --> 00:14:02,080 con antelación aquí, ter en conta que todos da desorde inevitable que 341 00:14:02,080 --> 00:14:05,490 estaba a piques de comezar a pasar como eu engade números de teléfono e twitters e todo 342 00:14:05,490 --> 00:14:07,370 esas outras cousas para definición dun alumno, 343 00:14:07,370 --> 00:14:11,810 agora está envolto sucintamente up só como un conxunto de alumnos. 344 00:14:11,810 --> 00:14:15,500 >> E cada un deses estudantes agora ten varias cousas dentro dela. 345 00:14:15,500 --> 00:14:16,930 Así que deixa só unha pregunta. 346 00:14:16,930 --> 00:14:19,700 Como comeza o nome, ea casa, eo ID, 347 00:14:19,700 --> 00:14:21,640 e todo o que se dentro do alumno? 348 00:14:21,640 --> 00:14:22,930 Super simple, tamén. 349 00:14:22,930 --> 00:14:25,730 Nova sintaxe, pero unha idea simple. 350 00:14:25,730 --> 00:14:29,239 >> Simplemente índice para a matriz, como fixemos a semana pasada e esta. 351 00:14:29,239 --> 00:14:31,030 E o que é claramente o nova peza de sintaxe? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Just., Que significa "ir a dentro do estrutura e se o campo chamado 354 00:14:35,880 --> 00:14:39,030 nome, conseguir o campo chamado casa, obter o campo chámase estudante. " 355 00:14:39,030 --> 00:14:41,940 >> Entón, en P Conxunto Tres, se está aínda traballando niso, 356 00:14:41,940 --> 00:14:44,020 ea maioría da xente aínda son, entendo que, como 357 00:14:44,020 --> 00:14:46,130 comezar a usar cousas como rects G e G ovais 358 00:14:46,130 --> 00:14:50,201 e outras cousas que non parecen veñen de Semana Cero, un, ou dous, 359 00:14:50,201 --> 00:14:52,950 entender que iso é porque Stanford declarou uns novos tipos de datos. 360 00:14:52,950 --> 00:14:56,160 >> E, de feito, iso é o que imos facer, así, en I Set Four, cando 361 00:14:56,160 --> 00:14:59,880 comezamos a xestionar as cousas como imaxes, bitmaps, e moito máis. 362 00:14:59,880 --> 00:15:02,882 Entón, iso é só un teaser e un modelo mental para o que está por vir. 363 00:15:02,882 --> 00:15:04,590 Agora, eu procrastinado algo esta mañá. 364 00:15:04,590 --> 00:15:09,560 Eu era unha especie de curiosidade a ver que o fondo Microsoft realmente 365 00:15:09,560 --> 00:15:10,310 parece hoxe. 366 00:15:10,310 --> 00:15:15,200 E ocorre que alguén en 2006 realmente foi para case precisamente 367 00:15:15,200 --> 00:15:19,210 o mesmo lugar para fotografía en realidade o que parece que nos días de hoxe. 368 00:15:19,210 --> 00:15:21,380 O campo está cuberto un pouco. 369 00:15:21,380 --> 00:15:24,850 >> Entón, falando agora de imaxes, Imos traer de volta Daven aquí 370 00:15:24,850 --> 00:15:26,890 na pantalla e Nicholas, e só lembra-lo 371 00:15:26,890 --> 00:15:30,540 que se quere unirse a nós para o xantar este venres, de cabeza para o noso URL habitual 372 00:15:30,540 --> 00:15:31,440 Aquí. 373 00:15:31,440 --> 00:15:33,530 >> Entón, de onde paramos o luns? 374 00:15:33,530 --> 00:15:35,140 Nós introducimos este problema, non? 375 00:15:35,140 --> 00:15:37,610 Esta foi aparentemente a correcta implementación de intercambio, 376 00:15:37,610 --> 00:15:40,460 en que tomar dous enteiros, un chamado, un chamado b, 377 00:15:40,460 --> 00:15:44,130 trocalos, así como Laura fixo aquí no escenario co leite ea auga, 378 00:15:44,130 --> 00:15:46,820 usando un temporal variable, é un vaso baleiro, 379 00:15:46,820 --> 00:15:50,540 para que puidésemos poñer nun b e un en b sen facer unha desorde de cousas. 380 00:15:50,540 --> 00:15:51,560 Usamos unha variable. 381 00:15:51,560 --> 00:15:52,870 Chámase de temperatura. 382 00:15:52,870 --> 00:15:55,520 >> Pero o que era fundamental problema con este código o luns? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Cal foi o problema aquí? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Si. 387 00:16:00,605 --> 00:16:01,970 >> Audiencia: Hai que máis espazo. 388 00:16:01,970 --> 00:16:04,719 >> DAVID J. Malan: Leva-se máis espazo, porque está a usar unha variable, 389 00:16:04,719 --> 00:16:05,400 e iso é OK. 390 00:16:05,400 --> 00:16:07,300 Isto é certo, pero eu son vai dicir que está todo ben. 391 00:16:07,300 --> 00:16:10,030 É só 32 bits na gran esquema das cousas, non é un gran negocio. 392 00:16:10,030 --> 00:16:10,655 Outros pensamentos? 393 00:16:10,655 --> 00:16:12,572 Audiencia: só cambio as variables locais. 394 00:16:12,572 --> 00:16:13,571 DAVID J. Malan: Exactamente. 395 00:16:13,571 --> 00:16:15,090 É só cambio os variables localmente. 396 00:16:15,090 --> 00:16:18,173 Porque sempre que chamar un function-- cando tiña as bandexas dende Annenberg 397 00:16:18,173 --> 00:16:19,840 última vez, ten principal na parte inferior. 398 00:16:19,840 --> 00:16:23,560 Así que chamar a unha función chamada intercambio, intercambio de non obter xe y, 399 00:16:23,560 --> 00:16:24,400 os valores orixinais. 400 00:16:24,400 --> 00:16:26,392 O que fai intercambio get, que nós reivindicamos? 401 00:16:26,392 --> 00:16:27,100 Audiencia: Copias. 402 00:16:27,100 --> 00:16:28,090 DAVID J. Malan: Entón copias deles. 403 00:16:28,090 --> 00:16:31,120 Así, torna-se un e dous, se recordar o exemplo a última vez, 404 00:16:31,120 --> 00:16:34,730 pero unha copia de un e dous que son trocadas correctamente. 405 00:16:34,730 --> 00:16:38,550 Pero, desgraciadamente, ao final, estes valores aínda son os mesmos. 406 00:16:38,550 --> 00:16:41,880 Así, podemos ver que a nosa novo amigo, espero que GDB, 407 00:16:41,880 --> 00:16:45,180 que ou os TFS e Ca de foi guiando-o para a seguinte. 408 00:16:45,180 --> 00:16:51,210 >> Polo tanto, non hai recordo de intercambio parece como-- imos abrir isso-- esta aparencia. 409 00:16:51,210 --> 00:16:54,160 Nós inicializar x para un y a dous. 410 00:16:54,160 --> 00:16:55,620 Tiña unha morea de impresión de f. 411 00:16:55,620 --> 00:16:58,080 Pero, a continuación, a tecla de chamada aquí era para cambiar, o que 412 00:16:58,080 --> 00:17:00,260 é o que o código só vin un momento atrás. 413 00:17:00,260 --> 00:17:03,180 Que é correcto en primeiro vista, pero funcionalmente, 414 00:17:03,180 --> 00:17:06,800 este programa non funciona, porque non cambiar permanentemente xe y. 415 00:17:06,800 --> 00:17:10,190 >> Entón imos ver iso, un ambiente acolledor rápida aquí con GDB, un ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Unha morea de información contundentes de que Vou me librar de L con control de momento. 418 00:17:15,200 --> 00:17:17,516 E agora, eu vou dalle executa-o. 419 00:17:17,516 --> 00:17:19,349 E, por desgraza, que non era tan útil. 420 00:17:19,349 --> 00:17:22,355 El executou o programa dentro deste programa chamado GDB, un depurador, 421 00:17:22,355 --> 00:17:23,730 pero non deixe-me bisbilhotar. 422 00:17:23,730 --> 00:17:26,229 >> Entón, como podo realmente facer unha pausa execución dentro deste programa? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Entón romper. 425 00:17:28,329 --> 00:17:32,340 E eu podería romper en calquera liña número, un, 10, 15. 426 00:17:32,340 --> 00:17:35,530 Pero tamén podo romper simbolicamente dicindo rompe principal. 427 00:17:35,530 --> 00:17:38,980 E que vai definir un intervalo punto, ao parecer na liña 16 na principal. 428 00:17:38,980 --> 00:17:40,050 E onde está a liña 16? 429 00:17:40,050 --> 00:17:42,960 Imos subir ao código e van ata noswap. 430 00:17:42,960 --> 00:17:46,930 E, de feito, a liña 16 é o primeiro no programa. 431 00:17:46,930 --> 00:17:52,130 >> Entón, agora, se eu ir adiante e tipo realizar este tempo, Intro, fixo unha pausa. 432 00:17:52,130 --> 00:17:53,080 Entón, imos bisbilhotar. 433 00:17:53,080 --> 00:17:55,716 Imprimir x-- por que é x Cero? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 E ignorar o sinal de dólar. 436 00:17:57,830 --> 00:17:59,725 Isto é só para columbófilo utilización do programa. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Por que é x cero no momento? 439 00:18:03,140 --> 00:18:03,640 Si. 440 00:18:03,640 --> 00:18:07,061 >> Audiencia: Fixo unha pausa antes de dereita liña 16, non, en realidade, na liña 16. 441 00:18:07,061 --> 00:18:08,060 DAVID J. Malan: Exactamente. 442 00:18:08,060 --> 00:18:11,630 GDB, por defecto, ten un descanso execución un pouco antes da liña 16. 443 00:18:11,630 --> 00:18:14,820 Por iso, non foi executado, o que significa que x é dalgún valor descoñecido. 444 00:18:14,820 --> 00:18:17,150 E nós temos sorte de que é algo limpo como cero. 445 00:18:17,150 --> 00:18:20,310 Polo tanto, agora se eu tecleo seguinte, agora corre 16. 446 00:18:20,310 --> 00:18:22,000 Está esperando por min para realizar 17. 447 00:18:22,000 --> 00:18:23,400 Deixe-me ir adiante e impresión x. 448 00:18:23,400 --> 00:18:24,094 É unha. 449 00:18:24,094 --> 00:18:25,260 Deixe-me ir adiante e impresión y. 450 00:18:25,260 --> 00:18:26,176 O que eu debería ver agora? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> Audiencia: [inaudível] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J. Malan: Un pouco máis alto. 454 00:18:29,165 --> 00:18:30,040 >> Audiencia: [inaudível] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J. Malan: Non é así un consenso. 457 00:18:32,120 --> 00:18:34,760 Entón, si, vemos algún valor de lixo. 458 00:18:34,760 --> 00:18:37,862 Agora, y é 134514064 alí. 459 00:18:37,862 --> 00:18:39,320 Ben, iso é só un valor de lixo. 460 00:18:39,320 --> 00:18:41,350 O meu programa usa RAM para fins distintos. 461 00:18:41,350 --> 00:18:42,350 Hai outras funcións. 462 00:18:42,350 --> 00:18:44,040 Outras persoas escribiron no meu ordenador. 463 00:18:44,040 --> 00:18:46,789 Entón, os bits fosen utilizados para outros valores, eo que estou vendo 464 00:18:46,789 --> 00:18:49,470 representa os restos dalgúns uso previo de que a memoria. 465 00:18:49,470 --> 00:18:53,350 >> Polo tanto, non é gran cousa, porque así mentres eu tecleo seguinte e, a continuación, imprimir y, 466 00:18:53,350 --> 00:18:55,640 é inicializar cara o valor que quero. 467 00:18:55,640 --> 00:18:57,400 Entón, agora, imos adiante un pouco máis rápido. 468 00:18:57,400 --> 00:18:58,540 N para o próximo. 469 00:18:58,540 --> 00:18:59,570 Imos facer iso de novo. 470 00:18:59,570 --> 00:19:00,530 Imos facer iso de novo. 471 00:19:00,530 --> 00:19:02,404 Pero eu non quero bater lo aquí, porque se eu 472 00:19:02,404 --> 00:19:05,110 quero ver o que está a suceder dentro de intercambio, que é a orde? 473 00:19:05,110 --> 00:19:05,520 >> Audiencia: pasos. 474 00:19:05,520 --> 00:19:06,436 >> DAVID J. Malan: pasos. 475 00:19:06,436 --> 00:19:09,800 Entón iso me pisa nun función, en vez de por riba. 476 00:19:09,800 --> 00:19:12,270 E agora, é un pouco enigmática honestamente, pero este é só 477 00:19:12,270 --> 00:19:14,581 me dicindo que eu estou na liña 33 agora. 478 00:19:14,581 --> 00:19:15,580 E imos facelo de novo. 479 00:19:15,580 --> 00:19:16,080 Temperatura de impresión. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Valor de lixo, negativo, esta vez, pero iso é só aínda un valor de lixo. 482 00:19:20,170 --> 00:19:22,810 Entón, imos facer a continuación, tempo impresión. 483 00:19:22,810 --> 00:19:27,130 El é inicializar a 1, o que foi o valor de x, aka a. 484 00:19:27,130 --> 00:19:29,110 >> Agora, onde está o noso A e X está benvida? 485 00:19:29,110 --> 00:19:32,510 Ben, aviso no principal, que chamou eses valores xe y. 486 00:19:32,510 --> 00:19:34,740 Logo, pasou os para cambiar como segue. 487 00:19:34,740 --> 00:19:37,010 X veu primeiro, coma y. 488 00:19:37,010 --> 00:19:40,020 E, a continuación, cambio podería chamalos de xe y. 489 00:19:40,020 --> 00:19:42,630 Pero, para aclarar, é chamando-a e b. 490 00:19:42,630 --> 00:19:45,970 Pero a eb están será copia de x e y, respectivamente. 491 00:19:45,970 --> 00:19:50,660 >> Entón, se eu volver para o GDB, tempo é agora un e é agora un. 492 00:19:50,660 --> 00:19:56,130 Pero, se fago agora e agora facer print un, un xa movida máis. 493 00:19:56,130 --> 00:20:00,030 O leite foi derramado en ex vaso de zume de laranxa, ou viceversa. 494 00:20:00,030 --> 00:20:04,750 >> E se fago agora de novo, e agora se eu imprimir como unha comprobación de sanidade, 495 00:20:04,750 --> 00:20:07,687 é aínda un dous, pero é agora unha b. 496 00:20:07,687 --> 00:20:08,770 Francamente, que aínda está alí. 497 00:20:08,770 --> 00:20:10,670 Eu non me importa o que é temporal. 498 00:20:10,670 --> 00:20:16,850 Pero así que eu agora escribir, por exemplo, seguir volver, agora estou no final 499 00:20:16,850 --> 00:20:17,480 o programa. 500 00:20:17,480 --> 00:20:20,730 E, por desgraza, x é aínda un e y é aínda dous. 501 00:20:20,730 --> 00:20:22,272 >> Entón, cal foi a utilidade do GDB alí? 502 00:20:22,272 --> 00:20:23,980 Non me axudar a corrixir o problema por si só, 503 00:20:23,980 --> 00:20:26,265 pero espero que me axude comprende-lo a través da realización 504 00:20:26,265 --> 00:20:30,000 que si, a miña lóxica é certo, pero meu código non é, en definitiva ter 505 00:20:30,000 --> 00:20:31,450 un impacto permanente. 506 00:20:31,450 --> 00:20:34,570 Entón, iso é un problema que estamos vai agora resolver hoxe. 507 00:20:34,570 --> 00:20:37,870 >> Pero imos chegar alí a través deste. 508 00:20:37,870 --> 00:20:39,230 Cadea é unha mentira. 509 00:20:39,230 --> 00:20:41,860 É, tamén, non é un tipo de datos que existe en C. É 510 00:20:41,860 --> 00:20:44,750 foi un sinónimo para algúns tempo para outra cousa, 511 00:20:44,750 --> 00:20:47,300 e que pode revelar que, como segue. 512 00:20:47,300 --> 00:20:53,282 >> Deixe-me ir adiante e abrir Un programa chamado compararse 0. 513 00:20:53,282 --> 00:20:56,240 E en vez de escribir esta modalidade, imos comezar a percorrer o código 514 00:20:56,240 --> 00:20:58,040 Eu xa escribín, pero é só algunhas liñas. 515 00:20:58,040 --> 00:20:59,570 Polo tanto, este é compararse 0. 516 00:20:59,570 --> 00:21:02,380 E o primeiro que eu estou facendo está a recibir unha liña de texto. 517 00:21:02,380 --> 00:21:05,610 >> Pero teña en conta o que eu son facendo a primeira vez. 518 00:21:05,610 --> 00:21:07,910 Que é diferente claramente sobre a liña 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 De feito, agarde un minuto. 521 00:21:11,402 --> 00:21:12,110 Esta é copia dous. 522 00:21:12,110 --> 00:21:13,568 Isto non é nin mesmo o programa correcto. 523 00:21:13,568 --> 00:21:14,780 Todo alerta dereita, saqueador. 524 00:21:14,780 --> 00:21:16,890 Todo ben, entón non importa. 525 00:21:16,890 --> 00:21:18,520 Esta é a resposta a unha pregunta futuro. 526 00:21:18,520 --> 00:21:21,450 >> Aquí é comparar-0, e eu son a piques de recibir unha liña de texto. 527 00:21:21,450 --> 00:21:22,435 Programa de moito máis simple. 528 00:21:22,435 --> 00:21:23,560 Entón, iso é simple. 529 00:21:23,560 --> 00:21:28,070 Isto é como Week One, Two Week cousas no momento. cadea s = GetString. 530 00:21:28,070 --> 00:21:29,700 Agora, eu digo de novo aquí. 531 00:21:29,700 --> 00:21:31,830 corda t = GetString. 532 00:21:31,830 --> 00:21:35,300 E, a continuación, o último neste programa, como o propio nome suxire, 533 00:21:35,300 --> 00:21:37,090 é que eu vou tentar comparalos-los. 534 00:21:37,090 --> 00:21:40,709 >> Entón, se s, a primeira corda, é igual a = t, entón eu son 535 00:21:40,709 --> 00:21:42,250 vai dicir que escriba o mesmo. 536 00:21:42,250 --> 00:21:44,291 Senón, eu vou dicir escribe cousas distintas. 537 00:21:44,291 --> 00:21:45,880 Entón, imos compilar e executar este programa. 538 00:21:45,880 --> 00:21:48,481 Entón faga comparar cero. 539 00:21:48,481 --> 00:21:48,980 Parece bo. 540 00:21:48,980 --> 00:21:50,490 Non hai erros de compilación. 541 00:21:50,490 --> 00:21:52,386 >> Déixeme ir adiante agora e escriba ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Deixe-me ir adiante e dicir algo : Daven e algo: Rob. 544 00:21:59,220 --> 00:22:00,450 E eu escriba cousas distintas. 545 00:22:00,450 --> 00:22:01,250 De momento, todo ben. 546 00:22:01,250 --> 00:22:02,680 Programa semella correcto. 547 00:22:02,680 --> 00:22:03,880 >> Pero imos executa-lo de novo. 548 00:22:03,880 --> 00:22:05,800 Diga algo: Gabe. 549 00:22:05,800 --> 00:22:07,140 Diga algo: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 Todo correcto. 552 00:22:09,020 --> 00:22:10,851 Poida que eu bater a barra de espazo ou algo funky. 553 00:22:10,851 --> 00:22:11,600 Imos facer iso de novo. 554 00:22:11,600 --> 00:22:13,020 Entón Zamyla. 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla. 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 Cousas diferentes. 559 00:22:17,330 --> 00:22:19,430 Entón, o que está pasando? 560 00:22:19,430 --> 00:22:23,200 >> Polo tanto, temos estas dúas liñas de código, GetString chamarse dúas veces. 561 00:22:23,200 --> 00:22:25,760 E entón, eu son simplemente tentar comparar s e t. 562 00:22:25,760 --> 00:22:28,370 Pero o que realmente está a suceder, entón? 563 00:22:28,370 --> 00:22:31,180 Ben, sobre o meu manuscrito para carniceiro este exemplo un pouco. 564 00:22:31,180 --> 00:22:34,630 E imos realmente xogar iso aquí, tamén. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Polo tanto, temos unha liña como cadea s = GetString. 567 00:22:45,712 --> 00:22:48,295 Entón, iso é simplemente o primeiro liña interesante dese programa. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Pero o que todo este tempo foi pasando debaixo do capó? 570 00:22:52,974 --> 00:22:55,890 Ben, sobre a man esquerda lado é cadea, que é algún tipo de variable, 571 00:22:55,890 --> 00:22:56,785 e chama-se s. 572 00:22:56,785 --> 00:23:00,019 Entón, sei que iso é a través da memoria, ou RAM, no meu ordenador dalgunha forma. 573 00:23:00,019 --> 00:23:02,060 Entón eu vou abstractamente chamar isto como un cadrado. 574 00:23:02,060 --> 00:23:04,820 32 bits, verifica-se, pero máis sobre iso no futuro. 575 00:23:04,820 --> 00:23:06,410 E entón, o que está pasando aquí? 576 00:23:06,410 --> 00:23:08,700 >> Ben, obviamente GetString recibe unha cadea de usuario. 577 00:23:08,700 --> 00:23:11,360 E ten GetString Zamyla ou Gabe ou Daven. 578 00:23:11,360 --> 00:23:14,640 Entón, imos escoller a primeira daqueles, que foi Daven. 579 00:23:14,640 --> 00:23:19,174 Entón, efectivamente, o que GetString ten me nese primeiro caso foi D-a-v-e-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 E entón, o que máis fixo me dar secretaría? 582 00:23:25,045 --> 00:23:25,920 Audiencia: [inaudível] 583 00:23:25,920 --> 00:23:28,720 DAVID J. Malan: Si, o / 0 ou nulo personaxe. 584 00:23:28,720 --> 00:23:30,550 Por iso, efectivamente me deu unha cadea. 585 00:23:30,550 --> 00:23:34,550 Pero nós xa sabemos desde anterior Parece que a cadea é só unha matriz 586 00:23:34,550 --> 00:23:37,895 de personaxes, e é denunciado por este carácter especial sentinela, / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Pero se isto é certo e isto é un cadrado, 589 00:23:42,310 --> 00:23:44,160 este é claramente un rectángulo moi grande. 590 00:23:44,160 --> 00:23:46,830 E, de feito, este é, Eu afirmo, só 32 bits. 591 00:23:46,830 --> 00:23:49,500 E isto é claramente máis que 32 bits, porque este é, probablemente, 592 00:23:49,500 --> 00:23:51,583 oito oito oito oito máis oito, 593 00:23:51,583 --> 00:23:53,320 só por mor de bytes en ASCII. 594 00:23:53,320 --> 00:23:57,030 Como o demo é que imos caber Daven nesa caixiña aquí? 595 00:23:57,030 --> 00:23:59,880 >> Ben, o que está realmente facendo GetString? 596 00:23:59,880 --> 00:24:03,680 Ben, esa reixa representa aquí memoria do meu ordenador ou RAM. 597 00:24:03,680 --> 00:24:07,564 Entón imos arbitrariamente dicir que se cada un deles representa un byte, 598 00:24:07,564 --> 00:24:09,730 entón podemos pensar en cada byte como tendo un enderezo, 599 00:24:09,730 --> 00:24:13,830 como 33 Oxford Street, ou 34 Oxford Street, ou 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Así como as casas teñen enderezos e os edificios teñen enderezos, 601 00:24:16,700 --> 00:24:19,810 así como de bytes individuais memoria teñen enderezos ou números 602 00:24:19,810 --> 00:24:21,042 que identificalo las unicamente. 603 00:24:21,042 --> 00:24:22,000 Agora, este é arbitraria. 604 00:24:22,000 --> 00:24:25,370 Pero mantelo simple, vou usar hexadecimal só por convención, 605 00:24:25,370 --> 00:24:28,200 pero o 0x non significa outra cousa que "este é hexadecimal." 606 00:24:28,200 --> 00:24:31,030 e eu vou afirmar que a "D" acaba en Byte One na memoria. 607 00:24:31,030 --> 00:24:34,210 >> Non teño nada máis a suceder no memoria, así Daven logrou o primeiro posto 608 00:24:34,210 --> 00:24:35,509 Un byte no. 609 00:24:35,509 --> 00:24:36,800 Este, entón, será 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Isto vai 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Este será 0x4. 614 00:24:41,800 --> 00:24:43,025 Isto vai 0x5. 615 00:24:43,025 --> 00:24:44,025 Este será 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Pero unha vez que comezar a pensar sobre o que procede do ordenador 618 00:24:48,290 --> 00:24:50,710 debaixo do capó, pode comezar a inferir 619 00:24:50,710 --> 00:24:54,960 como, hai algúns anos, sería Implementar C en si. 620 00:24:54,960 --> 00:24:58,360 Que é probablemente GetString returning-- porque 621 00:24:58,360 --> 00:25:00,946 Parece que non é retornando Daven, por si só, 622 00:25:00,946 --> 00:25:03,320 porque seguro que non vai para caber neste pequeno box-- 623 00:25:03,320 --> 00:25:05,090 entón o que é GetString probablemente retornando? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> Audiencia: [inaudível] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J. Malan: O lugar de Daven. 627 00:25:10,540 --> 00:25:12,770 E ven a facer iso desde Primeira Semana. 628 00:25:12,770 --> 00:25:16,150 O que é realmente GetString retornando non é unha cadea, per se. 629 00:25:16,150 --> 00:25:17,780 Esa é unha das mentirinhas. 630 00:25:17,780 --> 00:25:22,520 É volver a dirección do cadea na memoria, a dirección única. 631 00:25:22,520 --> 00:25:24,820 Daven vive a 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Pero de forma máis sucinta, Gavin vive en 0x1, Address Number One. 633 00:25:29,310 --> 00:25:32,280 >> Entón, o que é colocado neste pequena caixa, a continuación, para ser claro, 634 00:25:32,280 --> 00:25:35,930 é só a dirección desa cadea. 635 00:25:35,930 --> 00:25:38,110 Entón todo este tempo, este vén pasando. 636 00:25:38,110 --> 00:25:41,650 Pero o que iso suxire agora é que se todo s ten 637 00:25:41,650 --> 00:25:44,710 é un número dentro do mesmo, que é para impedir-lo, o programador, 638 00:25:44,710 --> 00:25:47,970 de poñer calquera número en calquera variable e só pulando 639 00:25:47,970 --> 00:25:49,080 para que pedazo de memoria? 640 00:25:49,080 --> 00:25:51,320 E, de feito, xa veremos iso é unha ameaza próxima vez. 641 00:25:51,320 --> 00:25:53,500 >> Pero, de momento, isto parece insuficiente. 642 00:25:53,500 --> 00:25:55,630 Se eu digo, arranxa-me un cadea, que me dar Daven. 643 00:25:55,630 --> 00:25:57,230 Pero realmente non me dar Daven. 644 00:25:57,230 --> 00:25:59,310 Todo o que me dá é a dirección de Daven. 645 00:25:59,310 --> 00:26:04,310 Como podo entón saber de certo Daven onde comeza e ends-- 646 00:26:04,310 --> 00:26:07,140 a historia está quedando weird-- Daven onde comeza e remata, 647 00:26:07,140 --> 00:26:10,435 e, a continuación, o seguinte secuencia na memoria comeza? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Ben, se está entregando me o inicio Daven, 650 00:26:13,620 --> 00:26:17,230 esencialmente, como eu sei onde o fin do seu nome é? 651 00:26:17,230 --> 00:26:20,550 Este personaxe nulo especial, que é aínda máis importante agora 652 00:26:20,550 --> 00:26:23,040 se cordas debaixo do capo son simplemente identificados 653 00:26:23,040 --> 00:26:25,820 exclusivamente pola súa situación na memoria. 654 00:26:25,820 --> 00:26:28,130 Entón todo este tempo, que é o que está pasando. 655 00:26:28,130 --> 00:26:32,470 >> Así, cando miramos agora en o código aquí, explicar 656 00:26:32,470 --> 00:26:35,790 se faría o erro na liña 26. 657 00:26:35,790 --> 00:26:39,560 Por que é Zamyla e Zamyla diferente? 658 00:26:39,560 --> 00:26:41,330 ¿Por que Gabe e Gabe diferente? 659 00:26:41,330 --> 00:26:42,154 Si, na parte de atrás. 660 00:26:42,154 --> 00:26:43,390 >> Audiencia: Teñen enderezos diferentes. 661 00:26:43,390 --> 00:26:45,931 >> DAVID J. Malan: Simplemente porque eles teñen enderezos diferentes. 662 00:26:45,931 --> 00:26:48,820 Porque cando chamar GetString de novo, o que eu vou facer rapidamente aquí, 663 00:26:48,820 --> 00:26:52,870 se esta é a segunda liña, cadea t, como eu fixen ese programa, 664 00:26:52,870 --> 00:26:55,030 é igual a outra chamada para GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 A próxima vez que eu chamo GetString, vou 667 00:26:58,670 --> 00:27:00,190 para obter unha peza diferente de memoria. 668 00:27:00,190 --> 00:27:02,220 >> GetString se permite pedir ao funcionamento 669 00:27:02,220 --> 00:27:03,800 sistema para obter máis e máis memoria. 670 00:27:03,800 --> 00:27:07,894 Non vai reutilizar o mesmo seis bytes cada vez. 671 00:27:07,894 --> 00:27:09,810 Vai comezar un novo anaco de memoria, o que 672 00:27:09,810 --> 00:27:12,780 significa t se ve algún outro valor aquí. 673 00:27:12,780 --> 00:27:15,380 >> Entón, cando fago s é igual a = t, non está comparando 674 00:27:15,380 --> 00:27:17,880 D contra este e contra A este e V contra este. 675 00:27:17,880 --> 00:27:19,588 Está comparando este contra este, o cal 676 00:27:19,588 --> 00:27:24,020 francamente é moi useless-- useful-- é inútil, porque o que realmente 677 00:27:24,020 --> 00:27:25,830 importa onde as cordas están na memoria? 678 00:27:25,830 --> 00:27:26,850 >> E, de feito, non temos. 679 00:27:26,850 --> 00:27:28,980 E nós non imos iniciar particularmente cariñoso. 680 00:27:28,980 --> 00:27:34,180 Só na medida en que os erros poden xurdir e as ameazas á seguridade poden xurdir vontade 681 00:27:34,180 --> 00:27:36,100 nós realmente comezar a se preocupar con iso. 682 00:27:36,100 --> 00:27:37,230 Entón imos corrixir este problema. 683 00:27:37,230 --> 00:27:39,650 Acontece que, de corrixir-lo super sinxelo. 684 00:27:39,650 --> 00:27:42,600 >> E imos de feito, antes de revelan que unha vez máis, o que sería 685 00:27:42,600 --> 00:27:47,170 faría se nunha clase CS50, e tivo que aplicar 686 00:27:47,170 --> 00:27:48,600 unha comparación con dúas cordas. 687 00:27:48,600 --> 00:27:51,440 Vostede claramente non pode só usar s é igual a = t. 688 00:27:51,440 --> 00:27:54,090 Pero, loxicamente, como Como comparar esta cadea 689 00:27:54,090 --> 00:27:56,370 contra esa cadea utilizando o código C? 690 00:27:56,370 --> 00:27:56,880 Si. 691 00:27:56,880 --> 00:27:58,780 >> Audiencia: Só ten que facer o loop [inaudível] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 DAVID J. Malan: Perfecto. 694 00:28:01,670 --> 00:28:02,900 Audiencia: [inaudível] 695 00:28:02,900 --> 00:28:03,310 DAVID J. Malan: Yeah. 696 00:28:03,310 --> 00:28:05,390 Só ten que usar un loop ou un while ou o que quere. 697 00:28:05,390 --> 00:28:08,710 Pero basta aplicar a idea básica de que, se este é un anaco de memoria ou un array 698 00:28:08,710 --> 00:28:11,590 e este é, iterado os dous á vez. 699 00:28:11,590 --> 00:28:12,960 E basta comparar as letras. 700 00:28:12,960 --> 00:28:14,260 >> E ten que ser un pouco coidado, porque 701 00:28:14,260 --> 00:28:16,247 Non quero un dedo para pasar a outra 702 00:28:16,247 --> 00:28:18,080 porque unha cadea é máis que o outro. 703 00:28:18,080 --> 00:28:21,380 Entón vai querer comprobar a este valor especial ao final, nulo. 704 00:28:21,380 --> 00:28:24,017 Pero realmente é, na final, tan simple como iso. 705 00:28:24,017 --> 00:28:26,100 E, francamente, nós non precisamos reinventar a roda. 706 00:28:26,100 --> 00:28:27,960 Aquí é versión dous. 707 00:28:27,960 --> 00:28:32,910 E o que eu vou dicir aquí é que no canto de comparar s é igual a = t, 708 00:28:32,910 --> 00:28:38,964 Estou vez vai dicir si a cadea comparación de s coma t é igual a = 0. 709 00:28:38,964 --> 00:28:40,130 Agora, o que é unha secuencia de comparación? 710 00:28:40,130 --> 00:28:43,046 >> Acontece, é unha función que ven con C, cuxo propósito na vida 711 00:28:43,046 --> 00:28:44,650 é comparar dúas cadeas. 712 00:28:44,650 --> 00:28:48,300 E mexa comparar, se Lerma a súa páxina ou documentación ou CS50 home 713 00:28:48,300 --> 00:28:50,630 referencia será simplemente dicirlle que mexa 714 00:28:50,630 --> 00:28:55,730 comparar retorna un negativas número ou un número positivo ou cero, 715 00:28:55,730 --> 00:28:57,660 en que cero significa que son iguais. 716 00:28:57,660 --> 00:28:58,570 >> Polo tanto, só conxecturas. 717 00:28:58,570 --> 00:29:00,390 O que isto pode significar que trasfega retorno comparar 718 00:29:00,390 --> 00:29:02,110 valor negativo ou un valor positivo? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 Audiencia: Maior ou menor que. 721 00:29:04,285 --> 00:29:05,570 DAVID J. Malan: Si, superior ou inferior. 722 00:29:05,570 --> 00:29:08,640 Entón, se quixese clasificar un todo grupo de cordas nun dictionary-- 723 00:29:08,640 --> 00:29:12,975 coma nós acabará por baixo do road-- función perfecta para utilizar potencialmente, 724 00:29:12,975 --> 00:29:15,850 porque vai facelo comparación de cadeas para ti, e dicir 725 00:29:15,850 --> 00:29:20,060 fai un vén antes de b, ou non b vir antes dunha orde alfabética. 726 00:29:20,060 --> 00:29:21,490 Podemos facer exactamente isto. 727 00:29:21,490 --> 00:29:23,620 >> E noten que eu fixen outro cousa neste exemplo. 728 00:29:23,620 --> 00:29:26,870 Que máis cambiou maior nesta función principal? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 Char *. 731 00:29:29,350 --> 00:29:31,150 E esta é a outra mentira. 732 00:29:31,150 --> 00:29:33,750 Todo este tempo, cando ten escrito corda, 733 00:29:33,750 --> 00:29:38,350 fomos secretaría reescribir cadea como char * para que, en realidade, clang 734 00:29:38,350 --> 00:29:39,270 comprende. 735 00:29:39,270 --> 00:29:42,450 >> Noutras palabras, en CS50.h e como imos finalmente ver, 736 00:29:42,450 --> 00:29:45,950 fixemos unha corda sinónimo chamado iso é o mesmo que char *. 737 00:29:45,950 --> 00:29:49,910 E, polo momento, só sei que o *, Neste contexto, polo menos, 738 00:29:49,910 --> 00:29:51,286 significa a dirección. 739 00:29:51,286 --> 00:29:52,210 >> O enderezo de que? 740 00:29:52,210 --> 00:29:56,390 Ben, o feito de que eu dixen char *, e non int * ou float *, 741 00:29:56,390 --> 00:30:00,820 significa que char * é a dirección dun char. 742 00:30:00,820 --> 00:30:06,770 Entón esa caixiña aquí, aka corda, é realmente o tipo char *, 743 00:30:06,770 --> 00:30:10,490 que é simplemente un xeito elegante de dicir, nesa caixa vai un enderezo. 744 00:30:10,490 --> 00:30:12,430 E que é o que a dirección se refire? 745 00:30:12,430 --> 00:30:13,780 Ao parecer, un char. 746 00:30:13,780 --> 00:30:16,410 >> Pero poderiamos absolutamente ten int * e outras cousas. 747 00:30:16,410 --> 00:30:20,790 Pero, de momento, char * é realmente o máis simple e unha de interese. 748 00:30:20,790 --> 00:30:23,310 Polo tanto, este problema vai a subir, a pesar de, outra vez. 749 00:30:23,310 --> 00:30:24,830 >> Supoña que abrir este programa. 750 00:30:24,830 --> 00:30:27,670 A ver se agora podemos predicir o que hai de malo con este código. 751 00:30:27,670 --> 00:30:31,140 Entón, neste programa, copiar-0, estou indo para adiante e de novo chamar 752 00:30:31,140 --> 00:30:34,190 GetString e almacenar o valor en s. 753 00:30:34,190 --> 00:30:38,800 >> E entón, por que eu estou facendo iso, só como un recordatorio de semana pasado? 754 00:30:38,800 --> 00:30:40,960 Fixemos dicir que GetString ás veces retorna nulo. 755 00:30:40,960 --> 00:30:42,793 Que significa se GetString retorna null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Algo deu mal. 758 00:30:46,034 --> 00:30:48,950 Isto probablemente significa a secuencia é moi grande, fóra do ordenador de memoria. 759 00:30:48,950 --> 00:30:51,724 Acontece super, super, super raramente, pero pode pasar. 760 00:30:51,724 --> 00:30:53,890 Queremos comprobar a el, e iso é todo o que estamos facendo. 761 00:30:53,890 --> 00:30:57,910 >> Porque imos ver agora, se non o fai comezar a comprobar habitualmente para as cousas 762 00:30:57,910 --> 00:31:00,870 como nulo, que pode realmente comezar a ir 763 00:31:00,870 --> 00:31:03,106 para enderezos na memoria que son válidos. 764 00:31:03,106 --> 00:31:05,980 E vai comezar a inducir máis e máis fallos de segmentación. 765 00:31:05,980 --> 00:31:08,360 Ou en un Mac ou PC, só facendo que un ordenador para colgar 766 00:31:08,360 --> 00:31:10,340 ou un programa de conxelación, potencialmente. 767 00:31:10,340 --> 00:31:14,930 >> Entón, agora, eu afirmo na copia-0.c, que eu vou copiar estas secuencias por medio 768 00:31:14,930 --> 00:31:15,685 da liña 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 E entón, eu vou a reivindicación, na parte inferior 771 00:31:18,750 --> 00:31:21,430 aquí que vou para cambiar unha delas. 772 00:31:21,430 --> 00:31:22,330 >> Entón, observe iso. 773 00:31:22,330 --> 00:31:24,370 Vou chamar o noso vello amigo strlen. 774 00:31:24,370 --> 00:31:28,960 E só explicar en inglés o que esta liña 34 está facendo? 775 00:31:28,960 --> 00:31:32,480 O que fai t soporte 0 representan á esquerda. 776 00:31:32,480 --> 00:31:32,980 Si. 777 00:31:32,980 --> 00:31:34,339 >> Audiencia: primeiro carácter de t? 778 00:31:34,339 --> 00:31:35,880 DAVID J. Malan: primeiro carácter de t. 779 00:31:35,880 --> 00:31:36,379 É iso aí. 780 00:31:36,379 --> 00:31:40,024 Primeiro carácter de t, quero para asignar a versión en maiúsculas 781 00:31:40,024 --> 00:31:41,190 do primeiro carácter t. 782 00:31:41,190 --> 00:31:43,200 Polo tanto, esta é a capitalización a primeira letra. 783 00:31:43,200 --> 00:31:46,340 E, a continuación, o último que fago neste programa é eu reclamo aquí 784 00:31:46,340 --> 00:31:50,340 o orixinal, é, e aquí está a copia, t. 785 00:31:50,340 --> 00:31:54,610 >> Pero baseado na historia que acabamos de contou sobre o que realmente son cordas, 786 00:31:54,610 --> 00:31:57,520 o que é realmente 28 liña facendo, eo que é 787 00:31:57,520 --> 00:31:59,405 o erro resultante vai para ser exhibida na pantalla? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Entón, primeiro, a primeira pregunta, 28. 790 00:32:03,500 --> 00:32:09,040 Que é cadea t = s realmente facendo? 791 00:32:09,040 --> 00:32:16,430 Se temos na man esquerda banda aquí corda t = s; 792 00:32:16,430 --> 00:32:19,400 que me dá unha caixa de aquí e unha caixa aquí. 793 00:32:19,400 --> 00:32:25,530 E supoña que esta dirección é 0x, imos dicir, 50, esta vez, de forma arbitraria. 794 00:32:25,530 --> 00:32:28,847 Que significa corda t = s facer debaixo do capó? 795 00:32:28,847 --> 00:32:30,340 >> Audiencia: [inaudível] 796 00:32:30,340 --> 00:32:34,100 >> David J. Malan: Almacena a memoria tratar alí, entón 0x50 vai alí. 797 00:32:34,100 --> 00:32:37,980 Entón, agora, eu vou para o primeiro personaxe en t e maiúsculas que, 798 00:32:37,980 --> 00:32:39,535 O que estou facendo de forma eficaz para s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Realmente estou facendo o mesmo, non? 801 00:32:43,450 --> 00:32:47,680 Porque se Enderezo 0x50-- e só, eu non ten moito espazo na tarxeta aquí, 802 00:32:47,680 --> 00:32:51,750 pero supoñer que esta é 0x50 ata aquí, nalgún lugar na memoria do meu ordenador. 803 00:32:51,750 --> 00:32:55,825 >> E eu, por exemplo, Gabe en minúscula aquí, así. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 E teño dito soporte t 0 queda maiúscula. 806 00:33:01,980 --> 00:33:04,860 Ben, t soporte 0 é a primeira letra t. 807 00:33:04,860 --> 00:33:07,840 Tan pouco g vai tornar-se gran G. Pero o problema 808 00:33:07,840 --> 00:33:09,410 é, o que s tamén apuntan? 809 00:33:09,410 --> 00:33:10,300 >> Audiencia: O mesmo. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. Malan: Exactamente o mesmo. 811 00:33:11,841 --> 00:33:16,342 Así, unha explicación sinxela, quizais, aínda que a sintaxe é un pouco estraño. 812 00:33:16,342 --> 00:33:17,050 Entón, imos facelo. 813 00:33:17,050 --> 00:33:20,210 Facer copia-0 e, a continuación, ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Diga algo: Gabe. 816 00:33:24,110 --> 00:33:26,760 E, por desgraza, os dous eles xa foron capitalizados, 817 00:33:26,760 --> 00:33:29,500 pero para que, subxacente razón que estamos simplemente 818 00:33:29,500 --> 00:33:32,350 agora a xestionar enderezos. 819 00:33:32,350 --> 00:33:36,470 >> Entón, como imos comezar a address-- sen trocadilho intended-- 820 00:33:36,470 --> 00:33:39,270 como é que imos comezar a resolver este problema en particular? 821 00:33:39,270 --> 00:33:44,400 Ben, en copy1.c, as cousas van a estar un pouco máis complicado. 822 00:33:44,400 --> 00:33:49,310 Pero gustaríame reivindicar unha solución conceptualmente simple. 823 00:33:49,310 --> 00:33:50,852 >> Tan difícil de chegar á primeira vista. 824 00:33:50,852 --> 00:33:53,560 Non vai ser doado para o primeiro vez que escriba-lo, se cadra, 825 00:33:53,560 --> 00:33:57,440 pero se o problema é que simplemente facendo t = s só 826 00:33:57,440 --> 00:33:59,694 copia a dirección, o que, novo se podo pegar en ti, 827 00:33:59,694 --> 00:34:02,110 vai ser a solución para realmente copiar unha cadea? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> Audiencia: Nós probablemente utilizar un ciclo novo. 830 00:34:06,770 --> 00:34:06,890 >> DAVID J. Malan: Yeah. 831 00:34:06,890 --> 00:34:08,390 Entón, nós imos ter un loop de novo. 832 00:34:08,390 --> 00:34:11,800 E por se quere copiar unha cadea s noutra secuencia, 833 00:34:11,800 --> 00:34:14,120 que probablemente vai querer facelo carácter por carácter. 834 00:34:14,120 --> 00:34:17,199 Pero o problema é que, se este é inicialmente s, 835 00:34:17,199 --> 00:34:22,159 agora necesitamos comezar explicitamente distribución de memoria para t. 836 00:34:22,159 --> 00:34:24,320 >> Noutras palabras, imos redeseñar unha última vez. 837 00:34:24,320 --> 00:34:28,659 Se esta é a cadea s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 E imos poñer isto aquí, tamén. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 Este é GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 E, a continuación, a imaxe de algo como que vai ser como antes, 844 00:34:43,860 --> 00:34:44,360 g-a - b electrónico / 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 Isto parece un pouco algo como isto. 847 00:34:48,960 --> 00:34:53,650 E s por iso, chamamos iso de 0x50, e que será 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Polo tanto, esta é 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 E entón, fago corda t. 851 00:34:59,690 --> 00:35:02,450 Na memoria, que só vai deixa-me un pouco cadrado así. 852 00:35:02,450 --> 00:35:04,080 Entón, cal é o paso fundamental agora? 853 00:35:04,080 --> 00:35:09,870 Se eu queira copiar s en t, o que baleiro que necesitamos cubrir aquí? 854 00:35:09,870 --> 00:35:12,050 Ou o que necesitamos facer a un alto nivel? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Si? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Alguén? 859 00:35:17,020 --> 00:35:17,690 Si. 860 00:35:17,690 --> 00:35:19,214 >> Audiencia: Necesitamos [inaudível]. 861 00:35:19,214 --> 00:35:21,380 DAVID J. Malan: Si, nós que cubrir este campo en branco. 862 00:35:21,380 --> 00:35:24,340 Eu non podo copiar e, a continuación, capitalizar o nome Gabe 863 00:35:24,340 --> 00:35:28,120 ata eu pedir para o sistema operativo a outro anaco de memoria 864 00:35:28,120 --> 00:35:30,640 que é polo menos tan grande como o orixinal. 865 00:35:30,640 --> 00:35:32,130 Entón iso nos deixa con unha pregunta. 866 00:35:32,130 --> 00:35:36,080 >> Como podo solicitar o sistema operativo non só para un pouco de Pointer simple 867 00:35:36,080 --> 00:35:38,530 como esta é chamada, un dirección, a non Pointer 868 00:35:38,530 --> 00:35:40,980 para unha caixa pequena e sinxela así chamado unha cadea? 869 00:35:40,980 --> 00:35:44,200 Como podo solicitar o operativo sistema para unha gran parte da memoria? 870 00:35:44,200 --> 00:35:48,430 Ata agora, eu só comecei isto de volta indirectamente chamando GetString. 871 00:35:48,430 --> 00:35:50,740 Entón, como é GetString mesmo recibindo a súa memoria? 872 00:35:50,740 --> 00:35:53,430 >> Ben, acontece que hai estoutra función aquí 873 00:35:53,430 --> 00:35:55,160 que agora nós imos comezar a usar. 874 00:35:55,160 --> 00:35:59,780 Agora, iso parece than-- forma máis críptica e eu son a única que pode ver ele-- 875 00:35:59,780 --> 00:36:03,150 esta liña parece moito máis enigmática entón debe a primeira vista. 876 00:36:03,150 --> 00:36:04,650 Pero imos provocalo lo á parte. 877 00:36:04,650 --> 00:36:07,950 >> No lado esquerdo, eu teño char * t. 878 00:36:07,950 --> 00:36:13,280 Así, en inglés, imos comezar a formular apropiadas en argot técnico. 879 00:36:13,280 --> 00:36:19,757 Polo tanto, esta é a concesión dunha variable do tipo char * chamado t. 880 00:36:19,757 --> 00:36:21,090 Agora, o que iso realmente significa? 881 00:36:21,090 --> 00:36:23,881 >> Ben, iso quere dicir que, o que eu vou poñer nesta variable chamada t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Introduzca unha dirección de un char. 884 00:36:26,402 --> 00:36:28,360 Entón, iso é só o máis simple, xeito máis razoable 885 00:36:28,360 --> 00:36:29,930 de describir o lado esquerdo. 886 00:36:29,930 --> 00:36:32,890 Así que crea esta caixa aquí só. 887 00:36:32,890 --> 00:36:34,760 Entón, o lado dereito, presuntamente, vai 888 00:36:34,760 --> 00:36:37,170 reservar que maior anaco de memoria como? 889 00:36:37,170 --> 00:36:38,340 Entón, imos xogar con este apart. 890 00:36:38,340 --> 00:36:41,131 >> É impresionante a primeira vista, pero o que está a suceder aquí dentro? 891 00:36:41,131 --> 00:36:43,740 En primeiro lugar, hai malloc, que é, ao parecer, o noso novo amigo, 892 00:36:43,740 --> 00:36:45,450 "Memoria reservar." 893 00:36:45,450 --> 00:36:49,560 Polo tanto, este é o argumento que está a ser pasado para el, polo que é un argumento moi grande. 894 00:36:49,560 --> 00:36:50,970 Entón, imos xogar con este apart. 895 00:36:50,970 --> 00:36:53,410 >> strlen de s, claro, representa o-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 Audiencia: O número de caracteres. 898 00:36:55,600 --> 00:36:56,710 DAVID J. Malan: Só o número de caracteres en s. 899 00:36:56,710 --> 00:36:59,040 Así, a lonxitude de s, a cadea orixinal. 900 00:36:59,040 --> 00:37:00,350 Así G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 Entón pode ser catro neste caso. 902 00:37:02,320 --> 00:37:05,485 Por que estou facendo un despois chamando strlen de s? 903 00:37:05,485 --> 00:37:06,360 Audiencia: [inaudível] 904 00:37:06,360 --> 00:37:07,590 David J. Malan: Para iso carácter especial nulo. 905 00:37:07,590 --> 00:37:11,260 Se me preguntar cal é a lonxitude de O nome de Gabe, eu vou dicir catro. 906 00:37:11,260 --> 00:37:14,480 Debaixo do capó, porén, eu teño que o quinto byte ao carácter nulo. 907 00:37:14,480 --> 00:37:16,100 Entón é por iso que eu estou facendo o 1. 908 00:37:16,100 --> 00:37:21,730 >> Agora é só no caso de que vostede está executando este programa nun ordenador diferente, digamos, 909 00:37:21,730 --> 00:37:24,610 o aparello CS50, en que o tamaño dun char 910 00:37:24,610 --> 00:37:26,350 pode ser diferente da miña propia Computador-- 911 00:37:26,350 --> 00:37:30,590 Acontece que podo chamar iso de sizeof operador, é só pedir o ordenador, 912 00:37:30,590 --> 00:37:32,870 o que é o tamaño dun carbonizar neste ordenador? 913 00:37:32,870 --> 00:37:37,400 >> E multiplicando cinco neste por exemplo o tamaño dun carbón animal, que 914 00:37:37,400 --> 00:37:40,440 na maioría dos ordenadores vai ser só un, malloc 915 00:37:40,440 --> 00:37:44,830 vai destinar para min este gran anaco de memoria aquí á dereita. 916 00:37:44,830 --> 00:37:47,140 E iso vai return-- é unha function-- polo que é 917 00:37:47,140 --> 00:37:48,265 vai voltar a min o que? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 Audiencia: O enderezo? 920 00:37:51,830 --> 00:37:53,709 DAVID J. Malan: O enderezo de que? 921 00:37:53,709 --> 00:37:55,250 Audiencia: É a memoria que alocados? 922 00:37:55,250 --> 00:37:56,450 DAVID J. Malan: Do memoria que asignado. 923 00:37:56,450 --> 00:37:59,189 Entón, eu non teño ningunha idea, francamente, onde é que isto vai acabar. 924 00:37:59,189 --> 00:38:01,480 Vou propoñer que iso vai acabar en 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Completamente arbitrario, pero nalgún lugar diferente 0x50, 927 00:38:06,009 --> 00:38:08,800 porque o sistema operativo, o Windows e Mac OS facer para min, é 928 00:38:08,800 --> 00:38:11,230 asegurarse de que está dando me diferentes anacos de memoria RAM. 929 00:38:11,230 --> 00:38:14,210 >> Polo tanto, este é o valor que esta anaco de memoria pode acabar. 930 00:38:14,210 --> 00:38:16,060 Entón é iso que acaba por aquí, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Entón, agora claramente, podo entender que este non é o mesmo como esta, 933 00:38:21,570 --> 00:38:23,960 porque están apuntando para diferentes anacos de memoria. 934 00:38:23,960 --> 00:38:29,980 Entón, se eu agora realmente desexa eliminar esta en, imos facer a solución proposta. 935 00:38:29,980 --> 00:38:36,870 >> Imos aínda, cree un loop for, e facer soporte t i recibe soporte s i. 936 00:38:36,870 --> 00:38:39,760 Porque agora podo usar esta notación de matriz-like, 937 00:38:39,760 --> 00:38:43,390 porque aínda que malloc moi xenericamente me atribúe memoria, 938 00:38:43,390 --> 00:38:45,290 bytes de memoria é só contiguos. 939 00:38:45,290 --> 00:38:47,240 Byte, byte, byte, back to back to back. 940 00:38:47,240 --> 00:38:50,030 >> Podo certamente como un programador tratala como unha matriz, que 941 00:38:50,030 --> 00:38:55,090 significa que podo usar este fin familiarizado notación de só uns corchetes. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Entón deixe-me facer unha pausa alí, porque este é un lote dunha soa vez, ata 944 00:39:00,020 --> 00:39:03,530 aínda que a idea básica para recapitular é esa cadea, todo este tempo, 945 00:39:03,530 --> 00:39:05,550 non é un novo tipo de datos per se. 946 00:39:05,550 --> 00:39:10,150 É só un punteiro chamado, un enderezo dun personaxe, 947 00:39:10,150 --> 00:39:12,650 que significa que é un número que, por convención, humano 948 00:39:12,650 --> 00:39:15,350 que tenden a escribir como 0x algo. 949 00:39:15,350 --> 00:39:18,590 >> Pero é só un número, como 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 que pasa a ser o Enderezo do CS edificio. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Calquera dúbida sobre estes detalles? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Si? 955 00:39:25,289 --> 00:39:28,530 >> Audiencia: Por que nós encontramos facer para t igual a nulo? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J. Malan: Por que comprobar a existencia de t igual a nulo? 957 00:39:30,740 --> 00:39:33,250 Se Lerma o documentation-- gran pergunta-- para malloc, 958 00:39:33,250 --> 00:39:37,020 vai dicir en letras miúdas, ás veces malloc pode devolver nulo, 959 00:39:37,020 --> 00:39:38,080 así como GetString. 960 00:39:38,080 --> 00:39:41,820 E, de feito, GetString retorna null se, á súa vez, malloc retorna nulo, 961 00:39:41,820 --> 00:39:43,130 porque GetString usa malloc. 962 00:39:43,130 --> 00:39:46,400 >> E isto pode ocorrer se o sistema operativo, Mac OS, Windows, calquera que sexa, é simplemente 963 00:39:46,400 --> 00:39:48,130 falta de memoria para ti. 964 00:39:48,130 --> 00:39:49,820 Entón, iso é o que pasou alí. 965 00:39:49,820 --> 00:39:52,910 >> E déixeme revelar outra cousa que só podería explotar a súa mente 966 00:39:52,910 --> 00:39:55,100 ou totalmente estar moi encima da liña. 967 00:39:55,100 --> 00:39:59,770 Pero déixeme puxar arriba o mesmo lazo é para copiar, 968 00:39:59,770 --> 00:40:05,480 que hai un momento, a retirada foi este. soporte t i recibe soporte s i. 969 00:40:05,480 --> 00:40:06,740 >> Nice and amigable. 970 00:40:06,740 --> 00:40:09,330 Parece Week Two novo. 971 00:40:09,330 --> 00:40:14,920 Pero esta versión, de feito, pode ser reescrita como este, que parece enigmática. 972 00:40:14,920 --> 00:40:18,280 É un punteiro técnica chamada aritmética, aritmética enderezo. 973 00:40:18,280 --> 00:40:19,600 Pero por que isto funciona? 974 00:40:19,600 --> 00:40:22,220 >> Agora irritante, o C autores decidiron utilizar 975 00:40:22,220 --> 00:40:25,070 símbolo * para fins distintos. 976 00:40:25,070 --> 00:40:29,020 Xa vimos que usa xa xa, char *, que significa "me dea unha variable 977 00:40:29,020 --> 00:40:31,210 que vai conter a dirección dun char. " 978 00:40:31,210 --> 00:40:33,990 * Entón carácter en que contexto significa "me dea unha variable." 979 00:40:33,990 --> 00:40:40,050 >> Desafortunadamente, se usa o * sen unha palabra fronte do mesmo, como carbón, 980 00:40:40,050 --> 00:40:41,905 agora chámase operador de dereferência. 981 00:40:41,905 --> 00:40:43,530 E veremos máis desta antes de tempo. 982 00:40:43,530 --> 00:40:44,930 Pero iso só significa "ir máis alá". 983 00:40:44,930 --> 00:40:49,070 É como dicir que, se alguén me entregou nun anaco de papel "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 se eu fai "* 33 Oxford Street", que significa "Baixar a estrada para a construción CS." 985 00:40:53,830 --> 00:40:57,220 >> Entón * significa só ir alí se non hai ningunha palabra diante del. 986 00:40:57,220 --> 00:40:59,100 Entón, o que é t, para ser claro? 987 00:40:59,100 --> 00:41:03,250 t é a dirección do bloque de memoria que foi dado de volta para min. 988 00:41:03,250 --> 00:41:06,650 s é a dirección de que, para ser claro, no exemplo que estamos discutindo, 989 00:41:06,650 --> 00:41:07,500 Gabe e minúsculas? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s é a dirección de-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 Audiencia: A cadea. 994 00:41:12,460 --> 00:41:14,126 DAVID J. Malan: É o nome orixinal de Gabe. 995 00:41:14,126 --> 00:41:16,660 Entón, é a dirección de este anaco de memoria. 996 00:41:16,660 --> 00:41:22,220 Entón, se eu digo t + i-- i, o aviso previo, é só o noso vello amigo. 997 00:41:22,220 --> 00:41:24,770 É só unha variable de índice que é a iteración de cero enriba 998 00:41:24,770 --> 00:41:26,960 ao longo da cadea s. 999 00:41:26,960 --> 00:41:30,367 Por iso, será cero, a continuación, un, despois dous, despois tres, despois catro. 1000 00:41:30,367 --> 00:41:33,200 Entón, imos montar estes novos O enigma de raspadinhas-like, se quere, 1001 00:41:33,200 --> 00:41:36,140 a pesar de, de novo, a sintaxe é moito máis misterioso do que cero. 1002 00:41:36,140 --> 00:41:39,522 Entón t é un enderezo + i me vai dar 1003 00:41:39,522 --> 00:41:42,480 un número, porque estes son todos números que vimos deseñar como hex. 1004 00:41:42,480 --> 00:41:43,560 Pero son só números. 1005 00:41:43,560 --> 00:41:49,960 >> Entón, se o enderezo de t dixemos era 0x88, que é 0x88 máis cero. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Mesmo se non está cómodo con hex aínda, dar un palpite. 1008 00:41:53,980 --> 00:41:54,410 >> Audiencia: O orixinal. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. Malan: Aínda 0x88. 1010 00:41:55,850 --> 00:41:58,910 Entón, o que * 0x88 significa? 1011 00:41:58,910 --> 00:42:02,670 É dicir, "ir alí", que significa efectivamente, "poñer o dedo aquí." 1012 00:42:02,670 --> 00:42:06,930 E agora no lado da man dereita de esta expresión, * e, a continuación, en parénteses, 1013 00:42:06,930 --> 00:42:11,586 s + i significa s, que é o tratar-se aquí da pequena g. 1014 00:42:11,586 --> 00:42:16,220 s +0 é, por suposto, é, todo o que é s. 1015 00:42:16,220 --> 00:42:21,230 >> Entón, agora, é * s, que así como * 33 Oxford Street significa ir ao enderezo 1016 00:42:21,230 --> 00:42:22,010 s. 1017 00:42:22,010 --> 00:42:24,170 Entón aquí está este dedo, a man dereita. 1018 00:42:24,170 --> 00:42:26,050 Entón que é o que eu vou copiar o que? 1019 00:42:26,050 --> 00:42:30,260 A cousa sobre o dereito, que é Gabe, pouco g aquí, para aquí. 1020 00:42:30,260 --> 00:42:32,750 >> E así o efecto de que primeira iteración do bucle, 1021 00:42:32,750 --> 00:42:36,200 como proposto, aínda que pareza tolo máis complicado do que calquera cousa 1022 00:42:36,200 --> 00:42:42,110 que xa vimos antes, está simplemente dicindo prema aquí e copie este personaxe aquí. 1023 00:42:42,110 --> 00:42:44,700 É o que lle dá un mapa para ambos os lugares. 1024 00:42:44,700 --> 00:42:46,130 >> E veremos moito máis diso. 1025 00:42:46,130 --> 00:42:50,600 Pero, por agora, a esperanza é só para introducir algunhas destas ideas básicas. 1026 00:42:50,600 --> 00:42:53,550 E, de feito, vexamos un programa de final aquí, 1027 00:42:53,550 --> 00:42:57,480 e entón o claymation prometido, que pode facer todo certo. 1028 00:42:57,480 --> 00:42:57,980 Todo correcto. 1029 00:42:57,980 --> 00:43:01,680 Entón deixe-me abrir up-- alí imos nós. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Entón imos me-- imos volver a ese cadro antes de tempo. 1032 00:43:05,440 --> 00:43:08,360 Déixeme abrir este último exemplo aquí. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Entón aquí vai unha super, super programa que realiza 1035 00:43:12,710 --> 00:43:15,050 nada na vida que fai o seguinte. 1036 00:43:15,050 --> 00:43:18,740 En primeiro lugar, el declara dúas variables, x e y, que non son números este tempo, 1037 00:43:18,740 --> 00:43:19,240 per si. 1038 00:43:19,240 --> 00:43:20,448 Eles non están enteiros, per se. 1039 00:43:20,448 --> 00:43:22,899 Son aparentemente int *. 1040 00:43:22,899 --> 00:43:25,690 Entón, calquera, o que significa Se o tipo de datos, a súa variable, 1041 00:43:25,690 --> 00:43:26,860 é do tipo int * star? 1042 00:43:26,860 --> 00:43:30,240 Este é o enderezo dun int. 1043 00:43:30,240 --> 00:43:31,990 >> Entón, eu non teño ningunha idea de onde é aínda. 1044 00:43:31,990 --> 00:43:35,150 Significa só "poñer, finalmente, a dirección dun int aquí. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, onde queira que sexa en memoria, un enderezo está pasando alí. 1046 00:43:38,340 --> 00:43:40,200 E iso é o que y é será, tamén. 1047 00:43:40,200 --> 00:43:44,920 >> Se eu agora dicir x = malloc (sizeof (int)), esta é un xeito elegante de dicir, 1048 00:43:44,920 --> 00:43:49,000 hey sistema operativo, vía malloc, dáme a memoria suficiente para o tamaño 1049 00:43:49,000 --> 00:43:52,370 dun int, que é probabelmente será de 32 bits ou catro bytes. 1050 00:43:52,370 --> 00:43:53,680 >> Entón, o que malloc voltar? 1051 00:43:53,680 --> 00:43:55,250 Malloc retorna un enderezo. 1052 00:43:55,250 --> 00:43:57,020 Entón, o que vai ser almacenado en x? 1053 00:43:57,020 --> 00:44:00,600 O enderezo do bloque de memoria, os catro bytes, que malloc 1054 00:44:00,600 --> 00:44:03,360 só atopei para me pregunta o sistema operativo. 1055 00:44:03,360 --> 00:44:08,240 >> Agora, con todo, a liña catro aquí, a * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Só para quedar claro, o que está pasando alí embaixo? 1057 00:44:09,990 --> 00:44:11,530 Na parte esquerda, * x. 1058 00:44:11,530 --> 00:44:13,610 que é como * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Entón * x significa o que? 1060 00:44:15,523 --> 00:44:16,450 >> Audiencia: Vaia. 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J. Malan: Vaia a este enderezo. 1062 00:44:17,908 --> 00:44:20,466 Onde queira que ese anaco de memoria é, ir a el. 1063 00:44:20,466 --> 00:44:21,979 E poñer o que hai, obviamente? 1064 00:44:21,979 --> 00:44:22,520 Audiencia: 42. 1065 00:44:22,520 --> 00:44:23,580 DAVID J. Malan: 42. 1066 00:44:23,580 --> 00:44:25,650 Todo ben, * y, mesma idea. 1067 00:44:25,650 --> 00:44:26,860 Ir ao enderezo en y. 1068 00:44:26,860 --> 00:44:31,740 Pon o número 13 alí, pero o que é y no momento? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 Audiencia: Non hai memoria para y. 1071 00:44:34,630 --> 00:44:35,710 DAVID J. Malan: Non hai memoria para y. 1072 00:44:35,710 --> 00:44:38,215 Entón, o que fai y probablemente conter, como vimos dicir? 1073 00:44:38,215 --> 00:44:38,520 >> Audiencia: Garbage. 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J. Malan: Algún valor de lixo. 1075 00:44:39,480 --> 00:44:41,320 Agora, o valor de lixo aínda é un número. 1076 00:44:41,320 --> 00:44:43,160 El aínda pode ser confundido cun enderezo. 1077 00:44:43,160 --> 00:44:45,160 É como se alguén rabiscos algo, 1078 00:44:45,160 --> 00:44:48,002 e eu mal interpretado como significando un edificio ao final da rúa. 1079 00:44:48,002 --> 00:44:50,460 E se só tentar entrar un edificio que non posúe, 1080 00:44:50,460 --> 00:44:53,710 ou algún anaco de memoria que non ten foi dado, as cousas malas poden ocorrer. 1081 00:44:53,710 --> 00:44:57,740 Ordenador pode fallar, ou algún outro comportamento indefinido pode pasar. 1082 00:44:57,740 --> 00:45:01,310 >> Así, a introdución, a continuación, para Binky é iso. 1083 00:45:01,310 --> 00:45:04,290 Eu aínda me lembro, 20 tantos anos despois, 1084 00:45:04,290 --> 00:45:07,200 onde estaba cando finalmente comprendida punteiros. 1085 00:45:07,200 --> 00:45:09,520 >> O que quere dicir, se deixe aquí en tres minutos 1086 00:45:09,520 --> 00:45:12,170 e creo que non entender punteiros, entender 1087 00:45:12,170 --> 00:45:14,410 Teño lembrado por 20 anos, por algunha razón tolo 1088 00:45:14,410 --> 00:45:17,140 cando e por que finalmente afundido en, sentado co meu ensino 1089 00:45:17,140 --> 00:45:19,501 compañeiro, Nishat Mehta no redor de Eliot Comedor. 1090 00:45:19,501 --> 00:45:21,250 Agora, eu me lembrei iso porque foi 1091 00:45:21,250 --> 00:45:23,920 un dos temas I, en particular, loitou con. 1092 00:45:23,920 --> 00:45:26,470 E entón, finalmente premendo, como eu ouso dicir unha chea de temas 1093 00:45:26,470 --> 00:45:27,460 acabará. 1094 00:45:27,460 --> 00:45:32,590 E agora, para facer que sentir toda a máis feliz e todo o máis convincente, 1095 00:45:32,590 --> 00:45:35,360 imos dar un ollo final na nosa últimos tres minutos aquí no Binky, 1096 00:45:35,360 --> 00:45:37,675 do noso amigo, Nick Parlante de Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [REPRODUCIÓN] 1099 00:45:41,580 --> 00:45:42,750 >> Ei, Binky. 1100 00:45:42,750 --> 00:45:43,500 Acorde! 1101 00:45:43,500 --> 00:45:45,960 É hora de diversión punteiro. 1102 00:45:45,960 --> 00:45:47,012 >> -Cal Que é iso? 1103 00:45:47,012 --> 00:45:48,723 Máis información sobre punteiros? 1104 00:45:48,723 --> 00:45:50,580 Ah, que bo! 1105 00:45:50,580 --> 00:45:53,563 >> Ben, para comezar, creo que estamos Vai ter un par de punteiros. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Este código aloca dous punteiros, que pode apuntar a números enteiros. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Ben, eu vexo os dous punteiros, pero eles non parecen estar apuntando para calquera cousa. 1110 00:46:02,140 --> 00:46:02,980 >> -É Dereita. 1111 00:46:02,980 --> 00:46:05,100 Inicialmente, os punteiros non apuntan para nada. 1112 00:46:05,100 --> 00:46:08,030 As cousas que eles apuntan chámanse pointees, e configuralo los de 1113 00:46:08,030 --> 00:46:09,370 un paso separado. 1114 00:46:09,370 --> 00:46:10,220 >> Ah, non, non. 1115 00:46:10,220 --> 00:46:10,950 Eu sabía. 1116 00:46:10,950 --> 00:46:12,385 Os pointees son separados. 1117 00:46:12,385 --> 00:46:14,315 Er, así como reservar unha pointee? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> -OK. 1120 00:46:15,960 --> 00:46:18,970 Ben, este código aloca un novo pointee enteiro, 1121 00:46:18,970 --> 00:46:20,950 e iso define Parte X para apuntar para el. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Ei, que parece mellor. 1124 00:46:23,230 --> 00:46:25,060 Entón el facer algo. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Vou cancelar o punteiro x para almacenar o número 42 na súa pointee. 1127 00:46:30,455 --> 00:46:32,830 Para este truco, eu vou ter a miña Varinha Máxica de desreferenciação. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -O Seu Magic Wand de Dereferencing? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 Que-- iso é óptimo. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> -Este É o que o código se parece. 1134 00:46:41,080 --> 00:46:44,110 Eu só vou definir o número, e [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Ei, mira. 1136 00:46:44,700 --> 00:46:46,140 Non vai. 1137 00:46:46,140 --> 00:46:50,980 >> Entón Facendo un desreferenciava en x segue a frecha para ter acceso ao seu pointee. 1138 00:46:50,980 --> 00:46:53,160 Neste caso, unha tenda de 42 en alí. 1139 00:46:53,160 --> 00:46:57,710 Hey tentar usalo para almacenar o número 13 a través do outro punteiro, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Vou pasar por riba aquí para y, e obter o número 13 set up. 1142 00:47:03,270 --> 00:47:07,930 E, a continuación, tome a vara de Dereferencing e só [Buzz] 1143 00:47:07,930 --> 00:47:08,960 >> Ah! 1144 00:47:08,960 --> 00:47:09,500 >> Oh, hey! 1145 00:47:09,500 --> 00:47:11,090 Isto non funcionou. 1146 00:47:11,090 --> 00:47:15,630 Diga, Binky, eu non creo que dereferencing y é unha boa idea, xa sabedes, 1147 00:47:15,630 --> 00:47:17,850 creación do pointee é un paso separado. 1148 00:47:17,850 --> 00:47:20,450 E eu non creo que nunca fixen iso. 1149 00:47:20,450 --> 00:47:21,480 >> Punto -Boa. 1150 00:47:21,480 --> 00:47:21,980 Si. 1151 00:47:21,980 --> 00:47:25,680 Alocamos o punteiro y, pero nós nunca define-lo para ligar a un pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Moi Observador. 1154 00:47:28,616 --> 00:47:30,240 Ei, está mirando bo alí, Binky. 1155 00:47:30,240 --> 00:47:33,400 Pode resolve-lo así que os puntos y ao mesmo pointee como x? 1156 00:47:33,400 --> 00:47:34,000 >> -sure. 1157 00:47:34,000 --> 00:47:36,780 Vou usar a miña vara máxica Punteiro de Cesión. 1158 00:47:36,780 --> 00:47:38,740 >> -É Que será un problema como antes? 1159 00:47:38,740 --> 00:47:39,240 -No. 1160 00:47:39,240 --> 00:47:40,660 Este non toca nos pointees. 1161 00:47:40,660 --> 00:47:44,450 El só cambia un punteiro para apuntan o mesmo que o outro. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, eu vexo. 1163 00:47:45,450 --> 00:47:48,200 Agora y apunta para o mesmo lugar que x. 1164 00:47:48,200 --> 00:47:48,910 Entón, agarde. 1165 00:47:48,910 --> 00:47:49,950 Agora, y é fixo. 1166 00:47:49,950 --> 00:47:51,120 Ten un pointee. 1167 00:47:51,120 --> 00:47:54,510 Entón podes probar o Wand of Dereferencing novo para enviar a 13 terminado. 1168 00:47:54,510 --> 00:47:56,510 >> Uh, Aceptar. 1169 00:47:56,510 --> 00:47:58,160 Aquí vai. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Ei, mira isto. 1171 00:47:59,340 --> 00:48:00,750 Agora dereferencing obras sobre y. 1172 00:48:00,750 --> 00:48:04,991 E por que os punteiros están compartindo que un pointee, ambos ver o 13. 1173 00:48:04,991 --> 00:48:05,490 Si. 1174 00:48:05,490 --> 00:48:06,870 Compartindo, calquera que sexa. 1175 00:48:06,870 --> 00:48:08,820 Entón, imos cambiar de lugar agora? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, mire. 1177 00:48:09,440 --> 00:48:10,830 Estamos sen tempo. 1178 00:48:10,830 --> 00:48:11,570 >> -Mais 1179 00:48:11,570 --> 00:48:13,530 >> -Basta Recordar as tres regras de punteiro. 1180 00:48:13,530 --> 00:48:16,560 Number One, a estrutura básica é que ten un punteiro, 1181 00:48:16,560 --> 00:48:18,680 e apunta máis a un pointee. 1182 00:48:18,680 --> 00:48:20,640 Pero o punteiro e pointee son separados, 1183 00:48:20,640 --> 00:48:22,610 e o erro común é a creación dun punteiro, 1184 00:48:22,610 --> 00:48:25,000 pero esquecerse de darlle un pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Número Dous, dereferencing punteiro comeza o punteiro 1186 00:48:28,170 --> 00:48:31,050 e segue a súa frecha sobre para ter acceso ao seu pointee. 1187 00:48:31,050 --> 00:48:33,400 Como todos sabemos, este só funciona se hai 1188 00:48:33,400 --> 00:48:36,270 un pointee, que tipo de recibe de volta a regra número un. 1189 00:48:36,270 --> 00:48:39,000 >> Número Tres, punteiro asignación é un punteiro 1190 00:48:39,000 --> 00:48:42,320 e cambia-lo para apuntar para o mesmo pointee como outro punteiro. 1191 00:48:42,320 --> 00:48:44,160 Así, tras a concesión, os dous punteiros 1192 00:48:44,160 --> 00:48:45,910 pode apuntar para o mesmo pointee. 1193 00:48:45,910 --> 00:48:47,990 Ás veces, iso é chamado de reparto. 1194 00:48:47,990 --> 00:48:49,740 E iso é todo o que existe para ela, realmente. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye agora. 1196 00:48:50,277 --> 00:48:51,110 [FIN REPRODUCIÓN DE VIDEO] 1197 00:48:51,110 --> 00:48:52,568 DAVID J. Malan: Isto é todo para CS50. 1198 00:48:52,568 --> 00:48:55,110 Imos velo a próxima semana. 1199 00:48:55,110 --> 00:48:56,064