1 00:00:00,000 --> 00:00:02,742 2 00:00:02,742 --> 00:00:05,680 >> COLUNA 1: Olá a todos. 3 00:00:05,680 --> 00:00:07,530 Vamos começar. 4 00:00:07,530 --> 00:00:09,330 Acho que as pessoas ainda estão indo ser filtrando. 5 00:00:09,330 --> 00:00:12,840 Mas, no interesse de tempo, para que possamos obter vocês daqui na hora certa, 6 00:00:12,840 --> 00:00:14,110 vamos começar. 7 00:00:14,110 --> 00:00:18,780 Então bem-vindo ao CS50 quiz 0 avaliação. 8 00:00:18,780 --> 00:00:23,020 Para aqueles de vocês que ainda não percebeu no entanto, você tem uma pergunta na quarta-feira. 9 00:00:23,020 --> 00:00:25,700 Woo-hoo. 10 00:00:25,700 --> 00:00:29,780 >> Se você ainda não começou a estudar ainda ou não perceberam que isto existe ainda, 11 00:00:29,780 --> 00:00:34,070 quizzes passadas e todas as informações sobre seu questionário estão no cs50.net/quizzes. 12 00:00:34,070 --> 00:00:38,090 Há algumas coisas muito boas por lá, quizzes últimos dos últimos 10 13 00:00:38,090 --> 00:00:43,760 anos, bem como informações sobre este quiz e temas 14 00:00:43,760 --> 00:00:46,250 que vai ser coberta. 15 00:00:46,250 --> 00:00:48,980 Então, vamos começar. 16 00:00:48,980 --> 00:00:54,240 >> Então vocês devem se lembrar, o primeiro dia de aula David tinha essas lâmpadas por diante. 17 00:00:54,240 --> 00:00:59,650 Então, basicamente, tudo o que acontece sob a capa de um computador é 18 00:00:59,650 --> 00:01:00,860 feito em binário. 19 00:01:00,860 --> 00:01:04,080 Binário significa o que soa como, 0 e 1 do. 20 00:01:04,080 --> 00:01:09,290 Ela tem dois valores pode ser representada. 21 00:01:09,290 --> 00:01:14,675 >> Assim como no primeiro dia de seção quando David acendeu uma luz 22 00:01:14,675 --> 00:01:21,990 lâmpada para representar em, ou 1, o nosso computador entende como binário 0 e 23 00:01:21,990 --> 00:01:24,110 1 de, ligado ou desligado. 24 00:01:24,110 --> 00:01:25,360 Noções básicas de binário. 25 00:01:25,360 --> 00:01:29,440 26 00:01:29,440 --> 00:01:32,470 Cada lugar é representado na base de dois. 27 00:01:32,470 --> 00:01:36,260 Então você adiciona 2 a 0 para o 1 a 2 por todo o caminho para cima. 28 00:01:36,260 --> 00:01:41,970 >> Para calcular o seu binário é decimal, basta seguir esta equação 29 00:01:41,970 --> 00:01:42,840 Tipo de coisa. 30 00:01:42,840 --> 00:01:49,510 Se você tem um 1 em qualquer um desses lugares, você multiplicá-lo por tudo o que 31 00:01:49,510 --> 00:01:53,820 baseá-lo está, adicioná-lo para cima, e você começa a decimal. 32 00:01:53,820 --> 00:01:57,930 Então é assim que você contar a 5 em binário. 33 00:01:57,930 --> 00:02:01,400 Assim como o que estávamos fazendo no último slide, isto é como se fosse 34 00:02:01,400 --> 00:02:02,650 representam de 1 a 5. 35 00:02:02,650 --> 00:02:05,320 36 00:02:05,320 --> 00:02:09,660 >> Da mesma forma, assim como você pode adicionar e subtrair em decimal ou base 10, ou 37 00:02:09,660 --> 00:02:13,040 realmente alguma base, em pode adicionar e subtrair em binário. 38 00:02:13,040 --> 00:02:18,400 Exatamente o que você pode esperar quando você adicionar os dois para cima, se ele é igual a maior 39 00:02:18,400 --> 00:02:24,220 que 1, você carrega a 1, torná-lo um 0, e fazer a adição dessa maneira, apenas 40 00:02:24,220 --> 00:02:29,910 como seria de esperar com regulares decimal ou qualquer outra base. 41 00:02:29,910 --> 00:02:30,970 Legal. 42 00:02:30,970 --> 00:02:35,140 >> Então, como eu disse antes, tudo o que continua sob a capa de nosso computador 43 00:02:35,140 --> 00:02:37,560 é feito em 0 e 1 do, ou binário. 44 00:02:37,560 --> 00:02:43,470 Então, como podemos expressar, por exemplo, letras ou números ou caracteres? 45 00:02:43,470 --> 00:02:45,560 E a resposta para isso é ASCII. 46 00:02:45,560 --> 00:02:49,380 >> ASCII é um mapeamento entre os caracteres que nós normalmente vemos no 47 00:02:49,380 --> 00:02:53,360 Idioma Inglês como a, B de, Cs, sublinhado, traços, e 48 00:02:53,360 --> 00:02:54,910 qualquer coisa assim. 49 00:02:54,910 --> 00:02:57,260 E ele mapeia isso para um valor ASCII. 50 00:02:57,260 --> 00:03:03,080 Um valor ASCII é apenas um número que pode ser entendido pelo computador. 51 00:03:03,080 --> 00:03:07,430 E, assim como você pode fazer a adição e subtração com números, você pode fazer 52 00:03:07,430 --> 00:03:10,890 los com valores ASCII. 53 00:03:10,890 --> 00:03:14,050 >> Portanto, neste exemplo, o que isso vai imprimir? 54 00:03:14,050 --> 00:03:26,790 55 00:03:26,790 --> 00:03:35,480 Sim, por isso apenas um espaço B espaço espaço C D. Onde meu mouse ir? 56 00:03:35,480 --> 00:03:39,200 57 00:03:39,200 --> 00:03:43,380 Observe que você pode definir um int a 65. 58 00:03:43,380 --> 00:03:47,080 E quando você imprime que utilizando por cento C, vai interpretar isso como um 59 00:03:47,080 --> 00:03:49,330 caráter e irá imprimir A. 60 00:03:49,330 --> 00:03:52,800 >> Da mesma forma, você pode declarar lo como um char. 61 00:03:52,800 --> 00:03:56,860 E quando você imprimi-lo usando cento C, que vai interpretar isso como 62 00:03:56,860 --> 00:04:05,240 por cento D. E, assim como você pode adicionar um número, você pode adicionar personagens são 63 00:04:05,240 --> 00:04:06,878 Valores ASCII, neste caso. 64 00:04:06,878 --> 00:04:11,370 65 00:04:11,370 --> 00:04:16,130 >> Então, um pouco ponteiro para todos. 66 00:04:16,130 --> 00:04:19,610 5, como uma string, não na verdade, ser igual a 5. 67 00:04:19,610 --> 00:04:26,610 Então, como podemos converter o corda 5 para o inteiro 5? 68 00:04:26,610 --> 00:04:28,930 Alguma ideia? 69 00:04:28,930 --> 00:04:31,630 Sim. 70 00:04:31,630 --> 00:04:36,720 >> Então, se temos 5 como uma string, podemos subtrair 0. 71 00:04:36,720 --> 00:04:37,820 E isso vai nos dar 5. 72 00:04:37,820 --> 00:04:41,670 E da mesma forma, se tivermos 5 como um inteiro, acrescentar que para a seqüência 0. 73 00:04:41,670 --> 00:04:43,112 E isso 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-se de volta para lecionar um onde falamos sobre algoritmos. 77 00:04:52,940 --> 00:04:57,260 Então, como é que vamos realmente quer um computador para fazer coisas interessantes? 78 00:04:57,260 --> 00:05:00,460 Você sabe, só somar e subtrair números e imprimir coisas fora não é 79 00:05:00,460 --> 00:05:01,730 que emocionante. 80 00:05:01,730 --> 00:05:04,620 Normalmente, queremos que o nosso computador para realizar algum tipo de algoritmo. 81 00:05:04,620 --> 00:05:07,820 Algo um pouco mais complexa que apenas aritmética simples. 82 00:05:07,820 --> 00:05:11,930 >> Um algoritmo é apenas um passo a passo conjunto de instruções sobre como realizar 83 00:05:11,930 --> 00:05:14,640 um certo task-- 84 00:05:14,640 --> 00:05:15,660 Assim como uma receita. 85 00:05:15,660 --> 00:05:19,990 Você deve se lembrar do primeiro dia de classe onde David tinha nos contar um quarto 86 00:05:19,990 --> 00:05:22,550 de pessoas e quantas pessoas no quarto. 87 00:05:22,550 --> 00:05:24,480 Você pode ser usado para contagem uma por uma. 88 00:05:24,480 --> 00:05:25,860 1, 2, 3, 4. 89 00:05:25,860 --> 00:05:28,010 Nesse caso, um algoritmo de tempo linear. 90 00:05:28,010 --> 00:05:31,710 >> Mas David introduziu um algoritmo para você contar as pessoas na sala 91 00:05:31,710 --> 00:05:37,340 onde todo mundo se levanta, você diz que seu número para outra pessoa, acrescentar que 92 00:05:37,340 --> 00:05:39,200 número para cima, e uma pessoa se senta. 93 00:05:39,200 --> 00:05:40,410 E você repetir isso. 94 00:05:40,410 --> 00:05:42,910 Isso é um tipo de algoritmo. 95 00:05:42,910 --> 00:05:47,520 Podemos analisar uma forma eficiente algoritmo é baseado no que é tempo de execução. 96 00:05:47,520 --> 00:05:49,680 Mas vamos falar um pouco mais sobre isso mais tarde. 97 00:05:49,680 --> 00:05:52,740 98 00:05:52,740 --> 00:05:57,090 >> Assim, todos os algoritmos também pode ser escritos em pseudocódigo. 99 00:05:57,090 --> 00:06:01,120 Pseudocódigo é apenas um Inglês como sintaxe utilizada para representar 100 00:06:01,120 --> 00:06:02,420 uma linguagem de programação. 101 00:06:02,420 --> 00:06:06,070 Por exemplo, se quiséssemos pedir um usuário adivinhar 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 >> Obter um usuários adivinhar. 104 00:06:09,850 --> 00:06:13,570 Se o palpite estiver correcto, diga-lhes estão corretas, senão dizer-lhes 105 00:06:13,570 --> 00:06:15,560 eles não estão corretos. 106 00:06:15,560 --> 00:06:22,530 Pseudocódigo e é uma forma de facilmente representando uma idéia ou um algoritmo. 107 00:06:22,530 --> 00:06:26,910 Então agora podemos querer realmente escrever isto na linguagem que o computador 108 00:06:26,910 --> 00:06:27,980 pode compreender. 109 00:06:27,980 --> 00:06:35,660 Então, podemos escrever nosso pseudocódigo e interpretar que no código-fonte. 110 00:06:35,660 --> 00:06:41,320 >> Até agora, o código fonte devem aderir para uma determinada sintaxe 111 00:06:41,320 --> 00:06:42,490 uma linguagem de programação. 112 00:06:42,490 --> 00:06:45,430 E até agora, na CS50, temos usado principalmente c. 113 00:06:45,430 --> 00:06:48,320 Portanto, este pode ser o código fonte para c. 114 00:06:48,320 --> 00:06:51,440 Mais tarde no curso, você noite vem em contato com outros programas 115 00:06:51,440 --> 00:06:52,480 linguagens como PHP. 116 00:06:52,480 --> 00:06:57,540 Ou se você ainda tomar outras classes, você pode fazer Java, Python, ou mesmo OCML. 117 00:06:57,540 --> 00:07:01,570 Mas em nossa linguagem de programação C, este é como podemos escrever o código-fonte 118 00:07:01,570 --> 00:07:04,760 o algoritmo que pseudocódigo Eu só descrito anteriormente. 119 00:07:04,760 --> 00:07:08,630 120 00:07:08,630 --> 00:07:11,430 >> Então como é que o computador realmente entender isso? 121 00:07:11,430 --> 00:07:14,490 Como eu disse antes, isso só realmente entende zeros e uns. 122 00:07:14,490 --> 00:07:17,880 Então como é que começa a partir da fonte código para algo que pode ser 123 00:07:17,880 --> 00:07:18,960 compreendidos? 124 00:07:18,960 --> 00:07:22,920 Bem, nós temos algo chamado compilador. 125 00:07:22,920 --> 00:07:28,450 >> Se você se lembrar de volta na maior parte de seu Série de Exercícios, você teve algum tipo de programa 126 00:07:28,450 --> 00:07:30,370 escrito num ficheiro de ponto c. 127 00:07:30,370 --> 00:07:32,550 E então você deve digitar make. 128 00:07:32,550 --> 00:07:35,970 Então, o que é fazer a fazer? 129 00:07:35,970 --> 00:07:39,970 >> Você pode digitar make para compilar seu programa porque someone-- 130 00:07:39,970 --> 00:07:42,730 quem escreveu seu conjunto p; provavelmente David-- 131 00:07:42,730 --> 00:07:44,190 criou um arquivo make. 132 00:07:44,190 --> 00:07:51,320 E que diz fazer saber para executar o seu compilador, chamado clang, que a vontade 133 00:07:51,320 --> 00:07:55,560 em seguida, compilar o código fonte para objeto de código, que é zeros e uns 134 00:07:55,560 --> 00:07:57,720 que o computador entende. 135 00:07:57,720 --> 00:08:01,610 Mas um pouco mais tarde, iremos mais em profundidade sobre compiladores. 136 00:08:01,610 --> 00:08:05,640 137 00:08:05,640 --> 00:08:10,800 >> Então lembro pset 0, onde-- sim, Você tem uma pergunta? 138 00:08:10,800 --> 00:08:11,620 >> AUDIÊNCIA: [inaudível]? 139 00:08:11,620 --> 00:08:12,490 >> COLUNA 1: Sim. 140 00:08:12,490 --> 00:08:14,960 Eu acho que eles realmente deve ser online. 141 00:08:14,960 --> 00:08:15,120 Sim. 142 00:08:15,120 --> 00:08:16,572 >> AUDIÊNCIA: É como o [inaudível]? 143 00:08:16,572 --> 00:08:19,476 144 00:08:19,476 --> 00:08:20,830 >> COLUNA 1: Não é. 145 00:08:20,830 --> 00:08:25,810 O são em cs50.net/quizzes. 146 00:08:25,810 --> 00:08:32,900 >> AUDIÊNCIA: quizzes Slash, barra de 2013, reduzir 0, e só clicar 147 00:08:32,900 --> 00:08:35,956 quizzes 2013 e teste 0, rever os slides da seção. 148 00:08:35,956 --> 00:08:40,380 >> COLUNA 1: Sim, por isso, se vocês querem arrancá-la e analisá-la em seu 149 00:08:40,380 --> 00:08:42,740 próprio computador, tudo bem também. 150 00:08:42,740 --> 00:08:43,130 Diga isso de novo. 151 00:08:43,130 --> 00:08:44,546 >> AUDIÊNCIA: [inaudível]. 152 00:08:44,546 --> 00:08:48,780 >> COLUNA 1: Sim, [inaudível] é a variável dummy. 153 00:08:48,780 --> 00:08:49,644 Ah, sim? 154 00:08:49,644 --> 00:08:51,372 >> AUDIÊNCIA: [inaudível]? 155 00:08:51,372 --> 00:08:54,300 >> Palestra 1: Não, greves não estão no exame. 156 00:08:54,300 --> 00:08:55,950 Desculpe, sua pergunta foi, foi greves no exame. 157 00:08:55,950 --> 00:08:59,530 E não é. 158 00:08:59,530 --> 00:09:05,780 Então pset 0, vocês devem ter tudo implementado algo usando zero. 159 00:09:05,780 --> 00:09:13,100 E aprendemos alguma programação básica blocos de construção que utilizam zero. 160 00:09:13,100 --> 00:09:15,590 >> Então, vamos dar uma olhada em alguns destes blocos de construção 161 00:09:15,590 --> 00:09:18,170 que compõem um programa. 162 00:09:18,170 --> 00:09:20,570 A primeira é a expressão booleana. 163 00:09:20,570 --> 00:09:24,540 As expressões booleanas são queridos e 0s ou qualquer coisa que tem 164 00:09:24,540 --> 00:09:25,700 dois valores possíveis. 165 00:09:25,700 --> 00:09:30,320 Neste caso, verdadeiras ou falsas, ligado ou desligado, e sim ou não. 166 00:09:30,320 --> 00:09:35,390 Um exemplo de um método simples, muito simples, programa que usa um valor booleano 167 00:09:35,390 --> 00:09:39,140 expressão aqui. 168 00:09:39,140 --> 00:09:43,220 >> Então, para expressões booleanas para ser útil, temos operadores booleanos. 169 00:09:43,220 --> 00:09:48,920 Estes são os operadores que podem ser utilizados para comparar os valores determinados. 170 00:09:48,920 --> 00:09:52,820 Então, temos ou não e igual, menos ou igual a, ou maior do 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 Mas estes operadores não são muito úteis a menos que possamos combiná-los em 173 00:09:59,060 --> 00:10:00,320 condições. 174 00:10:00,320 --> 00:10:04,370 >> Então vocês podem se lembrar do zero e para o seu p define que 175 00:10:04,370 --> 00:10:05,400 tinha condições. 176 00:10:05,400 --> 00:10:09,710 Eles são, essencialmente, como garfos a lógica do seu programa que 177 00:10:09,710 --> 00:10:12,670 executa consoante uma condição for atendida. 178 00:10:12,670 --> 00:10:18,150 Portanto, uma das condições que tínhamos usado muitas vezes neste curso é a 179 00:10:18,150 --> 00:10:21,470 se, então, se, e as condições de outra pessoa. 180 00:10:21,470 --> 00:10:24,060 >> Aqui está um exemplo de como você pode usar isso. 181 00:10:24,060 --> 00:10:28,430 Alguém sabe a diferença entre apenas usando if todos 182 00:10:28,430 --> 00:10:32,530 o caminho versos if, else, se, e outra coisa combinada? 183 00:10:32,530 --> 00:10:33,013 Sim? 184 00:10:33,013 --> 00:10:34,263 >> AUDIÊNCIA: [inaudível]. 185 00:10:34,263 --> 00:10:40,741 186 00:10:40,741 --> 00:10:42,160 >> COLUNA 1: Exatamente. 187 00:10:42,160 --> 00:10:50,210 Então, se eu tivesse se todo o caminho até este forma, mesmo se essa condição retorna 188 00:10:50,210 --> 00:10:52,800 verdade, ele ainda vai continuar testar os dois seguintes. 189 00:10:52,800 --> 00:11:00,120 Considerando que, com um-se mais, uma outra declaração, se o que retorna true, 190 00:11:00,120 --> 00:11:02,640 os outros não são testados. 191 00:11:02,640 --> 00:11:05,955 Qualquer dúvida sobre isso? 192 00:11:05,955 --> 00:11:06,890 Legal. 193 00:11:06,890 --> 00:11:12,240 >> Então você usa um else if-de uma outra pessoa declaração, se você sabe que ele só pode 194 00:11:12,240 --> 00:11:14,470 ser um desses casos. 195 00:11:14,470 --> 00:11:21,550 Então, nós sabemos, se x é menor que 0, é definitivamente não vai ser 196 00:11:21,550 --> 00:11:22,890 maior do que 0. 197 00:11:22,890 --> 00:11:26,940 198 00:11:26,940 --> 00:11:31,480 >> Em seguida, um outro bloco de construção que aprendemos são loops. 199 00:11:31,480 --> 00:11:33,310 Temos três tipos de loops. 200 00:11:33,310 --> 00:11:35,830 Para loops, while, e fazer enquanto loops. 201 00:11:35,830 --> 00:11:38,730 E geralmente, quando você se senta para escrever algo, você tem que decidir 202 00:11:38,730 --> 00:11:40,060 qual dos três você quer usar. 203 00:11:40,060 --> 00:11:41,900 Então, como vamos decidir qual deles? 204 00:11:41,900 --> 00:11:44,920 205 00:11:44,920 --> 00:11:48,790 >> Geralmente usamos um loop for, se soubermos quantas vezes queremos fazer uma iteração 206 00:11:48,790 --> 00:11:53,650 por algo ou quantas vezes queremos executar uma tarefa. 207 00:11:53,650 --> 00:11:58,830 Nós usamos loops while se precisamos de alguma condição para ser verdade para continuar correndo. 208 00:11:58,830 --> 00:12:03,730 E usamos fazer enquanto muito semelhante ao tempo, mas nós queremos que nosso código seja executado em 209 00:12:03,730 --> 00:12:04,880 pelo menos uma vez. 210 00:12:04,880 --> 00:12:09,410 >> Então fazer enquanto, o que está no fazer a vontade sempre executado pelo menos uma vez. 211 00:12:09,410 --> 00:12:13,120 Considerando que, com o tempo, ele pode não funcionar em todos, se o 212 00:12:13,120 --> 00:12:15,490 condição não for satisfeita. 213 00:12:15,490 --> 00:12:16,740 Qualquer dúvida com isso? 214 00:12:16,740 --> 00:12:20,480 215 00:12:20,480 --> 00:12:22,860 >> Assim, a estrutura de um loop for. 216 00:12:22,860 --> 00:12:23,620 Vocês já devem ter visto isso. 217 00:12:23,620 --> 00:12:25,320 Você inicializa-lo. 218 00:12:25,320 --> 00:12:26,600 Você tem algum tipo de condição. 219 00:12:26,600 --> 00:12:32,340 Assim, por exemplo, podemos inicializar como para i é igual a 0. 220 00:12:32,340 --> 00:12:34,040 i é menos do que 10. 221 00:12:34,040 --> 00:12:35,442 E i ++. 222 00:12:35,442 --> 00:12:39,010 Uma muito simples que nós fizemos. 223 00:12:39,010 --> 00:12:42,210 >> Para um loop while, da mesma forma, você tem ter algum tipo de inicialização, 224 00:12:42,210 --> 00:12:44,980 algum tipo de condição, e algum tipo de atualização. 225 00:12:44,980 --> 00:12:51,990 Assim, podemos implementar o nosso laço for também como um loop while usando isso. 226 00:12:51,990 --> 00:12:56,000 E da mesma forma com um loop Do While, poderíamos ter alguma inicialização, 227 00:12:56,000 --> 00:12:58,640 executar algo, atualizá-lo e em seguida, verificar a condição. 228 00:12:58,640 --> 00:13:03,500 229 00:13:03,500 --> 00:13:05,140 >> Então agora funções. 230 00:13:05,140 --> 00:13:06,460 Nós colocamos tudo junto. 231 00:13:06,460 --> 00:13:10,140 Podemos querer escrever alguns tipo de função. 232 00:13:10,140 --> 00:13:12,790 Função comuns que você pode Já vimos é o principal. 233 00:13:12,790 --> 00:13:13,770 Principal é uma função. 234 00:13:13,770 --> 00:13:16,160 Ele tem um tipo de retorno, int. 235 00:13:16,160 --> 00:13:18,470 Ele tem um nome de função, a principal. 236 00:13:18,470 --> 00:13:20,810 E tem argumentos, argc e argv. 237 00:13:20,810 --> 00:13:24,040 Então principal é apenas uma função. 238 00:13:24,040 --> 00:13:27,230 >> Outras funções que você poderia ter usado, printf printf-- é um function-- 239 00:13:27,230 --> 00:13:29,330 GetInt, toupper. 240 00:13:29,330 --> 00:13:32,010 Mas estes acontecer de ter sido implementado por nós 241 00:13:32,010 --> 00:13:33,270 algum tipo de biblioteca. 242 00:13:33,270 --> 00:13:37,400 Se vocês lembram, incluindo esta biblioteca ou a CS50.h 243 00:13:37,400 --> 00:13:38,510 E / S padrão da biblioteca. 244 00:13:38,510 --> 00:13:39,200 Sim, questionar? 245 00:13:39,200 --> 00:13:41,610 >> AUDIÊNCIA: É principal apenas inerente c? 246 00:13:41,610 --> 00:13:44,740 Será que apenas uma espécie de [inaudível]? 247 00:13:44,740 --> 00:13:47,370 >> COLUNA 1: A questão é se principal é inerente em c. 248 00:13:47,370 --> 00:13:51,460 E sim, todas as funções têm uma função principal. 249 00:13:51,460 --> 00:13:55,290 É uma espécie de necessário para o computador para saber por onde começar 250 00:13:55,290 --> 00:13:55,993 execução do código. 251 00:13:55,993 --> 00:13:58,108 >> AUDIÊNCIA: Então você não iria [inaudível]? 252 00:13:58,108 --> 00:13:59,480 >> COLUNA 1: No. 253 00:13:59,480 --> 00:14:00,760 Alguma outra pergunta? 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ão, assim como você pode usar uma função que está escrito para você, você também pode 257 00:14:08,050 --> 00:14:10,380 escrever sua própria função. 258 00:14:10,380 --> 00:14:17,050 Esta é uma função que alguém pode Escrevi 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 Há um tipo de retorno aqui, neste caso int, nossa q nome da função e nosso 262 00:14:29,500 --> 00:14:31,360 lista de parâmetros. 263 00:14:31,360 --> 00:14:34,550 >> E note que você tem que escrever os dados tipo do parâmetro que você deseja 264 00:14:34,550 --> 00:14:38,660 ou então utilizar a função não faz saber que tipo de 265 00:14:38,660 --> 00:14:41,650 parâmetro que deve ser aceita. 266 00:14:41,650 --> 00:14:48,110 Então, neste caso, nós queremos um número inteiro como o nosso contributo. 267 00:14:48,110 --> 00:14:50,390 Então, por que poderíamos querer usar funções? 268 00:14:50,390 --> 00:14:52,800 >> Primeiro de tudo, ótimo para organização. 269 00:14:52,800 --> 00:14:56,350 Eles ajudam a quebrar o seu código em pedaços mais organizado e fazer 270 00:14:56,350 --> 00:14:57,960 mais fácil de ler. 271 00:14:57,960 --> 00:14:59,760 Simplificação. 272 00:14:59,760 --> 00:15:01,740 Isso é bom para o projeto. 273 00:15:01,740 --> 00:15:04,570 Quando você está lendo um pedaço de código ea função principal é, realmente, 274 00:15:04,570 --> 00:15:07,750 muito longo, pode ser mais difícil de raciocinar sobre o que está acontecendo. 275 00:15:07,750 --> 00:15:11,710 Então, se você dividi-la em funções, pode ser mais fácil de ler. 276 00:15:11,710 --> 00:15:12,750 E reutilizá-capacidade. 277 00:15:12,750 --> 00:15:16,940 Se você tem um pedaço de código que está sendo chamado ou executado várias vezes, 278 00:15:16,940 --> 00:15:20,690 em vez de reescrever esse código 10 vezes na sua função principal, que você pode 279 00:15:20,690 --> 00:15:21,440 quer reutilizá-lo. 280 00:15:21,440 --> 00:15:25,740 E então, toda vez que você precisa para usá- pedaço de código, chamar a função. 281 00:15:25,740 --> 00:15:30,550 282 00:15:30,550 --> 00:15:35,380 >> Então, agora, se nos lembrarmos de volta para zero, nós também falou sobre alguns conceitos, 283 00:15:35,380 --> 00:15:37,680 uma das quais é uma rosca. 284 00:15:37,680 --> 00:15:41,120 Tópico é o conceito de múltiplo seqüências de código 285 00:15:41,120 --> 00:15:43,040 executando ao mesmo tempo. 286 00:15:43,040 --> 00:15:47,490 Então, acho que volta para um dia em que David tinha vocês contarem o número de 287 00:15:47,490 --> 00:15:48,440 pessoas na sala. 288 00:15:48,440 --> 00:15:50,550 >> Essencialmente, o que estava acontecendo é sobre todos vocês foram 289 00:15:50,550 --> 00:15:52,370 executando segmentos separados. 290 00:15:52,370 --> 00:15:55,540 E esses tópicos foram se reunindo para obter algum tipo de resposta. 291 00:15:55,540 --> 00:15:58,890 Da mesma forma, em risco, quando você tem vários sprites, você pode 292 00:15:58,890 --> 00:16:01,070 tenho um gato e um cachorro. 293 00:16:01,070 --> 00:16:08,770 E eles seriam simultaneamente executando seus próprios scripts. 294 00:16:08,770 --> 00:16:10,020 Isso é um exemplo de segmentação. 295 00:16:10,020 --> 00:16:12,860 296 00:16:12,860 --> 00:16:18,000 >> E o outro conceito que foi foi introduzido em zero eventos. 297 00:16:18,000 --> 00:16:22,550 E os eventos são quando várias partes do seu código de comunicar uns com os outros. 298 00:16:22,550 --> 00:16:26,840 No início, essa foi quando você usou o controle da transmissão e da Quando eu 299 00:16:26,840 --> 00:16:29,500 Receba blocos. 300 00:16:29,500 --> 00:16:35,170 >> E também, no Conjunto de Problemas 4, vimos um pouco de eventos também. 301 00:16:35,170 --> 00:16:38,250 Vocês poderiam ter usado a biblioteca Gevent. 302 00:16:38,250 --> 00:16:42,450 E não era uma função waitForClick em que você estava esperando 303 00:16:42,450 --> 00:16:44,300 para que o usuário clique. 304 00:16:44,300 --> 00:16:47,870 E o seu clique, neste caso, seria o evento e esperar por clique é 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 também, ao longo de executar seus Série de Exercícios e trabalhar em suas Série de Exercícios, você 308 00:16:58,630 --> 00:17:01,920 pode ter entrado em contato com alguns desses comandos. 309 00:17:01,920 --> 00:17:05,579 Isto é o que você digitou em seu janela de terminal ou o que quer que a janela 310 00:17:05,579 --> 00:17:12,119 que aparece em sua edição para g, essencialmente, navegar no seu computador. 311 00:17:12,119 --> 00:17:19,440 >> Assim, por exemplo, LS lista o conteúdo de um diretório. 312 00:17:19,440 --> 00:17:22,510 Faça diretório cria uma nova pasta. 313 00:17:22,510 --> 00:17:24,819 CD, altere o diretório. 314 00:17:24,819 --> 00:17:28,400 RM, remover, excluir um arquivo ou algum diretório. 315 00:17:28,400 --> 00:17:31,050 E, em seguida, remover o diretório remove um diretório. 316 00:17:31,050 --> 00:17:32,300 >> AUDIÊNCIA: [inaudível]? 317 00:17:32,300 --> 00:17:36,978 318 00:17:36,978 --> 00:17:38,370 >> COLUNA 1: Sim, com certeza. 319 00:17:38,370 --> 00:17:42,530 320 00:17:42,530 --> 00:17:46,040 Desculpe, a pergunta era se sugiro colocar este 321 00:17:46,040 --> 00:17:48,840 sobre a folha de fraude. 322 00:17:48,840 --> 00:17:49,440 Poderia ajudar. 323 00:17:49,440 --> 00:17:51,490 Se você tiver espaço, você pode colocá-lo. 324 00:17:51,490 --> 00:17:56,170 Também é apenas geralmente bom o suficiente de lembrar, porque quando você usá-lo 325 00:17:56,170 --> 00:17:59,060 você pode querer apenas ter memorizado. 326 00:17:59,060 --> 00:18:02,750 Isso vai tornar sua vida muito mais fácil. 327 00:18:02,750 --> 00:18:04,000 Será que eu responder a sua pergunta? 328 00:18:04,000 --> 00:18:10,528 329 00:18:10,528 --> 00:18:14,290 >> Então, agora, nós conversamos um pouco brevemente sobre bibliotecas. 330 00:18:14,290 --> 00:18:18,570 Mas as duas principais que temos sido usando até agora no curso são 331 00:18:18,570 --> 00:18:20,860 padrão I / O e CS50. 332 00:18:20,860 --> 00:18:25,410 Que tipo de coisas estão incluídas na biblioteca padrão I / O? 333 00:18:25,410 --> 00:18:28,410 >> Sim, até agora nós usamos printf. 334 00:18:28,410 --> 00:18:31,150 Em CS50, usamos GetInt e GetString. 335 00:18:31,150 --> 00:18:37,200 E a seqüência de tipo de dados também acontece a ser declarado nesta biblioteca CS50. 336 00:18:37,200 --> 00:18:40,250 Vamos falar um pouco mais em profundidade sobre como as bibliotecas funcionam e como eles 337 00:18:40,250 --> 00:18:41,870 interagir com o resto do seu código. 338 00:18:41,870 --> 00:18:46,220 Mas essas são as duas principais que ter entrado em contacto com a medida em 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 são bons para lembrar o quanto cada tipo está representado por ou como 342 00:18:58,120 --> 00:19:02,840 muitos bytes cada tipo de requires-- 343 00:19:02,840 --> 00:19:04,990 int, 4 bytes; char, um byte. 344 00:19:04,990 --> 00:19:06,550 Float é de 4 bytes. 345 00:19:06,550 --> 00:19:07,782 O que é um casal? 346 00:19:07,782 --> 00:19:09,032 >> AUDIÊNCIA: [inaudível]. 347 00:19:09,032 --> 00:19:11,398 348 00:19:11,398 --> 00:19:16,240 >> COLUNA 1: É, portanto, um flutuador mas o dobro do tamanho. 349 00:19:16,240 --> 00:19:17,150 Que tal um tempo? 350 00:19:17,150 --> 00:19:18,400 >> AUDIÊNCIA: [inaudível]. 351 00:19:18,400 --> 00:19:21,614 352 00:19:21,614 --> 00:19:24,680 >> COLUNA 1: OK. 353 00:19:24,680 --> 00:19:25,410 O que é um tempo? 354 00:19:25,410 --> 00:19:26,660 >> AUDIÊNCIA: [inaudível]. 355 00:19:26,660 --> 00:19:29,400 356 00:19:29,400 --> 00:19:31,450 >> COLUNA 1: Sim, o dobro de um int. 357 00:19:31,450 --> 00:19:34,240 358 00:19:34,240 --> 00:19:34,705 Sim. 359 00:19:34,705 --> 00:19:36,100 >> AUDIÊNCIA: [inaudível]. 360 00:19:36,100 --> 00:19:38,030 >> COLUNA 1: Long [inaudível]. 361 00:19:38,030 --> 00:19:41,860 E depois de um longo tempo é o dobro disso. 362 00:19:41,860 --> 00:19:42,814 >> AUDIÊNCIA: Não, não. 363 00:19:42,814 --> 00:19:47,107 Uma longa é apenas um int. 364 00:19:47,107 --> 00:19:50,910 Depende da arquitetura antes que o [inaudível] 365 00:19:50,910 --> 00:19:52,922 int e têm o mesmo tamanho. 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 >> COLUNA 1: Então, um longo e um int são os mesmos. 369 00:20:00,920 --> 00:20:02,943 E depois de um longo tempo é o dobro do int. 370 00:20:02,943 --> 00:20:03,910 Legal. 371 00:20:03,910 --> 00:20:05,550 E então, qual é o último tipo? 372 00:20:05,550 --> 00:20:06,510 >> AUDIÊNCIA: Pointer. 373 00:20:06,510 --> 00:20:10,350 >> COLUNA 1: Sim, por isso, aprendemos um pouco sobre ponteiros. 374 00:20:10,350 --> 00:20:14,015 E, independentemente do que um ponteiro é apontando para-- poderia ser uma estrela de char 375 00:20:14,015 --> 00:20:15,880 ou um int star-- 376 00:20:15,880 --> 00:20:20,530 é sempre 4 bytes para um ponteiro. 377 00:20:20,530 --> 00:20:21,633 Perguntas sobre isso? 378 00:20:21,633 --> 00:20:22,116 Sim? 379 00:20:22,116 --> 00:20:24,531 >> AUDIÊNCIA: [inaudível]? 380 00:20:24,531 --> 00:20:29,530 >> COLUNA 1: Então, um longo e um int são o mesmo neste aparelho CS50. 381 00:20:29,530 --> 00:20:32,302 >> AUDIÊNCIA: O aparelho está completamente permutáveis. 382 00:20:32,302 --> 00:20:33,510 >> COLUNA 1: Yeah. 383 00:20:33,510 --> 00:20:36,610 Então, depois um longo tempo é o dobro de um int. 384 00:20:36,610 --> 00:20:39,250 >> AUDIÊNCIA: Este é o 32 bits? 385 00:20:39,250 --> 00:20:40,620 >> COLUNA 1: 32 bit, sim. 386 00:20:40,620 --> 00:20:43,572 >> AUDIÊNCIA: Então, [inaudível]? 387 00:20:43,572 --> 00:20:46,790 >> COLUNA 1: Sim, se isso não acontecer explicitamente dizer, você 388 00:20:46,790 --> 00:20:47,870 deve assumir um pouco 32. 389 00:20:47,870 --> 00:20:50,040 >> AUDIÊNCIA: Ele diria algo como assumindo um 390 00:20:50,040 --> 00:20:51,498 Arquitectura como o aparelho. 391 00:20:51,498 --> 00:20:58,800 392 00:20:58,800 --> 00:21:01,710 Para 64 bits, as únicas coisas que mudança são longos e ponteiros. 393 00:21:01,710 --> 00:21:05,614 Ambos [inaudível]. 394 00:21:05,614 --> 00:21:06,590 >> COLUNA 1: Sim? 395 00:21:06,590 --> 00:21:07,566 >> AUDIÊNCIA: Pergunta. 396 00:21:07,566 --> 00:21:10,982 Assim, em um dos testes práticos, ele pergunta sobre um unsigned int. 397 00:21:10,982 --> 00:21:15,374 Então, como isso seria determinado a partir de um int [inaudível]? 398 00:21:15,374 --> 00:21:18,140 >> COLUNA 1: Um unsigned em também é 4 bytes. 399 00:21:18,140 --> 00:21:21,172 Mas o que é diferente sobre a assinatura int e um unsigned int? 400 00:21:21,172 --> 00:21:22,422 >> AUDIÊNCIA: [inaudível]. 401 00:21:22,422 --> 00:21:24,868 402 00:21:24,868 --> 00:21:25,630 >> COLUNA 1: Certo. 403 00:21:25,630 --> 00:21:27,570 Pode-se representar os valores negativos. 404 00:21:27,570 --> 00:21:28,580 Mas como fazer isso? 405 00:21:28,580 --> 00:21:30,536 >> AUDIÊNCIA: [inaudível]. 406 00:21:30,536 --> 00:21:36,370 >> COLUNA 1: Sim, ele salva um bit para representar o sinal. 407 00:21:36,370 --> 00:21:40,910 408 00:21:40,910 --> 00:21:45,040 A assinatura tem um pouco que representa o sinal. 409 00:21:45,040 --> 00:21:48,886 E não assinado apenas é todos os aspectos positivos. 410 00:21:48,886 --> 00:21:50,365 >> AUDIÊNCIA: OK. 411 00:21:50,365 --> 00:21:54,230 Então você diz que a dupla é duas vezes o tamanho de um flutuador? 412 00:21:54,230 --> 00:21:58,202 >> COLUNA 1: Dupla é duas vezes o tamanho de um flutuador, sim. 413 00:21:58,202 --> 00:22:01,639 >> AUDIÊNCIA: Como é que um ponteiro para um longo [inaudível]? 414 00:22:01,639 --> 00:22:06,058 415 00:22:06,058 --> 00:22:10,870 >> COLUNA 1: Então a questão é como é que o ponteiro para uma longa long-- 416 00:22:10,870 --> 00:22:13,800 como é que apenas quatro bytes quando um longo seus 8 bytes. 417 00:22:13,800 --> 00:22:17,310 Então lembre-se que é um ponteiro, essencialmente, pelo valor muito base. 418 00:22:17,310 --> 00:22:19,046 >> AUDIÊNCIA: [inaudível]. 419 00:22:19,046 --> 00:22:22,670 >> COLUNA 1: Sim, então um ponteiro é apenas um local de memória. 420 00:22:22,670 --> 00:22:28,040 Por isso, não importa o quanto de espaço esse ponteiro está apontando. 421 00:22:28,040 --> 00:22:32,060 Ele só precisa de 4 bytes para acompanhar de que a localização de memória. 422 00:22:32,060 --> 00:22:34,760 423 00:22:34,760 --> 00:22:36,010 Alguma outra pergunta? 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 >> Assim, a última coisa que eu tenho é a saída padrão. 428 00:22:47,460 --> 00:22:51,020 Você deve usá-los com freqüência o suficiente para que você possa lembrar. 429 00:22:51,020 --> 00:22:54,800 Mas isso é quando usamos printf, por exemplo. 430 00:22:54,800 --> 00:22:59,260 E nós temos esses espaços reservados que foram chamados códigos de formato. 431 00:22:59,260 --> 00:23:03,910 >> Então por cento c char, i por cento para int, e também podemos usar por cento d. 432 00:23:03,910 --> 00:23:05,130 É a mesma coisa. 433 00:23:05,130 --> 00:23:08,200 Mas, em geral, em que CS50 tente usar por cento i. 434 00:23:08,200 --> 00:23:09,860 Porcentagem f para float. 435 00:23:09,860 --> 00:23:15,620 Ld por cento por muito tempo e por cento s para string. 436 00:23:15,620 --> 00:23:18,550 >> Da mesma forma, temos vindo a utilizar alguns dessas seqüências de escape. 437 00:23:18,550 --> 00:23:22,431 Por exemplo, barra invertida n para nova linha. 438 00:23:22,431 --> 00:23:26,910 Este é apenas para quando você está formatando seu código para impressão f. 439 00:23:26,910 --> 00:23:27,260 Sim? 440 00:23:27,260 --> 00:23:28,906 >> AUDIÊNCIA: Qual é a percentagem de d? 441 00:23:28,906 --> 00:23:31,850 >> COLUNA 1: Então a questão é o que é por cento d para? 442 00:23:31,850 --> 00:23:33,270 Porcentagem d é para ints. 443 00:23:33,270 --> 00:23:37,392 Porcentagem d e i por cento são os mesmos. 444 00:23:37,392 --> 00:23:41,130 >> AUDIÊNCIA: Qual é a diferença entre barra invertida n e barra invertida r? 445 00:23:41,130 --> 00:23:45,300 >> COLUNA 1: Então a questão é, qual é o diferença entre o n e a folga 446 00:23:45,300 --> 00:23:48,615 r reação? 447 00:23:48,615 --> 00:23:50,906 Acho barra invertida r é-- 448 00:23:50,906 --> 00:23:54,340 >> AUDIÊNCIA: Então barra invertida r apenas implica retorna ao início da linha 449 00:23:54,340 --> 00:23:56,670 sem realmente ir para uma nova linha. 450 00:23:56,670 --> 00:24:01,000 Então, se você imprimir uma barra invertida r e você voltar para o início da linha 451 00:24:01,000 --> 00:24:04,005 em seguida, imprimir mais coisas, você sobrescrever o material que já está no 452 00:24:04,005 --> 00:24:04,390 [Inaudível]. 453 00:24:04,390 --> 00:24:06,725 Considerando que, na verdade, n vai para uma nova linha e vai para o [inaudível]. 454 00:24:06,725 --> 00:24:10,525 455 00:24:10,525 --> 00:24:13,915 >> COLUNA 1: Bem, alguma pergunta? 456 00:24:13,915 --> 00:24:15,430 Tudo certo. 457 00:24:15,430 --> 00:24:18,617 Vou entregá-lo 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: Tudo bem. 461 00:25:09,720 --> 00:25:18,590 Então, eu vou estar falando de outro grande gama de idéias da classe que são 462 00:25:18,590 --> 00:25:23,220 aproximadamente representante de duas semanas e o início da terceira semana começando 463 00:25:23,220 --> 00:25:28,690 com fundição, que é apenas uma forma de tratamento de um valor de um determinado tipo, como 464 00:25:28,690 --> 00:25:30,830 um valor de um tipo diferente. 465 00:25:30,830 --> 00:25:34,110 Assim, podemos fazer isso com caracteres para ints, carros alegóricos para ints e 466 00:25:34,110 --> 00:25:35,360 longs longos para o dobro. 467 00:25:35,360 --> 00:25:38,170 468 00:25:38,170 --> 00:25:44,500 >> Todas estas coisas podem ser utilizadas como formas para o tratamento de algum valor numérico 469 00:25:44,500 --> 00:25:48,370 menos de char como algum outro valor numérico. 470 00:25:48,370 --> 00:25:54,480 Portanto, há algumas questões com este, de Claro, o que acontece quando você joga 471 00:25:54,480 --> 00:25:57,860 coisas como bóia para ints. 472 00:25:57,860 --> 00:26:00,500 Então, isso é um pouco estranho. 473 00:26:00,500 --> 00:26:03,170 Temos um carro que é de 1,31. 474 00:26:03,170 --> 00:26:05,220 Nós multiplicá-lo por 10 mil. 475 00:26:05,220 --> 00:26:08,380 E, então, imprimi-lo como um int. 476 00:26:08,380 --> 00:26:09,630 O que é que esta saída? 477 00:26:09,630 --> 00:26:11,600 478 00:26:11,600 --> 00:26:14,020 10.000 vezes 1,31. 479 00:26:14,020 --> 00:26:18,761 Assim 13000, que é a estimativa? 480 00:26:18,761 --> 00:26:20,685 >> AUDIÊNCIA: Eu acho que é 10.000. 481 00:26:20,685 --> 00:26:24,234 >> DAN: Então, eu estou multiplicando-o por 10.000 antes que eu estou lançando-lo. 482 00:26:24,234 --> 00:26:25,202 >> AUDIÊNCIA: Oh. 483 00:26:25,202 --> 00:26:27,622 Não haveria um 9 e alguns números de 0? 484 00:26:27,622 --> 00:26:29,270 >> DAN: Você pode ter alguns dígitos estranhos. 485 00:26:29,270 --> 00:26:32,410 486 00:26:32,410 --> 00:26:37,670 Tão certo, que é 1,3 vezes 10.000. 487 00:26:37,670 --> 00:26:40,040 Então é 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 Obrigado, 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 é simplesmente porque este elenco acabou arredondamento onde 495 00:26:53,860 --> 00:26:55,394 ele não deve ter. 496 00:26:55,394 --> 00:26:55,871 Sim. 497 00:26:55,871 --> 00:26:58,256 >> AUDIÊNCIA: O casting acontece depois de mais alguma coisa? 498 00:26:58,256 --> 00:27:03,865 >> DAN: Então porque eu tenho isso por escrito, que faz isso antes de multiplicação 499 00:27:03,865 --> 00:27:05,230 faz isso casting. 500 00:27:05,230 --> 00:27:06,140 >> AUDIÊNCIA: [inaudível]. 501 00:27:06,140 --> 00:27:11,350 >> DAN: Eu acho que seria lançado em primeiro lugar, sim, o que seria 10.000. 502 00:27:11,350 --> 00:27:12,610 Algo mais? 503 00:27:12,610 --> 00:27:13,330 Legal. 504 00:27:13,330 --> 00:27:16,344 Portanto, esta é 13.099. 505 00:27:16,344 --> 00:27:17,840 Por que isso acontece? 506 00:27:17,840 --> 00:27:18,900 A imprecisão. 507 00:27:18,900 --> 00:27:21,020 >> Carros alegóricos não são perfeitos. 508 00:27:21,020 --> 00:27:27,550 Eles só podem representar números a um certo número de algarismos significativos. 509 00:27:27,550 --> 00:27:35,120 Então, se nós imprimir 8 figos sig em este float, temos uma espécie de 510 00:27:35,120 --> 00:27:36,800 número olhando feio. 511 00:27:36,800 --> 00:27:45,580 E isso é porque 1,31 não pode com precisão ser representados por simples 512 00:27:45,580 --> 00:27:49,000 potências de dois na máquina. 513 00:27:49,000 --> 00:27:53,530 Por isso, acaba tendo o mais próximo acho que, o que acaba 514 00:27:53,530 --> 00:27:55,710 ser um pouco baixa. 515 00:27:55,710 --> 00:27:57,730 Faz sentido? 516 00:27:57,730 --> 00:27:59,110 Está bem. 517 00:27:59,110 --> 00:28:05,840 >> Agora, mudou são uma forma diferente de fazendo declarações condicionais em que todos os 518 00:28:05,840 --> 00:28:09,900 que nos interessa é a única variável. 519 00:28:09,900 --> 00:28:16,570 Portanto, neste exemplo particular, estamos recebendo um número inteiro do usuário. 520 00:28:16,570 --> 00:28:21,070 E então, nós estamos olhando para o que esse inteiro é. 521 00:28:21,070 --> 00:28:23,500 Presumivelmente, ele é o número entre um e quatro. 522 00:28:23,500 --> 00:28:24,800 Isso é o que estamos pedindo. 523 00:28:24,800 --> 00:28:28,450 >> Então você faz uma mudança de o nome da variável. 524 00:28:28,450 --> 00:28:34,290 Em seguida, você configura os casos de possível valores que poderia ser. 525 00:28:34,290 --> 00:28:37,730 Então caso de um, digo que é baixa. 526 00:28:37,730 --> 00:28:41,080 E então você quebra para sair da condição chave para que 527 00:28:41,080 --> 00:28:43,270 você não continuar. 528 00:28:43,270 --> 00:28:44,830 >> Na próxima caso-- 529 00:28:44,830 --> 00:28:46,940 assim caso dois e caso três-- 530 00:28:46,940 --> 00:28:51,920 se for caso dois apenas cai para a primeira linha de código que vê como com 531 00:28:51,920 --> 00:28:55,400 caso, três, até que vê uma pausa. 532 00:28:55,400 --> 00:29:00,430 Portanto, a razão que você começa um caso para só impressão baixo é porque eu 533 00:29:00,430 --> 00:29:01,890 ter essa pausa aqui. 534 00:29:01,890 --> 00:29:05,360 Se eu, por exemplo, ignorou essa break-- se eu joguei este breakaway-- 535 00:29:05,360 --> 00:29:09,740 seria imprimir baixa, e então seria imprimir meio, e, em seguida, ele iria quebrar. 536 00:29:09,740 --> 00:29:12,200 >> Então breaks são uma parte importante de mudar as condições e 537 00:29:12,200 --> 00:29:14,340 eles devem estar lá. 538 00:29:14,340 --> 00:29:20,070 Os casos que não sejam reconhecidos explicitamente são tratados pelo padrão 539 00:29:20,070 --> 00:29:26,645 caso no interruptor e deve ser lançado. 540 00:29:26,645 --> 00:29:31,363 >> AUDIÊNCIA: So 1, 2, 3, e 4 seriam 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 Sim. 543 00:29:34,654 --> 00:29:35,146 Sim? 544 00:29:35,146 --> 00:29:37,606 >> AUDIÊNCIA: Então, quando você tem que [inaudível]? 545 00:29:37,606 --> 00:29:44,002 546 00:29:44,002 --> 00:29:46,830 >> DAN: Você iria imprimir baixo, e em seguida seria imprimir meio, e 547 00:29:46,830 --> 00:29:47,400 em seguida, ele iria quebrar. 548 00:29:47,400 --> 00:29:50,244 >> AUDIÊNCIA: Por que ele iria imprimir meio que [inaudível]? 549 00:29:50,244 --> 00:29:54,036 550 00:29:54,036 --> 00:30:00,550 >> DAN: Então, tudo sob um caso antes de uma pausa se enquadra. 551 00:30:00,550 --> 00:30:09,390 Assim, caso uma impressão é caso sob um tal como a presente na sequência de impressão. 552 00:30:09,390 --> 00:30:09,890 Sim? 553 00:30:09,890 --> 00:30:11,140 >> AUDIÊNCIA: [inaudível]? 554 00:30:11,140 --> 00:30:15,890 555 00:30:15,890 --> 00:30:22,170 >> DAN: Então esse número é apenas uma especial valor que esta variável 556 00:30:22,170 --> 00:30:23,420 pode tomar, certo? 557 00:30:23,420 --> 00:30:26,740 558 00:30:26,740 --> 00:30:28,490 Será que isso faz sentido? 559 00:30:28,490 --> 00:30:28,990 Sim. 560 00:30:28,990 --> 00:30:31,490 >> AUDIÊNCIA: [inaudível]? 561 00:30:31,490 --> 00:30:34,130 >> DAN: Sim, caso dois iria imprimir meio e, em seguida, romper. 562 00:30:34,130 --> 00:30:35,380 >> AUDIÊNCIA: [inaudível]? 563 00:30:35,380 --> 00:30:37,954 564 00:30:37,954 --> 00:30:40,050 >> DAN: Eu acho que qualquer? 565 00:30:40,050 --> 00:30:43,855 Que outros tipos de dados você pode passar? 566 00:30:43,855 --> 00:30:46,320 >> AUDIÊNCIA: Você pode alternar sobre quaisquer tipos de dados. 567 00:30:46,320 --> 00:30:50,905 Mas isso só significa alguma coisa mais caracteres e ints e coisas assim, porque 568 00:30:50,905 --> 00:30:55,600 se você estiver migrando um ponteiro que realmente não faz sentido, 569 00:30:55,600 --> 00:30:59,555 comutação de cargas, se ele ainda vamos você faz isso, por causa de ponto flutuante 570 00:30:59,555 --> 00:31:02,840 em precisão, você realmente não quero fazer isso de qualquer maneira. 571 00:31:02,840 --> 00:31:07,320 Então, basicamente, apenas inteiros e caracteres e coisas assim. 572 00:31:07,320 --> 00:31:12,360 >> DAN: Sim, é quando você tem explícita valores que você sabe, eu acho, pode ser 573 00:31:12,360 --> 00:31:14,250 que a mudança é 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á bem. 577 00:31:21,370 --> 00:31:26,180 >> O escopo é o intervalo que a declarada variável estende. 578 00:31:26,180 --> 00:31:32,190 Então neste pequeno pedaço de código que eu tenho, seria cheio de erros. 579 00:31:32,190 --> 00:31:41,450 E a razão é eu declarei isso int i dentro do escopo deste loop. 580 00:31:41,450 --> 00:31:46,390 E então eu estou tentando fazer referência que i fora desse âmbito de loop. 581 00:31:46,390 --> 00:31:50,330 >> Então, basicamente, você pode pensar sobre o escopo como qualquer coisa que você declarar 582 00:31:50,330 --> 00:31:59,750 com dentro de um conjunto de chaves só existe dentro dessas chaves. 583 00:31:59,750 --> 00:32:04,990 E se você tentar usar essa variável fora dessas chaves, você 584 00:32:04,990 --> 00:32:08,356 obter um erro do compilador. 585 00:32:08,356 --> 00:32:08,812 Sim? 586 00:32:08,812 --> 00:32:09,724 >> AUDIÊNCIA: Então este não funciona? 587 00:32:09,724 --> 00:32:11,790 >> DAN: Esta funcionalidade não funciona, sim. 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 String a char *. 591 00:32:19,780 --> 00:32:22,250 Eles são exatamente o mesmo. 592 00:32:22,250 --> 00:32:25,540 Eles são apenas apontadores para caracteres. 593 00:32:25,540 --> 00:32:33,000 E quaisquer caracteres que deve terminar com barra invertida zero, que é apenas 594 00:32:33,000 --> 00:32:34,410 uma convenção c. 595 00:32:34,410 --> 00:32:36,680 >> Ele é 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úsculo, capital de U, o capital L, o capital eu-- 598 00:32:41,670 --> 00:32:44,290 não é o mesmo que o Terminador NULL. 599 00:32:44,290 --> 00:32:46,640 Este é um ponteiro. 600 00:32:46,640 --> 00:32:48,280 Este é um personagem. 601 00:32:48,280 --> 00:32:49,530 Eles são muito distintas. 602 00:32:49,530 --> 00:32:50,200 Lembre-se disso. 603 00:32:50,200 --> 00:32:52,320 Será no questionário, provavelmente. 604 00:32:52,320 --> 00:32:54,040 Eu não vi o questionário. 605 00:32:54,040 --> 00:32:57,880 606 00:32:57,880 --> 00:32:58,840 Sim? 607 00:32:58,840 --> 00:33:01,232 >> AUDIÊNCIA: Então NULL é, digamos, o ponteiro? 608 00:33:01,232 --> 00:33:01,995 >> DAN: Sim. 609 00:33:01,995 --> 00:33:05,170 >> AUDIÊNCIA: O que [inaudível]? 610 00:33:05,170 --> 00:33:10,050 >> DAN: Se, por exemplo, malloc é chamado quando você não tem memória suficiente para obter 611 00:33:10,050 --> 00:33:14,400 o tamanho que você está pedindo, malloc retornará NULL. 612 00:33:14,400 --> 00:33:19,550 É, basicamente, sempre que uma função é deve retornar um ponteiro, você 613 00:33:19,550 --> 00:33:22,600 preciso verificar contra NULL porque NULL é um bom-- muito 614 00:33:22,600 --> 00:33:25,260 é, mais ou menos, o valor de lixo. 615 00:33:25,260 --> 00:33:27,050 É um zero na medida em que os ponteiros vão. 616 00:33:27,050 --> 00:33:29,630 617 00:33:29,630 --> 00:33:32,250 >> Sempre que você chamar uma função, que retorna um ponteiro. 618 00:33:32,250 --> 00:33:35,960 Você vai querer verificar-se Certifique-se de que esse ponteiro não é NULL 619 00:33:35,960 --> 00:33:37,760 porque NULL é muito comum. 620 00:33:37,760 --> 00:33:40,160 É uma espécie de retorno lixo. 621 00:33:40,160 --> 00:33:44,902 Então, se alguma coisa não vai bem, só retornam NULL no lugar. 622 00:33:44,902 --> 00:33:45,898 >> AUDIÊNCIA: [inaudível]? 623 00:33:45,898 --> 00:33:48,922 >> DAN: Sim, e isso é isso. 624 00:33:48,922 --> 00:33:51,750 >> AUDIÊNCIA: [inaudível]? 625 00:33:51,750 --> 00:33:52,800 >> DAN: Spell-lo como este. 626 00:33:52,800 --> 00:33:54,150 É o terminador NULL. 627 00:33:54,150 --> 00:33:56,560 É minúscula N-U-L-L se você soletrá-la. 628 00:33:56,560 --> 00:33:59,860 >> AUDIÊNCIA: E eu só fui trás e testou. 629 00:33:59,860 --> 00:34:03,010 E se você tentar colocar um ponto flutuante valor em um switch, ele vai gritar com você 630 00:34:03,010 --> 00:34:05,916 dizer, indicação requer expressão do tipo inteiro. 631 00:34:05,916 --> 00:34:07,166 >> DAN: Lá vai você. 632 00:34:07,166 --> 00:34:09,639 633 00:34:09,639 --> 00:34:12,246 Mas sim, o que era a pergunta? 634 00:34:12,246 --> 00:34:13,496 >> AUDIÊNCIA: [inaudível]? 635 00:34:13,496 --> 00:34:16,150 636 00:34:16,150 --> 00:34:23,679 >> DAN: Então o capital N, capital de U, o capital L, L maiúsculo é uma coisa real c. 637 00:34:23,679 --> 00:34:29,719 É o ponteiro nulo e apenas ser tratado como tal. 638 00:34:29,719 --> 00:34:33,530 Você nunca vai tentar soletrar o Caractere NULL e ver qualquer 639 00:34:33,530 --> 00:34:35,630 outra forma que não esta. 640 00:34:35,630 --> 00:34:36,610 Sim? 641 00:34:36,610 --> 00:34:42,490 >> AUDIÊNCIA: Então voltando para char max ou algo nas notas, seria 642 00:34:42,490 --> 00:34:43,960 encarnam a mesma função como [inaudível]? 643 00:34:43,960 --> 00:34:50,655 644 00:34:50,655 --> 00:34:54,949 >> AUDIÊNCIA: Então você está se referindo a retornando de char máximo de getchar, ou 645 00:34:54,949 --> 00:34:55,444 seja o que for? 646 00:34:55,444 --> 00:34:55,940 >> AUDIÊNCIA: Yeah. 647 00:34:55,940 --> 00:34:58,620 >> AUDIÊNCIA: Sim, então o general prazo para todas essas coisas 648 00:34:58,620 --> 00:34:59,920 são valores sentinela. 649 00:34:59,920 --> 00:35:03,640 Assim como voltar int max de GetInt e Charlotte máximo de getchar, é 650 00:35:03,640 --> 00:35:06,010 deveria ser assim, tudo bem, se essas coisas estão voltando para nós, 651 00:35:06,010 --> 00:35:07,210 algo deu errado. 652 00:35:07,210 --> 00:35:09,950 >> Para ponteiros, que só acontecerá a ter este valor de sentinela que todos 653 00:35:09,950 --> 00:35:10,750 concorda em cima. 654 00:35:10,750 --> 00:35:13,210 E esta é a coisa que você retornar quando as coisas dão errado. 655 00:35:13,210 --> 00:35:15,910 Então Char max é o que estamos usando 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 >> AUDIÊNCIA: Então, se você está testando getchar, você poderia apenas colocar NULL? 658 00:35:23,420 --> 00:35:23,910 Teria que fazer a diferença? 659 00:35:23,910 --> 00:35:25,400 >> DAN: Você pode não apenas verificar NULL. 660 00:35:25,400 --> 00:35:30,130 Você teria que verificar caractere máximo porque o valor de retorno da função é 661 00:35:30,130 --> 00:35:35,416 um caráter não um ponteiro. 662 00:35:35,416 --> 00:35:35,888 Sim? 663 00:35:35,888 --> 00:35:38,248 >> AUDIÊNCIA: Esta pergunta para o comprimento da corda. 664 00:35:38,248 --> 00:35:40,136 Isso inclui o caractere NULL? 665 00:35:40,136 --> 00:35:41,000 >> DAN: No. 666 00:35:41,000 --> 00:35:45,930 E isso é, na verdade, como comprimento da corda sabe que parar porque ele passa por 667 00:35:45,930 --> 00:35:49,070 seu conjunto de caracteres até ele vê um personagem NULL. 668 00:35:49,070 --> 00:35:51,030 E então como é, tudo bem, eu sou feito. 669 00:35:51,030 --> 00:35:52,130 >> AUDIÊNCIA: [inaudível] cinco? 670 00:35:52,130 --> 00:35:53,990 >> DAN: Olá seria 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ão matrizes são contínuas blocos de memória. 674 00:36:02,880 --> 00:36:08,480 Eles têm acesso instantâneo ao dizer que o nome da matriz e, em seguida, em crespos 675 00:36:08,480 --> 00:36:16,720 suspensórios, qualquer que seja índice que você quer ir para, eles estão indexados a partir de zero a 676 00:36:16,720 --> 00:36:20,100 o comprimento de matriz menos 1. 677 00:36:20,100 --> 00:36:23,070 >> E eles estão declarados pelo tipo de coisa que você está armazenando no 678 00:36:23,070 --> 00:36:29,750 matriz, o nome da matriz, e então qualquer que seja o tamanho é de que matriz. 679 00:36:29,750 --> 00:36:36,660 Portanto, esta é uma matriz de caracteres de comprimento seis que tem esses valores. 680 00:36:36,660 --> 00:36:42,050 681 00:36:42,050 --> 00:36:42,700 Sim? 682 00:36:42,700 --> 00:36:43,950 >> AUDIÊNCIA: [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 >> AUDIÊNCIA: [inaudível]? 686 00:36:51,340 --> 00:36:56,700 >> DAN: Se você tem o que está acontecendo para a matriz já fez. 687 00:36:56,700 --> 00:37:02,260 Então, você pode especificar isso em vez de, digamos, char, qualquer que seja o nome do seu 688 00:37:02,260 --> 00:37:12,200 matriz é, colchetes vazios igual crespos prepare-H vírgula por vírgula E L L vírgula por vírgula 689 00:37:12,200 --> 00:37:16,290 O vírgula caráter NULL e chaveta. 690 00:37:16,290 --> 00:37:18,180 Isso também funciona como uma declaração. 691 00:37:18,180 --> 00:37:20,886 >> AUDIÊNCIA: [inaudível]? 692 00:37:20,886 --> 00:37:23,110 >> DAN: Então você precisa ter o tamanho já feito. 693 00:37:23,110 --> 00:37:23,896 >> AUDIÊNCIA: [inaudível]? 694 00:37:23,896 --> 00:37:25,146 >> DAN: Sim. 695 00:37:25,146 --> 00:37:30,114 696 00:37:30,114 --> 00:37:32,420 Tudo bem. 697 00:37:32,420 --> 00:37:36,430 Argumentos de linha de comando são uma forma de recebendo entrada do usuário como 698 00:37:36,430 --> 00:37:39,380 argumentos para principal. 699 00:37:39,380 --> 00:37:40,600 Principal tem dois argumentos. 700 00:37:40,600 --> 00:37:47,680 O número de argumentos que está sendo passou ao longo da linha de comando e um 701 00:37:47,680 --> 00:37:55,340 vetor de strings ou uma matriz de cadeia de todos os argumentos. 702 00:37:55,340 --> 00:38:07,840 >> Então, se eu, por exemplo, chamada de função, como um ponto fora um espaço, espaço 2, três, 703 00:38:07,840 --> 00:38:10,110 argc seria 4. 704 00:38:10,110 --> 00:38:17,370 E o argv 0 seria um ponto fora. 705 00:38:17,370 --> 00:38:19,130 Argv1 seria 1. 706 00:38:19,130 --> 00:38:23,030 argv2 seria 2. argv3 seria 3, nesse caso particular. 707 00:38:23,030 --> 00:38:23,310 Sim? 708 00:38:23,310 --> 00:38:25,400 >> AUDIÊNCIA: [inaudível]? 709 00:38:25,400 --> 00:38:34,010 >> DAN: O último elemento do array porque a matriz é o comprimento argc mais 710 00:38:34,010 --> 00:38:41,050 um dos argb, o último elemento é o ponteiro NULL. 711 00:38:41,050 --> 00:38:42,580 É argc mais 1. 712 00:38:42,580 --> 00:38:46,210 713 00:38:46,210 --> 00:38:52,150 Assim, no caso que eu acabei de dizer, ele seria argv 0 é um ponto fora. 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 é uma maior argc que seria NULL. 716 00:39:03,490 --> 00:39:04,870 >> E isso é o ponteiro NULL. 717 00:39:04,870 --> 00:39:06,590 Sim. 718 00:39:06,590 --> 00:39:11,250 E isso é porque cadeia é uma estrela char é um ponteiro. 719 00:39:11,250 --> 00:39:14,102 Por isso, tem de ser do mesmo tipo. 720 00:39:14,102 --> 00:39:14,595 Sim? 721 00:39:14,595 --> 00:39:16,074 >> AUDIÊNCIA: Duas perguntas. 722 00:39:16,074 --> 00:39:21,004 Então, um, qual é a diferença entre isto e GetString outro do que um tipo 723 00:39:21,004 --> 00:39:22,483 no mecanismo de utilizador? 724 00:39:22,483 --> 00:39:25,934 E dois, ele é armazenado dentro sua memória recente? 725 00:39:25,934 --> 00:39:28,399 Assim como, GetString faria ser [inaudível]? 726 00:39:28,399 --> 00:39:31,357 727 00:39:31,357 --> 00:39:33,650 >> DAN: Onde é armazenado? 728 00:39:33,650 --> 00:39:34,905 Eu não sei onde ele está armazenado. 729 00:39:34,905 --> 00:39:40,000 >> AUDIÊNCIA: Então, na verdade, você sabe como qualquer função que você chamá-lo de argumentos 730 00:39:40,000 --> 00:39:42,170 são armazenadas na pilha? 731 00:39:42,170 --> 00:39:46,610 Então argc e argv são argumentos para o main e eles estão na pilha, ou realmente 732 00:39:46,610 --> 00:39:49,131 logo acima o que você pensa como o início da pilha. 733 00:39:49,131 --> 00:39:53,490 Qual era a outra parte de questão? 734 00:39:53,490 --> 00:39:56,821 >> AUDIÊNCIA: Então, qual é o [inaudível]? 735 00:39:56,821 --> 00:40:00,990 >> DAN: Sim, é apenas uma forma diferente de obter a entrada do usuário. 736 00:40:00,990 --> 00:40:06,030 Isto de um pouco mais eficiente e é mais útil para scripts porque você 737 00:40:06,030 --> 00:40:10,070 pode apenas passar argumentos para o seu principal função, em vez de ter que esperar 738 00:40:10,070 --> 00:40:13,400 para os usuários, se você não tem quaisquer usuários. 739 00:40:13,400 --> 00:40:16,280 >> AUDIÊNCIA: E sim, obter cordas seria [inaudível]. 740 00:40:16,280 --> 00:40:17,922 Seria armazenar o material que você precisa. 741 00:40:17,922 --> 00:40:18,834 >> DAN: Sim? 742 00:40:18,834 --> 00:40:21,114 >> AUDIÊNCIA: [inaudível]? 743 00:40:21,114 --> 00:40:27,545 >> DAN: Sim, argv 0 inclui sempre o dot barra da chamada de função. 744 00:40:27,545 --> 00:40:28,042 Sim? 745 00:40:28,042 --> 00:40:29,292 >> AUDIÊNCIA: [inaudível]? 746 00:40:29,292 --> 00:40:33,509 747 00:40:33,509 --> 00:40:37,310 >> DAN: Sim, cada um dos argumentos são terminou em caráter NULL porque 748 00:40:37,310 --> 00:40:38,310 são strings. 749 00:40:38,310 --> 00:40:40,892 >> AUDIÊNCIA: [inaudível]? 750 00:40:40,892 --> 00:40:44,116 >> DAN: Sim, argv argc é um ponteiro NULL. 751 00:40:44,116 --> 00:40:45,112 >> AUDIÊNCIA: [inaudível]? 752 00:40:45,112 --> 00:40:47,104 >> DAN: Oh yeah. 753 00:40:47,104 --> 00:40:48,100 Sim, desculpe. 754 00:40:48,100 --> 00:40:49,594 >> AUDIÊNCIA: Então, [inaudível]? 755 00:40:49,594 --> 00:41:08,518 756 00:41:08,518 --> 00:41:16,340 >> DAN: Então a questão é se você tivesse o linha de comando dot cortar um ponto fora 1, 2, 757 00:41:16,340 --> 00:41:20,410 seria o número de linha de comando argumentos ser dois ou seria três? 758 00:41:20,410 --> 00:41:24,420 759 00:41:24,420 --> 00:41:28,240 >> AUDIÊNCIA: Eu acho que isso não acontece realmente importa. 760 00:41:28,240 --> 00:41:31,370 Costumo dizer, oh, você não passou quaisquer argumentos de linha de comando quando, 761 00:41:31,370 --> 00:41:32,730 Obviamente, você chamou a função. 762 00:41:32,730 --> 00:41:37,950 Então, eu tendem a excluir vocalmente o função a partir da linha de comando 763 00:41:37,950 --> 00:41:40,350 argumentos, mesmo que seja incluídas na argv. 764 00:41:40,350 --> 00:41:42,600 >> DAN: Mas se fosse no test-- 765 00:41:42,600 --> 00:41:46,550 yeah-- e também se você disser algo argc como é igual a 3, 766 00:41:46,550 --> 00:41:48,512 você está em posição segura. 767 00:41:48,512 --> 00:41:49,416 Sim? 768 00:41:49,416 --> 00:41:50,666 >> AUDIÊNCIA: [inaudível]? 769 00:41:50,666 --> 00:42:00,990 770 00:42:00,990 --> 00:42:09,510 >> DAN: Eu acho que, se em vez de chamar esse em argc e argv cordas suportes 771 00:42:09,510 --> 00:42:14,350 mas manteve os mesmos tipos e apenas chamado -lhes algo diferente, como um 772 00:42:14,350 --> 00:42:16,640 e b, será que ainda funciona? 773 00:42:16,640 --> 00:42:18,790 E ele continuaria a trabalhar, você só-- 774 00:42:18,790 --> 00:42:21,520 em vez de usar argc-- você pode usar a e b. 775 00:42:21,520 --> 00:42:24,436 776 00:42:24,436 --> 00:42:25,408 Sim? 777 00:42:25,408 --> 00:42:26,658 >> AUDIÊNCIA: [inaudível]? 778 00:42:26,658 --> 00:42:34,642 779 00:42:34,642 --> 00:42:38,850 >> DAN: Então a questão é GetString é indo para armazenar memória no heap 780 00:42:38,850 --> 00:42:42,280 porque GetString é char *. 781 00:42:42,280 --> 00:42:47,530 Ele armazena a memória na pilha porque chama-se agora dentro da malloc real 782 00:42:47,530 --> 00:42:49,258 implementação de GetString. 783 00:42:49,258 --> 00:42:53,210 784 00:42:53,210 --> 00:42:55,090 OK, seguindo em frente. 785 00:42:55,090 --> 00:42:55,950 >> Segurança. 786 00:42:55,950 --> 00:43:01,090 Assim, para ser verdadeiramente seguro, você confia em nenhum uma e você não permitir o acesso a qualquer um 787 00:43:01,090 --> 00:43:04,540 de suas informações, razão pela qual todo mundo constrói suas próprias máquinas, 788 00:43:04,540 --> 00:43:09,580 seus próprios sistemas operacionais, todo o seu programas a partir do zero, e, obviamente, 789 00:43:09,580 --> 00:43:13,410 não ligar para qualquer outra máquina através da internet. 790 00:43:13,410 --> 00:43:17,350 Assim, os computadores são inseguros. 791 00:43:17,350 --> 00:43:19,200 Eles realmente são. 792 00:43:19,200 --> 00:43:20,940 Temos que confiar em outras pessoas. 793 00:43:20,940 --> 00:43:26,500 >> E a idéia de segurança é que você é tentativa de limitar a quantidade de 794 00:43:26,500 --> 00:43:27,540 confiança que você precisa. 795 00:43:27,540 --> 00:43:32,080 E um dos meios de fazer isso é por meio de criptografia. 796 00:43:32,080 --> 00:43:34,950 A criptografia é, essencialmente, temos segredos. 797 00:43:34,950 --> 00:43:38,880 >> Às vezes temos que passar nossos segredos Junto com, digamos, a internet ou 798 00:43:38,880 --> 00:43:39,980 outras coisas. 799 00:43:39,980 --> 00:43:43,180 E nós não queremos que as pessoas conhecer esses segredos. 800 00:43:43,180 --> 00:43:50,100 Então, nós transferimos nossos segredos para uma forma que esperamos que ninguém pode descobrir. 801 00:43:50,100 --> 00:43:51,600 >> Então, nós used-- 802 00:43:51,600 --> 00:43:54,340 através do curso deste class-- 803 00:43:54,340 --> 00:44:00,750 coisas como cifra de César e [Inaudível], que são muito, muito 804 00:44:00,750 --> 00:44:03,200 formas inseguras de criptografar as coisas. 805 00:44:03,200 --> 00:44:07,930 Eles são fáceis de descobrir o que eles são e quais são seus segredos são. 806 00:44:07,930 --> 00:44:12,130 O mundo real usa muito mais esquemas de criptografia complicados. 807 00:44:12,130 --> 00:44:13,880 E nós não vamos entrar em muito mais do que isso. 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 melhor. 811 00:44:20,785 --> 00:44:24,014 812 00:44:24,014 --> 00:44:25,810 Vou ressaltar novamente. 813 00:44:25,810 --> 00:44:30,920 Use GDB o tempo todo vez que você tem um problema. 814 00:44:30,920 --> 00:44:36,030 Os comandos que são úteis em GDB são quebrar, o que você quer passar uma linha 815 00:44:36,030 --> 00:44:41,330 número, um nome de função, essencialmente onde no seu código você quer parar, 816 00:44:41,330 --> 00:44:45,600 e ser capaz de assumir o controle. 817 00:44:45,600 --> 00:44:54,140 >> Imprimir leva uma variável e imprime seja lá o que é variável em que 818 00:44:54,140 --> 00:44:55,990 momento de sua execução. 819 00:44:55,990 --> 00:45:00,130 Em seguida move sua execução ao longo de uma única etapa. 820 00:45:00,130 --> 00:45:05,050 E passo passos dentro de uma função na sua execução. 821 00:45:05,050 --> 00:45:10,480 >> Outras coisas estão a correr, que é como você realmente executar seu código. 822 00:45:10,480 --> 00:45:16,630 Continue toma todas as medidas necessárias para chegar ao próximo ponto de parada. 823 00:45:16,630 --> 00:45:18,300 E há muitos, muitos outros. 824 00:45:18,300 --> 00:45:19,040 Procurá-los. 825 00:45:19,040 --> 00:45:19,901 Eles são ótimos. 826 00:45:19,901 --> 00:45:20,863 Sim? 827 00:45:20,863 --> 00:45:22,113 >> AUDIÊNCIA: [inaudível]? 828 00:45:22,113 --> 00:45:26,635 829 00:45:26,635 --> 00:45:28,200 >> DAN: Sim, o que é um depurador. 830 00:45:28,200 --> 00:45:34,230 Assim, um depurador é um programa que permite depurar o programa. 831 00:45:34,230 --> 00:45:39,931 Não é um programa que encontra erros para Você, no entanto, que seria ótimo. 832 00:45:39,931 --> 00:45:43,020 833 00:45:43,020 --> 00:45:46,040 >> E por último, para mim, é pesquisa. 834 00:45:46,040 --> 00:45:51,470 Assim, os tipos de pesquisa que falamos sobre nesta classe são a pesquisa linear, 835 00:45:51,470 --> 00:45:55,960 que é exatamente isso que você olhar através de cada elemento do espaço de busca, um 836 00:45:55,960 --> 00:46:00,410 elemento de cada vez, até encontrar o que você está procurando ou até atingir 837 00:46:00,410 --> 00:46:03,350 o final do seu espaço de busca em que apontar-lhe dizer que você não poderia encontrar 838 00:46:03,350 --> 00:46:06,360 o elemento que você estava procurando. 839 00:46:06,360 --> 00:46:13,450 E isto leva tempo a melhor constante, que é de 1 0 e, na pior linear 840 00:46:13,450 --> 00:46:16,070 tempo, que é de 0 n. 841 00:46:16,070 --> 00:46:19,250 >> Pesquisa binária, que precisa elementos sórdidos. 842 00:46:19,250 --> 00:46:24,230 Você vai para o meio dos seus elementos, ver se o elemento que você está procurando 843 00:46:24,230 --> 00:46:30,120 é maior ou menor do que o elemento que você está no meio. 844 00:46:30,120 --> 00:46:36,510 Ele é maior, você diz que o fundo de sua pesquisa o espaço é seu 845 00:46:36,510 --> 00:46:41,550 localização atual, o meio e reiniciar o processo. 846 00:46:41,550 --> 00:46:46,150 Se for menor, você parece dizer o-- que sim, o que foi? 847 00:46:46,150 --> 00:46:47,400 >> AUDIÊNCIA: [inaudível]? 848 00:46:47,400 --> 00:46:51,000 849 00:46:51,000 --> 00:46:54,260 >> DAN: Sim. 850 00:46:54,260 --> 00:46:58,360 Qualquer tipo de espécie que tem sido ensinado em a classe é um jogo justo para o teste. 851 00:46:58,360 --> 00:47:01,504 852 00:47:01,504 --> 00:47:04,920 >> [Risos] 853 00:47:04,920 --> 00:47:10,260 >> DAN: E o fato de você não ter tido para fazer isso por um conjunto de problemas, é justo 854 00:47:10,260 --> 00:47:12,420 jogo para o teste. 855 00:47:12,420 --> 00:47:15,186 >> AUDIÊNCIA: Podemos passar por isso como para-- 856 00:47:15,186 --> 00:47:17,052 >> DAN: Será ido mais. 857 00:47:17,052 --> 00:47:20,496 >> COLUNA 2: O código real para [Inaudível] é em study.cs50.net. 858 00:47:20,496 --> 00:47:25,910 859 00:47:25,910 --> 00:47:32,680 Então, se você olhar para o problema prática na página merge sort de 860 00:47:32,680 --> 00:47:35,880 study.cs50.net, existe o código para a implementação de merge sort. 861 00:47:35,880 --> 00:47:38,550 Então você não tem que implementar it yourself esta noite. 862 00:47:38,550 --> 00:47:42,090 Mas certifique-se de compreendê-lo, em vez que apenas memorização. 863 00:47:42,090 --> 00:47:45,035 >> AUDIÊNCIA: [inaudível]? 864 00:47:45,035 --> 00:47:49,720 >> COLUNA 2: A página merge sort em study.cs50.net, não é uma prática 865 00:47:49,720 --> 00:47:53,570 problema que, se você clicar no problema, no final há uma 866 00:47:53,570 --> 00:47:56,280 solução, que é a fusão implementação de classificação. 867 00:47:56,280 --> 00:47:58,510 Mas certifique-se de compreendê-lo ao invés de apenas memorizá-la 868 00:47:58,510 --> 00:47:59,760 ou copiá-lo para baixo. 869 00:47:59,760 --> 00:48:02,870 870 00:48:02,870 --> 00:48:06,340 >> AUDIÊNCIA: E um perfeitamente válido problema para o exame seria 871 00:48:06,340 --> 00:48:07,990 algo como aqui está uma lista. 872 00:48:07,990 --> 00:48:12,100 O que essa lista ficar depois um passo de seleções de tipo ou de 873 00:48:12,100 --> 00:48:13,330 tipo de inserção ou o que quer. 874 00:48:13,330 --> 00:48:14,940 Uma iteração completa da lista. 875 00:48:14,940 --> 00:48:18,530 Assim, mesmo se você não acabar precisando código para ele, você precisa entendê-lo 876 00:48:18,530 --> 00:48:20,440 o suficiente para saber como vai a ser modificar essa matriz. 877 00:48:20,440 --> 00:48:24,144 878 00:48:24,144 --> 00:48:25,394 >> DAN: Isso é tudo para mim. 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: Olá a todos. 883 00:49:07,410 --> 00:49:08,390 Meu nome é Lucas. 884 00:49:08,390 --> 00:49:16,840 Eu vou falar sobre recursão, tudo os tipos que aprendemos, e um 885 00:49:16,840 --> 00:49:18,050 pouco de todos os ponteiros. 886 00:49:18,050 --> 00:49:18,740 Ok? 887 00:49:18,740 --> 00:49:20,340 Então, primeiro de tudo, a recursividade. 888 00:49:20,340 --> 00:49:22,951 O que significa dizer que uma função é recursiva? 889 00:49:22,951 --> 00:49:24,675 >> AUDIÊNCIA: Chama-se. 890 00:49:24,675 --> 00:49:26,500 >> LUCAS: OK, chama a si mesmo, sim. 891 00:49:26,500 --> 00:49:27,700 Assim como esta imagem, por exemplo. 892 00:49:27,700 --> 00:49:30,280 É como se a imagem dentro de uma imagem e assim por diante. 893 00:49:30,280 --> 00:49:35,740 Assim, por exemplo, você pode have-- como Dan que estava falando de busca binária. 894 00:49:35,740 --> 00:49:41,840 Uma maneira pela qual busca binária é recursiva é o fato de que você é 895 00:49:41,840 --> 00:49:43,130 tentando encontrar um número. 896 00:49:43,130 --> 00:49:44,250 Então você vai para o meio. 897 00:49:44,250 --> 00:49:47,130 E depois que você verifique se os números lá no lado esquerdo e no direito. 898 00:49:47,130 --> 00:49:49,650 >> E então se você descobrir o número é vai ser do lado esquerdo, que é o mesmo 899 00:49:49,650 --> 00:49:53,340 coisa como fazer a busca novamente, mas apenas no lado esquerdo da lista. 900 00:49:53,340 --> 00:49:57,350 Então é assim que soa como é recursiva. 901 00:49:57,350 --> 00:50:01,870 Então é por isso que vocês têm recursiva solução para merge sort. 902 00:50:01,870 --> 00:50:04,270 >> OK, então aqui está um exemplo. 903 00:50:04,270 --> 00:50:07,280 Então, digamos que eu quero escolher todos os números de 1 a n. 904 00:50:07,280 --> 00:50:13,790 Eu pode perceber que a soma de n número é n mais n menos 1 até 1. 905 00:50:13,790 --> 00:50:17,810 Mas então, se eu olhar para n menos 1 mais n menos 2 mais 1, que é a mesma 906 00:50:17,810 --> 00:50:20,680 coisa como números somando até n menos 1. 907 00:50:20,680 --> 00:50:25,890 Então eu posso dizer a soma de um montante igual n é igual a, mais a soma de n menos 1. 908 00:50:25,890 --> 00:50:28,010 Será que isso faz sentido? 909 00:50:28,010 --> 00:50:32,630 >> E eu também teria algo mais chamou o caso de base, que é a 910 00:50:32,630 --> 00:50:37,440 a soma dos números acima a zero seria zero. 911 00:50:37,440 --> 00:50:42,770 Então, assim que eu chegar ao número zero, eu parar de contar. 912 00:50:42,770 --> 00:50:45,330 Será que isso faz sentido? 913 00:50:45,330 --> 00:50:48,120 >> Então aqui está um exemplo de como Eu posso implementar isso. 914 00:50:48,120 --> 00:50:49,860 Então, eu tenho essa função em alguns. 915 00:50:49,860 --> 00:50:51,700 Isso leva um inteiro n. 916 00:50:51,700 --> 00:50:56,300 Então aqui eu primeiro verificar se n é inferior ou igual a zero. 917 00:50:56,300 --> 00:51:00,310 Então, se é menor ou igual a zero, I retornar zero, que é o nosso caso base. 918 00:51:00,310 --> 00:51:05,690 Caso contrário, eu só posso voltar n mais a soma dos números de 919 00:51:05,690 --> 00:51:07,190 um a n menos um. 920 00:51:07,190 --> 00:51:09,360 Faz sentido? 921 00:51:09,360 --> 00:51:10,100 Está bem. 922 00:51:10,100 --> 00:51:11,610 >> Então aqui está o que parece. 923 00:51:11,610 --> 00:51:15,260 Você tem soma de duas iguais 2 mais a soma de 1. 924 00:51:15,260 --> 00:51:18,930 E alguns de 1 é 1 mais o soma de 0, que é 0. 925 00:51:18,930 --> 00:51:20,216 Faz sentido? 926 00:51:20,216 --> 00:51:25,342 Então, se olharmos para a pilha de seu programa, este é o que parece. 927 00:51:25,342 --> 00:51:26,820 >> Primeiro, temos a função principal. 928 00:51:26,820 --> 00:51:30,320 E, em seguida, a função principal chamado soma 2. 929 00:51:30,320 --> 00:51:36,690 E, em seguida, soma dois vai dizer, oh, soma 2 é igual a 2, mais a soma de um. 930 00:51:36,690 --> 00:51:39,460 Então eu adicionar soma de 1 a pilha. 931 00:51:39,460 --> 00:51:43,860 E a soma de 1 vai chamar soma de 0, o que também vai ser adicionada 932 00:51:43,860 --> 00:51:44,630 para a pilha. 933 00:51:44,630 --> 00:51:49,240 E, em seguida, cada um destes são aqueles que em cima do outro tem que retornar 934 00:51:49,240 --> 00:51:52,020 antes que os outros podem continuar. 935 00:51:52,020 --> 00:51:56,240 >> Assim, por exemplo, aqui, soma de 0, em primeiro lugar, vai retornar 0. 936 00:51:56,240 --> 00:51:58,320 E em seguida, escolha quantia de 1. 937 00:51:58,320 --> 00:52:00,850 Em seguida, soma de 1 vai retornar 1 a soma de 2. 938 00:52:00,850 --> 00:52:03,900 E, finalmente, soma de dois vai para retornar 3 a principal. 939 00:52:03,900 --> 00:52:05,320 Será que isso faz sentido? 940 00:52:05,320 --> 00:52:09,496 >> É muito importante entender como a pilha está funcionando e tentar 941 00:52:09,496 --> 00:52:11,980 ver se faz sentido. 942 00:52:11,980 --> 00:52:13,260 OK, então a classificação. 943 00:52:13,260 --> 00:52:16,170 Então, por que é importante a classificação, em primeiro lugar? 944 00:52:16,170 --> 00:52:18,260 Por que devemos nos preocupar? 945 00:52:18,260 --> 00:52:20,310 Qualquer um? 946 00:52:20,310 --> 00:52:20,695 Dê-me um exemplo? 947 00:52:20,695 --> 00:52:21,040 Sim? 948 00:52:21,040 --> 00:52:22,968 >> AUDIÊNCIA: [inaudível]. 949 00:52:22,968 --> 00:52:24,700 >> LUCAS: Sim, OK. 950 00:52:24,700 --> 00:52:26,090 Então, você pode pesquisar de forma mais eficiente. 951 00:52:26,090 --> 00:52:28,580 Isso é um bom caminho. 952 00:52:28,580 --> 00:52:32,462 Assim, por exemplo, temos um monte de coisas, na verdade, em nossas vidas que 953 00:52:32,462 --> 00:52:32,920 são classificadas. 954 00:52:32,920 --> 00:52:34,830 Por exemplo, os dicionários. 955 00:52:34,830 --> 00:52:39,210 >> É muito importante ter todo o palavras algum tipo de ordem que 956 00:52:39,210 --> 00:52:41,970 pode acessar facilmente. 957 00:52:41,970 --> 00:52:43,280 Então, isso é o que ele estava dizendo. 958 00:52:43,280 --> 00:52:45,530 Você pode pesquisar de forma mais eficiente. 959 00:52:45,530 --> 00:52:48,740 Pense em quão difícil seria ter um dicionário em que as palavras estão em 960 00:52:48,740 --> 00:52:49,500 ordem aleatória. 961 00:52:49,500 --> 00:52:53,120 Você vai ter de se ver, muito bonito, cada palavra, até encontrar o 962 00:52:53,120 --> 00:52:54,720 palavra que você está procurando. 963 00:52:54,720 --> 00:52:58,710 >> Se você estiver usando o Facebook também, quando você está olhando para os seus amigos, você está 964 00:52:58,710 --> 00:53:03,540 vai ver que o Facebook colocar o seu amigo mais próximo é em cima das 965 00:53:03,540 --> 00:53:05,470 que você não fale muito. 966 00:53:05,470 --> 00:53:08,080 Se você percorrer todo o caminho até o fundo do sua lista de amigos, você vai ver 967 00:53:08,080 --> 00:53:11,250 pessoas que você provavelmente nem sequer lembre-se que você é amigos com. 968 00:53:11,250 --> 00:53:14,590 E isso é porque os tipos Facebook seus amigos com base em como 969 00:53:14,590 --> 00:53:16,472 você está perto deles. 970 00:53:16,472 --> 00:53:17,930 >> Assim, organizar os dados. 971 00:53:17,930 --> 00:53:18,450 Também Pokemon. 972 00:53:18,450 --> 00:53:21,400 Então você vê que todos os Pokemons têm números. 973 00:53:21,400 --> 00:53:27,210 E isso é como um fácil forma de acesso aos dados. 974 00:53:27,210 --> 00:53:29,050 >> AUDIÊNCIA: Acessando Pokemon. 975 00:53:29,050 --> 00:53:29,890 >> LUCAS: É. 976 00:53:29,890 --> 00:53:32,395 >> AUDIÊNCIA: [inaudível]. 977 00:53:32,395 --> 00:53:33,460 >> LUCAS: Yep. 978 00:53:33,460 --> 00:53:35,140 OK, então a seleção de classificação. 979 00:53:35,140 --> 00:53:41,610 Ordenar Seleção vai selecionar o menor valor indiferenciados de uma lista cada 980 00:53:41,610 --> 00:53:43,300 tempo em cada iteração. 981 00:53:43,300 --> 00:53:46,800 É uma espécie de como o tipo que você faz na sua cabeça quando você está tentando 982 00:53:46,800 --> 00:53:48,430 ordenar uma lista na mão. 983 00:53:48,430 --> 00:53:51,990 >> Basicamente, tudo que você faz é olhar para o número mais baixo. 984 00:53:51,990 --> 00:53:54,280 Você colocá-lo na lista de classificação. 985 00:53:54,280 --> 00:53:56,230 E então você olha para o próximo menor número. 986 00:53:56,230 --> 00:54:00,080 E então você continuar fazendo que e assim por diante. 987 00:54:00,080 --> 00:54:04,600 >> Assim, a seleção tipo é basicamente você selecionar cada vez menor 988 00:54:04,600 --> 00:54:05,750 valor indiferenciados. 989 00:54:05,750 --> 00:54:10,840 Colocar no final da classificados parte da lista. 990 00:54:10,840 --> 00:54:12,370 E continuar fazendo isso. 991 00:54:12,370 --> 00:54:15,890 Então, vamos ver rapidamente o que este parece. 992 00:54:15,890 --> 00:54:19,340 Então aqui está o classificado e lista de indiferenciados. 993 00:54:19,340 --> 00:54:23,350 >> Assim, para a ordenada de lista, é inicialmente vazio. 994 00:54:23,350 --> 00:54:26,760 E então eu estou indo para selecionar o menor número aqui, que é 2. 995 00:54:26,760 --> 00:54:30,650 Então eu recebo o número 2 e eu coloquei na parte da frente da lista. 996 00:54:30,650 --> 00:54:34,910 E então eu olho para a próxima menor elemento, o qual é de 3. 997 00:54:34,910 --> 00:54:37,050 Então, eu colocá-lo no final da lista ordenada. 998 00:54:37,050 --> 00:54:38,140 E então eu continuar fazendo isso. 999 00:54:38,140 --> 00:54:40,040 Acho 4 e colocá-lo no final. 1000 00:54:40,040 --> 00:54:41,360 Encontre 5 e colocá-lo no final. 1001 00:54:41,360 --> 00:54:44,830 >> E olha como todos aqueles momentos em que Eu estou dizendo que colocá-lo no final é, 1002 00:54:44,830 --> 00:54:46,850 basicamente, trocar dois 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ão o último, você só ter mais um elemento. 1006 00:54:52,825 --> 00:54:55,870 Então, ele já está classificada. 1007 00:54:55,870 --> 00:54:57,800 >> OK, então ordenação por inserção. 1008 00:54:57,800 --> 00:55:03,180 Inclusão tipo que você vai ter também essa coisa de ter um ordenado e 1009 00:55:03,180 --> 00:55:04,690 uma lista não ordenada. 1010 00:55:04,690 --> 00:55:14,540 A única coisa é que toda vez que você está adicionando um elemento à classificadas 1011 00:55:14,540 --> 00:55:18,170 lista, é só escolher o elemento que está na frente da lista de indiferenciados. 1012 00:55:18,170 --> 00:55:20,880 E então você vai encontrar o que posição que deve ser classificada no 1013 00:55:20,880 --> 00:55:22,300 parte da lista. 1014 00:55:22,300 --> 00:55:25,840 >> Vamos ver o que isto é assim isso faz mais sentido. 1015 00:55:25,840 --> 00:55:29,360 Assim, inicialmente, por exemplo, eu estou tentando para inserir o número três do 1016 00:55:29,360 --> 00:55:30,680 parte classificada da lista. 1017 00:55:30,680 --> 00:55:31,800 Assim, a lista não tem nada. 1018 00:55:31,800 --> 00:55:34,160 Então, eu posso apenas colocar o número 3. 1019 00:55:34,160 --> 00:55:37,480 >> Agora, eu quero adicionar o número 5 para a parte da lista ordenada. 1020 00:55:37,480 --> 00:55:38,900 Então eu olhar para o número 5. 1021 00:55:38,900 --> 00:55:40,450 Percebo que é maior do que 3. 1022 00:55:40,450 --> 00:55:41,980 Então, eu sei que ele tem que ser depois de 3. 1023 00:55:41,980 --> 00:55:44,100 Então eu coloquei 3 e 5. 1024 00:55:44,100 --> 00:55:45,940 >> Então eu quero inserir o número 2. 1025 00:55:45,940 --> 00:55:51,630 Percebo que o número 2 é, na verdade, durar, então o 3 eo 5. 1026 00:55:51,630 --> 00:55:54,580 Então, eu realmente tenho que colocar tudo o maneira no início da lista. 1027 00:55:54,580 --> 00:55:59,030 Então eu tenho que, tipo, mudar toda a elementos da lista ordenada para que eu possa 1028 00:55:59,030 --> 00:56:01,970 abrir espaço para o número 2. 1029 00:56:01,970 --> 00:56:03,160 >> Então eu vejo o número 6. 1030 00:56:03,160 --> 00:56:05,450 Eu vejo que ele deve ser após 5. 1031 00:56:05,450 --> 00:56:06,240 Então, eu colocá-lo lá. 1032 00:56:06,240 --> 00:56:07,965 E, finalmente, eu olhar para o número 4. 1033 00:56:07,965 --> 00:56:11,030 E notei que deveria situar-se entre 3 e 5. 1034 00:56:11,030 --> 00:56:14,870 E então eu colocá-lo lá e mudança todos os outros elementos. 1035 00:56:14,870 --> 00:56:16,120 Faz 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ão bubble sort é basicamente o que você está vai fazer-- chamamos isso de bolha 1039 00:56:25,730 --> 00:56:30,113 tipo, porque você atravessa o lista-- é realmente melhor se eu apenas mostrar 1040 00:56:30,113 --> 00:56:32,300 você gosta isso-- 1041 00:56:32,300 --> 00:56:35,030 e você está indo para comparar números adjacentes. 1042 00:56:35,030 --> 00:56:38,410 E você vai trocar a sua posições se eles não estão 1043 00:56:38,410 --> 00:56:39,190 na ordem certa. 1044 00:56:39,190 --> 00:56:42,570 >> Então, basicamente, o que vai acontecer é aqui, por exemplo, 1045 00:56:42,570 --> 00:56:44,160 você tem 8 e 6. 1046 00:56:44,160 --> 00:56:47,270 Você sabe que a ordem de classificação será realmente ser 6 e 5, certo? 1047 00:56:47,270 --> 00:56:49,540 Então você vai para trocar as ordens. 1048 00:56:49,540 --> 00:56:51,370 Então eu vejo 8 e 4 aqui. 1049 00:56:51,370 --> 00:56:52,250 E eu faço a mesma coisa. 1050 00:56:52,250 --> 00:56:53,400 Eu trocar novamente. 1051 00:56:53,400 --> 00:56:55,070 E, finalmente, 2 e 8. 1052 00:56:55,070 --> 00:56:56,670 Eu também trocá-los. 1053 00:56:56,670 --> 00:57:01,690 >> É chamado Bubble Sort porque depois cada uma dessas iterações, na verdade, 1054 00:57:01,690 --> 00:57:05,910 o maior número na lista fica tudo o caminho para o fim da lista. 1055 00:57:05,910 --> 00:57:06,940 Será que isso faz sentido? 1056 00:57:06,940 --> 00:57:11,880 Porque mantém troca-lo e movendo-o para a direita. 1057 00:57:11,880 --> 00:57:14,440 >> OK, então esta é a segunda iteração. 1058 00:57:14,440 --> 00:57:17,200 Isso seria a mesma coisa. 1059 00:57:17,200 --> 00:57:20,190 Eu vou fazer um swap e em seguida, o último. 1060 00:57:20,190 --> 00:57:23,290 Eu que não há trocas ea lista é ordenada. 1061 00:57:23,290 --> 00:57:27,460 Assim, em Bubble Sort, nós basicamente manter atravessar a lista e trocar 1062 00:57:27,460 --> 00:57:32,310 coisas até que eu perceber que eu não fiz quaisquer swaps fazendo a iteração, que 1063 00:57:32,310 --> 00:57:34,270 significa que a lista já está classificado. 1064 00:57:34,270 --> 00:57:35,520 Faz sentido? 1065 00:57:35,520 --> 00:57:38,400 1066 00:57:38,400 --> 00:57:40,870 >> Vamos falar um pouco sobre o tempo de execução. 1067 00:57:40,870 --> 00:57:45,165 Portanto, vocês lembram Big O, Omega, e Theta? 1068 00:57:45,165 --> 00:57:49,290 1069 00:57:49,290 --> 00:57:50,990 Sim? 1070 00:57:50,990 --> 00:57:53,070 OK, o que é Big O, em primeiro lugar? 1071 00:57:53,070 --> 00:57:54,315 >> AUDIÊNCIA: [inaudível]. 1072 00:57:54,315 --> 00:57:59,070 >> LUCAS: Sim, ele é chamado de pior caso tempo de execução, o que só significa que é 1073 00:57:59,070 --> 00:58:03,470 o quanto você espera que o programa para tirar a correr. 1074 00:58:03,470 --> 00:58:04,910 Como, em termos de-- 1075 00:58:04,910 --> 00:58:06,660 neste caso-- n. 1076 00:58:06,660 --> 00:58:09,150 O número de elementos na lista, no pior caso. 1077 00:58:09,150 --> 00:58:12,520 Como, no pior caso possível. 1078 00:58:12,520 --> 00:58:17,100 >> Assim, por Bubble Sort, por exemplo, temos Big O de n quadrado. 1079 00:58:17,100 --> 00:58:20,580 Por que temos que? 1080 00:58:20,580 --> 00:58:24,716 Porque é que Bubble Sort Big O n quadrado? 1081 00:58:24,716 --> 00:58:27,614 >> AUDIÊNCIA: [inaudível]. 1082 00:58:27,614 --> 00:58:35,670 >> LUCAS: Sim, então o pior caso será que eu vou ter que fazer n iterações. 1083 00:58:35,670 --> 00:58:39,260 Assim, cada uma das iterações vai traga o maior elemento para a extremidade 1084 00:58:39,260 --> 00:58:40,290 da lista. 1085 00:58:40,290 --> 00:58:44,230 Então, o pior caso é que eu tenho para fazer aquela coisa n vezes. 1086 00:58:44,230 --> 00:58:48,550 E para cada uma dessas vezes, eu tenho que fazer n swaps porque eu tenho que comparar 1087 00:58:48,550 --> 00:58:49,870 cada um de dois elementos. 1088 00:58:49,870 --> 00:58:53,730 Então é por isso que é n ao quadrado porque é n vezes n. 1089 00:58:53,730 --> 00:59:00,120 >> Em seguida, a seleção espécie também é n quadrado porque, para cada iteração, eu tenho que 1090 00:59:00,120 --> 00:59:02,650 olhar para cada elemento na lista. 1091 00:59:02,650 --> 00:59:04,980 E depois encontrar o menor, o que significa que eu tenho que 1092 00:59:04,980 --> 00:59:06,130 olhar através de n elementos. 1093 00:59:06,130 --> 00:59:11,750 E eu tenho que fazer isso n vezes porque Eu tenho que selecionar todos os elementos n. 1094 00:59:11,750 --> 00:59:18,273 >> Um tipo de inserção é também n quadrado porque o pior cenário será 1095 00:59:18,273 --> 00:59:20,950 ser, um, eu tenho que inserir n números, certo? 1096 00:59:20,950 --> 00:59:22,765 Então, eu já sei que eu vou ter n iterações. 1097 00:59:22,765 --> 00:59:25,466 1098 00:59:25,466 --> 00:59:29,840 Mas para cada um desses números, se eu tivesse a olhar para todos os números em 1099 00:59:29,840 --> 00:59:34,380 a lista ordenada e colocá-lo todo o caminho na parte dianteira, que vai ser n quadrada 1100 00:59:34,380 --> 00:59:36,230 porque vai ser n vezes n novamente. 1101 00:59:36,230 --> 00:59:38,280 Faz sentido? 1102 00:59:38,280 --> 00:59:41,512 E sobre ômega? 1103 00:59:41,512 --> 00:59:42,886 >> AUDIÊNCIA: [inaudível]. 1104 00:59:42,886 --> 00:59:44,620 >> LUCAS: É o melhor cenário. 1105 00:59:44,620 --> 00:59:48,810 Então, é como, em um monte de vezes para classificação, o melhor cenário é 1106 00:59:48,810 --> 00:59:50,660 quando a lista já está classificado. 1107 00:59:50,660 --> 00:59:52,670 Então, você realmente não tem para fazer qualquer coisa. 1108 00:59:52,670 --> 00:59:56,290 Bubble Sort tem o melhor cenário de n. 1109 00:59:56,290 --> 00:59:58,820 Vocês sabem por quê? 1110 00:59:58,820 --> 01:00:00,620 >> AUDIÊNCIA: [inaudível]. 1111 01:00:00,620 --> 01:00:05,640 >> LUCAS: Sim, se você manter o controle de se ração de dados teve quaisquer swaps ou 1112 01:00:05,640 --> 01:00:10,533 não, se você tem algo como definido para verdadeiro se houver uma iteração, se o 1113 01:00:10,533 --> 01:00:15,140 lista já está classificado, basicamente, o que vai acontecer é que eu vou 1114 01:00:15,140 --> 01:00:17,890 tentar trocar a cada dois elementos adjacentes. 1115 01:00:17,890 --> 01:00:19,920 Eu vou ver isso não há trocas. 1116 01:00:19,920 --> 01:00:21,230 E eu só retornar imediatamente. 1117 01:00:21,230 --> 01:00:24,240 >> Então, isso significa que eu tinha que percorrer a lista uma vez. 1118 01:00:24,240 --> 01:00:28,990 Então é n porque eu olho a n elementos. 1119 01:00:28,990 --> 01:00:30,930 Por seleção tipo n Square? 1120 01:00:30,930 --> 01:00:35,150 1121 01:00:35,150 --> 01:00:45,520 >> Sim, mesmo que a lista é ordenada, para cada iteração da seleção tipo, eu 1122 01:00:45,520 --> 01:00:47,590 tem que selecionar o elemento mínimo. 1123 01:00:47,590 --> 01:00:49,980 Então isso significa que eu tenho que olhar para fora em todos os elementos do indiferenciados 1124 01:00:49,980 --> 01:00:53,350 lista e encontrar o mínimo para cada iteração. 1125 01:00:53,350 --> 01:00:54,600 Será que isso faz sentido? 1126 01:00:54,600 --> 01:00:56,880 1127 01:00:56,880 --> 01:01:04,690 >> E a espada de inserção é n porque no caso que eu estou tentando inserir o 1128 01:01:04,690 --> 01:01:09,320 números e todos os números, quando eu tentar inseri-los, eu vejo que eles 1129 01:01:09,320 --> 01:01:10,510 estão na posição correcta. 1130 01:01:10,510 --> 01:01:15,120 Eu não tenho que ir verificar todos os outros números na lista de indiferenciados. 1131 01:01:15,120 --> 01:01:17,170 Então é por isso que vai ser n. 1132 01:01:17,170 --> 01:01:19,480 Faz sentido? 1133 01:01:19,480 --> 01:01:21,035 E o que é teta? 1134 01:01:21,035 --> 01:01:23,410 >> AUDIÊNCIA: [inaudível]. 1135 01:01:23,410 --> 01:01:24,380 >> LUCAS: O que, arrependido? 1136 01:01:24,380 --> 01:01:24,960 Diga isso de novo. 1137 01:01:24,960 --> 01:01:25,666 >> AUDIÊNCIA: [inaudível]. 1138 01:01:25,666 --> 01:01:26,490 >> LUCAS: Exatamente. 1139 01:01:26,490 --> 01:01:31,280 Assim você pode ver que apenas a seleção armazenado em merge sort tem tetas. 1140 01:01:31,280 --> 01:01:39,920 E isso é porque você tem apenas theta se ambos Big O e Omega são os mesmos. 1141 01:01:39,920 --> 01:01:41,520 Está bem. 1142 01:01:41,520 --> 01:01:44,210 E, finalmente, merge sort é no registo n. 1143 01:01:44,210 --> 01:01:48,910 >> E então, como Dan estava dizendo, merge sort é tipo como da mesma forma que 1144 01:01:48,910 --> 01:01:50,320 você faz a busca binária. 1145 01:01:50,320 --> 01:01:53,530 Então você começa a lista. 1146 01:01:53,530 --> 01:01:55,170 E você vai cortar pela metade. 1147 01:01:55,170 --> 01:02:00,580 E então você cortá-los em metades menores. 1148 01:02:00,580 --> 01:02:01,730 E então você fundi-los. 1149 01:02:01,730 --> 01:02:02,960 Vocês lembrar que, certo? 1150 01:02:02,960 --> 01:02:04,960 OK, como ele dizia. 1151 01:02:04,960 --> 01:02:08,330 >> OK, ponteiros. 1152 01:02:08,330 --> 01:02:11,078 Então, o que é um ponteiro? 1153 01:02:11,078 --> 01:02:12,050 >> AUDIÊNCIA: [inaudível]. 1154 01:02:12,050 --> 01:02:12,820 >> LUCAS: Um endereço. 1155 01:02:12,820 --> 01:02:13,720 Está bem. 1156 01:02:13,720 --> 01:02:18,530 Eu sei que David mostra um grupo de vídeos de Binky e coisas que apontam 1157 01:02:18,530 --> 01:02:19,080 entre si. 1158 01:02:19,080 --> 01:02:22,960 Mas eu gosto de pensar ponteiros como apenas um endereço. 1159 01:02:22,960 --> 01:02:26,110 Portanto, é uma variável que está acontecendo para armazenar um endereço. 1160 01:02:26,110 --> 01:02:31,940 >> Então é só essa variável especial que é quatro bytes de comprimento. 1161 01:02:31,940 --> 01:02:36,550 Lembre-se, esse ponteiro para qualquer coisa é sempre quatro bytes de comprimento para o nosso 32-bit 1162 01:02:36,550 --> 01:02:39,370 máquina de modo que o caso com o aparelho. 1163 01:02:39,370 --> 01:02:41,920 1164 01:02:41,920 --> 01:02:47,050 E ele só tem a localização de uma variável dentro do mesmo. 1165 01:02:47,050 --> 01:02:50,240 >> OK, então não há essa memória, basicamente. 1166 01:02:50,240 --> 01:02:57,420 Assim, cada bloco de memória, na verdade, tem um rótulo, o qual é o endereço do 1167 01:02:57,420 --> 01:02:58,890 memória slotty. 1168 01:02:58,890 --> 01:03:02,370 Então isso significa que eu posso ter um ponteiro que aponta para 1169 01:03:02,370 --> 01:03:03,380 qualquer um desses endereços. 1170 01:03:03,380 --> 01:03:09,930 Assim, a razão pela qual vamos usar ponteiros é se eu tenho que lembrar a localização 1171 01:03:09,930 --> 01:03:12,300 que uma variável específica é uma memória. 1172 01:03:12,300 --> 01:03:16,560 >> E vocês lembre-se que um dos casos foi se eu tiver uma função 1173 01:03:16,560 --> 01:03:20,820 se eu tiver realmente quero que você swap para reais, eu realmente 1174 01:03:20,820 --> 01:03:22,110 tem que enviar um ponteiro. 1175 01:03:22,110 --> 01:03:23,460 Não é a variável. 1176 01:03:23,460 --> 01:03:25,200 Vocês se lembra disso? 1177 01:03:25,200 --> 01:03:26,450 O between-- diferença 1178 01:03:26,450 --> 01:03:33,350 1179 01:03:33,350 --> 01:03:34,120 qual é o nome? 1180 01:03:34,120 --> 01:03:36,010 Chamada pelo valor e chamando por referência, certo? 1181 01:03:36,010 --> 01:03:36,840 >> OK, sim. 1182 01:03:36,840 --> 01:03:38,330 Então chame por valor. 1183 01:03:38,330 --> 01:03:43,570 Quando você acabou de enviar uma variável para funcionar você está apenas enviando um valor. 1184 01:03:43,570 --> 01:03:45,610 Então, na verdade você está enviando uma cópia da variável. 1185 01:03:45,610 --> 01:03:49,720 E o programa não poderia me importar menos sobre se a mesma variável, na verdade, 1186 01:03:49,720 --> 01:03:51,650 faz uma cópia. 1187 01:03:51,650 --> 01:03:56,330 >> E chamando por referência significa que Na verdade, estou enviando uma cópia do 1188 01:03:56,330 --> 01:03:57,550 ponteiro para essa variável. 1189 01:03:57,550 --> 01:04:00,970 Então, isso significa que eu estou enviando a localização dessa variável. 1190 01:04:00,970 --> 01:04:04,440 Então, sinto que tenho a localização do variável, quando eu chamar a função 1191 01:04:04,440 --> 01:04:09,700 com ponteiros, eu sou capaz de realmente alterar os dados que estavam no principal. 1192 01:04:09,700 --> 01:04:12,050 Faz sentido? 1193 01:04:12,050 --> 01:04:17,560 >> Embora, o ponteiro é uma cópia, a ponteiro ainda tem o endereço real de 1194 01:04:17,560 --> 01:04:20,090 a variável que eu quero mudar. 1195 01:04:20,090 --> 01:04:21,920 Faz sentido? 1196 01:04:21,920 --> 01:04:24,290 >> Assim, a criação de ponteiros. 1197 01:04:24,290 --> 01:04:28,410 Lembre-se, o ponteiro sempre do tipo que ele está apontando 1198 01:04:28,410 --> 01:04:29,890 ao e, em seguida, uma estrela. 1199 01:04:29,890 --> 01:04:31,030 E então você coloca o nome. 1200 01:04:31,030 --> 01:04:35,765 Então lembre-se que sempre que você tem qualquer que seja estrela, é como um ponteiro para 1201 01:04:35,765 --> 01:04:38,990 que qualquer que seja variável tipo que você tinha. 1202 01:04:38,990 --> 01:04:42,850 >> Então, aqui em estrela, por exemplo, é um ponteiro e de um número inteiro. 1203 01:04:42,850 --> 01:04:47,680 E depois de char estrela é um ponteiro estrela carvão animal e assim por diante. 1204 01:04:47,680 --> 01:04:47,960 Sim? 1205 01:04:47,960 --> 01:04:52,710 >> AUDIÊNCIA: E se temos uma ponteiro para n para estrelar x. 1206 01:04:52,710 --> 01:04:55,255 Sei que cria um ponteiro para x. 1207 01:04:55,255 --> 01:04:59,432 Será que ela também declarar x um número inteiro? 1208 01:04:59,432 --> 01:05:05,170 >> LUCAS: OK, então quando você diz n estrela x, você não está criando um ponteiro para uma 1209 01:05:05,170 --> 01:05:06,000 x variável. 1210 01:05:06,000 --> 01:05:08,170 Você está criando um ponteiro chamado x. 1211 01:05:08,170 --> 01:05:09,396 >> AUDIÊNCIA: [inaudível]. 1212 01:05:09,396 --> 01:05:14,250 >> LUCAS: Então, quando eu digo n estrela x, eu sou dizendo, hey, na memória, eu vou 1213 01:05:14,250 --> 01:05:16,390 conseguir uma dessas três caixas. 1214 01:05:16,390 --> 01:05:20,750 E eu vou dizer que isso vai ser x, que é 1215 01:05:20,750 --> 01:05:22,000 Vai ser um ponteiro. 1216 01:05:22,000 --> 01:05:26,860 1217 01:05:26,860 --> 01:05:30,640 E uma coisa interessante sobre ponteiros é que nós dizemos que eles têm 1218 01:05:30,640 --> 01:05:32,620 4 bytes para uma máquina de 32-bit. 1219 01:05:32,620 --> 01:05:36,320 E a razão para isso é porque 4 bytes são 32 bits. 1220 01:05:36,320 --> 01:05:40,490 >> E máquinas que são de 64 bits, na verdade, têm endereços ponteiros 1221 01:05:40,490 --> 01:05:43,480 que são de 64 bits. 1222 01:05:43,480 --> 01:05:49,820 Por isso, apenas significa que a dimensão da endereços na máquina é diferente. 1223 01:05:49,820 --> 01:05:52,270 >> Então Referenciando e Dereferencing. 1224 01:05:52,270 --> 01:05:54,310 Existem dois operadores que Vocês devem se lembrar. 1225 01:05:54,310 --> 01:05:55,450 O primeiro é comercial. 1226 01:05:55,450 --> 01:05:56,810 A segunda é estrela. 1227 01:05:56,810 --> 01:06:05,060 Não fique confuso com essa estrela e este estrela, porque lembre-se que, em 1228 01:06:05,060 --> 01:06:06,950 Neste caso, você tem n estrela. 1229 01:06:06,950 --> 01:06:08,700 >> É como uma coisa toda em conjunto. 1230 01:06:08,700 --> 01:06:10,720 Não há espaço estrela n. 1231 01:06:10,720 --> 01:06:12,070 Então, isso significa que ele é o tipo. 1232 01:06:12,070 --> 01:06:14,870 Lembre-se, que quando você tem a estrela variável, você está 1233 01:06:14,870 --> 01:06:16,230 falando sobre o tipo. 1234 01:06:16,230 --> 01:06:20,540 >> Quando você tem apenas estrelas e, em seguida, o nome da variável, isto significa que 1235 01:06:20,540 --> 01:06:24,100 você está dereferencing o ponteiro, que significa que você está olhando para o 1236 01:06:24,100 --> 01:06:28,290 ponteiro, encontrar o endereço é apontando, indo para esse endereço, 1237 01:06:28,290 --> 01:06:30,850 e olhando para sempre você tem lá. 1238 01:06:30,850 --> 01:06:34,310 Então, eu digo aos meus alunos que quando você tem estrela, você deve pensar que é 1239 01:06:34,310 --> 01:06:36,850 a abreviatura de conteúdo. 1240 01:06:36,850 --> 01:06:39,770 >> Então se você tem um ponteiro e você fazer ponteiro estrela, é o 1241 01:06:39,770 --> 01:06:41,720 o conteúdo do ponteiro. 1242 01:06:41,720 --> 01:06:44,580 Então você vai para o que ele está apontando para e olhar para o conteúdo constante. 1243 01:06:44,580 --> 01:06:47,730 E o comercial é o mesmo coisa como endereço. 1244 01:06:47,730 --> 01:06:52,560 >> Então, se eu tenho uma variável a-- como, vamos dizer que eu fiz um int igual 3-- 1245 01:06:52,560 --> 01:06:56,900 se eu quiser encontrar o endereço de que uma memória variável, eu só posso fazer 1246 01:06:56,900 --> 01:06:58,240 comercial Uma. 1247 01:06:58,240 --> 01:07:00,280 Por isso, é endereço de um. 1248 01:07:00,280 --> 01:07:01,530 Faz sentido? 1249 01:07:01,530 --> 01:07:03,790 1250 01:07:03,790 --> 01:07:05,040 >> Então, aqui está um exemplo. 1251 01:07:05,040 --> 01:07:08,370 1252 01:07:08,370 --> 01:07:11,530 Isso está faltando int b e c int. 1253 01:07:11,530 --> 01:07:16,520 Então int um é igual a 3 significa que Eu estou indo para ir para a memória. 1254 01:07:16,520 --> 01:07:19,870 E eu vou encontrar um slot e colocar o número 3 aqui. 1255 01:07:19,870 --> 01:07:22,200 >> E, em seguida, int b é igual a 4. 1256 01:07:22,200 --> 01:07:23,100 Eu vou fazer a mesma coisa. 1257 01:07:23,100 --> 01:07:25,840 Ir para a memória e colocar um número 4 em uma 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 Encontre outra caixa e colocar um número 5. 1260 01:07:29,740 --> 01:07:36,160 >> Então o que é esta linha está fazendo? n estrela pa igual a um comercial. 1261 01:07:36,160 --> 01:07:37,800 Então, em primeiro lugar, n estrela aa. 1262 01:07:37,800 --> 01:07:39,050 O que ele está fazendo? 1263 01:07:39,050 --> 01:07:40,930 1264 01:07:40,930 --> 01:07:42,298 >> AUDIÊNCIA: [inaudível]. 1265 01:07:42,298 --> 01:07:47,890 >> LUCAS: Sim, por isso n estrela pa, em primeiro lugar, declara um ponteiro chamado pa. 1266 01:07:47,890 --> 01:07:53,720 E então ele está atribuindo o valor de ponteiro que pode ser o endereço de um. 1267 01:07:53,720 --> 01:07:55,790 Então comercial Uma. 1268 01:07:55,790 --> 01:07:58,510 Então, se eu fizer estrela pb, o que é uma 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 Isso também está em falta. n estrela pb. 1272 01:08:06,330 --> 01:08:07,905 Quero dizer estrela pc. 1273 01:08:07,905 --> 01:08:11,200 Eu sinto muito. 1274 01:08:11,200 --> 01:08:11,940 É a mesma coisa. 1275 01:08:11,940 --> 01:08:16,408 Mas agora eu sou bom ar criando um ponteiro para B e, em seguida, um ponteiro para c. 1276 01:08:16,408 --> 01:08:16,886 Sim? 1277 01:08:16,886 --> 01:08:18,136 >> AUDIÊNCIA: [inaudível]? 1278 01:08:18,136 --> 01:08:25,490 1279 01:08:25,490 --> 01:08:26,670 >> LUCAS: Sim. 1280 01:08:26,670 --> 01:08:32,630 Então, se você vai para a memória e você vai para a caixa que é designador para aa, 1281 01:08:32,630 --> 01:08:37,149 você está realmente indo para veja o endereço de um. 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 Sim? 1285 01:08:43,300 --> 01:08:45,605 >> AUDIÊNCIA: [inaudível]? 1286 01:08:45,605 --> 01:08:49,260 >> LUCAS: Sim, ponteiro é um endereço. 1287 01:08:49,260 --> 01:08:50,120 Nunca se esqueça disso. 1288 01:08:50,120 --> 01:08:52,800 É como o mais importante parte sobre ponteiros. 1289 01:08:52,800 --> 01:08:56,180 Há armazenar e endereço a alguma variável. 1290 01:08:56,180 --> 01:08:56,890 Algo mais? 1291 01:08:56,890 --> 01:08:58,370 Alguma outra pergunta? 1292 01:08:58,370 --> 01:08:59,189 Está bem. 1293 01:08:59,189 --> 01:09:00,399 >> Então Ponteiros e matrizes. 1294 01:09:00,399 --> 01:09:08,189 Lembre-se que quando eu faço int matriz 3, Basicamente, o que eu estou fazendo é que eu sou, tipo 1295 01:09:08,189 --> 01:09:12,779 de, declarando em um ponteiro. 1296 01:09:12,779 --> 01:09:18,960 Então matriz é tipo como um ponteiro para um lugar específico na memória em que eu 1297 01:09:18,960 --> 01:09:21,999 alocados três slots para inteiros. 1298 01:09:21,999 --> 01:09:23,430 Será que isso faz sentido? 1299 01:09:23,430 --> 01:09:30,250 >> Então, quando eu faço int matriz 3, o que eu sou fazendo, basicamente, é a criação de três 1300 01:09:30,250 --> 01:09:31,479 slots de memória. 1301 01:09:31,479 --> 01:09:33,899 Então, eu só encontrar três slots de memória. 1302 01:09:33,899 --> 01:09:38,810 Então, se eu fizer isso, então, um conjunto de estrelas, basicamente, o conteúdo do array, 1303 01:09:38,810 --> 01:09:46,180 o que significa que eu apagar o ponteiro, eu vou para aquele lugar que ele está apontando para, 1304 01:09:46,180 --> 01:09:47,939 e eu coloquei o número um. 1305 01:09:47,939 --> 01:09:53,729 >> E depois, se eu fizer matriz estrela mais 1, isso é a mesma coisa que fazer matriz 1306 01:09:53,729 --> 01:09:59,690 colchetes um, o que significa apenas que eu vá para o lugar que ela está apontando. 1307 01:09:59,690 --> 01:10:03,000 E então a mais um marcas me deslocar uma posição. 1308 01:10:03,000 --> 01:10:06,510 Então eu vou para essa posição, na verdade, e colocar o número dois. 1309 01:10:06,510 --> 01:10:10,900 >> E então, finalmente, quando eu faço matriz mais dois, eu vou para onde 1310 01:10:10,900 --> 01:10:11,825 apontador de matriz no. 1311 01:10:11,825 --> 01:10:14,690 E então eu passo para os blocos de memória. 1312 01:10:14,690 --> 01:10:16,240 E então eu coloquei o número três aqui. 1313 01:10:16,240 --> 01:10:16,600 Sim? 1314 01:10:16,600 --> 01:10:21,400 >> AUDIÊNCIA: array Assim estrela é simplesmente dizendo que o primeiro ponto. 1315 01:10:21,400 --> 01:10:25,090 E você pode adicionar um, só porque estamos realmente só 1316 01:10:25,090 --> 01:10:27,295 referenciar que primeiro endereço. 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, dizer 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 estou dizendo, por que você faz 0, 1, 2, 3, em vez de 1, 2, 3? 1322 01:10:42,790 --> 01:10:46,550 Uma das razões é, um, computador programadores preferem começar 1323 01:10:46,550 --> 01:10:47,750 contando a partir de 0. 1324 01:10:47,750 --> 01:10:52,370 Dois é porque quando você faz matriz 0, é a mesma coisa que fazer matriz 1325 01:10:52,370 --> 01:10:56,330 plus 0, o que significa que eu vá para essa posição, e eu não 1326 01:10:56,330 --> 01:10:59,320 ignorar quaisquer blocos de memória. 1327 01:10:59,320 --> 01:11:01,750 Então eu não mover todos os blocos de memória. 1328 01:11:01,750 --> 01:11:02,015 Sim? 1329 01:11:02,015 --> 01:11:03,265 >> AUDIÊNCIA: [inaudível]? 1330 01:11:03,265 --> 01:11:05,928 1331 01:11:05,928 --> 01:11:12,670 >> LUCAS: Então ela está perguntando o que é a diferença entre fazer 1332 01:11:12,670 --> 01:11:14,000 este ou fazendo malloc. 1333 01:11:14,000 --> 01:11:17,550 Uma das diferenças é que int matriz 3 é a criação de um 1334 01:11:17,550 --> 01:11:19,260 matriz na pilha. 1335 01:11:19,260 --> 01:11:23,080 E quando eu faço malloc, que cria na pilha. 1336 01:11:23,080 --> 01:11:25,250 Será que isso faz sentido? 1337 01:11:25,250 --> 01:11:28,870 >> Então como é que malloc realmente funciona? 1338 01:11:28,870 --> 01:11:32,245 Então, por que ainda precisa usar malloc? 1339 01:11:32,245 --> 01:11:35,730 1340 01:11:35,730 --> 01:11:39,700 Seu tipo de compilador descobre tudo as variáveis ​​que você declarou. 1341 01:11:39,700 --> 01:11:44,040 E ele cria espaço para todos deles na pilha. 1342 01:11:44,040 --> 01:11:47,180 Assim, todas as suas variáveis ​​vão estar em algum lugar na pilha. 1343 01:11:47,180 --> 01:11:49,460 Então aqui está as variáveis ​​de ambiente. 1344 01:11:49,460 --> 01:11:53,850 >> Então, basicamente, o espaço para as variáveis em memória é alocada em 1345 01:11:53,850 --> 01:11:55,080 tempo de compilação. 1346 01:11:55,080 --> 01:11:58,790 Então, isso significa que seu computador tem saber todas essas variáveis 1347 01:11:58,790 --> 01:11:59,790 antemão. 1348 01:11:59,790 --> 01:12:02,500 Ele não precisa saber qual o valor que você está indo para colocar neles. 1349 01:12:02,500 --> 01:12:05,490 Mas é preciso saber como quantidade de memória que você precisa. 1350 01:12:05,490 --> 01:12:09,380 >> Mas agora vamos dizer que, por exemplo, você está criando uma matriz ou tomar um 1351 01:12:09,380 --> 01:12:13,430 string que você está tomando a partir do utilizador. 1352 01:12:13,430 --> 01:12:17,300 Você não sabe quanto tempo a corda vai ser, por exemplo. 1353 01:12:17,300 --> 01:12:20,600 Então você não sabe exatamente quantos blocos de memória que você alocar, certo? 1354 01:12:20,600 --> 01:12:24,120 >> Por isso, não faz muito sentido para você quer dizer colocar 100 caracteres. 1355 01:12:24,120 --> 01:12:26,420 E então o que se o usuário escreve 150? 1356 01:12:26,420 --> 01:12:27,670 Você vai ser parafusado. 1357 01:12:27,670 --> 01:12:30,160 1358 01:12:30,160 --> 01:12:34,620 >> Então, basicamente, você não pode ter certeza de como quantidade de memória que você precisa alocar 1359 01:12:34,620 --> 01:12:35,960 quando você compilar o programa. 1360 01:12:35,960 --> 01:12:38,240 Você só sabe que, em tempo de execução. 1361 01:12:38,240 --> 01:12:39,950 É por isso que você tem a pilha. 1362 01:12:39,950 --> 01:12:47,610 Assim, a pilha vai ter memória que você está alocando durante o 1363 01:12:47,610 --> 01:12:50,810 duração do programa em execução. 1364 01:12:50,810 --> 01:12:55,780 >> Então, basicamente, quando você faz malloc, o que você está fazendo é a alocação de memória em 1365 01:12:55,780 --> 01:13:00,160 tempo de execução, o que significa que você está decidir naquele momento que você 1366 01:13:00,160 --> 01:13:02,670 deve ter essa memória. 1367 01:13:02,670 --> 01:13:04,210 Então é isso, quando você está atribuição. 1368 01:13:04,210 --> 01:13:06,430 Será que isso faz sentido? 1369 01:13:06,430 --> 01:13:11,690 >> Então lembre-se, a pilha tem variáveis que são criados em tempo de compilação. 1370 01:13:11,690 --> 01:13:14,560 E então, o monte tem variáveis que são criados como você vai 1371 01:13:14,560 --> 01:13:15,600 com malloc, por exemplo. 1372 01:13:15,600 --> 01:13:16,850 >> AUDIÊNCIA: [inaudível]? 1373 01:13:16,850 --> 01:13:19,179 1374 01:13:19,179 --> 01:13:24,340 >> LUCAS: Então é GetString vai chamar malloc. 1375 01:13:24,340 --> 01:13:26,710 Deixe-me falar sobre malloc, e Vou explicar GetString. 1376 01:13:26,710 --> 01:13:32,000 Então malloc é a mesma coisa como alocação de memória. 1377 01:13:32,000 --> 01:13:34,600 Por isso, vai alocar memória no heap. 1378 01:13:34,600 --> 01:13:40,010 E ele vai retornar um ponteiro para onde essa memória foi alocada no. 1379 01:13:40,010 --> 01:13:43,090 >> Então, quando você fazer-- 1380 01:13:43,090 --> 01:13:44,910 aqui para example-- 1381 01:13:44,910 --> 01:13:45,830 n ponteiro estrela. 1382 01:13:45,830 --> 01:13:50,520 E então ponteiro igual malloc tamanho de 10 polegadas vezes. 1383 01:13:50,520 --> 01:13:52,110 Estou criando um ponteiro. 1384 01:13:52,110 --> 01:13:59,020 E então eu estou atribuindo esse ponteiro para o valor do apontador que malloc 1385 01:13:59,020 --> 01:13:59,680 está me dando. 1386 01:13:59,680 --> 01:14:04,150 >> Então eu estou pedindo malloc você pode alocar espaço para 10 inteiros. 1387 01:14:04,150 --> 01:14:05,390 Isso é o que ele está dizendo. 1388 01:14:05,390 --> 01:14:09,020 E malloc me dá de volta a ponteiro para aquele lugar. 1389 01:14:09,020 --> 01:14:11,460 Faz sentido? 1390 01:14:11,460 --> 01:14:12,270 Está bem. 1391 01:14:12,270 --> 01:14:17,940 Eu E GetString é, basicamente, fazer um chamar a malloc para que possa alocar 1392 01:14:17,940 --> 01:14:21,680 memória durante a execução. 1393 01:14:21,680 --> 01:14:26,460 >> Lembre-se sempre de verificar a nulidade porque malloc vai retornar nulo 1394 01:14:26,460 --> 01:14:28,200 se não é possível alocar memória. 1395 01:14:28,200 --> 01:14:31,660 Vamos dizer que você pedir um ridículo quantidade de memória. 1396 01:14:31,660 --> 01:14:33,950 Seu computador não vai ser capaz de alocar muito. 1397 01:14:33,950 --> 01:14:36,410 >> Então malloc é só ir para retornar null. 1398 01:14:36,410 --> 01:14:42,210 Então lembre-se sempre de verificar se o ponteiro que você tem de malloc é 1399 01:14:42,210 --> 01:14:45,640 nulo ou não, porque, se for, você pode ser referência um ponteiro e 1400 01:14:45,640 --> 01:14:48,340 provocando falhas laterais. 1401 01:14:48,340 --> 01:14:50,930 E, finalmente, não se esqueça sua memória livre. 1402 01:14:50,930 --> 01:14:57,800 1403 01:14:57,800 --> 01:15:00,560 >> Malloc é a criação de memória no heap. 1404 01:15:00,560 --> 01:15:03,436 E você tem que liberar a memória antes de o programa terminar. 1405 01:15:03,436 --> 01:15:05,370 OK, isso é tudo para mim. 1406 01:15:05,370 --> 01:15:07,900 Desculpe, Rob. 1407 01:15:07,900 --> 01:15:07,950 Obrigado. 1408 01:15:07,950 --> 01:15:09,878 >> [Aplausos] 1409 01:15:09,878 --> 01:15:12,679 >> LUCAS: Todas as últimas perguntas antes de Rob vem? 1410 01:15:12,679 --> 01:15:13,138 Não? 1411 01:15:13,138 --> 01:15:13,597 Sim? 1412 01:15:13,597 --> 01:15:15,892 >> AUDIÊNCIA: Eu não vi este online. 1413 01:15:15,892 --> 01:15:17,269 Você carregou-o ainda? 1414 01:15:17,269 --> 01:15:19,106 >> LUCAS: Eu acho que Dave é carregá-lo em breve. 1415 01:15:19,106 --> 01:15:19,880 >> DAVE: Vai ser lançado. 1416 01:15:19,880 --> 01:15:20,310 >> LUCAS: Ele vai ficar online. 1417 01:15:20,310 --> 01:15:21,175 >> AUDIÊNCIA: É-se. 1418 01:15:21,175 --> 01:15:22,090 >> LUCAS: É-se? 1419 01:15:22,090 --> 01:15:23,157 Está bem. 1420 01:15:23,157 --> 01:15:23,644 Sim? 1421 01:15:23,644 --> 01:15:27,053 >> AUDIÊNCIA: [inaudível]? 1422 01:15:27,053 --> 01:15:30,285 >> LUCAS: Sim, você deve liberar todo o memória que é colocado na pilha. 1423 01:15:30,285 --> 01:15:31,535 >> AUDIÊNCIA: [inaudível]? 1424 01:15:31,535 --> 01:15:34,518 1425 01:15:34,518 --> 01:15:36,160 >> LUCAS: Sim. 1426 01:15:36,160 --> 01:15:39,980 Toda vez que você tem um malloc cultura, você deve ter uma cultura livre 1427 01:15:39,980 --> 01:15:42,640 depois que você parar de usar essa variável. 1428 01:15:42,640 --> 01:15:44,800 Então malloc e free são sempre juntos. 1429 01:15:44,800 --> 01:15:45,410 Seus melhores amigos. 1430 01:15:45,410 --> 01:15:46,720 Sim. 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: Eu vou rapidamente. 1434 01:15:56,850 --> 01:16:00,466 E também o vídeo será colocado. 1435 01:16:00,466 --> 01:16:01,716 Eu tenho o microfone ligado. 1436 01:16:01,716 --> 01:16:24,060 1437 01:16:24,060 --> 01:16:26,230 >> OK, então semana de cinco coisas. 1438 01:16:26,230 --> 01:16:27,970 A primeira coisa que temos é a pilha. 1439 01:16:27,970 --> 01:16:33,390 Então lembre-se que só há uma pilha quadro por chamada de função ativa. 1440 01:16:33,390 --> 01:16:34,710 Vamos ver isso em um segundo. 1441 01:16:34,710 --> 01:16:37,850 E também me lembro do que realmente se passa em cada quadro de pilha vão ser 1442 01:16:37,850 --> 01:16:41,880 as variáveis ​​locais de nossas funções, os argumentos que são passados ​​para o nosso 1443 01:16:41,880 --> 01:16:43,880 funções, juntamente com um par outras coisas que você realmente não 1444 01:16:43,880 --> 01:16:45,260 precisa se preocupar. 1445 01:16:45,260 --> 01:16:50,950 >> Então aqui está um 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 voltar a valor de bar 4 vírgula 6. 1448 01:16:57,930 --> 01:17:02,380 E bar vai definir alguns locais n variável igual a 4 vezes 6. 1449 01:17:02,380 --> 01:17:03,920 E em seguida, retornar n. 1450 01:17:03,920 --> 01:17:09,130 >> Então, vamos olhar para a pilha todo a iteração atual do programa. 1451 01:17:09,130 --> 01:17:10,500 Portanto, há o fundo da nossa stack. 1452 01:17:10,500 --> 01:17:12,620 Lembre-se de que a pilha crescer. 1453 01:17:12,620 --> 01:17:15,370 Assim, na parte inferior da nossa pilha, tem um quadro de pilha para o principal. 1454 01:17:15,370 --> 01:17:17,000 Quando o programa começa, principal sempre vai estar no 1455 01:17:17,000 --> 01:17:18,560 inferior da nossa pilha. 1456 01:17:18,560 --> 01:17:20,880 >> E o que está dentro do nosso empilhar quadro para principal? 1457 01:17:20,880 --> 01:17:23,810 Assim, mesmo que não existam locais variáveis ​​a principal, como eu disse antes, 1458 01:17:23,810 --> 01:17:29,670 temos argc e rgv ocupando espaço dentro do quadro principal de pilha. 1459 01:17:29,670 --> 01:17:33,260 Então principal agora vai chamando a função foo. 1460 01:17:33,260 --> 01:17:35,125 E isso significa que foo vai obter o seu próprio quadro de pilha. 1461 01:17:35,125 --> 01:17:36,970 >> Portanto, agora estamos dentro de a função foo. 1462 01:17:36,970 --> 01:17:38,610 E o que precisa para ir em quadro de pilha do foo? 1463 01:17:38,610 --> 01:17:41,100 Bem, foo tem um argumento n. 1464 01:17:41,100 --> 01:17:45,440 E n é igual a 4, pois isso é o que principal é passar como argumento de foo. 1465 01:17:45,440 --> 01:17:48,490 >> Então agora foo vai chamar bar. 1466 01:17:48,490 --> 01:17:52,070 O que é bar vai ter dentro de seu 'quadro de pilha? 1467 01:17:52,070 --> 01:17:55,610 Tem igual a 4 x y igual a seis. 1468 01:17:55,610 --> 01:17:58,540 Isso não é tudo o que nós vamos ter no quadro de pilha porque bar 1469 01:17:58,540 --> 01:18:00,580 tem também uma variável local n. 1470 01:18:00,580 --> 01:18:03,370 E n vamos definir igual a 24. 1471 01:18:03,370 --> 01:18:05,750 >> Então agora bar vai voltar n. 1472 01:18:05,750 --> 01:18:09,300 Então bar está retornando 24 a o foo quadro de pilha. 1473 01:18:09,300 --> 01:18:12,560 E porque é agora barra de retorno, que significa que estamos estourando o quadro de pilha 1474 01:18:12,560 --> 01:18:14,250 para fora da barra da pilha. 1475 01:18:14,250 --> 01:18:18,430 Assim, toda a memória que bar tinha sido usando é agora fora da pilha. 1476 01:18:18,430 --> 01:18:21,550 >> Agora, foo também vai para retornar 24 a principal. 1477 01:18:21,550 --> 01:18:25,470 Portanto, agora que foo está retornando, a memória foo que estava usando em sua ' 1478 01:18:25,470 --> 01:18:27,550 quadro de pilha também 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ão printf é apenas uma outra função. 1481 01:18:31,660 --> 01:18:35,320 Quando chamamos printf, que vai ser outro quadro de pilha para o printf 1482 01:18:35,320 --> 01:18:36,470 chamada de função. 1483 01:18:36,470 --> 01:18:37,990 >> O que estamos passando printf? 1484 01:18:37,990 --> 01:18:40,090 Isso é o que está indo para ir em seu quadro de pilha. 1485 01:18:40,090 --> 01:18:44,970 No mínimo, estamos passando que por cento i barra invertida n e 1486 01:18:44,970 --> 01:18:47,180 o argumento 24. 1487 01:18:47,180 --> 01:18:50,370 Poderia ter mais em sua estrutura de pilha se printf acontece a estar usando algum 1488 01:18:50,370 --> 01:18:51,200 variáveis ​​locais. 1489 01:18:51,200 --> 01:18:51,920 Nós não sabemos. 1490 01:18:51,920 --> 01:18:53,810 >> Mas tudo o que acontece no printf do empilhar quadro. 1491 01:18:53,810 --> 01:18:55,740 Vai executar o printf. 1492 01:18:55,740 --> 01:18:56,830 Então printf é feito. 1493 01:18:56,830 --> 01:18:57,820 Ele irá retornar. 1494 01:18:57,820 --> 01:18:58,960 Finalmente, o principal está feito. 1495 01:18:58,960 --> 01:18:59,860 Principal voltará. 1496 01:18:59,860 --> 01:19:02,020 E então o nosso programa é feito. 1497 01:19:02,020 --> 01:19:02,480 Sim? 1498 01:19:02,480 --> 01:19:04,505 >> AUDIÊNCIA: Você 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ão há uma diferença sutil entre argumentos e parâmetros. 1502 01:19:09,970 --> 01:19:14,400 E realmente, no falar comum, as pessoas tendem apenas para misturá-los o tempo todo. 1503 01:19:14,400 --> 01:19:17,550 Mas parâmetros são os formais nome das coisas. 1504 01:19:17,550 --> 01:19:20,180 >> Então argc e argv são o parâmetros para principal. 1505 01:19:20,180 --> 01:19:23,440 Os argumentos são o que você realmente passar como esses parâmetros. 1506 01:19:23,440 --> 01:19:28,340 Então lá quando eu chamar foo de 4, 4 é o argumento que eu estou passando. 1507 01:19:28,340 --> 01:19:31,460 E o parâmetro n, dentro de foo, assume 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 >> AUDIÊNCIA: [inaudível]? 1510 01:19:35,826 --> 01:19:37,880 >> ROB: n é uma variável local para barrar. 1511 01:19:37,880 --> 01:19:41,420 1512 01:19:41,420 --> 01:19:44,960 n ainda é local para foo, mas é um parâmetro para foo. 1513 01:19:44,960 --> 01:19:48,190 Não é uma variável local. 1514 01:19:48,190 --> 01:19:48,546 Sim? 1515 01:19:48,546 --> 01:19:51,180 >> AUDIÊNCIA: [inaudível]? 1516 01:19:51,180 --> 01:19:55,400 >> ROB: foo bar é apenas chamar e retornando Whatever Bar retornos. 1517 01:19:55,400 --> 01:19:56,786 >> AUDIÊNCIA: [inaudível]? 1518 01:19:56,786 --> 01:19:59,591 >> ROB: Sim, só para ver múltipla empilhar quadros. 1519 01:19:59,591 --> 01:20:00,082 Sim? 1520 01:20:00,082 --> 01:20:03,519 >> AUDIÊNCIA: Por foo foi chamado 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ão, eu poderia ter, em vez disso, fez algo como int x é igual a foo de 4 1523 01:20:10,740 --> 01:20:12,980 e, em seguida, impresso x. 1524 01:20:12,980 --> 01:20:17,900 Mas em vez disso, eu combinei a função chamar o argumento de printf. 1525 01:20:17,900 --> 01:20:23,670 >> Mas note que não podemos, na verdade, executar a chamada para printf até nós 1526 01:20:23,670 --> 01:20:25,610 descobrir o que foo de 4 é. 1527 01:20:25,610 --> 01:20:27,480 Então nós vamos avaliar isso. 1528 01:20:27,480 --> 01:20:32,504 E só uma vez feito isso vai para voltar e avaliar isso. 1529 01:20:32,504 --> 01:20:32,990 Sim? 1530 01:20:32,990 --> 01:20:37,364 >> AUDIÊNCIA: Uma vez que tanto bar [inaudível] 1531 01:20:37,364 --> 01:20:41,738 valor, por que não tem [inaudível]? 1532 01:20:41,738 --> 01:20:44,400 >> ROB: Eles devem ser totalmente int. 1533 01:20:44,400 --> 01:20:46,260 Isso não foi capturado mais vários passes. 1534 01:20:46,260 --> 01:20:49,010 Assim deve ser int bar e int foo uma vez que ambos os 1535 01:20:49,010 --> 01:20:50,460 estão retornando inteiros. 1536 01:20:50,460 --> 01:20:54,214 Vazio é somente se eles não vão para retornar os valores reais. 1537 01:20:54,214 --> 01:20:54,692 Sim? 1538 01:20:54,692 --> 01:20:58,038 >> AUDIÊNCIA: Se você tivesse uma linha acima o retorno, [inaudível]? 1539 01:20:58,038 --> 01:21:01,862 1540 01:21:01,862 --> 01:21:03,730 >> ROB: A linha de cima do retorno? 1541 01:21:03,730 --> 01:21:04,410 >> AUDIÊNCIA: Yeah. 1542 01:21:04,410 --> 01:21:10,780 Como se você fez printf e [inaudível], seria imprimir duas vezes? 1543 01:21:10,780 --> 01:21:12,992 >> ROB: Então, dentro de foo? 1544 01:21:12,992 --> 01:21:15,945 Se tivéssemos um printf aqui? 1545 01:21:15,945 --> 01:21:16,750 >> AUDIÊNCIA: Yeah. 1546 01:21:16,750 --> 01:21:19,510 >> ROB: Então, se nós tivéssemos um direito printf aqui, seria imprimir uma vez. 1547 01:21:19,510 --> 01:21:23,400 Uma vez que estamos chamando foo uma vez direito aqui, então vamos acertar o printf. 1548 01:21:23,400 --> 01:21:24,620 Então vamos chamá-bar. 1549 01:21:24,620 --> 01:21:25,710 E então foo vai voltar. 1550 01:21:25,710 --> 01:21:26,275 E é isso. 1551 01:21:26,275 --> 01:21:30,985 Nós só encontrar sempre printf uma vez. 1552 01:21:30,985 --> 01:21:31,482 Sim? 1553 01:21:31,482 --> 01:21:32,973 >> AUDIÊNCIA: [inaudível] 1554 01:21:32,973 --> 01:21:37,950 printf chamar foo porque estamos em primeiro lugar chamando printf e depois vamos passar 1555 01:21:37,950 --> 01:21:38,580 os argumentos. 1556 01:21:38,580 --> 01:21:40,960 >> ROB: Então, em teoria, não é printf chamar foo? 1557 01:21:40,960 --> 01:21:42,220 Então, não. 1558 01:21:42,220 --> 01:21:47,360 Apenas a fim de que c vai executar essas coisas é, antes que pudermos 1559 01:21:47,360 --> 01:21:49,800 chamar uma função, todos os argumentos para a função precisa 1560 01:21:49,800 --> 01:21:51,600 ser completamente avaliada. 1561 01:21:51,600 --> 01:21:53,540 Então é isso completamente avaliado? 1562 01:21:53,540 --> 01:21:54,610 Sim, ele é apenas um fio. 1563 01:21:54,610 --> 01:21:55,480 É apenas um valor. 1564 01:21:55,480 --> 01:21:57,200 >> Então nós temos que completamente avaliar isso. 1565 01:21:57,200 --> 01:21:59,720 Uma vez feito isso, agora todos seus argumentos são avaliados. 1566 01:21:59,720 --> 01:22:01,982 E agora nós podemos fazer a chamar para printf. 1567 01:22:01,982 --> 01:22:02,478 Sim? 1568 01:22:02,478 --> 01:22:03,966 >> AUDIÊNCIA: Uma pergunta. 1569 01:22:03,966 --> 01:22:06,942 Se você tem uma função void, deve você tem retorno ponto e vírgula? 1570 01:22:06,942 --> 01:22:09,910 >> ROB: Você não faz um ponto e vírgula retorno se você tem uma função void. 1571 01:22:09,910 --> 01:22:13,370 1572 01:22:13,370 --> 01:22:14,780 Está bem. 1573 01:22:14,780 --> 01:22:15,830 Então, agora algumas coisas heap. 1574 01:22:15,830 --> 01:22:19,640 Então pilha é como vamos lidar com o gerenciamento de memória dinâmica. 1575 01:22:19,640 --> 01:22:23,100 E isso contrasta diretamente com o pilha que poderíamos chamar de automático 1576 01:22:23,100 --> 01:22:24,100 gerenciamento de memória. 1577 01:22:24,100 --> 01:22:27,140 >> Então na pilha, você nunca tem para lidar com a forma como as variáveis ​​locais 1578 01:22:27,140 --> 01:22:30,400 estão a ser empurrados e bateu fora tudo esses quadros de pilha e todas essas coisas. 1579 01:22:30,400 --> 01:22:31,070 Você não tem que se preocupar com isso. 1580 01:22:31,070 --> 01:22:32,070 É automático. 1581 01:22:32,070 --> 01:22:36,990 Assim, a pilha é manual. 1582 01:22:36,990 --> 01:22:38,070 E o [inaudível] 1583 01:22:38,070 --> 01:22:41,260 vem destas funções malloc e free. 1584 01:22:41,260 --> 01:22:43,550 >> Então aqui está um outro programa. 1585 01:22:43,550 --> 01:22:47,145 Tudo o que estamos fazendo é mallocing um inteiro. 1586 01:22:47,145 --> 01:22:49,360 Nós estamos armazenando-o em estrela x. 1587 01:22:49,360 --> 01:22:52,520 Naturalmente, temos de verificar para ver se x é nulo. 1588 01:22:52,520 --> 01:22:56,400 Então vamos apenas definir o que x está apontando para a 50. 1589 01:22:56,400 --> 01:23:00,350 1590 01:23:00,350 --> 01:23:03,260 Imprima o que está apontando para x, print x, e depois livre x. 1591 01:23:03,260 --> 01:23:08,920 >> Então, como é que isso realmente vai olhar se olharmos para a nossa pilha e pilha? 1592 01:23:08,920 --> 01:23:10,950 Então, vamos começar de novo. 1593 01:23:10,950 --> 01:23:12,580 A parte inferior da nossa pilha como antes. 1594 01:23:12,580 --> 01:23:15,930 Lembre-se que te amontoar diretamente opõe-se a pilha de? 1595 01:23:15,930 --> 01:23:18,850 Então, nós vamos ter o topo da nossa pilha lá em cima. 1596 01:23:18,850 --> 01:23:22,590 >> Assim, o fundo da pilha a, temos nosso quadro de pilha para o principal. 1597 01:23:22,590 --> 01:23:28,000 Ele tem o espaço para argc, argv, e nós Agora temos uma variável x local, que 1598 01:23:28,000 --> 01:23:30,030 é uma estrela int. 1599 01:23:30,030 --> 01:23:32,240 Então, vamos fazer uma iteração através deste programa. 1600 01:23:32,240 --> 01:23:34,420 A primeira coisa que temos é uma chamada para malloc. 1601 01:23:34,420 --> 01:23:36,250 >> Então, nós estamos fazendo uma chamada para malloc. 1602 01:23:36,250 --> 01:23:37,100 Malloc é uma função. 1603 01:23:37,100 --> 01:23:38,770 Vai chegar um quadro de pilha. 1604 01:23:38,770 --> 01:23:40,180 O que estamos passando para malloc? 1605 01:23:40,180 --> 01:23:41,610 Isso vai entrar do quadro de pilha. 1606 01:23:41,610 --> 01:23:45,130 Estamos passando tamanho de n, que é 4. 1607 01:23:45,130 --> 01:23:49,700 Então, que é passado para malloc. 1608 01:23:49,700 --> 01:23:50,910 >> O que malloc fazer? 1609 01:23:50,910 --> 01:23:53,820 Ele agarra-nos algum espaço no heap. 1610 01:23:53,820 --> 01:23:55,320 Então, nós estamos indo para ir para a pilha. 1611 01:23:55,320 --> 01:23:57,990 E nós vamos pegar 4 bytes da pilha. 1612 01:23:57,990 --> 01:24:01,500 Então vamos dar esse um endereço arbitrários. 1613 01:24:01,500 --> 01:24:06,680 0x123 Basta fingir que é um endereço que está na pilha. 1614 01:24:06,680 --> 01:24:12,300 >> Então, o que na verdade está dentro desse região de memória no endereço Ox123? 1615 01:24:12,300 --> 01:24:13,080 Garbage. 1616 01:24:13,080 --> 01:24:15,270 Então, nós não memorizou nada nele. 1617 01:24:15,270 --> 01:24:18,830 Assim, tanto quanto sabemos, Poderia ser qualquer coisa. 1618 01:24:18,830 --> 01:24:20,560 Você não deve assumir que é zero. 1619 01:24:20,560 --> 01:24:23,870 É mais provável que não seja zero. 1620 01:24:23,870 --> 01:24:26,260 >> Retornos Então agora malloc. 1621 01:24:26,260 --> 01:24:28,020 E o que fazemos quando malloc retorna? 1622 01:24:28,020 --> 01:24:29,800 Montamos o que ele retorna. 1623 01:24:29,800 --> 01:24:32,290 Montamos x iguais ao que ele está retornando. 1624 01:24:32,290 --> 01:24:33,690 Então o que é o retorno? 1625 01:24:33,690 --> 01:24:38,150 Ele está retornando 0x123 vez que é a endereço do bloco de memória que 1626 01:24:38,150 --> 01:24:40,850 apenas alocado no heap. 1627 01:24:40,850 --> 01:24:47,160 >> Então retorne 0x123 x agora vai ser definido igual a 0x123 que, pictoricamente, 1628 01:24:47,160 --> 01:24:52,940 nós freqüentemente desenhar como x tendo um real seta que aponta para esse bloco. 1629 01:24:52,940 --> 01:24:55,820 Mas x é apenas armazenar esse endereço. 1630 01:24:55,820 --> 01:24:58,670 Então, agora nós temos que verificar se x é nulo. 1631 01:24:58,670 --> 01:24:59,120 Não é nulo. 1632 01:24:59,120 --> 01:25:02,170 Fingimos que malloc que conseguiu. 1633 01:25:02,170 --> 01:25:04,950 >> Então, agora estrela x é igual a 50. 1634 01:25:04,950 --> 01:25:08,450 Assim estrela lembra que significa ir para esse endereço. 1635 01:25:08,450 --> 01:25:12,700 Então 0x123 Vamos ir para esse endereço. 1636 01:25:12,700 --> 01:25:14,660 Então, isso nos leva até lá. 1637 01:25:14,660 --> 01:25:16,310 O que estamos fazendo nesse endereço? 1638 01:25:16,310 --> 01:25:19,020 Nós estamos armazenando 50. 1639 01:25:19,020 --> 01:25:22,500 >> Assim, após essa linha, que é o que as coisas estão indo para parecer. 1640 01:25:22,500 --> 01:25:24,640 Então, agora ele não é mais lixo lá em cima. 1641 01:25:24,640 --> 01:25:28,910 Agora sabemos que 50 é em que endereço particular porque 1642 01:25:28,910 --> 01:25:32,410 nós configurá-lo para isso. 1643 01:25:32,410 --> 01:25:32,790 Ok? 1644 01:25:32,790 --> 01:25:34,370 Então agora vamos imprimir f. 1645 01:25:34,370 --> 01:25:38,490 >> Então, primeiro vamos para imprimir estrela x. 1646 01:25:38,490 --> 01:25:39,640 Então, qual é estrela x? 1647 01:25:39,640 --> 01:25:44,300 Mais uma vez, a estrela x significa ir para a coisa que x está apontando. 1648 01:25:44,300 --> 01:25:47,140 Então x é armazenar 0x123 Vá para isso. 1649 01:25:47,140 --> 01:25:48,490 Ficamos com 50. 1650 01:25:48,490 --> 01:25:50,540 Assim que imprimir f. 1651 01:25:50,540 --> 01:25:54,900 E isso significa que ele vai imprimir 50. 1652 01:25:54,900 --> 01:25:56,850 E depois que retorna. 1653 01:25:56,850 --> 01:25:58,340 >> E depois 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 você ainda não viu, essa é apenas como você imprimir um ponteiro. 1656 01:26:01,680 --> 01:26:04,960 Portanto, temos por cento i, cento f, e todos aqueles já. 1657 01:26:04,960 --> 01:26:07,160 Então por cento p, imprimir um ponteiro. 1658 01:26:07,160 --> 01:26:08,920 >> Então x é um ponteiro. 1659 01:26:08,920 --> 01:26:13,440 Então, se nós estamos indo para imprimir x si, estamos imprimindo o que na verdade está dentro 1660 01:26:13,440 --> 01:26:19,220 x, o qual é 0x123 Assim, o primeiro print f vai imprimir 50. 1661 01:26:19,220 --> 01:26:23,620 A segunda impressão f vai para imprimir 0x123 Sim? 1662 01:26:23,620 --> 01:26:27,460 >> AUDIÊNCIA: Você usa por cento x para imprimir um apontador? 1663 01:26:27,460 --> 01:26:31,200 >> ROB: Então você usa por cento x para imprimir um apontador? 1664 01:26:31,200 --> 01:26:38,350 Então você pode, mas por cento x é justo, geral, pois, como se você tiver algum 1665 01:26:38,350 --> 01:26:40,325 inteiro e que você deseja imprimir lo como um hexadecimal. 1666 01:26:40,325 --> 01:26:43,250 1667 01:26:43,250 --> 01:26:44,880 Isso é apenas como você fazer isso. 1668 01:26:44,880 --> 01:26:47,160 >> Considerando que, por cento d faria imprimir como decimal. 1669 01:26:47,160 --> 01:26:50,310 É aí que nós começamos por cento d. i é apenas inteiro. 1670 01:26:50,310 --> 01:26:52,690 por cento p é especificamente para ponteiros. 1671 01:26:52,690 --> 01:26:54,060 >> Então x é um ponteiro. 1672 01:26:54,060 --> 01:26:56,360 Queremos usar por cento p. 1673 01:26:56,360 --> 01:26:57,937 Mas por cento x poderia trabalhar. 1674 01:26:57,937 --> 01:26:58,414 Sim? 1675 01:26:58,414 --> 01:26:59,664 >> AUDIÊNCIA: [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 Pelo menos para este call-- então eu não inclui-lo aqui. 1680 01:27:13,440 --> 01:27:19,850 Mas, estes dois argumentos são necessariamente dentro deste quadro de pilha 1681 01:27:19,850 --> 01:27:23,040 juntamente com quaisquer variáveis ​​locais printf passa a ser utilizado. 1682 01:27:23,040 --> 01:27:27,020 E, em seguida, a próxima chamada para printf agora dentro de printf quadro de pilha é 1683 01:27:27,020 --> 01:27:33,960 por cento p barra invertida n e qualquer que seja o valor de x é, qual é 0x123. 1684 01:27:33,960 --> 01:27:34,425 Sim? 1685 01:27:34,425 --> 01:27:35,675 >> AUDIÊNCIA: [inaudível]? 1686 01:27:35,675 --> 01:27:38,145 1687 01:27:38,145 --> 01:27:40,880 >> ROB: Ele vai imprimir algo que se parece com isso. 1688 01:27:40,880 --> 01:27:41,846 >> AUDIÊNCIA: [inaudível]. 1689 01:27:41,846 --> 01:27:44,510 >> ROB: Então ele imprime-lo em forma de endereço. 1690 01:27:44,510 --> 01:27:47,003 Parece que um endereço. 1691 01:27:47,003 --> 01:27:47,494 Sim? 1692 01:27:47,494 --> 01:27:49,458 >> AUDIÊNCIA: [inaudível]? 1693 01:27:49,458 --> 01:27:51,075 >> ROB: Por que é o quê? 1694 01:27:51,075 --> 01:27:52,920 >> AUDIÊNCIA: [inaudível]? 1695 01:27:52,920 --> 01:27:55,240 >> ROB: Porque é que este ponteiro 4 bytes? 1696 01:27:55,240 --> 01:27:58,500 Portanto, há um monte de 0 em frente a este. 1697 01:27:58,500 --> 01:28:03,740 Então, é realmente 0x0000000123. 1698 01:28:03,740 --> 01:28:06,510 Em um sistema de 64 bits, não haveria um monte de mais zeros. 1699 01:28:06,510 --> 01:28:11,410 1700 01:28:11,410 --> 01:28:11,900 Sim? 1701 01:28:11,900 --> 01:28:13,150 >> AUDIÊNCIA: [inaudível]. 1702 01:28:13,150 --> 01:28:17,290 1703 01:28:17,290 --> 01:28:21,130 >> ROB: Então o primeiro printf vai print-- 1704 01:28:21,130 --> 01:28:21,980 >> AUDIÊNCIA: [inaudível]. 1705 01:28:21,980 --> 01:28:24,420 >> ROB: Sim, está indo para imprimir que x está apontando. 1706 01:28:24,420 --> 01:28:27,030 1707 01:28:27,030 --> 01:28:29,070 Estrela diz o que é isso coisa a apontar. 1708 01:28:29,070 --> 01:28:30,300 Agarre-o. 1709 01:28:30,300 --> 01:28:31,455 Então o que é que está apontando? 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 Isso é o que vamos imprimir. 1713 01:28:33,390 --> 01:28:37,020 Considerando que, o próximo, estamos apenas 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á bem. 1717 01:28:44,500 --> 01:28:46,620 >> E então, finalmente, temos o livre. 1718 01:28:46,620 --> 01:28:48,040 O que estamos passando para libertar? 1719 01:28:48,040 --> 01:28:49,470 Estamos passando x. 1720 01:28:49,470 --> 01:28:52,380 Naquela época, eu realmente exibido -lo no quadro de pilha. 1721 01:28:52,380 --> 01:28:56,370 >> Então, nós estamos passando o valor 0x123 libertar. 1722 01:28:56,370 --> 01:28:59,070 Então, agora livre sabe, tudo bem, Eu tenho que ir até a pilha 1723 01:28:59,070 --> 01:29:00,050 e sem que a memória. 1724 01:29:00,050 --> 01:29:03,920 Já não está usando o está no endereço 0x123. 1725 01:29:03,920 --> 01:29:07,010 >> Tão livre vai lançar que a partir do heap. 1726 01:29:07,010 --> 01:29:09,490 Agora a nossa pilha está vazia novamente. 1727 01:29:09,490 --> 01:29:11,120 Não temos vazamentos de memória. 1728 01:29:11,120 --> 01:29:12,940 Agora livre vai voltar. 1729 01:29:12,940 --> 01:29:16,130 Observe que x ainda é 0x123. 1730 01:29:16,130 --> 01:29:18,240 Mas isso agora não é válido memória. 1731 01:29:18,240 --> 01:29:21,220 1732 01:29:21,220 --> 01:29:23,986 Não devemos mais desreferenciava x. 1733 01:29:23,986 --> 01:29:24,440 Sim? 1734 01:29:24,440 --> 01:29:27,240 >> AUDIÊNCIA: É retornar 0 redundante? 1735 01:29:27,240 --> 01:29:28,290 >> ROB: É returen 0 redundante? 1736 01:29:28,290 --> 01:29:31,110 Sim. 1737 01:29:31,110 --> 01:29:33,950 Acabamos de colocar que lá porque temos um retorno de um para o ar. 1738 01:29:33,950 --> 01:29:36,830 Então, é como, sim, permite incluem o retorno 0. 1739 01:29:36,830 --> 01:29:37,310 Sim? 1740 01:29:37,310 --> 01:29:38,560 >> AUDIÊNCIA: [inaudível]? 1741 01:29:38,560 --> 01:29:42,110 1742 01:29:42,110 --> 01:29:45,580 >> ROB: Então, depois x livres, o que acontece se tentamos cancelar o ponteiro? 1743 01:29:45,580 --> 01:29:47,240 É possível que nada dê errado. 1744 01:29:47,240 --> 01:29:49,330 É possível que ainda vai receber 50. 1745 01:29:49,330 --> 01:29:53,590 >> É possível, também, que essa memória é agora está sendo usado para outra coisa. 1746 01:29:53,590 --> 01:29:57,140 Portanto, é um comportamento indefinido. 1747 01:29:57,140 --> 01:30:00,772 E indefinida significa nada pode acontecer. 1748 01:30:00,772 --> 01:30:01,250 Sim? 1749 01:30:01,250 --> 01:30:02,500 >> AUDIÊNCIA: [inaudível]? 1750 01:30:02,500 --> 01:30:07,942 1751 01:30:07,942 --> 01:30:10,830 >> ROB: Não, por isso, se você atribuir x para outra coisa. 1752 01:30:10,830 --> 01:30:15,870 Então, se aqui dissemos x é igual a algo malloc else-- 1753 01:30:15,870 --> 01:30:17,100 tamanho malloc event-- 1754 01:30:17,100 --> 01:30:20,180 então que bloco original de memória não é liberada. 1755 01:30:20,180 --> 01:30:21,490 E nós perdemos oficialmente. 1756 01:30:21,490 --> 01:30:23,150 Isso é uma perda de memória. 1757 01:30:23,150 --> 01:30:25,090 Perdemos todas as referências para esse bloco de memória. 1758 01:30:25,090 --> 01:30:26,827 Então não há nenhuma maneira que nós podemos nunca libertá-la. 1759 01:30:26,827 --> 01:30:32,074 1760 01:30:32,074 --> 01:30:36,630 OK, então, em seguida, retornar 0 significa feito. 1761 01:30:36,630 --> 01:30:37,900 >> Todos estouro bem, então pilha. 1762 01:30:37,900 --> 01:30:39,320 Qual é a ideia aqui? 1763 01:30:39,320 --> 01:30:41,210 Então lembre-se, pilha está indo para baixo. 1764 01:30:41,210 --> 01:30:43,480 Stack está subindo. 1765 01:30:43,480 --> 01:30:48,000 Portanto, este foi o exemplo da palestra, Eu acho que, onde principal só vai 1766 01:30:48,000 --> 01:30:51,380 chamar esta função foo, que vai a chamar-se de forma recursiva uma e 1767 01:30:51,380 --> 01:30:52,320 mais uma vez. 1768 01:30:52,320 --> 01:30:55,370 >> Então empilhar quadros vão funcionam exatamente da mesma. 1769 01:30:55,370 --> 01:30:58,130 Então, vamos começar com principal como o quadro de pilha inferior. 1770 01:30:58,130 --> 01:31:02,000 Então principal vai chamar foo, que está indo para obter um quadro de pilha. 1771 01:31:02,000 --> 01:31:04,260 >> Então foo vai chamar foo novamente, o que vai ficar 1772 01:31:04,260 --> 01:31:05,500 outro quadro de pilha. 1773 01:31:05,500 --> 01:31:08,270 E então, de novo, e de novo, e de novo, e de novo, até que, eventualmente, corremos 1774 01:31:08,270 --> 01:31:09,190 no heap. 1775 01:31:09,190 --> 01:31:11,990 Então é assim que chegarmos um estouro de pilha. 1776 01:31:11,990 --> 01:31:14,910 E, neste ponto, você SEG culpa. 1777 01:31:14,910 --> 01:31:17,335 Ou você realmente seg falha antes neste ponto, mas sim. 1778 01:31:17,335 --> 01:31:19,660 >> AUDIÊNCIA: É núcleo despejar o mesmo que culpa seg? 1779 01:31:19,660 --> 01:31:26,140 >> ROB: Então você verá segmentação núcleo culpa despejado. 1780 01:31:26,140 --> 01:31:28,760 Você ganha um dump de memória quando você SEG culpa. 1781 01:31:28,760 --> 01:31:32,580 E é como uma reserva de todos os conteúdo da memória atual para 1782 01:31:32,580 --> 01:31:36,670 que você pode tentar identificar por que o seg criticado. 1783 01:31:36,670 --> 01:31:37,135 Sim? 1784 01:31:37,135 --> 01:31:38,385 >> AUDIÊNCIA: [inaudível]? 1785 01:31:38,385 --> 01:31:40,855 1786 01:31:40,855 --> 01:31:45,460 >> ROB: Então um meio falha de segmentação há um estouro de pilha. 1787 01:31:45,460 --> 01:31:47,060 Então, não necessariamente. 1788 01:31:47,060 --> 01:31:49,880 A falha de segmentação significa que você está memória tocar de um modo 1789 01:31:49,880 --> 01:31:50,880 você não deve ser. 1790 01:31:50,880 --> 01:31:54,750 Portanto, uma forma de isso acontecer é que, quando você estouro de pilha, começamos a tocar 1791 01:31:54,750 --> 01:31:58,736 memória de uma forma que não deveria ser. 1792 01:31:58,736 --> 01:31:59,208 Sim? 1793 01:31:59,208 --> 01:32:00,458 >> AUDIÊNCIA: [inaudível]? 1794 01:32:00,458 --> 01:32:03,456 1795 01:32:03,456 --> 01:32:05,830 >> ROB: Então, dentro de um loop infinito. 1796 01:32:05,830 --> 01:32:08,770 Tipo, isso é como um infinito recursiva loop e então temos outro 1797 01:32:08,770 --> 01:32:09,770 quadro de pilha de cada vez. 1798 01:32:09,770 --> 01:32:13,540 Mas só dentro de um regular infinito enquanto um-- 1799 01:32:13,540 --> 01:32:16,390 bem, não vamos nem imprimir F-- 1800 01:32:16,390 --> 01:32:17,040 fazer alguma coisa. 1801 01:32:17,040 --> 01:32:18,390 Qualquer que seja. 1802 01:32:18,390 --> 01:32:20,610 >> Nós não vamos estar recebendo outro quadro de pilha. 1803 01:32:20,610 --> 01:32:22,530 Nós apenas estamos indo para mantê-looping sobre esta única instrução. 1804 01:32:22,530 --> 01:32:23,920 A pilha não está crescendo. 1805 01:32:23,920 --> 01:32:27,290 É o fato de que cada recursiva chamada está nos dando um quadro de pilha. 1806 01:32:27,290 --> 01:32:31,231 É por isso que temos um estouro de pilha. 1807 01:32:31,231 --> 01:32:31,728 Sim? 1808 01:32:31,728 --> 01:32:38,189 >> AUDIÊNCIA: Então, se você disse para obter o while e depois [inaudível]? 1809 01:32:38,189 --> 01:32:42,000 >> ROB: Então, se dentro do loop while havia um printf, você ainda 1810 01:32:42,000 --> 01:32:42,790 culpa não seg. 1811 01:32:42,790 --> 01:32:46,090 Eu só não quero confundir as coisas. 1812 01:32:46,090 --> 01:32:46,610 Seria circuito. 1813 01:32:46,610 --> 01:32:48,225 Você deseja obter uma única pilha enquadrar para o printf. 1814 01:32:48,225 --> 01:32:49,580 >> Então printf voltaria. 1815 01:32:49,580 --> 01:32:50,280 Então você ciclo novamente. 1816 01:32:50,280 --> 01:32:51,460 Você deseja obter uma única pilha enquadrar para o printf. 1817 01:32:51,460 --> 01:32:52,850 Ele iria voltar. 1818 01:32:52,850 --> 01:32:54,060 Quadro único pilha. 1819 01:32:54,060 --> 01:33:00,215 Então você não está recebendo esse infinito empilhando pilha de quadros. 1820 01:33:00,215 --> 01:33:03,185 >> AUDIÊNCIA: [inaudível]? 1821 01:33:03,185 --> 01:33:04,040 >> ROB: Sim. 1822 01:33:04,040 --> 01:33:09,360 Então esse estouro de pilha ocorre porque nenhum deles 1823 01:33:09,360 --> 01:33:11,600 chamadas para foo estão voltando. 1824 01:33:11,600 --> 01:33:15,250 Então, se voltarmos, então teríamos começar a perder quadros de pilha. 1825 01:33:15,250 --> 01:33:17,870 E então nós não estouro de pilha. 1826 01:33:17,870 --> 01:33:20,070 E é por isso que você precisa de um caso base para suas funções pessoais. 1827 01:33:20,070 --> 01:33:22,992 1828 01:33:22,992 --> 01:33:23,479 Sim? 1829 01:33:23,479 --> 01:33:27,375 >> AUDIÊNCIA: É o tamanho potencial ea pilha para a pilha o mesmo 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 tamanho do potencial da pilha e a pilha a mesma para todos os programas? 1833 01:33:35,090 --> 01:33:37,180 Cerca. 1834 01:33:37,180 --> 01:33:40,080 Há alguns randomização para em que a pilha e inicia 1835 01:33:40,080 --> 01:33:42,400 onde a pilha começa. 1836 01:33:42,400 --> 01:33:45,870 Se acontecer de você ter um monte de variáveis ​​globais e as coisas, que você pode 1837 01:33:45,870 --> 01:33:49,520 tirar de algum espaço para o seu heap. 1838 01:33:49,520 --> 01:33:54,060 >> Em um sistema de 64 bits, você praticamente tem memória infinita. 1839 01:33:54,060 --> 01:33:55,820 Há tanta coisa. 1840 01:33:55,820 --> 01:33:59,250 Entre 32 bits e 64 bits, que é uma diferença significativa. 1841 01:33:59,250 --> 01:34:02,350 >> Você vai ficar muito mais pilha e heap space em um 64-bit 1842 01:34:02,350 --> 01:34:05,810 sistema, pois não é apenas mais endereços que eles podem usar. 1843 01:34:05,810 --> 01:34:09,360 Mas em um sistema individual, será ser mais ou menos a mesma quantidade de pilha 1844 01:34:09,360 --> 01:34:10,785 e espaço de pilha. 1845 01:34:10,785 --> 01:34:13,635 1846 01:34:13,635 --> 01:34:15,530 Tudo certo. 1847 01:34:15,530 --> 01:34:18,220 >> Assim última coisa é a compilação. 1848 01:34:18,220 --> 01:34:19,810 Então você deve saber este processo. 1849 01:34:19,810 --> 01:34:22,240 Existem quatro grandes etapas. 1850 01:34:22,240 --> 01:34:24,400 Assim, o primeiro deve-se ser fácil de lembrar. 1851 01:34:24,400 --> 01:34:25,085 Pré-processamento. 1852 01:34:25,085 --> 01:34:28,390 Ela tem o prefixo pré nele. 1853 01:34:28,390 --> 01:34:32,080 Por isso, vem antes de tudo. 1854 01:34:32,080 --> 01:34:34,000 >> A coisa a lembrar é o hash. 1855 01:34:34,000 --> 01:34:37,250 Então haxixe define e haxixe inclui em tudo isso. 1856 01:34:37,250 --> 01:34:39,560 Essas são todas pré-processador directivas. 1857 01:34:39,560 --> 01:34:42,030 Estas são as coisas que os pré-processador cuida. 1858 01:34:42,030 --> 01:34:43,680 >> Então, o que um pré-processador de fazer? 1859 01:34:43,680 --> 01:34:44,850 É uma coisa realmente idiota. 1860 01:34:44,850 --> 01:34:49,380 Tudo o que é capaz de são tudo isso cópia e Recortar e Colar operações. 1861 01:34:49,380 --> 01:34:51,790 >> Assim, de hash inclui padrão i0 ponto h. 1862 01:34:51,790 --> 01:34:52,990 O que é que está fazendo? 1863 01:34:52,990 --> 01:34:56,610 Ele está agarrando o padrão i0 dot h arquivo e colá-lo para o topo 1864 01:34:56,610 --> 01:34:58,960 onde quer que ele diz de hash inclui padrão dot h i0. 1865 01:34:58,960 --> 01:35:02,480 >> E qualquer hash de definir que nós temos visto, o que é que está fazendo? 1866 01:35:02,480 --> 01:35:06,730 Sua copiar o valor que o hash definido é definido como e colando que 1867 01:35:06,730 --> 01:35:08,500 onde quer que você estiver usando o valor. 1868 01:35:08,500 --> 01:35:13,400 Assim, o pré-processador só faz realmente operações baseadas em texto simples. 1869 01:35:13,400 --> 01:35:15,870 Ele não faz nada inteligente. 1870 01:35:15,870 --> 01:35:18,920 Então, tudo o resto é mais complicado. 1871 01:35:18,920 --> 01:35:22,970 >> Portanto, agora que é pré-processador feito, nós realmente compilar. 1872 01:35:22,970 --> 01:35:24,320 Então, o que a compilação significa? 1873 01:35:24,320 --> 01:35:27,310 Estamos indo de código c ao código de montagem. 1874 01:35:27,310 --> 01:35:27,570 Sim? 1875 01:35:27,570 --> 01:35:28,820 >> AUDIÊNCIA: [inaudível]? 1876 01:35:28,820 --> 01:35:32,390 1877 01:35:32,390 --> 01:35:34,220 >> ROB: Sim, nós pegamos isso. 1878 01:35:34,220 --> 01:35:36,880 1879 01:35:36,880 --> 01:35:38,660 Então compilar. 1880 01:35:38,660 --> 01:35:40,310 Estamos indo de C para montagem. 1881 01:35:40,310 --> 01:35:42,470 Portanto, esta é uma mudança de linguagem real. 1882 01:35:42,470 --> 01:35:45,240 Compilando-se significa ir de uma linguagem de alto nível para 1883 01:35:45,240 --> 01:35:47,340 numa linguagem de nível inferior. 1884 01:35:47,340 --> 01:35:50,720 >> E c é uma linguagem de alto nível em comparação com a montagem. 1885 01:35:50,720 --> 01:35:52,320 O que é montagem? 1886 01:35:52,320 --> 01:35:56,440 Suas instruções que são, muito muito, feito para o seu CPU. 1887 01:35:56,440 --> 01:35:59,130 Mas o computador ainda não não entendo montagem. 1888 01:35:59,130 --> 01:36:01,570 Ele só entende zeros e uns. 1889 01:36:01,570 --> 01:36:06,160 Então, o próximo passo é a montagem, que nos leva a essas instruções que 1890 01:36:06,160 --> 01:36:08,760 sua CPU compreende e realmente traduz-los, para 1891 01:36:08,760 --> 01:36:10,820 os uns e zeros. 1892 01:36:10,820 --> 01:36:13,570 >> Então C para montagem de binário. 1893 01:36:13,570 --> 01:36:15,870 Mas eu não tenho um executável ainda. 1894 01:36:15,870 --> 01:36:19,550 Então, acho que a biblioteca CS50. 1895 01:36:19,550 --> 01:36:23,070 Nós fornecemos-lhe com um binário para esta biblioteca CS50, que tem GetString 1896 01:36:23,070 --> 01:36:24,400 e GetInt e tudo isso. 1897 01:36:24,400 --> 01:36:25,700 >> Mas o CS50 library-- 1898 01:36:25,700 --> 01:36:27,650 e de itself-- não é executável. 1899 01:36:27,650 --> 01:36:29,570 Ele não tem uma função principal. 1900 01:36:29,570 --> 01:36:32,230 É apenas um monte de binário que você pode usar. 1901 01:36:32,230 --> 01:36:41,730 Então ligação é assim que reunir todos desses arquivos binários diferentes 1902 01:36:41,730 --> 01:36:43,110 em um arquivo executável real. 1903 01:36:43,110 --> 01:36:45,900 Um que você pode digitar dot cortar um ponto fora. 1904 01:36:45,900 --> 01:36:51,660 >> Então, isso é como o arquivo que você escreveu, - qualquer que seja o seu programa é-- 1905 01:36:51,660 --> 01:36:53,620 Ceaser ponto c. 1906 01:36:53,620 --> 01:36:55,100 Mas agora ele foi compilado até binário. 1907 01:36:55,100 --> 01:36:56,480 Assim, o ponto de Ceaser. 1908 01:36:56,480 --> 01:36:59,620 E esta é a nossa CS50 bibliotecas binário. 1909 01:36:59,620 --> 01:37:02,284 E eles estão sendo combinadas num único executável. 1910 01:37:02,284 --> 01:37:02,758 Sim? 1911 01:37:02,758 --> 01:37:04,008 >> AUDIÊNCIA: [inaudível]? 1912 01:37:04,008 --> 01:37:08,800 1913 01:37:08,800 --> 01:37:12,710 >> ROB: Então primeiro incluem, lembre-se, o hash incluir na verdade é um 1914 01:37:12,710 --> 01:37:13,810 passo de pré-processador. 1915 01:37:13,810 --> 01:37:14,750 Mas isso é separado. 1916 01:37:14,750 --> 01:37:20,730 Se você não está usando todas as funções que estão fora do seu arquivo único, em seguida, 1917 01:37:20,730 --> 01:37:26,100 Não, você não precisa de ligação nada pois você tem tudo. 1918 01:37:26,100 --> 01:37:30,310 >> Dito isto, printf está sendo vinculado em. 1919 01:37:30,310 --> 01:37:32,820 Se você nunca usar printf, isso é algo que tem de ser ligado em 1920 01:37:32,820 --> 01:37:35,740 porque você não escreveu isso. 1921 01:37:35,740 --> 01:37:39,530 E, de fato, printf é automaticamente ligada em. 1922 01:37:39,530 --> 01:37:42,760 Você sabe como na linha de comando ou quando você digitar make, você vê que tem 1923 01:37:42,760 --> 01:37:46,690 traço l CS50, que tem ligação na biblioteca CS50? 1924 01:37:46,690 --> 01:37:49,070 Printf, e coisas assim, vai para ser ligado automaticamente. 1925 01:37:49,070 --> 01:37:51,730 1926 01:37:51,730 --> 01:37:53,930 Qualquer outra dúvida sobre alguma coisa? 1927 01:37:53,930 --> 01:37:56,280 >> AUDIÊNCIA: [inaudível]? 1928 01:37:56,280 --> 01:37:58,300 >> ROB: Vinculação? 1929 01:37:58,300 --> 01:38:03,450 Nós temos um monte de diferentes arquivos binários. 1930 01:38:03,450 --> 01:38:06,410 Este é o exemplo canónica que usamos é a biblioteca CS50. 1931 01:38:06,410 --> 01:38:09,960 Nós compilamos e dado a você o binária para esta biblioteca CS50. 1932 01:38:09,960 --> 01:38:12,410 >> Você quer usar GetString em seu programa. 1933 01:38:12,410 --> 01:38:14,750 Então, você vai usar GetString. 1934 01:38:14,750 --> 01:38:19,700 Mas sem o meu código binário para GetString, quando você compilar o código 1935 01:38:19,700 --> 01:38:23,140 para baixo, você não pode realmente executar o seu programa porque GetString String é 1936 01:38:23,140 --> 01:38:25,080 ainda não totalmente definido. 1937 01:38:25,080 --> 01:38:29,220 >> É só quando você ligar no meu binário que contém GetString que agora, tudo 1938 01:38:29,220 --> 01:38:31,130 bem, eu posso realmente executar GetString. 1939 01:38:31,130 --> 01:38:32,330 Meu arquivo está completo. 1940 01:38:32,330 --> 01:38:34,208 E eu posso executar isso. 1941 01:38:34,208 --> 01:38:34,697 Sim? 1942 01:38:34,697 --> 01:38:37,631 >> AUDIÊNCIA: Faz ligando converter o binário para o executável? 1943 01:38:37,631 --> 01:38:42,032 Assim, mesmo se você não tem outra bibliotecas, não seria ainda 1944 01:38:42,032 --> 01:38:44,477 necessário para traduzir o [inaudível]? 1945 01:38:44,477 --> 01:38:48,640 >> ROB: Então um executável ainda é em binário. 1946 01:38:48,640 --> 01:38:51,750 É só combinar um todo bando de binários. 1947 01:38:51,750 --> 01:38:55,124 1948 01:38:55,124 --> 01:38:56,591 >> AUDIÊNCIA: Muito obrigado. 1949 01:38:56,591 --> 01:38:58,560 >> ROB: Não tem problema. 1950 01:38:58,560 --> 01:38:59,540 Alguma outra pergunta? 1951 01:38:59,540 --> 01:39:02,001 Caso contrário, está tudo pronto. 1952 01:39:02,001 --> 01:39:02,690 Tudo certo. 1953 01:39:02,690 --> 01:39:02,990 Obrigado. 1954 01:39:02,990 --> 01:39:03,590 >> [Aplausos] 1955 01:39:03,590 --> 01:39:04,490 >> AUDIÊNCIA: Obrigado. 1956 01:39:04,490 --> 01:39:05,740 >> ROB: Yeah. 1957 01:39:05,740 --> 01:39:06,582