1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID Malan: Hola, e benvida de volta ao CS50. 3 00:00:13,260 --> 00:00:14,860 Polo tanto, este é o fin de semana catro. 4 00:00:14,860 --> 00:00:16,680 Só un anuncio en primeiro lugar. 5 00:00:16,680 --> 00:00:19,600 Así, o chamado quinto segunda sexa chegando este próximo luns. 6 00:00:19,600 --> 00:00:22,800 Esta é a oportunidade para cambiar de SAT / unsat a unha carta grao, ou de 7 00:00:22,800 --> 00:00:24,130 carta grao SAT / unsat. 8 00:00:24,130 --> 00:00:27,130 Importunamente, este proceso esixe unha sinatura, porque ten que cubrir 9 00:00:27,130 --> 00:00:28,770 fóra destes add / drop formas-de-rosa. 10 00:00:28,770 --> 00:00:31,680 >> Porque técnicamente, o SAT / unsat ea versión clase da letra 11 00:00:31,680 --> 00:00:33,320 teñen números de catálogo distintas. 12 00:00:33,320 --> 00:00:34,240 Pero non é gran cousa. 13 00:00:34,240 --> 00:00:36,620 Só ten que chegar ata min ou a Rob ou Lauren en calquera momento. 14 00:00:36,620 --> 00:00:39,550 Ou correo electrónico, se non ten o tipo de papel que precisa hoxe, e nós 15 00:00:39,550 --> 00:00:43,410 non se esqueza de axudar a tomar coidado de que antes de luns. 16 00:00:43,410 --> 00:00:45,780 >> Todo ben, entón hoxe en día - 17 00:00:45,780 --> 00:00:47,630 De feito, hai un pouco de eco. 18 00:00:47,630 --> 00:00:51,070 Podemos ton me un pouco para abaixo? 19 00:00:51,070 --> 00:00:51,730 Aceptar. 20 00:00:51,730 --> 00:00:54,850 Entón, hoxe, nós introducimos un tema coñecido como punteiros. 21 00:00:54,850 --> 00:00:57,770 E eu admito que este é un dos temas máis complexos que adoitan 22 00:00:57,770 --> 00:01:00,960 cubrir nesta clase, ou realmente calquera curso introdutorio que emprega C. 23 00:01:00,960 --> 00:01:05,510 >> Pero teña miña palabra para ela, sobre Se a súa mente se sente un pouco máis curvada 24 00:01:05,510 --> 00:01:07,100 hoxe e nas próximas semanas. 25 00:01:07,100 --> 00:01:10,340 Non é representativo de queda peor neste iso significa só que 26 00:01:10,340 --> 00:01:13,360 é un tema particularmente sofisticado que eu prometer, algunhas semanas 27 00:01:13,360 --> 00:01:17,610 Por iso, vai parecer moi impresionante simple en retrospectiva. 28 00:01:17,610 --> 00:01:18,720 >> Aínda me lembro até hoxe. 29 00:01:18,720 --> 00:01:22,190 Eu estaba sentado no Elliott Dining Hall, sentado á beira do meu TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 que era un residente de Elliott casa. 31 00:01:24,070 --> 00:01:26,340 E por algunha razón, este tema só click. 32 00:01:26,340 --> 00:01:29,430 O que quere dicir que eu tamén loitaba con el por moito tempo, pero eu 33 00:01:29,430 --> 00:01:33,610 farei o meu mellor para axudar a evitar calquera loita con un tema que, por fin, 34 00:01:33,610 --> 00:01:34,580 é moi poderoso. 35 00:01:34,580 --> 00:01:37,350 >> De feito, un dos temas que discutir nas próximas semanas é que 36 00:01:37,350 --> 00:01:41,130 de seguridade, e como realmente pode explotar máquinas de formas 37 00:01:41,130 --> 00:01:42,320 que non se destina. 38 00:01:42,320 --> 00:01:45,850 E esas explotacións son tipicamente o resultado de erros, erros que 39 00:01:45,850 --> 00:01:49,740 as persoas fan por non comprender algunhas da implantación subxacente 40 00:01:49,740 --> 00:01:52,250 detalles a través do cal os programas son feitos. 41 00:01:52,250 --> 00:01:55,410 >> Agora, para facelo parecer máis user agradable, eu penso en xogar a 10 42 00:01:55,410 --> 00:01:59,680 segunda previa dunha pequena claymation figura chamado Binky que foi traído para 43 00:01:59,680 --> 00:02:03,020 vida por un amigo noso en Stanford, Profesor Nick parlante. 44 00:02:03,020 --> 00:02:06,753 Entón, permítame darlle este teaser do Binky aquí. 45 00:02:06,753 --> 00:02:09,520 >> [REPRODUCIÓN] 46 00:02:09,520 --> 00:02:10,380 >> -Ei, Binky. 47 00:02:10,380 --> 00:02:11,050 Espertar. 48 00:02:11,050 --> 00:02:13,610 É tempo para divertirse punteiro. 49 00:02:13,610 --> 00:02:14,741 >> -Que é iso? 50 00:02:14,741 --> 00:02:16,440 Máis información sobre punteiros? 51 00:02:16,440 --> 00:02:17,928 Oh, goodie. 52 00:02:17,928 --> 00:02:18,920 >> [FIN reprodución de vídeo] 53 00:02:18,920 --> 00:02:20,670 >> DAVID Malan: Isto é Stanford ciencia da computación. 54 00:02:20,670 --> 00:02:23,194 Entón, máis sobre iso máis para vir. 55 00:02:23,194 --> 00:02:24,930 >> [Aplausos] 56 00:02:24,930 --> 00:02:26,660 >> DAVID Malan: Sentímolo, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Entón, lembro a última vez que rematou en este suspense realmente emocionante 58 00:02:30,680 --> 00:02:32,960 polo cal esta función simplemente non funciona. 59 00:02:32,960 --> 00:02:34,960 Polo menos intuitivamente, sentín como debe funcionar. 60 00:02:34,960 --> 00:02:37,600 Só ten que cambiar os valores de dous enteiros. 61 00:02:37,600 --> 00:02:40,915 Pero lembre que cando impreso a valores orixinais no inicio, un e 62 00:02:40,915 --> 00:02:44,210 dous, eles aínda eran unha ea dous e dous e non un. 63 00:02:44,210 --> 00:02:46,070 >> Entón deixe-me realmente cambiar ao dispositivo. 64 00:02:46,070 --> 00:02:50,180 E escribín algo de código esquelético en avanzar aquí, onde eu afirmo que x 65 00:02:50,180 --> 00:02:52,500 será de 1, y será 2. 66 00:02:52,500 --> 00:02:54,810 Eu, entón, imprimir tanto da súa valores con f impresión. 67 00:02:54,810 --> 00:02:57,540 >> Eu, entón, afirmar aquí que imos trocalos. 68 00:02:57,540 --> 00:03:00,800 Deixei un espazo baleiro aquí para nós encher hoxe en só un momento. 69 00:03:00,800 --> 00:03:03,380 Entón, eu vou afirmar que a dúas variables foron trocados. 70 00:03:03,380 --> 00:03:04,770 Entón eu vou para imprimir los de novo. 71 00:03:04,770 --> 00:03:07,090 E así espera, debería ver 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Ese é o super sinxelo obxectivo agora. 74 00:03:09,830 --> 00:03:12,430 >> Entón, como é que imos cambiar dúas variables? 75 00:03:12,430 --> 00:03:17,220 Ben, se eu propoño aquí que estes vasos pode representar en memoria dun ordenador. 76 00:03:17,220 --> 00:03:19,070 Esta é algunhas mordidas, este é máis algunhas mordidas. 77 00:03:19,070 --> 00:03:23,260 Poderiamos ter un voluntario veña para arriba e mesturar connosco algunhas bebidas, se familiar? 78 00:03:23,260 --> 00:03:23,920 Imos para arriba. 79 00:03:23,920 --> 00:03:24,815 Cal é o seu nome? 80 00:03:24,815 --> 00:03:25,260 >> Jess: Jess. 81 00:03:25,260 --> 00:03:25,690 >> DAVID Malan: Jess? 82 00:03:25,690 --> 00:03:26,540 Veña, Jess. 83 00:03:26,540 --> 00:03:29,180 Se non lle importa, temos que poñer o Google Vidro en ti para que poidamos 84 00:03:29,180 --> 00:03:30,430 inmortalizar este. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 OK, vidro. 87 00:03:34,670 --> 00:03:37,250 Gravar un vídeo. 88 00:03:37,250 --> 00:03:43,103 E Aceptar, somos bos para ir con Jess aquí. 89 00:03:43,103 --> 00:03:43,810 Todo ben. 90 00:03:43,810 --> 00:03:45,120 Pracer en coñece lo. 91 00:03:45,120 --> 00:03:47,720 >> Entón o que me gustaría facer aquí - se puidese, moi rapidamente - 92 00:03:47,720 --> 00:03:51,040 só nós derrama metade dun vaso de laranxa zume e medio vaso de leite, 93 00:03:51,040 --> 00:03:55,710 representar efectivamente os números 1 nun vaso e dous no outro vaso. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Isto vai ser bo filmación. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> Jess: Sentímolo. 98 00:04:05,860 --> 00:04:06,330 >> DAVID Malan: Non, non. 99 00:04:06,330 --> 00:04:08,703 É Aceptar. 100 00:04:08,703 --> 00:04:10,120 Niza. 101 00:04:10,120 --> 00:04:12,950 Todo ben, entón temos catro bytes pena de zume de laranxa. 102 00:04:12,950 --> 00:04:14,460 Imos chamou o valor 1. 103 00:04:14,460 --> 00:04:16,579 Agora, catro bytes por valor de leite. 104 00:04:16,579 --> 00:04:18,519 Vai chamalo de valor 2. 105 00:04:18,519 --> 00:04:20,440 Así, X e Y, respectivamente. 106 00:04:20,440 --> 00:04:23,450 >> Todo ben, agora a tarefa á man - para ti, Jess, diante de todos 107 00:04:23,450 --> 00:04:24,270 dos seus compañeiros - 108 00:04:24,270 --> 00:04:28,510 é cambiar os valores de x e y tales que queremos que o zume de laranxa no 109 00:04:28,510 --> 00:04:32,070 outro vaso e do leite neste vaso, como quizais ti - antes de que realmente fai 110 00:04:32,070 --> 00:04:34,020 el - vai facer sobre iso? 111 00:04:34,020 --> 00:04:35,220 >> OK, sabia decisión. 112 00:04:35,220 --> 00:04:36,340 Entón tes que de un pouco máis de memoria. 113 00:04:36,340 --> 00:04:38,190 Entón, imos reservar un temporal vaso, se quere. 114 00:04:38,190 --> 00:04:40,540 E agora proceder a cambiar xe y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Excelente. 117 00:04:53,530 --> 00:04:54,420 Entón, moi ben feito. 118 00:04:54,420 --> 00:04:55,670 Moitas grazas, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Aquí está. 121 00:05:00,020 --> 00:05:01,950 Unha pequena lembranza. 122 00:05:01,950 --> 00:05:04,350 >> OK, entón, obviamente, super sinxelo idea. 123 00:05:04,350 --> 00:05:07,500 Totalmente intuitiva que necesitamos algo máis espazo de almacenamento - deste xeito, 124 00:05:07,500 --> 00:05:09,750 un vaso - se realmente queren intercambiar estas dúas variables. 125 00:05:09,750 --> 00:05:11,110 Entón, imos facer exactamente isto. 126 00:05:11,110 --> 00:05:14,330 Ata aquí no medio onde eu afirmo que eu son vai facer algún troco, eu vou 127 00:05:14,330 --> 00:05:15,720 dalle declarar temporal. 128 00:05:15,720 --> 00:05:17,980 E eu vou define-lo igual a, digamos, x. 129 00:05:17,980 --> 00:05:21,110 >> Entón eu vou para modificar o valor de x só como Jess fixo aquí co 130 00:05:21,110 --> 00:05:23,200 leite e zume de laranxa ser igual a y. 131 00:05:23,200 --> 00:05:27,460 E eu vou cambiar y ser igual non x, porque agora estariamos 132 00:05:27,460 --> 00:05:29,530 preso nun círculo, senón temporais. 133 00:05:29,530 --> 00:05:33,170 Onde temporalmente - ou onde Jess temporalmente poñer o zume de laranxa 134 00:05:33,170 --> 00:05:35,460 ante sobrepasar que cunca co leite. 135 00:05:35,460 --> 00:05:37,250 >> Entón deixe-me ir adiante agora e facelo. 136 00:05:37,250 --> 00:05:39,210 Chámase noswap.c. 137 00:05:39,210 --> 00:05:41,190 E agora déixeme correr sen intercambio. 138 00:05:41,190 --> 00:05:43,910 E, de feito vexo, se eu ampliar a fiestra un pouco, que 139 00:05:43,910 --> 00:05:45,160 x é 1, y é 2. 140 00:05:45,160 --> 00:05:47,230 E entón x é 2, y é 1. 141 00:05:47,230 --> 00:05:51,910 >> Pero lembre que o luns fixemos cousas un pouco diferente en que eu 142 00:05:51,910 --> 00:05:56,760 en vez aplicada unha función auxiliar, se, que era, en realidade baleiro. 143 00:05:56,760 --> 00:05:58,010 Liguei para el cambiar. 144 00:05:58,010 --> 00:06:01,600 Eu dei-lle dous parámetros, e eu chamei Lles un e liguei para eles b. 145 00:06:01,600 --> 00:06:04,380 >> Francamente, eu podería chamalos de xe y. 146 00:06:04,380 --> 00:06:06,040 Non hai nada que impida me de facelo. 147 00:06:06,040 --> 00:06:08,140 Pero eu diría que é, a continuación, algo ambigua. 148 00:06:08,140 --> 00:06:11,910 Porque recordo para o luns que nos argumentou que estes parámetros foron 149 00:06:11,910 --> 00:06:13,650 copias dos valores pasados ​​dentro 150 00:06:13,650 --> 00:06:15,640 Polo que só move co seu mente, eu creo que, se usa 151 00:06:15,640 --> 00:06:17,370 exactamente as mesmas variables. 152 00:06:17,370 --> 00:06:20,150 >> Entón, eu vou chamalos dunha vez eb, só por razóns de claridade. 153 00:06:20,150 --> 00:06:21,840 Pero poderíamos chamalos máis calquera cousa que queiramos. 154 00:06:21,840 --> 00:06:26,280 E eu vou copiar e pegar eficazmente este código alí de arriba 155 00:06:26,280 --> 00:06:27,170 baixo en aquí. 156 00:06:27,170 --> 00:06:29,110 Porque eu só vin que funciona. 157 00:06:29,110 --> 00:06:30,790 Entón, iso é en moi boa forma. 158 00:06:30,790 --> 00:06:37,390 E eu vou cambiar o meu x para un, o meu x a un, a miña y ab e meu y ab. 159 00:06:37,390 --> 00:06:39,130 >> Polo tanto, noutras palabras, exactamente a mesma lóxica. 160 00:06:39,130 --> 00:06:40,850 O mesmo que Jess fixo. 161 00:06:40,850 --> 00:06:44,350 E entón o único que teño que facer-se aquí, por suposto, está agora invocar esta 162 00:06:44,350 --> 00:06:45,990 función, ou ligue para esa función. 163 00:06:45,990 --> 00:06:50,430 Entón eu vou chamar esa función con dous insumos, x e y, e bateu en Gardar. 164 00:06:50,430 --> 00:06:52,300 >> Todo ben, entón fundamentalmente o mesmo. 165 00:06:52,300 --> 00:06:55,570 En realidade, eu probablemente xa fixo o programa innecesariamente complexa por 166 00:06:55,570 --> 00:07:00,820 escribir unha función que só está tomando preto de seis liñas de código, mentres eu 167 00:07:00,820 --> 00:07:02,970 anteriormente había aplicado isto en só tres. 168 00:07:02,970 --> 00:07:06,230 >> Entón deixe-me ir adiante agora e refacer tanto, non fan intercambio. 169 00:07:06,230 --> 00:07:07,920 Todo ben, eu estraguei todo aquí. 170 00:07:07,920 --> 00:07:11,290 Este debe ser un erro que se pode ver cada vez máis comunmente como a súa 171 00:07:11,290 --> 00:07:12,380 programas se fan máis complexas. 172 00:07:12,380 --> 00:07:13,470 Pero hai unha reparación doado. 173 00:07:13,470 --> 00:07:15,650 Déixeme rolar para atrás ata aquí. 174 00:07:15,650 --> 00:07:18,190 >> E o que é o primeiro erro que eu estou a ver? 175 00:07:18,190 --> 00:07:19,520 Declaración implícita. 176 00:07:19,520 --> 00:07:21,466 O que significa que normalmente indican? 177 00:07:21,466 --> 00:07:22,830 Oh, eu esquezo o prototipo. 178 00:07:22,830 --> 00:07:26,900 Esquecín de ensinar o compilador que cambio vai existir, aínda que 179 00:07:26,900 --> 00:07:28,920 non existe en principio do programa. 180 00:07:28,920 --> 00:07:35,780 Entón, eu só vou dicir nula, intercambio, int, un int b, punto e coma. 181 00:07:35,780 --> 00:07:37,280 >> Entón, eu non estou indo a reimplementar lo. 182 00:07:37,280 --> 00:07:39,140 Pero agora coincide co que está aquí debaixo. 183 00:07:39,140 --> 00:07:42,530 E noten, a ausencia de un punto e coma aquí, o que non é necesario cando 184 00:07:42,530 --> 00:07:43,200 de execución. 185 00:07:43,200 --> 00:07:46,010 >> Entón deixe-me refacer esta, non fan intercambio. 186 00:07:46,010 --> 00:07:46,910 Moito mellor forma. 187 00:07:46,910 --> 00:07:48,130 Realizar sen intercambio. 188 00:07:48,130 --> 00:07:48,740 E dane-se. 189 00:07:48,740 --> 00:07:51,650 Agora estamos de volta onde estabamos o luns, onde a cousa non cambiar. 190 00:07:51,650 --> 00:07:55,410 >> E cal é a explicación intuitiva por que ese é o caso? 191 00:07:55,410 --> 00:07:56,380 Si? 192 00:07:56,380 --> 00:07:57,630 >> Estudante: [inaudível]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID Malan: Exactamente. 195 00:08:05,230 --> 00:08:07,330 Así, a e b son copias de xe y. 196 00:08:07,330 --> 00:08:10,680 E, de feito, en calquera momento que estivo chamar a unha función, de momento, que 197 00:08:10,680 --> 00:08:12,540 pasa variables como ints - 198 00:08:12,540 --> 00:08:14,470 só como intercambio está esperando aquí - 199 00:08:14,470 --> 00:08:16,270 Vostedes foron pasando copias. 200 00:08:16,270 --> 00:08:19,150 >> Agora, iso significa que ten un pouco de tempo, unha fracción de segundo, a 201 00:08:19,150 --> 00:08:23,270 ordenador para copiar os bits dun variable para os bits de outro. 202 00:08:23,270 --> 00:08:24,610 Pero iso non é un negocio tan grande. 203 00:08:24,610 --> 00:08:25,920 Pero son, con todo unha copia. 204 00:08:25,920 --> 00:08:30,020 >> E agora, no contexto de intercambio, Eu son de feito correctamente 205 00:08:30,020 --> 00:08:31,180 cambiando a e b. 206 00:08:31,180 --> 00:08:33,000 De feito, imos facer un rápido proba de sanidade. 207 00:08:33,000 --> 00:08:36,830 Imprimir un f é% i, a nova liña. 208 00:08:36,830 --> 00:08:38,770 E ficha imos nun. 209 00:08:38,770 --> 00:08:41,830 Agora imos facer o mesmo con b. 210 00:08:41,830 --> 00:08:43,640 E imos facer o mesmo aquí. 211 00:08:43,640 --> 00:08:47,260 >> E agora, déixeme copiar as mesmas liñas de novo na parte inferior da función 212 00:08:47,260 --> 00:08:51,250 despois dos meus tres liñas de interesante podería executado, e 213 00:08:51,250 --> 00:08:53,270 imprimir a eb novo. 214 00:08:53,270 --> 00:08:56,030 Entón agora imos facelo, non fan intercambio. 215 00:08:56,030 --> 00:08:58,430 Deixe-me facer a xanela da terminal dun pouco máis alto, para que poidamos ver 216 00:08:58,430 --> 00:08:59,520 máis dunha vez. 217 00:08:59,520 --> 00:09:00,860 >> E realizar ningún intercambio. 218 00:09:00,860 --> 00:09:04,000 x é 1, y é 2. a é 1, b é 2. 219 00:09:04,000 --> 00:09:06,070 E, a continuación, o é 2, b é 1. 220 00:09:06,070 --> 00:09:09,390 Entón, el está a traballar, así como Jess fixen aquí dentro de intercambio. 221 00:09:09,390 --> 00:09:13,090 Pero, por suposto, está tendo ningún efecto sobre as variables de inicio. 222 00:09:13,090 --> 00:09:15,360 >> Entón vimos un truco polo cal podería solucionar isto, non? 223 00:09:15,360 --> 00:09:19,560 Cando se depara con este ámbito problema, podería só punto e facer x 224 00:09:19,560 --> 00:09:22,400 e y que tipo de variables en canto? 225 00:09:22,400 --> 00:09:23,390 >> Podería tornalos global. 226 00:09:23,390 --> 00:09:27,560 Pon-os na parte superior do arquivo como fixemos, mentres que no xogo da 15. 227 00:09:27,560 --> 00:09:28,890 Usamos unha variable global. 228 00:09:28,890 --> 00:09:32,420 Pero no contexto dun partido 15, é razoable ter un mundial 229 00:09:32,420 --> 00:09:37,170 variable que representa o consello, porque a totalidade de todos é 15.c 230 00:09:37,170 --> 00:09:38,650 sobre a aplicación deste xogo. 231 00:09:38,650 --> 00:09:41,470 Iso é o que existe no arquivo para facer. 232 00:09:41,470 --> 00:09:44,170 >> Pero, neste caso aquí, eu son chamando un intercambio de función. 233 00:09:44,170 --> 00:09:45,380 Quero cambiar dúas variables. 234 00:09:45,380 --> 00:09:48,950 E iso debe comezar a sentir só desleixado a solución para todos os nosos 235 00:09:48,950 --> 00:09:51,300 problemas cando son executados no ámbito cuestións é facelo global. 236 00:09:51,300 --> 00:09:54,730 Debido moi rapidamente noso programa é vai facer unha gran desorde. 237 00:09:54,730 --> 00:09:57,760 E nós fixemos iso con moita moderación como resultado, en 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Pero resulta que hai unha mellor forma completamente. 239 00:10:00,470 --> 00:10:05,600 Permítanme, en realidade, voltar e eliminar a imprimir de f, só para simplificar o código. 240 00:10:05,600 --> 00:10:09,160 E déixeme propoñer que este, de feito, é malo. 241 00:10:09,160 --> 00:10:15,990 Pero se eu, no canto de engadir algúns asteriscos e as estrelas, podo transformar isto en vez 242 00:10:15,990 --> 00:10:18,670 función en que se realmente operativo. 243 00:10:18,670 --> 00:10:25,020 >> Entón déixeme volver aquí e recoñecer dicindo asteriscos sempre é difícil, 244 00:10:25,020 --> 00:10:26,170 entón eu vou dicir estrelas. 245 00:10:26,170 --> 00:10:27,660 Vou confesar para iso. 246 00:10:27,660 --> 00:10:28,190 Todo ben. 247 00:10:28,190 --> 00:10:30,190 E agora, o que eu vou facer no seu canto? 248 00:10:30,190 --> 00:10:34,130 >> Entón, primeiro de todo, eu vou especificar que no canto de pasar un int en 249 00:10:34,130 --> 00:10:37,980 a función de intercambio, estou xa de vai dicir int estrela. 250 00:10:37,980 --> 00:10:39,170 Agora, o que a estrela indica? 251 00:10:39,170 --> 00:10:41,970 Esta é a idea de que un punteiro que Binky, o personaxe claymation, foi 252 00:10:41,970 --> 00:10:43,465 referíndose a un momento atrás. 253 00:10:43,465 --> 00:10:47,610 >> Entón, se nós dicimos int estrela, o significado isto agora é que unha non será 254 00:10:47,610 --> 00:10:49,110 pasado polo seu valor. 255 00:10:49,110 --> 00:10:50,350 El non vai ser copiado dentro 256 00:10:50,350 --> 00:10:54,700 Pola contra, a dirección é un será pasado dentro 257 00:10:54,700 --> 00:10:57,840 >> Entón, lembro que no seu ordenador é un monte de memoria, se non, 258 00:10:57,840 --> 00:10:58,760 coñecido como RAM. 259 00:10:58,760 --> 00:11:00,520 E que a RAM é só unha grupo enteiro de bytes. 260 00:11:00,520 --> 00:11:03,320 Polo tanto, se o seu Mac ou PC ten dous gigabytes, ten 2 261 00:11:03,320 --> 00:11:05,760 mil millóns de bytes de memoria. 262 00:11:05,760 --> 00:11:08,440 >> Agora imos supor que só a manter as cousas agradables e ordenada, que 263 00:11:08,440 --> 00:11:09,450 asignar unha dirección - 264 00:11:09,450 --> 00:11:10,170 un número - 265 00:11:10,170 --> 00:11:12,270 para cada byte de memoria RAM no seu computador. 266 00:11:12,270 --> 00:11:15,410 O primeiro byte das dúas millóns é polo número cero. 267 00:11:15,410 --> 00:11:18,572 O seguinte é un número de un byte, o número dous, todo o camiño cara arriba, dot dot 268 00:11:18,572 --> 00:11:20,530 punto, para preto de 2 millóns de dólares. 269 00:11:20,530 --> 00:11:23,640 >> Así, pode número de bytes de memoria no seu computador. 270 00:11:23,640 --> 00:11:26,460 Entón imos supor que isto é o que queremos dicir con un enderezo. 271 00:11:26,460 --> 00:11:31,360 Entón, cando vexo unha estrela int, o que está a suceder para ser pasado en cambio agora é o 272 00:11:31,360 --> 00:11:32,830 enderezo dun. 273 00:11:32,830 --> 00:11:37,150 Non o seu valor, pero sexa cal sexa a súa voz enderezo é, por así dicir - 274 00:11:37,150 --> 00:11:38,810 a súa localización na memoria RAM. 275 00:11:38,810 --> 00:11:41,250 >> E do mesmo xeito para b, vou para dicir o mesmo. 276 00:11:41,250 --> 00:11:42,720 Int, estrela, b. 277 00:11:42,720 --> 00:11:46,350 Como un aparte, tecnicamente a estrela podería ir en outros lugares. 278 00:11:46,350 --> 00:11:50,140 Pero imos estandarizar a estrela estar xunto ao tipo de datos. 279 00:11:50,140 --> 00:11:54,080 >> Entón cambiar sinatura significa que agora, dáme a dirección de un int, e chamada 280 00:11:54,080 --> 00:11:55,400 que un enderezo. 281 00:11:55,400 --> 00:11:58,690 E darme outro enderezo dun int e chamar este enderezo b. 282 00:11:58,690 --> 00:12:01,120 >> Pero agora o meu código aquí ten que cambiar. 283 00:12:01,120 --> 00:12:03,470 Porque se eu declarar int temperatura - 284 00:12:03,470 --> 00:12:05,580 que aínda é do tipo int - 285 00:12:05,580 --> 00:12:08,700 pero gardar nel un, que tipo de valor? 286 00:12:08,700 --> 00:12:12,870 Para ser claro, eu estou poñendo un con o código como está escrito agora? 287 00:12:12,870 --> 00:12:14,360 >> Estou poñendo o lugar nun. 288 00:12:14,360 --> 00:12:16,500 Pero eu non me importa o situación agora, non? 289 00:12:16,500 --> 00:12:21,940 Temp existe só terceira cunca de Jess existir, para que finalidade? 290 00:12:21,940 --> 00:12:23,090 Para almacenar un valor. 291 00:12:23,090 --> 00:12:24,830 Leite ou zume de laranxa. 292 00:12:24,830 --> 00:12:28,520 Non, en realidade, almacenar o enderezo de ningunha destas cousas, que se sente un 293 00:12:28,520 --> 00:12:31,200 algo sen sentido neste certo contexto do mundo de calquera maneira. 294 00:12:31,200 --> 00:12:34,990 >> Entón, realmente, o que quero poñer en temperatura non é a dirección dun, pero a 295 00:12:34,990 --> 00:12:36,180 contido dun. 296 00:12:36,180 --> 00:12:41,930 Entón, se a é un número como 123, este é o byte 123 de memoria que un só 297 00:12:41,930 --> 00:12:45,090 pasa a ser ocupante, que o valor de en que se produza ser ocupante. 298 00:12:45,090 --> 00:12:49,040 >> Se quero ir a este enderezo, Eu teño que dicir unha estrela. 299 00:12:49,040 --> 00:12:52,610 Do mesmo xeito, se eu fose para cambiar o que é na páxina un, eu mudo 300 00:12:52,610 --> 00:12:53,570 isto para iniciar unha. 301 00:12:53,570 --> 00:12:58,185 Se eu queira gardar en que está no localización dun co que está no lugar 302 00:12:58,185 --> 00:13:02,180 en b, estrela b estrela. 303 00:13:02,180 --> 00:13:05,340 >> Así, en breve, aínda que iso non é moi afundindo aínda - e eu non esperaría 304 00:13:05,340 --> 00:13:06,560 que sería tan rápido - 305 00:13:06,560 --> 00:13:11,100 entender que todo o que eu estou facendo é prefixar estas estrelas para os meus variables, 306 00:13:11,100 --> 00:13:13,350 dicindo que non incorporarse os valores. 307 00:13:13,350 --> 00:13:14,520 Non cambiar os valores. 308 00:13:14,520 --> 00:13:17,600 Pero, si, ir a eses enderezos e obter o valor. 309 00:13:17,600 --> 00:13:21,430 Ir a este enderezo e cambio o valor aí. 310 00:13:21,430 --> 00:13:25,500 >> Entón, agora déixeme rolar para atrás ata o cumio, só para corrixir esta liña aquí, a 311 00:13:25,500 --> 00:13:27,690 cambiar o prototipo para corresponden. 312 00:13:27,690 --> 00:13:30,280 Pero agora eu teño que facer unha cousa. 313 00:13:30,280 --> 00:13:35,500 Intuitivamente, se eu mudei tipo intercambio de argumentos que está esperando, 314 00:13:35,500 --> 00:13:37,245 o que máis me teño cambiar o meu código? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Cando eu chamo de intercambio. 317 00:13:40,840 --> 00:13:43,340 Por agora, o que máis me Eu pasando a cambiar aínda? 318 00:13:43,340 --> 00:13:47,450 O valor de x e o valor de y, ou leite e zume de laranxa. 319 00:13:47,450 --> 00:13:48,510 Pero eu non quero facelo. 320 00:13:48,510 --> 00:13:51,060 Eu no canto quere pasar en que? 321 00:13:51,060 --> 00:13:53,050 A localización de xe o lugar de y. 322 00:13:53,050 --> 00:13:55,300 Cales son os seus enderezos postais, por así dicir. 323 00:13:55,300 --> 00:13:57,600 >> Entón, para facelo, hai un e comercial. 324 00:13:57,600 --> 00:13:59,260 Ampersand tipo de sons como o enderezo. 325 00:13:59,260 --> 00:14:03,240 así n, comercial, a dirección de x, e o enderezo de Y. 326 00:14:03,240 --> 00:14:06,790 Por iso é deliberado que usan ampersands ao chamar a función, 327 00:14:06,790 --> 00:14:10,230 e as estrelas cando declarar e cando execución da función. 328 00:14:10,230 --> 00:14:14,220 >> E só de pensar e comercial como o dirección do operador, e unha estrela como o 329 00:14:14,220 --> 00:14:15,490 ir alí operador - 330 00:14:15,490 --> 00:14:18,640 ou, máis correctamente, o Operador de referencia. 331 00:14:18,640 --> 00:14:23,480 Entón, iso é unha chea de palabras só para dicir que agora, por sorte, cambio vai 332 00:14:23,480 --> 00:14:24,440 sendo correctas. 333 00:14:24,440 --> 00:14:26,550 >> Déixeme ir adiante e facer - 334 00:14:26,550 --> 00:14:30,940 imos realmente cambiar o nome do ficheiro, para que non este programa aínda ser chamado sen intercambio. 335 00:14:30,940 --> 00:14:33,240 Eu afirmo que imos chamalo swap.c agora. 336 00:14:33,240 --> 00:14:35,670 Entón faga, cambie. 337 00:14:35,670 --> 00:14:37,520 Dot, Slash, cambie. 338 00:14:37,520 --> 00:14:40,210 >> E agora feito, x é 1, y é 2. 339 00:14:40,210 --> 00:14:44,040 E entón, x é 2, y é un. 340 00:14:44,040 --> 00:14:46,500 Ben, imos ver se non podemos facelo un pouco diferente, como o que se 341 00:14:46,500 --> 00:14:47,180 pasando aquí. 342 00:14:47,180 --> 00:14:51,250 En primeiro lugar, deixe-me achegar na nosa pantalla de deseño aquí. 343 00:14:51,250 --> 00:14:54,160 E déixeme propoñer por un momento - e cada vez que chamar aquí será espello 344 00:14:54,160 --> 00:14:58,660 alí enriba agora - déixeme propoñer que aquí está unha morea de memoria, ou 345 00:14:58,660 --> 00:15:00,540 RAM, dentro do meu ordenador. 346 00:15:00,540 --> 00:15:04,140 >> E este será o número mordida, digamos, un. 347 00:15:04,140 --> 00:15:05,720 Este será o número 2 bytes. 348 00:15:05,720 --> 00:15:08,220 E eu vou facer unha chea de outras, e logo, un grupo de Dot Dot puntos para 349 00:15:08,220 --> 00:15:10,880 indican que hai 2 millóns destas cousas. 350 00:15:10,880 --> 00:15:13,520 4, 5 e así por diante. 351 00:15:13,520 --> 00:15:17,055 >> Polo tanto, hai os cinco primeiros bytes de memoria do meu ordenador. 352 00:15:17,055 --> 00:15:17,560 Todo ben? 353 00:15:17,560 --> 00:15:19,060 Moi poucos de 2 millóns de dólares. 354 00:15:19,060 --> 00:15:21,120 Pero agora eu vou propoñer a continuación. 355 00:15:21,120 --> 00:15:27,490 Vou propoñer que x vai almacenar o número 1, e y vai 356 00:15:27,490 --> 00:15:29,690 para almacenar o número 2. 357 00:15:29,690 --> 00:15:35,000 E déixeme ir adiante agora e representa estes valores como segue. 358 00:15:35,000 --> 00:15:41,510 >> Imos facelo do seguinte xeito. 359 00:15:41,510 --> 00:15:42,870 Déame só un segundo. 360 00:15:42,870 --> 00:15:44,150 Un segundo. 361 00:15:44,150 --> 00:15:45,680 Aceptar. 362 00:15:45,680 --> 00:15:47,560 Quero facelo un pouco - 363 00:15:47,560 --> 00:15:50,440 imos facelo de novo. 364 00:15:50,440 --> 00:15:53,250 Se non, eu vou e usando o mesmos números, sen querer, 365 00:15:53,250 --> 00:15:54,230 varias veces. 366 00:15:54,230 --> 00:15:57,320 >> Entón, só por iso temos números diferentes para falar, imos chamar iso de byte 367 00:15:57,320 --> 00:16:03,391 número 123, 124, 125, 126, e dot dot dot. 368 00:16:03,391 --> 00:16:08,400 E déixeme afirmar agora que vou poñer o valor 1 aquí, e o valor de 2 369 00:16:08,400 --> 00:16:11,990 aquí, tamén coñecido como xe y. 370 00:16:11,990 --> 00:16:15,300 Entón, resulta que este é x, é dicir y. 371 00:16:15,300 --> 00:16:18,180 >> E só por algún azar, o ordenador, o sistema operativo, 372 00:16:18,180 --> 00:16:21,890 pasou a poñer x no lugar número 123. 373 00:16:21,890 --> 00:16:25,590 E y acabou no lugar 124 - 374 00:16:25,590 --> 00:16:26,330 caramba. 375 00:16:26,330 --> 00:16:28,700 Eu debería ter corrixido iso. 376 00:16:28,700 --> 00:16:34,040 Oh home, que eu realmente quero facer iso? 377 00:16:34,040 --> 00:16:37,340 Si, quero corrixir isto e b adecuada sobre iso hoxe. 378 00:16:37,340 --> 00:16:39,950 Sentímolo, novo nisto. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, e eu non quero ser esa complexo, pero por que eu cambiar o 380 00:16:45,020 --> 00:16:46,340 números alí? 381 00:16:46,340 --> 00:16:48,360 Porque quero que os ints para en realidade, ser de catro bytes. 382 00:16:48,360 --> 00:16:49,810 Entón, imos ser super anal sobre iso. 383 00:16:49,810 --> 00:16:53,800 Así, se un pasa a ser dirixido 123, o 2 será no enderezo 384 00:16:53,800 --> 00:16:55,730 127, porque iso é só 4 despedidas distancia. 385 00:16:55,730 --> 00:16:56,210 Isto é todo. 386 00:16:56,210 --> 00:16:58,640 E imos esquecer todo o outros enderezos do mundo. 387 00:16:58,640 --> 00:17:03,320 >> Así x está na posición 123, Y está na posición 127. 388 00:17:03,320 --> 00:17:05,770 E agora, o que realmente quere facer? 389 00:17:05,770 --> 00:17:10,099 Cando eu chamo de intercambio agora, o que é realmente está a suceder? 390 00:17:10,099 --> 00:17:14,920 Ben, cando eu chamo de intercambio, eu estou pasando en o enderezo de X e o enderezo de Y. 391 00:17:14,920 --> 00:17:18,540 Así, por exemplo, se estas dúas pezas de papel representan agora os dous 392 00:17:18,540 --> 00:17:23,510 argumentos a eb para intercambiar, o que eu son indo a escribir na primeira delas, 393 00:17:23,510 --> 00:17:27,720 que eu vou chamar ao refiren como un? 394 00:17:27,720 --> 00:17:30,610 >> Exactamente, 123. 395 00:17:30,610 --> 00:17:31,905 Entón, iso eu afirmo é un. 396 00:17:31,905 --> 00:17:32,955 Este é un parámetro. 397 00:17:32,955 --> 00:17:35,856 Estou poñendo a dirección de x alí. 398 00:17:35,856 --> 00:17:38,152 >> ¿Que é iso? 399 00:17:38,152 --> 00:17:40,890 >> ¿Que é iso? 400 00:17:40,890 --> 00:17:41,190 >> Non, non. 401 00:17:41,190 --> 00:17:41,720 Iso é OK. 402 00:17:41,720 --> 00:17:42,570 Menos mal, menos mal. 403 00:17:42,570 --> 00:17:43,530 Polo tanto, este é un. 404 00:17:43,530 --> 00:17:46,240 E agora o segundo anaco de papel, este será b, e que son eu 405 00:17:46,240 --> 00:17:49,010 será escrita en este anaco de papel? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Entón o único que cambiou desde noso entendemento anterior desta historia é, 408 00:17:53,720 --> 00:17:58,590 ao contrario de, literalmente, un e dous, eu son vai pasar en 123 e 127. 409 00:17:58,590 --> 00:18:02,130 E eu estou indo agora para poñer-los dentro desta caixa, non? 410 00:18:02,130 --> 00:18:04,640 Así que a caixa negra representa agora a función de intercambio. 411 00:18:04,640 --> 00:18:07,230 >> Mentres tanto, imos agora ter alguén aplicar a función de intercambio. 412 00:18:07,230 --> 00:18:09,090 Será que alguén aquí quere ser voluntario? 413 00:18:09,090 --> 00:18:09,560 Imos para arriba. 414 00:18:09,560 --> 00:18:11,080 Cal é o seu nome? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Todo ben, Charlie. 417 00:18:12,080 --> 00:18:14,810 Imos para arriba. 418 00:18:14,810 --> 00:18:17,310 >> Entón, Charlie vai xogar o papel da nosa caixa negra. 419 00:18:17,310 --> 00:18:21,460 E Charlie, o que me gustaría que faga agora é aplicar intercambio de tal xeito 420 00:18:21,460 --> 00:18:25,320 que, dado os dous enderezos, estaba indo realmente 421 00:18:25,320 --> 00:18:26,330 para cambiar os valores. 422 00:18:26,330 --> 00:18:28,290 E eu vou sussurra no seu oído como realizar a TV aquí. 423 00:18:28,290 --> 00:18:29,930 >> Entón vai adiante, e é a caixa negra. 424 00:18:29,930 --> 00:18:30,920 Chegar alí. 425 00:18:30,920 --> 00:18:34,054 Que valores ve un, e os valores que aparecen para b? 426 00:18:34,054 --> 00:18:36,740 >> Nash: o é 123 eb é 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID Malan: OK, exactamente. 428 00:18:37,530 --> 00:18:38,940 Agora, hai unha pausa por un momento. 429 00:18:38,940 --> 00:18:41,680 O primeiro que vai facer agora, segundo o código - que 430 00:18:41,680 --> 00:18:43,220 Agora eu vou puxar arriba na pantalla - 431 00:18:43,220 --> 00:18:46,750 será para reservar un pouco bits de memoria chamado Temp. 432 00:18:46,750 --> 00:18:48,850 Entón, eu estou indo a ir adiante e darlle a memoria. 433 00:18:48,850 --> 00:18:52,210 >> Entón, iso vai ser unha terceira variable que ten acceso a 434 00:18:52,210 --> 00:18:54,080 ten chamado Temp. 435 00:18:54,080 --> 00:18:57,120 E o que vai escribir o anaco de papel temporal? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> Charlie: Punteiros, non? 438 00:19:03,470 --> 00:19:04,790 >> DAVID Malan: OK, así, non necesariamente punteiros. 439 00:19:04,790 --> 00:19:07,230 Así, a liña de código que eu teño destaque no lado dereito, 440 00:19:07,230 --> 00:19:07,900 imos comezar por aí. 441 00:19:07,900 --> 00:19:08,890 Di que unha estrela. 442 00:19:08,890 --> 00:19:11,670 Así, unha está almacenando o número 123. 443 00:19:11,670 --> 00:19:16,660 E, así, intuitivamente, o que que estrela 123 significa? 444 00:19:16,660 --> 00:19:21,630 >> Pero especialmente, se é un 123, unha estrela significa o que? 445 00:19:21,630 --> 00:19:22,560 O valor dun. 446 00:19:22,560 --> 00:19:24,580 Ou, máis casual, vaia alí. 447 00:19:24,580 --> 00:19:28,620 Entón deixe-me propor que, sostendo a unha en súa man, vai adiante e tratar este 448 00:19:28,620 --> 00:19:29,430 coma se fose un mapa. 449 00:19:29,430 --> 00:19:32,940 E camiñar-se para o ordenador do memoria, e atopar-nos o que é 450 00:19:32,940 --> 00:19:36,520 na posición 123. 451 00:19:36,520 --> 00:19:37,720 Exactamente. 452 00:19:37,720 --> 00:19:41,100 >> Así, podemos ver na posición 123 é o que, obviamente,? 453 00:19:41,100 --> 00:19:44,240 OK, entón o valor agora é vostede vai poñer en temperatura? 454 00:19:44,240 --> 00:19:44,750 Exactamente. 455 00:19:44,750 --> 00:19:45,600 Entón vai adiante e facelo. 456 00:19:45,600 --> 00:19:51,280 E escriba o número 1 no anaco de papel que está actualmente titulada temporal. 457 00:19:51,280 --> 00:19:53,540 >> E agora o seguinte paso que está indo a aplicar 458 00:19:53,540 --> 00:19:54,310 será o que. 459 00:19:54,310 --> 00:19:57,820 Pois ben, no lado dereito da seguinte liña de código é a estrela b. b, de 460 00:19:57,820 --> 00:19:59,260 Por suposto, almacena un enderezo. 461 00:19:59,260 --> 00:20:02,270 Que aborda 127. 462 00:20:02,270 --> 00:20:06,620 Estrela b significa que, casualmente falando? 463 00:20:06,620 --> 00:20:08,700 >> Ir a este local. 464 00:20:08,700 --> 00:20:14,988 Entón vai adiante e atopar-nos o que é na posición 127. 465 00:20:14,988 --> 00:20:15,480 Aceptar. 466 00:20:15,480 --> 00:20:19,170 Claro que, na posición 127, aínda é o valor 2. 467 00:20:19,170 --> 00:20:24,060 Entón, o que está indo agora en tenda o que está no lugar nun? 468 00:20:24,060 --> 00:20:26,860 Entón, estrela contorna ir ao lugar a. 469 00:20:26,860 --> 00:20:29,770 Cal é a localización de un? 470 00:20:29,770 --> 00:20:30,430 >> Exactamente. 471 00:20:30,430 --> 00:20:34,190 Entón, agora, se quere cambiar o que está nese lugar - 472 00:20:34,190 --> 00:20:36,470 Eu vou adiante e executar a goma está aquí. 473 00:20:36,470 --> 00:20:37,760 E agora poñelas de novo na cepillo. 474 00:20:37,760 --> 00:20:42,190 Cal é o número que vai escribir no cadro en branco agora? 475 00:20:42,190 --> 00:20:42,850 >> Exactamente. 476 00:20:42,850 --> 00:20:46,470 Polo tanto, esta liña de código, para ser claro - imos me deter o que Charlie está facendo e 477 00:20:46,470 --> 00:20:51,730 destacar aquí, que acaba de facer é escribir para a caixa no lugar 123 478 00:20:51,730 --> 00:20:55,150 O valor que se anteriormente en b. 479 00:20:55,150 --> 00:20:59,140 E así temos agora aplicada de traxe Nesta segunda liña de código. 480 00:20:59,140 --> 00:21:01,920 >> Agora, por desgraza, non hai aínda unha liña restante. 481 00:21:01,920 --> 00:21:04,900 Agora o que está en temp literalmente? 482 00:21:04,900 --> 00:21:06,200 É evidente que é o número un. 483 00:21:06,200 --> 00:21:07,020 Isto non é un enderezo. 484 00:21:07,020 --> 00:21:09,380 É só un número, unha especie de unha variable a partir dunha semana. 485 00:21:09,380 --> 00:21:13,520 >> E agora, cando di estrela b, o que significa ir ao enderezo de b, que é de 486 00:21:13,520 --> 00:21:15,090 curso aquí. 487 00:21:15,090 --> 00:21:16,020 Entón, cando chegar alí - 488 00:21:16,020 --> 00:21:18,320 Eu vou adiante e eliminar o que é realmente alí - e que é vostede 489 00:21:18,320 --> 00:21:20,820 vai escribir agora en 127 localización? 490 00:21:20,820 --> 00:21:22,010 >> Charlie: Temp, que é un. 491 00:21:22,010 --> 00:21:23,430 >> DAVID Malan: Temp, que é un. 492 00:21:23,430 --> 00:21:25,670 E o que pasa a temperatura ao final? 493 00:21:25,670 --> 00:21:26,600 Ben, nós realmente non sabemos. 494 00:21:26,600 --> 00:21:27,420 Nós realmente non me importa. 495 00:21:27,420 --> 00:21:31,090 Cada vez que nós Implementar unha función ata o momento, as variables locais ten 496 00:21:31,090 --> 00:21:31,890 son, de feito local. 497 00:21:31,890 --> 00:21:33,060 E eles simplemente desaparecen. 498 00:21:33,060 --> 00:21:35,040 Están recuperados pola operación sistema eventualmente. 499 00:21:35,040 --> 00:21:39,800 >> Así, o feito de que aínda ten a temperatura valor 1 é unha especie de fundamentalmente 500 00:21:39,800 --> 00:21:41,150 desinteressante para nós. 501 00:21:41,150 --> 00:21:43,100 Todo ben, entón unha salva de palmas se puidésemos a Charlie. 502 00:21:43,100 --> 00:21:46,400 Moi ben feito. 503 00:21:46,400 --> 00:21:51,520 >> Todo ben, entón o que máis fai Isto significa que podemos facer? 504 00:21:51,520 --> 00:21:54,400 Así, verifícase que fomos contando algunhas mentirinhas 505 00:21:54,400 --> 00:21:55,540 por algún tempo. 506 00:21:55,540 --> 00:21:59,990 De feito, parece que a corda, todo este tempo, non é realmente un 507 00:21:59,990 --> 00:22:02,190 secuencia de caracteres por si só. 508 00:22:02,190 --> 00:22:03,980 É o tipo de é que intuitivamente. 509 00:22:03,980 --> 00:22:08,270 >> Pero, técnicamente falando, a cadea é unha tipo de datos que declarada dentro 510 00:22:08,270 --> 00:22:12,170 a biblioteca CS50 para simplificar o mundo para as primeiras semanas de clase. 511 00:22:12,170 --> 00:22:20,130 O que unha cadea é realmente é o enderezo dun personaxe en algún lugar na RAM. 512 00:22:20,130 --> 00:22:25,530 A corda é realmente un número, como 123 ou 127, que pasa a demarcar 513 00:22:25,530 --> 00:22:28,420 onde unha cadea comeza en a memoria do seu ordenador. 514 00:22:28,420 --> 00:22:31,870 >> Pero isto non supón a cadea, por si só, en si. 515 00:22:31,870 --> 00:22:33,460 E podemos ver iso do seguinte xeito. 516 00:22:33,460 --> 00:22:35,980 Déixeme ir adiante e abrir un código que está entre 517 00:22:35,980 --> 00:22:38,340 exemplos de código fonte de hoxe. 518 00:22:38,340 --> 00:22:42,225 E eu estou indo a ir adiante e abrir ata, digamos, compárese 0.C. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Este é un programa buggy que vai para ser aplicada como segue. 521 00:22:48,790 --> 00:22:49,040 >> First. 522 00:22:49,040 --> 00:22:50,420 Eu vou dicir unha cousa. 523 00:22:50,420 --> 00:22:52,660 Entón, eu estou indo a ir adiante e obter unha cadea do usuario 524 00:22:52,660 --> 00:22:53,750 nesa liña seguinte. 525 00:22:53,750 --> 00:22:55,370 Entón eu vou dicilo de novo. 526 00:22:55,370 --> 00:22:57,540 Entón eu vou ter outra corda do usuario. 527 00:22:57,540 --> 00:23:00,390 >> E noten, eu estou mostrando un dos cordas nunha variable chamada s, e 528 00:23:00,390 --> 00:23:03,040 outra desas cordas nunha variable chamada t. 529 00:23:03,040 --> 00:23:07,480 E agora vou reclamar, moi razoablemente, que se s é igual é igual a t, 530 00:23:07,480 --> 00:23:08,940 as cordas son as mesmas. 531 00:23:08,940 --> 00:23:09,970 Escribe o mesmo. 532 00:23:09,970 --> 00:23:11,830 En caso contrario, as cordas son non é o mesmo. 533 00:23:11,830 --> 00:23:15,440 >> Despois de todo, a entrada de dous enteiros, dous caracteres, dúas carrozas, dous dobres, todos de 534 00:23:15,440 --> 00:23:18,400 tipo de datos que falamos ata agora para comparalos-los - 535 00:23:18,400 --> 00:23:22,070 lembro que fixemos moi claro hai un tempo atrás que non facelo, porque a 536 00:23:22,070 --> 00:23:25,840 único signo de igualdade é, por suposto, o operador de asignación. 537 00:23:25,840 --> 00:23:26,820 Entón, iso sería un erro. 538 00:23:26,820 --> 00:23:29,260 >> Usamos o signo igual xeito, que de feito se compara 539 00:23:29,260 --> 00:23:31,050 cousas para unha verdadeira igualdade. 540 00:23:31,050 --> 00:23:32,275 Pero eu afirmo que é buggy. 541 00:23:32,275 --> 00:23:37,400 Se eu ir adiante e facer comparar cero, e entón non dot barra comparar cero. 542 00:23:37,400 --> 00:23:39,700 E eu escribir, imos dicir, Olá 543 00:23:39,700 --> 00:23:41,590 E entón, imos dicir Hola de novo. 544 00:23:41,590 --> 00:23:46,040 Literalmente o mesmo, o ordenador reclamacións que eu escriba cousas distintas. 545 00:23:46,040 --> 00:23:47,640 >> Agora, quizais eu só ingresaran mal algo. 546 00:23:47,640 --> 00:23:49,910 Vou escribir o meu nome neste momento. 547 00:23:49,910 --> 00:23:52,580 Quero dicir, Olá 548 00:23:52,580 --> 00:23:54,770 Olá 549 00:23:54,770 --> 00:23:57,360 É diferente a cada momento. 550 00:23:57,360 --> 00:23:58,430 >> Ben, por que isto? 551 00:23:58,430 --> 00:24:00,140 O que realmente está a suceder debaixo do capo? 552 00:24:00,140 --> 00:24:03,270 Ben, o que realmente está a suceder debaixo a portada é a cadea, a continuación, 553 00:24:03,270 --> 00:24:07,410 Eu escriba en que por primeira vez, por exemplo, é a palabra Ola, claro. 554 00:24:07,410 --> 00:24:11,660 Pero se representar esta debaixo o capó, lembre que unha 555 00:24:11,660 --> 00:24:13,470 cadea é nunha matriz. 556 00:24:13,470 --> 00:24:15,040 E nós dixemos, tanto no pasado. 557 00:24:15,040 --> 00:24:20,200 >> Entón, se eu tomar esa matriz como este, eu son vai representar algo moi 558 00:24:20,200 --> 00:24:23,030 similar ao que fixemos hai pouco. 559 00:24:23,030 --> 00:24:25,390 E hai realmente algo especial tamén. 560 00:24:25,390 --> 00:24:28,090 O que fixemos foi determinar a Ao final de cada corda? 561 00:24:28,090 --> 00:24:30,760 Si, esta barra invertida cero, o que é só a forma de representación, 562 00:24:30,760 --> 00:24:33,610 literalmente, 00000000. 563 00:24:33,610 --> 00:24:35,680 Oito bits 0 nunha fileira. 564 00:24:35,680 --> 00:24:37,610 >> Non sei, a verdade, o que é despois diso. 565 00:24:37,610 --> 00:24:40,090 Isto é só unha banda de máis memoria RAM dentro do meu ordenador. 566 00:24:40,090 --> 00:24:40,970 Pero esta é unha matriz. 567 00:24:40,970 --> 00:24:42,260 Nós falamos sobre matrices antes. 568 00:24:42,260 --> 00:24:45,010 E nós tipicamente falar matrices como localización cero, 569 00:24:45,010 --> 00:24:46,580 a continuación, un, despois dous. 570 00:24:46,580 --> 00:24:47,950 Pero isto é só por conveniencia. 571 00:24:47,950 --> 00:24:49,380 E iso é totalmente relativo. 572 00:24:49,380 --> 00:24:53,010 >> Cando está realmente quedando memoria o ordenador, é, por suposto, calquera 573 00:24:53,010 --> 00:24:55,450 2 millóns de algúns bytes impares, potencialmente. 574 00:24:55,450 --> 00:24:59,100 Entón, realmente debaixo do capó, todo este tempo, si. 575 00:24:59,100 --> 00:25:01,670 Isto pode moi ben ser o soporte cero. 576 00:25:01,670 --> 00:25:04,780 Pero se cavar aínda máis fondo baixo o capó, que é realmente 577 00:25:04,780 --> 00:25:07,000 abordar número 123. 578 00:25:07,000 --> 00:25:09,150 Este é o enderezo 124. 579 00:25:09,150 --> 00:25:11,040 Este é o enderezo 125. 580 00:25:11,040 --> 00:25:12,540 >> E eu non quería romper ese momento. 581 00:25:12,540 --> 00:25:15,840 Estes son agora unha bytes separados por que razón? 582 00:25:15,840 --> 00:25:17,930 Que grande é un char? 583 00:25:17,930 --> 00:25:19,170 Un char é só un byte. 584 00:25:19,170 --> 00:25:20,570 Un int é tipicamente catro bytes. 585 00:25:20,570 --> 00:25:24,850 É por iso que eu fixen 123, 127, 131 e así por diante. 586 00:25:24,850 --> 00:25:27,560 Agora podo manter a matemática sinxela e só facer máis 1. 587 00:25:27,560 --> 00:25:30,510 E agora é o que está realmente a suceder por baixo do capó. 588 00:25:30,510 --> 00:25:37,760 >> Entón, cando declarar algo como iso, cadea s, que é, en realidade - 589 00:25:37,760 --> 00:25:39,170 pasa - 590 00:25:39,170 --> 00:25:41,190 estrela Char. 591 00:25:41,190 --> 00:25:44,640 Star, claro, significa enderezo, punteiro aka. 592 00:25:44,640 --> 00:25:46,200 Polo tanto, é o enderezo de algo. 593 00:25:46,200 --> 00:25:47,510 Qué é o enderezo do? 594 00:25:47,510 --> 00:25:47,760 >> Ben - 595 00:25:47,760 --> 00:25:51,680 Eu son o único que pode ver o moito punto importante que eu estou facendo, ou pensan 596 00:25:51,680 --> 00:25:52,560 Eu estou facendo. 597 00:25:52,560 --> 00:25:55,270 Entón cadea - 598 00:25:55,270 --> 00:25:57,180 o triste é que eu teño un monitor alí onde 599 00:25:57,180 --> 00:25:58,100 podería ver isto. 600 00:25:58,100 --> 00:26:00,990 >> Todo ben, entón cadea s é o que Eu declarei anteriormente. 601 00:26:00,990 --> 00:26:04,600 Pero resulta que, grazas a un pouco maxia na biblioteca CS50, todo iso 602 00:26:04,600 --> 00:26:08,780 cadea de hora ten literalmente foi estrela de char. 603 00:26:08,780 --> 00:26:11,310 A estrela significa novo punteiro ou enderezo. 604 00:26:11,310 --> 00:26:14,180 O feito de que é o seguimento caracter de palabra significa que é a 605 00:26:14,180 --> 00:26:15,970 enderezo dun personaxe. 606 00:26:15,970 --> 00:26:23,100 >> Entón, se conseguir cadea chámase, e eu tecleo en H-E-L-L-O, propoñer agora o que se 607 00:26:23,100 --> 00:26:27,330 corda foi literalmente volvendo todo Neste momento, aínda que, no canto 608 00:26:27,330 --> 00:26:29,980 simplista do mundo? 609 00:26:29,980 --> 00:26:33,310 Que significa obter corda realmente volver como o seu valor de retorno? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123, neste caso, por exemplo. 612 00:26:38,720 --> 00:26:42,630 Xa dixen anteriormente que se cadea simplemente devolve unha cadea, unha secuencia de 613 00:26:42,630 --> 00:26:43,300 caracteres. 614 00:26:43,300 --> 00:26:44,790 Pero iso é un pouco de unha mentira branca. 615 00:26:44,790 --> 00:26:48,010 A forma como se cordas realmente funciona debaixo do capó é que queda a 616 00:26:48,010 --> 00:26:48,930 corda do usuario. 617 00:26:48,930 --> 00:26:51,530 El se Estatela os personaxes que el ou ela tipo de memoria. 618 00:26:51,530 --> 00:26:54,680 Ela pon un cero barra invertida ao final daqueles secuencia de caracteres. 619 00:26:54,680 --> 00:26:57,310 >> Pero entón o que se cadea literalmente volver? 620 00:26:57,310 --> 00:27:02,710 É, literalmente, retorna o enderezo do primeiros bytes en RAM que 621 00:27:02,710 --> 00:27:04,130 se usa para esa forza. 622 00:27:04,130 --> 00:27:07,500 E verifícase que só devolvendo un único enderezo da 623 00:27:07,500 --> 00:27:12,120 primeiro carácter da cadea, que é suficiente para atopar a totalidade 624 00:27:12,120 --> 00:27:12,630 a cadea. 625 00:27:12,630 --> 00:27:16,930 >> Noutras palabras, conseguir a cadea non ten para volver 123 e 124 e 125. 626 00:27:16,930 --> 00:27:19,950 Non ten que me dar un paso lista de todos os bytes 627 00:27:19,950 --> 00:27:20,740 miña corda está a usar. 628 00:27:20,740 --> 00:27:22,670 Porque un, todos eles están de volta para tras. 629 00:27:22,670 --> 00:27:28,160 E segundo, baseado na primeira dirección, I pode descubrir que a cadea remata. 630 00:27:28,160 --> 00:27:29,910 Como? 631 00:27:29,910 --> 00:27:33,490 >> O carácter nulo especial, a barra invertida cero ao final. 632 00:27:33,490 --> 00:27:35,430 Así, noutras palabras, se pasa ao redor - 633 00:27:35,430 --> 00:27:36,530 dentro das variables - 634 00:27:36,530 --> 00:27:41,300 o enderezo de un char, e asume que, ao final de calquera cadea, calquera 635 00:27:41,300 --> 00:27:45,040 secuencia de caracteres como nós, seres humanos pensar en cordas, se asumir que 636 00:27:45,040 --> 00:27:48,600 a finais de tal cadea hai un cero barra invertida, é ouro. 637 00:27:48,600 --> 00:27:52,430 Porque sempre pode atopar ao final dunha cadea. 638 00:27:52,430 --> 00:27:54,870 >> Agora o que realmente está a suceder, a continuación, en neste programa? 639 00:27:54,870 --> 00:27:59,990 ¿Por que este programa, compararse 0.C, con erros? 640 00:27:59,990 --> 00:28:01,690 O que realmente está a ser comparado? 641 00:28:01,690 --> 00:28:02,420 Si? 642 00:28:02,420 --> 00:28:05,000 >> Estudante: [inaudível]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID Malan: Exactamente. 644 00:28:05,730 --> 00:28:08,350 É comparando as posicións das cordas. 645 00:28:08,350 --> 00:28:12,420 Polo tanto, se o usuario introduciu en Ola unha vez máis, como eu fixen, a memoria pode acabar 646 00:28:12,420 --> 00:28:13,430 dese xeito. 647 00:28:13,430 --> 00:28:18,210 Se, a continuación, o usuario escribe en Ola de novo, pero chamando obter corda de novo, c é 648 00:28:18,210 --> 00:28:21,800 non é particularmente intelixente, a menos que ensina que sexa intelixente, escribindo código. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 e ordenadores en xeral - 651 00:28:23,860 --> 00:28:27,370 se escribir a palabra Ola de novo, vostede sabe o que vai conseguir. 652 00:28:27,370 --> 00:28:31,480 Vas só para ter unha segunda matriz de memoria que, si, pasa ser 653 00:28:31,480 --> 00:28:35,510 almacenar H-E-L-L-S e así por diante. 654 00:28:35,510 --> 00:28:38,240 >> Terá o mesmo aspecto de nós seres humanos, pero este enderezo 655 00:28:38,240 --> 00:28:39,460 pode non ser 123. 656 00:28:39,460 --> 00:28:42,470 El só podería acontecer que o sistema operativo ten algúns dispoñibles 657 00:28:42,470 --> 00:28:45,430 espazo, por exemplo, a localización - 658 00:28:45,430 --> 00:28:49,820 digamos que algo arbitrario, como este é lugar 200. 659 00:28:49,820 --> 00:28:51,620 E este é o lugar 201. 660 00:28:51,620 --> 00:28:53,060 E este é o lugar 202. 661 00:28:53,060 --> 00:28:55,730 Nós non temos ningunha idea de onde iso é será na memoria. 662 00:28:55,730 --> 00:28:59,110 >> Pero o que significa isto é que o que se será almacenado, finalmente, en s? 663 00:28:59,110 --> 00:29:00,750 O número 123. 664 00:29:00,750 --> 00:29:04,860 Que será almacenada en t, neste exemplo arbitraria? 665 00:29:04,860 --> 00:29:06,300 O número 200. 666 00:29:06,300 --> 00:29:11,410 E todo isto significa, entón, por suposto, 123 non é igual a 200. 667 00:29:11,410 --> 00:29:14,940 E así esta condición Ná valorada como certa. 668 00:29:14,940 --> 00:29:18,430 Por corda get está a usar distintas anacos de memoria de cada vez. 669 00:29:18,430 --> 00:29:20,360 >> Agora podemos ver iso de novo outro exemplo. 670 00:29:20,360 --> 00:29:23,764 Déixeme ir adiante e abrir copia 0.C. 671 00:29:23,764 --> 00:29:28,770 Eu afirmo que este exemplo vai probar - pero non - copiar dúas cordas 672 00:29:28,770 --> 00:29:29,910 como segue. 673 00:29:29,910 --> 00:29:31,730 >> Vou dicir unha cousa para o usuario. 674 00:29:31,730 --> 00:29:34,490 Estou pasando entón a ter unha corda e chamalo s. 675 00:29:34,490 --> 00:29:36,400 E agora, eu estou facendo esta verificación aquí. 676 00:29:36,400 --> 00:29:37,990 Mencionados iso un tempo atrás. 677 00:29:37,990 --> 00:29:42,490 Pero cando pode ter secuencia de retorno null, outro carácter especial ou especial 678 00:29:42,490 --> 00:29:45,050 símbolo digamos. 679 00:29:45,050 --> 00:29:45,900 Se é falta de memoria. 680 00:29:45,900 --> 00:29:48,970 >> Por exemplo, se o usuario é realmente ser difícil e tipo de atroz 681 00:29:48,970 --> 00:29:51,220 número de caracteres no teclado e folgas Intro. 682 00:29:51,220 --> 00:29:54,580 Se ese número de caracteres simplemente non pode caber na memoria RAM para calquera tolo 683 00:29:54,580 --> 00:29:57,820 razón, así se podería corda moi ben volver nulo. 684 00:29:57,820 --> 00:30:01,080 >> Ou se o seu propio programa está facendo moi doutras cousas e non só 685 00:30:01,080 --> 00:30:03,790 Non hai memoria suficiente para a corda get para ter éxito, pode acabar 686 00:30:03,790 --> 00:30:05,240 Voltar nulo. 687 00:30:05,240 --> 00:30:07,160 Pero imos ser máis preciso como o que é iso. 688 00:30:07,160 --> 00:30:10,280 Cal é o tipo de datos de s realmente? 689 00:30:10,280 --> 00:30:11,610 Estrela Char. 690 00:30:11,610 --> 00:30:14,560 >> Entón non é que agora podemos casca apoiar a capa de nulo. 691 00:30:14,560 --> 00:30:17,500 Acontece que, nula é - si, obviamente un símbolo especial. 692 00:30:17,500 --> 00:30:19,190 Pero o que é realmente? 693 00:30:19,190 --> 00:30:25,220 Realmente, nulo é só un símbolo que os seres humanos utilizan para representar cero tamén. 694 00:30:25,220 --> 00:30:29,010 >> Así, os autores C e ordenadores máis xeralmente, decidiu anos 695 00:30:29,010 --> 00:30:30,010 que, xa sabe o que. 696 00:30:30,010 --> 00:30:34,850 Por que non é seguro que ningún usuario datos é que nunca, nunca, nunca 697 00:30:34,850 --> 00:30:36,730 gardado a bye Cero? 698 00:30:36,730 --> 00:30:39,610 De feito, mesmo no meu exemplo arbitrario antes, eu non comezar a numeración de 699 00:30:39,610 --> 00:30:40,390 bytes en cero. 700 00:30:40,390 --> 00:30:41,540 Comece nun. 701 00:30:41,540 --> 00:30:44,950 Porque eu sabía que as persoas no mundo decidiron reservar o cero 702 00:30:44,950 --> 00:30:47,970 byte en ninguén RAM como algo especial. 703 00:30:47,970 --> 00:30:52,020 >> A razón de ser, a calquera hora que quere sinal de que algo está mal 704 00:30:52,020 --> 00:30:55,960 no que se refire aos enderezos, é devolto null - tamén coñecido como cero - 705 00:30:55,960 --> 00:30:59,410 e por que sabe que non hai ningunha lexítimo de datos na páxina cero, claramente 706 00:30:59,410 --> 00:31:00,400 que significa un erro. 707 00:31:00,400 --> 00:31:04,080 E é por iso que, por convención, comprobe a nula e volta algo 708 00:31:04,080 --> 00:31:06,260 como un deses casos. 709 00:31:06,260 --> 00:31:09,300 >> Entón, se rodar agora, este é só logo comprobación de erros, só no caso 710 00:31:09,300 --> 00:31:10,610 algo deu mal con [? fianza?] 711 00:31:10,610 --> 00:31:13,470 completamente e saír do programa volvendo máis cedo. 712 00:31:13,470 --> 00:31:19,030 Esta liña agora podería ser reescrito como este, o que significa o que? 713 00:31:19,030 --> 00:31:23,155 Na parte esquerda, dáme outra punteiro para un personaxe, e chamalo de t. 714 00:31:23,155 --> 00:31:26,935 O que eu estou almacenando dentro t, baseado sobre esta liña de código? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Estou almacenando un lugar. 717 00:31:32,170 --> 00:31:34,742 En concreto, a localización que foi en s. 718 00:31:34,742 --> 00:31:39,000 Polo tanto, se o usuario introduciu en Ola, e que primeiro pasa Ola acabar 719 00:31:39,000 --> 00:31:42,567 aquí, a continuación, o número 123 é volverá de obter 720 00:31:42,567 --> 00:31:43,810 corda e ser almacenado - 721 00:31:43,810 --> 00:31:44,780 como dixemos anteriormente - 722 00:31:44,780 --> 00:31:45,440 en s. 723 00:31:45,440 --> 00:31:50,560 >> Cando eu declaro agora outro punteiro para un char e chamalo de t, o número é 724 00:31:50,560 --> 00:31:53,940 literalmente vai acabar en t segundo a historia? 725 00:31:53,940 --> 00:31:55,420 Entón, 123. 726 00:31:55,420 --> 00:32:00,310 >> Entón, tecnicamente agora ambos s e t están apuntando para o exacto 727 00:32:00,310 --> 00:32:02,410 mesmos anacos de memoria. 728 00:32:02,410 --> 00:32:06,140 Entón, teña en conta o que vou facer agora para probar que este programa é buggy. 729 00:32:06,140 --> 00:32:08,820 >> Primeiro vou afirmar, con un f impresión, capitalizando 730 00:32:08,820 --> 00:32:10,080 a copia da cadea. 731 00:32:10,080 --> 00:32:11,660 Entón eu vou facer algo comprobación de erros. 732 00:32:11,660 --> 00:32:12,160 Vou ter seguro. 733 00:32:12,160 --> 00:32:16,710 Imos estar seguro de que a cadea t está en menos maior que cero en lonxitude, 734 00:32:16,710 --> 00:32:19,190 polo que hai algún personaxe alí para realmente feito. 735 00:32:19,190 --> 00:32:22,840 >> E entón pode lembrar esta dos exemplos anteriores. 736 00:32:22,840 --> 00:32:25,630 2 máis - o que é en o ficheiro ctype.h. 737 00:32:25,630 --> 00:32:30,800 T franxa de cero dáme o cero caracter da cadea t. 738 00:32:30,800 --> 00:32:34,360 E 2 superior do mesmo valor, de Por suposto, convértese para maiúsculas. 739 00:32:34,360 --> 00:32:38,230 >> Así, intuitivamente, esta liña destacada do código está capitalizando o primeiro 740 00:32:38,230 --> 00:32:40,250 letra t. 741 00:32:40,250 --> 00:32:44,485 Pero non é feito, de forma intuitiva, a primeira letra s. 742 00:32:44,485 --> 00:32:48,130 Pero se está a pensar no futuro, o que eu son a piques de ver, cando executar este programa 743 00:32:48,130 --> 00:32:54,220 e imprimir o orixinal, s, ea copia chamada, t? 744 00:32:54,220 --> 00:32:55,350 >> Están, en realidade, será o mesmo. 745 00:32:55,350 --> 00:32:56,600 E por que é que van ser os mesmos? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Ambos están apuntando para exactamente o mesmo. 748 00:33:01,020 --> 00:33:01,610 Entón, imos facelo. 749 00:33:01,610 --> 00:33:03,160 >> Facer copia cero. 750 00:33:03,160 --> 00:33:04,070 El recompila Aceptar. 751 00:33:04,070 --> 00:33:06,500 Déixeme executar copia cero. 752 00:33:06,500 --> 00:33:10,110 Déixeme escribir algo como Hola en todas as letras minúsculas, a continuación, prema Intro. 753 00:33:10,110 --> 00:33:16,520 E afirma que tanto o s orixinais ea copia son realmente idénticas. 754 00:33:16,520 --> 00:33:17,920 >> Entón, o que realmente pasou aquí? 755 00:33:17,920 --> 00:33:20,100 Déixeme redesenhar esta foto só para contar a historia dunha 756 00:33:20,100 --> 00:33:21,340 xeito un pouco diferente. 757 00:33:21,340 --> 00:33:26,060 O que realmente está a suceder debaixo do capuz cando declarar algo como 758 00:33:26,060 --> 00:33:30,410 s de char comezo, ou cadea s, Estou recibindo un ponteiro - 759 00:33:30,410 --> 00:33:33,090 que pasa a ser de catro bytes no aparello CS50 760 00:33:33,090 --> 00:33:34,410 e en unha morea de ordenadores. 761 00:33:34,410 --> 00:33:36,008 E eu vou chamar iso de s. 762 00:33:36,008 --> 00:33:39,810 E iso ten actualmente algún valor descoñecido. 763 00:33:39,810 --> 00:33:43,900 >> Cando declara unha variable, a menos que colocar un valor alí, que 764 00:33:43,900 --> 00:33:44,570 sabe o que está aí. 765 00:33:44,570 --> 00:33:48,110 Pode ser unha secuencia aleatoria de bits de execución anterior. 766 00:33:48,110 --> 00:33:52,490 Entón, cando, na miña liña de código fai cadea, e despois gardar o regreso 767 00:33:52,490 --> 00:33:54,800 valor en s obter secuencia de algunha maneira - 768 00:33:54,800 --> 00:33:58,520 e imos finalmente descascada como obter obras de cordas, de algunha maneira atribúe unha 769 00:33:58,520 --> 00:34:00,480 matriz que probablemente parece algo como isto. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-S, invertida cero. 771 00:34:05,390 --> 00:34:09,510 >> Imos supor que este é o enderezo 123 só primeiro consistencia. 772 00:34:09,510 --> 00:34:13,000 Polo tanto, obter corda retorna, o liña destacada alí, el retorna o 773 00:34:13,000 --> 00:34:15,000 número dixemos, 123. 774 00:34:15,000 --> 00:34:17,420 Entón, o que realmente pasa dentro s aquí? 775 00:34:17,420 --> 00:34:26,590 >> Ben, o que realmente pasa dentro s é 123. 776 00:34:26,590 --> 00:34:29,250 Pero, francamente, eu estou quedando un pouco confuso por todos estes enderezos, 777 00:34:29,250 --> 00:34:30,320 todos estes números arbitrarios. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Entón, imos realmente simplificar o mundo un pouco. 780 00:34:34,570 --> 00:34:38,800 >> Cando falamos de punteiros, francamente, a nós seres humanos, quen diaños lle importa onde 781 00:34:38,800 --> 00:34:39,870 as cousas están na memoria? 782 00:34:39,870 --> 00:34:41,080 Isto é completamente arbitraria. 783 00:34:41,080 --> 00:34:43,370 Dependerá de como cantidade de RAM que o usuario ten. 784 00:34:43,370 --> 00:34:46,590 Dependerá de cando, o día executar o programa, é posible, e 785 00:34:46,590 --> 00:34:48,250 que a entrada do usuario lle dá. 786 00:34:48,250 --> 00:34:50,060 Estamos vivenda en detalle sen importancia. 787 00:34:50,060 --> 00:34:54,230 >> Entón imos abstraerse e dicir que, cando executa unha liña de código coma este, 788 00:34:54,230 --> 00:34:57,320 carbonizar estrela s recibe o retorno valor da cadea get. 789 00:34:57,320 --> 00:35:02,720 Por que non en vez de só deseñar o que seguir chamando un punteiro como se fose 790 00:35:02,720 --> 00:35:04,140 apuntando a algo? 791 00:35:04,140 --> 00:35:07,000 Entón eu afirmo agora que s up existe un puntero - 792 00:35:07,000 --> 00:35:08,480 debaixo do capó é un enderezo. 793 00:35:08,480 --> 00:35:11,330 Pero é só apuntando para o primeiro byte na 794 00:35:11,330 --> 00:35:12,780 cadea que foi retorno. 795 00:35:12,780 --> 00:35:16,710 >> Se eu volver agora para o código aquí, o que está pasando nesa liña? 796 00:35:16,710 --> 00:35:20,020 Pois ben, nesta liña destacado agora, Estou declarando parecer outro 797 00:35:20,020 --> 00:35:21,070 variable chamada t. 798 00:35:21,070 --> 00:35:25,700 Pero tamén é un punteiro, entón eu vou deseña-lo como, en teoría, a exacta 799 00:35:25,700 --> 00:35:26,710 mesma caixa de tamaño. 800 00:35:26,710 --> 00:35:28,160 E eu vou chamalo de t. 801 00:35:28,160 --> 00:35:33,500 >> E agora se volver para o código novo, cando almacenar está dentro t, 802 00:35:33,500 --> 00:35:36,920 o que eu son tecnicamente poñendo dentro t? 803 00:35:36,920 --> 00:35:39,350 Ben, tecnicamente, este foi o número 123. 804 00:35:39,350 --> 00:35:42,270 Entón, en realidade eu debería estar escribindo o número 123 existe. 805 00:35:42,270 --> 00:35:43,900 Pero imos levalo de nivel superior. 806 00:35:43,900 --> 00:35:48,090 t, se é só un punteiro, intuitivamente, é só iso. 807 00:35:48,090 --> 00:35:49,800 Isto é todo o que está a ser aí almacenados. 808 00:35:49,800 --> 00:35:54,970 >> Entón, agora nas últimas liñas interesantes de código, cando realmente ir sobre 809 00:35:54,970 --> 00:36:00,680 capitalizando o cero en t, o que está a suceder? 810 00:36:00,680 --> 00:36:06,310 Ben, t franxa de cero agora está a apuntar para o personaxe, presuntamente? 811 00:36:06,310 --> 00:36:07,460 >> Está apuntando h. 812 00:36:07,460 --> 00:36:08,870 Porque t franxa de cero - 813 00:36:08,870 --> 00:36:12,490 lembra, esta é vella sintaxe. t soporte de cero significa só que se t é unha cadea, t 814 00:36:12,490 --> 00:36:15,590 franxa de cero significa conseguir o cero personaxe no que a forza. 815 00:36:15,590 --> 00:36:18,650 Entón, o que realmente significa é ir a esa matriz - 816 00:36:18,650 --> 00:36:21,520 e si, iso pode ser 123, isto pode ser 124. 817 00:36:21,520 --> 00:36:22,790 Pero é todo sobre, lembre-se. 818 00:36:22,790 --> 00:36:25,640 Sempre falando dunha matriz, temos a vantaxe de falar 819 00:36:25,640 --> 00:36:27,000 índices de Google. 820 00:36:27,000 --> 00:36:31,120 >> E agora, podemos só supor que te soporte cero é h. 821 00:36:31,120 --> 00:36:35,090 Entón, se eu chamar 2 superior sobre el, o que é facendo realmente está capitalizando 822 00:36:35,090 --> 00:36:38,290 o h minúsculas a maiúsculas H. Pero, claro, o que se s? 823 00:36:38,290 --> 00:36:41,010 Está apuntando para a mesma secuencia danado. 824 00:36:41,010 --> 00:36:44,200 >> Entón, iso é todo o que está a suceder neste código ata o momento. 825 00:36:44,200 --> 00:36:45,960 Entón, cal é entón a implicación? 826 00:36:45,960 --> 00:36:48,300 Como é que imos corrixir estes dous problemas? 827 00:36:48,300 --> 00:36:50,870 Como podemos comparar con cordas reais? 828 00:36:50,870 --> 00:36:53,720 >> Ben, intuitivamente, como é que vai sobre a comparación de dous 829 00:36:53,720 --> 00:36:55,090 cordas para a verdadeira igualdade? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> O que significa que dous cadeas son iguais? 832 00:37:00,750 --> 00:37:04,330 Claro que non son os seus enderezos igual na memoria, porque iso é un baixo 833 00:37:04,330 --> 00:37:06,590 detalle de implementación nivel. 834 00:37:06,590 --> 00:37:08,360 Todos os caracteres son idénticos. 835 00:37:08,360 --> 00:37:12,810 Entón deixe-me propor, e deixe-me presentar na versión dun compare.c 836 00:37:12,810 --> 00:37:14,970 aquí, entón compararse 1.c. 837 00:37:14,970 --> 00:37:19,590 >> Déixeme propoñer que aínda obter un punteiro chamado s, e unha tenda na que o 838 00:37:19,590 --> 00:37:20,610 devolver o valor de secuencia de get. 839 00:37:20,610 --> 00:37:21,750 Imos facer o mesmo con t. 840 00:37:21,750 --> 00:37:23,230 Así, a parte do código é diferente. 841 00:37:23,230 --> 00:37:25,420 Eu estou indo a engadir un pouco máis a comprobación de erros agora. 842 00:37:25,420 --> 00:37:29,390 Entón, agora que estamos especie de descamação de volta este capas CS50 que unha cadea 843 00:37:29,390 --> 00:37:33,520 realmente é, necesitamos ser máis anal sobre asegurarse de non abusar 844 00:37:33,520 --> 00:37:35,330 valores non válidos como nulos. 845 00:37:35,330 --> 00:37:36,440 >> Entón, eu só vou comprobar. 846 00:37:36,440 --> 00:37:41,490 Se s non é igual a nulo e t non igual nulo, isto significa que estamos Aceptar. 847 00:37:41,490 --> 00:37:44,460 Sexa corda non romper quedando calquera destas cordas. 848 00:37:44,460 --> 00:37:51,270 E pode, quizais, creo que agora, o que non STR CMP presuntamente facer? 849 00:37:51,270 --> 00:37:52,000 Cadea de comparación. 850 00:37:52,000 --> 00:37:55,470 >> Polo tanto, se programa en java antes, dicir como o método equals no 851 00:37:55,470 --> 00:37:56,490 clase cadea. 852 00:37:56,490 --> 00:37:57,890 Pero para aqueles de vostedes que non teñen previsto antes, 853 00:37:57,890 --> 00:37:59,320 esta é só unha función c. 854 00:37:59,320 --> 00:38:02,180 Pasa a entrar nunha arquivo chamado string.h. 855 00:38:02,180 --> 00:38:03,830 É aí que el é declarado. 856 00:38:03,830 --> 00:38:05,110 >> E corda comparar - 857 00:38:05,110 --> 00:38:07,530 Realmente esquecer o seu uso, pero non importa. 858 00:38:07,530 --> 00:38:10,470 Lembre que podemos facer home, mexa comparar. 859 00:38:10,470 --> 00:38:12,590 E iso vai levar o Manual de desenvolvedores Linux. 860 00:38:12,590 --> 00:38:14,060 E, francamente, algo enigmática. 861 00:38:14,060 --> 00:38:15,270 Pero eu podo ver que aquí, si. 862 00:38:15,270 --> 00:38:17,570 Teño que incluír string.h. 863 00:38:17,570 --> 00:38:20,590 >> E di aquí en descrición, "a función de comparación compara cadea 864 00:38:20,590 --> 00:38:24,560 as dúas secuencias S1 e S2. "E S1 e S2 son, ao parecer, os dous 865 00:38:24,560 --> 00:38:26,120 argumentos pasados ​​dentro 866 00:38:26,120 --> 00:38:28,650 Realmente non lembro o que const é, pero agora entende - 867 00:38:28,650 --> 00:38:31,480 e pode ver iso xa cando usa as páxinas de manual, se 868 00:38:31,480 --> 00:38:32,390 ter todo - 869 00:38:32,390 --> 00:38:36,220 aquela estrela char é só sinónimo con cadea. 870 00:38:36,220 --> 00:38:40,440 >> Entón, el compara as dúas cordas, S1 e S2, e retorna un enteiro menor 871 00:38:40,440 --> 00:38:44,930 que ou igual a ou maior que cero S1 atópase, respectivamente, para ser 872 00:38:44,930 --> 00:38:47,450 inferiores ou iguais, ou ser maior que S2. 873 00:38:47,450 --> 00:38:51,220 Isto é só un xeito moi complexo de dicir esta secuencia comparar retorno 874 00:38:51,220 --> 00:38:55,760 cero dúas cadeas son intuitivamente idénticas, personaxe de 875 00:38:55,760 --> 00:38:57,120 personaxe para personaxe. 876 00:38:57,120 --> 00:38:59,970 >> El retorna un número negativo se s, por orde alfabética, se quere 877 00:38:59,970 --> 00:39:01,010 para vir antes de t. 878 00:39:01,010 --> 00:39:05,300 Ou retorna un número positivo s debe vir despois de t 879 00:39:05,300 --> 00:39:06,170 en orde alfabética. 880 00:39:06,170 --> 00:39:08,360 Así, con esta función simple, podería vostede, por exemplo, clasificar unha 881 00:39:08,360 --> 00:39:09,770 todo morea de palabras? 882 00:39:09,770 --> 00:39:13,984 >> Así, nesta nova versión, vou para ir adiante e facer compare1. 883 00:39:13,984 --> 00:39:15,750 Dot barra comparar un. 884 00:39:15,750 --> 00:39:18,030 Vou escribir Ola en todas as letras minúsculas. 885 00:39:18,030 --> 00:39:20,300 Vou escribir Ola en todas as letras minúsculas novo. 886 00:39:20,300 --> 00:39:23,340 E por sorte agora entende Eu escriba o mesmo. 887 00:39:23,340 --> 00:39:27,520 >> Mentres tanto, se eu escribir Ola en baixa OLA caso e en letras maiúsculas e 888 00:39:27,520 --> 00:39:29,710 comparalos-los, eu escriba cousas distintas. 889 00:39:29,710 --> 00:39:32,530 ¿Por que non son só os enderezos diferente, pero estamos comparando 890 00:39:32,530 --> 00:39:35,350 diferentes personaxes de novo e de novo. 891 00:39:35,350 --> 00:39:37,320 >> Ben, imos alí e corrixir un outro problema agora. 892 00:39:37,320 --> 00:39:41,590 Déixeme abrir unha versión de copia, que agora dirixe 893 00:39:41,590 --> 00:39:42,900 esta cuestión do seguinte xeito. 894 00:39:42,900 --> 00:39:45,650 E este se ve un pouco máis complexa. 895 00:39:45,650 --> 00:39:49,320 Pero se pensar sobre o problema que que resolver, espera que este será 896 00:39:49,320 --> 00:39:51,870 claro en só un momento agora. 897 00:39:51,870 --> 00:39:57,280 >> Polo tanto, esta primeira liña, char inicio t, en termos laicos alguén podería propoñer 898 00:39:57,280 --> 00:39:59,450 o que esta liña aquí significa? 899 00:39:59,450 --> 00:40:01,050 Char estrela t, que é o que está facendo? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Bo 902 00:40:07,210 --> 00:40:09,500 Crear un punteiro para algúns lugar de memoria. 903 00:40:09,500 --> 00:40:10,930 E déixeme refinala-lo un pouco. 904 00:40:10,930 --> 00:40:17,180 Declare unha variable que pode almacenar o dirección dalgún carácter na memoria, só 905 00:40:17,180 --> 00:40:18,480 a ser un pouco máis axeitada. 906 00:40:18,480 --> 00:40:21,210 >> OK, agora no lado dereito, eu teño nunca vin unha desas funcións 907 00:40:21,210 --> 00:40:22,660 antes, malloc. 908 00:40:22,660 --> 00:40:26,980 Pero o que podería dicir? 909 00:40:26,980 --> 00:40:28,050 Distribución de memoria. 910 00:40:28,050 --> 00:40:29,410 Distribución de memoria. 911 00:40:29,410 --> 00:40:33,050 >> Así, ao parecer, ata agora, nós realmente non tiña un xeito poderosa de 912 00:40:33,050 --> 00:40:36,210 pedindo o sistema operativo, Dáme un pouco de memoria. 913 00:40:36,210 --> 00:40:39,980 Pola contra, agora temos unha función chamada malloc que fai exactamente iso. 914 00:40:39,980 --> 00:40:42,960 Aínda que iso é un pouco de distracción, agora, entender que en 915 00:40:42,960 --> 00:40:46,200 entre ambos os parénteses está só vai ser un número. 916 00:40:46,200 --> 00:40:48,510 Onde eu escriba en cuestión as marcas poden ser un número. 917 00:40:48,510 --> 00:40:51,020 >> E ese número significa, darme 10 bytes. 918 00:40:51,020 --> 00:40:52,320 Déame 20 bytes. 919 00:40:52,320 --> 00:40:53,820 Déame 100 bytes. 920 00:40:53,820 --> 00:40:56,500 Malloc e fará o mellor para pedir ao sistema operativo - 921 00:40:56,500 --> 00:40:57,630 Linux, neste caso - 922 00:40:57,630 --> 00:40:59,630 hey, son os seus 100 bytes de memoria RAM dispoñible? 923 00:40:59,630 --> 00:41:04,320 Se é así, devolver eses bytes para min por volvendo a dirección de cal 924 00:41:04,320 --> 00:41:06,610 os bytes, quizais? 925 00:41:06,610 --> 00:41:07,610 O propio primeiro. 926 00:41:07,610 --> 00:41:10,460 >> Polo tanto, aquí tamén - e isto é predominante en C, a calquera hora que está 927 00:41:10,460 --> 00:41:11,680 xestionar enderezos? 928 00:41:11,680 --> 00:41:15,830 Está case sempre lidando co primeiro enderezo tanto, non importa o grande 929 00:41:15,830 --> 00:41:19,490 unha peza de memoria que está sendo devolveu, por así dicir. 930 00:41:19,490 --> 00:41:20,880 >> Entón imos mergullar aquí. 931 00:41:20,880 --> 00:41:23,940 Estou tentando reservar como moitos bytes, exactamente? 932 00:41:23,940 --> 00:41:24,080 Well. 933 00:41:24,080 --> 00:41:26,090 Lonxitude da corda de s - imos facer un exemplo concreto. 934 00:41:26,090 --> 00:41:30,700 Si s é Ola, H-E-L-L-O, que é o lonxitude da corda de s, obviamente? 935 00:41:30,700 --> 00:41:32,010 Por iso, é de cinco anos. 936 00:41:32,010 --> 00:41:34,590 Pero eu estou facendo un máis un no que, por que? 937 00:41:34,590 --> 00:41:37,700 Por que quero seis bytes no canto de cinco? 938 00:41:37,700 --> 00:41:38,790 O carácter nulo. 939 00:41:38,790 --> 00:41:41,210 >> Non quero deixar de fóra este carácter nulo especial. 940 00:41:41,210 --> 00:41:45,160 Porque se eu fai unha copia do Ola e só facer H-E-L-L-A, pero eu non poño 941 00:41:45,160 --> 00:41:50,160 ese carácter especial, o ordenador non pode ter, por casualidade, unha barra invertida 942 00:41:50,160 --> 00:41:51,730 zerar alí para min. 943 00:41:51,730 --> 00:41:55,570 E así, se eu estou tentando descubrir o lonxitude da copia, eu podería pensar que 944 00:41:55,570 --> 00:41:59,360 é 20 caracteres, ou un millón caracteres se eu nunca ocorrerá 945 00:41:59,360 --> 00:42:01,050 a bater un cero barra invertida. 946 00:42:01,050 --> 00:42:05,780 >> Por iso, precisamos de seis bytes para almacenar H-E-L-L-S, invertida cero. 947 00:42:05,780 --> 00:42:07,870 E entón este é só ser super anal. 948 00:42:07,870 --> 00:42:10,700 Supoñamos que eu esqueza o que o tamaño dunha char é. 949 00:42:10,700 --> 00:42:12,020 Nós mantemo-nos dicindo que é un byte. 950 00:42:12,020 --> 00:42:12,860 E xeralmente é. 951 00:42:12,860 --> 00:42:15,425 En teoría, podería ser algo diferentes, nun Mac diferente ou unha 952 00:42:15,425 --> 00:42:16,250 Ordenador diferente. 953 00:42:16,250 --> 00:42:19,650 >> Entón non é que hai ese operador chamado sizeof que se pasalo a 954 00:42:19,650 --> 00:42:22,680 nome dun tipo de datos - como char, ou int ou float - 955 00:42:22,680 --> 00:42:26,930 el lle vai dicir, de forma dinámica, cantos bytes un char ocupa neste 956 00:42:26,930 --> 00:42:28,090 determinado ordenador. 957 00:42:28,090 --> 00:42:31,360 >> Polo tanto, esta é efectivamente só como veces un ou dicindo 958 00:42:31,360 --> 00:42:32,440 veces nada. 959 00:42:32,440 --> 00:42:36,340 Pero eu estou facendo iso só para ser super anal, que só no caso dun char diferente 960 00:42:36,340 --> 00:42:40,610 no seu computador contra a miña, deste xeito a matemática sempre está indo a check-out. 961 00:42:40,610 --> 00:42:43,720 >> Finalmente, aquí eu verifico a nulo, que sempre é unha boa práctica - de novo, 962 00:42:43,720 --> 00:42:44,920 calquera momento que estamos lidando con punteiros. 963 00:42:44,920 --> 00:42:47,520 Se malloc non foi capaz de dar me seis despedidas - o que é 964 00:42:47,520 --> 00:42:49,210 pouco probable, pero só no caso - 965 00:42:49,210 --> 00:42:50,730 voltar un inmediato. 966 00:42:50,730 --> 00:42:53,290 E agora, vai adiante e copiar a corda como segue. 967 00:42:53,290 --> 00:42:57,240 E esta é a sintaxe familiar, aínda que nun papel distinto. 968 00:42:57,240 --> 00:43:01,210 >> Eu estou indo a ir adiante e comezar a cadea lonxitude de s e almacena-lo no n. 969 00:43:01,210 --> 00:43:06,620 Estou pasando entón a iteración i é igual a cero ata e incluíndo n, 970 00:43:06,620 --> 00:43:08,410 maior o igual a. 971 00:43:08,410 --> 00:43:13,540 De forma que en cada iteración, engada o carácter om de s no om 972 00:43:13,540 --> 00:43:15,380 carácter de t. 973 00:43:15,380 --> 00:43:18,190 >> Entón, o que realmente está a suceder debaixo a capa aquí? 974 00:43:18,190 --> 00:43:22,140 Ben, se este, por exemplo, é s - 975 00:43:22,140 --> 00:43:26,400 e eu escriba a palabra H-E-L-L-O e hai un cero barra invertida. 976 00:43:26,400 --> 00:43:29,020 E unha vez máis, esta é s apuntar aquí. 977 00:43:29,020 --> 00:43:30,830 E aquí é agora t. 978 00:43:30,830 --> 00:43:34,860 >> E iso está a apuntar agora para unha copia de memoria, non? 979 00:43:34,860 --> 00:43:37,340 Malloc deume un todo anaco de memoria. 980 00:43:37,340 --> 00:43:41,440 Non sei o que é, inicialmente, en calquera destes lugares. 981 00:43:41,440 --> 00:43:44,340 Entón, eu vou pensar niso como unha morea de puntos de interrogación. 982 00:43:44,340 --> 00:43:50,190 >> Pero así que eu comezar Looping de cero encima ao longo da lonxitude s, t 983 00:43:50,190 --> 00:43:52,790 soporte cero e soporte t 1 - 984 00:43:52,790 --> 00:43:55,080 e eu vou poñer iso agora na sobrecarga - 985 00:43:55,080 --> 00:44:04,190 t soporte cero e s soporte media cero que eu vou estar copiando 986 00:44:04,190 --> 00:44:09,875 iterativamente h aquí, o E-L-L-S. Ademais, porque eu fixen o máis 987 00:44:09,875 --> 00:44:12,370 1, barra invertida cero. 988 00:44:12,370 --> 00:44:19,060 >> Entón, agora, no caso de que comparalos 1.c, ao final, se eu imprimir o 989 00:44:19,060 --> 00:44:24,760 capitalización de t, temos que ver que s mantén-se inalteradas. 990 00:44:24,760 --> 00:44:26,090 Déixeme ir adiante agora e facelo. 991 00:44:26,090 --> 00:44:28,630 Entón faga copy1. 992 00:44:28,630 --> 00:44:30,860 Dot barra copy1. 993 00:44:30,860 --> 00:44:33,670 Vou escribir Ola, Intro. 994 00:44:33,670 --> 00:44:37,430 E agora observar, só a copia foi capitalizar. 995 00:44:37,430 --> 00:44:40,890 Porque realmente teño dous anacos de memoria. 996 00:44:40,890 --> 00:44:44,390 >> Por desgraza, pode facer algún ben cousas malas e moi perigoso aquí. 997 00:44:44,390 --> 00:44:49,290 Déixeme puxar arriba un exemplo aquí agora, , Que nos dá un exemplo de algúns 998 00:44:49,290 --> 00:44:51,540 liñas diferentes. 999 00:44:51,540 --> 00:44:56,040 Entón, só intuitivamente aquí, a primeira liña de código, int x estrela, está declarando 1000 00:44:56,040 --> 00:44:57,340 unha variable chamada x. 1001 00:44:57,340 --> 00:44:58,810 E cal é o tipo de datos desta variable? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Cal é o tipo de datos que a variable? 1004 00:45:04,290 --> 00:45:06,980 Aquel non era o momento de angustia. 1005 00:45:06,980 --> 00:45:08,350 >> O tipo de datos int é estrela. 1006 00:45:08,350 --> 00:45:12,600 Entón, o que significa isto? x vontade gardar o enderezo dun int. 1007 00:45:12,600 --> 00:45:13,520 Simple como iso. 1008 00:45:13,520 --> 00:45:16,220 Y vai almacenar o enderezo dun int. 1009 00:45:16,220 --> 00:45:18,390 ¿Que é a terceira liña do código está facendo alí? 1010 00:45:18,390 --> 00:45:21,850 É atribución cantos bytes, probablemente? 1011 00:45:21,850 --> 00:45:22,350 Four. 1012 00:45:22,350 --> 00:45:25,460 Debido ao tamaño dun int é xeralmente catro, malloc de catro dá 1013 00:45:25,460 --> 00:45:29,950 me facer a dirección de unha peza de memoria, o primeiro de cuxos bytes é 1014 00:45:29,950 --> 00:45:32,110 almacenado agora en x. 1015 00:45:32,110 --> 00:45:34,410 >> Agora estamos movendo un pouco rápido. 1016 00:45:34,410 --> 00:45:35,760 Estrela x significa o que? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Isto significa ir a este enderezo e poñer o número de alí? 1019 00:45:42,590 --> 00:45:43,870 Engade o número 42 alí. 1020 00:45:43,870 --> 00:45:47,590 Estrela y significa ir ao que está en y e poñer o número 13 alí. 1021 00:45:47,590 --> 00:45:48,600 >> Pero agarde un minuto. 1022 00:45:48,600 --> 00:45:51,640 O que está en y no momento? 1023 00:45:51,640 --> 00:45:54,950 O enderezo é y almacenamento? 1024 00:45:54,950 --> 00:45:55,770 Non sabemos, non? 1025 00:45:55,770 --> 00:45:59,230 Nunca xa usar a asignación operador inclúen y. 1026 00:45:59,230 --> 00:46:03,370 Entón, y, segundo declarou na segunda liña de código é só un valor de lixo, un gran 1027 00:46:03,370 --> 00:46:04,760 punto de interrogação, por así dicir. 1028 00:46:04,760 --> 00:46:07,230 Pode-se apuntar ao chou a calquera cousa na memoria, que 1029 00:46:07,230 --> 00:46:08,340 xeralmente é malo. 1030 00:46:08,340 --> 00:46:13,540 >> Así, logo que se loita esa liña alí, estrela y é igual a 13, algo malo, 1031 00:46:13,540 --> 00:46:17,220 algo moi malo está pasar con Binky. 1032 00:46:17,220 --> 00:46:25,810 Entón imos ver o que vai acabar suceder con Binky aquí neste minuto 1033 00:46:25,810 --> 00:46:26,200 ou entón buscar. 1034 00:46:26,200 --> 00:46:26,490 >> [REPRODUCIÓN] 1035 00:46:26,490 --> 00:46:26,745 >> -Ei, Binky. 1036 00:46:26,745 --> 00:46:27,000 Espertar. 1037 00:46:27,000 --> 00:46:29,296 É tempo para divertirse punteiro. 1038 00:46:29,296 --> 00:46:30,680 >> -Que é iso? 1039 00:46:30,680 --> 00:46:31,980 Máis información sobre punteiros? 1040 00:46:31,980 --> 00:46:34,010 Oh, goodie. 1041 00:46:34,010 --> 00:46:37,220 >> -Ben, para comezar, creo que estamos Vai ter un par de punteiros. 1042 00:46:37,220 --> 00:46:37,930 >> -Aceptar. 1043 00:46:37,930 --> 00:46:41,650 Este código aloca dous punteiros que pode ligar a números enteiros. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, así, eu vexo os dous punteiros. 1045 00:46:43,760 --> 00:46:45,850 Pero eles non parecen ser apuntando para nada. 1046 00:46:45,850 --> 00:46:46,490 >> -Iso mesmo. 1047 00:46:46,490 --> 00:46:48,630 Inicialmente, os punteiros non apuntar para calquera cousa. 1048 00:46:48,630 --> 00:46:51,700 As cousas que eles apuntan chámanse pointees, e configure-los é unha 1049 00:46:51,700 --> 00:46:52,850 etapa separada. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, non, non. 1051 00:46:53,740 --> 00:46:54,500 Eu sabía. 1052 00:46:54,500 --> 00:46:56,270 Os pointees son separados. 1053 00:46:56,270 --> 00:46:58,553 Así como reservar un pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -Aceptar. 1055 00:46:59,480 --> 00:47:03,707 Ben, este código aloca un novo enteiros pointee, e esta parte define x 1056 00:47:03,707 --> 00:47:05,520 para apuntar para el. 1057 00:47:05,520 --> 00:47:06,760 >> -Ei, iso parece mellor. 1058 00:47:06,760 --> 00:47:08,520 Polo que facer algo. 1059 00:47:08,520 --> 00:47:09,530 >> -Aceptar. 1060 00:47:09,530 --> 00:47:14,110 Vou cancelar o punteiro x para almacenar o número 42 no seu pointee. 1061 00:47:14,110 --> 00:47:17,660 Para este truco, eu vou ter a miña maxia vara de dereferencing. 1062 00:47:17,660 --> 00:47:20,695 >> -A súa vara máxica de dereferencing? 1063 00:47:20,695 --> 00:47:22,632 Uh, iso é óptimo. 1064 00:47:22,632 --> 00:47:24,620 >> -Isto é o que o código parece. 1065 00:47:24,620 --> 00:47:27,526 Eu só vou definir o número, e - 1066 00:47:27,526 --> 00:47:28,250 >> -Ei, mira. 1067 00:47:28,250 --> 00:47:29,680 Alí vai el. 1068 00:47:29,680 --> 00:47:34,520 Así, facendo un desreferenciava en x segue a frecha para ter acceso ao seu pointee. 1069 00:47:34,520 --> 00:47:36,690 Neste caso, 42 para almacenar alí. 1070 00:47:36,690 --> 00:47:40,890 Hey, proba usalo para gardar o número 13 a través do outro punteiro, y. 1071 00:47:40,890 --> 00:47:42,125 >> -Aceptar. 1072 00:47:42,125 --> 00:47:46,810 Vou pasar por riba aquí para y e O número 13 configurar. 1073 00:47:46,810 --> 00:47:50,890 E, a continuación, tomar a vara de dereferencing e só - 1074 00:47:50,890 --> 00:47:52,430 Guau! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hey. 1076 00:47:53,030 --> 00:47:54,610 Isto non funcionou. 1077 00:47:54,610 --> 00:47:58,200 Digamos, Binky, eu non creo que o dereferencing y é unha boa idea, 1078 00:47:58,200 --> 00:48:01,370 porque a configuración do pointee é un paso separado. 1079 00:48:01,370 --> 00:48:03,460 E eu non creo que nós xa fixemos. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Bo punto. 1082 00:48:05,160 --> 00:48:07,410 >> -Si, alocamos punteiro y. 1083 00:48:07,410 --> 00:48:10,045 Pero nós nunca configuralo para ligar a un pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Moi observador. 1086 00:48:12,170 --> 00:48:13,790 >> -Ei, está mirando bo alí, Binky. 1087 00:48:13,790 --> 00:48:16,920 Pode resolve-lo, para que y puntos ao mesmo pointee como x? 1088 00:48:16,920 --> 00:48:17,810 >> -Claro. 1089 00:48:17,810 --> 00:48:20,300 Vou usar a miña vara máxica de asignación de punteiro. 1090 00:48:20,300 --> 00:48:22,240 >> -Será que vai ser un problema como antes? 1091 00:48:22,240 --> 00:48:22,665 >> -No. 1092 00:48:22,665 --> 00:48:24,300 Isto non tocar os pointees. 1093 00:48:24,300 --> 00:48:27,880 El só cambia un punteiro para ligar o mesmo que o outro. 1094 00:48:27,880 --> 00:48:28,970 >> -Oh, eu vexo. 1095 00:48:28,970 --> 00:48:31,730 Agora y apunta para o mesmo lugar que x. 1096 00:48:31,730 --> 00:48:32,450 Entón, agarde. 1097 00:48:32,450 --> 00:48:33,490 Agora y é fixo. 1098 00:48:33,490 --> 00:48:34,630 Ten un pointee. 1099 00:48:34,630 --> 00:48:36,520 Así, pode probar a vara de dereferencing novo 1100 00:48:36,520 --> 00:48:39,200 Enviar a 13 terminado. 1101 00:48:39,200 --> 00:48:39,840 >> -Aceptar. 1102 00:48:39,840 --> 00:48:41,570 Aquí vai. 1103 00:48:41,570 --> 00:48:42,870 >> -Ei, mira iso. 1104 00:48:42,870 --> 00:48:44,320 Agora dereferencing obras sobre y. 1105 00:48:44,320 --> 00:48:47,020 E por que os punteiros están compartindo que un pointee, eles 1106 00:48:47,020 --> 00:48:48,585 tanto ver a 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Si. 1108 00:48:49,040 --> 00:48:49,670 Compartindo. 1109 00:48:49,670 --> 00:48:50,380 Calquera que sexa. 1110 00:48:50,380 --> 00:48:52,290 Entón imos cambiar de lugar agora? 1111 00:48:52,290 --> 00:48:52,970 >> -Oh, mire. 1112 00:48:52,970 --> 00:48:54,150 Estamos sen tempo. 1113 00:48:54,150 --> 00:48:55,200 >> -Pero - 1114 00:48:55,200 --> 00:48:57,060 >> -Teña en conta que de tres normas punteiro. 1115 00:48:57,060 --> 00:49:00,100 O número un, a estrutura básica é que ten un punteiro. 1116 00:49:00,100 --> 00:49:02,170 E apunta máis a un pointee. 1117 00:49:02,170 --> 00:49:04,160 Pero o punteiro e pointee son separados. 1118 00:49:04,160 --> 00:49:06,460 E o erro común é crear un punteiro, pero a 1119 00:49:06,460 --> 00:49:08,540 esquecer dun dato pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Número dous, enlace dereferencing comeza no punteiro e segue o seu 1121 00:49:12,460 --> 00:49:14,570 frecha sobre a acceder á túa pointee. 1122 00:49:14,570 --> 00:49:18,640 Como todos sabemos, iso só funciona se hai é un pointee, que volve ao 1123 00:49:18,640 --> 00:49:19,790 regra número un. 1124 00:49:19,790 --> 00:49:23,670 >> Número tres, a asignación de punteiro leva un punteiro e cambia-lo para apuntar 1125 00:49:23,670 --> 00:49:25,850 Nas mesmas pointee como outro punteiro. 1126 00:49:25,850 --> 00:49:27,840 Así, tras a concesión, os dous punteiros 1127 00:49:27,840 --> 00:49:29,430 apuntar ao mesmo pointee. 1128 00:49:29,430 --> 00:49:31,600 Ás veces iso é chamado de reparto. 1129 00:49:31,600 --> 00:49:33,430 E iso é todo o que existe para ela, realmente. 1130 00:49:33,430 --> 00:49:33,840 Bye bye agora. 1131 00:49:33,840 --> 00:49:34,300 >> [FIN reprodución de vídeo] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID Malan: So máis sobre punteiros, máis sobre Binky a próxima semana. 1133 00:49:36,940 --> 00:49:38,190 Vemo-nos o luns. 1134 00:49:38,190 --> 00:49:42,187