1 00:00:00,000 --> 00:00:02,742 2 00:00:02,742 --> 00:00:05,680 >> COLUMNA 1: Hola a todos. 3 00:00:05,680 --> 00:00:07,530 Imos comezar. 4 00:00:07,530 --> 00:00:09,330 Creo que a xente aínda están indo ser filtrando. 5 00:00:09,330 --> 00:00:12,840 Pero, en interese de tempo, para que poidamos obter vostedes aquí a tempo, 6 00:00:12,840 --> 00:00:14,110 imos comezar. 7 00:00:14,110 --> 00:00:18,780 Entón Benvido ao CS50 quiz 0 avaliación. 8 00:00:18,780 --> 00:00:23,020 Para aqueles de vostedes que aínda non entendeu con todo, ten unha pregunta na Mércores. 9 00:00:23,020 --> 00:00:25,700 Woo-hoo. 10 00:00:25,700 --> 00:00:29,780 >> Se aínda non comezou a estudar aínda é non entenderon que isto existe aínda, 11 00:00:29,780 --> 00:00:34,070 quizzes pasadas e toda a información sobre seu cuestionario están no cs50.net/quizzes. 12 00:00:34,070 --> 00:00:38,090 Hai algunhas cousas moi boas por alí, quizzes últimos dos últimos 10 13 00:00:38,090 --> 00:00:43,760 anos, así como información sobre este quiz e temas 14 00:00:43,760 --> 00:00:46,250 que será cuberta. 15 00:00:46,250 --> 00:00:48,980 Entón, imos comezar. 16 00:00:48,980 --> 00:00:54,240 >> Entón vostedes deben lembrar, o primeiro día de clase David tiña esas lámpadas por diante. 17 00:00:54,240 --> 00:00:59,650 Entón, basicamente, todo o que pasa baixo a capa dun ordenador é 18 00:00:59,650 --> 00:01:00,860 feito en binario. 19 00:01:00,860 --> 00:01:04,080 Binario significa o que soa como, 0 e 1 do. 20 00:01:04,080 --> 00:01:09,290 Ten dous valores pode ser representada. 21 00:01:09,290 --> 00:01:14,675 >> Así como o primeiro día de sección cando David acendeu unha luz 22 00:01:14,675 --> 00:01:21,990 lámpada para representar en, ou 1, o noso equipo entende como binario 0 e 23 00:01:21,990 --> 00:01:24,110 1 de, activado ou desactivado. 24 00:01:24,110 --> 00:01:25,360 Nocións básicas de binario. 25 00:01:25,360 --> 00:01:29,440 26 00:01:29,440 --> 00:01:32,470 Cada lugar é representado na base de dous. 27 00:01:32,470 --> 00:01:36,260 Entón engade 2 a 0 ao 1 a 2 por todo o camiño cara arriba. 28 00:01:36,260 --> 00:01:41,970 >> Para calcular o binario é decimal, só tes que seguir esta ecuación 29 00:01:41,970 --> 00:01:42,840 Tipo de cousas. 30 00:01:42,840 --> 00:01:49,510 Se tes un 1 en calquera destes lugares, vostede multiplicala lo por todo o que 31 00:01:49,510 --> 00:01:53,820 basea-lo está, engadir lo para arriba, e comeza a decimal. 32 00:01:53,820 --> 00:01:57,930 Entón é así que contar a 5 en binario. 33 00:01:57,930 --> 00:02:01,400 Así como o que estabamos facendo o último slide, isto é como se fose 34 00:02:01,400 --> 00:02:02,650 representan de 1 a 5. 35 00:02:02,650 --> 00:02:05,320 36 00:02:05,320 --> 00:02:09,660 >> Do mesmo xeito, así como pode engadir e restar en decimal é base 10, ou 37 00:02:09,660 --> 00:02:13,040 realmente algunha base, en pode engadir e restar en binario. 38 00:02:13,040 --> 00:02:18,400 Exactamente o que pode esperar cando engadir os dous para arriba, se é igual a maior 39 00:02:18,400 --> 00:02:24,220 que 1, leva a 1, facelo un 0, e facer a suma desta maneira, só 40 00:02:24,220 --> 00:02:29,910 como sería de esperar con regulares decimal ou calquera outra base. 41 00:02:29,910 --> 00:02:30,970 Legal. 42 00:02:30,970 --> 00:02:35,140 >> Entón, como dixen antes, todo o que continúa baixo a capa do noso ordenador 43 00:02:35,140 --> 00:02:37,560 faise en 0 e 1 do, ou binario. 44 00:02:37,560 --> 00:02:43,470 Entón, como podemos expresar, por exemplo, letras ou números ou caracteres? 45 00:02:43,470 --> 00:02:45,560 E a resposta a iso é ASCII. 46 00:02:45,560 --> 00:02:49,380 >> ASCII é un mapeamento entre os caracteres que normalmente vemos no 47 00:02:49,380 --> 00:02:53,360 Idioma inglés como a, B de, Cs, subliñado, trazos, e 48 00:02:53,360 --> 00:02:54,910 algo así. 49 00:02:54,910 --> 00:02:57,260 E mapea isto para un valor ASCII. 50 00:02:57,260 --> 00:03:03,080 Un valor ASCII é só un número que pode ser entendido polo ordenador. 51 00:03:03,080 --> 00:03:07,430 E, así como pode facer a adición e subtracción con números, pode facer 52 00:03:07,430 --> 00:03:10,890 los con valores ASCII. 53 00:03:10,890 --> 00:03:14,050 >> Polo tanto, neste exemplo, o que iso vai imprimir? 54 00:03:14,050 --> 00:03:26,790 55 00:03:26,790 --> 00:03:35,480 Si, por iso só un espazo B espazo espazo C D. Onde meu rato ir? 56 00:03:35,480 --> 00:03:39,200 57 00:03:39,200 --> 00:03:43,380 Teña en conta que pode definir un int a 65. 58 00:03:43,380 --> 00:03:47,080 E cando imprime que utilizando por cento C, vai interpretar isto como un 59 00:03:47,080 --> 00:03:49,330 carácter e imprimirá A. 60 00:03:49,330 --> 00:03:52,800 >> Do mesmo xeito, pode declarar lo como un char. 61 00:03:52,800 --> 00:03:56,860 E cando imprimir lo usando cento C, que vai interpretar isto como 62 00:03:56,860 --> 00:04:05,240 por cento D. E, así como pode engadir un número, pode engadir personaxes son 63 00:04:05,240 --> 00:04:06,878 Os valores ASCII, neste caso. 64 00:04:06,878 --> 00:04:11,370 65 00:04:11,370 --> 00:04:16,130 >> Entón, algo punteiro para todos. 66 00:04:16,130 --> 00:04:19,610 5, como unha cadea, non en realidade, ser igual a 5. 67 00:04:19,610 --> 00:04:26,610 Entón, como podemos converter o corda 5 ao enteiro 5? 68 00:04:26,610 --> 00:04:28,930 Algunha idea? 69 00:04:28,930 --> 00:04:31,630 Si. 70 00:04:31,630 --> 00:04:36,720 >> Entón, se temos 5 como unha cadea, podemos restar 0. 71 00:04:36,720 --> 00:04:37,820 E iso vai dar 5. 72 00:04:37,820 --> 00:04:41,670 E do mesmo xeito, se temos 5 como un enteiro, engadir que para a secuencia 0. 73 00:04:41,670 --> 00:04:43,112 E iso nos dá a corda 5. 74 00:04:43,112 --> 00:04:46,350 75 00:04:46,350 --> 00:04:48,350 Legal. 76 00:04:48,350 --> 00:04:52,940 >> Agora, lembre de volta a ensinar un onde falamos algoritmos. 77 00:04:52,940 --> 00:04:57,260 Entón, como é que imos realmente quere un ordenador para facer cousas interesantes? 78 00:04:57,260 --> 00:05:00,460 Vostede sabe, só sumar e restar números e imprimir cousas fóra non é 79 00:05:00,460 --> 00:05:01,730 que emocionante. 80 00:05:01,730 --> 00:05:04,620 Normalmente, queremos que o noso ordenador para realizar algún tipo de algoritmo. 81 00:05:04,620 --> 00:05:07,820 Algo un pouco máis complexa que só aritmética simple. 82 00:05:07,820 --> 00:05:11,930 >> Un algoritmo é só un paso a paso conxunto de instrucións sobre como realizar 83 00:05:11,930 --> 00:05:14,640 un certo task-- 84 00:05:14,640 --> 00:05:15,660 Así como unha receita. 85 00:05:15,660 --> 00:05:19,990 Debe lembrar do primeiro día de clase onde David tiña nos contar un cuarto 86 00:05:19,990 --> 00:05:22,550 de persoas e cantas persoas no cuarto. 87 00:05:22,550 --> 00:05:24,480 Pode ser usado para conta unha por unha. 88 00:05:24,480 --> 00:05:25,860 1, 2, 3, 4. 89 00:05:25,860 --> 00:05:28,010 Neste caso, un algoritmo de tempo lineal. 90 00:05:28,010 --> 00:05:31,710 >> Pero David introduciu un algoritmo para contar as persoas na sala 91 00:05:31,710 --> 00:05:37,340 onde todo o mundo se levanta, di que o seu número a outra persoa, engadir que 92 00:05:37,340 --> 00:05:39,200 número superior, e unha persoa se senta. 93 00:05:39,200 --> 00:05:40,410 E repetir iso. 94 00:05:40,410 --> 00:05:42,910 Isto é un tipo de algoritmo. 95 00:05:42,910 --> 00:05:47,520 Podemos analizar unha forma eficiente algoritmo baséase no que é tempo de execución. 96 00:05:47,520 --> 00:05:49,680 Pero imos falar un pouco máis sobre iso máis tarde. 97 00:05:49,680 --> 00:05:52,740 98 00:05:52,740 --> 00:05:57,090 >> Así, todos os algoritmos tamén pode ser escritos en pseudocódigo. 99 00:05:57,090 --> 00:06:01,120 Pseudocódigo é só un inglés como sintaxe utilizada para representar 100 00:06:01,120 --> 00:06:02,420 unha linguaxe de programación. 101 00:06:02,420 --> 00:06:06,070 Por exemplo, se quixésemos pedir un usuario adiviñar o meu número favorito, nós 102 00:06:06,070 --> 00:06:08,390 pode ter pseudocódigo como tal. 103 00:06:08,390 --> 00:06:09,850 >> Acadar usuarios adiviñar. 104 00:06:09,850 --> 00:06:13,570 Se o palpite está correcto, diga-lles son correctos, senón dicirlles 105 00:06:13,570 --> 00:06:15,560 eles non están correctos. 106 00:06:15,560 --> 00:06:22,530 Pseudocódigo e é unha forma de facilmente representando unha idea ou un algoritmo. 107 00:06:22,530 --> 00:06:26,910 Entón agora podemos querer realmente escribir isto na linguaxe que o ordenador 108 00:06:26,910 --> 00:06:27,980 pode comprender. 109 00:06:27,980 --> 00:06:35,660 Entón, podemos escribir o noso pseudocódigo e interpretar que o código fonte. 110 00:06:35,660 --> 00:06:41,320 >> Ata agora, o código fonte debe unirse para unha determinada sintaxe 111 00:06:41,320 --> 00:06:42,490 unha linguaxe de programación. 112 00:06:42,490 --> 00:06:45,430 E ata agora, na CS50, temos usado principalmente c. 113 00:06:45,430 --> 00:06:48,320 Polo tanto, este pode ser o código fonte para c. 114 00:06:48,320 --> 00:06:51,440 Posteriormente no curso, noite vén en contacto con outros programas 115 00:06:51,440 --> 00:06:52,480 linguaxes como PHP. 116 00:06:52,480 --> 00:06:57,540 Ou se aínda tomar outras clases, se pode facer Java, Python, ou mesmo OCML. 117 00:06:57,540 --> 00:07:01,570 Pero na nosa linguaxe de programación C, que é como podemos escribir o código fonte 118 00:07:01,570 --> 00:07:04,760 o algoritmo que pseudocódigo Eu só describe anteriormente. 119 00:07:04,760 --> 00:07:08,630 120 00:07:08,630 --> 00:07:11,430 >> Entón como é que o ordenador realmente entender iso? 121 00:07:11,430 --> 00:07:14,490 Como dixen antes, iso só realmente entende ceros e uns. 122 00:07:14,490 --> 00:07:17,880 Entón como é que comeza a partir da fonte código para algo que se pode 123 00:07:17,880 --> 00:07:18,960 comprendidos? 124 00:07:18,960 --> 00:07:22,920 Ben, nós temos algo chamado compilador. 125 00:07:22,920 --> 00:07:28,450 >> Se se lembrar de volta na maior parte do seu Serie de exercicios, que tivo algún tipo de programa 126 00:07:28,450 --> 00:07:30,370 escrito nun ficheiro de punto c. 127 00:07:30,370 --> 00:07:32,550 E entón ten que escribir make. 128 00:07:32,550 --> 00:07:35,970 Entón, o que é facer a facer? 129 00:07:35,970 --> 00:07:39,970 >> Podes escribir make para compilar o seu programa porque someone-- 130 00:07:39,970 --> 00:07:42,730 quen escribiu o seu conxunto p; probablemente David-- 131 00:07:42,730 --> 00:07:44,190 creou un ficheiro de make. 132 00:07:44,190 --> 00:07:51,320 E que di facer saber para realizar o seu compilador, chamado clang, que a vontade 133 00:07:51,320 --> 00:07:55,560 logo compilar o código fonte para obxecto de código, que é ceros e uns 134 00:07:55,560 --> 00:07:57,720 que o ordenador entende. 135 00:07:57,720 --> 00:08:01,610 Pero un pouco máis tarde, iremos máis en profundidade sobre compiladores. 136 00:08:01,610 --> 00:08:05,640 137 00:08:05,640 --> 00:08:10,800 >> Entón lembro pset 0, onde-- si, Ten unha pregunta? 138 00:08:10,800 --> 00:08:11,620 >> Audiencia: [inaudível]? 139 00:08:11,620 --> 00:08:12,490 >> COLUMNA 1: Si. 140 00:08:12,490 --> 00:08:14,960 Eu creo que realmente debe ser en liña. 141 00:08:14,960 --> 00:08:15,120 Si. 142 00:08:15,120 --> 00:08:16,572 >> Audiencia: É como o [inaudível]? 143 00:08:16,572 --> 00:08:19,476 144 00:08:19,476 --> 00:08:20,830 >> COLUMNA 1: Non é. 145 00:08:20,830 --> 00:08:25,810 O son en cs50.net/quizzes. 146 00:08:25,810 --> 00:08:32,900 >> Audiencia: quizzes Slash, barra de 2013, reducir 0, e só facer clic 147 00:08:32,900 --> 00:08:35,956 quizzes 2013 e proba 0, revisar os diapositivas da sección. 148 00:08:35,956 --> 00:08:40,380 >> COLUMNA 1: Si, por iso, se vostedes queren arrincala la e analiza-la no seu 149 00:08:40,380 --> 00:08:42,740 propio ordenador, todo ben tamén. 150 00:08:42,740 --> 00:08:43,130 Diga iso de novo. 151 00:08:43,130 --> 00:08:44,546 >> Audiencia: [inaudível]. 152 00:08:44,546 --> 00:08:48,780 >> COLUMNA 1: Si, [inaudível] é a variable dummy. 153 00:08:48,780 --> 00:08:49,644 Ah, si? 154 00:08:49,644 --> 00:08:51,372 >> Audiencia: [inaudível]? 155 00:08:51,372 --> 00:08:54,300 >> Palestra 1: Non, folgas non están no exame. 156 00:08:54,300 --> 00:08:55,950 Sentímolo, a súa pregunta foi, foi folgas no exame. 157 00:08:55,950 --> 00:08:59,530 E non é. 158 00:08:59,530 --> 00:09:05,780 Entón pset 0, vostedes deben ter todo aplicado algo usando cero. 159 00:09:05,780 --> 00:09:13,100 E aprendemos algunha programación básica bloques de construción que utilizan cero. 160 00:09:13,100 --> 00:09:15,590 >> Entón, imos dar un ollo a algúns destes bloques de construción 161 00:09:15,590 --> 00:09:18,170 que compoñen un programa. 162 00:09:18,170 --> 00:09:20,570 O primeiro é a expresión booleana. 163 00:09:20,570 --> 00:09:24,540 As expresións booleanas son queridos e 0s ou calquera cousa que ten 164 00:09:24,540 --> 00:09:25,700 dous valores posibles. 165 00:09:25,700 --> 00:09:30,320 Neste caso, certas ou falsas, activado ou desactivado, e si ou non. 166 00:09:30,320 --> 00:09:35,390 Un exemplo de un método simple, moi sinxelo, programa que emprega un valor booleano 167 00:09:35,390 --> 00:09:39,140 expresión aquí. 168 00:09:39,140 --> 00:09:43,220 >> Entón, para expresións booleanas para ser útil, temos operadores booleanos. 169 00:09:43,220 --> 00:09:48,920 Estes son os operadores que poden ser utilizados para comparar os valores determinados. 170 00:09:48,920 --> 00:09:52,820 Entón, temos ou non e igual, menos ou igual a, ou maior que 171 00:09:52,820 --> 00:09:55,130 igual a, e menos de ou superior. 172 00:09:55,130 --> 00:09:59,060 Pero estes operadores non son moi útiles salvo que poidamos combina-los en 173 00:09:59,060 --> 00:10:00,320 condicións. 174 00:10:00,320 --> 00:10:04,370 >> Entón vostedes poden lembrar de cero e para a súa p define que 175 00:10:04,370 --> 00:10:05,400 tiña condicións. 176 00:10:05,400 --> 00:10:09,710 Son, esencialmente, como garfos a lóxica do seu programa que 177 00:10:09,710 --> 00:10:12,670 executa consoante unha condición se responde. 178 00:10:12,670 --> 00:10:18,150 Polo tanto, unha das condicións que tiñamos usado moitas veces neste curso é o 179 00:10:18,150 --> 00:10:21,470 se, entón, se, e as condicións de outra persoa. 180 00:10:21,470 --> 00:10:24,060 >> Aquí está un exemplo de como pode usar isto. 181 00:10:24,060 --> 00:10:28,430 Alguén sabe a diferenza entre só usando if todos 182 00:10:28,430 --> 00:10:32,530 o camiño versos if, else, se, e outra cousa combinada? 183 00:10:32,530 --> 00:10:33,013 Si? 184 00:10:33,013 --> 00:10:34,263 >> Audiencia: [inaudível]. 185 00:10:34,263 --> 00:10:40,741 186 00:10:40,741 --> 00:10:42,160 >> COLUMNA 1: Exactamente. 187 00:10:42,160 --> 00:10:50,210 Entón, se eu tivese se todo o camiño ata este forma, mesmo se esa condición retorna 188 00:10:50,210 --> 00:10:52,800 realidade, aínda seguirá probar os dous seguintes. 189 00:10:52,800 --> 00:11:00,120 Considerando que, cun-se máis, outra declaración, se o que retorna true, 190 00:11:00,120 --> 00:11:02,640 os outros non son examinados. 191 00:11:02,640 --> 00:11:05,955 Calquera dúbida sobre iso? 192 00:11:05,955 --> 00:11:06,890 Legal. 193 00:11:06,890 --> 00:11:12,240 >> Entón usa un else if-de outra persoa declaración, se sabe que só pode 194 00:11:12,240 --> 00:11:14,470 ser un deses casos. 195 00:11:14,470 --> 00:11:21,550 Entón, nós sabemos, se x é menor que 0, é definitivamente non será 196 00:11:21,550 --> 00:11:22,890 maior que 0. 197 00:11:22,890 --> 00:11:26,940 198 00:11:26,940 --> 00:11:31,480 >> Logo, outro bloque de construción que aprendemos son loops. 199 00:11:31,480 --> 00:11:33,310 Temos tres tipos de loops. 200 00:11:33,310 --> 00:11:35,830 Para loops, while, e facer mentres loops. 201 00:11:35,830 --> 00:11:38,730 E xeralmente, cando se senta para escribir algo, ten que decidir 202 00:11:38,730 --> 00:11:40,060 cal dos tres quere usar. 203 00:11:40,060 --> 00:11:41,900 Entón, como imos decidir cal deles? 204 00:11:41,900 --> 00:11:44,920 205 00:11:44,920 --> 00:11:48,790 >> Xeralmente usan un loop for, si sabemos cantas veces queremos facer unha iteración 206 00:11:48,790 --> 00:11:53,650 por algo ou cantas veces queremos realizar unha tarefa. 207 00:11:53,650 --> 00:11:58,830 Usamos loops while se necesitamos algunha condición para ser verdade para seguir correndo. 208 00:11:58,830 --> 00:12:03,730 E usamos facer mentres moi semellante ao tempo, pero queremos que o noso código sexa executado en 209 00:12:03,730 --> 00:12:04,880 polo menos unha vez. 210 00:12:04,880 --> 00:12:09,410 >> Entón facer mentres, o que está no facer a vontade sempre executado polo menos unha vez. 211 00:12:09,410 --> 00:12:13,120 Considerando que, co tempo, el pode non funcionar en todos, se o 212 00:12:13,120 --> 00:12:15,490 condición non é satisfeita. 213 00:12:15,490 --> 00:12:16,740 Calquera dúbida con isto? 214 00:12:16,740 --> 00:12:20,480 215 00:12:20,480 --> 00:12:22,860 >> Así, a estrutura dun loop for. 216 00:12:22,860 --> 00:12:23,620 Vós xa deben ter visto iso. 217 00:12:23,620 --> 00:12:25,320 Vostede inicializa-lo. 218 00:12:25,320 --> 00:12:26,600 Ten algún tipo de condición. 219 00:12:26,600 --> 00:12:32,340 Así, por exemplo, podemos arrincar como para i é igual a 0. 220 00:12:32,340 --> 00:12:34,040 i é menos que 10. 221 00:12:34,040 --> 00:12:35,442 E i ++. 222 00:12:35,442 --> 00:12:39,010 Unha moi simples que nós fixemos. 223 00:12:39,010 --> 00:12:42,210 >> Para un loop while, do mesmo xeito, ten ter algún tipo de arranque, 224 00:12:42,210 --> 00:12:44,980 algún tipo de condición, e algún tipo de actualización. 225 00:12:44,980 --> 00:12:51,990 Así, podemos aplicar o noso lazo for tamén como un loop while usando iso. 226 00:12:51,990 --> 00:12:56,000 E do mesmo xeito con un loop Do While, poderiamos ter algunha arranque, 227 00:12:56,000 --> 00:12:58,640 realizar algo, actualiza-lo e a continuación, comprobar a condición. 228 00:12:58,640 --> 00:13:03,500 229 00:13:03,500 --> 00:13:05,140 >> Entón agora funcións. 230 00:13:05,140 --> 00:13:06,460 Poñemos todo xunto. 231 00:13:06,460 --> 00:13:10,140 Podemos querer escribir algúns tipo de función. 232 00:13:10,140 --> 00:13:12,790 Función comúns que pode Xa vimos é o principal. 233 00:13:12,790 --> 00:13:13,770 Iniciar é unha función. 234 00:13:13,770 --> 00:13:16,160 Ten un tipo de retorno, int. 235 00:13:16,160 --> 00:13:18,470 Ten un nome de función, a principal. 236 00:13:18,470 --> 00:13:20,810 E ten argumentos, argc e argv. 237 00:13:20,810 --> 00:13:24,040 Entón principal é só unha función. 238 00:13:24,040 --> 00:13:27,230 >> Outras funcións que podería usar, printf printf-- é un function-- 239 00:13:27,230 --> 00:13:29,330 GetInt, toupper. 240 00:13:29,330 --> 00:13:32,010 Pero estes ocorrer de ser aplicado por nós 241 00:13:32,010 --> 00:13:33,270 algún tipo de biblioteca. 242 00:13:33,270 --> 00:13:37,400 Se vostedes lembran, incluíndo esta biblioteca ou a CS50.h 243 00:13:37,400 --> 00:13:38,510 E / S estándar da biblioteca. 244 00:13:38,510 --> 00:13:39,200 Si, cuestionar? 245 00:13:39,200 --> 00:13:41,610 >> Audiencia: É principal só inherente c? 246 00:13:41,610 --> 00:13:44,740 Será que só unha especie de [inaudível]? 247 00:13:44,740 --> 00:13:47,370 >> COLUMNA 1: O tema é se principal é inherente en c. 248 00:13:47,370 --> 00:13:51,460 E si, as funcións teñen unha función principal. 249 00:13:51,460 --> 00:13:55,290 É unha especie de necesario para o ordenador para saber por onde comezar 250 00:13:55,290 --> 00:13:55,993 execución do código. 251 00:13:55,993 --> 00:13:58,108 >> Audiencia: Entón non vai [inaudível]? 252 00:13:58,108 --> 00:13:59,480 >> COLUMNA 1: N º 253 00:13:59,480 --> 00:14:00,760 Algunha pregunta? 254 00:14:00,760 --> 00:14:03,430 255 00:14:03,430 --> 00:14:04,770 Legal. 256 00:14:04,770 --> 00:14:08,050 Entón, así como pode utilizar unha función que está escrito para ti, tamén se pode 257 00:14:08,050 --> 00:14:10,380 escribir a súa propia función. 258 00:14:10,380 --> 00:14:17,050 Esta é unha función que alguén pode Escribín para calcular o volume 259 00:14:17,050 --> 00:14:18,395 de q, por exemplo. 260 00:14:18,395 --> 00:14:21,300 261 00:14:21,300 --> 00:14:29,500 Hai un tipo de retorno aquí, neste caso int, a nosa q nome da función e noso 262 00:14:29,500 --> 00:14:31,360 lista de parámetros. 263 00:14:31,360 --> 00:14:34,550 >> E teña en conta que ten que escribir os datos tipo do parámetro que quere 264 00:14:34,550 --> 00:14:38,660 ou entón usar a función non fai saber que tipo de 265 00:14:38,660 --> 00:14:41,650 parámetro que debe ser aceptada. 266 00:14:41,650 --> 00:14:48,110 Entón, neste caso, queremos un número enteiro como o noso contribución. 267 00:14:48,110 --> 00:14:50,390 Entón, por que poderiamos querer usar funcións? 268 00:14:50,390 --> 00:14:52,800 >> Primeiro de todo, óptimo para organización. 269 00:14:52,800 --> 00:14:56,350 Eles axudan a romper o seu código en anacos máis organizado e facer 270 00:14:56,350 --> 00:14:57,960 máis fácil de ler. 271 00:14:57,960 --> 00:14:59,760 Simplificación. 272 00:14:59,760 --> 00:15:01,740 Isto é bo para o proxecto. 273 00:15:01,740 --> 00:15:04,570 Cando estás lendo unha peza de código ea función principal é, en realidade, 274 00:15:04,570 --> 00:15:07,750 moi longo, pode ser máis difícil de razoar sobre o que está pasando. 275 00:15:07,750 --> 00:15:11,710 Entón, se división la en funcións, pode ser máis fácil de ler. 276 00:15:11,710 --> 00:15:12,750 E reutiliza-capacidade. 277 00:15:12,750 --> 00:15:16,940 Se ten unha peza de código que está a ser chamado ou executado varias veces, 278 00:15:16,940 --> 00:15:20,690 no canto de ter que volver escribir este código 10 veces na súa función principal, que pode 279 00:15:20,690 --> 00:15:21,440 quere reutiliza-lo. 280 00:15:21,440 --> 00:15:25,740 E entón, cada vez que precisa para usá- peza de código, chamar a función. 281 00:15:25,740 --> 00:15:30,550 282 00:15:30,550 --> 00:15:35,380 >> Entón, agora, se nos lembrar de volta a cero, nós tamén falou sobre algúns conceptos, 283 00:15:35,380 --> 00:15:37,680 unha das cales é unha rosca. 284 00:15:37,680 --> 00:15:41,120 Tema é o concepto de múltiplo secuencias de código 285 00:15:41,120 --> 00:15:43,040 executando á vez. 286 00:15:43,040 --> 00:15:47,490 Entón, creo que volta a un día no que David tiña vostedes contaren o número de 287 00:15:47,490 --> 00:15:48,440 persoas na sala. 288 00:15:48,440 --> 00:15:50,550 >> En esencia, o que estaba a suceder é sobre todos vostedes foron 289 00:15:50,550 --> 00:15:52,370 executando rutas separados. 290 00:15:52,370 --> 00:15:55,540 E estes temas foron reunindo para obter algún tipo de resposta. 291 00:15:55,540 --> 00:15:58,890 Do mesmo xeito, en perigo, cando ten varios sprites, pode 292 00:15:58,890 --> 00:16:01,070 teño un gato e un can. 293 00:16:01,070 --> 00:16:08,770 E eles serían simultaneamente executando os seus propios scripts. 294 00:16:08,770 --> 00:16:10,020 Isto é un exemplo de segmentación. 295 00:16:10,020 --> 00:16:12,860 296 00:16:12,860 --> 00:16:18,000 >> E o outro concepto que foi foi introducido en cero eventos. 297 00:16:18,000 --> 00:16:22,550 E os eventos cando varias partes do seu código de comunicarse uns cos outros. 298 00:16:22,550 --> 00:16:26,840 En principio, esta foi cando usou o control da transmisión e da Cando 299 00:16:26,840 --> 00:16:29,500 Recibir bloques. 300 00:16:29,500 --> 00:16:35,170 >> E tamén, o Conxunto de problemas 4, vimos un pouco de eventos tamén. 301 00:16:35,170 --> 00:16:38,250 Vostedes poderían usar a biblioteca Gevent. 302 00:16:38,250 --> 00:16:42,450 E non era unha función waitForClick en que estaba esperando 303 00:16:42,450 --> 00:16:44,300 para que o usuario prema. 304 00:16:44,300 --> 00:16:47,870 E o seu clic, neste caso, sería o evento e esperar por click é o seu 305 00:16:47,870 --> 00:16:49,120 manipulador de eventos. 306 00:16:49,120 --> 00:16:53,690 307 00:16:53,690 --> 00:16:58,630 >> E tamén, ao longo de realizar os seus Serie de exercicios e traballar en súas Serie de exercicios, ten 308 00:16:58,630 --> 00:17:01,920 pode entrar en contacto con algúns destes comandos. 309 00:17:01,920 --> 00:17:05,579 Isto é o que escribiu no seu fiestra de terminal ou o que quere que a fiestra 310 00:17:05,579 --> 00:17:12,119 que aparece na súa edición para g, esencialmente, navegar no seu ordenador. 311 00:17:12,119 --> 00:17:19,440 >> Así, por exemplo, LS lista o contido dun directorio. 312 00:17:19,440 --> 00:17:22,510 Fai directorio crea un novo cartafol. 313 00:17:22,510 --> 00:17:24,819 CD, cambie o directorio. 314 00:17:24,819 --> 00:17:28,400 RM, eliminar, eliminar un ficheiro ou algún directorio. 315 00:17:28,400 --> 00:17:31,050 E, a continuación, eliminar o directorio elimina un directorio. 316 00:17:31,050 --> 00:17:32,300 >> Audiencia: [inaudível]? 317 00:17:32,300 --> 00:17:36,978 318 00:17:36,978 --> 00:17:38,370 >> COLUMNA 1: Si, con certeza. 319 00:17:38,370 --> 00:17:42,530 320 00:17:42,530 --> 00:17:46,040 Sentímolo, a pregunta era se suxiro poñer este 321 00:17:46,040 --> 00:17:48,840 sobre a folla de fraude. 322 00:17:48,840 --> 00:17:49,440 Podería axudar. 323 00:17:49,440 --> 00:17:51,490 Se ten espazo, pode poñelas. 324 00:17:51,490 --> 00:17:56,170 Tamén é só xeralmente bo o suficiente de lembrar, porque cando usalo 325 00:17:56,170 --> 00:17:59,060 pode querer só ter memorizado. 326 00:17:59,060 --> 00:18:02,750 Isto vai facer a súa vida moito máis fácil. 327 00:18:02,750 --> 00:18:04,000 Será que eu responder a súa pregunta? 328 00:18:04,000 --> 00:18:10,528 329 00:18:10,528 --> 00:18:14,290 >> Entón, agora, nós falamos un pouco brevemente sobre bibliotecas. 330 00:18:14,290 --> 00:18:18,570 Pero as dúas principais que fomos usando ata agora no curso son 331 00:18:18,570 --> 00:18:20,860 estándar I / O e CS50. 332 00:18:20,860 --> 00:18:25,410 Que tipo de cousas están incluídas na biblioteca estándar I / O? 333 00:18:25,410 --> 00:18:28,410 >> Si, ata agora usamos printf. 334 00:18:28,410 --> 00:18:31,150 En CS50, usan GetInt e GetString. 335 00:18:31,150 --> 00:18:37,200 E a secuencia de tipo de datos tamén acontece sendo declarado nesta biblioteca CS50. 336 00:18:37,200 --> 00:18:40,250 Imos falar un pouco máis en profundidade sobre como as bibliotecas funcionan e como 337 00:18:40,250 --> 00:18:41,870 interactuar co resto do seu código. 338 00:18:41,870 --> 00:18:46,220 Pero estas son as dúas principais que entrar en contacto coa medida en 339 00:18:46,220 --> 00:18:48,430 o curso. 340 00:18:48,430 --> 00:18:50,050 >> Tipos. 341 00:18:50,050 --> 00:18:58,120 Estes son bos para lembrar o que cada tipo está representado por ou como 342 00:18:58,120 --> 00:19:02,840 moitos bytes cada tipo de requires-- 343 00:19:02,840 --> 00:19:04,990 int, 4 bytes; char, un byte. 344 00:19:04,990 --> 00:19:06,550 Float é de 4 bytes. 345 00:19:06,550 --> 00:19:07,782 Que é unha parella? 346 00:19:07,782 --> 00:19:09,032 >> Audiencia: [inaudível]. 347 00:19:09,032 --> 00:19:11,398 348 00:19:11,398 --> 00:19:16,240 >> COLUMNA 1: É, polo tanto, un flotador pero o dobre do tamaño. 349 00:19:16,240 --> 00:19:17,150 Que tal un tempo? 350 00:19:17,150 --> 00:19:18,400 >> Audiencia: [inaudível]. 351 00:19:18,400 --> 00:19:21,614 352 00:19:21,614 --> 00:19:24,680 >> COLUMNA 1: Aceptar. 353 00:19:24,680 --> 00:19:25,410 ¿Que é un tempo? 354 00:19:25,410 --> 00:19:26,660 >> Audiencia: [inaudível]. 355 00:19:26,660 --> 00:19:29,400 356 00:19:29,400 --> 00:19:31,450 >> COLUMNA 1: Si, o dobre dun int. 357 00:19:31,450 --> 00:19:34,240 358 00:19:34,240 --> 00:19:34,705 Si. 359 00:19:34,705 --> 00:19:36,100 >> Audiencia: [inaudível]. 360 00:19:36,100 --> 00:19:38,030 >> COLUMNA 1: Long [inaudível]. 361 00:19:38,030 --> 00:19:41,860 E despois dun longo tempo é o dobre diso. 362 00:19:41,860 --> 00:19:42,814 >> Audiencia: Non, non. 363 00:19:42,814 --> 00:19:47,107 Unha longa é só un int. 364 00:19:47,107 --> 00:19:50,910 Depende da arquitectura antes de que o [inaudível] 365 00:19:50,910 --> 00:19:52,922 int e teñen o mesmo tamaño. 366 00:19:52,922 --> 00:19:54,172 [Inaudível]. 367 00:19:54,172 --> 00:19:58,841 368 00:19:58,841 --> 00:20:00,920 >> COLUMNA 1: Entón, un longo e un int son os mesmos. 369 00:20:00,920 --> 00:20:02,943 E despois dun longo tempo é o dobre do int. 370 00:20:02,943 --> 00:20:03,910 Legal. 371 00:20:03,910 --> 00:20:05,550 E entón, cal é o último tipo? 372 00:20:05,550 --> 00:20:06,510 >> Audiencia: Pointer. 373 00:20:06,510 --> 00:20:10,350 >> COLUMNA 1: Si, por iso, aprendemos algo sobre punteiros. 374 00:20:10,350 --> 00:20:14,015 E, independentemente do que un punteiro é apuntando para-- podería ser unha estrela de char 375 00:20:14,015 --> 00:20:15,880 ou un int star-- 376 00:20:15,880 --> 00:20:20,530 sempre 4 bytes para un punteiro. 377 00:20:20,530 --> 00:20:21,633 Preguntas sobre iso? 378 00:20:21,633 --> 00:20:22,116 Si? 379 00:20:22,116 --> 00:20:24,531 >> Audiencia: [inaudível]? 380 00:20:24,531 --> 00:20:29,530 >> COLUMNA 1: Entón, un longo e un int son mesmo neste aparello CS50. 381 00:20:29,530 --> 00:20:32,302 >> Audiencia: O aparello está completamente intercambiables. 382 00:20:32,302 --> 00:20:33,510 >> COLUMNA 1: Yeah. 383 00:20:33,510 --> 00:20:36,610 Entón, despois dun longo tempo é o dobre dun int. 384 00:20:36,610 --> 00:20:39,250 >> Audiencia: Este é o 32 bits? 385 00:20:39,250 --> 00:20:40,620 >> COLUMNA 1: 32 bits, si. 386 00:20:40,620 --> 00:20:43,572 >> Audiencia: Entón, [inaudível]? 387 00:20:43,572 --> 00:20:46,790 >> COLUMNA 1: Si, se iso non acontecer explicitamente dicir, 388 00:20:46,790 --> 00:20:47,870 debe asumir algo 32. 389 00:20:47,870 --> 00:20:50,040 >> Audiencia: El diría algo como asumindo un 390 00:20:50,040 --> 00:20:51,498 Arquitectura como o aparello. 391 00:20:51,498 --> 00:20:58,800 392 00:20:58,800 --> 00:21:01,710 Para 64 bits, as únicas cousas que cambio son longos e punteiros. 393 00:21:01,710 --> 00:21:05,614 Ambos [inaudível]. 394 00:21:05,614 --> 00:21:06,590 >> COLUMNA 1: Si? 395 00:21:06,590 --> 00:21:07,566 >> Audiencia: Pregunta. 396 00:21:07,566 --> 00:21:10,982 Así, nun das probas prácticos, el pregunta sobre un unsigned int. 397 00:21:10,982 --> 00:21:15,374 Entón, como iso sería determinado dende un int [inaudível]? 398 00:21:15,374 --> 00:21:18,140 >> COLUMNA 1: Un unsigned en tamén é 4 bytes. 399 00:21:18,140 --> 00:21:21,172 Pero o que é diferente sobre a sinatura int e un unsigned int? 400 00:21:21,172 --> 00:21:22,422 >> Audiencia: [inaudível]. 401 00:21:22,422 --> 00:21:24,868 402 00:21:24,868 --> 00:21:25,630 >> COLUMNA 1: Certo. 403 00:21:25,630 --> 00:21:27,570 Pódese representar os valores negativos. 404 00:21:27,570 --> 00:21:28,580 Pero como facelo? 405 00:21:28,580 --> 00:21:30,536 >> Audiencia: [inaudível]. 406 00:21:30,536 --> 00:21:36,370 >> COLUMNA 1: Si, el salva un bit para representar o sinal. 407 00:21:36,370 --> 00:21:40,910 408 00:21:40,910 --> 00:21:45,040 A sinatura ten algo que representa o sinal. 409 00:21:45,040 --> 00:21:48,886 E non asinado só é todos os aspectos positivos. 410 00:21:48,886 --> 00:21:50,365 >> Audiencia: Aceptar. 411 00:21:50,365 --> 00:21:54,230 Entón di que o dúo é dúas veces o tamaño dun flotador? 412 00:21:54,230 --> 00:21:58,202 >> COLUMNA 1: Dobre é dúas veces o tamaño dun flotador, si. 413 00:21:58,202 --> 00:22:01,639 >> Audiencia: Como é que un punteiro para un longo [inaudível]? 414 00:22:01,639 --> 00:22:06,058 415 00:22:06,058 --> 00:22:10,870 >> COLUMNA 1: Entón a pregunta é como é que o punteiro para unha longa long-- 416 00:22:10,870 --> 00:22:13,800 como é que só catro bytes cando un longo seus 8 bytes. 417 00:22:13,800 --> 00:22:17,310 Entón recorda que é un punteiro, esencialmente, polo valor moi base. 418 00:22:17,310 --> 00:22:19,046 >> Audiencia: [inaudível]. 419 00:22:19,046 --> 00:22:22,670 >> COLUMNA 1: Si, entón un punteiro é só un lugar de memoria. 420 00:22:22,670 --> 00:22:28,040 Por iso, non importa o que de espazo ese punteiro está apuntando. 421 00:22:28,040 --> 00:22:32,060 El só precisa de 4 bytes para seguir de que a localización de memoria. 422 00:22:32,060 --> 00:22:34,760 423 00:22:34,760 --> 00:22:36,010 Algunha pregunta? 424 00:22:36,010 --> 00:22:39,800 425 00:22:39,800 --> 00:22:41,050 Legal. 426 00:22:41,050 --> 00:22:42,920 427 00:22:42,920 --> 00:22:47,460 >> Así, a última cousa que eu teño é a saída estándar. 428 00:22:47,460 --> 00:22:51,020 Debe usalos miúdo abondo para que poida lembrar. 429 00:22:51,020 --> 00:22:54,800 Pero iso é cando usamos printf, por exemplo. 430 00:22:54,800 --> 00:22:59,260 E nós temos estes espazos reservados que foron chamados códigos de formato. 431 00:22:59,260 --> 00:23:03,910 >> Entón por cento c char, i por cento a int, e tamén podemos utilizar por cento d. 432 00:23:03,910 --> 00:23:05,130 É o mesmo. 433 00:23:05,130 --> 00:23:08,200 Pero, en xeral, en que CS50 proba a usar por cento i. 434 00:23:08,200 --> 00:23:09,860 Porcentaxe f para float. 435 00:23:09,860 --> 00:23:15,620 Ld por cento por moito tempo e por cento sa cadea. 436 00:23:15,620 --> 00:23:18,550 >> Do mesmo xeito, temos benvida a empregar algúns desas secuencias de escape. 437 00:23:18,550 --> 00:23:22,431 Por exemplo, barra invertida n para nova liña. 438 00:23:22,431 --> 00:23:26,910 Este é só para cando está formateo seu código para imprimir f. 439 00:23:26,910 --> 00:23:27,260 Si? 440 00:23:27,260 --> 00:23:28,906 >> Audiencia: Cal é a porcentaxe de d? 441 00:23:28,906 --> 00:23:31,850 >> COLUMNA 1: Entón a pregunta é o que é por cento d a? 442 00:23:31,850 --> 00:23:33,270 Porcentaxe d é a Ints. 443 00:23:33,270 --> 00:23:37,392 Porcentaxe d e i por cento son os mesmos. 444 00:23:37,392 --> 00:23:41,130 >> Audiencia: Cal é a diferenza entre barra invertida n e barra invertida r? 445 00:23:41,130 --> 00:23:45,300 >> COLUMNA 1: Entón a pregunta é, cal é o diferenza entre o n e a folga 446 00:23:45,300 --> 00:23:48,615 r reacción? 447 00:23:48,615 --> 00:23:50,906 Creo barra invertida r é-- 448 00:23:50,906 --> 00:23:54,340 >> Audiencia: Entón barra invertida r só implica retorna ao comezo da liña 449 00:23:54,340 --> 00:23:56,670 sen realmente ir a unha nova liña. 450 00:23:56,670 --> 00:24:01,000 Entón, se imprimir unha barra invertida r e volver ao principio da liña 451 00:24:01,000 --> 00:24:04,005 a continuación, imprimir máis cousas, sobrescribir o material que xa está no 452 00:24:04,005 --> 00:24:04,390 [Inaudível]. 453 00:24:04,390 --> 00:24:06,725 Considerando que, en realidade, n vai a unha nova liña e vai ao [inaudível]. 454 00:24:06,725 --> 00:24:10,525 455 00:24:10,525 --> 00:24:13,915 >> COLUMNA 1: Ben, algunha pregunta? 456 00:24:13,915 --> 00:24:15,430 Todo correcto. 457 00:24:15,430 --> 00:24:18,617 Vou entregalo a Dan, que vai continuar. 458 00:24:18,617 --> 00:24:25,078 >> [Aplausos] 459 00:24:25,078 --> 00:25:08,814 460 00:25:08,814 --> 00:25:09,720 >> DAN: Todo ben. 461 00:25:09,720 --> 00:25:18,590 Entón, eu vou estar falando doutro gran gama de ideas da clase que son 462 00:25:18,590 --> 00:25:23,220 aproximadamente representante de dúas semanas e o inicio da terceira semana comezando 463 00:25:23,220 --> 00:25:28,690 con fundición, que é só unha forma de tratamento dun valor dun determinado tipo, como 464 00:25:28,690 --> 00:25:30,830 un valor de un tipo. 465 00:25:30,830 --> 00:25:34,110 Así, podemos facelo con carácteres para Ints, Carrozas para Ints e 466 00:25:34,110 --> 00:25:35,360 Longs longos para o dobre. 467 00:25:35,360 --> 00:25:38,170 468 00:25:38,170 --> 00:25:44,500 >> Todas estas cousas poden ser utilizadas como formas para o tratamento de algún valor numérico 469 00:25:44,500 --> 00:25:48,370 menos de char como algún outro valor numérico. 470 00:25:48,370 --> 00:25:54,480 Polo tanto, hai algunhas cuestións con este, de Por suposto, o que pasa cando xoga 471 00:25:54,480 --> 00:25:57,860 cousas como boia para Ints. 472 00:25:57,860 --> 00:26:00,500 Entón, iso é un pouco raro. 473 00:26:00,500 --> 00:26:03,170 Temos un coche que é de 1,31. 474 00:26:03,170 --> 00:26:05,220 Nós multiplicala lo por 10 mil. 475 00:26:05,220 --> 00:26:08,380 E, entón, imprimir lo como un int. 476 00:26:08,380 --> 00:26:09,630 Que esta saída? 477 00:26:09,630 --> 00:26:11,600 478 00:26:11,600 --> 00:26:14,020 10.000 veces 1,31. 479 00:26:14,020 --> 00:26:18,761 Así 13000, que é a estimación? 480 00:26:18,761 --> 00:26:20,685 >> Audiencia: Creo que é 10.000. 481 00:26:20,685 --> 00:26:24,234 >> DAN: Entón, eu estou multiplicándose o por 10.000 antes de que eu estou lanzando-lo. 482 00:26:24,234 --> 00:26:25,202 >> Audiencia: Oh. 483 00:26:25,202 --> 00:26:27,622 Non habería un 9 e algúns números de 0? 484 00:26:27,622 --> 00:26:29,270 >> DAN: Pode ter algúns díxitos estraños. 485 00:26:29,270 --> 00:26:32,410 486 00:26:32,410 --> 00:26:37,670 Tan seguro, que é 1,3 veces 10.000. 487 00:26:37,670 --> 00:26:40,040 Entón é 13.000. 488 00:26:40,040 --> 00:26:41,313 E este weird-- adicional 489 00:26:41,313 --> 00:26:42,160 >> PÚBLICO: 13.100. 490 00:26:42,160 --> 00:26:42,650 >> DAN: 13.100. 491 00:26:42,650 --> 00:26:44,910 Grazas, Rob. 492 00:26:44,910 --> 00:26:46,610 E este weirdness-- adicional 493 00:26:46,610 --> 00:26:48,060 este 9,9-- 494 00:26:48,060 --> 00:26:53,860 é simplemente porque este reparto acabou redondeo onde 495 00:26:53,860 --> 00:26:55,394 non debe ter. 496 00:26:55,394 --> 00:26:55,871 Si. 497 00:26:55,871 --> 00:26:58,256 >> Audiencia: O casting pasa tras algo máis? 498 00:26:58,256 --> 00:27:03,865 >> DAN: Entón por que eu teño iso por escrito, que fai iso antes de multiplicación 499 00:27:03,865 --> 00:27:05,230 fai casting. 500 00:27:05,230 --> 00:27:06,140 >> Audiencia: [inaudível]. 501 00:27:06,140 --> 00:27:11,350 >> DAN: Creo que sería lanzado en primeiro lugar, si, o que sería 10.000. 502 00:27:11,350 --> 00:27:12,610 Algo máis? 503 00:27:12,610 --> 00:27:13,330 Legal. 504 00:27:13,330 --> 00:27:16,344 Polo tanto, esta é 13.099. 505 00:27:16,344 --> 00:27:17,840 Por que isto ocorre? 506 00:27:17,840 --> 00:27:18,900 A imprecisión. 507 00:27:18,900 --> 00:27:21,020 >> Coches alegóricos non son perfectos. 508 00:27:21,020 --> 00:27:27,550 Eles só poden representar números a un número de algarismos significativos. 509 00:27:27,550 --> 00:27:35,120 Entón, se nós imprimir 8 figos sig en este float, temos unha especie de 510 00:27:35,120 --> 00:27:36,800 número mirando feo. 511 00:27:36,800 --> 00:27:45,580 E iso é porque 1,31 non pode con precisión ser representados por simple 512 00:27:45,580 --> 00:27:49,000 potencias de dous na máquina. 513 00:27:49,000 --> 00:27:53,530 Por iso, acaba tendo o máis próximo creo que, o que acaba 514 00:27:53,530 --> 00:27:55,710 ser un pouco baixa. 515 00:27:55,710 --> 00:27:57,730 Ten sentido? 516 00:27:57,730 --> 00:27:59,110 Está ben. 517 00:27:59,110 --> 00:28:05,840 >> Agora cambiou son unha forma diferente de facendo declaracións condicionais no que todos os 518 00:28:05,840 --> 00:28:09,900 que nos interesa é a única variable. 519 00:28:09,900 --> 00:28:16,570 Polo tanto, neste exemplo concreto, estamos recibindo un número enteiro do usuario. 520 00:28:16,570 --> 00:28:21,070 E entón, nós estamos mirando para o que este enteiro é. 521 00:28:21,070 --> 00:28:23,500 Presuntamente, é o número entre un e catro. 522 00:28:23,500 --> 00:28:24,800 Iso é o que estamos pedindo. 523 00:28:24,800 --> 00:28:28,450 >> Entón fai un cambio de nome da variable. 524 00:28:28,450 --> 00:28:34,290 A continuación, ten establece os casos de posible valores que podería ser. 525 00:28:34,290 --> 00:28:37,730 Entón caso dun, digo que é baixa. 526 00:28:37,730 --> 00:28:41,080 E entón rompe para saír da condición clave para que 527 00:28:41,080 --> 00:28:43,270 non continuar. 528 00:28:43,270 --> 00:28:44,830 >> Na seguinte caso-- 529 00:28:44,830 --> 00:28:46,940 así se dous e caso três-- 530 00:28:46,940 --> 00:28:51,920 de ser o caso dous só cae para a primeira liña de código que ve como coa 531 00:28:51,920 --> 00:28:55,400 caso, tres, ata que ve unha pausa. 532 00:28:55,400 --> 00:29:00,430 Polo tanto, a razón que comeza un caso para só impresión baixo é porque eu 533 00:29:00,430 --> 00:29:01,890 ter esa pausa aquí. 534 00:29:01,890 --> 00:29:05,360 Se eu, por exemplo, ignorou esta break-- se eu xoguei este breakaway-- 535 00:29:05,360 --> 00:29:09,740 sería imprimir baixa, e entón sería imprimir medio, e, a continuación, el ía romper. 536 00:29:09,740 --> 00:29:12,200 >> Entón breaks son unha parte importante de cambiar as condicións e 537 00:29:12,200 --> 00:29:14,340 eles deben estar alí. 538 00:29:14,340 --> 00:29:20,070 Os casos que non sexan recoñecidos explicitamente son tratados polo estándar 539 00:29:20,070 --> 00:29:26,645 caso no interruptor e debe ser lanzado. 540 00:29:26,645 --> 00:29:31,363 >> Audiencia: So 1, 2, 3, e 4 serían n? 541 00:29:31,363 --> 00:29:33,310 >> DAN: Os valores que n pode ser. 542 00:29:33,310 --> 00:29:34,654 Si. 543 00:29:34,654 --> 00:29:35,146 Si? 544 00:29:35,146 --> 00:29:37,606 >> Audiencia: Entón, cando ten que [inaudível]? 545 00:29:37,606 --> 00:29:44,002 546 00:29:44,002 --> 00:29:46,830 >> DAN: Ía imprimir baixo, e logo sería imprimir medio, e 547 00:29:46,830 --> 00:29:47,400 logo ía romper. 548 00:29:47,400 --> 00:29:50,244 >> Audiencia: Por que ía imprimir medio que [inaudível]? 549 00:29:50,244 --> 00:29:54,036 550 00:29:54,036 --> 00:30:00,550 >> DAN: Entón, todo baixo un caso antes dunha pausa se enmarca. 551 00:30:00,550 --> 00:30:09,390 Así, no caso dunha impresión é caso baixo un como a presente na secuencia de impresión. 552 00:30:09,390 --> 00:30:09,890 Si? 553 00:30:09,890 --> 00:30:11,140 >> Audiencia: [inaudível]? 554 00:30:11,140 --> 00:30:15,890 555 00:30:15,890 --> 00:30:22,170 >> DAN: Entón ese número é só unha especial valor que esta variable 556 00:30:22,170 --> 00:30:23,420 pode tomar, non? 557 00:30:23,420 --> 00:30:26,740 558 00:30:26,740 --> 00:30:28,490 Será que isto ten sentido? 559 00:30:28,490 --> 00:30:28,990 Si. 560 00:30:28,990 --> 00:30:31,490 >> Audiencia: [inaudível]? 561 00:30:31,490 --> 00:30:34,130 >> DAN: Si, se dous ía imprimir medio e, a continuación, romper. 562 00:30:34,130 --> 00:30:35,380 >> Audiencia: [inaudível]? 563 00:30:35,380 --> 00:30:37,954 564 00:30:37,954 --> 00:30:40,050 >> DAN: Creo que calquera? 565 00:30:40,050 --> 00:30:43,855 Que outros tipos de datos pode pasar? 566 00:30:43,855 --> 00:30:46,320 >> Audiencia: Pode cambiar sobre calquera tipo de datos. 567 00:30:46,320 --> 00:30:50,905 Pero iso só significa algo máis caracteres e Ints e cousas así, porque 568 00:30:50,905 --> 00:30:55,600 se está migrando un punteiro que realmente non ten sentido, 569 00:30:55,600 --> 00:30:59,555 conmutación de cargas, se aínda imos fai isto, por mor de punto flotante 570 00:30:59,555 --> 00:31:02,840 en precisión, o que realmente non quero facelo de calquera maneira. 571 00:31:02,840 --> 00:31:07,320 Entón, basicamente, só enteiros e caracteres e cousas así. 572 00:31:07,320 --> 00:31:12,360 >> DAN: Si, é cando ten explícita valores que vostede sabe, eu creo, pode ser 573 00:31:12,360 --> 00:31:14,250 que o cambio é realmente útil. 574 00:31:14,250 --> 00:31:17,094 575 00:31:17,094 --> 00:31:18,990 Boa? 576 00:31:18,990 --> 00:31:21,370 Está ben. 577 00:31:21,370 --> 00:31:26,180 >> O ámbito é o intervalo que a declarada variable estende. 578 00:31:26,180 --> 00:31:32,190 Entón neste pequeno anaco de código que eu teño, sería cheo de erros. 579 00:31:32,190 --> 00:31:41,450 E a razón é que declarei iso int i dentro do ámbito deste loop. 580 00:31:41,450 --> 00:31:46,390 E entón eu estou tentando facer referencia que i fóra dese ámbito de loop. 581 00:31:46,390 --> 00:31:50,330 >> Entón, basicamente, pode pensar sobre o alcance como calquera cousa que declarar 582 00:31:50,330 --> 00:31:59,750 con dentro dun conxunto de chaves só existe dentro destas claves. 583 00:31:59,750 --> 00:32:04,990 E se tentar usar esa variable fóra destas chaves, vostede 584 00:32:04,990 --> 00:32:08,356 obter un erro do compilador. 585 00:32:08,356 --> 00:32:08,812 Si? 586 00:32:08,812 --> 00:32:09,724 >> Audiencia: Entón este non funciona? 587 00:32:09,724 --> 00:32:11,790 >> DAN: Esta función non funciona, si. 588 00:32:11,790 --> 00:32:17,190 589 00:32:17,190 --> 00:32:18,660 Cordas. 590 00:32:18,660 --> 00:32:19,780 Cadea a char *. 591 00:32:19,780 --> 00:32:22,250 Son exactamente o mesmo. 592 00:32:22,250 --> 00:32:25,540 Son só enlaces a caracteres. 593 00:32:25,540 --> 00:32:33,000 E ningún carácter que debe rematar con barra invertida cero, que é só 594 00:32:33,000 --> 00:32:34,410 unha convención c. 595 00:32:34,410 --> 00:32:36,680 >> El é chamado o terminador nulo. 596 00:32:36,680 --> 00:32:39,050 E NULL-- 597 00:32:39,050 --> 00:32:41,670 N maiúscula, capital de U, o capital L, o capital eu-- 598 00:32:41,670 --> 00:32:44,290 non é o mesmo que o Terminador NULL. 599 00:32:44,290 --> 00:32:46,640 Este é un punteiro. 600 00:32:46,640 --> 00:32:48,280 Este é un personaxe. 601 00:32:48,280 --> 00:32:49,530 Son moi distintas. 602 00:32:49,530 --> 00:32:50,200 Teña en conta que diso. 603 00:32:50,200 --> 00:32:52,320 Será no cuestionario, probabelmente. 604 00:32:52,320 --> 00:32:54,040 Eu non vin o cuestionario. 605 00:32:54,040 --> 00:32:57,880 606 00:32:57,880 --> 00:32:58,840 Si? 607 00:32:58,840 --> 00:33:01,232 >> Audiencia: Entón NULL é, digamos, o punteiro? 608 00:33:01,232 --> 00:33:01,995 >> DAN: Si. 609 00:33:01,995 --> 00:33:05,170 >> Audiencia: Que [inaudível]? 610 00:33:05,170 --> 00:33:10,050 >> DAN: Se, por exemplo, malloc chámase cando non ten memoria suficiente para obter 611 00:33:10,050 --> 00:33:14,400 o tamaño que está pedindo, malloc volverá NULL. 612 00:33:14,400 --> 00:33:19,550 É basicamente cando unha función é debe voltar un punteiro, ten 613 00:33:19,550 --> 00:33:22,600 que comprobar contra NULL porque NULL é un bom-- moi 614 00:33:22,600 --> 00:33:25,260 é, máis ou menos, o valor de lixo. 615 00:33:25,260 --> 00:33:27,050 É un cero na medida en que os punteiros balde. 616 00:33:27,050 --> 00:33:29,630 617 00:33:29,630 --> 00:33:32,250 >> Sempre que chamar a unha función, que retorna un punteiro. 618 00:33:32,250 --> 00:33:35,960 Vai querer comprobar-se Asegúrese de que este punteiro non é NULL 619 00:33:35,960 --> 00:33:37,760 porque NULL é moi común. 620 00:33:37,760 --> 00:33:40,160 É unha especie de retorno lixo. 621 00:33:40,160 --> 00:33:44,902 Entón, se algo non vai ben, só retornan NULL no lugar. 622 00:33:44,902 --> 00:33:45,898 >> Audiencia: [inaudível]? 623 00:33:45,898 --> 00:33:48,922 >> DAN: Si, e iso é iso. 624 00:33:48,922 --> 00:33:51,750 >> Audiencia: [inaudível]? 625 00:33:51,750 --> 00:33:52,800 >> DAN: Spell-lo como esta. 626 00:33:52,800 --> 00:33:54,150 É o terminador NULL. 627 00:33:54,150 --> 00:33:56,560 É minúscula N-K-L-L se vostede deletrear-la. 628 00:33:56,560 --> 00:33:59,860 >> Audiencia: E eu só fun atrás e probou. 629 00:33:59,860 --> 00:34:03,010 E se tentar poñer un punto flotante valor nun switch, que vai berrar contigo 630 00:34:03,010 --> 00:34:05,916 dicir, indicación require expresión do tipo enteiro. 631 00:34:05,916 --> 00:34:07,166 >> DAN: Alí vai vostede. 632 00:34:07,166 --> 00:34:09,639 633 00:34:09,639 --> 00:34:12,246 Pero si, o que era a pregunta? 634 00:34:12,246 --> 00:34:13,496 >> Audiencia: [inaudível]? 635 00:34:13,496 --> 00:34:16,150 636 00:34:16,150 --> 00:34:23,679 >> DAN: Entón o capital N, capital de U, o capital L, L maiúsculo é unha cousa real c. 637 00:34:23,679 --> 00:34:29,719 É o punteiro nulo e só ser tratado como tal. 638 00:34:29,719 --> 00:34:33,530 Vostede non vai deletrear o Carácter NULL para ver calquera 639 00:34:33,530 --> 00:34:35,630 outra forma que non esta. 640 00:34:35,630 --> 00:34:36,610 Si? 641 00:34:36,610 --> 00:34:42,490 >> Audiencia: Entón Voltar a char max ou algo nas notas, sería 642 00:34:42,490 --> 00:34:43,960 encarnan a mesma función como [inaudível]? 643 00:34:43,960 --> 00:34:50,655 644 00:34:50,655 --> 00:34:54,949 >> Audiencia: Entón está referíndose a retornando de char máximo de getchar, ou 645 00:34:54,949 --> 00:34:55,444 sexa o que sexa? 646 00:34:55,444 --> 00:34:55,940 >> Audiencia: Yeah. 647 00:34:55,940 --> 00:34:58,620 >> Audiencia: Si, entón o xeneral prazo para todas esas cousas 648 00:34:58,620 --> 00:34:59,920 son valores sentinela. 649 00:34:59,920 --> 00:35:03,640 Así como volver int max de GetInt e Charlotte máximo de getchar, é 650 00:35:03,640 --> 00:35:06,010 debería ser así, todo ben, se esas cousas están volvendo a nós, 651 00:35:06,010 --> 00:35:07,210 algo deu mal. 652 00:35:07,210 --> 00:35:09,950 >> Para punteiros, que só terá lugar a ter este valor de sentinela que todos 653 00:35:09,950 --> 00:35:10,750 Acepta arriba. 654 00:35:10,750 --> 00:35:13,210 E esta é a cousa que volver cando as cousas van mal. 655 00:35:13,210 --> 00:35:15,910 Entón Char max é o que estamos a usar para representar algo 656 00:35:15,910 --> 00:35:18,100 como NULL ou getchar. 657 00:35:18,100 --> 00:35:23,420 >> Audiencia: Entón, se está probando getchar, podería só poñer NULL? 658 00:35:23,420 --> 00:35:23,910 Tería que facer a diferenza? 659 00:35:23,910 --> 00:35:25,400 >> DAN: Pode non só comprobar NULL. 660 00:35:25,400 --> 00:35:30,130 Vostede tería que comprobar carácter máximo porque o valor de retorno da función é 661 00:35:30,130 --> 00:35:35,416 un carácter non un punteiro. 662 00:35:35,416 --> 00:35:35,888 Si? 663 00:35:35,888 --> 00:35:38,248 >> Audiencia: Esta pregunta ao longo da corda. 664 00:35:38,248 --> 00:35:40,136 Isto inclúe o carácter NULL? 665 00:35:40,136 --> 00:35:41,000 >> DAN: N º 666 00:35:41,000 --> 00:35:45,930 E iso é, en realidade, como lonxitude da corda sabe que deixar porque pasa por 667 00:35:45,930 --> 00:35:49,070 seu conxunto de caracteres ata el ve un personaxe NULL. 668 00:35:49,070 --> 00:35:51,030 E entón como é, todo ben, eu son feito. 669 00:35:51,030 --> 00:35:52,130 >> Audiencia: [inaudível] cinco? 670 00:35:52,130 --> 00:35:53,990 >> DAN: Ola sería cinco. 671 00:35:53,990 --> 00:35:55,240 Yep. 672 00:35:55,240 --> 00:35:59,580 673 00:35:59,580 --> 00:36:02,880 Entón matrices son continuas bloques de memoria. 674 00:36:02,880 --> 00:36:08,480 Teñen acceso instantáneo ao dicir que o nome da matriz e, a continuación, en crespos 675 00:36:08,480 --> 00:36:16,720 tirantes, calquera que sexa índice que quere ir para, están indexados desde cero a 676 00:36:16,720 --> 00:36:20,100 a lonxitude de matriz menos 1. 677 00:36:20,100 --> 00:36:23,070 >> E eles están declarados polo tipo de cousa que está almacenando no 678 00:36:23,070 --> 00:36:29,750 matriz, o nome da matriz, e entón calquera que sexa o tamaño é de que matriz. 679 00:36:29,750 --> 00:36:36,660 Polo tanto, esta é unha matriz de caracteres seis que ten eses valores. 680 00:36:36,660 --> 00:36:42,050 681 00:36:42,050 --> 00:36:42,700 Si? 682 00:36:42,700 --> 00:36:43,950 >> Audiencia: [inaudível]? 683 00:36:43,950 --> 00:36:47,980 684 00:36:47,980 --> 00:36:48,460 >> DAN: Yeah. 685 00:36:48,460 --> 00:36:51,340 >> Audiencia: [inaudível]? 686 00:36:51,340 --> 00:36:56,700 >> DAN: Se ten o que está a suceder para a matriz xa fixo. 687 00:36:56,700 --> 00:37:02,260 Entón, pode especificar que no canto de, digamos, char, calquera que sexa o nome do seu 688 00:37:02,260 --> 00:37:12,200 matriz é, corchetes baleiros igual crespos prepare-H comas por comas E L L coma por comas 689 00:37:12,200 --> 00:37:16,290 O comas carácter NULL e chaveta. 690 00:37:16,290 --> 00:37:18,180 Isto tamén funciona como unha declaración. 691 00:37:18,180 --> 00:37:20,886 >> Audiencia: [inaudível]? 692 00:37:20,886 --> 00:37:23,110 >> DAN: Entón tes que ter o tamaño xa feito. 693 00:37:23,110 --> 00:37:23,896 >> Audiencia: [inaudível]? 694 00:37:23,896 --> 00:37:25,146 >> DAN: Si. 695 00:37:25,146 --> 00:37:30,114 696 00:37:30,114 --> 00:37:32,420 Todo ben. 697 00:37:32,420 --> 00:37:36,430 Argumentos da liña de comandos son unha forma de recibindo entrada do usuario como 698 00:37:36,430 --> 00:37:39,380 argumentos para principal. 699 00:37:39,380 --> 00:37:40,600 Iniciar ten dous argumentos. 700 00:37:40,600 --> 00:37:47,680 Número de argumentos que está a ser pasou ao longo da liña de comandos e un 701 00:37:47,680 --> 00:37:55,340 vector de cadeas ou unha matriz de cadea de todos os argumentos. 702 00:37:55,340 --> 00:38:07,840 >> Entón, se eu, por exemplo, chamada de función, como un punto fóra un espazo, espazo 2, tres, 703 00:38:07,840 --> 00:38:10,110 argc sería 4. 704 00:38:10,110 --> 00:38:17,370 E o argv 0 sería un punto fóra. 705 00:38:17,370 --> 00:38:19,130 Argv1 sería 1. 706 00:38:19,130 --> 00:38:23,030 argv2 sería 2. argv3 sería 3, neste caso particular. 707 00:38:23,030 --> 00:38:23,310 Si? 708 00:38:23,310 --> 00:38:25,400 >> Audiencia: [inaudível]? 709 00:38:25,400 --> 00:38:34,010 >> DAN: O último elemento do array porque a matriz é a lonxitude argc máis 710 00:38:34,010 --> 00:38:41,050 un dos argb, o último elemento é o punteiro NULL. 711 00:38:41,050 --> 00:38:42,580 É argc máis 1. 712 00:38:42,580 --> 00:38:46,210 713 00:38:46,210 --> 00:38:52,150 Así, no caso de que eu acaba de dicir, el sería argv 0 é un punto fóra. 714 00:38:52,150 --> 00:38:56,330 argv 1 é 1, 2 é argv2 argv 3 é 3. 715 00:38:56,330 --> 00:39:03,490 argv 4, que é unha grande argc que sería NULL. 716 00:39:03,490 --> 00:39:04,870 >> E iso é o punteiro NULL. 717 00:39:04,870 --> 00:39:06,590 Si. 718 00:39:06,590 --> 00:39:11,250 E iso é porque cadea é unha estrela char é un punteiro. 719 00:39:11,250 --> 00:39:14,102 Por iso, ten que ser do mesmo tipo. 720 00:39:14,102 --> 00:39:14,595 Si? 721 00:39:14,595 --> 00:39:16,074 >> Audiencia: Dúas preguntas. 722 00:39:16,074 --> 00:39:21,004 Entón, un, cal é a diferenza entre isto e GetString outro que un tipo 723 00:39:21,004 --> 00:39:22,483 no mecanismo de usuario? 724 00:39:22,483 --> 00:39:25,934 E dous, é almacenado dentro súa memoria recente? 725 00:39:25,934 --> 00:39:28,399 Así como, GetString faría ser [inaudível]? 726 00:39:28,399 --> 00:39:31,357 727 00:39:31,357 --> 00:39:33,650 >> DAN: Onde se garda? 728 00:39:33,650 --> 00:39:34,905 Non sei onde está almacenado. 729 00:39:34,905 --> 00:39:40,000 >> Audiencia: Entón, en realidade, xa sabe como calquera función que chamalo de argumentos 730 00:39:40,000 --> 00:39:42,170 almacénanse na pila? 731 00:39:42,170 --> 00:39:46,610 Entón argc e argv son argumentos ao main e están na pila, ou realmente 732 00:39:46,610 --> 00:39:49,131 logo enriba o que pensa como o inicio da pila. 733 00:39:49,131 --> 00:39:53,490 Cal era a outra parte de tema? 734 00:39:53,490 --> 00:39:56,821 >> Audiencia: Entón, cal é o [inaudível]? 735 00:39:56,821 --> 00:40:00,990 >> DAN: Si, é só unha forma diferente de obter a entrada do usuario. 736 00:40:00,990 --> 00:40:06,030 Isto de algo máis eficiente e é máis útil para scripts porque 737 00:40:06,030 --> 00:40:10,070 pode só pasar argumentos para o seu principal función, en vez de ter que esperar 738 00:40:10,070 --> 00:40:13,400 para os usuarios, se non ten calquera usuarios. 739 00:40:13,400 --> 00:40:16,280 >> Audiencia: E si, obter cordas sería [inaudível]. 740 00:40:16,280 --> 00:40:17,922 Sería almacenar o material que precisa. 741 00:40:17,922 --> 00:40:18,834 >> DAN: Si? 742 00:40:18,834 --> 00:40:21,114 >> Audiencia: [inaudível]? 743 00:40:21,114 --> 00:40:27,545 >> DAN: Si, argv 0 inclúe sempre o dot barra de chamadas de función. 744 00:40:27,545 --> 00:40:28,042 Si? 745 00:40:28,042 --> 00:40:29,292 >> Audiencia: [inaudível]? 746 00:40:29,292 --> 00:40:33,509 747 00:40:33,509 --> 00:40:37,310 >> DAN: Si, cada un dos argumentos son rematou en carácter NULL porque 748 00:40:37,310 --> 00:40:38,310 son cadeas. 749 00:40:38,310 --> 00:40:40,892 >> Audiencia: [inaudível]? 750 00:40:40,892 --> 00:40:44,116 >> DAN: Si, argv argc é un punteiro NULL. 751 00:40:44,116 --> 00:40:45,112 >> Audiencia: [inaudível]? 752 00:40:45,112 --> 00:40:47,104 >> DAN: Oh yeah. 753 00:40:47,104 --> 00:40:48,100 Si, desculpe. 754 00:40:48,100 --> 00:40:49,594 >> Audiencia: Entón, [inaudível]? 755 00:40:49,594 --> 00:41:08,518 756 00:41:08,518 --> 00:41:16,340 >> DAN: Entón a pregunta é se tivese o liña de comandos dot cortar un punto fóra 1, 2, 757 00:41:16,340 --> 00:41:20,410 sería o número de liña de comandos argumentos ser dous ou sería tres? 758 00:41:20,410 --> 00:41:24,420 759 00:41:24,420 --> 00:41:28,240 >> Audiencia: Eu creo que iso non acontece realmente importa. 760 00:41:28,240 --> 00:41:31,370 Costume dicir, oh, non pasou calquera argumentos de liña de ordes cando, 761 00:41:31,370 --> 00:41:32,730 Obviamente, chamou a función. 762 00:41:32,730 --> 00:41:37,950 Entón, eu tenden a eliminar vocalmente o función a partir da liña de comandos 763 00:41:37,950 --> 00:41:40,350 argumentos, aínda que sexa incluídas na argv. 764 00:41:40,350 --> 00:41:42,600 >> DAN: Pero se fose o test-- 765 00:41:42,600 --> 00:41:46,550 yeah-- e tamén se dixo algo argc como é igual a 3, 766 00:41:46,550 --> 00:41:48,512 está en posición segura. 767 00:41:48,512 --> 00:41:49,416 Si? 768 00:41:49,416 --> 00:41:50,666 >> Audiencia: [inaudível]? 769 00:41:50,666 --> 00:42:00,990 770 00:42:00,990 --> 00:42:09,510 >> DAN: Coido que, se en vez de chamar ese en argc e argv cordas soportes 771 00:42:09,510 --> 00:42:14,350 pero mantivo os mesmos tipos e só chama -lles algo diferente, como un 772 00:42:14,350 --> 00:42:16,640 e b, será que aínda funciona? 773 00:42:16,640 --> 00:42:18,790 E seguiría a traballar, vostede só-- 774 00:42:18,790 --> 00:42:21,520 en vez de usar argc-- pode usar a e b. 775 00:42:21,520 --> 00:42:24,436 776 00:42:24,436 --> 00:42:25,408 Si? 777 00:42:25,408 --> 00:42:26,658 >> Audiencia: [inaudível]? 778 00:42:26,658 --> 00:42:34,642 779 00:42:34,642 --> 00:42:38,850 >> DAN: Entón a pregunta é GetString é indo para almacenar memoria no heap 780 00:42:38,850 --> 00:42:42,280 porque GetString é char *. 781 00:42:42,280 --> 00:42:47,530 El almacena a memoria na pila porque chama-se agora dentro da malloc real 782 00:42:47,530 --> 00:42:49,258 implantación de GetString. 783 00:42:49,258 --> 00:42:53,210 784 00:42:53,210 --> 00:42:55,090 OK, seguindo adiante. 785 00:42:55,090 --> 00:42:55,950 >> Seguridade. 786 00:42:55,950 --> 00:43:01,090 Así, para ser verdadeiramente seguro, confía en ningún unha e non permitir o acceso a calquera 787 00:43:01,090 --> 00:43:04,540 de información, polo que todo o mundo constrúe as súas propias máquinas, 788 00:43:04,540 --> 00:43:09,580 seus propios sistemas operativos, todo o seu programas a partir de cero, e, obviamente, 789 00:43:09,580 --> 00:43:13,410 non chamar a calquera outra máquina a través da internet. 790 00:43:13,410 --> 00:43:17,350 Así, os ordenadores son inseguros. 791 00:43:17,350 --> 00:43:19,200 Eles realmente son. 792 00:43:19,200 --> 00:43:20,940 Temos que confiar en outras persoas. 793 00:43:20,940 --> 00:43:26,500 >> E a idea de seguridade é que é tentativa de limitar a cantidade de 794 00:43:26,500 --> 00:43:27,540 confianza que necesitas. 795 00:43:27,540 --> 00:43:32,080 E un dos medios de facelo é a través de cifrado. 796 00:43:32,080 --> 00:43:34,950 A criptografía é, esencialmente, temos segredos. 797 00:43:34,950 --> 00:43:38,880 >> Ás veces temos que pasar nosos segredos Xunto con, digamos, a internet ou 798 00:43:38,880 --> 00:43:39,980 outras cousas. 799 00:43:39,980 --> 00:43:43,180 E nós non queremos que a xente coñecer eses segredos. 800 00:43:43,180 --> 00:43:50,100 Entón, nós transferir nosos segredo para unha forma que esperamos que ninguén pode descubrir. 801 00:43:50,100 --> 00:43:51,600 >> Entón, nós used-- 802 00:43:51,600 --> 00:43:54,340 a través do curso deste class-- 803 00:43:54,340 --> 00:44:00,750 cousas como cifra de César e [Inaudível], que son moi, moi 804 00:44:00,750 --> 00:44:03,200 formas inseguras de cifrar as cousas. 805 00:44:03,200 --> 00:44:07,930 Son fáciles de descubrir o que eles son e cales son os seus segredos son. 806 00:44:07,930 --> 00:44:12,130 O mundo real usa moito máis esquemas de cifrado complicados. 807 00:44:12,130 --> 00:44:13,880 E nós non imos entrar en moito máis que iso. 808 00:44:13,880 --> 00:44:18,280 809 00:44:18,280 --> 00:44:19,430 >> Debugging. 810 00:44:19,430 --> 00:44:20,785 GDB é o mellor. 811 00:44:20,785 --> 00:44:24,014 812 00:44:24,014 --> 00:44:25,810 Vou mencionar de novo. 813 00:44:25,810 --> 00:44:30,920 Use GDB o tempo xa que ten un problema. 814 00:44:30,920 --> 00:44:36,030 As ordes que son útiles en GDB son romper, o que quere pasar unha liña 815 00:44:36,030 --> 00:44:41,330 número, un nome de función, esencialmente onde o seu código queres parar, 816 00:44:41,330 --> 00:44:45,600 e ser capaz de asumir o control. 817 00:44:45,600 --> 00:44:54,140 >> Imprimir leva unha variable e imprime sexa alí o que é variable en que 818 00:44:54,140 --> 00:44:55,990 momento da súa execución. 819 00:44:55,990 --> 00:45:00,130 Logo move súa execución ao longo dunha única etapa. 820 00:45:00,130 --> 00:45:05,050 E paso pasos dentro dunha función na súa execución. 821 00:45:05,050 --> 00:45:10,480 >> Outras cousas están a funcionar, que é como realmente realizar o seu código. 822 00:45:10,480 --> 00:45:16,630 Continúe toma todas as medidas necesarias para chegar ao seguinte punto de parada. 823 00:45:16,630 --> 00:45:18,300 E hai moitos, moitos outros. 824 00:45:18,300 --> 00:45:19,040 Procura-los. 825 00:45:19,040 --> 00:45:19,901 Son óptimos. 826 00:45:19,901 --> 00:45:20,863 Si? 827 00:45:20,863 --> 00:45:22,113 >> Audiencia: [inaudível]? 828 00:45:22,113 --> 00:45:26,635 829 00:45:26,635 --> 00:45:28,200 >> DAN: Si, o que é un depurador. 830 00:45:28,200 --> 00:45:34,230 Así, un depurador é un programa que permite depurar o programa. 831 00:45:34,230 --> 00:45:39,931 Non é un programa que atopa erros para Vostede, con todo, que sería óptimo. 832 00:45:39,931 --> 00:45:43,020 833 00:45:43,020 --> 00:45:46,040 >> E para rematar, para min, é investigación. 834 00:45:46,040 --> 00:45:51,470 Así, os tipos de investigación que falamos sobre esta clase son a investigación lineal, 835 00:45:51,470 --> 00:45:55,960 que é exactamente iso que ollar a través de cada elemento do espazo de procura, un 836 00:45:55,960 --> 00:46:00,410 elemento de cada vez, ata atopar o que está a buscar ou ata alcanzar 837 00:46:00,410 --> 00:46:03,350 o final do seu espazo de procura no que apuntar-lle dicir que non podería atopar 838 00:46:03,350 --> 00:46:06,360 o elemento que busca. 839 00:46:06,360 --> 00:46:13,450 E isto leva tempo a mellor constante, que é de 1 0 e, no peor lineal 840 00:46:13,450 --> 00:46:16,070 tempo, que é de 0 n. 841 00:46:16,070 --> 00:46:19,250 >> Busca binaria, que debe elementos sórdidos. 842 00:46:19,250 --> 00:46:24,230 Vai para o medio dos seus elementos, ver se o elemento que está a buscar 843 00:46:24,230 --> 00:46:30,120 é maior ou menor que o elemento que está no medio. 844 00:46:30,120 --> 00:46:36,510 El é máis grande, di que o fondo da súa investigación o espazo é seu 845 00:46:36,510 --> 00:46:41,550 localización actual, o medio e reiniciar o proceso. 846 00:46:41,550 --> 00:46:46,150 De ser menor, parece dicir o-- que si, o que foi? 847 00:46:46,150 --> 00:46:47,400 >> Audiencia: [inaudível]? 848 00:46:47,400 --> 00:46:51,000 849 00:46:51,000 --> 00:46:54,260 >> DAN: Si. 850 00:46:54,260 --> 00:46:58,360 Calquera tipo de especie que foi ensinado en a clase é un xogo xusto para a proba. 851 00:46:58,360 --> 00:47:01,504 852 00:47:01,504 --> 00:47:04,920 >> [Risas] 853 00:47:04,920 --> 00:47:10,260 >> DAN: E o feito de non ter tido para facelo por un conxunto de problemas, é xusto 854 00:47:10,260 --> 00:47:12,420 xogo para a proba. 855 00:47:12,420 --> 00:47:15,186 >> Audiencia: Podemos pasar por iso como para-- 856 00:47:15,186 --> 00:47:17,052 >> DAN: Será ir máis. 857 00:47:17,052 --> 00:47:20,496 >> COLUMNA 2: O código real para [Inaudível] é en study.cs50.net. 858 00:47:20,496 --> 00:47:25,910 859 00:47:25,910 --> 00:47:32,680 Entón, se ollar para o problema práctica na páxina merge sort de 860 00:47:32,680 --> 00:47:35,880 study.cs50.net, existe o código para a posta en marcha de merge sort. 861 00:47:35,880 --> 00:47:38,550 Entón non ten que aplicar it yourself esta noite. 862 00:47:38,550 --> 00:47:42,090 Pero asegúrese de comprende-lo, en vez que só memorización. 863 00:47:42,090 --> 00:47:45,035 >> Audiencia: [inaudível]? 864 00:47:45,035 --> 00:47:49,720 >> COLUMNA 2: A páxina merge sort en study.cs50.net, non é unha práctica 865 00:47:49,720 --> 00:47:53,570 problema que, se fai clic no problema, ao final hai unha 866 00:47:53,570 --> 00:47:56,280 solución, que é a fusión implantación de clasificación. 867 00:47:56,280 --> 00:47:58,510 Pero asegúrese de comprende-lo no canto de só lembra-la 868 00:47:58,510 --> 00:47:59,760 ou copia-lo para abaixo. 869 00:47:59,760 --> 00:48:02,870 870 00:48:02,870 --> 00:48:06,340 >> Audiencia: E un perfectamente válido problema ao exame sería 871 00:48:06,340 --> 00:48:07,990 algo así como aquí está unha lista. 872 00:48:07,990 --> 00:48:12,100 Que esa lista queda despois un paso de seleccións de tipo ou de 873 00:48:12,100 --> 00:48:13,330 tipo de inserción ou o que quere. 874 00:48:13,330 --> 00:48:14,940 Unha iteración completa da lista. 875 00:48:14,940 --> 00:48:18,530 Así, mesmo se non acabar precisando código para el, ten que entendelo lo 876 00:48:18,530 --> 00:48:20,440 abondo para saber como vai sendo modificar esa matriz. 877 00:48:20,440 --> 00:48:24,144 878 00:48:24,144 --> 00:48:25,394 >> DAN: Isto é todo para min. 879 00:48:25,394 --> 00:48:30,604 880 00:48:30,604 --> 00:48:32,588 >> [Aplausos] 881 00:48:32,588 --> 00:49:06,316 882 00:49:06,316 --> 00:49:07,410 >> LUCAS: Hola a todos. 883 00:49:07,410 --> 00:49:08,390 O meu nome é Lucas. 884 00:49:08,390 --> 00:49:16,840 Vou falar recursão, todo tipo que aprendemos, e un 885 00:49:16,840 --> 00:49:18,050 pouco de todo punteiros. 886 00:49:18,050 --> 00:49:18,740 Ok? 887 00:49:18,740 --> 00:49:20,340 Entón, primeiro de todo, a recursividade. 888 00:49:20,340 --> 00:49:22,951 Que significa dicir que unha función é recursiva? 889 00:49:22,951 --> 00:49:24,675 >> Audiencia: Chama-se. 890 00:49:24,675 --> 00:49:26,500 >> LUCAS: OK, chama a si mesmo, si. 891 00:49:26,500 --> 00:49:27,700 Así como esta imaxe, por exemplo. 892 00:49:27,700 --> 00:49:30,280 É coma se a imaxe dentro dunha imaxe e así por diante. 893 00:49:30,280 --> 00:49:35,740 Así, por exemplo, pode have-- como Dan que estaba a falar de busca binaria. 894 00:49:35,740 --> 00:49:41,840 Unha forma en que procura binaria é recursiva é o feito de que é 895 00:49:41,840 --> 00:49:43,130 intentando atopar un número. 896 00:49:43,130 --> 00:49:44,250 Entón vai para o medio. 897 00:49:44,250 --> 00:49:47,130 E despois que comproba as cifras alí na parte esquerda e no dereito. 898 00:49:47,130 --> 00:49:49,650 >> E entón se descubrir o número é será á esquerda, que é a mesma 899 00:49:49,650 --> 00:49:53,340 cousa como facer a busca de novo, pero só na parte esquerda da lista. 900 00:49:53,340 --> 00:49:57,350 Entón é así que soa como é recursiva. 901 00:49:57,350 --> 00:50:01,870 Entón é por iso que vostedes teñen recursiva solución para merge sort. 902 00:50:01,870 --> 00:50:04,270 >> OK, entón aquí está un exemplo. 903 00:50:04,270 --> 00:50:07,280 Entón, digamos que quero escoller todos os números de 1 a n. 904 00:50:07,280 --> 00:50:13,790 Eu pode entender que a suma de n número é n máis n menos 1 ata 1. 905 00:50:13,790 --> 00:50:17,810 Pero entón, se eu ollar para n menos 1 máis n menos 2 máis 1, que é o mesmo 906 00:50:17,810 --> 00:50:20,680 cousa como números sumando ata n menos 1. 907 00:50:20,680 --> 00:50:25,890 Entón eu podo dicir a suma dun importe igual n é igual a, máis a suma de n menos 1. 908 00:50:25,890 --> 00:50:28,010 Será que isto ten sentido? 909 00:50:28,010 --> 00:50:32,630 >> E eu tamén tería algo máis chamou o caso base, que é o 910 00:50:32,630 --> 00:50:37,440 a suma dos números anteriores a cero sería cero. 911 00:50:37,440 --> 00:50:42,770 Entón, así que eu chegar ao número cero, eu deixar de contar. 912 00:50:42,770 --> 00:50:45,330 Será que isto ten sentido? 913 00:50:45,330 --> 00:50:48,120 >> Entón aquí está un exemplo de como Podo aplicar iso. 914 00:50:48,120 --> 00:50:49,860 Entón, eu teño esa función en algúns. 915 00:50:49,860 --> 00:50:51,700 Isto leva un enteiro n. 916 00:50:51,700 --> 00:50:56,300 Entón aquí eu primeiro comprobar se n é inferior ou igual a cero. 917 00:50:56,300 --> 00:51:00,310 Entón, se non é superior a cero, I volver cero, que é o noso caso base. 918 00:51:00,310 --> 00:51:05,690 Se non, eu só podo volver n máis a suma dos números de 919 00:51:05,690 --> 00:51:07,190 un a n menos un. 920 00:51:07,190 --> 00:51:09,360 Ten sentido? 921 00:51:09,360 --> 00:51:10,100 Está ben. 922 00:51:10,100 --> 00:51:11,610 >> Entón aquí está o que parece. 923 00:51:11,610 --> 00:51:15,260 Ten suma de dúas iguais 2 máis a suma de 1. 924 00:51:15,260 --> 00:51:18,930 E algúns de 1 é 1 máis o suma de 0, que é 0. 925 00:51:18,930 --> 00:51:20,216 Ten sentido? 926 00:51:20,216 --> 00:51:25,342 Entón, se miramos a pila de seu programa, este é o que parece. 927 00:51:25,342 --> 00:51:26,820 >> En primeiro lugar, temos a función principal. 928 00:51:26,820 --> 00:51:30,320 E, a continuación, a función principal chamado suma 2. 929 00:51:30,320 --> 00:51:36,690 E, a continuación, suma dous vai dicir, oh, suma 2 é igual a 2, máis a suma de un. 930 00:51:36,690 --> 00:51:39,460 Así que engadir suma de 1 a pila. 931 00:51:39,460 --> 00:51:43,860 E a suma de 1 vai chamar suma de 0, o que tamén será engadida 932 00:51:43,860 --> 00:51:44,630 á pila. 933 00:51:44,630 --> 00:51:49,240 E, a continuación, cada un destes son os que enriba do outro ten que volver 934 00:51:49,240 --> 00:51:52,020 antes que os outros poden continuar. 935 00:51:52,020 --> 00:51:56,240 >> Así, por exemplo, aquí, suma de 0, en primeiro lugar, vai voltar 0. 936 00:51:56,240 --> 00:51:58,320 E a continuación, escolla contía de 1. 937 00:51:58,320 --> 00:52:00,850 Logo, suma de 1 vai volver 1 a suma de 2. 938 00:52:00,850 --> 00:52:03,900 E, finalmente, suma de dous vai para volver 3 a principal. 939 00:52:03,900 --> 00:52:05,320 Será que isto ten sentido? 940 00:52:05,320 --> 00:52:09,496 >> É moi importante entender como a pila funciona e tentar 941 00:52:09,496 --> 00:52:11,980 ver se ten sentido. 942 00:52:11,980 --> 00:52:13,260 OK, entón a clasificación. 943 00:52:13,260 --> 00:52:16,170 Entón, por que é importante a clasificación, en primeiro lugar? 944 00:52:16,170 --> 00:52:18,260 Por que temos que preocuparnos? 945 00:52:18,260 --> 00:52:20,310 Calquera? 946 00:52:20,310 --> 00:52:20,695 Déame un exemplo? 947 00:52:20,695 --> 00:52:21,040 Si? 948 00:52:21,040 --> 00:52:22,968 >> Audiencia: [inaudível]. 949 00:52:22,968 --> 00:52:24,700 >> LUCAS: Si, OK. 950 00:52:24,700 --> 00:52:26,090 Entón, pode buscar de forma máis eficiente. 951 00:52:26,090 --> 00:52:28,580 Isto é un bo camiño. 952 00:52:28,580 --> 00:52:32,462 Así, por exemplo, temos unha morea de cousas, en realidade, na nosa vida que 953 00:52:32,462 --> 00:52:32,920 son clasificadas. 954 00:52:32,920 --> 00:52:34,830 Por exemplo, os dicionarios. 955 00:52:34,830 --> 00:52:39,210 >> É moi importante ter todo o palabras algún tipo de orde que 956 00:52:39,210 --> 00:52:41,970 pode acceder facilmente. 957 00:52:41,970 --> 00:52:43,280 Entón, iso é o que estaba dicindo. 958 00:52:43,280 --> 00:52:45,530 Podes buscar de forma máis eficiente. 959 00:52:45,530 --> 00:52:48,740 Debería quão difícil sería ter un dicionario en que as palabras están en 960 00:52:48,740 --> 00:52:49,500 orde aleatoria. 961 00:52:49,500 --> 00:52:53,120 Terá de se ver, moi bonito, cada palabra, ata atopar o 962 00:52:53,120 --> 00:52:54,720 palabra que está a procurar. 963 00:52:54,720 --> 00:52:58,710 >> Se está usando o Facebook tamén, cando está mirando para os seus amigos, está 964 00:52:58,710 --> 00:53:03,540 vai ver que Facebook poñer o seu amigo máis próximo é encima das 965 00:53:03,540 --> 00:53:05,470 que non fale moito. 966 00:53:05,470 --> 00:53:08,080 Se percorrer todo o camiño ata o fondo do súa lista de amigos, vai ver 967 00:53:08,080 --> 00:53:11,250 persoas que probablemente nin sequera Lembre que vostede é amigos con. 968 00:53:11,250 --> 00:53:14,590 E iso é porque os tipos Facebook seus amigos en base a como 969 00:53:14,590 --> 00:53:16,472 está preto deles. 970 00:53:16,472 --> 00:53:17,930 >> Así, organizar os datos. 971 00:53:17,930 --> 00:53:18,450 Tamén Galiza. 972 00:53:18,450 --> 00:53:21,400 Entón ve que todo Pokémons teñen números. 973 00:53:21,400 --> 00:53:27,210 E iso é como un sinxelo forma de acceso aos datos. 974 00:53:27,210 --> 00:53:29,050 >> Audiencia: Acceder Galiza. 975 00:53:29,050 --> 00:53:29,890 >> LUCAS: É. 976 00:53:29,890 --> 00:53:32,395 >> Audiencia: [inaudível]. 977 00:53:32,395 --> 00:53:33,460 >> LUCAS: Yep. 978 00:53:33,460 --> 00:53:35,140 OK, entón a selección de clasificación. 979 00:53:35,140 --> 00:53:41,610 Ordenar Selección vai seleccionar o menor valor indiferenciados dunha lista cada 980 00:53:41,610 --> 00:53:43,300 tempo en cada iteración. 981 00:53:43,300 --> 00:53:46,800 É unha especie de como o tipo que fai na súa cabeza cando estás 982 00:53:46,800 --> 00:53:48,430 ordenar unha lista na man. 983 00:53:48,430 --> 00:53:51,990 >> Basicamente, todo o que fai é mirar ao número máis baixo. 984 00:53:51,990 --> 00:53:54,280 Vostede poñelas na lista de clasificación. 985 00:53:54,280 --> 00:53:56,230 E entón mira para o preto menor número. 986 00:53:56,230 --> 00:54:00,080 E entón continuar facendo que e así por diante. 987 00:54:00,080 --> 00:54:04,600 >> Así, a selección tipo é basicamente seleccionar cada vez menor 988 00:54:04,600 --> 00:54:05,750 valor indiferenciados. 989 00:54:05,750 --> 00:54:10,840 Poñer ao final da clasificados parte da lista. 990 00:54:10,840 --> 00:54:12,370 E continuar facendo isto. 991 00:54:12,370 --> 00:54:15,890 Entón, imos ver rapidamente o que este parece. 992 00:54:15,890 --> 00:54:19,340 Entón aquí está o clasificado e lista de indiferenciados. 993 00:54:19,340 --> 00:54:23,350 >> Así, para a ordenada de lista, é inicialmente baleiro. 994 00:54:23,350 --> 00:54:26,760 E entón eu estou indo para seleccionar o menor número aquí, que é 2. 995 00:54:26,760 --> 00:54:30,650 Entón eu recibín o número 2 e engada na parte da fronte da lista. 996 00:54:30,650 --> 00:54:34,910 E entón eu ollo á seguinte menor elemento, o cal é de 3. 997 00:54:34,910 --> 00:54:37,050 Entón, eu poñelas ao final da lista ordenada. 998 00:54:37,050 --> 00:54:38,140 E entón eu continuar facendo isto. 999 00:54:38,140 --> 00:54:40,040 Creo 4 e poñelas ao final. 1000 00:54:40,040 --> 00:54:41,360 Atopar 5 e poñelas ao final. 1001 00:54:41,360 --> 00:54:44,830 >> E mira como todos aqueles momentos en que Eu digo que poñelas a finais é, 1002 00:54:44,830 --> 00:54:46,850 basicamente, intercambiar dous valores. 1003 00:54:46,850 --> 00:54:48,100 Ok? 1004 00:54:48,100 --> 00:54:50,140 1005 00:54:50,140 --> 00:54:52,825 E entón o último, só ter máis dun elemento. 1006 00:54:52,825 --> 00:54:55,870 Entón, el xa está clasificada. 1007 00:54:55,870 --> 00:54:57,800 >> OK, entón ordenación por inserción. 1008 00:54:57,800 --> 00:55:03,180 Inclusión tipo que vai ter tamén esa cousa de ter un ordenado e 1009 00:55:03,180 --> 00:55:04,690 unha lista non ordenada. 1010 00:55:04,690 --> 00:55:14,540 O único é que cada vez que está engadindo un elemento á clasificadas 1011 00:55:14,540 --> 00:55:18,170 lista, é só escoller o elemento que está diante da lista de indiferenciados. 1012 00:55:18,170 --> 00:55:20,880 E entón vai atopar o que posición que debe ser clasificada en 1013 00:55:20,880 --> 00:55:22,300 parte da lista. 1014 00:55:22,300 --> 00:55:25,840 >> Veremos que isto é así iso fai máis sentido. 1015 00:55:25,840 --> 00:55:29,360 Así, inicialmente, por exemplo, eu estou tentando para introducir o número tres do 1016 00:55:29,360 --> 00:55:30,680 parte clasificada na lista. 1017 00:55:30,680 --> 00:55:31,800 Así, a lista non ten nada. 1018 00:55:31,800 --> 00:55:34,160 Entón, podo só poñer o número 3. 1019 00:55:34,160 --> 00:55:37,480 >> Agora, quero engadir o número 5 para a parte da lista ordenada. 1020 00:55:37,480 --> 00:55:38,900 Entón eu ollar para o número 5. 1021 00:55:38,900 --> 00:55:40,450 Entendo que é maior que 3. 1022 00:55:40,450 --> 00:55:41,980 Entón, sei que ten que ser despois de 3. 1023 00:55:41,980 --> 00:55:44,100 Entón eu coloque 3 e 5. 1024 00:55:44,100 --> 00:55:45,940 >> Entón eu quero introducir o número 2. 1025 00:55:45,940 --> 00:55:51,630 Entendo que o número 2 é, en realidade, durar, entón o 3 eo 5. 1026 00:55:51,630 --> 00:55:54,580 Entón, realmente teño que poñer todo o xeito ao principio da lista. 1027 00:55:54,580 --> 00:55:59,030 Entón eu teño que, tipo, cambiar toda a elementos da lista ordenada para que eu poida 1028 00:55:59,030 --> 00:56:01,970 abrir espazo para o número 2. 1029 00:56:01,970 --> 00:56:03,160 >> Entón eu vexo o número 6. 1030 00:56:03,160 --> 00:56:05,450 Vexo que debe ser despois de 5. 1031 00:56:05,450 --> 00:56:06,240 Entón, eu poñer-lo alí. 1032 00:56:06,240 --> 00:56:07,965 E, finalmente, eu ollar para o número 4. 1033 00:56:07,965 --> 00:56:11,030 E notei que debería situarse entre 3 e 5. 1034 00:56:11,030 --> 00:56:14,870 E entón eu poñelas alí e cambio todos os outros elementos. 1035 00:56:14,870 --> 00:56:16,120 Ten sentido? 1036 00:56:16,120 --> 00:56:17,880 1037 00:56:17,880 --> 00:56:19,150 >> Bubble Sort. 1038 00:56:19,150 --> 00:56:25,730 Entón bubble sort é basicamente o que está vai fazer-- chamamos iso de burbulla 1039 00:56:25,730 --> 00:56:30,113 tipo, porque atravesa o lista-- é realmente mellor se eu só amosar 1040 00:56:30,113 --> 00:56:32,300 desexa isso-- 1041 00:56:32,300 --> 00:56:35,030 e está indo para comparar números adxacentes. 1042 00:56:35,030 --> 00:56:38,410 E vai cambiar a súa posicións se eles non están 1043 00:56:38,410 --> 00:56:39,190 na orde correcta. 1044 00:56:39,190 --> 00:56:42,570 >> Entón, basicamente, o que vai pasar é aquí, por exemplo, 1045 00:56:42,570 --> 00:56:44,160 ten 8 e 6. 1046 00:56:44,160 --> 00:56:47,270 Vostede sabe que a orde de clasificación será realmente ser 6 e 5, non? 1047 00:56:47,270 --> 00:56:49,540 Entón vai para cambiar as ordes. 1048 00:56:49,540 --> 00:56:51,370 Entón eu vexo 8 e 4 aquí. 1049 00:56:51,370 --> 00:56:52,250 E fago o mesmo. 1050 00:56:52,250 --> 00:56:53,400 Eu cambiar de novo. 1051 00:56:53,400 --> 00:56:55,070 E, finalmente, 2 e 8. 1052 00:56:55,070 --> 00:56:56,670 Eu tamén trocalos. 1053 00:56:56,670 --> 00:57:01,690 >> Chámase Bubble Ordenar por tras cada unha destas interaccións, en realidade, 1054 00:57:01,690 --> 00:57:05,910 o maior número na lista queda todo o camiño para a fin da lista. 1055 00:57:05,910 --> 00:57:06,940 Será que isto ten sentido? 1056 00:57:06,940 --> 00:57:11,880 Porque mantén intercambio-lo e movendo-o para a dereita. 1057 00:57:11,880 --> 00:57:14,440 >> OK, entón esta é a segunda iteración. 1058 00:57:14,440 --> 00:57:17,200 Iso sería o mesmo. 1059 00:57:17,200 --> 00:57:20,190 Vou facer un intercambio e logo o último. 1060 00:57:20,190 --> 00:57:23,290 Eu que non hai trocos ea lista é ordenada. 1061 00:57:23,290 --> 00:57:27,460 Así, en Bubble Sort, nós basicamente manter atravesar a lista e cambiar 1062 00:57:27,460 --> 00:57:32,310 cousas ata que eu entender que eu non fixen calquera swaps facendo a iteración, que 1063 00:57:32,310 --> 00:57:34,270 significa que a lista xa está clasificado. 1064 00:57:34,270 --> 00:57:35,520 Ten sentido? 1065 00:57:35,520 --> 00:57:38,400 1066 00:57:38,400 --> 00:57:40,870 >> Imos falar un pouco sobre o tempo de execución. 1067 00:57:40,870 --> 00:57:45,165 Polo tanto, vostedes lembran Big O, Omega, e Theta? 1068 00:57:45,165 --> 00:57:49,290 1069 00:57:49,290 --> 00:57:50,990 Si? 1070 00:57:50,990 --> 00:57:53,070 OK, o que é Big O, en primeiro lugar? 1071 00:57:53,070 --> 00:57:54,315 >> Audiencia: [inaudível]. 1072 00:57:54,315 --> 00:57:59,070 >> LUCAS: Si, é chamado de peor caso tempo de execución, o que só significa que é 1073 00:57:59,070 --> 00:58:03,470 o que espera que o programa para aproveitar a correr. 1074 00:58:03,470 --> 00:58:04,910 Como, en termos de-- 1075 00:58:04,910 --> 00:58:06,660 neste caso-- n. 1076 00:58:06,660 --> 00:58:09,150 Número de elementos na lista, no peor caso. 1077 00:58:09,150 --> 00:58:12,520 Como, no peor caso posible. 1078 00:58:12,520 --> 00:58:17,100 >> Así, por Bubble Sort, por exemplo, temos Big O de n cadrado. 1079 00:58:17,100 --> 00:58:20,580 Por que temos que? 1080 00:58:20,580 --> 00:58:24,716 ¿Por que Bubble Ordenar Big O n cadrado? 1081 00:58:24,716 --> 00:58:27,614 >> Audiencia: [inaudível]. 1082 00:58:27,614 --> 00:58:35,670 >> LUCAS: Si, entón o peor caso será que eu vou ter que facer n iteracións. 1083 00:58:35,670 --> 00:58:39,260 Así, cada unha das iteracións vai traia o maior elemento para o extremo 1084 00:58:39,260 --> 00:58:40,290 da lista. 1085 00:58:40,290 --> 00:58:44,230 Entón, o peor caso é que eu teño para facer esa cousa n veces. 1086 00:58:44,230 --> 00:58:48,550 E para cada unha desas veces, eu teño que facer n swaps porque teño que comparar 1087 00:58:48,550 --> 00:58:49,870 cada un de dous elementos. 1088 00:58:49,870 --> 00:58:53,730 Entón é por iso que é n ao cadrado porque é n veces n. 1089 00:58:53,730 --> 00:59:00,120 >> A continuación, a selección especie tamén é n cadrado porque, para cada iteración, eu teño que 1090 00:59:00,120 --> 00:59:02,650 ollar para cada elemento na lista. 1091 00:59:02,650 --> 00:59:04,980 E despois atopar o menor, o que significa que eu teño que 1092 00:59:04,980 --> 00:59:06,130 ollar a través de n elementos. 1093 00:59:06,130 --> 00:59:11,750 E eu teño que facelo n veces por Teño que seleccionar todos os elementos n. 1094 00:59:11,750 --> 00:59:18,273 >> Un tipo de inserción é tamén n cadrado porque o peor escenario será 1095 00:59:18,273 --> 00:59:20,950 ser, un, teño que introducir n números, non? 1096 00:59:20,950 --> 00:59:22,765 Entón, eu xa sei que vou ter n iteracións. 1097 00:59:22,765 --> 00:59:25,466 1098 00:59:25,466 --> 00:59:29,840 Pero para cada un destes números, se tivese a mirar para todos os números en 1099 00:59:29,840 --> 00:59:34,380 a lista ordenada e poñer-lo todo o camiño na parte dianteira, que será n cadrada 1100 00:59:34,380 --> 00:59:36,230 que vai ser n veces n novo. 1101 00:59:36,230 --> 00:59:38,280 Ten sentido? 1102 00:59:38,280 --> 00:59:41,512 E sobre omega? 1103 00:59:41,512 --> 00:59:42,886 >> Audiencia: [inaudível]. 1104 00:59:42,886 --> 00:59:44,620 >> LUCAS: É o mellor escenario. 1105 00:59:44,620 --> 00:59:48,810 Entón, é como, en unha morea de veces para clasificación, o mellor escenario é 1106 00:59:48,810 --> 00:59:50,660 cando a lista xa está clasificado. 1107 00:59:50,660 --> 00:59:52,670 Entón, o que realmente non ten para facer calquera cousa. 1108 00:59:52,670 --> 00:59:56,290 Bubble Sort ten o mellor escenario de n. 1109 00:59:56,290 --> 00:59:58,820 Vostedes saben por que? 1110 00:59:58,820 --> 01:00:00,620 >> Audiencia: [inaudível]. 1111 01:00:00,620 --> 01:00:05,640 >> LUCAS: Si, se manter o control de se ración de datos tivo calquera swaps ou 1112 01:00:05,640 --> 01:00:10,533 non, se ten algo como definido para verdadeiro se hai unha iteración, se o 1113 01:00:10,533 --> 01:00:15,140 lista xa está clasificado, basicamente, o que vai ocorrer é que eu vou 1114 01:00:15,140 --> 01:00:17,890 tentar cambiar cada dous elementos adxacentes. 1115 01:00:17,890 --> 01:00:19,920 Vou ver iso non hai trocos. 1116 01:00:19,920 --> 01:00:21,230 E eu só retornar inmediatamente. 1117 01:00:21,230 --> 01:00:24,240 >> Entón, isto significa que eu tiña que percorrer a lista xa. 1118 01:00:24,240 --> 01:00:28,990 Entón é n porque eu ollo a n elementos. 1119 01:00:28,990 --> 01:00:30,930 Por selección tipo n Square? 1120 01:00:30,930 --> 01:00:35,150 1121 01:00:35,150 --> 01:00:45,520 >> Si, aínda que a lista é ordenada, para cada iteración da selección tipo, eu 1122 01:00:45,520 --> 01:00:47,590 Ten que seleccionar o elemento mínimo. 1123 01:00:47,590 --> 01:00:49,980 Entón isto significa que eu teño que mirar para fóra en todos os elementos do indiferenciados 1124 01:00:49,980 --> 01:00:53,350 lista e atopar o mínimo para cada iteración. 1125 01:00:53,350 --> 01:00:54,600 Será que isto ten sentido? 1126 01:00:54,600 --> 01:00:56,880 1127 01:00:56,880 --> 01:01:04,690 >> E a espada de inserción é n porque o caso que eu estou tentando introducir o 1128 01:01:04,690 --> 01:01:09,320 números e os números, cando tentar inserir-los, eu vexo que 1129 01:01:09,320 --> 01:01:10,510 están no seu lugar. 1130 01:01:10,510 --> 01:01:15,120 Eu non teño que ir comprobar todos os outros números na lista de indiferenciados. 1131 01:01:15,120 --> 01:01:17,170 Entón é por iso que será n. 1132 01:01:17,170 --> 01:01:19,480 Ten sentido? 1133 01:01:19,480 --> 01:01:21,035 E o que é teta? 1134 01:01:21,035 --> 01:01:23,410 >> Audiencia: [inaudível]. 1135 01:01:23,410 --> 01:01:24,380 >> LUCAS: Que, arrepentido? 1136 01:01:24,380 --> 01:01:24,960 Diga iso de novo. 1137 01:01:24,960 --> 01:01:25,666 >> Audiencia: [inaudível]. 1138 01:01:25,666 --> 01:01:26,490 >> LUCAS: Exactamente. 1139 01:01:26,490 --> 01:01:31,280 Así pode ver que só a selección almacenado en merge sort ten tetas. 1140 01:01:31,280 --> 01:01:39,920 E iso é porque ten só theta se ambos Big O e Omega son os mesmos. 1141 01:01:39,920 --> 01:01:41,520 Está ben. 1142 01:01:41,520 --> 01:01:44,210 E, finalmente, merge sort é no rexistro n. 1143 01:01:44,210 --> 01:01:48,910 >> E entón, como Dan estaba dicindo, merge sort é tipo como do mesmo xeito que 1144 01:01:48,910 --> 01:01:50,320 fai a procura binaria. 1145 01:01:50,320 --> 01:01:53,530 Entón comeza a lista. 1146 01:01:53,530 --> 01:01:55,170 E vai cortar á metade. 1147 01:01:55,170 --> 01:02:00,580 E entón corte-los en metades menores. 1148 01:02:00,580 --> 01:02:01,730 E entón fundín-los. 1149 01:02:01,730 --> 01:02:02,960 Vostedes lembrar que, non? 1150 01:02:02,960 --> 01:02:04,960 OK, como el dicía. 1151 01:02:04,960 --> 01:02:08,330 >> OK, punteiros. 1152 01:02:08,330 --> 01:02:11,078 Entón, o que é un punteiro? 1153 01:02:11,078 --> 01:02:12,050 >> Audiencia: [inaudível]. 1154 01:02:12,050 --> 01:02:12,820 >> LUCAS: Un enderezo. 1155 01:02:12,820 --> 01:02:13,720 Está ben. 1156 01:02:13,720 --> 01:02:18,530 Sei que David mostra un grupo de videos de Binky e cousas que ligan 1157 01:02:18,530 --> 01:02:19,080 entre si. 1158 01:02:19,080 --> 01:02:22,960 Pero eu gusto de pensar punteiros como só unha dirección. 1159 01:02:22,960 --> 01:02:26,110 Polo tanto, é unha variable que está a suceder para almacenar un enderezo. 1160 01:02:26,110 --> 01:02:31,940 >> Entón é só esa variable especial que é catro bytes de longo. 1161 01:02:31,940 --> 01:02:36,550 Lembre, este punteiro para calquera cousa é sempre catro bytes de lonxitude para o noso 32-bit 1162 01:02:36,550 --> 01:02:39,370 máquina de xeito que o caso o aparello. 1163 01:02:39,370 --> 01:02:41,920 1164 01:02:41,920 --> 01:02:47,050 E só ten a localización dunha variable dentro do mesmo. 1165 01:02:47,050 --> 01:02:50,240 >> OK, entón non hai esa memoria, basicamente. 1166 01:02:50,240 --> 01:02:57,420 Así, cada bloque de memoria, de feito, ten un etiqueta, o cal é a dirección do 1167 01:02:57,420 --> 01:02:58,890 memoria slotty. 1168 01:02:58,890 --> 01:03:02,370 Entón isto significa que eu podo ter un punteiro que apunta 1169 01:03:02,370 --> 01:03:03,380 calquera destes enderezos. 1170 01:03:03,380 --> 01:03:09,930 Así, a razón pola que imos usar punteiros é se eu teño que lembrar a súa localización 1171 01:03:09,930 --> 01:03:12,300 que unha variable específica é unha memoria. 1172 01:03:12,300 --> 01:03:16,560 >> E vostedes recorda que un dos casos foi se eu tivera unha función 1173 01:03:16,560 --> 01:03:20,820 se eu tivera realmente quero que intercambio para reais, realmente 1174 01:03:20,820 --> 01:03:22,110 ten que enviar un punteiro. 1175 01:03:22,110 --> 01:03:23,460 Non é a variable. 1176 01:03:23,460 --> 01:03:25,200 Vostedes se lembra diso? 1177 01:03:25,200 --> 01:03:26,450 O between-- diferenza 1178 01:03:26,450 --> 01:03:33,350 1179 01:03:33,350 --> 01:03:34,120 cal é o nome? 1180 01:03:34,120 --> 01:03:36,010 Chamada polo valor e chamando por referencia, non? 1181 01:03:36,010 --> 01:03:36,840 >> OK, si. 1182 01:03:36,840 --> 01:03:38,330 Entón chame por valor. 1183 01:03:38,330 --> 01:03:43,570 Cando acaba de enviar unha variable para funcionar só está enviando un valor. 1184 01:03:43,570 --> 01:03:45,610 Entón, en realidade está enviando unha copia da variable. 1185 01:03:45,610 --> 01:03:49,720 E o programa non podería me importar menos sobre si mesma variable, en realidade, 1186 01:03:49,720 --> 01:03:51,650 fai unha copia. 1187 01:03:51,650 --> 01:03:56,330 >> E chamando por referencia significa que De feito, estou enviando unha copia do 1188 01:03:56,330 --> 01:03:57,550 punteiro para esa variable. 1189 01:03:57,550 --> 01:04:00,970 Entón, isto significa que eu estou enviando a localización desta variable. 1190 01:04:00,970 --> 01:04:04,440 Entón, sinto que teño a localización do variable, cando chamar a función 1191 01:04:04,440 --> 01:04:09,700 con punteiros, eu son capaz de realmente cambiar os datos que estaban no inicio. 1192 01:04:09,700 --> 01:04:12,050 Ten sentido? 1193 01:04:12,050 --> 01:04:17,560 >> Aínda que, o punteiro é unha copia, a punteiro aínda ten a dirección real de 1194 01:04:17,560 --> 01:04:20,090 a variable que quero cambiar. 1195 01:04:20,090 --> 01:04:21,920 Ten sentido? 1196 01:04:21,920 --> 01:04:24,290 >> Así, a creación de punteiros. 1197 01:04:24,290 --> 01:04:28,410 Lembre, o punteiro sempre do tipo que está apuntando 1198 01:04:28,410 --> 01:04:29,890 ao e, a continuación, unha estrela. 1199 01:04:29,890 --> 01:04:31,030 E entón pon o nome. 1200 01:04:31,030 --> 01:04:35,765 Entón recorda que sempre que ten calquera que sexa estrela, é como un punteiro para 1201 01:04:35,765 --> 01:04:38,990 que calquera que sexa variable tipo que tiña. 1202 01:04:38,990 --> 01:04:42,850 >> Entón, aquí en estrela, por exemplo, é un punteiro e dun número enteiro. 1203 01:04:42,850 --> 01:04:47,680 E despois de char estrela é un punteiro estrela carbón animal e así por diante. 1204 01:04:47,680 --> 01:04:47,960 Si? 1205 01:04:47,960 --> 01:04:52,710 >> Audiencia: E se temos unha punteiro para n para protagonizar x. 1206 01:04:52,710 --> 01:04:55,255 Sei que crea un punteiro para x. 1207 01:04:55,255 --> 01:04:59,432 Será que tamén declarar x un número enteiro? 1208 01:04:59,432 --> 01:05:05,170 >> LUCAS: OK, entón cando di n estrela x, non está creando un punteiro para unha 1209 01:05:05,170 --> 01:05:06,000 x variable. 1210 01:05:06,000 --> 01:05:08,170 Está creando un punteiro chamado x. 1211 01:05:08,170 --> 01:05:09,396 >> Audiencia: [inaudível]. 1212 01:05:09,396 --> 01:05:14,250 >> LUCAS: Entón, cando digo n estrela x, eu son dicindo, hey, na memoria, vou 1213 01:05:14,250 --> 01:05:16,390 conseguir unha destas tres caixas. 1214 01:05:16,390 --> 01:05:20,750 E eu vou dicir que isto será x, que é 1215 01:05:20,750 --> 01:05:22,000 Vai ser un punteiro. 1216 01:05:22,000 --> 01:05:26,860 1217 01:05:26,860 --> 01:05:30,640 E unha cousa interesante sobre punteiros é que nós dicimos que teñen 1218 01:05:30,640 --> 01:05:32,620 4 bytes para unha máquina de 32 bits. 1219 01:05:32,620 --> 01:05:36,320 E a razón para iso é porque 4 bytes son 32 bits. 1220 01:05:36,320 --> 01:05:40,490 >> E máquinas que son de 64 bits, en realidade, teñen enderezos punteiros 1221 01:05:40,490 --> 01:05:43,480 que son de 64 bits. 1222 01:05:43,480 --> 01:05:49,820 Por iso, só significa que a dimensión da enderezos na máquina é diferente. 1223 01:05:49,820 --> 01:05:52,270 >> Entón referenciando e Dereferencing. 1224 01:05:52,270 --> 01:05:54,310 Existen dous operadores que Vostedes deben lembrar. 1225 01:05:54,310 --> 01:05:55,450 A primeira é comercial. 1226 01:05:55,450 --> 01:05:56,810 A segunda é estrela. 1227 01:05:56,810 --> 01:06:05,060 Non sexa confuso con esta estrela e este estrela, porque recorda que, en 1228 01:06:05,060 --> 01:06:06,950 Neste caso, ten n estrela. 1229 01:06:06,950 --> 01:06:08,700 >> É como unha cousa toda en conxunto. 1230 01:06:08,700 --> 01:06:10,720 Non hai espazo estrela n. 1231 01:06:10,720 --> 01:06:12,070 Entón, isto significa que el é o tipo. 1232 01:06:12,070 --> 01:06:14,870 Lembre, que cando ten a estrela variable, está 1233 01:06:14,870 --> 01:06:16,230 falando sobre o tipo. 1234 01:06:16,230 --> 01:06:20,540 >> Cando ten só estrelas e, a continuación, o nome da variable, isto quere dicir que 1235 01:06:20,540 --> 01:06:24,100 está dereferencing o punteiro, que significa que está mirando para o 1236 01:06:24,100 --> 01:06:28,290 punteiro, atopar a dirección é apuntando, indo a ese enderezo, 1237 01:06:28,290 --> 01:06:30,850 e mirando para sempre ten alí. 1238 01:06:30,850 --> 01:06:34,310 Entón, digo aos meus alumnos que cando ten estrela, ten que pensar que é 1239 01:06:34,310 --> 01:06:36,850 a abreviatura de contido. 1240 01:06:36,850 --> 01:06:39,770 >> Entón se ten un punteiro e facer punteiro estrela, é o 1241 01:06:39,770 --> 01:06:41,720 o contido do punteiro. 1242 01:06:41,720 --> 01:06:44,580 Entón vai para o que está a apuntar cara e mirar para o contido constante. 1243 01:06:44,580 --> 01:06:47,730 E o comercial é a mesma cousa como enderezo. 1244 01:06:47,730 --> 01:06:52,560 >> Entón, se eu teño unha variable a-- como, imos dicir que eu fixen un int igual 3-- 1245 01:06:52,560 --> 01:06:56,900 se eu queira atopar a dirección de que unha memoria variable, eu só podo facer 1246 01:06:56,900 --> 01:06:58,240 comercial Unha. 1247 01:06:58,240 --> 01:07:00,280 Por iso, é o enderezo de un. 1248 01:07:00,280 --> 01:07:01,530 Ten sentido? 1249 01:07:01,530 --> 01:07:03,790 1250 01:07:03,790 --> 01:07:05,040 >> Entón, aquí está un exemplo. 1251 01:07:05,040 --> 01:07:08,370 1252 01:07:08,370 --> 01:07:11,530 Isto falta int b e c int. 1253 01:07:11,530 --> 01:07:16,520 Entón int un é igual a 3 significa que Eu estou indo a ir á memoria. 1254 01:07:16,520 --> 01:07:19,870 E eu vou atopar un slot e poñer o número 3 aquí. 1255 01:07:19,870 --> 01:07:22,200 >> E, a continuación, int b é igual a 4. 1256 01:07:22,200 --> 01:07:23,100 Vou facer o mesmo. 1257 01:07:23,100 --> 01:07:25,840 Ir á memoria e poñer un número 4 nunha das caixas. 1258 01:07:25,840 --> 01:07:27,100 E int é igual a 5. 1259 01:07:27,100 --> 01:07:29,740 Atopa outra caixa e poñer un número 5. 1260 01:07:29,740 --> 01:07:36,160 >> Entón o que é esta liña está facendo? n estrela pa igual a un comercial. 1261 01:07:36,160 --> 01:07:37,800 Entón, en primeiro lugar, n estrela aa. 1262 01:07:37,800 --> 01:07:39,050 O que está facendo? 1263 01:07:39,050 --> 01:07:40,930 1264 01:07:40,930 --> 01:07:42,298 >> Audiencia: [inaudível]. 1265 01:07:42,298 --> 01:07:47,890 >> LUCAS: Si, por iso n estrela pa, en primeiro lugar, declara un punteiro chamado pa. 1266 01:07:47,890 --> 01:07:53,720 E el está atribuíndo o valor de punteiro que pode ser o seu enderezo de un. 1267 01:07:53,720 --> 01:07:55,790 Entón comercial Unha. 1268 01:07:55,790 --> 01:07:58,510 Entón, se eu fai estrela pb, o que é unha estrela pb? 1269 01:07:58,510 --> 01:08:02,418 1270 01:08:02,418 --> 01:08:03,150 >> Oh, desculpe. 1271 01:08:03,150 --> 01:08:06,330 Isto tamén está en falta. n estrela pb. 1272 01:08:06,330 --> 01:08:07,905 Quero dicir estrela PC. 1273 01:08:07,905 --> 01:08:11,200 Eu sinto moito. 1274 01:08:11,200 --> 01:08:11,940 É o mesmo. 1275 01:08:11,940 --> 01:08:16,408 Pero agora eu son bo aire creando un punteiro para B e, a continuación, un punteiro para c. 1276 01:08:16,408 --> 01:08:16,886 Si? 1277 01:08:16,886 --> 01:08:18,136 >> Audiencia: [inaudível]? 1278 01:08:18,136 --> 01:08:25,490 1279 01:08:25,490 --> 01:08:26,670 >> LUCAS: Si. 1280 01:08:26,670 --> 01:08:32,630 Entón, se vai para a memoria e vai para a caixa que é designador para aa, 1281 01:08:32,630 --> 01:08:37,149 está realmente indo a vexa a dirección dun. 1282 01:08:37,149 --> 01:08:38,399 Ok? 1283 01:08:38,399 --> 01:08:42,970 1284 01:08:42,970 --> 01:08:43,300 Si? 1285 01:08:43,300 --> 01:08:45,605 >> Audiencia: [inaudível]? 1286 01:08:45,605 --> 01:08:49,260 >> LUCAS: Si, punteiro é un enderezo. 1287 01:08:49,260 --> 01:08:50,120 Nunca se esqueza diso. 1288 01:08:50,120 --> 01:08:52,800 É como o máis importante parte sobre punteiros. 1289 01:08:52,800 --> 01:08:56,180 Hai almacenar e dirección a algunha variable. 1290 01:08:56,180 --> 01:08:56,890 Algo máis? 1291 01:08:56,890 --> 01:08:58,370 Algunha pregunta? 1292 01:08:58,370 --> 01:08:59,189 Está ben. 1293 01:08:59,189 --> 01:09:00,399 >> Entón Punteiros e matrices. 1294 01:09:00,399 --> 01:09:08,189 Lembre que cando fago int matriz 3, Basicamente, o que eu estou facendo é que eu son, tipo 1295 01:09:08,189 --> 01:09:12,779 de, declarando nun punteiro. 1296 01:09:12,779 --> 01:09:18,960 Entón matriz é tipo como un punteiro para un lugar específico na memoria en que eu 1297 01:09:18,960 --> 01:09:21,999 alocados tres slots para enteiros. 1298 01:09:21,999 --> 01:09:23,430 Será que isto ten sentido? 1299 01:09:23,430 --> 01:09:30,250 >> Entón, cando fago int matriz 3, o que eu son facendo basicamente é a creación de tres 1300 01:09:30,250 --> 01:09:31,479 slots de memoria. 1301 01:09:31,479 --> 01:09:33,899 Entón, eu só atopar tres slots de memoria. 1302 01:09:33,899 --> 01:09:38,810 Entón, se eu fai iso, entón, un conxunto de estrelas, basicamente, o contido do array, 1303 01:09:38,810 --> 01:09:46,180 o que significa que eu eliminar o punteiro, vou para aquel lugar que está apuntando para, 1304 01:09:46,180 --> 01:09:47,939 e engada o número un. 1305 01:09:47,939 --> 01:09:53,729 >> E despois, se eu fai matriz estrela máis 1, iso é o mesmo que facer matriz 1306 01:09:53,729 --> 01:09:59,690 corchetes un, o que significa só que eu vaia o lugar que está apuntando. 1307 01:09:59,690 --> 01:10:03,000 E entón a un marcas me desprazar unha posición. 1308 01:10:03,000 --> 01:10:06,510 Entón eu vou a esta posición, de feito, e poñer o número dous. 1309 01:10:06,510 --> 01:10:10,900 >> E entón, finalmente, cando fago matriz dous máis, eu vou para onde 1310 01:10:10,900 --> 01:10:11,825 enlace de matriz en. 1311 01:10:11,825 --> 01:10:14,690 E entón eu paso para os bloques de memoria. 1312 01:10:14,690 --> 01:10:16,240 E entón eu coloque o número tres aquí. 1313 01:10:16,240 --> 01:10:16,600 Si? 1314 01:10:16,600 --> 01:10:21,400 >> Audiencia: array Así estrela é simplemente dicindo que o primeiro punto. 1315 01:10:21,400 --> 01:10:25,090 E pode engadir un, só porque estamos realmente só 1316 01:10:25,090 --> 01:10:27,295 referenciar que primeiro enderezo. 1317 01:10:27,295 --> 01:10:28,545 >> LUCAS: É. 1318 01:10:28,545 --> 01:10:32,720 1319 01:10:32,720 --> 01:10:36,020 Por que, por exemplo, dicir matriz 0, array 1 e matriz de 2? 1320 01:10:36,020 --> 01:10:38,970 1321 01:10:38,970 --> 01:10:42,790 Eu digo, por que fai 0, 1, 2, 3, no canto de 1, 2, 3? 1322 01:10:42,790 --> 01:10:46,550 Unha das razóns é, un, ordenador programadores prefiren comezar 1323 01:10:46,550 --> 01:10:47,750 contando desde 0. 1324 01:10:47,750 --> 01:10:52,370 Dous é porque cando fai matriz 0, é o mesmo que facer matriz 1325 01:10:52,370 --> 01:10:56,330 plus 0, o que significa que eu vaia esa posición, e non 1326 01:10:56,330 --> 01:10:59,320 ignorar calquera bloques de memoria. 1327 01:10:59,320 --> 01:11:01,750 Así que non mover todos os bloques de memoria. 1328 01:11:01,750 --> 01:11:02,015 Si? 1329 01:11:02,015 --> 01:11:03,265 >> Audiencia: [inaudível]? 1330 01:11:03,265 --> 01:11:05,928 1331 01:11:05,928 --> 01:11:12,670 >> LUCAS: Entón está pregunta o que é a diferenza entre facer 1332 01:11:12,670 --> 01:11:14,000 este é facendo malloc. 1333 01:11:14,000 --> 01:11:17,550 Unha das diferenzas é que int matriz 3 é a creación dun 1334 01:11:17,550 --> 01:11:19,260 matriz na pila. 1335 01:11:19,260 --> 01:11:23,080 E cando fago malloc, que crea na pila. 1336 01:11:23,080 --> 01:11:25,250 Será que isto ten sentido? 1337 01:11:25,250 --> 01:11:28,870 >> Entón como é que malloc realmente funciona? 1338 01:11:28,870 --> 01:11:32,245 Entón, por que aínda que empregar malloc? 1339 01:11:32,245 --> 01:11:35,730 1340 01:11:35,730 --> 01:11:39,700 O seu tipo de compilador descobre todo as variables que declarou. 1341 01:11:39,700 --> 01:11:44,040 E crea espazo para todos deles na pila. 1342 01:11:44,040 --> 01:11:47,180 Así, as súas variables van estar nalgún lugar na pila. 1343 01:11:47,180 --> 01:11:49,460 Entón aquí está as variables de ambiente. 1344 01:11:49,460 --> 01:11:53,850 >> Entón, basicamente, o espazo para as variables en memoria é alocada en 1345 01:11:53,850 --> 01:11:55,080 tempo de compilación. 1346 01:11:55,080 --> 01:11:58,790 Entón, isto significa que o seu ordenador ten saber todas estas variables 1347 01:11:58,790 --> 01:11:59,790 antemán. 1348 01:11:59,790 --> 01:12:02,500 Non ten que saber que o valor que está indo a poñer neles. 1349 01:12:02,500 --> 01:12:05,490 Pero hai que saber como cantidade de memoria que necesitas. 1350 01:12:05,490 --> 01:12:09,380 >> Pero agora imos dicir que, por exemplo, está creando unha matriz ou tomar un 1351 01:12:09,380 --> 01:12:13,430 cadea que está tomando desde o sitio web. 1352 01:12:13,430 --> 01:12:17,300 Non sabe canto tempo a corda será, por exemplo. 1353 01:12:17,300 --> 01:12:20,600 Entón non sabe exactamente cantos bloques de memoria que reservar, non? 1354 01:12:20,600 --> 01:12:24,120 >> Por iso, non fai moito sentido para quere dicir poñer 100 caracteres. 1355 01:12:24,120 --> 01:12:26,420 E entón o que se o usuario escribe 150? 1356 01:12:26,420 --> 01:12:27,670 Vai ser parafuso. 1357 01:12:27,670 --> 01:12:30,160 1358 01:12:30,160 --> 01:12:34,620 >> Entón, basicamente, non pode estar seguro de como cantidade de memoria que precisa reservar 1359 01:12:34,620 --> 01:12:35,960 cando compilar o programa. 1360 01:12:35,960 --> 01:12:38,240 Só sabe que, en tempo de execución. 1361 01:12:38,240 --> 01:12:39,950 É por iso que ten a pila. 1362 01:12:39,950 --> 01:12:47,610 Así, a pila terá memoria que está alocando durante o 1363 01:12:47,610 --> 01:12:50,810 duración do programa en execución. 1364 01:12:50,810 --> 01:12:55,780 >> Entón, basicamente, cando fai malloc, o que está facendo é a distribución de memoria en 1365 01:12:55,780 --> 01:13:00,160 tempo de execución, o que significa que está decidir nese momento que 1366 01:13:00,160 --> 01:13:02,670 debe ter esa memoria. 1367 01:13:02,670 --> 01:13:04,210 Entón é iso, cando está asignación. 1368 01:13:04,210 --> 01:13:06,430 Será que isto ten sentido? 1369 01:13:06,430 --> 01:13:11,690 >> Entón lembre, a pila ten variables que son creados en tempo de compilación. 1370 01:13:11,690 --> 01:13:14,560 E entón, o monte ten variables que son creados como vai 1371 01:13:14,560 --> 01:13:15,600 con malloc, por exemplo. 1372 01:13:15,600 --> 01:13:16,850 >> Audiencia: [inaudível]? 1373 01:13:16,850 --> 01:13:19,179 1374 01:13:19,179 --> 01:13:24,340 >> LUCAS: Entón é GetString vai chamar malloc. 1375 01:13:24,340 --> 01:13:26,710 Déixeme falar malloc, e Vou explicar GetString. 1376 01:13:26,710 --> 01:13:32,000 Entón malloc é o mesmo como distribución de memoria. 1377 01:13:32,000 --> 01:13:34,600 Por iso, vai reservar memoria no heap. 1378 01:13:34,600 --> 01:13:40,010 E que vai voltar un punteiro para onde esta memoria foi alocada no. 1379 01:13:40,010 --> 01:13:43,090 >> Entón, cando fazer-- 1380 01:13:43,090 --> 01:13:44,910 aquí para example-- 1381 01:13:44,910 --> 01:13:45,830 n punteiro estrela. 1382 01:13:45,830 --> 01:13:50,520 E entón punteiro igual malloc tamaño de 10 polgadas veces. 1383 01:13:50,520 --> 01:13:52,110 Estou creando un punteiro. 1384 01:13:52,110 --> 01:13:59,020 E entón eu estou atribuíndo este punteiro para o valor do enlace que malloc 1385 01:13:59,020 --> 01:13:59,680 está me dando. 1386 01:13:59,680 --> 01:14:04,150 >> Entón eu estou pedindo malloc pode reservar espazo para 10 enteiros. 1387 01:14:04,150 --> 01:14:05,390 Iso é o que está dicindo. 1388 01:14:05,390 --> 01:14:09,020 E malloc me dá de volta a punteiro para aquel lugar. 1389 01:14:09,020 --> 01:14:11,460 Ten sentido? 1390 01:14:11,460 --> 01:14:12,270 Está ben. 1391 01:14:12,270 --> 01:14:17,940 Eu E GetString é basicamente facer un chamar a malloc para podelo reservar 1392 01:14:17,940 --> 01:14:21,680 memoria durante a execución. 1393 01:14:21,680 --> 01:14:26,460 >> Teña en conta que sempre comprobar a nulidade porque malloc devolverá nulo 1394 01:14:26,460 --> 01:14:28,200 se non é posible reservar memoria. 1395 01:14:28,200 --> 01:14:31,660 Imos dicir que pedir un ridículo cantidade de memoria. 1396 01:14:31,660 --> 01:14:33,950 O seu ordenador non será poder reservar moito. 1397 01:14:33,950 --> 01:14:36,410 >> Entón malloc é só ir para volver null. 1398 01:14:36,410 --> 01:14:42,210 Entón lembre sempre comprobar se o punteiro que ten de malloc é 1399 01:14:42,210 --> 01:14:45,640 nulo ou non, porque, de ser, pode ser referencia un punteiro e 1400 01:14:45,640 --> 01:14:48,340 provocando fallos laterais. 1401 01:14:48,340 --> 01:14:50,930 E, finalmente, non se esqueza súa memoria libre. 1402 01:14:50,930 --> 01:14:57,800 1403 01:14:57,800 --> 01:15:00,560 >> Malloc é a creación de memoria no heap. 1404 01:15:00,560 --> 01:15:03,436 E ten que liberar a memoria antes de que o programa termine. 1405 01:15:03,436 --> 01:15:05,370 OK, iso é todo para min. 1406 01:15:05,370 --> 01:15:07,900 Sentímolo, Rob. 1407 01:15:07,900 --> 01:15:07,950 Grazas. 1408 01:15:07,950 --> 01:15:09,878 >> [Aplausos] 1409 01:15:09,878 --> 01:15:12,679 >> LUCAS: Todas as últimas preguntas antes de Rob vén? 1410 01:15:12,679 --> 01:15:13,138 Non? 1411 01:15:13,138 --> 01:15:13,597 Si? 1412 01:15:13,597 --> 01:15:15,892 >> Audiencia: Non vin este en liña. 1413 01:15:15,892 --> 01:15:17,269 Cargou-o aínda? 1414 01:15:17,269 --> 01:15:19,106 >> LUCAS: Creo que Dave é cargalo en breve. 1415 01:15:19,106 --> 01:15:19,880 >> Dave: Vai ser lanzado. 1416 01:15:19,880 --> 01:15:20,310 >> LUCAS: El vai estar en liña. 1417 01:15:20,310 --> 01:15:21,175 >> Audiencia: É-se. 1418 01:15:21,175 --> 01:15:22,090 >> LUCAS: É-se? 1419 01:15:22,090 --> 01:15:23,157 Está ben. 1420 01:15:23,157 --> 01:15:23,644 Si? 1421 01:15:23,644 --> 01:15:27,053 >> Audiencia: [inaudível]? 1422 01:15:27,053 --> 01:15:30,285 >> LUCAS: Si, ten que liberar todo o memoria que é colocado na pila. 1423 01:15:30,285 --> 01:15:31,535 >> Audiencia: [inaudível]? 1424 01:15:31,535 --> 01:15:34,518 1425 01:15:34,518 --> 01:15:36,160 >> LUCAS: Si. 1426 01:15:36,160 --> 01:15:39,980 Cada vez que ten un malloc cultura, ten que ter unha cultura libre 1427 01:15:39,980 --> 01:15:42,640 despois que deixar de usar esta variable. 1428 01:15:42,640 --> 01:15:44,800 Entón malloc e free son sempre xuntos. 1429 01:15:44,800 --> 01:15:45,410 Os seus mellores amigos. 1430 01:15:45,410 --> 01:15:46,720 Si. 1431 01:15:46,720 --> 01:15:47,970 Rob? 1432 01:15:47,970 --> 01:15:55,595 1433 01:15:55,595 --> 01:15:56,850 >> ROB: Vou rapidamente. 1434 01:15:56,850 --> 01:16:00,466 E tamén o video será colocado. 1435 01:16:00,466 --> 01:16:01,716 Eu teño o micrófono conectado. 1436 01:16:01,716 --> 01:16:24,060 1437 01:16:24,060 --> 01:16:26,230 >> OK, entón semana de cinco cousas. 1438 01:16:26,230 --> 01:16:27,970 O primeiro que temos é a pila. 1439 01:16:27,970 --> 01:16:33,390 Entón recorda que só hai unha pila cadro por chamada de función activa. 1440 01:16:33,390 --> 01:16:34,710 Vexamos isto en un segundo. 1441 01:16:34,710 --> 01:16:37,850 E tamén me acordo do que realmente pasa en cada cadro de pila van ser 1442 01:16:37,850 --> 01:16:41,880 as variables locais das nosas funcións, os argumentos que se pasan para o noso 1443 01:16:41,880 --> 01:16:43,880 funcións, xunto con un par outras cousas que realmente non 1444 01:16:43,880 --> 01:16:45,260 se preocupe. 1445 01:16:45,260 --> 01:16:50,950 >> Entón aquí está un exemplo de programa que, aviso, a principal é o retorno printfing 1446 01:16:50,950 --> 01:16:52,830 valor de foo 4. 1447 01:16:52,830 --> 01:16:57,930 foo só vai volver valor de bar 4 comas 6. 1448 01:16:57,930 --> 01:17:02,380 E bar vai establecer algúns locais n variable igual a 4 veces 6. 1449 01:17:02,380 --> 01:17:03,920 E a continuación, regresar n. 1450 01:17:03,920 --> 01:17:09,130 >> Entón, imos ollar para a pila todo a iteración actual do programa. 1451 01:17:09,130 --> 01:17:10,500 Polo tanto, hai o fondo da nosa stack. 1452 01:17:10,500 --> 01:17:12,620 Teña en conta que de que a pila crecendo. 1453 01:17:12,620 --> 01:17:15,370 Así, na parte inferior da nosa pila, ten un cadro de pila para o principal. 1454 01:17:15,370 --> 01:17:17,000 Cando o programa comeza, principal sempre estará no 1455 01:17:17,000 --> 01:17:18,560 inferior da nosa pila. 1456 01:17:18,560 --> 01:17:20,880 >> E o que está dentro do noso apilar marco para principal? 1457 01:17:20,880 --> 01:17:23,810 Así, aínda que non existan locais variables a principal, como dixen antes, 1458 01:17:23,810 --> 01:17:29,670 temos argc e RGV ocupando espazo dentro do cadro principal de pila. 1459 01:17:29,670 --> 01:17:33,260 Entón principal agora vai chamando a función foo. 1460 01:17:33,260 --> 01:17:35,125 E isto significa que foo vai obter o seu propio cadro de pila. 1461 01:17:35,125 --> 01:17:36,970 >> Polo tanto, agora estamos dentro a función foo. 1462 01:17:36,970 --> 01:17:38,610 E o que precisa para ir en cadro de pila do foo? 1463 01:17:38,610 --> 01:17:41,100 Ben, foo ten un argumento n. 1464 01:17:41,100 --> 01:17:45,440 E n é igual a 4, pois iso é o que principal é pasar como argumento de foo. 1465 01:17:45,440 --> 01:17:48,490 >> Entón agora foo vai chamar bar. 1466 01:17:48,490 --> 01:17:52,070 Que é bar terá dentro de seu 'cadro de pila? 1467 01:17:52,070 --> 01:17:55,610 Ten igual a 4 x y igual a seis. 1468 01:17:55,610 --> 01:17:58,540 Iso non é todo o que nós imos ter no cadro de pila porque bar 1469 01:17:58,540 --> 01:18:00,580 ten tamén unha variable local n. 1470 01:18:00,580 --> 01:18:03,370 E n imos definir igual a 24. 1471 01:18:03,370 --> 01:18:05,750 >> Entón agora bar volverá n. 1472 01:18:05,750 --> 01:18:09,300 Entón bar está retornando 24 a o foo cadro de pila. 1473 01:18:09,300 --> 01:18:12,560 E por agora barra de retorno, que significa que estamos estourando o cadro de pila 1474 01:18:12,560 --> 01:18:14,250 fóra da barra do conxunto. 1475 01:18:14,250 --> 01:18:18,430 Así, toda a memoria que bar fora usando agora fóra da pila. 1476 01:18:18,430 --> 01:18:21,550 >> Agora, foo tamén para volver 24 a principal. 1477 01:18:21,550 --> 01:18:25,470 Polo tanto, agora que foo está retornando, a memoria foo que estaba usando na súa ' 1478 01:18:25,470 --> 01:18:27,550 cadro de pila tamén está desaparecido. 1479 01:18:27,550 --> 01:18:29,660 E agora, o principal vai chamar printf. 1480 01:18:29,660 --> 01:18:31,660 Entón printf é só unha outra función. 1481 01:18:31,660 --> 01:18:35,320 Cando chamamos printf, que será outro cadro de pila para o printf 1482 01:18:35,320 --> 01:18:36,470 chamada de función. 1483 01:18:36,470 --> 01:18:37,990 >> O que estamos pasando printf? 1484 01:18:37,990 --> 01:18:40,090 Iso é o que está indo a ir no seu cadro de pila. 1485 01:18:40,090 --> 01:18:44,970 Como mínimo, estamos pasando que por cento i barra invertida n e 1486 01:18:44,970 --> 01:18:47,180 argumento 24. 1487 01:18:47,180 --> 01:18:50,370 Podería ter máis na súa estrutura de pila se printf pasa a estar a usar un 1488 01:18:50,370 --> 01:18:51,200 variables locais. 1489 01:18:51,200 --> 01:18:51,920 Non sabemos. 1490 01:18:51,920 --> 01:18:53,810 >> Pero todo o que acontece no printf do apilar cadro. 1491 01:18:53,810 --> 01:18:55,740 Vai executar o printf. 1492 01:18:55,740 --> 01:18:56,830 Entón printf está feito. 1493 01:18:56,830 --> 01:18:57,820 El pode voltar. 1494 01:18:57,820 --> 01:18:58,960 Por último, o principal está feito. 1495 01:18:58,960 --> 01:18:59,860 Iniciar volverá. 1496 01:18:59,860 --> 01:19:02,020 E entón o noso programa está feito. 1497 01:19:02,020 --> 01:19:02,480 Si? 1498 01:19:02,480 --> 01:19:04,505 >> Audiencia: Está vendo [inaudível] 1499 01:19:04,505 --> 01:19:05,900 argumentos [inaudível] 1500 01:19:05,900 --> 01:19:06,830 parámetros? 1501 01:19:06,830 --> 01:19:09,970 >> ROB: Entón hai unha diferenza sutil entre argumentos e parámetros. 1502 01:19:09,970 --> 01:19:14,400 E realmente, o falar común, as persoas tenden só para mestura-los o tempo. 1503 01:19:14,400 --> 01:19:17,550 Pero parámetros son os formais nome das cousas. 1504 01:19:17,550 --> 01:19:20,180 >> Entón argc e argv son o parámetros para principal. 1505 01:19:20,180 --> 01:19:23,440 Os argumentos son o que realmente pasar como eses parámetros. 1506 01:19:23,440 --> 01:19:28,340 Entón alí cando chamar foo de 4, 4 é o argumento que estou pasando. 1507 01:19:28,340 --> 01:19:31,460 E o parámetro n, dentro foo, asume o valor 4 1508 01:19:31,460 --> 01:19:32,880 desde 4 foi o argumento. 1509 01:19:32,880 --> 01:19:35,826 >> Audiencia: [inaudível]? 1510 01:19:35,826 --> 01:19:37,880 >> ROB: n é unha variable local para untar. 1511 01:19:37,880 --> 01:19:41,420 1512 01:19:41,420 --> 01:19:44,960 n aínda é lugar para foo, pero é un parámetro para foo. 1513 01:19:44,960 --> 01:19:48,190 Non é unha variable local. 1514 01:19:48,190 --> 01:19:48,546 Si? 1515 01:19:48,546 --> 01:19:51,180 >> Audiencia: [inaudível]? 1516 01:19:51,180 --> 01:19:55,400 >> ROB: foo bar é só chamar e retornando Whatever Bar retorno. 1517 01:19:55,400 --> 01:19:56,786 >> Audiencia: [inaudível]? 1518 01:19:56,786 --> 01:19:59,591 >> ROB: Si, só para ver múltiple apilar cadros. 1519 01:19:59,591 --> 01:20:00,082 Si? 1520 01:20:00,082 --> 01:20:03,519 >> Audiencia: Por foo chamouse antes printf? 1521 01:20:03,519 --> 01:20:05,920 >> ROB: Por que foo chamado antes printf? 1522 01:20:05,920 --> 01:20:10,740 Entón, eu podería, en vez diso, fixo algo como int x é igual a foo de 4 1523 01:20:10,740 --> 01:20:12,980 e logo, impreso x. 1524 01:20:12,980 --> 01:20:17,900 Pero en vez diso, eu combinei a función chamar argumento de printf. 1525 01:20:17,900 --> 01:20:23,670 >> Pero teña en conta que non podemos, de feito, realizar a chamada a printf ata nós 1526 01:20:23,670 --> 01:20:25,610 descubrir o que foo de 4 é. 1527 01:20:25,610 --> 01:20:27,480 Entón nós imos avaliar iso. 1528 01:20:27,480 --> 01:20:32,504 E só unha vez feito isto para volver e avaliar iso. 1529 01:20:32,504 --> 01:20:32,990 Si? 1530 01:20:32,990 --> 01:20:37,364 >> Audiencia: Xa que tanto bar [inaudível] 1531 01:20:37,364 --> 01:20:41,738 valor, por que non ten [inaudível]? 1532 01:20:41,738 --> 01:20:44,400 >> ROB: Deben ser totalmente int. 1533 01:20:44,400 --> 01:20:46,260 Isto non foi capturado máis varios pases. 1534 01:20:46,260 --> 01:20:49,010 Así debe ser int bar e int foo xa que ambos 1535 01:20:49,010 --> 01:20:50,460 están retornando enteiros. 1536 01:20:50,460 --> 01:20:54,214 Baleiro é só no caso de que non van para voltar os valores reais. 1537 01:20:54,214 --> 01:20:54,692 Si? 1538 01:20:54,692 --> 01:20:58,038 >> Audiencia: Se tivese unha liña enriba o retorno, [inaudível]? 1539 01:20:58,038 --> 01:21:01,862 1540 01:21:01,862 --> 01:21:03,730 >> ROB: A liña de enriba do retorno? 1541 01:21:03,730 --> 01:21:04,410 >> Audiencia: Yeah. 1542 01:21:04,410 --> 01:21:10,780 Como se fixo printf e [inaudível] sería imprimir dúas veces? 1543 01:21:10,780 --> 01:21:12,992 >> ROB: Entón, dentro foo? 1544 01:21:12,992 --> 01:21:15,945 Se tivésemos un printf aquí? 1545 01:21:15,945 --> 01:21:16,750 >> Audiencia: Yeah. 1546 01:21:16,750 --> 01:21:19,510 >> ROB: Entón, se nós tivésemos un dereito printf aquí, sería imprimir unha vez. 1547 01:21:19,510 --> 01:21:23,400 Xa que estamos chamando foo xa dereito aquí, entón imos acertar o printf. 1548 01:21:23,400 --> 01:21:24,620 Entón imos chamarlle bar. 1549 01:21:24,620 --> 01:21:25,710 E entón foo vai volver. 1550 01:21:25,710 --> 01:21:26,275 E é iso. 1551 01:21:26,275 --> 01:21:30,985 Nós só atopar sempre printf unha vez. 1552 01:21:30,985 --> 01:21:31,482 Si? 1553 01:21:31,482 --> 01:21:32,973 >> Audiencia: [inaudível] 1554 01:21:32,973 --> 01:21:37,950 printf chamar foo porque estamos en primeiro lugar chamando printf e despois imos pasar 1555 01:21:37,950 --> 01:21:38,580 os argumentos. 1556 01:21:38,580 --> 01:21:40,960 >> ROB: Entón, en teoría, non é printf chamar foo? 1557 01:21:40,960 --> 01:21:42,220 Entón, non. 1558 01:21:42,220 --> 01:21:47,360 Só a fin de que c vai realizar estas cousas é, antes que pudermos 1559 01:21:47,360 --> 01:21:49,800 chamar unha función, todo argumentos para a función que 1560 01:21:49,800 --> 01:21:51,600 ser completamente avaliada. 1561 01:21:51,600 --> 01:21:53,540 Entón é iso totalmente avaliado? 1562 01:21:53,540 --> 01:21:54,610 Si, é só un fío. 1563 01:21:54,610 --> 01:21:55,480 É só un valor. 1564 01:21:55,480 --> 01:21:57,200 >> Entón temos que completamente avaliar iso. 1565 01:21:57,200 --> 01:21:59,720 Unha vez feito isto, agora todo seus argumentos son avaliados. 1566 01:21:59,720 --> 01:22:01,982 E agora podemos facer a chamar para printf. 1567 01:22:01,982 --> 01:22:02,478 Si? 1568 01:22:02,478 --> 01:22:03,966 >> Audiencia: Unha pregunta. 1569 01:22:03,966 --> 01:22:06,942 Se vostede ten unha función void, debe ten retorno punto e coma? 1570 01:22:06,942 --> 01:22:09,910 >> ROB: Non fai un punto e coma retorno se ten unha función void. 1571 01:22:09,910 --> 01:22:13,370 1572 01:22:13,370 --> 01:22:14,780 Está ben. 1573 01:22:14,780 --> 01:22:15,830 Entón, agora algunhas cousas heap. 1574 01:22:15,830 --> 01:22:19,640 Entón pila é como imos tratar co manexo de memoria dinámica. 1575 01:22:19,640 --> 01:22:23,100 E iso contrasta directamente co pila que poderiamos chamar de automático 1576 01:22:23,100 --> 01:22:24,100 xestión de memoria. 1577 01:22:24,100 --> 01:22:27,140 >> Entón na pila, nunca ten para xestionar o xeito no que as variables locais 1578 01:22:27,140 --> 01:22:30,400 están sendo empurrados e bateu fóra todo estes cadros de pila e todas esas cousas. 1579 01:22:30,400 --> 01:22:31,070 Non ten que se preocupar con iso. 1580 01:22:31,070 --> 01:22:32,070 É automático. 1581 01:22:32,070 --> 01:22:36,990 Así, a pila é manual. 1582 01:22:36,990 --> 01:22:38,070 E o [inaudível] 1583 01:22:38,070 --> 01:22:41,260 vén destas funcións malloc e free. 1584 01:22:41,260 --> 01:22:43,550 >> Entón aquí está outro programa. 1585 01:22:43,550 --> 01:22:47,145 Todo o que estamos facendo é mallocing un enteiro. 1586 01:22:47,145 --> 01:22:49,360 Estamos almacenando o en estrela x. 1587 01:22:49,360 --> 01:22:52,520 Por suposto, debemos comprobar a ver se x é nulo. 1588 01:22:52,520 --> 01:22:56,400 Entón imos só definir o que x está a apuntar cara a 50. 1589 01:22:56,400 --> 01:23:00,350 1590 01:23:00,350 --> 01:23:03,260 Imprimir o que está a apuntar cara x, print x, e despois libre x. 1591 01:23:03,260 --> 01:23:08,920 >> Entón, como é que isto realmente vai mirar se miramos a nosa pila e pila? 1592 01:23:08,920 --> 01:23:10,950 Entón, imos comezar de novo. 1593 01:23:10,950 --> 01:23:12,580 A parte inferior da nosa pila como antes. 1594 01:23:12,580 --> 01:23:15,930 Lembre que che amontoar directamente oponse a pila de? 1595 01:23:15,930 --> 01:23:18,850 Entón, nós imos ter o parte superior da nosa pila alí enriba. 1596 01:23:18,850 --> 01:23:22,590 >> Así, o fondo da pila a temos noso cadro de pila para o principal. 1597 01:23:22,590 --> 01:23:28,000 Ten o espazo para argc, argv, e nós Agora temos unha variable x local, que 1598 01:23:28,000 --> 01:23:30,030 é unha estrela int. 1599 01:23:30,030 --> 01:23:32,240 Entón, imos facer unha iteración a través deste programa. 1600 01:23:32,240 --> 01:23:34,420 O primeiro que temos é unha chamada para malloc. 1601 01:23:34,420 --> 01:23:36,250 >> Entón, nós estamos facendo unha chamada a malloc. 1602 01:23:36,250 --> 01:23:37,100 Malloc é unha función. 1603 01:23:37,100 --> 01:23:38,770 Vai chegar un cadro de pila. 1604 01:23:38,770 --> 01:23:40,180 O que estamos pasando para malloc? 1605 01:23:40,180 --> 01:23:41,610 Isto vai entrar do cadro de pila. 1606 01:23:41,610 --> 01:23:45,130 Estamos pasando tamaño n, que é 4. 1607 01:23:45,130 --> 01:23:49,700 Entón, que é pasado para malloc. 1608 01:23:49,700 --> 01:23:50,910 >> Que malloc facer? 1609 01:23:50,910 --> 01:23:53,820 El agarra connosco algún espazo no heap. 1610 01:23:53,820 --> 01:23:55,320 Entón, nós estamos indo a ir á pila. 1611 01:23:55,320 --> 01:23:57,990 E nós imos coller 4 bytes do conxunto. 1612 01:23:57,990 --> 01:24:01,500 Entón imos dar este un enderezo arbitrarios. 1613 01:24:01,500 --> 01:24:06,680 0x123 Basta finxir que é un dirección que está na pila. 1614 01:24:06,680 --> 01:24:12,300 >> Entón, o que en realidade está dentro dese rexión de memoria na páxina Ox123? 1615 01:24:12,300 --> 01:24:13,080 Garbage. 1616 01:24:13,080 --> 01:24:15,270 Entón, nós non memorizou nada nel. 1617 01:24:15,270 --> 01:24:18,830 Así, tanto como sabemos, Podería ser calquera cousa. 1618 01:24:18,830 --> 01:24:20,560 Non debe asumir que é cero. 1619 01:24:20,560 --> 01:24:23,870 É máis probable que non sexa cero. 1620 01:24:23,870 --> 01:24:26,260 >> Retorno Entón agora malloc. 1621 01:24:26,260 --> 01:24:28,020 E o que facemos cando malloc retorna? 1622 01:24:28,020 --> 01:24:29,800 Montar o que retorna. 1623 01:24:29,800 --> 01:24:32,290 Montar x iguais ao que está volvendo. 1624 01:24:32,290 --> 01:24:33,690 Entón o que é o regreso? 1625 01:24:33,690 --> 01:24:38,150 Está volvendo 0x123 xa que é a dirección do bloque de memoria que 1626 01:24:38,150 --> 01:24:40,850 só asignado no heap. 1627 01:24:40,850 --> 01:24:47,160 >> Entón retorne 0x123 x agora será definido igual a 0x123 que, pictoricamente, 1628 01:24:47,160 --> 01:24:52,940 nós frecuentemente deseñar como x tendo un real frecha que apunta para ese bloque. 1629 01:24:52,940 --> 01:24:55,820 Pero x é só almacenar ese enderezo. 1630 01:24:55,820 --> 01:24:58,670 Entón, agora temos que comprobar se x é nulo. 1631 01:24:58,670 --> 01:24:59,120 Non é nulo. 1632 01:24:59,120 --> 01:25:02,170 Finximos que malloc que conseguiu. 1633 01:25:02,170 --> 01:25:04,950 >> Entón, agora estrela x é igual a 50. 1634 01:25:04,950 --> 01:25:08,450 Así estrela recorda que significa ir a este enderezo. 1635 01:25:08,450 --> 01:25:12,700 Entón 0x123 Imos ir a este enderezo. 1636 01:25:12,700 --> 01:25:14,660 Entón, iso nos leva ata alí. 1637 01:25:14,660 --> 01:25:16,310 O que estamos facendo nese enderezo? 1638 01:25:16,310 --> 01:25:19,020 Estamos almacenando 50. 1639 01:25:19,020 --> 01:25:22,500 >> Así, tras esta liña, que é o que as cousas están indo opinión. 1640 01:25:22,500 --> 01:25:24,640 Entón, agora non é máis lixo alí enriba. 1641 01:25:24,640 --> 01:25:28,910 Agora sabemos que o 50 é no que enderezo particular porque 1642 01:25:28,910 --> 01:25:32,410 nós configuralo para iso. 1643 01:25:32,410 --> 01:25:32,790 Ok? 1644 01:25:32,790 --> 01:25:34,370 Entón agora imos imprimir f. 1645 01:25:34,370 --> 01:25:38,490 >> Entón, primeiro imos para imprimir estrela x. 1646 01:25:38,490 --> 01:25:39,640 Entón, cal é estrela x? 1647 01:25:39,640 --> 01:25:44,300 Unha vez máis, a estrela x significa ir á que x está a apuntar. 1648 01:25:44,300 --> 01:25:47,140 Entón x é almacenar 0x123 Vaia iso. 1649 01:25:47,140 --> 01:25:48,490 Estivemos con 50. 1650 01:25:48,490 --> 01:25:50,540 Así que imprimir f. 1651 01:25:50,540 --> 01:25:54,900 E iso significa que vai imprimir 50. 1652 01:25:54,900 --> 01:25:56,850 E despois que retorna. 1653 01:25:56,850 --> 01:25:58,340 >> E despois temos o segundo printf. 1654 01:25:58,340 --> 01:25:59,370 Agora estamos por cento p. 1655 01:25:59,370 --> 01:26:01,680 Se aínda non viu, esta é só como imprimir un punteiro. 1656 01:26:01,680 --> 01:26:04,960 Polo tanto, temos por cento i, cento f, e todos aqueles xa. 1657 01:26:04,960 --> 01:26:07,160 Entón por cento p, imprimir un punteiro. 1658 01:26:07,160 --> 01:26:08,920 >> Entón x é un punteiro. 1659 01:26:08,920 --> 01:26:13,440 Entón, se nós estamos indo para imprimir x si, estamos imprimindo o que en realidade está dentro 1660 01:26:13,440 --> 01:26:19,220 x, o cal é 0x123 Así, o primeiro print f vai imprimir 50. 1661 01:26:19,220 --> 01:26:23,620 A segunda impresión f vai para imprimir 0x123 Si? 1662 01:26:23,620 --> 01:26:27,460 >> Audiencia: Vostede usa por cento x para imprimir un enlace? 1663 01:26:27,460 --> 01:26:31,200 >> ROB: Entón usa por cento x para imprimir un enlace? 1664 01:26:31,200 --> 01:26:38,350 Entón pode, pero por cento x é xusto, xeral, pois, como se ten algún 1665 01:26:38,350 --> 01:26:40,325 enteiro e que quere imprimir lo como un hexadecimal. 1666 01:26:40,325 --> 01:26:43,250 1667 01:26:43,250 --> 01:26:44,880 Isto é só como facelo. 1668 01:26:44,880 --> 01:26:47,160 >> Considerando que, por cento d faría imprimir como decimal. 1669 01:26:47,160 --> 01:26:50,310 É aí onde comezan por cento d. i é só enteiro. 1670 01:26:50,310 --> 01:26:52,690 por cento p é especialmente para punteiros. 1671 01:26:52,690 --> 01:26:54,060 >> Entón x é un punteiro. 1672 01:26:54,060 --> 01:26:56,360 Queremos usar por cento p. 1673 01:26:56,360 --> 01:26:57,937 Pero por cento x podería traballar. 1674 01:26:57,937 --> 01:26:58,414 Si? 1675 01:26:58,414 --> 01:26:59,664 >> Audiencia: [inaudível]? 1676 01:26:59,664 --> 01:27:04,138 1677 01:27:04,138 --> 01:27:05,388 >> ROB: Yeah. 1678 01:27:05,388 --> 01:27:07,870 1679 01:27:07,870 --> 01:27:13,440 Polo menos para este call-- entón eu non inclúe-lo aquí. 1680 01:27:13,440 --> 01:27:19,850 Pero estes dous argumentos son necesariamente dentro deste marco de pila 1681 01:27:19,850 --> 01:27:23,040 xunto con calquera variables locais printf pasa a ser utilizado. 1682 01:27:23,040 --> 01:27:27,020 E, a continuación, a próxima chamada a printf agora dentro printf cadro de pila é 1683 01:27:27,020 --> 01:27:33,960 por cento p barra invertida n e calquera que sexa o valor de x é, cal é 0x123. 1684 01:27:33,960 --> 01:27:34,425 Si? 1685 01:27:34,425 --> 01:27:35,675 >> Audiencia: [inaudível]? 1686 01:27:35,675 --> 01:27:38,145 1687 01:27:38,145 --> 01:27:40,880 >> ROB: El vai imprimir algo que se parece con isto. 1688 01:27:40,880 --> 01:27:41,846 >> Audiencia: [inaudível]. 1689 01:27:41,846 --> 01:27:44,510 >> ROB: Entón el imprime-lo en forma de enderezo. 1690 01:27:44,510 --> 01:27:47,003 Parece que un enderezo. 1691 01:27:47,003 --> 01:27:47,494 Si? 1692 01:27:47,494 --> 01:27:49,458 >> Audiencia: [inaudível]? 1693 01:27:49,458 --> 01:27:51,075 >> ROB: Por que é o que? 1694 01:27:51,075 --> 01:27:52,920 >> Audiencia: [inaudível]? 1695 01:27:52,920 --> 01:27:55,240 >> ROB: Por que este punteiro 4 bytes? 1696 01:27:55,240 --> 01:27:58,500 Polo tanto, hai unha morea de 0 fronte a este. 1697 01:27:58,500 --> 01:28:03,740 Entón, é realmente 0x0000000123. 1698 01:28:03,740 --> 01:28:06,510 Nun sistema de 64 bits, non habería unha morea de máis ceros. 1699 01:28:06,510 --> 01:28:11,410 1700 01:28:11,410 --> 01:28:11,900 Si? 1701 01:28:11,900 --> 01:28:13,150 >> Audiencia: [inaudível]. 1702 01:28:13,150 --> 01:28:17,290 1703 01:28:17,290 --> 01:28:21,130 >> ROB: Entón o primeiro printf vai print-- 1704 01:28:21,130 --> 01:28:21,980 >> Audiencia: [inaudível]. 1705 01:28:21,980 --> 01:28:24,420 >> ROB: Si, está indo para imprimir que x está a apuntar. 1706 01:28:24,420 --> 01:28:27,030 1707 01:28:27,030 --> 01:28:29,070 Estrela di o que é iso cousa a apuntar. 1708 01:28:29,070 --> 01:28:30,300 Agarre-o. 1709 01:28:30,300 --> 01:28:31,455 Entón que é o que está a apuntar? 1710 01:28:31,455 --> 01:28:31,850 50. 1711 01:28:31,850 --> 01:28:32,410 Agarre-o. 1712 01:28:32,410 --> 01:28:33,390 Iso é o que imos imprimir. 1713 01:28:33,390 --> 01:28:37,020 Considerando que, o próximo, estamos só imprimir x si. 1714 01:28:37,020 --> 01:28:38,850 O que está dentro de f? 1715 01:28:38,850 --> 01:28:43,710 0x123. 1716 01:28:43,710 --> 01:28:44,500 Está ben. 1717 01:28:44,500 --> 01:28:46,620 >> E entón, finalmente, temos o libre. 1718 01:28:46,620 --> 01:28:48,040 O que estamos pasando para liberar? 1719 01:28:48,040 --> 01:28:49,470 Estamos pasando x. 1720 01:28:49,470 --> 01:28:52,380 Naquela época, eu realmente exhibido lo no cadro de pila. 1721 01:28:52,380 --> 01:28:56,370 >> Entón, nós estamos pasando o valor 0x123 liberar. 1722 01:28:56,370 --> 01:28:59,070 Entón, agora libre sabe, todo ben, Teño que ir ata a pila 1723 01:28:59,070 --> 01:29:00,050 e sen que a memoria. 1724 01:29:00,050 --> 01:29:03,920 Xa non está a usar o está no enderezo 0x123. 1725 01:29:03,920 --> 01:29:07,010 >> Tan libre lanzará que desde o heap. 1726 01:29:07,010 --> 01:29:09,490 Agora a nosa pila está baleira de novo. 1727 01:29:09,490 --> 01:29:11,120 Non temos perdas de memoria. 1728 01:29:11,120 --> 01:29:12,940 Agora libre vai volver. 1729 01:29:12,940 --> 01:29:16,130 Teña en conta que x é aínda 0x123. 1730 01:29:16,130 --> 01:29:18,240 Pero iso agora non é válido memoria. 1731 01:29:18,240 --> 01:29:21,220 1732 01:29:21,220 --> 01:29:23,986 Non hai máis desreferenciava x. 1733 01:29:23,986 --> 01:29:24,440 Si? 1734 01:29:24,440 --> 01:29:27,240 >> Audiencia: É voltar 0 redundante? 1735 01:29:27,240 --> 01:29:28,290 >> ROB: É returen 0 redundante? 1736 01:29:28,290 --> 01:29:31,110 Si. 1737 01:29:31,110 --> 01:29:33,950 Acabamos de poñer que alí porque temos un retorno dun ao aire. 1738 01:29:33,950 --> 01:29:36,830 Entón, é como si, permite inclúen o regreso 0. 1739 01:29:36,830 --> 01:29:37,310 Si? 1740 01:29:37,310 --> 01:29:38,560 >> Audiencia: [inaudível]? 1741 01:29:38,560 --> 01:29:42,110 1742 01:29:42,110 --> 01:29:45,580 >> ROB: Entón, despois x libres, o que pasa se tratamos cancelar o punteiro? 1743 01:29:45,580 --> 01:29:47,240 É posible que nada dea mal. 1744 01:29:47,240 --> 01:29:49,330 É posible que aínda recibirá 50. 1745 01:29:49,330 --> 01:29:53,590 >> É posible, tamén, que esa memoria é agora está a ser usado para outra cousa. 1746 01:29:53,590 --> 01:29:57,140 Polo tanto, é un comportamento indefinido. 1747 01:29:57,140 --> 01:30:00,772 E indefinida significa nada pode pasar. 1748 01:30:00,772 --> 01:30:01,250 Si? 1749 01:30:01,250 --> 01:30:02,500 >> Audiencia: [inaudível]? 1750 01:30:02,500 --> 01:30:07,942 1751 01:30:07,942 --> 01:30:10,830 >> ROB: Non, por iso, se asignar x para outra cousa. 1752 01:30:10,830 --> 01:30:15,870 Entón, aquí dixemos x é igual a algo malloc else-- 1753 01:30:15,870 --> 01:30:17,100 tamaño malloc event-- 1754 01:30:17,100 --> 01:30:20,180 entón que bloque orixinal de memoria non é liberar. 1755 01:30:20,180 --> 01:30:21,490 E perdemos oficialmente. 1756 01:30:21,490 --> 01:30:23,150 Isto é unha perda de memoria. 1757 01:30:23,150 --> 01:30:25,090 Perdemos as referencias para este bloque de memoria. 1758 01:30:25,090 --> 01:30:26,827 Entón non hai ningunha maneira que podemos nunca liberalo la. 1759 01:30:26,827 --> 01:30:32,074 1760 01:30:32,074 --> 01:30:36,630 OK, entón, a continuación, regresar 0 significa feito. 1761 01:30:36,630 --> 01:30:37,900 >> Todos estourido ben, entón pila. 1762 01:30:37,900 --> 01:30:39,320 Cal é a idea aquí? 1763 01:30:39,320 --> 01:30:41,210 Entón lembre, pila está indo para abaixo. 1764 01:30:41,210 --> 01:30:43,480 Stack está subindo. 1765 01:30:43,480 --> 01:30:48,000 Polo tanto, este foi o exemplo da charla, Creo que, onde principal só vai 1766 01:30:48,000 --> 01:30:51,380 chamar esta función foo, que vai a chamarse de recursivamente unha e 1767 01:30:51,380 --> 01:30:52,320 unha vez máis. 1768 01:30:52,320 --> 01:30:55,370 >> Entón apilar cadros van funcionan exactamente do mesmo. 1769 01:30:55,370 --> 01:30:58,130 Entón, imos comezar con principal como o cadro de pila inferior. 1770 01:30:58,130 --> 01:31:02,000 Entón principal vai chamar foo, que está indo para obter un cadro de pila. 1771 01:31:02,000 --> 01:31:04,260 >> Entón foo vai chamar foo de novo, o que se ve 1772 01:31:04,260 --> 01:31:05,500 outro cadro de pila. 1773 01:31:05,500 --> 01:31:08,270 E entón, de novo, e de novo, e de novo, e de novo, ata que, finalmente, corremos 1774 01:31:08,270 --> 01:31:09,190 no heap. 1775 01:31:09,190 --> 01:31:11,990 Entón é así que chegamos un estourido de pila. 1776 01:31:11,990 --> 01:31:14,910 E, neste punto, SEG culpa. 1777 01:31:14,910 --> 01:31:17,335 Ou realmente seg falla antes neste punto, pero si. 1778 01:31:17,335 --> 01:31:19,660 >> Audiencia: É núcleo despexar o aínda que culpa seg? 1779 01:31:19,660 --> 01:31:26,140 >> ROB: Entón verás segmentación núcleo culpa despexado. 1780 01:31:26,140 --> 01:31:28,760 Gañou un dump de memoria cando vostede SEG culpa. 1781 01:31:28,760 --> 01:31:32,580 E é como unha reserva de todos os contido da memoria actual 1782 01:31:32,580 --> 01:31:36,670 que pode tentar identificarse por que o seg criticado. 1783 01:31:36,670 --> 01:31:37,135 Si? 1784 01:31:37,135 --> 01:31:38,385 >> Audiencia: [inaudível]? 1785 01:31:38,385 --> 01:31:40,855 1786 01:31:40,855 --> 01:31:45,460 >> ROB: Entón un medio fallo de segmentación hai un estourido de pila. 1787 01:31:45,460 --> 01:31:47,060 Entón, non necesariamente. 1788 01:31:47,060 --> 01:31:49,880 O fallo de segmentación significa que está memoria tocar dun xeito 1789 01:31:49,880 --> 01:31:50,880 non debe ser. 1790 01:31:50,880 --> 01:31:54,750 Polo tanto, unha forma de isto acontecer é que, cando ti estourido de pila, comezan a tocar 1791 01:31:54,750 --> 01:31:58,736 memoria dunha forma que non debería ser. 1792 01:31:58,736 --> 01:31:59,208 Si? 1793 01:31:59,208 --> 01:32:00,458 >> Audiencia: [inaudível]? 1794 01:32:00,458 --> 01:32:03,456 1795 01:32:03,456 --> 01:32:05,830 >> ROB: Entón, dentro dun loop infinito. 1796 01:32:05,830 --> 01:32:08,770 Tipo, iso é como un infinito recursiva loop e entón temos outro 1797 01:32:08,770 --> 01:32:09,770 cadro de pila de cada vez. 1798 01:32:09,770 --> 01:32:13,540 Pero só dentro dun estándar infinito mentres um-- 1799 01:32:13,540 --> 01:32:16,390 ben, non imos nin imprimir F-- 1800 01:32:16,390 --> 01:32:17,040 facer algo. 1801 01:32:17,040 --> 01:32:18,390 Calquera que sexa. 1802 01:32:18,390 --> 01:32:20,610 >> Non imos estar recibindo outro cadro de pila. 1803 01:32:20,610 --> 01:32:22,530 Nós só estamos indo a perder looping sobre esta única instrución. 1804 01:32:22,530 --> 01:32:23,920 A pila non está crecendo. 1805 01:32:23,920 --> 01:32:27,290 É o feito de que cada recursiva chamada está nos dando un cadro de pila. 1806 01:32:27,290 --> 01:32:31,231 É por iso que temos un estourido de pila. 1807 01:32:31,231 --> 01:32:31,728 Si? 1808 01:32:31,728 --> 01:32:38,189 >> Audiencia: Entón, se dixo para obter o while e despois [inaudível]? 1809 01:32:38,189 --> 01:32:42,000 >> ROB: Entón, se dentro do loop while había un printf, aínda 1810 01:32:42,000 --> 01:32:42,790 culpa non seg. 1811 01:32:42,790 --> 01:32:46,090 Eu só non quero confundir as cousas. 1812 01:32:46,090 --> 01:32:46,610 Sería circuíto. 1813 01:32:46,610 --> 01:32:48,225 Desexa obter unha única pila enmarcar a printf. 1814 01:32:48,225 --> 01:32:49,580 >> Entón printf volvería. 1815 01:32:49,580 --> 01:32:50,280 Entón ciclo de novo. 1816 01:32:50,280 --> 01:32:51,460 Desexa obter unha única pila enmarcar a printf. 1817 01:32:51,460 --> 01:32:52,850 Iria volver. 1818 01:32:52,850 --> 01:32:54,060 Cadro único pila. 1819 01:32:54,060 --> 01:33:00,215 Entón non está a recibir este infinito empilhado pila de cadros. 1820 01:33:00,215 --> 01:33:03,185 >> Audiencia: [inaudível]? 1821 01:33:03,185 --> 01:33:04,040 >> ROB: Si. 1822 01:33:04,040 --> 01:33:09,360 Entón ese estourido de pila ocorre porque ningún deles 1823 01:33:09,360 --> 01:33:11,600 chamadas a foo están volvendo. 1824 01:33:11,600 --> 01:33:15,250 Entón, se volvemos, entón teriamos comezar a perder cadros de pila. 1825 01:33:15,250 --> 01:33:17,870 E entón nós non estourido de pila. 1826 01:33:17,870 --> 01:33:20,070 E é por iso que precisa de un caso base para as súas funcións persoais. 1827 01:33:20,070 --> 01:33:22,992 1828 01:33:22,992 --> 01:33:23,479 Si? 1829 01:33:23,479 --> 01:33:27,375 >> Audiencia: É o tamaño potencial ea pila para a pila a mesma para 1830 01:33:27,375 --> 01:33:29,880 todos os programas? 1831 01:33:29,880 --> 01:33:31,910 >> ROB: Aproximadamente. 1832 01:33:31,910 --> 01:33:35,090 É o tamaño do potencial da pila e a pila a mesma para todos os programas? 1833 01:33:35,090 --> 01:33:37,180 Preto. 1834 01:33:37,180 --> 01:33:40,080 Hai uns randomização para en que a pila e inicia 1835 01:33:40,080 --> 01:33:42,400 onde a pila comeza. 1836 01:33:42,400 --> 01:33:45,870 Se ocorrer de ter unha chea de variables globais e as cousas, que pode 1837 01:33:45,870 --> 01:33:49,520 sacar dalgún espazo para a súa heap. 1838 01:33:49,520 --> 01:33:54,060 >> Nun sistema de 64 bits, ten practicamente ten memoria infinita. 1839 01:33:54,060 --> 01:33:55,820 Hai tanta cousa. 1840 01:33:55,820 --> 01:33:59,250 Entre 32 bits e 64 bits, que é unha diferenza significativa. 1841 01:33:59,250 --> 01:34:02,350 >> Vai ser moito máis pila e heap space nun 64 bits 1842 01:34:02,350 --> 01:34:05,810 sistema, xa non é só enderezos que poden usar. 1843 01:34:05,810 --> 01:34:09,360 Pero nun sistema individual, será ser máis ou menos a mesma cantidade de pila 1844 01:34:09,360 --> 01:34:10,785 e espazo de pila. 1845 01:34:10,785 --> 01:34:13,635 1846 01:34:13,635 --> 01:34:15,530 Todo correcto. 1847 01:34:15,530 --> 01:34:18,220 >> Así último é a compilación. 1848 01:34:18,220 --> 01:34:19,810 Entón ten que saber este proceso. 1849 01:34:19,810 --> 01:34:22,240 Existen catro grandes etapas. 1850 01:34:22,240 --> 01:34:24,400 Así, o primeiro que se ser fácil de lembrar. 1851 01:34:24,400 --> 01:34:25,085 Vista procesamento. 1852 01:34:25,085 --> 01:34:28,390 Ela ten o prefixo pre nel. 1853 01:34:28,390 --> 01:34:32,080 Por iso, vén antes de todo. 1854 01:34:32,080 --> 01:34:34,000 >> A cousa a lembrar o hash. 1855 01:34:34,000 --> 01:34:37,250 Entón haxix define e haxix inclúe en todo isto. 1856 01:34:37,250 --> 01:34:39,560 Estas son todas pre-procesador directivas. 1857 01:34:39,560 --> 01:34:42,030 Estas son as cousas que os pre-procesador coida. 1858 01:34:42,030 --> 01:34:43,680 >> Entón, o que un pre-procesador de facer? 1859 01:34:43,680 --> 01:34:44,850 É unha cousa realmente idiota. 1860 01:34:44,850 --> 01:34:49,380 Todo o que é capaz de son todo isto copia e Cortar e Pegar operacións. 1861 01:34:49,380 --> 01:34:51,790 >> Así, de hash inclúe estándar i0 punto h. 1862 01:34:51,790 --> 01:34:52,990 Que está facendo? 1863 01:34:52,990 --> 01:34:56,610 Está agarrando o estándar i0 dot h arquivo e pegalo a arriba 1864 01:34:56,610 --> 01:34:58,960 onde queira que el di de hash inclúe estándar dot h i0. 1865 01:34:58,960 --> 01:35:02,480 >> E calquera hash de definir que temos ver, que é o que está facendo? 1866 01:35:02,480 --> 01:35:06,730 A súa copia o valor que a suma definido defínese como e colando que 1867 01:35:06,730 --> 01:35:08,500 onde queira que está a usar o valor. 1868 01:35:08,500 --> 01:35:13,400 Así, o pre-procesador só fai realmente operacións baseadas en texto sen formato. 1869 01:35:13,400 --> 01:35:15,870 El non fai nada intelixente. 1870 01:35:15,870 --> 01:35:18,920 Entón, todo o demais é máis complicado. 1871 01:35:18,920 --> 01:35:22,970 >> Polo tanto, agora que é pre-procesador feito, nós realmente compilar. 1872 01:35:22,970 --> 01:35:24,320 Entón, o que a compilación significa? 1873 01:35:24,320 --> 01:35:27,310 Estamos indo de código c ao código de montaxe. 1874 01:35:27,310 --> 01:35:27,570 Si? 1875 01:35:27,570 --> 01:35:28,820 >> Audiencia: [inaudível]? 1876 01:35:28,820 --> 01:35:32,390 1877 01:35:32,390 --> 01:35:34,220 >> ROB: Si, nós pegamos iso. 1878 01:35:34,220 --> 01:35:36,880 1879 01:35:36,880 --> 01:35:38,660 Entón compilar. 1880 01:35:38,660 --> 01:35:40,310 Estamos indo de C para montaxe. 1881 01:35:40,310 --> 01:35:42,470 Polo tanto, esta é un cambio de linguaxe real. 1882 01:35:42,470 --> 01:35:45,240 Compilar-se significa ir de unha linguaxe de alto nivel para 1883 01:35:45,240 --> 01:35:47,340 nunha linguaxe de nivel inferior. 1884 01:35:47,340 --> 01:35:50,720 >> E c é unha linguaxe de alto nivel en comparación coa montaxe. 1885 01:35:50,720 --> 01:35:52,320 Que é montaxe? 1886 01:35:52,320 --> 01:35:56,440 As súas instrucións que, moi moito, feito para o seu CPU. 1887 01:35:56,440 --> 01:35:59,130 Pero o equipo aínda non Non entendo montaxe. 1888 01:35:59,130 --> 01:36:01,570 El só entende ceros e uns. 1889 01:36:01,570 --> 01:36:06,160 Entón, o seguinte paso é a montaxe, que lévanos a estas instrucións que 1890 01:36:06,160 --> 01:36:08,760 súa CPU comprende e realmente traduce a eles, para 1891 01:36:08,760 --> 01:36:10,820 os uns e ceros. 1892 01:36:10,820 --> 01:36:13,570 >> Entón C para montaxe de binario. 1893 01:36:13,570 --> 01:36:15,870 Pero eu non teño un executable aínda. 1894 01:36:15,870 --> 01:36:19,550 Entón, creo que a biblioteca CS50. 1895 01:36:19,550 --> 01:36:23,070 Nós fornecen-lle con un binario para esta biblioteca CS50, que ten GetString 1896 01:36:23,070 --> 01:36:24,400 e GetInt e todo iso. 1897 01:36:24,400 --> 01:36:25,700 >> Pero o CS50 library-- 1898 01:36:25,700 --> 01:36:27,650 e de itself-- non é executable. 1899 01:36:27,650 --> 01:36:29,570 Non ten unha función principal. 1900 01:36:29,570 --> 01:36:32,230 É só unha morea de binario que pode usar. 1901 01:36:32,230 --> 01:36:41,730 Entón conexión é así que reunir todos destes ficheiros binarios distintos 1902 01:36:41,730 --> 01:36:43,110 nun arquivo executable real. 1903 01:36:43,110 --> 01:36:45,900 Un que podes escribir dot cortar un punto fóra. 1904 01:36:45,900 --> 01:36:51,660 >> Entón, iso é como o ficheiro que escribiu, - calquera que sexa o seu programa é-- 1905 01:36:51,660 --> 01:36:53,620 Ceaser punto c. 1906 01:36:53,620 --> 01:36:55,100 Pero agora compilouse ata binario. 1907 01:36:55,100 --> 01:36:56,480 Así, o punto de Ceaser. 1908 01:36:56,480 --> 01:36:59,620 E esta é a nosa CS50 bibliotecas binario. 1909 01:36:59,620 --> 01:37:02,284 E eles están sendo combinadas nun único executable. 1910 01:37:02,284 --> 01:37:02,758 Si? 1911 01:37:02,758 --> 01:37:04,008 >> Audiencia: [inaudível]? 1912 01:37:04,008 --> 01:37:08,800 1913 01:37:08,800 --> 01:37:12,710 >> ROB: Entón primeiro inclúen, lembre, o hash incluír en realidade é un 1914 01:37:12,710 --> 01:37:13,810 paso de pre-procesador. 1915 01:37:13,810 --> 01:37:14,750 Pero iso é separado. 1916 01:37:14,750 --> 01:37:20,730 Se non está a usar todas as funcións que están fóra do seu arquivo único, a continuación, 1917 01:37:20,730 --> 01:37:26,100 Non, non precisa de conexión nada pois ten todo. 1918 01:37:26,100 --> 01:37:30,310 >> Dito isto, printf está a ser vinculado en. 1919 01:37:30,310 --> 01:37:32,820 Se nunca usar printf, iso é algo que ten que ser conectado en 1920 01:37:32,820 --> 01:37:35,740 porque non escribiu isto. 1921 01:37:35,740 --> 01:37:39,530 E, de feito, printf automaticamente ligada en. 1922 01:37:39,530 --> 01:37:42,760 Vostede sabe como na liña de comandos ou cando insire make, ve que ten 1923 01:37:42,760 --> 01:37:46,690 trazo l CS50, que ten conexión na biblioteca CS50? 1924 01:37:46,690 --> 01:37:49,070 Printf, e cousas así, vai para ser conectado automaticamente. 1925 01:37:49,070 --> 01:37:51,730 1926 01:37:51,730 --> 01:37:53,930 Calquera outra dúbida sobre algo? 1927 01:37:53,930 --> 01:37:56,280 >> Audiencia: [inaudível]? 1928 01:37:56,280 --> 01:37:58,300 >> ROB: Vinculación? 1929 01:37:58,300 --> 01:38:03,450 Temos unha morea de diferentes arquivos binarios. 1930 01:38:03,450 --> 01:38:06,410 Este é o exemplo canónica que usan é a biblioteca CS50. 1931 01:38:06,410 --> 01:38:09,960 Nós compilamos e dado a ti o binaria para esta biblioteca CS50. 1932 01:38:09,960 --> 01:38:12,410 >> Quere usar GetString no seu programa. 1933 01:38:12,410 --> 01:38:14,750 Entón, vai usar GetString. 1934 01:38:14,750 --> 01:38:19,700 Pero sen o meu código binario para GetString, cando compilar o código 1935 01:38:19,700 --> 01:38:23,140 abaixo, non pode realmente realizar o seu programa porque GetString cadea é 1936 01:38:23,140 --> 01:38:25,080 aínda non totalmente definido. 1937 01:38:25,080 --> 01:38:29,220 >> É só cando conectar o meu binario que contén GetString que agora, todo 1938 01:38:29,220 --> 01:38:31,130 ben, eu podo realmente realizar GetString. 1939 01:38:31,130 --> 01:38:32,330 O meu arquivo está completo. 1940 01:38:32,330 --> 01:38:34,208 E podo realizar iso. 1941 01:38:34,208 --> 01:38:34,697 Si? 1942 01:38:34,697 --> 01:38:37,631 >> Audiencia: Fai ligando converter o binario ao executábel? 1943 01:38:37,631 --> 01:38:42,032 Así, mesmo se non ten outra bibliotecas, non sería aínda 1944 01:38:42,032 --> 01:38:44,477 necesario para traducir o [inaudível]? 1945 01:38:44,477 --> 01:38:48,640 >> ROB: Entón un executable aínda é en binario. 1946 01:38:48,640 --> 01:38:51,750 É só combinar un todo banda de binarios. 1947 01:38:51,750 --> 01:38:55,124 1948 01:38:55,124 --> 01:38:56,591 >> Audiencia: Moitas grazas. 1949 01:38:56,591 --> 01:38:58,560 >> ROB: Non hai ningún problema. 1950 01:38:58,560 --> 01:38:59,540 Algunha pregunta? 1951 01:38:59,540 --> 01:39:02,001 Se non, está todo preparado. 1952 01:39:02,001 --> 01:39:02,690 Todo correcto. 1953 01:39:02,690 --> 01:39:02,990 Grazas. 1954 01:39:02,990 --> 01:39:03,590 >> [Aplausos] 1955 01:39:03,590 --> 01:39:04,490 >> Audiencia: Grazas. 1956 01:39:04,490 --> 01:39:05,740 >> ROB: Yeah. 1957 01:39:05,740 --> 01:39:06,582