1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Semana 4, continuación] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Harvard University] 3 00:00:04,240 --> 00:00:07,290 [Esta é CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Este é CS50, e este é o fin de semana 4. 5 00:00:11,290 --> 00:00:14,030 Entón, unha noticia boa e unha mala noticia. 6 00:00:14,030 --> 00:00:26,240 Non charla o luns, non hai problema definido a próxima semana. [Alumnos aplaudindo] 7 00:00:26,240 --> 00:00:28,680 Non vai gusta de onde iso vai dar. 8 00:00:28,680 --> 00:00:31,590 Pero nós temos iso en vez vindeiro mércores, 9 00:00:31,590 --> 00:00:37,740 e hai tamén o currículo por charla venres unha vindeiro venres, para que poidamos permanecer na pista. 10 00:00:37,740 --> 00:00:40,580 Pero todo vai ser filmado, como de costume, para non se preocupar. 11 00:00:40,580 --> 00:00:44,100 >> E con relación a 0 Quiz o que imos facer para o final da semana 12 00:00:44,100 --> 00:00:47,140 é publicar en cs50.net do curso sitio web unha explicación 13 00:00:47,140 --> 00:00:50,160 que tipo de expectativas que debe ter cando se trata do primeiro cuestionario. 14 00:00:50,160 --> 00:00:55,100 En xeral, será de múltiple opción, verdadeiro ou falso, resposta curta curtas problemas de codificación. 15 00:00:55,100 --> 00:00:57,360 Non vai ser esperado para aplicar o equivalente 16 00:00:57,360 --> 00:01:00,030 dun problema que vería nun pset, para que teña un ordenador 17 00:01:00,030 --> 00:01:03,240 e un depurador e similares, pero non haberá pequenos problemas de codificación. 18 00:01:03,240 --> 00:01:06,900 >> E, de feito, o mellor guía para ter unha noción do que son como CS50 quizzes 19 00:01:06,900 --> 00:01:09,180 é ir a cs50.net, ir ao enlace quizzes, 20 00:01:09,180 --> 00:01:11,920 e podes ver os últimos anos por valor de cuestionarios. 21 00:01:11,920 --> 00:01:16,600 Basta entender que o currículo non foi sempre o mesmo ao longo dos anos. 22 00:01:16,600 --> 00:01:18,510 Ás veces, engadimos nós, ás veces, restar, 23 00:01:18,510 --> 00:01:20,670 entón se ves algún tema nun dos vellos quizzes 24 00:01:20,670 --> 00:01:25,380 que non ten idea do que está falando, ela quere que sexa abordado 25 00:01:25,380 --> 00:01:27,210 ou que non cobre-lo. 26 00:01:27,210 --> 00:01:31,110 Pero, na forma de comentarios, este domingo, luns e martes 27 00:01:31,110 --> 00:01:34,770 así como un curso de ancho sesión de revisión, na noite do domingo - 28 00:01:34,770 --> 00:01:37,500 horario e lugar a ser anunciado na páxina principal do curso - 29 00:01:37,500 --> 00:01:40,120 que todos teñan a oportunidade de revisar os bolseiros do curso de ensino 30 00:01:40,120 --> 00:01:44,830 material para este ano, tanto na sección e como unha clase chea, 31 00:01:44,830 --> 00:01:48,400 e os que serán filmados, como de costume tamén. 32 00:01:48,400 --> 00:01:53,380 >> Todo ben. Entón, sen máis delongas, un comentario sobre aprobación / reprovação e add / drop. 33 00:01:53,380 --> 00:01:57,980 Podes ver as miñas notas na noite pasada, e iso é realmente só algúns garantía adicional 34 00:01:57,980 --> 00:02:01,250 que, se está entre os particularmente menos cómodo ou nalgún lugar entre 35 00:02:01,250 --> 00:02:04,870 e se está sentindo un pouco por riba da súa cabeza, 36 00:02:04,870 --> 00:02:08,430 entender que é realmente moi normal, e non hai unha estrutura de apoio ampla no lugar, 37 00:02:08,430 --> 00:02:13,530 un dos cales o horario de expediente tiñan a intención de mellorar aínda máis a miña noite para rematar e-mail, 38 00:02:13,530 --> 00:02:16,520 e entender tamén que unha opción como aprobación / reprovação dunha clase como esta 39 00:02:16,520 --> 00:02:21,540 realmente se entende como un mecanismo para tomar a bordo fóra dun curso coma este, 40 00:02:21,540 --> 00:02:24,200 para que de novo se está gastando os 10, 15, 20 horas 41 00:02:24,200 --> 00:02:28,160 só tentando obter algunha pset para traballar e vostede sabe que é 90-95% do camiño 42 00:02:28,160 --> 00:02:32,100 pero non pode atopar algún erro maldito, nun aprobación / reprovação modelo que é unha especie de ben. 43 00:02:32,100 --> 00:02:36,230 >> A idea é que, con este mecanismo, pode ir foco nas súas outras serie de exercicios 44 00:02:36,230 --> 00:02:39,530 ou durmir ou que é o que quere centrar. 45 00:02:39,530 --> 00:02:43,390 Entón entender que ten ata esta martes que vén - técnicamente o luns 5, 46 00:02:43,390 --> 00:02:50,840 pero é unha festa, para esta martes que vén - para cambiar de aprobación / reprovação para graduados ou viceversa. 47 00:02:50,840 --> 00:02:54,450 E se está realmente ao bordo do precipicio e está a pensar en deixar caer por completo, 48 00:02:54,450 --> 00:02:56,440 por favor me incorporarse despois de charla ou mandar-me unha nota. 49 00:02:56,440 --> 00:02:59,990 Adoraríamos polo menos conversa antes de despedirse. 50 00:02:59,990 --> 00:03:03,470 Todo ben. Entón comezan a retirar as rodinhas da última vez. 51 00:03:03,470 --> 00:03:06,030 En particular, nós nos concentrados en secuencia. 52 00:03:06,030 --> 00:03:09,740 Cadea é algo que é declarado na biblioteca CS50, 53 00:03:09,740 --> 00:03:14,340 especialmente no arquivo chamado cs50.h que nós imos comezar a ollar para esta semana ea próxima. 54 00:03:14,340 --> 00:03:17,250 Pero cadea é realmente só unha simplificación de algo 55 00:03:17,250 --> 00:03:20,980 que é un pouco máis arcanely descrito como char *. 56 00:03:20,980 --> 00:03:24,090 Char estamos familiarizados. É só un único personaxe. 57 00:03:24,090 --> 00:03:28,010 Pero * como de luns denotado o que? >> [Alumno] Un punteiro. 58 00:03:28,010 --> 00:03:31,290 Un punteiro. E o que é un punteiro? >> [Alumno] Un enderezo. 59 00:03:31,290 --> 00:03:33,420 >> É como un enderezo, un lugar na memoria. 60 00:03:33,420 --> 00:03:35,910 ¿Que é un enderezo ou lugar ou de memoria? 61 00:03:35,910 --> 00:03:40,290 Unha vez máis, todos temos portátiles con un concerto ou 2 gigabytes de memoria RAM probablemente estes días, 62 00:03:40,290 --> 00:03:44,160 e iso significa que ten un billón ou 2 millóns de bytes por valor de memoria. 63 00:03:44,160 --> 00:03:46,240 E iso realmente non importa o que fisicamente se parece, 64 00:03:46,240 --> 00:03:51,220 pero asumir a fe que pode numerar todos os bytes individuais que ten o seu propio portátil - 65 00:03:51,220 --> 00:03:54,580 este é o byte 0, este é un byte, este é byte 2 millóns - 66 00:03:54,580 --> 00:03:56,100 e iso é o que un ordenador fai. 67 00:03:56,100 --> 00:04:00,030 Cando reservar espazo para un único personaxe, por exemplo, 68 00:04:00,030 --> 00:04:02,480 que, obviamente, ten que vivir en algún lugar na memoria do seu ordenador, 69 00:04:02,480 --> 00:04:05,860 e quizais sexa, o número de bytes 12345, 70 00:04:05,860 --> 00:04:08,470 e que está en algún lugar aquí en memoria do seu ordenador. 71 00:04:08,470 --> 00:04:12,630 E o enderezo logo de que o carácter é 12345. 72 00:04:12,630 --> 00:04:16,140 >> Agora, a semana 0 por agora, ata agora, non temos realmente lle importaba 73 00:04:16,140 --> 00:04:19,170 onde na memoria as cousas están gardados porque xeralmente usan símbolos, 74 00:04:19,170 --> 00:04:22,540 variables, e matrices para realmente obter os nosos datos. 75 00:04:22,540 --> 00:04:24,950 Pero a partir de luns e aínda máis hoxe, agora vai ter 76 00:04:24,950 --> 00:04:27,710 todos os recursos máis expresivos con programas de escritura 77 00:04:27,710 --> 00:04:31,330 para realmente manipular a memoria dun ordenador, con todo, ve o axuste, 78 00:04:31,330 --> 00:04:33,720 tanto para fins bos e malos, 79 00:04:33,720 --> 00:04:39,620 erros de ser un resultado moi común neste punto en aprender esas cousas. 80 00:04:39,620 --> 00:04:42,460 Pero o que iso realmente significa ser un char *? 81 00:04:42,460 --> 00:04:46,140 Imos en fronte de volta para - e nós imos voltar a Binky como prometera hoxe. 82 00:04:46,140 --> 00:04:48,670 Imos a un exemplo simples aquí. 83 00:04:48,670 --> 00:04:53,060 Deixe-me salve este ficheiro como compare.c, e deixe-me conseguir algún código do modelo aquí 84 00:04:53,060 --> 00:05:00,490 para incluír stdio.h, deixe-me dar-me tamén inclúen cs50.h. Vou aumentar o zoom ata alí. 85 00:05:00,490 --> 00:05:05,850 Deixe-me comezar a escribir int main, main (void), e agora quero facer algo como isto: 86 00:05:05,850 --> 00:05:13,520 printf ("Deixa-me unha cadea:") e logo vou usar string s está GetString 87 00:05:13,520 --> 00:05:16,750 para obter unha cadea de usuario, entón eu vou pedir para o usuario a outra. 88 00:05:16,750 --> 00:05:21,870 ("Deixa-me outra cadea:") e eu vou pedir a eles a través GetString para conseguir isto. 89 00:05:21,870 --> 00:05:27,020 Vou chamalo de t t porque vén despois de s e s é un bo nome para unha cadea se é moi xenérica. 90 00:05:27,020 --> 00:05:30,030 Entón GetString, e agora eu só quero facer unha proba de sanidade e eu vou dicir 91 00:05:30,030 --> 00:05:39,770 if (s == t), entón eu vou só dicir que o usuario printf ("Inseriu o mesmo \ n"); 92 00:05:39,770 --> 00:05:45,520 máis eu vou imprimir algo ("Inseriu algo diferente! \ n") 93 00:05:45,520 --> 00:05:48,460 ou calquera que sexa a sentenza será. Entón, algo así. 94 00:05:48,460 --> 00:05:52,200 A continuación, como de costume, eu vou volver 0 que só significa que nada de malo aconteceu, 95 00:05:52,200 --> 00:05:54,400 e eu estou indo a ir adiante e compilar e executar este programa. 96 00:05:54,400 --> 00:05:56,540 >> Pero o luns nos rodamos este programa, 97 00:05:56,540 --> 00:06:00,420 e, de feito, foron informados de que non é OLA OLA adeus e non é un adeus. 98 00:06:00,420 --> 00:06:03,140 O comportamento que vimos foi un pouco máis como este. 99 00:06:03,140 --> 00:06:11,450 Deixe-me ir para o meu directorio de orixe, zoom aquí, e imos facer comparar. 100 00:06:11,450 --> 00:06:14,570 Compilado ben. Déixame executar comparar. Déame unha cadea: Ola. 101 00:06:14,570 --> 00:06:16,300 Déame outra secuencia: Ola. 102 00:06:16,300 --> 00:06:18,000 Escribiu algo diferente! 103 00:06:18,000 --> 00:06:22,650 Ben, deixe-me tentar algo máis simple como 50, 50. Escribiu algo diferente! 104 00:06:22,650 --> 00:06:25,740 ola, ola. Entón, claramente, algo está a suceder aquí. 105 00:06:25,740 --> 00:06:28,440 Pero cal era a explicación para por que? 106 00:06:28,440 --> 00:06:33,850 Ao parecer, a liña 12 é completamente disfuncional. 107 00:06:34,300 --> 00:06:39,430 Cal é o problema fundamental aquí? Si >> [Alumno] Está comparando os enderezos. 108 00:06:39,430 --> 00:06:41,850 Si, exactamente. É realmente comparando os enderezos 109 00:06:41,850 --> 00:06:44,580 en que OLA OLA e son almacenados. 110 00:06:44,580 --> 00:06:48,290 Non está comparando as letras OLA novo e de novo, 111 00:06:48,290 --> 00:06:52,370 porque o que realmente aconteceu, todo ese tempo que estamos usando GetString - 112 00:06:52,370 --> 00:06:56,130 Este cadro é unha vez máis a memoria do noso ordenador, 113 00:06:56,130 --> 00:07:00,100 e digamos que eu chamo GetString despois de declarar unha variable s. 114 00:07:00,100 --> 00:07:01,930 Por que a miña memoria parece? 115 00:07:01,930 --> 00:07:07,070 Imos dicir que arbitrariamente s parece con isto. É un cadrado. 116 00:07:07,070 --> 00:07:09,040 E practicamente calquera tempo eu deseño un anaco de memoria na pantalla 117 00:07:09,040 --> 00:07:12,860 si é 32 bits eu teño deseñado cadrados como este, porque realmente o aparello, 118 00:07:12,860 --> 00:07:17,380 un punteiro, un enderezo, é de 32 bits. É o mesmo que un int. 119 00:07:17,380 --> 00:07:19,420 Isto pode variar de acordo co sistema informático. 120 00:07:19,420 --> 00:07:24,630 Aqueles de vós que son vagamente familiarizado co feito de que o seu Mac ou PC de 64 bits, 121 00:07:24,630 --> 00:07:28,120 que, en realidade, indica que o ordenador está a usar punteiros de 64 bits, 122 00:07:28,120 --> 00:07:33,730 64-bits de enderezos, e entre os dous lados positivos de que é os seus ordenadores 123 00:07:33,730 --> 00:07:35,560 RAM pode ter moito máis do que antigamente. 124 00:07:35,560 --> 00:07:39,240 Longa historia curta, de volta ao día en que os ordenadores usados ​​só 32 bits 125 00:07:39,240 --> 00:07:42,740 para representar os enderezos, o maior número de bytes que podería representar 126 00:07:42,740 --> 00:07:46,280 nese caso, foi o que se ten 32 bits? 127 00:07:46,280 --> 00:07:49,590 Entón 4 millóns, dereito, porque 2 a 32 e de 4 millóns. 128 00:07:49,590 --> 00:07:51,370 Este número foi recurrente no curso. 129 00:07:51,370 --> 00:07:55,240 >> Entón, se só ten 32 bits, o número máis alto que pode contar para a preto de 4 millóns de dólares. 130 00:07:55,240 --> 00:07:58,750 Pero iso era unha limitación fundamental dos ordenadores, ata uns anos 131 00:07:58,750 --> 00:08:01,180 porque se só pode contar ademais de 4 millóns, 132 00:08:01,180 --> 00:08:05,270 non importa se mercar 8 gigabytes de memoria RAM ou ata 5 gigabytes de memoria RAM; 133 00:08:05,270 --> 00:08:07,780 non pode contar que a alta, polo que era inútil. 134 00:08:07,780 --> 00:08:11,430 Vostede podería acceder só os primeiros 3 ou 4 gigabytes de memoria do seu ordenador. 135 00:08:11,430 --> 00:08:14,410 Iso é menos de un problema, e pode mercar MacBook Pros e Dells 136 00:08:14,410 --> 00:08:17,680 con 8 gigabytes de memoria RAM ou mesmo máis estes días. 137 00:08:17,680 --> 00:08:24,100 Pero se eu simplemente reservar neste programa un punteiro, un punteiro chamado s, 138 00:08:24,100 --> 00:08:28,370 pode parecer que está na pantalla, pois realmente necesitamos descascada esa capa. 139 00:08:28,370 --> 00:08:33,520 Eu sigo dicindo cadea, pero a partir de luns, string é realmente * char, 140 00:08:33,520 --> 00:08:35,590 o enderezo de algún personaxe. 141 00:08:35,590 --> 00:08:39,280 Polo tanto, imos ter que roda formación fóra aínda que nós imos seguir usando GetString por agora. 142 00:08:39,280 --> 00:08:42,600 Entón eu s declarada, e este é un anaco de memoria, 32 bits. 143 00:08:42,600 --> 00:08:47,370 O que ten aquí en memoria por defecto? >> [Resposta do alumno inaudível] 144 00:08:47,370 --> 00:08:50,040 ¿Que é iso? >> [Alumno] Lixo. Lixo. >> Exactamente. 145 00:08:50,040 --> 00:08:54,610 Se o desenvolvedor non poñer un valor nunha variable, que sabe o que é? 146 00:08:54,610 --> 00:08:57,990 Ás veces tes sorte e é 0, que é unha especie de bo valor por defecto, limpo, 147 00:08:57,990 --> 00:09:00,310 pero como vimos luns, ás veces, é un disparate completo, 148 00:09:00,310 --> 00:09:04,130 un número moi grande positivo ou negativo que veu de onde? 149 00:09:05,350 --> 00:09:07,010 Si >> [Estudante] A función antes. Si >>. 150 00:09:07,010 --> 00:09:10,170 >> Moitas veces a función que foi chamado antes, porque lembre, 151 00:09:10,170 --> 00:09:13,920 como chama funcións na memoria, eles ocupan máis espazo e máis de abaixo cara arriba, 152 00:09:13,920 --> 00:09:17,040 e, logo que o retorno da función, que a memoria está reutilizado 153 00:09:17,040 --> 00:09:20,890 polo próximo cara que se chama, quen está a usar o mesmo porción de memoria. 154 00:09:20,890 --> 00:09:23,450 E se ten lixo deixado alí, os valores anteriores, 155 00:09:23,450 --> 00:09:28,190 podemos confundir s como tendo un valor cando realmente non puxémonos nada alí. 156 00:09:28,190 --> 00:09:30,960 Polo tanto, a nosa memoria RAM, neste punto parece con isto. 157 00:09:30,960 --> 00:09:36,030 Agora, no lado dereito da liña 7 estamos chamando GetString, 158 00:09:36,030 --> 00:09:40,150 que estamos facendo agora por semanas, pero o que é realmente GetString facendo? 159 00:09:40,150 --> 00:09:43,350 GetString escrito polo equipo do CS50 é un pouco intelixente 160 00:09:43,350 --> 00:09:46,500 en que, así que o usuario comeza a teclear as teclas e hits Intro, 161 00:09:46,500 --> 00:09:50,010 Figuras GetString fóra cantas teclas fixeron o éxito do usuario, 162 00:09:50,010 --> 00:09:53,360 cantos caracteres eu teño reservar memoria RAM para. 163 00:09:53,360 --> 00:09:55,660 E onde que a RAM vén, quen sabe? 164 00:09:55,660 --> 00:09:58,930 Está en algún lugar do seu ordenador 2 gigabytes de memoria e outros enfeites. 165 00:09:58,930 --> 00:10:05,200 Pero imos supor que o ordenador atopou espazo para a palabra OLA aquí. 166 00:10:05,200 --> 00:10:08,710 A palabra que eu escriba foi H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 E se tomar isto como unha secuencia de caracteres, pode chamar así. 168 00:10:13,510 --> 00:10:17,860 Pero eu teño que facer unha cousa extra. O que pertenza ao final de calquera cadea en C? 169 00:10:17,860 --> 00:10:20,710 O personaxe nulo, o que escribir como \ 0. 170 00:10:20,710 --> 00:10:23,980 É técnicamente o número 0, pero a barra invertida fai toda máis clara a 171 00:10:23,980 --> 00:10:28,150 que este é literalmente o número 0, o enteiro 0; 172 00:10:28,150 --> 00:10:32,440 non é, por exemplo 0, entre comiñas que pode escribir no teclado. 173 00:10:32,440 --> 00:10:33,940 Polo tanto, esta é OLA. 174 00:10:33,940 --> 00:10:36,350 >> E o que podemos dicir luns que unha función como GetString 175 00:10:36,350 --> 00:10:39,580 é, en realidade, volvendo todas estas semanas? 176 00:10:39,580 --> 00:10:43,960 Non é devolver unha cadea de per se, porque iso realmente non ten sentido 177 00:10:43,960 --> 00:10:47,710 porque as cordas non existen. Son unha especie de fabricación na biblioteca CS50. 178 00:10:47,710 --> 00:10:51,300 O que é realmente unha secuencia, máis tecnicamente? >> [Alumno] É o primeiro carácter. 179 00:10:51,300 --> 00:10:55,950 Exactamente. É simplemente o enderezo do primeiro carácter que o usuario introduciu dentro 180 00:10:55,950 --> 00:11:02,810 Entón, a miña palabra OLA remata-se en 123 o número de bytes e logo en número de byte 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, e así por diante, se número só os meus máis de 0 encima, 182 00:11:08,320 --> 00:11:12,650 o que realmente está retornando GetString é literalmente o número 123. 183 00:11:12,650 --> 00:11:19,270 Entón, o que é posto en s é o número 123, e non a letra H, non a palabra OLA, 184 00:11:19,270 --> 00:11:23,130 simplemente o enderezo en que eu poida atopar a primeira letra do OLA. 185 00:11:23,130 --> 00:11:26,500 Pero iso non parece ser suficiente. Eu lle pedín unha cadea, non un personaxe. 186 00:11:26,500 --> 00:11:32,970 Así coma nós ou o ordenador saber que tipo de ello veñen xunto co H? 187 00:11:35,760 --> 00:11:37,460 Cal é o tipo de acordo que temos? Si 188 00:11:37,460 --> 00:11:40,100 [Alumno] Continúa dicindo a si mesma para atopar algúns personaxes. >> Exactamente. 189 00:11:40,100 --> 00:11:44,570 >> Hai esa convención humano-ordenador en que cando está lidando con cordas, 190 00:11:44,570 --> 00:11:49,410 tamén coñecido agora como estrelas char, simplemente ten que descubrir 191 00:11:49,410 --> 00:11:54,350 onde ao final de cada corda na vida é realmente só unha iteração sobre iso con un loop, 192 00:11:54,350 --> 00:11:57,820 un loop while, calquera que sexa, de xeito que cando atopa o final da cadea 193 00:11:57,820 --> 00:12:02,160 agora pode inferir que, oh, toda a palabra foi OLA. 194 00:12:02,160 --> 00:12:04,820 Aqueles de vós con experiencia previa en programación pode saber en Java 195 00:12:04,820 --> 00:12:09,880 pode só chamar. lonxitude e noutras linguas pode chamar lonxitude ou similar. 196 00:12:09,880 --> 00:12:14,060 Isto porque unha morea de linguas, especialmente cousas chamadas linguaxes orientadas a obxecto, 197 00:12:14,060 --> 00:12:18,580 a lonxitude de algo é unha especie de encapsulado dentro dun anaco de datos en si, 198 00:12:18,580 --> 00:12:24,000 moi coma nós IDs encapsulados e nomes e casas dentro dun estudante luns. 199 00:12:24,000 --> 00:12:28,700 Pero C é o nivel máis baixo. Non hai obxectos ou clases, se vostede xa escoitou estes termos antes. 200 00:12:28,700 --> 00:12:31,490 Todo o que tes é realmente enderezos de memoria. 201 00:12:31,490 --> 00:12:35,540 Polo tanto, esta é unha especie de maneira antiga de representar estruturas interesantes datos. 202 00:12:35,540 --> 00:12:38,760 Ten un valor inicial como o enderezo do primeiro carácter 203 00:12:38,760 --> 00:12:42,340 e despois é só convención algúns arbitraria que todos están de acordo en seguir. 204 00:12:42,340 --> 00:12:46,420 Entón, como é aplicada lonxitude da corda, que propoñemos? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, que algúns de vós xa usado algunhas veces. É moi sinxelo, non? 206 00:12:51,360 --> 00:12:53,060 É coma se dúas liñas de código. 207 00:12:53,060 --> 00:12:56,140 É practicamente un lazo para dalgunha sorte, quizais cunha variable adicional local. 208 00:12:56,140 --> 00:13:00,540 Pero strlen só ten que tomar un punteiro e, a continuación, comezar a ollar para \ 0. 209 00:13:00,540 --> 00:13:05,190 >> E así que atopar, pode voltar o número total de pasos que é tomado en que secuencia. 210 00:13:05,190 --> 00:13:07,150 Así, podemos deducir o que pasa ao carón. 211 00:13:07,150 --> 00:13:11,850 Supoña entón eu declaro t como eu fixen na liña 10. 212 00:13:11,850 --> 00:13:14,280 Trátase de un valor de lixo. Quen sabe o inicio? 213 00:13:14,280 --> 00:13:18,490 Pero no lado dereito da liña de 10 que eu estou chamando GetString novo. 214 00:13:18,490 --> 00:13:20,050 Quen sabe onde iso acaba? 215 00:13:20,050 --> 00:13:23,830 Imos arbitrariamente dicir que o sistema operativo atopou espazo para el camiño ata aquí. 216 00:13:23,830 --> 00:13:28,610 Acontece que eu casualmente tipo H-E-L-L-O de novo, 217 00:13:28,610 --> 00:13:31,260 e así podemos chamar o mesmo tipo de imaxe. 218 00:13:31,260 --> 00:13:34,290 Pero o feito de que eu teño esta foto redeseñado é deliberada 219 00:13:34,290 --> 00:13:37,720 porque esa é unha. OLA diferente do que esta 220 00:13:37,720 --> 00:13:43,920 Polo tanto, aquí este pode ser local 456, este é 457, e así por diante. 221 00:13:43,920 --> 00:13:47,170 Entón, o que é colocado onde o punto de interrogación era unha vez? 222 00:13:47,170 --> 00:13:50,190 Neste caso 456. 223 00:13:50,190 --> 00:13:53,540 Estamos collendo estes números arbitrariamente porque realmente despois de hoxe 224 00:13:53,540 --> 00:13:57,110 nós non imos importar tanto co que o enderezo de calquera cousa é. 225 00:13:57,110 --> 00:14:02,690 Todo o que importa é que podemos atopar o enderezo de calquera peza de datos como OLA. 226 00:14:02,690 --> 00:14:07,100 >> Entón, realmente o que a maioría da xente en ciencia da computación cando se fala de enderezos de memoria 227 00:14:07,100 --> 00:14:10,210 e falando sobre punteiros en concreto, 228 00:14:10,210 --> 00:14:14,220 en vez de se preocupar descubrir 123 - quen se importa onde este material realmente é, 229 00:14:14,220 --> 00:14:17,440 só sabemos que está en algún enderezo numérico - 230 00:14:17,440 --> 00:14:22,180 que simplifican o mundo e só dicir que s está vinculado a que o personaxe 231 00:14:22,180 --> 00:14:25,080 e t está a apuntar cara ese personaxe. 232 00:14:25,080 --> 00:14:27,430 E o feito de que é unha frecha é moi intencionada 233 00:14:27,430 --> 00:14:31,610 porque agora literalmente s está a apuntar cara H e T está apuntando para o outro H 234 00:14:31,610 --> 00:14:34,720 porque ao final do día, que non importa cal é a dirección é, 235 00:14:34,720 --> 00:14:40,240 pero non importa de que temos a capacidade de expresar ese enderezo con algún anaco de código. 236 00:14:40,240 --> 00:14:42,730 Nós realmente non temos manipulado estes enderezos só aínda 237 00:14:42,730 --> 00:14:47,770 entón imos ver onde podemos interpoñer e clasificar de facer as cousas con punteiros, 238 00:14:47,770 --> 00:14:52,030 pero por agora na liña 12, literalmente, os valores que estamos comparando 239 00:14:52,030 --> 00:14:55,500 de acordo con esa historia na liña 12? 240 00:14:56,570 --> 00:15:01,290 Estamos dicindo é 123 igual igual a 456? E iso non é sempre o caso. 241 00:15:01,290 --> 00:15:05,320 E mesmo conceptualmente, ese punteiro definitivamente non é o mesmo que este 242 00:15:05,320 --> 00:15:09,500 porque chamou GetString dúas veces, e GetString non intenta ser super intelixente, 243 00:15:09,500 --> 00:15:12,470 non tente entender, oh, escribiu OLA cinco minutos; 244 00:15:12,470 --> 00:15:15,090 deixe-me dar-lle o mesmo punteiro como lles dei antes, 245 00:15:15,090 --> 00:15:18,450 el só aloca un novo bloque de memoria cada vez que chamalo. 246 00:15:18,450 --> 00:15:20,350 >> Entón, como imos resolver este problema? 247 00:15:20,350 --> 00:15:24,270 Se nivel máis alto Eu quero comparar as cordas Ola e OLA - 248 00:15:24,270 --> 00:15:28,680 Eu non me importa os punteiros - como fago para responder a pregunta, 249 00:15:28,680 --> 00:15:31,980 se o usuario escribe o mesmo? O que fai falta aquí? Si 250 00:15:31,980 --> 00:15:35,200 [Estudante] Usar a función. >> Eu podo usar unha función fóra da caixa. 251 00:15:35,200 --> 00:15:38,170 Podo usar unha función chamada strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 só a versión abreviada de dicir corda comparar. 253 00:15:41,190 --> 00:15:45,070 E se entrar, por exemplo, comparar dous, que está entre folletos de hoxe, 254 00:15:45,070 --> 00:15:46,690 Fago exactamente isto. 255 00:15:46,690 --> 00:15:51,750 Eu mantiven todo o mesmo a partir dunha liña para abaixo, para 26 ou máis, 256 00:15:51,750 --> 00:15:54,360 e agora entender esta parte cambiou un pouco. 257 00:15:54,360 --> 00:15:57,690 Imos ignorar a liña 28 por un momento e concentrarse só en un regalo. 258 00:15:57,690 --> 00:16:00,410 O que nós dicimos luns que str comparación fai? 259 00:16:00,410 --> 00:16:05,200 El trata sobre o proceso de tomar dous punteiros, S e T, neste caso, 260 00:16:05,200 --> 00:16:08,480 especie de practicamente poñendo o dedo sobre estas dúas cartas, 261 00:16:08,480 --> 00:16:11,530 eo que debe facer é algo así como un loop while ou un loop for, 262 00:16:11,530 --> 00:16:16,050 e el di que son estes os mesmos? Se é así, move os dedos ou punteiros para adiante. 263 00:16:16,050 --> 00:16:17,970 Son estes os mesmos, estes mesmos o, estes, o mesmo 264 00:16:17,970 --> 00:16:22,710 estes mesmos o, eses mesmos a? E Ooh, eu estou no final da cadea, tanto s e t. 265 00:16:22,710 --> 00:16:26,780 Non se atoparon calquera contradicións. Si, esas secuencias son as mesmas. 266 00:16:26,780 --> 00:16:31,940 E o que str retorno comparar dúas cordas son os mesmos, aparentemente? Cero. 267 00:16:31,940 --> 00:16:35,900 Entón, 0 é bo neste caso, porque se volve -1 ou +1, 268 00:16:35,900 --> 00:16:40,560 Isto significa que só acontece de vir antes de t en orde alfabética ou despois de t. 269 00:16:40,560 --> 00:16:43,760 E por que iso sería útil ter unha función que lle di que a corda chega antes 270 00:16:43,760 --> 00:16:46,720 ou despois dun dicionario? 271 00:16:46,720 --> 00:16:48,740 [Alumno] Buscando. >> Investigación e clasificación. 272 00:16:48,740 --> 00:16:51,730 >> Así, pode facer cousas como busca binaria ou especie de burbulla ou merge sort 273 00:16:51,730 --> 00:16:53,230 onde ten que comparar as cousas. 274 00:16:53,230 --> 00:16:56,420 Ata agora, nós medio que cortar algúns recunchos e só falou sobre a clasificación 275 00:16:56,420 --> 00:16:59,430 no contexto de números, porque é agradable e doado de falar, 276 00:16:59,430 --> 00:17:02,430 pero certamente pode comparar cadeas, mazá e plátano, 277 00:17:02,430 --> 00:17:05,349 porque se mazá é coñecido por vir antes da banana, do mesmo xeito, 278 00:17:05,349 --> 00:17:09,319 pode mover cordas en torno á memoria como Rob fixo merge sort no vídeo 279 00:17:09,319 --> 00:17:15,880 e nós fixemos aquí no escenario cunha especie de selección, tipo de inserción, e especie de burbulla. 280 00:17:15,880 --> 00:17:18,710 Entón, onde máis podemos facer iso? Imos tentar iso. 281 00:17:18,710 --> 00:17:23,980 Imos esquecer que tipo de lección para un momento e ténteo agora e copiar 1.c para facer o seguinte. 282 00:17:23,980 --> 00:17:26,800 Na liña 21 eu estou dicindo algo de impresión, 283 00:17:26,800 --> 00:17:28,520 entón eu estou recibindo unha cadea de usuario, 284 00:17:28,520 --> 00:17:30,690 entón eu estou comprobando isto. 285 00:17:30,690 --> 00:17:33,620 Nós realmente non temos chegado a este hábito aínda, pero imos facelo agora. 286 00:17:33,620 --> 00:17:40,990 Imos realmente descascada esa capa. Isto é realmente char *. Este cara é moi char *. 287 00:17:40,990 --> 00:17:45,690 Entón, o que significa estar comprobando se s == null? 288 00:17:45,690 --> 00:17:48,380 Acontece que cando chamar a unha función como GetString 289 00:17:48,380 --> 00:17:51,540 ou, máis xeralmente basta preguntar a un ordenador para lle dar un pouco de memoria, 290 00:17:51,540 --> 00:17:53,030 algo podería dar mal. 291 00:17:53,030 --> 00:17:56,630 Vostede podería estar tolo e pedir ao ordenador para un terabytes de memoria 292 00:17:56,630 --> 00:18:01,780 pedindo billóns de bytes de memoria que simplemente non existen no ordenador, 293 00:18:01,780 --> 00:18:05,130 pero funcións GetString e outros precisan de algunha forma de berrar con vostede 294 00:18:05,130 --> 00:18:06,820 se pediu moito. 295 00:18:06,820 --> 00:18:10,450 E o xeito GetString fai iso é, se pediu máis memoria 296 00:18:10,450 --> 00:18:14,250 que está dispoñible no seu ordenador, mesmo se iso é super, super baixa probabilidade 297 00:18:14,250 --> 00:18:17,730 porque ningún de nós está indo para escribir un billón de caracteres e preme a tecla Intro, 298 00:18:17,730 --> 00:18:21,980 pero baixa probabilidade que poida ser, eu aínda quero para comprobar iso só no caso, 299 00:18:21,980 --> 00:18:26,120 eo valor especial que retorna GetString, resposta, e outras funcións 300 00:18:26,120 --> 00:18:30,630 algo deu mal é NULL en todas as tapas. 301 00:18:30,630 --> 00:18:36,520 >> E o que é NULL? NULL só acontece a representar un punteiro. É 0 enderezo de memoria. 302 00:18:36,520 --> 00:18:40,800 O mundo decidiu que arbitrariamente, esta é a memoria do meu ordenador - vostede sabe o que? - 303 00:18:40,800 --> 00:18:46,260 imos roubar só 1 byte de memoria cada ordenador, e esta é a posición 0. 304 00:18:46,260 --> 00:18:49,560 Nós imos darlle un apelido de NULL, e imos prometer 305 00:18:49,560 --> 00:18:52,660 que nunca imos realmente poñer datos reais alí 306 00:18:52,660 --> 00:18:56,770 porque só arbitrariamente precisa dun valor especial, 0, NULL aka, 307 00:18:56,770 --> 00:19:00,230 para que poidamos berrar cos usuarios, se algo sae mal. 308 00:19:00,230 --> 00:19:03,590 Se non, pode non saber é que 0 significa poñer algo aquí 309 00:19:03,590 --> 00:19:05,490 ou significa algo deu mal? 310 00:19:05,490 --> 00:19:09,190 Temos que aceptar que non significa nada NULL foi devolto, 311 00:19:09,190 --> 00:19:11,700 ningún enderezo real foi devolto. 312 00:19:11,700 --> 00:19:15,210 Agora, aquí estou só adoptar meu convenio humana de volten unha da principal 313 00:19:15,210 --> 00:19:17,040 se algo sae mal. 314 00:19:17,040 --> 00:19:20,650 Isto porque principal convención de retorno e voltar 0 se ben, 315 00:19:20,650 --> 00:19:22,990 Un ou outro valor mal. 316 00:19:22,990 --> 00:19:28,200 Pero GetString e calquera función que se ocupa en memoria retorna NULL se algo vai mal. 317 00:19:28,200 --> 00:19:33,480 >> Okay. Entón, por desgraza, liña 27, super sinxelo que sexa, completamente fallo ao copiar a cadea. 318 00:19:33,480 --> 00:19:35,740 Por que? Podemos ver isto como segue. 319 00:19:35,740 --> 00:19:40,120 Eu estou afirmando na liña 27 para facer unha copia de s e chamándoo de t. 320 00:19:40,120 --> 00:19:45,790 Entón eu non estou pedindo ao usuario para 2 cordas esta vez, estou só dicindo o valor en s 321 00:19:45,790 --> 00:19:47,870 deben ser colocados en t tamén. 322 00:19:47,870 --> 00:19:52,890 Entón agora só para demostrar como este é roto, na liña 29 en diante o que eu estou facendo? 323 00:19:52,890 --> 00:19:56,980 Primeiro estou comprobando se a lonxitude da t é maior que 0. 324 00:19:56,980 --> 00:19:59,330 Hai algunha corda alí. O usuario escribiu algo dentro 325 00:19:59,330 --> 00:20:03,410 Cal é a liña 32, facendo aparentemente? 326 00:20:03,410 --> 00:20:08,910 [Resposta do alumno inaudível] Dereito. >> Podes tipo de inferir-lo de que eu dixen que está facendo. 327 00:20:08,910 --> 00:20:13,200 Pero, tecnicamente, o que se está facendo? t [0] representa o que? 328 00:20:13,200 --> 00:20:15,140 [Alumno] O personaxe 0. >> [Malan] O personaxe 0. 329 00:20:15,140 --> 00:20:19,620 Ou, máis semellante á humana, o primeiro carácter en t, o que quere que sexa, H quizais neste caso. 330 00:20:19,620 --> 00:20:24,990 E toupper fai o que di. El conta o carácter de t 0 e cambia-la. 331 00:20:24,990 --> 00:20:28,430 Entón iso significa tomar o carácter de t 0, facelo maiúsculas, 332 00:20:28,430 --> 00:20:30,320 e poñelas de volta no mesmo lugar. 333 00:20:30,320 --> 00:20:35,540 Entón, se eu escribir Ola en letras minúsculas, que debe cambiar a h minúsculas para un H. de capital 334 00:20:35,540 --> 00:20:41,400 Pero o problema é que, en liñas 35 e 36 o que eu estou a piques de facer é imprimir para nós s e t. 335 00:20:41,400 --> 00:20:43,120 E cal é o seu palpite? 336 00:20:43,120 --> 00:20:47,250 O que eu estou indo realmente para ver se eu escriba Ola en todas as minúsculas? 337 00:20:47,250 --> 00:20:52,280 O que se ve impreso? >> [Resposta do alumno inaudível] >> ¿Que é iso? 338 00:20:52,280 --> 00:20:58,360 [Alumno] Big H eo resto pequeno. H >> O grande e pequena para o resto, que, s ou t? 339 00:20:58,360 --> 00:21:03,170 [Alumno] Ambos. Tanto >>. Exactamente. Entón, imos ver o que está a suceder aquí. 340 00:21:03,170 --> 00:21:08,380 >> Deixe-me ir adiante e compilar este. Este é copy1, para facer copy1. Todo ben. 341 00:21:08,380 --> 00:21:14,840 Zoom dentro Deixe-me ir adiante e executar copy1, Intro, dicir algo: Ola en minúsculas. 342 00:21:14,840 --> 00:21:19,570 El capitalizar a copia, pero, ao parecer, capitalizados o orixinal, así como, 343 00:21:19,570 --> 00:21:22,070 porque o que agora ocorre nesta historia? 344 00:21:22,070 --> 00:21:27,030 Na liña 27 eu realmente non parecen estar a copiar a cadea, 345 00:21:27,030 --> 00:21:30,450 pero que pode ter a esperanza de que intuitivamente ser o caso, 346 00:21:30,450 --> 00:21:33,680 Se pensar sobre ese cadro, o que realmente eu fixen? 347 00:21:33,680 --> 00:21:35,410 Metade do cadro é o mesmo. 348 00:21:35,410 --> 00:21:39,390 Entón, imos voltar a tempo para que t aínda non existe na historia. 349 00:21:39,390 --> 00:21:43,160 S pode existir na historia, pero imos minúsculas Ola neste momento. 350 00:21:43,160 --> 00:21:46,710 Entón deixe-me corrixir o que realmente ingresaran dentro 351 00:21:46,710 --> 00:21:51,280 Neste caso, temos aquí H-e-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Imos deseña-lo como unha secuencia de caracteres, poñer as miñas liñas separadoras aquí e meu \ 0. 353 00:21:58,050 --> 00:22:05,980 Polo tanto, este é o lugar onde estamos, así como a liña de 1 a 24-ish, máis ou menos, ter executado. 354 00:22:05,980 --> 00:22:07,800 Esta é a imaxe da miña memoria. 355 00:22:07,800 --> 00:22:10,800 Cando chegar á liña 27, que pasa? 356 00:22:10,800 --> 00:22:14,730 Así como antes, eu recibín un punteiro, que eu vou deseñar como esta praza. 357 00:22:14,730 --> 00:22:19,740 É chamado de t. E o que é o seu valor por defecto? Quen sabe? Un valor lixo. 358 00:22:19,740 --> 00:22:22,060 >> Entón eu vou abstracta que fóra como un punto de interrogação. 359 00:22:22,060 --> 00:22:27,670 E logo que o lado dereito da liña 27 executa, o que estou poñendo dentro de t? 360 00:22:27,670 --> 00:22:30,770 A mesma cousa que está en s. 361 00:22:30,770 --> 00:22:34,120 Entón, se por un momento eliminar esa abstracción da frecha e dicimos: 362 00:22:34,120 --> 00:22:40,330 oh, este é o enderezo de memoria de carga 123, cando di que queda t s, punto e coma, 363 00:22:40,330 --> 00:22:42,700 está literalmente poñendo 123 aquí. 364 00:22:42,700 --> 00:22:45,200 Agora, se nós tipo de simplificar o noso mundo novo con fotos, 365 00:22:45,200 --> 00:22:48,750 o que realmente está feito só engadiu outra frecha para o mundo 366 00:22:48,750 --> 00:22:52,910 que está apuntando t para a mesma secuencia exacta. 367 00:22:52,910 --> 00:22:59,730 Así, cando na liña 31 e 32 realmente ir sobre o cambio de t [0] 368 00:22:59,730 --> 00:23:05,580 o que é t [0] parecer sinónimo de agora? s [0] 369 00:23:05,580 --> 00:23:07,030 Entón, iso é todo o que está a suceder. 370 00:23:07,030 --> 00:23:09,900 E aínda que este tipo de sente un nivel un pouco baixo e arcano 371 00:23:09,900 --> 00:23:12,760 e este tipo de sensación, talvez intuitivamente este debería ter só traballado - 372 00:23:12,760 --> 00:23:15,410 Fixen copias de cousas antes e só traballou - 373 00:23:15,410 --> 00:23:18,590 se realmente pensar sobre o que realmente é unha cadea, é un char *. 374 00:23:18,590 --> 00:23:21,700 Ben, o que é iso? É o enderezo de algún personaxe. 375 00:23:21,700 --> 00:23:24,930 Entón, talvez, fai máis sentido que, cando intenta facer algo 376 00:23:24,930 --> 00:23:29,220 Super aparentemente simple como este, todo o que está facendo é copiar o enderezo dunha memoria. 377 00:23:29,220 --> 00:23:32,530 Vostede non está realmente facendo algo coa secuencia en si. 378 00:23:32,530 --> 00:23:37,500 Así, mesmo se non ten idea de como podería solucionar este problema no código, 379 00:23:37,500 --> 00:23:45,080 alto nivel, conceptualmente, o que necesitamos facer para facer ta copia fiel da s, aparentemente? 380 00:23:46,670 --> 00:23:48,820 Si >> [Alumno] Dele un novo local? >> Exactamente. 381 00:23:48,820 --> 00:23:50,800 >> Necesitamos dar t un lugar novo. 382 00:23:50,800 --> 00:23:55,230 Necesitamos algunha maneira crear un mundo no que temos un novo bloque de memoria, 383 00:23:55,230 --> 00:24:00,090 que só por unha cuestión de claridade eu vou deseñar debaixo un agasallo, pero non precisa estar alí. 384 00:24:00,090 --> 00:24:04,880 Pero ten que ser do mesmo tamaño, entón eu vou sacar esas liñas verticais no mesmo lugar. 385 00:24:04,880 --> 00:24:09,720 É bo se todo isto é lixo inicialmente. Quen sabe o que estaba alí? 386 00:24:09,720 --> 00:24:13,850 Pero, mentres un vai ter que ser darme tanta memoria que eu teño 387 00:24:13,850 --> 00:24:18,630 para atender a unha copia do Hola, a continuación, descubrir como copiar o h aquí, o e aquí, 388 00:24:18,630 --> 00:24:20,390 o l, aquí e así por diante. 389 00:24:20,390 --> 00:24:24,880 Pero iso xa debería sentirse un pouco evidente, aínda que algúns dos detalles aínda son abstractos. 390 00:24:24,880 --> 00:24:28,690 Para copiar esa cadea para iso, é só un loop ou un loop while 391 00:24:28,690 --> 00:24:31,580 ou algo que se tornou aínda máis familiar. 392 00:24:31,580 --> 00:24:35,970 Entón, imos tentar iso. Deixe-me ir copy2.c. 393 00:24:35,970 --> 00:24:43,270 En copy2.c temos case o mesmo programa, excepto para a liña 27. 394 00:24:43,270 --> 00:24:47,260 Parece un pouco complexo, pero se decompô-lo peza por peza, 395 00:24:47,260 --> 00:24:48,950 á esquerda é o mesmo. 396 00:24:48,950 --> 00:24:52,790 Char * t crea esa cousa na memoria, aínda que con un punto de interrogação 397 00:24:52,790 --> 00:24:54,680 porque non temos idea do que está alí por defecto. 398 00:24:54,680 --> 00:24:57,920 No lado dereito, estamos agora a introducir unha nova función malloc, 399 00:24:57,920 --> 00:25:00,640 para reservar a memoria, dáme a memoria, 400 00:25:00,640 --> 00:25:06,900 e ao parecer leva cantos argumentos, cantas cousas dentro parénteses? 401 00:25:09,660 --> 00:25:12,130 Eu oín murmurios de 1 e 2, pero é só unha. 402 00:25:12,130 --> 00:25:15,320 Non hai coma, o que significa que hai só unha cousa un dentro dos parénteses. 403 00:25:15,320 --> 00:25:17,720 Aínda que non haxa parénteses outros, deixe-me salientar 404 00:25:17,720 --> 00:25:21,460 o que está dentro dos parénteses ultraperiféricas, e é esta expresión: 405 00:25:21,460 --> 00:25:25,880 (Strlen (s) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Entón, se nós realmente pensar niso, este está dicindo me dar a lonxitude de s. 407 00:25:29,190 --> 00:25:34,440 Por que eu son, porén, engadindo 1 para a lonxitude? >> [Resposta do alumno inaudível] 408 00:25:34,440 --> 00:25:40,200 Exactamente. Necesitamos espazo para este cara na cola, o sexto carácter que non ten sentido Inglés 409 00:25:40,200 --> 00:25:42,250 pero ten significado programático especial. 410 00:25:42,250 --> 00:25:46,800 >> Entón necesitamos un + 1 para que, porque strlen retorna a esperanza humana de lonxitude, 411 00:25:46,800 --> 00:25:50,890 Ola ou 5, non lle dá o carácter nulo adicional. 412 00:25:50,890 --> 00:25:52,980 Entón eu engadir manualmente isto con + 1. 413 00:25:52,980 --> 00:25:56,060 E despois diso, tamaño * de (char), non vimos isto antes. 414 00:25:56,060 --> 00:25:57,480 Este non é, tecnicamente, unha función. 415 00:25:57,480 --> 00:26:04,150 É unha palabra clave especial que só di que o tamaño é de calquera tipo de datos nun ordenador 416 00:26:04,150 --> 00:26:06,980 porque, en realidade, algúns de nós temos ordenadores de 32 bits. 417 00:26:06,980 --> 00:26:10,900 Eu teño un ordenador moi vello na casa, e só usa 32 bits para representar punteiros. 418 00:26:10,900 --> 00:26:13,900 E así, se eu fixen tamaño dun tipo de datos, pode ser de 32 bits. 419 00:26:13,900 --> 00:26:18,300 Pero se eu estou usando o meu novo ordenador fantasía, eu poida volver un valor de 64 bits 420 00:26:18,300 --> 00:26:20,510 para algo así como un enderezo. 421 00:26:20,510 --> 00:26:25,400 Polo tanto, neste caso, só para ser seguro super, non imos a algo ríxido código como - 422 00:26:25,400 --> 00:26:28,740 ben, o que é do tamaño dun char de acordo co que dixemos ata agora? 423 00:26:28,740 --> 00:26:34,450 Nós practicamente dixo verbalmente que é un byte, e iso é moi fermoso realidade a través da tarxeta. 424 00:26:34,450 --> 00:26:37,000 Pero, de novo, os presupostos tenden a ser malo. 425 00:26:37,000 --> 00:26:40,850 Eles levan a software buggy as persoas usan o seu programa de forma que non tivo a intención. 426 00:26:40,850 --> 00:26:44,750 Entón imos abstracto esta distancia é só xenericamente dicir 427 00:26:44,750 --> 00:26:46,830 Eu teño diso moitos anacos de memoria 428 00:26:46,830 --> 00:26:50,210 e cada bloque de memoria debe ser equivalente ao tamaño dun personaxe, 429 00:26:50,210 --> 00:26:54,870 que é de feito igual a 1 neste caso, pero é unha forma máis xenérica de escribilo. 430 00:26:54,870 --> 00:27:00,460 Entón, se a palabra é Ola, cantos bytes se malloc aparentemente reservar para Ola? 431 00:27:00,460 --> 00:27:04,980 [Alumno] Six. >> Six. Exactamente como moitos como temos puntos de interrogación na pantalla. 432 00:27:04,980 --> 00:27:07,800 E despois dar un palpite agora baseada na súa comprensión de GetString 433 00:27:07,800 --> 00:27:12,790 o que malloc probablemente volver? >> [Alumno] Un enderezo. 434 00:27:12,790 --> 00:27:17,020 Un enderezo de que? Do primeiro anaco de memoria. 435 00:27:17,020 --> 00:27:20,670 >> Nós non temos idea do que está aí porque algunha outra función 436 00:27:20,670 --> 00:27:23,010 podería ser mediante a memoria anteriormente. 437 00:27:23,010 --> 00:27:28,380 Pero malloc, como GetString, retorna o enderezo do primeiro byte de memoria 438 00:27:28,380 --> 00:27:30,540 que ten reservado para ti. 439 00:27:30,540 --> 00:27:38,380 Con todo, o que non fai é encher este baleiro cun carácter nulo barra invertida 440 00:27:38,380 --> 00:27:43,030 pois verifícase que pode usar malloc para reservar calquera cousa: ints, cadeas, arrays, 441 00:27:43,030 --> 00:27:45,700 coches alegóricos, estruturas estudantís. 442 00:27:45,700 --> 00:27:47,750 Podes empregar malloc completamente xenericamente. 443 00:27:47,750 --> 00:27:51,470 Non importa ou ten que saber o que está alocando memoria para. 444 00:27:51,470 --> 00:27:55,810 Polo tanto, sería presunçoso para malloc para colocar un \ 0 445 00:27:55,810 --> 00:27:58,340 ao final de cada peza de memoria que está dando a vostede 446 00:27:58,340 --> 00:28:02,620 porque esta \ 0 cousa é só unha convención para cordas. 447 00:28:02,620 --> 00:28:06,310 Ela non se usa para ints, ela non é usada para coches alegóricos, ela non é usada para os alumnos. 448 00:28:06,310 --> 00:28:11,730 E así a pegadinha co malloc é que a carga é enteiramente de ti o programador 449 00:28:11,730 --> 00:28:16,790 lembrar cantos bytes lle asignado e non para nunca usar un lazo 450 00:28:16,790 --> 00:28:21,570 ou un loop while e ir alén do límite do bloque de memoria que ten dado. 451 00:28:21,570 --> 00:28:23,540 Dito doutra forma, tan pronto se reservar memoria 452 00:28:23,540 --> 00:28:28,510 non pode pedir o sistema operativo, oh, a propósito, o tamaño dun bloque de memoria foi iso? 453 00:28:28,510 --> 00:28:32,080 É enteiramente ata lembrar se precisa ese valor. 454 00:28:32,080 --> 00:28:34,330 >> Entón, imos ver como eu continuar a utilizar esta memoria. 455 00:28:34,330 --> 00:28:38,430 Na liña 28 e 29, por que estou facendo isto? 456 00:28:39,850 --> 00:28:42,260 Basta comprobar a sanidade total. 457 00:28:42,260 --> 00:28:45,110 Só no caso de algo sae mal, eu pedir algunha cantidade tola de memoria 458 00:28:45,110 --> 00:28:48,690 ou eu teño tantas cousas en execución no ordenador que simplemente non hai memoria suficiente, 459 00:28:48,690 --> 00:28:51,780 algo así, eu polo menos quero para comprobar nulo. 460 00:28:51,780 --> 00:28:55,260 En realidade, a maioría dos ordenadores vai dar a ilusión de que todos os programas 461 00:28:55,260 --> 00:28:57,080 pode utilizar a totalidade da súa memoria RAM, 462 00:28:57,080 --> 00:29:00,740 pero, aínda así, se o usuario escribe algunha corda tolo longa quizais porque é un cara malo 463 00:29:00,740 --> 00:29:03,440 e eles están realmente intentando frear o seu programa ou hack para el, 464 00:29:03,440 --> 00:29:07,300 quere, polo menos, verificar o valor de retorno de malloc e iguala nulo. 465 00:29:07,300 --> 00:29:11,630 E se isto acontecer, imos deixar agora porque eu non sei o que facer nese caso. 466 00:29:11,630 --> 00:29:13,950 ¿Como copiar a cadea? Hai algunhas formas de facelo. 467 00:29:13,950 --> 00:29:18,850 Hai str copiar funcións en C, pero é super sinxelo para nós para facelo do xeito old-Fashioned. 468 00:29:18,850 --> 00:29:23,110 >> Primeiro déixeme descubrir o que a lonxitude de s. 469 00:29:23,110 --> 00:29:26,930 Eu podería ter colocado iso no loop, pero en vez diso, simplemente poñelas aquí para maior claridade. 470 00:29:26,930 --> 00:29:30,610 Entón n agora almacena a lonxitude da cadea orixinal, o que aparentemente é 5. 471 00:29:30,610 --> 00:29:35,290 Entón, no meu lazo para Estou interactuar 0 ata n, 472 00:29:35,290 --> 00:29:40,940 e en cada iteração eu estou poñendo s [i] dentro de t [i]. 473 00:29:40,940 --> 00:29:45,060 Entón é iso que eu implicaba cos meus dous dedos apuntando cara as cordas antes. 474 00:29:45,060 --> 00:29:49,260 Como este lazo for así, eu vou estar copiando h en aquí, 475 00:29:49,260 --> 00:29:52,890 e aquí, eu para aquí porque este é s, este é t. 476 00:29:52,890 --> 00:29:58,770 E entón, finalmente, na liña 35, por que estou facendo isto? 477 00:29:58,770 --> 00:30:03,770 Eu teño que seguro que eu estou rematando o t string. 478 00:30:03,770 --> 00:30:06,170 E eu fixen iso desa maneira de ser super explícito. 479 00:30:06,170 --> 00:30:09,510 Pero propoñer, alguén, se puidese, unha forma diferente de facelo. 480 00:30:09,510 --> 00:30:13,930 Eu realmente non precisa de liña 35. Hai outra forma de facelo. 481 00:30:13,930 --> 00:30:18,880 Si >> [Resposta do alumno inaudível] >> Diga máis alto. 482 00:30:18,880 --> 00:30:20,960 [Estudante] Menos do que ou igual a. >> Exactamente. 483 00:30:20,960 --> 00:30:24,450 Poderiamos só dicir menos que ou igual a n, o que en xeral ten sido mal 484 00:30:24,450 --> 00:30:28,190 porque case sempre cando imos a un igual á cousa estamos contando 485 00:30:28,190 --> 00:30:30,000 imos un paso lonxe de máis. 486 00:30:30,000 --> 00:30:32,170 Pero lembre, cantos bytes que reservar? 487 00:30:32,170 --> 00:30:37,210 Alocamos strlen de s, para 5 + 1, para un total de 6. 488 00:30:37,210 --> 00:30:39,980 Polo tanto, neste caso, poderiamos facer algo así 489 00:30:39,980 --> 00:30:46,450 de xeito que estamos copiando non só o Ola pero tamén a 0 \ ao final. 490 00:30:46,450 --> 00:30:49,860 Alternativamente, poderiamos usar unha función chamada str copia, strcpy, 491 00:30:49,860 --> 00:30:51,700 pero iso non sería divertido case tanto como. 492 00:30:51,700 --> 00:30:54,000 Pero iso é todo o que fai debaixo do capó. 493 00:30:54,000 --> 00:30:56,050 Entón, por fin, facemos o mesmo que antes. 494 00:30:56,050 --> 00:31:01,620 Eu t capitalizar e eu afirmo que o orixinal é así ea copia parece así. 495 00:31:01,620 --> 00:31:08,570 Entón, imos tentar iso agora. Deixe-me ir aquí. Fai copy2. Nós imos ampliar e realizar copy2. 496 00:31:08,570 --> 00:31:13,840 Eu estou indo a escribir Ola en letras minúsculas, e de feito eu fico minúsculas Ola como o orixinal 497 00:31:13,840 --> 00:31:16,930 pero o capital Ola a copia. 498 00:31:16,930 --> 00:31:20,300 Pero eu non estou preparado aínda. Eu teño que facer unha última cousa aquí. 499 00:31:20,300 --> 00:31:28,000 46 e 47 é claramente liberar memoria, pero o que iso realmente significa? 500 00:31:28,000 --> 00:31:33,250 O que estou facendo, pensas que, chamando liña 46 e liña 47? 501 00:31:33,250 --> 00:31:38,900 Cal é o efecto que isto ten? Si 502 00:31:38,900 --> 00:31:43,140 [Resposta do alumno inaudível] >> Exactamente. 503 00:31:43,140 --> 00:31:46,380 >> Está só dicindo o sistema operativo, hey, grazas por esta lembranza. 504 00:31:46,380 --> 00:31:48,320 Agora podes usalo para outra persoa. 505 00:31:48,320 --> 00:31:50,790 E aquí está un exemplo perfecto de valores de lixo. 506 00:31:50,790 --> 00:31:55,430 Acabo de utilizar esta memoria para escribir a palabra Ola en 2 lugares, 507 00:31:55,430 --> 00:31:57,490 aquí, aquí, aquí e aquí. 508 00:31:57,490 --> 00:32:00,910 Polo tanto, este é H-e-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Pero, entón, eu chamo de liña 46 e liña 47, e vostede sabe o que pasa alí en termos de imaxe? 510 00:32:06,960 --> 00:32:10,010 En realidade, esperar, esta foto é a antiga. 511 00:32:10,010 --> 00:32:12,550 Unha vez que a copia, este cara é realmente apuntando aquí, 512 00:32:12,550 --> 00:32:16,110 entón imos eliminar os números e só abstraerse como as nosas frechas novo. 513 00:32:16,110 --> 00:32:19,370 O que pasa na foto cando eu chamo libre? 514 00:32:19,370 --> 00:32:22,750 [Resposta do alumno inaudível] >> Nin sequera. 515 00:32:22,750 --> 00:32:29,510 Se eu conectar de balde en S e T - un tipo de pregunta capciosa - esta imaxe non cambia en nada 516 00:32:29,510 --> 00:32:33,880 porque chamar s e chamando t só di ao sistema operativo, 517 00:32:33,880 --> 00:32:39,010 hey, pode utilizar esa memoria de novo, pero iso non cambia iso nulo 518 00:32:39,010 --> 00:32:41,840 ou algún carácter especial, non cambiar isto, 519 00:32:41,840 --> 00:32:47,350 iso non cambia o H ou o correo ou o l ou l ou en calquera lugar a calquera outra cousa. 520 00:32:47,350 --> 00:32:51,610 En termos de imaxe, tan pronto lle chame gratis cambios, nada. 521 00:32:51,610 --> 00:32:56,570 E é aí onde reside a orixe de valores de lixo porque se eu, máis tarde, no programa 522 00:32:56,570 --> 00:33:01,010 pedir ao sistema operativo para máis de memoria con GetString ou malloc ou algo parecido 523 00:33:01,010 --> 00:33:04,900 eo sistema operativo, di, por suposto, eu teño 12 bytes de memoria só liberados, 524 00:33:04,900 --> 00:33:08,080 usalos, que é o que vai ser entregado? 525 00:33:08,080 --> 00:33:10,830 Vai ser entregado unha peza de memoria que normalmente deseñar 526 00:33:10,830 --> 00:33:13,700 con puntos de interrogación, pero o que son eses puntos de interrogación? 527 00:33:13,700 --> 00:33:17,000 Eles acontecen ser h-e-l-l-o, h-e-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Estes son os nosos valores de lixo novos para que liberar a memoria. 529 00:33:20,940 --> 00:33:22,750 >> Hai un mundo real implicación aquí tamén. 530 00:33:22,750 --> 00:33:24,720 Isto acontece que ver con memoria RAM, pero os seus ordenadores 531 00:33:24,720 --> 00:33:26,720 realmente facer a mesma cousa co disco. 532 00:33:26,720 --> 00:33:30,620 Nós imos falar sobre iso en particular con un conxunto de problemas futuros que incide sobre forense. 533 00:33:30,620 --> 00:33:36,170 Pero o que realmente acontece se ten algún arquivo confidencial financeira no seu escritorio 534 00:33:36,170 --> 00:33:39,600 ou algún JPEG esbozado e arrastralo ata o seu lixo, 535 00:33:39,600 --> 00:33:44,390 o que ocorre cando arrastralo lo para o lixo ou lixo? 536 00:33:44,390 --> 00:33:47,240 Sabía o que eu estaba falando. [Risas] 537 00:33:47,240 --> 00:33:52,370 O que acontece cando arrastrou que a evidencia na súa lixo ou lata de lixo? 538 00:33:52,370 --> 00:33:55,920 [Resposta do alumno inaudível] 539 00:33:55,920 --> 00:33:58,000 Ben, entón coidado. O que acontece cando fai isto? 540 00:33:58,000 --> 00:34:01,030 A resposta curta é nada, non? 541 00:34:01,030 --> 00:34:04,790 Arquivo multimedia ou sensibles aínda está só sentado nalgún lugar no seu disco duro. 542 00:34:04,790 --> 00:34:07,940 A maioría de nós, polo menos, aprender do xeito máis difícil que precisa baleirar seu lixo 543 00:34:07,940 --> 00:34:10,429 ou a súa lixo para realmente borrar arquivos. 544 00:34:10,429 --> 00:34:13,440 E, de feito, cando prema co botón dereito ou faga clic na súa lata de lixo 545 00:34:13,440 --> 00:34:15,580 Lixo ou escoller Arquivo, baleiro ou o que quere 546 00:34:15,580 --> 00:34:21,420 e realmente baleirar a lata de lixo ou lixo, o que realmente acontece a continuación, para esta imaxe? 547 00:34:22,810 --> 00:34:25,969 Máis nada. Polo tanto, nada realmente acontece no disco. 548 00:34:25,969 --> 00:34:30,880 >> E se nós só temporalmente divagar e escribir - eu só usar a parte de atrás do presente. 549 00:34:30,880 --> 00:34:34,639 Entón, agora a historia está cambiando de RAM, que é onde existen programas 550 00:34:34,639 --> 00:34:39,250 mentres está executando-os para o disco, que é onde se almacenan a longo prazo 551 00:34:39,250 --> 00:34:42,920 mesmo cando o poder sae, polo de agora - e nós imos voltar a iso no futuro - 552 00:34:42,920 --> 00:34:46,380 imos finxir que isto representa o interior do disco duro do seu ordenador 553 00:34:46,380 --> 00:34:50,110 porque para atrás no día adoitaban ser discos circulares, así como disquetes. 554 00:34:50,110 --> 00:34:55,130 Entón, se ten algún arquivo de Excel sensible, pode levar ata este anaco de memoria 555 00:34:55,130 --> 00:34:59,770 no disco do seu ordenador, e eu estou só debuxando 1s e 0s mesmo arbitrario. 556 00:34:59,770 --> 00:35:03,970 Cando arrastra o ficheiro como que a súa lata de lixo ou lixo, 557 00:35:03,970 --> 00:35:07,750 literalmente nada acontece porque a Apple e Microsoft simplemente decidiu 558 00:35:07,750 --> 00:35:10,450 a lata de lixo e lixo é realmente só un espazo reservado temporal. 559 00:35:10,450 --> 00:35:14,710 Quizais, finalmente, o sistema operativo ha baleiralo-la para ti, pero, normalmente, non fai nada, 560 00:35:14,710 --> 00:35:17,090 polo menos ata que estea realmente con pouco espazo. 561 00:35:17,090 --> 00:35:20,870 >> Sen embargo, cando vai para o lixo baleiro ou lixo baleira, 562 00:35:20,870 --> 00:35:23,460 Do mesmo xeito, nada acontece con esta imaxe. 563 00:35:23,460 --> 00:35:28,590 Todo o que acontece está noutro lugar no seu ordenador, hai algún tipo de mesa. 564 00:35:28,590 --> 00:35:35,400 É como unha especie de folla de fraude pouco que di que imos dicir, RESUME.DOC, 565 00:35:35,400 --> 00:35:40,920 para que o seu currículo nun arquivo de Microsoft Word vivía no lugar 123 no seu disco duro, 566 00:35:40,920 --> 00:35:43,710 non na memoria e non na memoria RAM, pero no seu disco duro, 567 00:35:43,710 --> 00:35:49,050 e as súas vidas esbozado JPEG con 456, eo seu arquivo de Excel vive en 789 ou en calquera lugar. 568 00:35:49,050 --> 00:35:53,640 Ao eliminar ficheiros por realmente baleirar o lixo ou lixo, 569 00:35:53,640 --> 00:35:59,530 ese cadro non cambia. Os 0s e 1s no seu disco duro non van a sitio ningún. 570 00:35:59,530 --> 00:36:03,930 Pero este cadro, este banco de datos pouco de sorte, fai a mudanza. 571 00:36:03,930 --> 00:36:08,750 Cando eliminar o seu currículo, é coma se o ficheiro é borrado nalgún sentido, 572 00:36:08,750 --> 00:36:12,790 pero todo o equipo fai é esquecer de onde esa cousa vive no seu disco duro. 573 00:36:12,790 --> 00:36:17,870 Os 0s e 1s que compoñen o seu currículo ou calquera destes outros arquivos aínda están intactos. 574 00:36:17,870 --> 00:36:21,960 >> Entón, se fixo iso accidentalmente, aínda hai unha probabilidade non cero 575 00:36:21,960 --> 00:36:25,800 que pode recuperar os seus datos usando o Norton Utilities ou algún software comercial 576 00:36:25,800 --> 00:36:29,810 cuxo obxectivo de vida é atopar 0s e 1s que tipo de orfas, 577 00:36:29,810 --> 00:36:33,300 esquecido aquí, pero deixaron aquí, de modo que pode obter os seus datos de volta. 578 00:36:33,300 --> 00:36:38,410 Ou investigadores forenses coa policía ou o FBI tería realmente ter un disco duro 579 00:36:38,410 --> 00:36:42,550 e realmente ollar para os patróns de 0s e 1s que mirar como JPEGs, ollar como arquivos de Excel, 580 00:36:42,550 --> 00:36:46,400 e recuperala los desa forma, aínda que o ordenador teña esquecido alí. 581 00:36:46,400 --> 00:36:49,820 Entón o único xeito realmente para eliminar datos, como discutir no futuro, 582 00:36:49,820 --> 00:36:54,190 é esfregar ou limpar o ficheiro ou disco duro - 583 00:36:54,190 --> 00:36:56,540 Realmente non pode se librar do 0s e 1s 584 00:36:56,540 --> 00:36:59,440 porque senón ía comezar con unha unidade de gigabytes 585 00:36:59,440 --> 00:37:02,380 e acabar con unha unidade de megabyte difícil se constantemente borrar, 586 00:37:02,380 --> 00:37:04,380 literalmente, 0s e 1s. 587 00:37:04,380 --> 00:37:06,310 Entón, o que faría se realmente quería para cubrir os seus rastros 588 00:37:06,310 --> 00:37:10,510 e que o problema fundamental é que aínda hai 0s e 1s no disco? 589 00:37:10,510 --> 00:37:14,930 Eu vexo alguén gesticulando que fisicamente romper o dispositivo. Que ha traballar. 590 00:37:14,930 --> 00:37:19,600 [Risas] Pero, se ese é o tipo de unha solución cara, o que sería máis razoable? 591 00:37:19,600 --> 00:37:23,270 Si >> [Alumno] substitúe-los. >> Substitúe-los co que? >> [Estudante] Outros datos. 592 00:37:23,270 --> 00:37:29,070 Outros datos. Pode simplemente substituír o disco con 0s ou 1s ou todos os 0s, todos os 1s. 593 00:37:29,070 --> 00:37:31,230 >> E iso é de feito o que algúns dos programas fai. 594 00:37:31,230 --> 00:37:33,570 Podes mercar o software ou mesmo obter o software libre, 595 00:37:33,570 --> 00:37:36,610 e mesmo construído en Mac OS estes días, menos en Windows, 596 00:37:36,610 --> 00:37:38,660 é a capacidade de borrar con seguridade. 597 00:37:38,660 --> 00:37:41,960 En realidade, se quere todos os home run hoxe, se ten un Mac e facelo, 598 00:37:41,960 --> 00:37:45,740 se ten algo na súa lata de lixo, pode facer Baleirado Seguro do lixo, 599 00:37:45,740 --> 00:37:47,610 que fai exactamente iso. 600 00:37:47,610 --> 00:37:53,350 En vez de borrar arquivos só aquí, iso non elimina o aquí 0s e 1s, 601 00:37:53,350 --> 00:38:01,240 ao contrario, ela só cambia todos eles, por exemplo, para 0s e punto, punto, punto. 602 00:38:01,240 --> 00:38:05,330 Entón, un dos seus futuros serie de exercicios será realmente intencionalmente recuperar datos - 603 00:38:05,330 --> 00:38:08,430 fotografías que sacou de persoas, lugares e cousas no campus 604 00:38:08,430 --> 00:38:12,810 para o cal imos facer unha imaxe forense de unha tarxeta de memoria da cámara dixital, 605 00:38:12,810 --> 00:38:17,120 que é a idea mesma - e vai ter que ser reto a realmente atopar 606 00:38:17,120 --> 00:38:20,160 os patróns que representan JPEGs no seu disco duro, 607 00:38:20,160 --> 00:38:23,610 moi parecido ao ex-alumno, cuxo correo electrónico que lin hai unhas semanas fixo 608 00:38:23,610 --> 00:38:25,860 para recuperar fotos da súa irmá. 609 00:38:25,860 --> 00:38:30,300 Por que non facemos un intervalo de 5 minutos aquí, e nós imos reagrupar con máis memoria. 610 00:38:33,030 --> 00:38:38,610 Entón é aquí que as cousas están un pouco alucinante, pero este é un paso moi poderoso 611 00:38:38,610 --> 00:38:40,480 para a comprensión de todo isto o máis. 612 00:38:40,480 --> 00:38:42,900 Aquí está un programa chamado pointers.c. 613 00:38:42,900 --> 00:38:45,430 É entre código de hoxe mostra. 614 00:38:45,430 --> 00:38:51,280 Teña en conta que en primeiras liñas, 19 a 22, todo o que estamos facendo é algo así como GetString 615 00:38:51,280 --> 00:38:54,460 e retornando un enderezo, almacenando-o s. 616 00:38:54,460 --> 00:38:58,380 De agora en diante para pset mesmo 3 se quere, pero pset 4 e no 617 00:38:58,380 --> 00:39:01,030 onde podes comezar a tomar esas Rodas pequenas mesmo, 618 00:39:01,030 --> 00:39:04,030 non hai razón para finxir que as cordas existe máis. 619 00:39:04,030 --> 00:39:07,030 É certamente bo para só comezar a dicir * char. 620 00:39:07,030 --> 00:39:12,610 >> Como un aparte, en referencias en liña e en libros moitas veces se pode ver a estrela ao lado da variable. 621 00:39:12,610 --> 00:39:15,600 Podes incluso ver os espazos en torno a ambos os dous lados. 622 00:39:15,600 --> 00:39:17,680 Todas estas son funcionalmente correcta. 623 00:39:17,680 --> 00:39:21,180 De momento, porén, imos padronizar esa visión para facer super claro 624 00:39:21,180 --> 00:39:24,000 que char * é como dicir punteiro personaxe. 625 00:39:24,000 --> 00:39:25,680 Isto é o tipo de datos. 626 00:39:25,680 --> 00:39:28,730 E, a continuación, o nome da variable é s no presente caso. 627 00:39:28,730 --> 00:39:31,180 Entón, nós temos tido unha corda e chamamos el s. 628 00:39:31,180 --> 00:39:35,180 E entón aquí notar que eu estou facendo en realidade, un pouco de malandragem. 629 00:39:35,180 --> 00:39:39,080 Iso é chamado de aritmética de punteiro, que é unha especie de super sinxelo. 630 00:39:39,080 --> 00:39:41,790 Significa só sumar e restar números para punteiro. 631 00:39:41,790 --> 00:39:43,660 Pero isto realmente funciona. 632 00:39:43,660 --> 00:39:49,170 Este programa imprime o carácter aparentemente cadea 1 por liña de tal forma que o resultado final - 633 00:39:49,170 --> 00:39:54,920 Só así podemos romper onde iso vai dar, facer punteiros, punteiros correr, deixe-me facer zoom in 634 00:39:54,920 --> 00:39:58,940 Agora déixeme escriba algo como OLA e escriba Intro 635 00:39:58,940 --> 00:40:01,080 e imprime un carácter por liña. 636 00:40:01,080 --> 00:40:04,730 Ata un segundo atrás, tería feito isto coa notación de colchete. 637 00:40:04,730 --> 00:40:09,760 Teriamos un loop e nós fariamos printf de s [i] e nós faría iso de novo e de novo e de novo 638 00:40:09,760 --> 00:40:11,950 coa n invertida ao final de cada liña. 639 00:40:11,950 --> 00:40:16,800 Pero este programa é distinto. Este programa está a usar, literalmente, aritmética. 640 00:40:16,800 --> 00:40:18,860 Entón, o que está a suceder aquí? 641 00:40:18,860 --> 00:40:24,720 Primeiro de todo, antes deste ciclo é executado, o que, só para quedar claro, é realmente s? 642 00:40:24,720 --> 00:40:27,270 S é? >> [Alumno] Un enderezo. >> Este enderezo. 643 00:40:27,270 --> 00:40:32,980 >> E é o enderezo, no caso de Ola, o primeiro carácter en que a palabra, que é h. 644 00:40:32,980 --> 00:40:37,370 Entón s, neste exemplo particular, o seu enderezo de h. 645 00:40:37,370 --> 00:40:41,850 Entón, o que iso significa para facer s + i? 646 00:40:41,850 --> 00:40:46,280 Ben, eu comeza en 0 neste loop. Nós fixemos moitas veces que. 647 00:40:46,280 --> 00:40:49,760 Eu está indo a ir ata a lonxitude da corda, aparentemente. 648 00:40:49,760 --> 00:40:53,950 Así, na primeira iteração do loop, i é, obviamente, 0. 649 00:40:53,950 --> 00:41:01,740 Polo tanto, esta expresión está dicindo s + i - en vez diso, s +0--que é, obviamente, só s. 650 00:41:01,740 --> 00:41:04,320 Entón, o que é * s aquí? 651 00:41:04,320 --> 00:41:08,530 Agora estamos usando a estrela dunha forma lixeiramente diferente. 652 00:41:08,530 --> 00:41:13,080 Deixe-me ir adiante e se librar de t, porque estamos falando de t feito e copias de s. 653 00:41:13,080 --> 00:41:15,540 Agora só quero contar unha historia envolvendo s. 654 00:41:15,540 --> 00:41:20,090 E por iso, neste momento, despois de tipo cadea, o noso mundo parece moi como facía antes 655 00:41:20,090 --> 00:41:26,630 s con só almacenar o enderezo de h e, máis xeralmente apuntando para a cadea Olá 656 00:41:26,630 --> 00:41:33,170 Se eu agora facer unha liña como * (S + i), imos tentar iso. 657 00:41:33,170 --> 00:41:40,140 Entón * (S + i). Deixe-me simplificar isto porque este é 0, que é * (s 0). 658 00:41:40,140 --> 00:41:43,790 Ben, agarde un minuto. Simplificar aínda máis. Este é * (s). 659 00:41:43,790 --> 00:41:47,020 Ben, agora os parénteses son unha especie de idiota, entón agora imos facer * s. 660 00:41:47,020 --> 00:41:50,540 Así, na primeira iteração do loop, que a liña que está en destaque, 26, 661 00:41:50,540 --> 00:41:53,650 é moi fermoso equivalente a imprimir este. 662 00:41:53,650 --> 00:41:56,040 Cal é o tipo de datos * s? 663 00:41:56,040 --> 00:42:00,770 Neste contexto, unha vez que a estrela pasa a ser parte de ti s, 664 00:42:00,770 --> 00:42:04,930 pero, máis especificamente, porque xa non estamos declarando s, 665 00:42:04,930 --> 00:42:09,730 non estamos creando unha variable máis, non hai ningunha mención de char * na liña 26, 666 00:42:09,730 --> 00:42:14,280 non hai ningunha mención da cadea palabra clave, estamos usando só unha variable chamada s, 667 00:42:14,280 --> 00:42:19,650 verifica-se agora a estrela ten un pouco diferente e, reconhecidamente, confundindo significado. 668 00:42:19,650 --> 00:42:26,590 * S, aquí, significa ir ao enderezo en s e imprimir o que está aí. 669 00:42:26,590 --> 00:42:33,750 Entón s aquí, * s - algo así como ramplas e escaleiras, siga a frecha - aquí. 670 00:42:33,750 --> 00:42:35,850 Polo tanto, esta é * s. 671 00:42:35,850 --> 00:42:39,060 >> Entón, o que é impreso na primeira iteração do loop de que na liña 26? 672 00:42:39,060 --> 00:42:42,170 Eu imprimir% c, que é o espazo reservado para un personaxe, 673 00:42:42,170 --> 00:42:48,520 a continuación, un \ n para unha nova liña. * (S + i) onde i é 0 é só iso. 674 00:42:48,520 --> 00:42:53,670 Entón, o que de char que eu poñer en para c%? H. 675 00:42:53,670 --> 00:42:56,900 Na próxima iteração do loop - probablemente pode ver onde iso vai dar - 676 00:42:56,900 --> 00:43:01,350 a próxima iteração i é, obviamente, un, entón iso significa 1, 677 00:43:01,350 --> 00:43:05,580 e entón agora eu teño dos parénteses porque agora a estrela que dicir 678 00:43:05,580 --> 00:43:08,620 ir ao enderezo de memoria de 1. 679 00:43:08,620 --> 00:43:14,170 O que é s? Imos voltar no tempo e dicir esta frecha agora non está realmente facendo-nos os favores. 680 00:43:14,170 --> 00:43:18,450 Imos, máis especificamente, dicir que este é almacenar o número 123 681 00:43:18,450 --> 00:43:25,110 porque o comezo desta cadea Ola, este é o enderezo 123, este é 124, e así por diante. 682 00:43:25,110 --> 00:43:30,550 Entón, na segunda iteração cando estou dicindo 1, que é como dicir que un 123, 683 00:43:30,550 --> 00:43:35,340 tamén coñecido como 124, entón o carácter é impreso na segunda iteração? 684 00:43:35,340 --> 00:43:37,850 E no enderezo de memoria 124. 685 00:43:37,850 --> 00:43:44,440 Entón + novamente, 125, 126, 127, e este lazo sorte deixar antes de chegar aquí 686 00:43:44,440 --> 00:43:49,040 porque eu estou usando strlen para estar seguro de que eu non conta moi alta. 687 00:43:49,040 --> 00:43:50,810 Entón, iso tamén é iso. 688 00:43:50,810 --> 00:43:55,000 De novo, iso é como se tivésemos feito unha semana. 689 00:43:55,000 --> 00:43:59,200 Deixe-me escribir na liña de abaixo aínda que nós non queremos facer os dous. 690 00:43:59,200 --> 00:44:02,500 Isto é idéntico a este momento. 691 00:44:02,500 --> 00:44:08,310 >> Así, aínda que s é unha cadea, como estamos chamando el por semanas, s é realmente un char *. 692 00:44:08,310 --> 00:44:13,270 Entón, se queremos ser anal super, é realmente correcta de escribir o carácter específico 693 00:44:13,270 --> 00:44:17,490 no lugar Ith utilizando estes enderezos numéricos e este operador estrela, 694 00:44:17,490 --> 00:44:20,470 pero, francamente, este é máis limpo tanta cousa. Entón iso non é malo. 695 00:44:20,470 --> 00:44:26,720 Non hai razón para deixar de facer liña 27 aquí, pero 26 é funcionalmente o mesmo, 696 00:44:26,720 --> 00:44:31,570 e é funcionalmente o mesmo para exactamente as razóns que estamos discutindo ata agora. 697 00:44:31,570 --> 00:44:33,650 E, por último, 29 e práctica só bo. 698 00:44:33,650 --> 00:44:38,420 Chamando libre s significa que agora está dando de volta a memoria que lle deu GetString 699 00:44:38,420 --> 00:44:41,630 porque unha vez máis, como mencionei luns, GetString de semana 700 00:44:41,630 --> 00:44:44,180 foi a introdución dun erro no seu código. 701 00:44:44,180 --> 00:44:46,490 O seu código de semana tivo derrames de memoria 702 00:44:46,490 --> 00:44:49,970 polo cal foi preguntando GetString para a memoria, pero nunca foi dándolle de volta. 703 00:44:49,970 --> 00:44:53,410 E que foi deliberadamente elixido por nós pedagoxicamente 704 00:44:53,410 --> 00:44:55,880 porque é moi pouco para pensar no inicio. 705 00:44:55,880 --> 00:44:57,710 Pero agora necesitamos máis simetría. 706 00:44:57,710 --> 00:45:00,830 Pedir ao ordenador para a memoria, como é o caso para GetString, 707 00:45:00,830 --> 00:45:02,820 como é o caso, ao parecer para malloc, 708 00:45:02,820 --> 00:45:07,970 Debe agora pset diante 4 tamén calquera memoria libre tal. 709 00:45:07,970 --> 00:45:11,650 Teña en conta que isto é diferente de dicir n int. 710 00:45:11,650 --> 00:45:15,040 Non precisa liberar iso porque non chamou GetString 711 00:45:15,040 --> 00:45:16,890 e non chamar malloc. 712 00:45:16,890 --> 00:45:20,610 >> E mesmo se chamou GetInt como vai finalmente ver 713 00:45:20,610 --> 00:45:25,520 GetInt non aloca memoria para ti, porque realmente pode pasar ao redor de números enteiros 714 00:45:25,520 --> 00:45:29,430 e coches alegóricos e chars só a forma como temos benvida a facer para a semana. 715 00:45:29,430 --> 00:45:33,960 Cordas, pero é especial porque realmente son a concatenação de caracteres múltiples. 716 00:45:33,960 --> 00:45:37,450 Entón, eles están só diferente de caracteres e coches alegóricos e ints e similares. 717 00:45:37,450 --> 00:45:39,980 Pero imos volver ao que antes do tempo. 718 00:45:39,980 --> 00:45:44,920 Algunha preguntas, entón neste inicio de punteiros? Si 719 00:45:44,920 --> 00:45:49,690 [Pregunta estudante inaudível] 720 00:45:49,690 --> 00:45:51,440 Ah, boa pregunta. 721 00:45:51,440 --> 00:45:55,790 Unha das poucas cousas que realmente C fai para ti, o que é conveniente, 722 00:45:55,790 --> 00:46:00,110 é el descobre para o que é o tamaño do tipo de datos 723 00:46:00,110 --> 00:46:03,060 e despois fai ese tipo de multiplicación para ti. 724 00:46:03,060 --> 00:46:06,610 Isto é irrelevante no caso de caracteres, porque case sempre é char a 1 byte, 725 00:46:06,610 --> 00:46:08,150 entón isto funciona. 726 00:46:08,150 --> 00:46:11,220 Pero, por mor da discusión, se está realmente imprimir enteiros 727 00:46:11,220 --> 00:46:15,500 e estaba tentando imprimir algúns o valor que estaba apuntando a un número enteiro, 728 00:46:15,500 --> 00:46:20,720 vostede da mesma forma non tería necesidade de facer + 4 * i só porque un int é de 4 bytes. 729 00:46:20,720 --> 00:46:25,780 Aritmética de punteiro significa que o compilador C e facer toda a matemática que para ti. 730 00:46:25,780 --> 00:46:29,190 Todo o que ten que se preocupar é a conta nunha especie de sentido humano. Si 731 00:46:29,190 --> 00:46:35,200 [Estudante] Se declarar unha secuencia dentro dun loop for, ten que liberar-lo despois? 732 00:46:35,200 --> 00:46:36,760 Boa pregunta. 733 00:46:36,760 --> 00:46:41,390 >> Se declarou unha corda dentro do loop for, precisa liberalo lo máis tarde? 734 00:46:41,390 --> 00:46:47,520 Só ten memoria libre que reservar con GetString ou malloc. 735 00:46:47,520 --> 00:46:53,110 Entón, se acaba de dicir algo así como - deixe-me poñer chaves agora así todo o código está relacionado. 736 00:46:53,110 --> 00:46:58,580 Se fixo algo, aínda que buggily, como este, char * t = s, 737 00:46:58,580 --> 00:47:03,450 non necesita de t libres, porque t non implica ningunha mención de malloc ou GetString. 738 00:47:03,450 --> 00:47:08,960 Se, pola contra fixo iso, GetString, entón si, ten que t libres. 739 00:47:08,960 --> 00:47:14,350 E, de feito, a súa única oportunidade de facelo é agora dentro deste lazo, para o mesmo problema de ámbito 740 00:47:14,350 --> 00:47:16,060 que temos discutido no pasado. 741 00:47:16,060 --> 00:47:18,830 Se non, sería a distribución de memoria, distribución de memoria, distribución de memoria, 742 00:47:18,830 --> 00:47:21,230 e ao final do programa, porque está fóra dese circuíto, 743 00:47:21,230 --> 00:47:24,240 t non existe, pero nunca contou o sistema operativo 744 00:47:24,240 --> 00:47:26,750 que non precisa máis que a memoria. 745 00:47:26,750 --> 00:47:30,430 E en pouco tempo, para pset 4 ou 5 imos equipa-lo con un programa chamado Valgrind, 746 00:47:30,430 --> 00:47:34,160 que é semellante en espírito a GDB no que ten un pouco de unha interface arcano, 747 00:47:34,160 --> 00:47:35,750 pero o seu propósito na vida é axudar. 748 00:47:35,750 --> 00:47:39,380 E Valgrind é un programa que, no futuro, buscar os seus programas 749 00:47:39,380 --> 00:47:42,550 buscar vazamentos de memoria, sexa de GetString ou malloc, 750 00:47:42,550 --> 00:47:47,800 que nós imos comezar a usar todo o máis que deixar de usar a biblioteca CS50 tanto. 751 00:47:47,800 --> 00:47:53,030 Finalmente agora temos un tipo do vocabulario e do tipo de modelo mental na teoría 752 00:47:53,030 --> 00:47:55,170 co cal se resolve este programa roto. 753 00:47:55,170 --> 00:47:59,410 >> Polo tanto, neste programa roto, intercambio funciona dentro de intercambio, 754 00:47:59,410 --> 00:48:05,280 pero nunca traballou realmente no inicio porque principal pasou x e y, recall, 755 00:48:05,280 --> 00:48:07,260 e os que foron aprobados en por valores, por así dicir. 756 00:48:07,260 --> 00:48:09,330 Copias deles foron dados para intercambiar. 757 00:48:09,330 --> 00:48:12,520 Ata o final de intercambio, a e b realmente fora trocado, 758 00:48:12,520 --> 00:48:16,120 pero está claro que X e Y, como vimos o luns, non fora. 759 00:48:16,120 --> 00:48:19,940 Entón propoño en verde aquí que esta é realmente a solución aquí. 760 00:48:19,940 --> 00:48:22,640 E, de feito, deixe-me pasar miñas estrelas só para ser coherente 761 00:48:22,640 --> 00:48:24,440 a pesar de, de novo, funcionalmente, iso non importa. 762 00:48:24,440 --> 00:48:28,730 As semanas futuros imos explicar cando e por que isto importa. 763 00:48:28,730 --> 00:48:30,600 Entón en verde agora é unha solución. 764 00:48:30,600 --> 00:48:33,700 Francamente, parece un monte máis confusa, porque eu teño todas esas estrelas. 765 00:48:33,700 --> 00:48:35,380 Deixe-me apuntar unha única cousa. 766 00:48:35,380 --> 00:48:40,040 A liña de arriba aquí onde di int * a * b e int 767 00:48:40,040 --> 00:48:42,820 é fundamentalmente facer a mesma cousa que el sempre ten. 768 00:48:42,820 --> 00:48:47,070 É declarar que dous argumentos ou parámetros para intercambiar, 769 00:48:47,070 --> 00:48:49,940 a primeira das cales é un punteiro int chamado, 770 00:48:49,940 --> 00:48:53,100 a segunda das cales é un punteiro int chamado b. 771 00:48:53,100 --> 00:48:55,770 O único que hai de novo neste punto é o feito de que hai unha estrela alí. 772 00:48:55,770 --> 00:48:59,340 >> O que significa isto? A non é un int, b non é un int. 773 00:48:59,340 --> 00:49:04,100 Un é o enderezo dun int b é o enderezo dun int diferente. 774 00:49:04,100 --> 00:49:06,980 Aquí, é aquí que eu admite C queda confuso. 775 00:49:06,980 --> 00:49:09,790 Agora estamos a usar unha estrela, pero ten significado distinto neste contexto. 776 00:49:09,790 --> 00:49:13,150 Porque nós non estamos declarar punteiros como estamos aquí, 777 00:49:13,150 --> 00:49:15,500 aquí estamos dereferencing cousas. 778 00:49:15,500 --> 00:49:21,520 Entón, tecnicamente, a estrela neste contexto de primeira liña, segundo e terceiro dentro de intercambio 779 00:49:21,520 --> 00:49:24,560 é o operador dereference, o que significa só ir alí. 780 00:49:24,560 --> 00:49:27,400 Así como o meu dedo seguiu a frecha para h, 781 00:49:27,400 --> 00:49:31,100 * Un medio ir a este enderezo e me pensar o int que está aí. 782 00:49:31,100 --> 00:49:34,250 * Significa que B vaia ao enderezo e pasar-me o que está aí. 783 00:49:34,250 --> 00:49:40,730 Entón, imos redesenhar a imaxe de luns usando agora unha pila de cadros, 784 00:49:40,730 --> 00:49:43,130 o fondo do cal vai ser principal, 785 00:49:43,130 --> 00:49:47,600 a superior das cales será de permuta, 786 00:49:47,600 --> 00:49:50,880 para que o noso mundo mira, así como luns, coma este. 787 00:49:50,880 --> 00:49:53,620 Aquí é unha peza de memoria principal é que vai empregar. 788 00:49:53,620 --> 00:49:56,520 >> Teña en conta que de luns que o programa só tiña dúas variables, 789 00:49:56,520 --> 00:50:01,930 un chamado x e y un chamado, e eu tiña colocado os números 1 e 2 alí. 790 00:50:01,930 --> 00:50:06,580 Agora, cando eu chamo intercambiar como eu fixen o luns, 791 00:50:06,580 --> 00:50:11,000 anteriormente, cando eu usei a versión vermella deste programa, que se parece iso, 792 00:50:11,000 --> 00:50:17,470 Eu teño dous parámetros, A e B, eo que escribir aquí e aquí? 793 00:50:17,470 --> 00:50:21,160 Só 1 e 2, literalmente copia de x e y. 794 00:50:21,160 --> 00:50:23,070 Hoxe cambiar isto. 795 00:50:23,070 --> 00:50:28,510 Hoxe, en vez de pasar ints a e b, imos pasar dous enderezos. 796 00:50:28,510 --> 00:50:34,290 Estes enderezos ocorrer para apuntar para ints, pero estes enderezos non son ints si. 797 00:50:34,290 --> 00:50:37,330 Son enderezos. É como un enderezo postal vez. 798 00:50:37,330 --> 00:50:40,580 Entón agora necesitamos só dar a min mesmo un pouco máis detalladamente sobre a pantalla. 799 00:50:40,580 --> 00:50:43,250 Esta é a memoria do meu ordenador como foi todo o día. 800 00:50:43,250 --> 00:50:45,120 Agora necesitamos algún esquema de numeración arbitraria. 801 00:50:45,120 --> 00:50:50,580 Entón imos só dicir que, só por casualidade, que este é o enderezo de memoria 123, 124. 802 00:50:50,580 --> 00:50:55,660 Nós só dicir que este é 125, que é 126, e así por diante, pero iso é totalmente arbitrario. 803 00:50:55,660 --> 00:50:58,590 Nós só necesitamos algún esquema de numeración na miña memoria. 804 00:50:58,590 --> 00:51:04,030 Entón agora cando realmente pasar x e y, eu non vou pasar x e y; 805 00:51:04,030 --> 00:51:08,400 Vou pasar o enderezo postal, por así dicir, de x e y 806 00:51:08,400 --> 00:51:11,870 de xeito que o que queda almacenado aquí e aquí non é 1 e 2, 807 00:51:11,870 --> 00:51:16,030 pero se pode ver o meu pequeno texto, que é pasado aquí e aquí? 808 00:51:16,030 --> 00:51:23,340 [Resposta do alumno inaudível] >> Exactamente. 123 e colocar aquí e 124 colócase aquí. 809 00:51:23,340 --> 00:51:28,910 >> Agora, porque eu usei a estrela deste xeito primeira liña aquí enriba, 810 00:51:28,910 --> 00:51:34,340 meu programa só sabe que 123 e 124, a pesar de seren, obviamente, enteiros 811 00:51:34,340 --> 00:51:40,160 que calquera humano podería notar, eles deben ser interpretados como enderezos, enderezos numéricos. 812 00:51:40,160 --> 00:51:43,250 Eles non son en si mesmas ints, son enderezos, 813 00:51:43,250 --> 00:51:46,120 e iso é porque eu explícitamente pon as estrelas alí. 814 00:51:46,120 --> 00:51:51,360 Entón agora na miña liña primeiro, segundo e terceiro do código real que pasa aquí? 815 00:51:51,360 --> 00:51:53,380 Imos deseñar o resto da imaxe. 816 00:51:53,380 --> 00:51:56,980 Tmp é exactamente como era o luns. Nada de especial sobre tmp. 817 00:51:56,980 --> 00:52:03,060 É só un lugar de 32 bits variable, e dentro do que eu estou aparentemente almacenar o valor dun ficheiro *. 818 00:52:03,060 --> 00:52:08,580 Agora, se eu só dixen tmp = a, o que poñer aquí? >> [Alumno] 123. 819 00:52:08,580 --> 00:52:10,370 123. Pero iso non é o que eu estou facendo. 820 00:52:10,370 --> 00:52:13,670 Eu estou dicindo tmp = * a. Significa estrela ir alí. 821 00:52:13,670 --> 00:52:19,370 Entón aquí vai unha, 123. Como podo ir alí? Finxir que non hai unha frecha. 822 00:52:19,370 --> 00:52:24,460 Ben, aí está, 1. Entón, o que está almacenado en tmp, aparentemente? Só 1. 823 00:52:24,460 --> 00:52:29,620 Polo tanto, noutras palabras, é tmp * a *, un medio ir ao enderezo que está actualmente nunha, 824 00:52:29,620 --> 00:52:31,320 que aparentemente é 123. 825 00:52:31,320 --> 00:52:33,910 >> Ok, aquí estamos na posición 123, eu vexo o número 1, 826 00:52:33,910 --> 00:52:35,670 entón eu vou poñer o número 1 alí. 827 00:52:35,670 --> 00:52:39,020 Agora o que fago na liña 2, a * = * b? 828 00:52:39,020 --> 00:52:44,570 Este é un pouco máis complicado, porque agora o que é un? É 123. 829 00:52:44,570 --> 00:52:50,220 Entón, a * é onde? Exactamente onde eu estaba antes. Entón, vai alí. Okay. 830 00:52:50,220 --> 00:52:53,420 Agora, por fin, e entón finalmente iso vai comezar a ter sentido, espera-se, 831 00:52:53,420 --> 00:53:00,280 * B significa que está en b? 124. Entón eu teño ir alí, que é 2. 832 00:53:00,280 --> 00:53:03,430 Entón, o que podo poñer onde? 833 00:53:03,430 --> 00:53:10,100 2 entra aquí, porque vai * b * a. Entón, eu vou facer iso. 834 00:53:10,100 --> 00:53:13,120 E xa pode ver, se cadra, de que estamos moito máis preto 835 00:53:13,120 --> 00:53:17,710 Para solucionar este problema, estúpido simple correctamente por primeira vez 836 00:53:17,710 --> 00:53:20,920 porque agora nós aínda temos un recordo do que foi x, 837 00:53:20,920 --> 00:53:23,230 temos dúas copias, reconhecidamente, de y, 838 00:53:23,230 --> 00:53:25,850 pero a liña 3 agora di * b. 839 00:53:25,850 --> 00:53:31,080 Entón aquí está b. * B medios para alí. Entón, onde é o lugar 124? 840 00:53:31,080 --> 00:53:35,560 É aparentemente aquí. Entón o que eu poñer aquí? Obviamente tmp. 841 00:53:35,560 --> 00:53:39,600 Entón agora eu fago iso. Entón, eu teño unha aquí e 2 aquí. 842 00:53:39,600 --> 00:53:43,560 E agora o que dicir de todo isto, o 123, o 124 eo 1? 843 00:53:43,560 --> 00:53:47,910 Así que retorna de intercambio, esa memoria é tan bo como perdido 844 00:53:47,910 --> 00:53:51,070 porque así como o retorno de intercambio, o sistema operativo 845 00:53:51,070 --> 00:53:54,190 é libre para usar a memoria de novo no futuro. 846 00:53:54,190 --> 00:53:58,870 Só a memoria principal, na parte inferior desta pila de chamada varas en torno. 847 00:53:58,870 --> 00:54:01,470 >> E así finalmente temos agora unha versión de traballo. 848 00:54:01,470 --> 00:54:06,310 Deixe-me ir swap.c, e observe o seguinte. 849 00:54:06,310 --> 00:54:11,280 No cumio do programa que eu mudei o meu prototipo para ser int * a * b e int. 850 00:54:11,280 --> 00:54:15,000 Así, a única cousa que cambiou para ir de vermello, o que foi malo para o verde, que é bo, 851 00:54:15,000 --> 00:54:17,350 é que eu engade estas estrelas de hoxe. 852 00:54:17,350 --> 00:54:21,520 Pero, entón, aquí no propio intercambio eu tiña que copiar, pegar o que era só no slide. 853 00:54:21,520 --> 00:54:24,140 Eu teño unha estrela aquí, estrela aquí - que coincide co prototipo - 854 00:54:24,140 --> 00:54:27,930 e despois de todas estas cousas agora ten estrelas, excepto para tmp 855 00:54:27,930 --> 00:54:30,680 porque o uso dunha variable temporal, non hai nada novo nisto. 856 00:54:30,680 --> 00:54:33,040 Eu só teño de almacenamento temporal para un int. 857 00:54:33,040 --> 00:54:34,820 Entón, nós non necesitamos unha estrela alí. 858 00:54:34,820 --> 00:54:39,310 Nós só necesitamos unha estrela, para que poidamos atravesar este tipo de límite arbitrario 859 00:54:39,310 --> 00:54:42,900 entre estes dous cadros na memoria do meu ordenador. 860 00:54:42,900 --> 00:54:45,630 Pero unha última cousa que ten que cambiar, e pode ter hano descifrar xa. 861 00:54:45,630 --> 00:54:48,810 O que outra liña é obviamente diferente agora? >> [Alumno] e x. 862 00:54:48,810 --> 00:54:53,270 >> Si, entón 25 é a última liña de código que eu teño cambiar para que isto funcione. 863 00:54:53,270 --> 00:54:58,360 Unha semana, e mesmo o luns da liña 25 quedou así, cambiar x e y, 864 00:54:58,360 --> 00:55:02,020 e este foi só rota porque se di de intercambio (x, y) 865 00:55:02,020 --> 00:55:05,660 está dando copias de X e Y para intercambiar, entón está facendo a súa cousa, 866 00:55:05,660 --> 00:55:09,080 pero nunca está realmente cambiando X e Y si. 867 00:55:09,080 --> 00:55:12,880 Así, mesmo se nunca viu este personaxe antes co comercial no código, 868 00:55:12,880 --> 00:55:15,860 só dar un palpite. O que fai o comercial facer, aparentemente? 869 00:55:15,860 --> 00:55:17,890 [Alumno] e enderezo. >> Toma o enderezo. 870 00:55:17,890 --> 00:55:21,160 Así, o comercial está dicindo me dar o enderezo de x. 871 00:55:21,160 --> 00:55:25,590 Quen sabe onde é? El pasa a ser 123. Eu non me importa. Só me dea o seu enderezo de x. 872 00:55:25,590 --> 00:55:28,340 & Y significa darme o enderezo de y. 873 00:55:28,340 --> 00:55:34,450 E nese punto a historia é perfectamente consistente coa imaxe que deseñou un momento atrás. 874 00:55:34,450 --> 00:55:38,310 >> Entón, eu vou admitir punteiros, certamente para min, cando eu empecei a aprender iso, 875 00:55:38,310 --> 00:55:40,570 foron sempre unha das cousas máis difíciles de implicar miña mente. 876 00:55:40,570 --> 00:55:43,760 Pero entender, especialmente a medida que continuar a xogar con eses tipos de cousas, 877 00:55:43,760 --> 00:55:48,030 se decompô-lo para este tipo super sinxelo de intelectualmente desinteressante problemas 878 00:55:48,030 --> 00:55:52,270 só movendo en torno de números, a resposta a unha gran confusión con punteiros 879 00:55:52,270 --> 00:55:56,590 realmente pode ser obtido a partir destes mecánica moi básicas. 880 00:55:56,590 --> 00:55:59,070 Aquí está o enderezo. Vaia coa estrela. 881 00:55:59,070 --> 00:56:03,830 Ou, inversamente, aquí está un e comercial. Descubrir o que o enderezo realmente é. 882 00:56:03,830 --> 00:56:06,270 Todo ben. 883 00:56:06,270 --> 00:56:09,000 Entón, onde está toda esa memoria vén? 884 00:56:09,000 --> 00:56:12,360 Poñemos esta imaxe dun par de veces, e eu sigo prometedor imos volver a el, 885 00:56:12,360 --> 00:56:14,920 pero aquí é a representación da memoria do seu ordenador 886 00:56:14,920 --> 00:56:17,420 que é un pouco máis marcado que o noso cadro aquí é. 887 00:56:17,420 --> 00:56:21,590 O segmento de texto na parte superior representa o que se refire ao seu programa? 888 00:56:21,590 --> 00:56:26,090 [Resposta do alumno inaudível] >> Desculpa? Diga novo. 889 00:56:26,090 --> 00:56:28,660 [Alumno] O programa real. O programa >> real. 890 00:56:28,660 --> 00:56:32,430 >> Así, o Clang 0s e 1s que teña compilado despois de escribir código C e en seguida, executando 891 00:56:32,430 --> 00:56:35,910 e xerando extremos 0s e 1s por estar escondido alí na memoria 892 00:56:35,910 --> 00:56:38,570 porque cando dobre clic nun icono no seu Mac ou PC 893 00:56:38,570 --> 00:56:43,010 ou executar un comando como Mario no seu poder, o seu 0s e 1s do disco 894 00:56:43,010 --> 00:56:45,700 son cargados na memoria para que o ordenador poida manipulala los 895 00:56:45,700 --> 00:56:47,540 e executa-los máis rapidamente. 896 00:56:47,540 --> 00:56:50,880 Datos para inicializados e os datos non inicializados, non imos falar moito sobre aqueles, 897 00:56:50,880 --> 00:56:52,420 pero estas son só variables globais. 898 00:56:52,420 --> 00:56:54,710 Inicializar significa variables globais que deu valores; 899 00:56:54,710 --> 00:56:59,300 non inicializar significa variables globais que aínda non dan valores. 900 00:56:59,300 --> 00:57:01,900 Despois, hai as variables de ambiente que eu vou completamente a miña man a onda, 901 00:57:01,900 --> 00:57:04,860 pero eles están alí e que almacena cousas como o seu nome de usuario 902 00:57:04,860 --> 00:57:08,090 e outro tipo de detalles de nivel inferior. 903 00:57:08,090 --> 00:57:12,880 Pero os máis suculentos anacos de esquema da súa memoria é esa cousa chamada a pila eo heap. 904 00:57:12,880 --> 00:57:17,470 A pila de novo, para ser claro, é a memoria que se usa sempre que funcións son chamadas, 905 00:57:17,470 --> 00:57:19,710 sempre que haxa variables locais 906 00:57:19,710 --> 00:57:22,120 e sempre que hai parámetros que están sendo repassados. 907 00:57:22,120 --> 00:57:24,490 Todo o que acontece na pila. 908 00:57:24,490 --> 00:57:29,570 A pila non temos falado, pero dar un palpite que usa a pila. 909 00:57:31,120 --> 00:57:32,690 Só unha peza diferente de memoria. 910 00:57:32,690 --> 00:57:36,620 El pasa a ser feita aquí enriba, pero iso é unha convención arbitraria pictórica. 911 00:57:36,620 --> 00:57:41,670 Que aparentemente estaba usando a memoria da pila de semana? 912 00:57:41,670 --> 00:57:44,830 É tecnicamente ti, pero indirectamente. >> [Alumno] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString e malloc. Entón aquí está a diferenza fundamental. 914 00:57:47,950 --> 00:57:51,300 >> Vostede sabe para as últimas semanas que se precisa de memoria, pode declarar unha variable. 915 00:57:51,300 --> 00:57:54,560 Se precisa de moita memoria, declarar unha matriz dereito dentro da súa función. 916 00:57:54,560 --> 00:57:59,620 Pero o problema que enfrontamos é mantido se declarar variables locais dentro de funcións, 917 00:57:59,620 --> 00:58:05,340 logo que o retorno da función, o que pasa coa memoria e aquelas variables? 918 00:58:05,340 --> 00:58:09,620 Só o tipo de que non é máis o seu, non? El simplemente desaparece tipo de conceptualmente. 919 00:58:09,620 --> 00:58:13,950 Aínda é fisicamente alí, obviamente, pero non é o seu dereito de uso. 920 00:58:13,950 --> 00:58:17,160 Esta é, obviamente, un problema se quere escribir funcións na vida 921 00:58:17,160 --> 00:58:20,440 que realmente reservar memoria e non devolve-lo inmediatamente. 922 00:58:20,440 --> 00:58:24,180 Caso en cuestión: GetString propósito na vida é non ter idea de antelación 923 00:58:24,180 --> 00:58:26,390 como gran dunha corda Eu vou escribir no teclado, 924 00:58:26,390 --> 00:58:30,390 pero ten que ser capaz de reservar memoria para almacenar David ou Ola 925 00:58:30,390 --> 00:58:32,860 ou ensaio un todo que o usuario pode ter ingresaran dentro 926 00:58:32,860 --> 00:58:35,280 Entón GetString vén usando malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc, polo tanto, non debe estar usando a pila; 928 00:58:38,910 --> 00:58:40,770 en vez diso, está a usar esa cousa chamada heap. 929 00:58:40,770 --> 00:58:44,430 Non hai nada diferente sobre a memoria. Non é máis rápido ou máis lento ou algo así. 930 00:58:44,430 --> 00:58:46,570 É só fisicamente nun lugar diferente. 931 00:58:46,570 --> 00:58:50,120 >> Pero a regra é que a memoria que está alocada na pila 932 00:58:50,120 --> 00:58:56,180 nunca ser tirado de ti ata que chamar - dar un palpite - libre. 933 00:58:56,180 --> 00:59:00,510 Por outra banda, calquera memoria que pedir na pila por só declarar unha matriz 934 00:59:00,510 --> 00:59:03,320 ou declarar unha variable como temos benvida a facer para a semana, 935 00:59:03,320 --> 00:59:05,640 que, por defecto acaba na pila. 936 00:59:05,640 --> 00:59:09,550 E que funciona 90% gran parte do tempo, pero nesas ocasións máis raras 937 00:59:09,550 --> 00:59:12,470 onde quere reservar memoria e mantelo por preto, 938 00:59:12,470 --> 00:59:14,730 entón tes que usar unha función como malloc. 939 00:59:14,730 --> 00:59:19,370 Ou usamos unha función como GetString, que á súa vez usa malloc. 940 00:59:19,370 --> 00:59:23,300 Imos ver onde isto pode romper e, a continuación, dar un ollo ao Binky. 941 00:59:23,300 --> 00:59:25,820 Nós imos voltar a iso no futuro. 942 00:59:25,820 --> 00:59:29,270 Aquí está o programa super simples que nos primeiros 2 liñas fai o que? 943 00:59:29,270 --> 00:59:33,460 En inglés, o que esas 2 primeiras liñas de código facer dentro principal? 944 00:59:33,460 --> 00:59:35,600 [Resposta do alumno inaudível] 945 00:59:35,600 --> 00:59:37,880 Coidado. Non me dá o enderezo de x ou y. 946 00:59:37,880 --> 00:59:41,840 [Estudante] da punteiros para ints. >> Boa. Déame dous punteiros para enteiros. 947 00:59:41,840 --> 00:59:45,130 Noutras palabras, dáme dous anacos de memoria que gardo deseño de hoxe, 948 00:59:45,130 --> 00:59:46,950 aínda que eu apaguei o momento, como cadrados. 949 00:59:46,950 --> 00:59:50,000 Déame dous anacos de memoria, un chamado x, y un chamado - 950 00:59:50,000 --> 00:59:54,320 antes eu chamaba S e T - e cal é o tipo de que anaco da memoria? 951 00:59:54,320 --> 00:59:57,160 Vai para almacenar un enderezo. 952 00:59:57,160 --> 00:59:59,110 É de * tipo int. 953 00:59:59,110 --> 01:00:01,630 >> Así, o enderezo dun int ha eventualmente viven en x, 954 01:00:01,630 --> 01:00:03,860 o enderezo de un int acabará por vivir en y, 955 01:00:03,860 --> 01:00:08,460 pero, inicialmente, o que está dentro de X e Y? Quen sabe? Valores de lixo. 956 01:00:08,460 --> 01:00:10,180 Non ten nada que ver con punteiros. 957 01:00:10,180 --> 01:00:12,720 Se non poñer algo alí, quen sabe o que realmente está aí? 958 01:00:12,720 --> 01:00:18,950 Agora, x. O que pasa aquí? Isto é legal agora porque x é un punteiro. É un int *. 959 01:00:18,950 --> 01:00:21,870 Entón iso significa que podo poñer en X o enderezo de algún anaco de memoria. 960 01:00:21,870 --> 01:00:25,120 O que malloc voltar? Perfecto, el retorna enderezos, 961 01:00:25,120 --> 01:00:28,510 o enderezo do primeiro byte dun bloque enteiro de memoria. 962 01:00:28,510 --> 01:00:31,140 Cantos máis é o que parece atribuír, por exemplo, no interior do aparello? 963 01:00:31,140 --> 01:00:33,510 Cal é o tamaño dun int? 4. 964 01:00:33,510 --> 01:00:36,600 Se pensas que volta para unha semana, non é super importante sempre lembrar que, 965 01:00:36,600 --> 01:00:38,870 pero, neste caso, é útil saber, 4 bytes. 966 01:00:38,870 --> 01:00:41,770 Polo tanto, este é reservar na pila 4 bytes 967 01:00:41,770 --> 01:00:46,110 e é o enderezo de retorno da primeira para me arbitrariamente. 968 01:00:46,110 --> 01:00:47,700 Agora, o que está facendo x? 969 01:00:47,700 --> 01:00:52,200 A * x = 42 está facendo o que? 970 01:00:52,200 --> 01:00:57,150 Neste punto da historia que temos x, que se parece iso con algún valor de lixo, 971 01:00:57,150 --> 01:01:04,120 este é agora y con algún valor de lixo, agora na liña 3 eu alocados 4 bytes. 972 01:01:04,120 --> 01:01:06,950 Esta imaxe esencialmente coma este. 973 01:01:06,950 --> 01:01:12,010 Ou, máis especificamente, esta é arbitraria enderezo 123, iso é o que a nosa historia agora parece. 974 01:01:12,010 --> 01:01:23,940 * X = 42 agora significa o que? Isto significa ir ao enderezo 123 e poñer o número 42 alí. 975 01:01:23,940 --> 01:01:26,220 Eu non teño chamar a estas liñas, porque nós non estamos facendo cordas. 976 01:01:26,220 --> 01:01:29,480 >> Eu debería ter escrito así, e só por mor da manifestación, o 977 01:01:29,480 --> 01:01:33,240 42 como unha especie de int ocupa moito espazo, 4 bytes. 978 01:01:33,240 --> 01:01:35,960 Entón, iso é o que pasou alí, pero hai un problema. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. O que vai ocorrer aquí? 980 01:01:40,580 --> 01:01:46,470 O problema é * y no noso mundo simplificado significa só ir ao enderezo en y. 981 01:01:46,470 --> 01:01:48,590 O que está en y? É un valor lixo. 982 01:01:48,590 --> 01:01:53,150 Entón, imos supor que ese valor de lixo e 5551212, algo tolo así. 983 01:01:53,150 --> 01:01:56,750 Medio * y ir para abordar 5551212. 984 01:01:56,750 --> 01:02:00,450 Isto é como aquí. Non hai, por exemplo. 985 01:02:00,450 --> 01:02:05,310 Entón * y recibe 13 significa que eu estou tentando facer 13 aquí. El non existe. 986 01:02:05,310 --> 01:02:08,790 Eu xa superou o segmento do cadro negro. O que eu ganancia? 987 01:02:08,790 --> 01:02:14,930 Esta fallo de segmento enigmática mensaxe porque eu estou tentando poñer na memoria 988 01:02:14,930 --> 01:02:19,470 un valor como 13 nun lugar que non existe. 989 01:02:19,470 --> 01:02:23,900 O resto do programa pode funcionar ben, pero ata que punto isto non acontece. 990 01:02:23,900 --> 01:02:25,350 Entón, imos tentar contar esa historia. 991 01:02:25,350 --> 01:02:27,830 Nós imos voltar a que, unha vez que falamos de feitizo. 992 01:02:27,830 --> 01:02:30,290 Imos volver a este e completar con esa cousa chamada Binky, 993 01:02:30,290 --> 01:02:33,710 que recall é un profesor de Stanford sentado na casa xogando con claymation, 994 01:02:33,710 --> 01:02:36,380 para contar a historia exactamente do programa que mesmo. 995 01:02:36,380 --> 01:02:40,580 É só uns 3 minutos de duración. Aquí temos Binky. 996 01:02:40,580 --> 01:02:45,030 [Orador masculino en vídeo] Hey Binky, acorda. É hora de diversión punteiro. 997 01:02:45,030 --> 01:02:50,080 [Binky] O que é isto? Máis información sobre punteiros? Ah, bo! 998 01:02:50,080 --> 01:02:53,700 [Orador masculino] Ben, para comezar, eu creo que nós imos ter un par de punteiros. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Okay. Este código aloca dous punteiros que poden apuntar para números enteiros. 1000 01:02:57,890 --> 01:03:02,220 [Orador masculino] Okay. Ben, eu vexo os dous punteiros, pero eles non parecen estar a apuntar cara algo. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Iso mesmo. Inicialmente, os punteiros non ligan con nada. 1002 01:03:05,550 --> 01:03:09,270 As cousas que eles apuntan son chamados pointees, e configuralo los é un paso separado. 1003 01:03:09,270 --> 01:03:12,330 [Orador masculino] Ah, non, non. Eu sabía. Os pointees son separados. 1004 01:03:12,330 --> 01:03:15,630 Er, así como reservar un pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Okay. Este código aloca un novo pointee enteiro, e esta parte define X para apuntar para el. 1006 01:03:21,510 --> 01:03:23,500 [Orador masculino] Ei, iso parece mellor. 1007 01:03:23,500 --> 01:03:26,030 Entón el facer algo. >> [Binky] Okay. 1008 01:03:26,030 --> 01:03:30,300 Vou cancelar o punteiro X para almacenar o número 42 na súa pointee. 1009 01:03:30,300 --> 01:03:34,410 Para este truco eu teño da miña varinha Magic da dereferencing. 1010 01:03:34,410 --> 01:03:38,610 [Orador masculino] A súa varinha Magic de dereferencing? Isto é óptimo. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Isto é o que o código parece. Eu só vou definir o número e ... [Premendo son] 1012 01:03:44,230 --> 01:03:46,100 [Orador masculino] Ei, mira, aí vai. 1013 01:03:46,100 --> 01:03:50,990 Entón, facendo un dereference en X segue a frecha para acceder a súa pointee, 1014 01:03:50,990 --> 01:03:53,230 neste caso para almacenar 42 en alí. 1015 01:03:53,230 --> 01:03:57,630 Ola, tente usalo para almacenar o número 13 ata o outro punteiro, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Okay. Vou pasar por riba aquí para y e obter o número 13 configurar 1017 01:04:03,250 --> 01:04:08,360 e despois tome a vara de dereferencing e só ... [Zumbido] Whoa! 1018 01:04:08,360 --> 01:04:10,980 [Orador masculino] Oh, hey, iso non funcionou. 1019 01:04:10,980 --> 01:04:14,870 >> Diga, Binky, eu non creo que dereferencing y é unha boa idea 1020 01:04:14,870 --> 01:04:17,880 que a configuración da pointee é unha etapa separada 1021 01:04:17,880 --> 01:04:19,850 e eu non creo que xa fixen iso. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, bo punto. 1023 01:04:21,770 --> 01:04:26,640 [Orador masculino] Yeah. Alocamos o punteiro y mais nunca configuralo para apuntar para unha pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, moi observador. 1025 01:04:28,780 --> 01:04:30,690 [Orador masculino] Ei, está parecendo bo alí, Binky. 1026 01:04:30,690 --> 01:04:34,160 Pode resolve-lo, de modo que y apunta para o pointee mesmo que x? >> [Binky] Claro. 1027 01:04:34,160 --> 01:04:37,100 Vou usar a miña varinha Magic de atribución de punteiro. 1028 01:04:37,100 --> 01:04:39,070 [Orador masculino] é que vai ser un problema como antes? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Non, iso non toque nos pointees. 1030 01:04:40,840 --> 01:04:44,780 Só cambia un punteiro para apuntar para o mesmo que o outro. [Premendo son] 1031 01:04:44,780 --> 01:04:48,570 [Orador masculino] Oh, eu vexo. Agora y apunta para o mesmo lugar que x. 1032 01:04:48,570 --> 01:04:51,140 Entón, agarde. Agora y é fixo. Ten un pointee. 1033 01:04:51,140 --> 01:04:54,520 Entón podes probar a varinha de dereferencing novo para enviar a máis de 13. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, todo ben. Aquí vai. [Premendo son] 1035 01:04:58,130 --> 01:05:01,250 [Orador masculino] Ei, mira iso. Agora dereferencing obras sobre y. 1036 01:05:01,250 --> 01:05:05,200 E porque os punteiros están a compartir que pointee un, dous ver 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Si, compartir. Calquera que sexa. 1038 01:05:06,910 --> 01:05:08,880 >> Entón, imos cambiar de lugar agora? 1039 01:05:08,880 --> 01:05:11,420 [Orador masculino] Oh mira, nós estamos fóra do tempo. >> [Binky] Mais - 1040 01:05:11,420 --> 01:05:13,880 [Orador masculino] Basta lembrar as tres regras de punteiro. 1041 01:05:13,880 --> 01:05:18,630 Número 1, a estrutura básica é que ten un punteiro que apunta máis a un pointee. 1042 01:05:18,630 --> 01:05:23,120 Pero o punteiro e pointee son separados, e do erro común é a creación dun punteiro 1043 01:05:23,120 --> 01:05:25,680 pero esquecerse de darlle un pointee. 1044 01:05:25,680 --> 01:05:29,580 Número 2, dereferencing punteiro comeza o punteiro e segue a súa frecha sobre 1045 01:05:29,580 --> 01:05:31,060 para acceder a súa pointee. 1046 01:05:31,060 --> 01:05:34,340 Como todos sabemos, iso só funciona se hai un pointee, 1047 01:05:34,340 --> 01:05:36,460 que tipo de volver gobernar o número 1. 1048 01:05:36,460 --> 01:05:39,870 Número 3, a asignación dun punteiro punteiro asume e cambia- 1049 01:05:39,870 --> 01:05:42,390 para apuntar para o mesmo pointee outro punteiro. 1050 01:05:42,390 --> 01:05:45,890 Así, tras a concesión, os dous punteiros apuntan para o pointee mesmo. 1051 01:05:45,890 --> 01:05:47,800 Ás veces iso é chamado de reparto. 1052 01:05:47,800 --> 01:05:50,910 >> E iso é todo o que hai para realmente. Bye-bye agora. 1053 01:05:50,910 --> 01:05:55,840 Este é Binky. Este é CS50. Imos ver a próxima semana. [Aplausos] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]