1 00:00:00,000 --> 00:00:06,180 2 00:00:06,180 --> 00:00:07,820 >> JASON HIRSCHHORN: Welcome a A5, todos. 3 00:00:07,820 --> 00:00:11,270 Temos uma semana emocionante à frente de nós, principalmente porque há tantos novos 4 00:00:11,270 --> 00:00:12,350 enfrenta nesta sala. 5 00:00:12,350 --> 00:00:12,920 É maravilhoso. 6 00:00:12,920 --> 00:00:15,740 Muitos de vocês estão aqui por acaso, o que é ainda melhor. 7 00:00:15,740 --> 00:00:18,220 Portanto, esperamos que você vai continuar se juntar a nós. 8 00:00:18,220 --> 00:00:20,220 >> Esta semana estamos indo para gastar a maior parte da secção 9 00:00:20,220 --> 00:00:21,870 preparando para o quiz. 10 00:00:21,870 --> 00:00:26,580 Então por nossa agenda, vamos falar um pouco sobre os recursos para a classe, 11 00:00:26,580 --> 00:00:30,350 , mas também para o teste e, em seguida, novamente, passar a maior parte da classe falar 12 00:00:30,350 --> 00:00:31,390 sobre as perguntas. 13 00:00:31,390 --> 00:00:33,900 Uma vez que estamos a fazer responder a sua perguntas, ou se as suas perguntas 14 00:00:33,900 --> 00:00:39,010 naturalmente nos levar a alguma codificação, eu tem problemas de amostra midterms 15 00:00:39,010 --> 00:00:43,180 passado que vai codificar ao vivo na seção juntos que também trazer algum outro 16 00:00:43,180 --> 00:00:45,420 bons temas para cobrir. 17 00:00:45,420 --> 00:00:48,280 >> Então, primeiro, como nós passamos para o duas últimas semanas para lembrá-lo 18 00:00:48,280 --> 00:00:51,700 caras, há uma tonelada de recursos disponíveis para este curso. 19 00:00:51,700 --> 00:00:55,020 Muitos deles vão ser extremamente útil para você como você continuar a 20 00:00:55,020 --> 00:00:57,280 estudar para concurso 0, porque é terça-feira à tarde. 21 00:00:57,280 --> 00:00:59,630 Então, todos vocês têm sido estudar um pouco. 22 00:00:59,630 --> 00:01:02,640 >> Há notas de aula e fonte código que você deve 23 00:01:02,640 --> 00:01:04,050 definitivamente check-out. 24 00:01:04,050 --> 00:01:05,019 Assista os calções. 25 00:01:05,019 --> 00:01:07,470 Confira study.cs50.net. 26 00:01:07,470 --> 00:01:11,770 E, em seguida, listados abaixo, um número de outros recursos. 27 00:01:11,770 --> 00:01:14,020 >> Mais uma vez, quiz 0 é amanhã à 1 hora. 28 00:01:14,020 --> 00:01:18,230 Se você não tiver feito isso, verifique Sobre o documento quiz 0 no 29 00:01:18,230 --> 00:01:21,370 página inicial do curso para descobrir onde você está tomando o quiz. 30 00:01:21,370 --> 00:01:25,770 O concurso começa às 1:10 e termina 70 minutos mais tarde. 31 00:01:25,770 --> 00:01:29,610 Então, se você mostrar-se após 1:10, você está vai ter que muitos menos minutos 32 00:01:29,610 --> 00:01:30,940 de 70 para fazer o teste. 33 00:01:30,940 --> 00:01:33,570 Portanto, verifique se você está lá na hora. 34 00:01:33,570 --> 00:01:38,690 Se você é um estudante de extensão ou ter algumas outras considerações de teste, isto 35 00:01:38,690 --> 00:01:40,400 pode não ser a 1:00 de amanhã. 36 00:01:40,400 --> 00:01:43,540 Mas, novamente, verifique a 0 sobre Quiz documentar para se certificar de que você saiba quando 37 00:01:43,540 --> 00:01:44,760 você está tomando o quiz. 38 00:01:44,760 --> 00:01:46,440 Escrevi 75 minutos aqui. 39 00:01:46,440 --> 00:01:48,580 Eu acho que é isso mesmo, não 70. 40 00:01:48,580 --> 00:01:53,420 >> Ela abrange todo o material a partir de uma semana 0 a palestra da semana passada na quarta-feira. 41 00:01:53,420 --> 00:01:59,350 E, novamente, para este teste, por que documento, você recebe um de dois lados e 8 42 00:01:59,350 --> 00:02:03,770 1/2 por 11 folha de papel que você obtenha para usar como notas durante o quiz. 43 00:02:03,770 --> 00:02:08,570 Muitas pessoas, se não a maioria das pessoas, tem descobriu que a única forma mais útil 44 00:02:08,570 --> 00:02:11,970 para estudar para o teste é fazer uma folha de estudo, uma 45 00:02:11,970 --> 00:02:13,730 one-sider, da sua própria. 46 00:02:13,730 --> 00:02:17,710 Então olhe para os últimos se você já viu os últimos. 47 00:02:17,710 --> 00:02:19,960 Chegar aos amigos para ver o que eles estão colocando em suas. 48 00:02:19,960 --> 00:02:23,610 >> Mas as mãos para baixo, a melhor maneira que você puder estudo é que passar por tudo e 49 00:02:23,610 --> 00:02:26,530 talhar-lo para o que devem ou não pertence a essa folha de 50 00:02:26,530 --> 00:02:30,570 papel, porque isso é apenas um realmente maneira útil para que você tenha certeza 51 00:02:30,570 --> 00:02:33,620 você está passando por tudo e ter alguma familiaridade com ele. 52 00:02:33,620 --> 00:02:36,690 A maioria das pessoas, encontramos, ainda que ter a folha de papel sentado 53 00:02:36,690 --> 00:02:39,840 ao lado deles no questionário, não ligue para isso, uma vez que, de novo, que muito 54 00:02:39,840 --> 00:02:43,290 processo de ir através da informação ajudou a aprender. 55 00:02:43,290 --> 00:02:45,370 >> Alguém tem alguma dúvida sobre questionário 0? 56 00:02:45,370 --> 00:02:50,120 57 00:02:50,120 --> 00:02:51,450 Tem todos - 58 00:02:51,450 --> 00:02:53,230 Eu não vou fazer um show de mãos. 59 00:02:53,230 --> 00:02:53,550 Nunca mente. 60 00:02:53,550 --> 00:02:54,790 Eu ia perguntar quem começou a estudar. 61 00:02:54,790 --> 00:02:58,360 Mas eu não quero fazer você tudo não levantem suas mãos. 62 00:02:58,360 --> 00:03:01,290 Então, como eu disse - sim, Avi, vá em frente. 63 00:03:01,290 --> 00:03:04,205 >> AVI: O que seria uma coisa útil para colocar no one-pager? 64 00:03:04,205 --> 00:03:05,875 >> ALUNO: Isso é com você. 65 00:03:05,875 --> 00:03:08,210 >> JASON HIRSCHHORN: Você começa para usar o seu julgamento. 66 00:03:08,210 --> 00:03:13,220 Coisas úteis para colocar no one-pager, se você está confuso sobre o grande O 67 00:03:13,220 --> 00:03:17,510 tempo de execução de diferentes tipos de pesquisas e tipo, colocar isso lá em um 68 00:03:17,510 --> 00:03:18,760 gráfico dandy acessível. 69 00:03:18,760 --> 00:03:22,250 Dessa forma, se você é pedido que na questionário, você não precisa tentar e figura 70 00:03:22,250 --> 00:03:23,560 lo ou razão pela execução. 71 00:03:23,560 --> 00:03:24,730 Você pode simplesmente copiá-lo para baixo. 72 00:03:24,730 --> 00:03:28,320 Se você olhar para quizzes passado, uma série de vezes, não está correndo questões de tempo. 73 00:03:28,320 --> 00:03:34,150 Assim que seria um exemplo de um bom coisa para colocar no seu one-pager. 74 00:03:34,150 --> 00:03:37,450 >> Outras coisas boas de colocar, se você estiver confusos sobre como declarar um 75 00:03:37,450 --> 00:03:40,570 função ou quais as diferentes partes a declaração da função é, escrever 76 00:03:40,570 --> 00:03:43,400 que lá, uma versão genérica e, em seguida, talvez um exemplo. 77 00:03:43,400 --> 00:03:47,290 Se você está confuso sobre ponteiros, um diagrama de como ponteiros trabalho é 78 00:03:47,290 --> 00:03:48,660 provavelmente realmente útil. 79 00:03:48,660 --> 00:03:52,440 Se você está confuso sobre recursão, um provar função recursiva lá 80 00:03:52,440 --> 00:03:54,980 também pode vir a ser muito útil. 81 00:03:54,980 --> 00:03:57,290 Será que isso lhe dar algumas idéias? 82 00:03:57,290 --> 00:04:01,820 >> AVI: Você precisa entender a todo o processo de compilação, como 83 00:04:01,820 --> 00:04:03,220 como isso tudo funciona? 84 00:04:03,220 --> 00:04:06,620 >> JASON HIRSCHHORN: Tudo que foi coberto podia 85 00:04:06,620 --> 00:04:08,060 aparecer no quiz. 86 00:04:08,060 --> 00:04:08,930 Perguntas - 87 00:04:08,930 --> 00:04:11,300 mas, novamente, algumas coisas vão ser ponderados fortemente do que outros. 88 00:04:11,300 --> 00:04:14,330 Algumas coisas vêm-se novamente e novamente em sala de aula, em 89 00:04:14,330 --> 00:04:15,590 palestra e seção. 90 00:04:15,590 --> 00:04:17,220 Outras coisas que não tem surgem com freqüência. 91 00:04:17,220 --> 00:04:22,900 >> Nós conversamos muito sobre # include e -L alguma coisa e que aqueles significam em 92 00:04:22,900 --> 00:04:24,390 o processo de compilação. 93 00:04:24,390 --> 00:04:29,120 Nós conversamos muito sobre o GDB, se agarram, essas bandeiras diferentes que usamos quando 94 00:04:29,120 --> 00:04:33,100 compilamos algo, eo que make15, por exemplo, realmente 95 00:04:33,100 --> 00:04:34,510 significa e realmente faz. 96 00:04:34,510 --> 00:04:38,110 Nós não falar tanto sobre cada passo em 97 00:04:38,110 --> 00:04:39,240 o processo de compilação. 98 00:04:39,240 --> 00:04:40,410 Nós ainda falamos sobre isso. 99 00:04:40,410 --> 00:04:42,550 Por isso, ainda é algo que você deve estar familiarizado. 100 00:04:42,550 --> 00:04:44,610 Mas, novamente, não vamos ser - 101 00:04:44,610 --> 00:04:49,140 coisas que surgem com mais freqüência em sala de aula são mais propensos a chegar a mais 102 00:04:49,140 --> 00:04:52,495 e muitas vezes ser mais fortemente ponderados no quiz. 103 00:04:52,495 --> 00:04:53,280 >> Legal. 104 00:04:53,280 --> 00:04:54,580 Quaisquer outras perguntas sobre teste 0? 105 00:04:54,580 --> 00:04:57,660 106 00:04:57,660 --> 00:05:00,050 >> OK, então eu coloquei uma lista de tópicos sobre a placa. 107 00:05:00,050 --> 00:05:01,550 Eu atravessei o programa. 108 00:05:01,550 --> 00:05:07,340 Eu atravessei a seção de revisão de ontem à noite e os slides para chegar 109 00:05:07,340 --> 00:05:13,710 com uma lista não exaustiva de tópicos que nós cobrimos até agora em CS50 110 00:05:13,710 --> 00:05:16,800 e coisas que podem aparecem no quiz. 111 00:05:16,800 --> 00:05:19,900 Então eu não vou passar por cada um único destes. 112 00:05:19,900 --> 00:05:22,370 Isso levaria muito mais tempo do que o que temos agora. 113 00:05:22,370 --> 00:05:26,880 Mas eu coloquei isso aqui à espera jog sua memória como a coisas que podem 114 00:05:26,880 --> 00:05:28,420 ou pode não ser tão familiar com você. 115 00:05:28,420 --> 00:05:32,850 >> E eu adoraria passar a maior parte do seção respondendo suas perguntas sobre 116 00:05:32,850 --> 00:05:35,130 estes temas, temas que não são aqui tratados. 117 00:05:35,130 --> 00:05:36,130 Nós podemos escrever um código pseudo. 118 00:05:36,130 --> 00:05:40,010 Nós podemos escrever o código real, para garantir que você - 119 00:05:40,010 --> 00:05:44,280 Eu posso responder a sua pergunta e ajudar todos fundamentalmente entender um 120 00:05:44,280 --> 00:05:48,330 Muitos desses temas de forma que você sente preparado e confortável indo para 121 00:05:48,330 --> 00:05:50,150 o amanhã quiz. 122 00:05:50,150 --> 00:05:52,300 Então leia sobre a lista. 123 00:05:52,300 --> 00:05:54,780 Você espero ter chegado a seção com algumas perguntas também. 124 00:05:54,780 --> 00:05:58,480 Quando estiver pronto, levante a mão e vamos começar. 125 00:05:58,480 --> 00:06:01,590 126 00:06:01,590 --> 00:06:05,200 >> Tenha em mente, as perguntas que você tem, não há perguntas estúpidas. 127 00:06:05,200 --> 00:06:06,250 Ouvimos muito isso. 128 00:06:06,250 --> 00:06:09,490 E as perguntas que você tem, estou disposto apostar, muitas outras pessoas, tanto 129 00:06:09,490 --> 00:06:11,740 aqui sentado e assistindo on-line têm também. 130 00:06:11,740 --> 00:06:13,770 Assim, você só pode ajudar as pessoas fazendo perguntas. 131 00:06:13,770 --> 00:06:15,070 Marcus. 132 00:06:15,070 --> 00:06:18,040 >> MARCUS: entre a pilha e o pilha, há uma pré-alocado 133 00:06:18,040 --> 00:06:22,880 percentagem de memória que é definido como isto é para a pilha ou para o monte? 134 00:06:22,880 --> 00:06:25,010 Ou como é que isso funciona exatamente? 135 00:06:25,010 --> 00:06:26,230 >> JASON HIRSCHHORN: Ótima pergunta. 136 00:06:26,230 --> 00:06:28,640 Eu estou indo para trás traçar um pouco. 137 00:06:28,640 --> 00:06:30,910 Será que toda a gente - 138 00:06:30,910 --> 00:06:31,660 por favor, seja honesto aqui. 139 00:06:31,660 --> 00:06:34,130 Eu sei que eu estou pedindo para você aumentar a sua mão na frente de seus pares. 140 00:06:34,130 --> 00:06:38,510 Mas há pessoas que se sentem desconfortável com a pilha e pilha 141 00:06:38,510 --> 00:06:42,980 e gostaria de passar por cima desse eo que os significa? 142 00:06:42,980 --> 00:06:43,880 Levante a mão se - 143 00:06:43,880 --> 00:06:44,420 OK. 144 00:06:44,420 --> 00:06:45,120 Obrigado. 145 00:06:45,120 --> 00:06:48,420 Então, vamos passar por cima da pilha e a pilha muito rapidamente e, em seguida, 146 00:06:48,420 --> 00:06:50,370 mover-se em responder a sua pergunta. 147 00:06:50,370 --> 00:06:58,250 >> Então, se nós tirar uma caixa para representar memória em seu computador, o que são alguns 148 00:06:58,250 --> 00:07:02,160 coisas que vão nessa caixa? 149 00:07:02,160 --> 00:07:03,630 Main. 150 00:07:03,630 --> 00:07:04,020 A função principal. 151 00:07:04,020 --> 00:07:05,890 Onde o principal ir? 152 00:07:05,890 --> 00:07:08,090 >> Estudante: [inaudível]. 153 00:07:08,090 --> 00:07:09,390 >> JASON HIRSCHHORN: Então nós vamos colocar principal aqui. 154 00:07:09,390 --> 00:07:12,180 155 00:07:12,180 --> 00:07:13,430 O que mais vai nessa caixa? 156 00:07:13,430 --> 00:07:16,000 157 00:07:16,000 --> 00:07:18,140 >> ALUNO: As funções que você chama. 158 00:07:18,140 --> 00:07:19,020 >> JASON Hirschhorn: As funções que chamamos. 159 00:07:19,020 --> 00:07:20,440 E onde eles vão? 160 00:07:20,440 --> 00:07:21,300 >> ALUNO: Na pilha. 161 00:07:21,300 --> 00:07:22,380 >> JASON HIRSCHHORN: Eles ir na pilha. 162 00:07:22,380 --> 00:07:27,350 Então, vamos chamar isso de coisa aqui em baixo da pilha. 163 00:07:27,350 --> 00:07:31,880 E lá em cima, temos a heap. 164 00:07:31,880 --> 00:07:35,450 Assim, a memória não é uma caixa assim. 165 00:07:35,450 --> 00:07:37,330 Mas é realmente muito similar. 166 00:07:37,330 --> 00:07:40,840 Vai ser um monte de caixas ao longo do e mais, dependendo de como é grande o seu 167 00:07:40,840 --> 00:07:43,730 computador é ou o quão grande é a sua memória. 168 00:07:43,730 --> 00:07:46,950 >> Ao entre aspas "bottom" é a pilha. 169 00:07:46,950 --> 00:07:50,880 E há várias coisas que vão para a pilha. 170 00:07:50,880 --> 00:07:53,840 E aqueles dependem das funções você tem no seu código. 171 00:07:53,840 --> 00:07:57,780 Você sempre tem uma função em seu código chamado principal, por isso há sempre um 172 00:07:57,780 --> 00:08:00,480 seção aqui no empilhar dedicado à principal. 173 00:08:00,480 --> 00:08:03,980 >> Estas seções da pilha são chamados quadros de pilha. 174 00:08:03,980 --> 00:08:09,580 Quando você chamar outra função, dizer principal chama uma função de busca binária, 175 00:08:09,580 --> 00:08:11,075 vamos colocar outro quadro na pilha. 176 00:08:11,075 --> 00:08:13,830 177 00:08:13,830 --> 00:08:17,320 Mais especificamente, nós vamos doar um pedaço de memória em nosso 178 00:08:17,320 --> 00:08:22,960 computador para armazenar binário busca de locais variáveis ​​e para executar o binário 179 00:08:22,960 --> 00:08:24,150 código de pesquisa. 180 00:08:24,150 --> 00:08:26,810 >> Então chamamos de busca binária. 181 00:08:26,810 --> 00:08:30,440 182 00:08:30,440 --> 00:08:33,340 Neste pedaço de memória, nós vamos para armazenar suas variáveis ​​locais. 183 00:08:33,340 --> 00:08:35,270 Nós estamos indo para armazenar suas chamadas printf. 184 00:08:35,270 --> 00:08:38,159 Aconteça o que acontecer, essa função é vai ser armazenado ali. 185 00:08:38,159 --> 00:08:40,350 Pesquisa binária vai executar. 186 00:08:40,350 --> 00:08:42,210 Ele vai para concluir a execução. 187 00:08:42,210 --> 00:08:47,450 Qual é a palavra em C que significa uma função que deve 188 00:08:47,450 --> 00:08:49,306 completar a sua execução? 189 00:08:49,306 --> 00:08:50,040 >> ALUNO: Return. 190 00:08:50,040 --> 00:08:50,870 >> JASON HIRSCHHORN: Return. 191 00:08:50,870 --> 00:08:53,230 Assim, sempre que você vê uma instrução de retorno, as extremidades de função 192 00:08:53,230 --> 00:08:54,350 quando bate aquele. 193 00:08:54,350 --> 00:08:56,740 Então busca binária vai acertar seu retorno. 194 00:08:56,740 --> 00:09:01,360 Esta parte da memória será, essencialmente, ser liberada. 195 00:09:01,360 --> 00:09:03,510 E principal vai voltar para execução. 196 00:09:03,510 --> 00:09:07,240 Assim principal fará uma pausa sempre que era, chamada busca binária, obter algum valor de retorno, 197 00:09:07,240 --> 00:09:08,700 e continuar a execução. 198 00:09:08,700 --> 00:09:10,840 Este quadro de pilha vai embora. 199 00:09:10,840 --> 00:09:14,810 >> Se chamarmos uma função recursiva, que é uma função que chama a si mesmo ao longo do 200 00:09:14,810 --> 00:09:18,480 e mais, podemos chegar - dizer que fez busca binária recursiva. 201 00:09:18,480 --> 00:09:21,520 Podemos obter uma versão binária de pesquisa, busca binária dois, busca binária 202 00:09:21,520 --> 00:09:24,090 três, busca binária quatro, busca binária cinco. 203 00:09:24,090 --> 00:09:27,950 E então esta pesquisa binário final cinco vai bater o caso base, ea pilha 204 00:09:27,950 --> 00:09:31,010 quadros voltar e manter fechamento até chegarmos de volta à principal. 205 00:09:31,010 --> 00:09:32,530 Nós podemos passar por cima de recursão em um pouco. 206 00:09:32,530 --> 00:09:35,530 Mas tudo isso é para dizer que, se você estiver chamar várias funções ao mesmo tempo, 207 00:09:35,530 --> 00:09:39,250 haverá pilha múltipla quadros na pilha. 208 00:09:39,250 --> 00:09:42,900 >> A pilha, por outro lado, se aqui, não é para as funções, 209 00:09:42,900 --> 00:09:44,380 não para variáveis ​​locais. 210 00:09:44,380 --> 00:09:48,920 É para alocada dinamicamente variáveis. 211 00:09:48,920 --> 00:09:57,210 Então, essas são as variáveis ​​que podem ser inicializado no principal ou uma 212 00:09:57,210 --> 00:09:58,640 Função que principais chamadas. 213 00:09:58,640 --> 00:10:00,790 Em qualquer lugar no seu código, eles pode ser inicializado. 214 00:10:00,790 --> 00:10:04,360 E para inicializar um dinamicamente variável alocada. 215 00:10:04,360 --> 00:10:06,970 Qual a função em C que usamos? 216 00:10:06,970 --> 00:10:07,600 >> ALUNO: Malloc. 217 00:10:07,600 --> 00:10:09,240 >> JASON HIRSCHHORN: Malloc. 218 00:10:09,240 --> 00:10:10,800 Você chama malloc. 219 00:10:10,800 --> 00:10:12,260 Você ganha um espaço de memória. 220 00:10:12,260 --> 00:10:15,020 E que o espaço de memória está no heap. 221 00:10:15,020 --> 00:10:18,840 E esse espaço de memória permanece lá até que você ligue grátis. 222 00:10:18,840 --> 00:10:22,670 >> Então variáveis ​​alocadas dinamicamente em pilha vai existir por tanto tempo quanto você 223 00:10:22,670 --> 00:10:25,250 quer que eles existem, e eles não vão ir embora até que você explicitamente 224 00:10:25,250 --> 00:10:26,760 dizer-lhes para ir embora. 225 00:10:26,760 --> 00:10:29,670 Você pode criá-los em uma função. 226 00:10:29,670 --> 00:10:31,930 Aquela pilha de função quadro vai embora. 227 00:10:31,930 --> 00:10:35,490 Mas essa variável ainda existirá na pilha até que ele seja liberado, 228 00:10:35,490 --> 00:10:39,650 potencialmente pela função que chamou busca binária ou o que seja. 229 00:10:39,650 --> 00:10:42,580 >> Então, essas variáveis ​​heap ficar lá durante o tempo que você quiser 230 00:10:42,580 --> 00:10:43,490 eles para ficar lá. 231 00:10:43,490 --> 00:10:46,090 E eles se colocar aqui. 232 00:10:46,090 --> 00:10:47,450 E, em seguida, o próximo é colocado lá. 233 00:10:47,450 --> 00:10:50,210 Mantêm-se preenchido, e eles ficar lá até que você ligue grátis. 234 00:10:50,210 --> 00:10:52,870 >> E, essencialmente, a pilha ea pilha, ficando à pergunta de Marcus, 235 00:10:52,870 --> 00:10:54,500 crescem em direcção um ao outro. 236 00:10:54,500 --> 00:10:57,730 E se correr para o outro, você tem usou toda a memória do seu 237 00:10:57,730 --> 00:11:01,330 computador, e seu programa vai sair porque você não tem mais memória 238 00:11:01,330 --> 00:11:02,420 deixaram de usar. 239 00:11:02,420 --> 00:11:07,290 Entre eles, existem potencialmente outras coisas. 240 00:11:07,290 --> 00:11:10,980 Mas, para o escopo deste curso, você não precisa se preocupar com isso. 241 00:11:10,980 --> 00:11:12,020 >> Então essa foi a resposta à sua pergunta. 242 00:11:12,020 --> 00:11:13,520 Não se preocupe com isso. 243 00:11:13,520 --> 00:11:15,550 Mas essa era a resposta longa. 244 00:11:15,550 --> 00:11:17,800 Tudo o que você precisa saber é o pilha ea pilha vai - 245 00:11:17,800 --> 00:11:18,900 um começa na parte inferior. 246 00:11:18,900 --> 00:11:19,570 A pilha faz. 247 00:11:19,570 --> 00:11:20,790 A pilha está lá em cima. 248 00:11:20,790 --> 00:11:21,990 Eles irão crescer mais perto um do outro. 249 00:11:21,990 --> 00:11:23,110 >> E se tocar, isso é um problema. 250 00:11:23,110 --> 00:11:24,500 Você ficou sem memória. 251 00:11:24,500 --> 00:11:28,760 Mas também, além de saber onde eles estão, o que está armazenado em ambos os 252 00:11:28,760 --> 00:11:30,512 pilha e heap. 253 00:11:30,512 --> 00:11:31,410 Curtis. 254 00:11:31,410 --> 00:11:33,570 >> CURTIS: Quando eles colidem, é que um estouro de pilha? 255 00:11:33,570 --> 00:11:35,670 >> JASON HIRSCHHORN: Quando eles colidem, isso não é um estouro de pilha. 256 00:11:35,670 --> 00:11:38,340 Um estouro de pilha é uma área diferente que podemos passar por cima se você quiser. 257 00:11:38,340 --> 00:11:40,020 OK, vamos voltar a isso daqui a pouco. 258 00:11:40,020 --> 00:11:42,730 >> Estudante: Qual é a palavra chamada quando eles batem um no outro, o 259 00:11:42,730 --> 00:11:44,450 pilha e da pilha? 260 00:11:44,450 --> 00:11:46,640 >> JASON HIRSCHHORN: Por agora, não se preocupe. 261 00:11:46,640 --> 00:11:47,750 Só sei - 262 00:11:47,750 --> 00:11:50,530 Eu vou responder a essa pergunta depois da aula. 263 00:11:50,530 --> 00:11:52,680 Se eles correm para o outro, você correu para fora de memória, porque não há mais 264 00:11:52,680 --> 00:11:53,330 espaço ali. 265 00:11:53,330 --> 00:11:55,450 >> ESTUDANTE: Desculpe, mas o que é uma falha de seg? 266 00:11:55,450 --> 00:11:58,710 >> JASON HIRSCHHORN: Um segmento falha pode ser chamado para - 267 00:11:58,710 --> 00:12:02,240 depende por que chamou o culpa seg. 268 00:12:02,240 --> 00:12:06,260 Às vezes, o estouro de pilha, vai dizer seg falhas como o erro. 269 00:12:06,260 --> 00:12:08,180 >> ALUNO: E sobre dereferencing uma variável null? 270 00:12:08,180 --> 00:12:10,040 Isso é uma falha de seg? 271 00:12:10,040 --> 00:12:11,480 >> JASON HIRSCHHORN: Dereferencing um ponteiro nulo - 272 00:12:11,480 --> 00:12:17,850 OK, então se você tem um ponteiro que você definir igual a nulo, ponteiros, recall, 273 00:12:17,850 --> 00:12:20,270 endereços de memória loja como os seus valores. 274 00:12:20,270 --> 00:12:23,660 E um ponteiro nulo é essencialmente armazenamento de 0, o 0-th 275 00:12:23,660 --> 00:12:26,670 abordar nessa variável. 276 00:12:26,670 --> 00:12:30,010 Assim 0x, 0, 0, 0, 0, et cetera. 277 00:12:30,010 --> 00:12:35,030 Isso 0-th endereço na memória que não é em nossa imagem, que está lá em cima 278 00:12:35,030 --> 00:12:38,800 em algum lugar, que é reservado para o computador. 279 00:12:38,800 --> 00:12:40,130 Não temos permissão para tocá-lo. 280 00:12:40,130 --> 00:12:44,680 >> Assim, quando o programa está em execução, se algo está tentando ir para a memória 281 00:12:44,680 --> 00:12:48,990 endereço 0, ele sabe que que é um valor vazio. 282 00:12:48,990 --> 00:12:50,820 Ele não sabe nada deveria estar lá. 283 00:12:50,820 --> 00:12:53,420 Então, se você tentar usar alguma coisa lá e tratar algo como lá ou 284 00:12:53,420 --> 00:12:58,355 tentando ir para esse local, você está vai ter uma falha ou um erro seg. 285 00:12:58,355 --> 00:13:00,520 Isso responde a sua pergunta? 286 00:13:00,520 --> 00:13:03,170 >> E agora vamos voltar de estouro de pilha. 287 00:13:03,170 --> 00:13:09,560 As coisas na pilha, como vocês têm visto antes, em - vamos desenhar um close 288 00:13:09,560 --> 00:13:11,966 -se de um quadro de pilha. 289 00:13:11,966 --> 00:13:15,050 Todos podem ver isso? 290 00:13:15,050 --> 00:13:16,650 Então, nós temos o nosso quadro de pilha. 291 00:13:16,650 --> 00:13:23,260 Estamos salvando uma matriz como um local de variável nesta função. 292 00:13:23,260 --> 00:13:29,510 Então, dizer que a nossa matriz tem cinco pontos. 293 00:13:29,510 --> 00:13:33,230 Todos os cinco desses vai ser armazenado nesse quadro de pilha. 294 00:13:33,230 --> 00:13:37,540 >> Se começar a escrever para além do limites deste conjunto - 295 00:13:37,540 --> 00:13:43,990 por isso, se começar a escrever em, vamos dizer que é 0. 296 00:13:43,990 --> 00:13:46,800 Esses são os cinco índices da nossa matriz. 297 00:13:46,800 --> 00:13:50,980 Se começar a escrever em índice 5, que não temos quando temos uma 298 00:13:50,980 --> 00:13:55,900 matriz de tamanho 5, começamos a escrever em índice de 6, 7, 8, 9, podemos obter uma Stack 299 00:13:55,900 --> 00:13:57,960 Erro de estouro. 300 00:13:57,960 --> 00:14:00,510 >> Geralmente não é - 301 00:14:00,510 --> 00:14:04,910 você provavelmente vai ter problemas se você passar por cima por um. 302 00:14:04,910 --> 00:14:08,640 Mas, geralmente, você vai entrar no mais problemas, se você passar por cima de um monte 303 00:14:08,640 --> 00:14:12,770 e você ir tão longe mais que você escreve sobre o endereço de retorno que 304 00:14:12,770 --> 00:14:16,080 função, que está localizado no parte inferior do quadro de pilha. 305 00:14:16,080 --> 00:14:16,520 >> Porque, certo? 306 00:14:16,520 --> 00:14:17,670 You - no - desculpe. 307 00:14:17,670 --> 00:14:18,550 Não ", porque a direita." 308 00:14:18,550 --> 00:14:20,470 >> No quadro de pilha, você tem suas variáveis ​​locais. 309 00:14:20,470 --> 00:14:27,090 Na parte inferior da pilha quadro é o endereço de retorno. 310 00:14:27,090 --> 00:14:28,790 É aí que a função vai quando acabar. 311 00:14:28,790 --> 00:14:33,750 E se você substituir esse retorno endereço, em seguida, quando este quadro de pilha, 312 00:14:33,750 --> 00:14:36,680 quando você está indo através da pilha enquadrar e execução de cada linha, você está 313 00:14:36,680 --> 00:14:40,350 indo para ir para o seu novo endereço de retorno que está escrito lá em vez de o 314 00:14:40,350 --> 00:14:40,910 um real. 315 00:14:40,910 --> 00:14:45,050 E é assim que nós vimos algumas falhas de segurança 316 00:14:45,050 --> 00:14:46,780 pode acontecer com os computadores. 317 00:14:46,780 --> 00:14:52,760 >> Então estouro de pilha, em suma, é quando você substituir o papel na pilha 318 00:14:52,760 --> 00:14:55,440 você deveria usar, o local de variável que você deveria usar, e 319 00:14:55,440 --> 00:14:58,070 em especial, quando você começa a sobrescrever coisas importantes, como o 320 00:14:58,070 --> 00:14:59,100 endereço de retorno. 321 00:14:59,100 --> 00:15:00,090 E é aí que você vai ter um erro. 322 00:15:00,090 --> 00:15:03,980 Ou talvez até mesmo você pode começar mesmo escrevendo em - 323 00:15:03,980 --> 00:15:05,370 dizer de busca binária foi logo acima principal. 324 00:15:05,370 --> 00:15:07,790 Se você substituiu muito, você poderia escrever em principal. 325 00:15:07,790 --> 00:15:10,230 Mas, geralmente, você recebe um erro antes então, porque o computador sabe 326 00:15:10,230 --> 00:15:12,270 você está fazendo algo que você não deveria estar fazendo. 327 00:15:12,270 --> 00:15:12,560 É. 328 00:15:12,560 --> 00:15:13,910 >> Estudante: Qual é a diferença entre um estouro de pilha 329 00:15:13,910 --> 00:15:16,940 e um buffer overflow? 330 00:15:16,940 --> 00:15:19,420 >> JASON HIRSCHHORN: Buffer overflow é um tipo mais genérico de 331 00:15:19,420 --> 00:15:20,395 o que eu acabei de descrever. 332 00:15:20,395 --> 00:15:22,610 >> ALUNO: Então um estouro de pilha é um exemplo de um buffer overflow. 333 00:15:22,610 --> 00:15:23,420 >> JASON HIRSCHHORN: Exatamente. 334 00:15:23,420 --> 00:15:28,700 Esta é uma matriz que podemos pensar como buffer, um espaço para que as coisas vão dentro 335 00:15:28,700 --> 00:15:30,600 Este é um estouro de buffer de pilha. 336 00:15:30,600 --> 00:15:33,210 Poderíamos ter um estouro de buffer de pilha. 337 00:15:33,210 --> 00:15:36,870 Se houve um tampão, o qual muitas vezes existe é uma matriz da pilha, e nós 338 00:15:36,870 --> 00:15:40,600 overwrote desses limites, então nós ter um estouro de buffer de pilha. 339 00:15:40,600 --> 00:15:44,870 >> E além do escopo deste curso, eles são detectados um pouco diferente. 340 00:15:44,870 --> 00:15:48,040 O compilador tem especial meios de detecção de cada uma. 341 00:15:48,040 --> 00:15:50,660 Mas um buffer overflow é um mais genérico tipo do que eu descrevi, 342 00:15:50,660 --> 00:15:54,090 que foi um estouro de buffer de pilha. 343 00:15:54,090 --> 00:15:56,240 Será que isso responde sua pergunta? 344 00:15:56,240 --> 00:15:57,910 Doce. 345 00:15:57,910 --> 00:16:01,850 >> Havia outras questões relacionadas para a pilha ou a pilha? 346 00:16:01,850 --> 00:16:04,920 347 00:16:04,920 --> 00:16:05,510 É. 348 00:16:05,510 --> 00:16:08,220 >> ALUNO: Eu sei que você tem que cordas livres porque eles estão no heap 349 00:16:08,220 --> 00:16:09,305 e você não quer vazar memória. 350 00:16:09,305 --> 00:16:12,240 Mas você tem que liberar as variáveis ​​globais e coisas assim? 351 00:16:12,240 --> 00:16:14,335 Ou eles são liberados automaticamente? 352 00:16:14,335 --> 00:16:15,700 >> JASON HIRSCHHORN: Boa pergunta. 353 00:16:15,700 --> 00:16:22,340 Assim, em CS50.H, criamos essa coisa para você chamou uma string. 354 00:16:22,340 --> 00:16:23,800 Uma corda é realmente o que? 355 00:16:23,800 --> 00:16:24,810 >> ALUNO: Char estrela. 356 00:16:24,810 --> 00:16:29,180 >> JASON HIRSCHHORN: Uma estrela char, um ponteiro a um personagem, um ponteiro para 357 00:16:29,180 --> 00:16:30,650 um conjunto de caracteres. 358 00:16:30,650 --> 00:16:32,210 Isso é o que a corda é. 359 00:16:32,210 --> 00:16:36,050 Então, precisamos libertá-la, porque getstring, que usamos muito - 360 00:16:36,050 --> 00:16:38,370 nome da seqüência é igual getstring - 361 00:16:38,370 --> 00:16:43,560 que mallocs para nós um pouco de memória no heap e retorna um ponteiro para a 362 00:16:43,560 --> 00:16:47,230 primeiro caractere que corda, uma estrela de char. 363 00:16:47,230 --> 00:16:52,760 >> Então, aparentemente, se você não tiver sido escrevendo livre em qualquer de suas cordas 364 00:16:52,760 --> 00:16:55,600 que você já chamou até agora, você tem foi vazando um pouco de memória. 365 00:16:55,600 --> 00:16:57,430 Claro que nós não falamos sobre lo, de modo que ninguém é chegado em 366 00:16:57,430 --> 00:16:58,520 problemas para fazê-lo. 367 00:16:58,520 --> 00:16:59,980 Mas daqui para frente, sim. 368 00:16:59,980 --> 00:17:03,990 Quando você chamar getstring, você está mallocing algum espaço no heap. 369 00:17:03,990 --> 00:17:07,640 E se você não chamar livre, mais tarde, que corda, você tem um vazamento de memória. 370 00:17:07,640 --> 00:17:09,440 Isso responde a sua pergunta? 371 00:17:09,440 --> 00:17:10,606 >> Sim 372 00:17:10,606 --> 00:17:15,020 >> Estudante: Então, para fazer isso, usamos direito livre antes do retorno? 373 00:17:15,020 --> 00:17:18,510 Como, no âmbito de, eu acho que se dizemos, como, int main, dentro do 374 00:17:18,510 --> 00:17:24,410 âmbito do código que está dentro daqueles chaves, bem antes - 375 00:17:24,410 --> 00:17:26,140 você sabe onde você gostaria costumo colocar retorno. 376 00:17:26,140 --> 00:17:27,950 Você coloca livre antes disso? 377 00:17:27,950 --> 00:17:31,000 >> JASON HIRSCHHORN: Então você pode colocar livre onde quer que você colocá-livre. 378 00:17:31,000 --> 00:17:33,810 Porque estes são alocados dinamicamente variáveis, porque eles podem 379 00:17:33,810 --> 00:17:39,170 viver para além do âmbito de uma determinada função, se você chamar malloc em um 380 00:17:39,170 --> 00:17:44,140 função separada, por exemplo, getstring, você pode ligar gratuitamente no principal. 381 00:17:44,140 --> 00:17:46,050 Você não precisa de chamá-lo na função específica 382 00:17:46,050 --> 00:17:47,570 onde malloc é chamado. 383 00:17:47,570 --> 00:17:50,340 Mas você precisa fazer para chamá-lo antes da volta principais. 384 00:17:50,340 --> 00:17:51,120 >> E isso realmente depende. 385 00:17:51,120 --> 00:17:54,960 Depende de qual você malloced que espaço, em primeiro lugar. 386 00:17:54,960 --> 00:17:57,320 Algumas pessoas vão chamar libertar muito rapidamente. 387 00:17:57,320 --> 00:17:59,220 Algumas pessoas não vão ligar gratuitamente até No final do seu programa. 388 00:17:59,220 --> 00:18:00,660 E eles vão passar por e livre de tudo. 389 00:18:00,660 --> 00:18:03,597 Depende de por que você chamou malloc. 390 00:18:03,597 --> 00:18:11,270 >> ALUNO: E o que você diria se você chamou uso getstring? 391 00:18:11,270 --> 00:18:13,320 Você diria que livre o quê? 392 00:18:13,320 --> 00:18:20,040 >> JASON HIRSCHHORN: Então a sintaxe de graça é simplesmente livre, parêntese aberto, perto 393 00:18:20,040 --> 00:18:22,130 paren, e o nome do ponteiro. 394 00:18:22,130 --> 00:18:26,410 Então, se você escrever iguais String nome getstring, você colocar o nome aqui. 395 00:18:26,410 --> 00:18:27,760 Esse é o nome do ponteiro. 396 00:18:27,760 --> 00:18:30,570 E ele sabe que para libertar memória. 397 00:18:30,570 --> 00:18:33,920 >> Estudante: Então, quando ele libera a memória, o ponteiro ainda aponta para aquele lugar 398 00:18:33,920 --> 00:18:34,970 na memória? 399 00:18:34,970 --> 00:18:39,020 Ou é o ponteiro também esvaziada de o endereço que ele aponta. 400 00:18:39,020 --> 00:18:40,290 >> JASON HIRSCHHORN: Devemos tentar isso. 401 00:18:40,290 --> 00:18:41,430 Devemos codificar isso. 402 00:18:41,430 --> 00:18:43,880 Vamos voltar quando chegarmos codificação, e vamos codificar isso. 403 00:18:43,880 --> 00:18:46,000 E se você quiser descobrir a resposta para isso, você também pode código que 404 00:18:46,000 --> 00:18:46,690 no mesmo período. 405 00:18:46,690 --> 00:18:49,100 Mas isso é uma grande questão. 406 00:18:49,100 --> 00:18:53,480 >> ALUNO: É possível algo livre cedo demais? 407 00:18:53,480 --> 00:18:58,530 Então, você ainda precisa para o seu programa, e você libertou esse espaço de memória? 408 00:18:58,530 --> 00:18:59,200 >> JASON HIRSCHHORN: sim. 409 00:18:59,200 --> 00:19:03,020 É possível, se algo livre e depois de usá-lo novamente, você vai 410 00:19:03,020 --> 00:19:06,890 deparar com um erro. 411 00:19:06,890 --> 00:19:10,810 Mas isso é para você, porque você libertou alguma coisa e, em seguida, chamou-lhe mais tarde. 412 00:19:10,810 --> 00:19:13,940 Então isso foi um erro do programador. 413 00:19:13,940 --> 00:19:14,780 Mas sim. 414 00:19:14,780 --> 00:19:17,760 Você pode escrever isso. 415 00:19:17,760 --> 00:19:19,240 >> Mais alguma pergunta sobre - 416 00:19:19,240 --> 00:19:19,760 Sim. 417 00:19:19,760 --> 00:19:22,820 >> Estudante: Então, se você é suposto a apenas libertá-lo, em geral antes da 418 00:19:22,820 --> 00:19:25,490 programa termina, isso significa que se o programa termina e você não liberá-lo, 419 00:19:25,490 --> 00:19:27,580 que a memória ainda é alocado? 420 00:19:27,580 --> 00:19:31,330 >> JASON HIRSCHHORN: Se o programa termina e você se esqueça de liberar alguma coisa, então 421 00:19:31,330 --> 00:19:34,390 que a memória foi alocada ao longo a vida útil do seu programa. 422 00:19:34,390 --> 00:19:37,670 Quando o programa se fecha completamente, que a memória não está acontecendo 423 00:19:37,670 --> 00:19:39,490 para ficar lá para sempre. 424 00:19:39,490 --> 00:19:42,080 O computador é inteligente o suficiente para saber que, quando o programa é fechado, ele 425 00:19:42,080 --> 00:19:46,440 deve se livrar de toda a memória que foi associado com o referido programa. 426 00:19:46,440 --> 00:19:51,240 >> No entanto, existem ferramentas que podem ser executados em um programa para detectar se, quando o 427 00:19:51,240 --> 00:19:54,720 programa terminar, você esqueceu para liberar memória. 428 00:19:54,720 --> 00:19:57,960 E para o seu próximo conjunto de problemas onde você estará usando malloc e usando 429 00:19:57,960 --> 00:20:02,610 ponteiros, você estará correndo este programa em seu programa para ver se, 430 00:20:02,610 --> 00:20:06,530 quando retorna principais, você teve algum coisas que foram deixadas não-liberto. 431 00:20:06,530 --> 00:20:09,130 >> Então, eles não vão ficar malloced para sempre em seu computador. 432 00:20:09,130 --> 00:20:11,720 Isso seria um desperdício, porque muito rapidamente, computadores 433 00:20:11,720 --> 00:20:12,960 iria ficar sem memória. 434 00:20:12,960 --> 00:20:16,450 Mas, se eles correm até o final do seu programar e eles não estão liberados e seu 435 00:20:16,450 --> 00:20:20,260 programa sai, isso ainda é um problema que esta ferramenta irá ajudá-lo a resolver. 436 00:20:20,260 --> 00:20:21,520 >> ALUNO: É isso Valgrind? 437 00:20:21,520 --> 00:20:22,910 >> JASON HIRSCHHORN: É chamado Valgrind. 438 00:20:22,910 --> 00:20:23,520 E você vai ser - 439 00:20:23,520 --> 00:20:25,780 >> ALUNO: Mas não temos de saber que, para o teste, embora? 440 00:20:25,780 --> 00:20:27,600 Quero dizer, foi falado um pouco na palestra. 441 00:20:27,600 --> 00:20:33,600 >> JASON HIRSCHHORN: Então Valgrind é o nome dessa ferramenta. 442 00:20:33,600 --> 00:20:37,180 Saber o que ele faz é suficiente para o quiz. 443 00:20:37,180 --> 00:20:40,200 Mas você não tê-lo usado ainda em seu conjunto de problemas, porque nós não tivemos uma 444 00:20:40,200 --> 00:20:43,520 conjunto de problemas que tem explicitamente tratado com malloc ou você está usando malloc. 445 00:20:43,520 --> 00:20:45,330 Então, você não usou Valgrind ainda. 446 00:20:45,330 --> 00:20:47,760 Mas você vai usá-lo, mais cedo em vez de mais tarde. 447 00:20:47,760 --> 00:20:48,710 >> ALUNO: Você pode repetir Valgrind que é? 448 00:20:48,710 --> 00:20:49,190 >> JASON HIRSCHHORN: Desculpe? 449 00:20:49,190 --> 00:20:51,240 >> ALUNO: Você pode repetir o que a finalidade de Valgring é? 450 00:20:51,240 --> 00:20:53,100 >> JASON HIRSCHHORN: Valgrind é o nome - 451 00:20:53,100 --> 00:20:59,890 como GDB ajuda a depurar o seu programa, Valgrind ajuda você a descobrir se 452 00:20:59,890 --> 00:21:03,210 as coisas não foram libertados quando o programa é fechado. 453 00:21:03,210 --> 00:21:05,110 Então você vai executá-lo em seu programa. 454 00:21:05,110 --> 00:21:09,230 E o seu programa sai, e ele vai dizer seu programa chamado malloc isso muitos 455 00:21:09,230 --> 00:21:13,670 vezes por isso muitos bytes, e você apenas chamado de livre isso muitas vezes. 456 00:21:13,670 --> 00:21:16,520 E assim você deixou esses muitos bytes sem ser libertados. 457 00:21:16,520 --> 00:21:18,050 Ou vai dizer que você libertou tudo. 458 00:21:18,050 --> 00:21:19,070 Bom trabalho. 459 00:21:19,070 --> 00:21:19,480 >> ALUNO: OK. 460 00:21:19,480 --> 00:21:21,060 E ele é chamado Valgring? 461 00:21:21,060 --> 00:21:24,940 >> Jason HIRSCHHORN: V-A-G-G-R-I-N-D. 462 00:21:24,940 --> 00:21:25,970 >> ALUNO: Uma pergunta sobre ponteiros. 463 00:21:25,970 --> 00:21:30,080 Então, digamos que você tenha n estrelar x é igual a alguma coisa. 464 00:21:30,080 --> 00:21:33,330 Isso equivale a, o que você está colocando lá, é que o que está sendo colocado dentro 465 00:21:33,330 --> 00:21:36,120 o que x está apontando para, ou o ponteiro de x? 466 00:21:36,120 --> 00:21:37,690 >> JASON HIRSCHHORN: Você pode repetir a pergunta? 467 00:21:37,690 --> 00:21:39,340 Podemos chamar a isso enquanto você diz isso? 468 00:21:39,340 --> 00:21:42,710 >> ALUNO: No questionário, na verdade, a aquele que você nos enviou, era como, char 469 00:21:42,710 --> 00:21:46,520 estrela verdade é igual a CS50 rochas, certo? 470 00:21:46,520 --> 00:21:52,190 Então, isso significa que esse CS50 rochas é o que a verdade está apontando para? 471 00:21:52,190 --> 00:21:55,810 >> JASON HIRSCHHORN: Então você está falando sobre uma estrela de caractere em uma string, como 472 00:21:55,810 --> 00:21:56,460 que funciona? 473 00:21:56,460 --> 00:21:56,890 É. 474 00:21:56,890 --> 00:21:57,700 OK. 475 00:21:57,700 --> 00:21:59,140 Vamos chamar isso aqui. 476 00:21:59,140 --> 00:22:07,100 >> [SIDE CONVERSA] 477 00:22:07,100 --> 00:22:11,130 >> JASON HIRSCHHORN: Então esta variável vai ser do tipo char estrela. 478 00:22:11,130 --> 00:22:14,580 Quão grande é uma variável do tipo char estrela? 479 00:22:14,580 --> 00:22:15,510 Quantos bytes? 480 00:22:15,510 --> 00:22:16,450 >> ESTUDANTES: quatro. 481 00:22:16,450 --> 00:22:18,210 >> JASON HIRSCHHORN: É quatro bytes. 482 00:22:18,210 --> 00:22:21,420 Quantos direitos é uma variável do tipo int estrela? 483 00:22:21,420 --> 00:22:22,210 >> ESTUDANTES: quatro. 484 00:22:22,210 --> 00:22:24,910 >> JASON HIRSCHHORN: Quatro bytes. 485 00:22:24,910 --> 00:22:28,280 Se for um ponteiro, então é sempre quatro bytes, pois os ponteiros, o seu 486 00:22:28,280 --> 00:22:30,070 valor é um endereço de memória. 487 00:22:30,070 --> 00:22:35,160 E os endereços de memória sobre o CS50 aparelho são quatro bytes. 488 00:22:35,160 --> 00:22:42,900 Então, quando nós chamamos getstring, ou quando nós digamos, Nomedestring iguais, e, em seguida, em 489 00:22:42,900 --> 00:22:46,140 aspas colocar uma corda, estamos colocando - 490 00:22:46,140 --> 00:22:46,920 bem, isso é um pouco diferente. 491 00:22:46,920 --> 00:22:48,630 Nós vamos fazer getString como o exemplo. 492 00:22:48,630 --> 00:22:52,150 Ou char estrela algo é igual à string. 493 00:22:52,150 --> 00:22:54,360 Desculpe, me dê o exemplo que você leu? 494 00:22:54,360 --> 00:22:57,590 >> ESTUDANTE: char estrela verdade é igual a "CS50 pedras" entre aspas duplas. 495 00:22:57,590 --> 00:23:02,260 >> JASON HIRSCHHORN: Então esta estrela, este vamos chamar esta variável x para o nosso 496 00:23:02,260 --> 00:23:04,060 propósitos genéricos. 497 00:23:04,060 --> 00:23:05,970 Nós criamos uma variável chamada x. 498 00:23:05,970 --> 00:23:07,610 É tipo char estrela. 499 00:23:07,610 --> 00:23:10,950 É um ponteiro para uma série de caracteres. 500 00:23:10,950 --> 00:23:12,200 Então, aqui em baixo - 501 00:23:12,200 --> 00:23:23,710 502 00:23:23,710 --> 00:23:25,890 >> Portanto, esta é a forma como isso seria trabalho na memória. 503 00:23:25,890 --> 00:23:27,410 Isso iria armazenar um endereço de memória. 504 00:23:27,410 --> 00:23:31,770 Seria armazenar o endereço de memória o primeiro caractere na matriz. 505 00:23:31,770 --> 00:23:33,830 E então, quando você seguiu o ponteiro, você faria 506 00:23:33,830 --> 00:23:35,200 obter o primeiro caractere. 507 00:23:35,200 --> 00:23:38,780 >> E se você está lendo essa coisa como uma corda, o computador é inteligente 508 00:23:38,780 --> 00:23:42,930 o suficiente para saber, leia tudo isso até chegar a uma reação 0. 509 00:23:42,930 --> 00:23:45,530 Mas se você está lendo isso em um personagem um tempo, assim que você está interagindo através 510 00:23:45,530 --> 00:23:49,910 esta cadeia, então você só vai ler um caractere de cada vez até chegar ao 511 00:23:49,910 --> 00:23:50,850 barra invertida 0. 512 00:23:50,850 --> 00:23:52,335 Isso pode não responder à sua pergunta. 513 00:23:52,335 --> 00:23:55,610 >> ALUNO: Sim, mas você não tem malloced que o espaço 514 00:23:55,610 --> 00:23:58,400 Ainda para esse ponteiro. 515 00:23:58,400 --> 00:24:02,510 >> JASON HIRSCHHORN: Então, eu não tenho certeza exatamente o que você está olhando, 516 00:24:02,510 --> 00:24:03,640 porque eu não fiz que quiz. 517 00:24:03,640 --> 00:24:06,370 Isso era para ser um útil recurso de outro TF. 518 00:24:06,370 --> 00:24:11,380 Se você estiver criando uma corda no pilha ou como uma variável local, ele vai 519 00:24:11,380 --> 00:24:16,920 ser apenas matriz de cargas, em vez de geralmente uma estrela de char apontando para 520 00:24:16,920 --> 00:24:18,600 outra string. 521 00:24:18,600 --> 00:24:20,550 Mas eu não sei. 522 00:24:20,550 --> 00:24:25,065 Isso poderia ser um ponteiro para outro string na pilha também. 523 00:24:25,065 --> 00:24:27,240 É. 524 00:24:27,240 --> 00:24:31,116 >> ALUNO: Eu sei que você precisa alocar memória se o ponteiro estiver 525 00:24:31,116 --> 00:24:33,360 sendo declarada dentro de outra função. 526 00:24:33,360 --> 00:24:36,740 Você precisa fazer a mesma coisa, se é ser declarada dentro de principal, 527 00:24:36,740 --> 00:24:39,570 você está usando-o dentro do principal? 528 00:24:39,570 --> 00:24:43,590 >> JASON HIRSCHHORN: Então, sim. 529 00:24:43,590 --> 00:24:46,670 Você pode declarar um ponteiro para qualquer endereço de memória na memória. 530 00:24:46,670 --> 00:24:51,440 Ele pode ser o endereço de memória de um local de variável, embora, muitas vezes, 531 00:24:51,440 --> 00:24:55,760 as pessoas não declarar os endereços de memória a variáveis ​​locais, porque eles vão 532 00:24:55,760 --> 00:24:59,890 longe, uma vez que a função retorna, o que É por isso que geralmente malloc coisas. 533 00:24:59,890 --> 00:25:04,630 Mas sim, você poderia declarar um ponteiro a outra variável local. 534 00:25:04,630 --> 00:25:06,360 Não é apenas geralmente feito. 535 00:25:06,360 --> 00:25:09,480 Mas eu posso dar uma olhada no que coisa específica depois da aula. 536 00:25:09,480 --> 00:25:10,650 É. 537 00:25:10,650 --> 00:25:12,350 >> ALUNO: Eu acho que isso é uma espécie do que está sendo solicitado. 538 00:25:12,350 --> 00:25:16,930 Parece estranho para ser inicializado um ponteiro não como um 539 00:25:16,930 --> 00:25:20,760 endereço, mas como o parece ser um valor. 540 00:25:20,760 --> 00:25:25,970 Parece que o CS50 é o que está dentro a coisa que está sendo apontado e 541 00:25:25,970 --> 00:25:28,820 não o endereço real, certo? 542 00:25:28,820 --> 00:25:30,520 >> JASON HIRSCHHORN: Então é isso não é o caso, porém. 543 00:25:30,520 --> 00:25:32,470 Não é isso que está acontecendo. 544 00:25:32,470 --> 00:25:35,910 Quando você declara uma estrela char, é um endereço de memória. 545 00:25:35,910 --> 00:25:38,860 Os ponteiros são todos os endereços de memória apontando para algo mais. 546 00:25:38,860 --> 00:25:41,480 Que outra coisa poderia estar no pilha, mas é quase sempre sobre o 547 00:25:41,480 --> 00:25:43,440 amontoar na forma como vai vê-lo usado. 548 00:25:43,440 --> 00:25:46,860 549 00:25:46,860 --> 00:25:53,500 Mas Nomedestring igual de aspas duplas "GetString", podemos ver isso e nós 550 00:25:53,500 --> 00:25:55,010 pode olhar por isso e codificar isso. 551 00:25:55,010 --> 00:26:01,190 getString cadeia não está sendo salvo em essa variável, ou o que a string 552 00:26:01,190 --> 00:26:04,580 nome não está sendo salvo na medida em que variável, não porque é assim que 553 00:26:04,580 --> 00:26:06,070 ponteiros funcionam. 554 00:26:06,070 --> 00:26:06,770 Será que isso faz sentido? 555 00:26:06,770 --> 00:26:07,170 >> ESTUDANTE: Yeah. 556 00:26:07,170 --> 00:26:08,570 >> JASON HIRSCHHORN: OK. 557 00:26:08,570 --> 00:26:11,690 Felizmente, isso não era confuso para qualquer um. 558 00:26:11,690 --> 00:26:15,732 Mas se fosse, nós podemos olhar para ele de novo daqui a pouco, porque na verdade estamos indo 559 00:26:15,732 --> 00:26:19,240 codificar algo que venha a trabalhar com cordas e ajudá-lo a sentir-se 560 00:26:19,240 --> 00:26:22,170 mais confortável com eles. 561 00:26:22,170 --> 00:26:24,869 >> Quaisquer outras questões relacionadas com estes tópicos ou outros tópicos que 562 00:26:24,869 --> 00:26:26,119 Vou colocar de volta? 563 00:26:26,119 --> 00:26:32,280 564 00:26:32,280 --> 00:26:34,840 E - 565 00:26:34,840 --> 00:26:36,310 agora. 566 00:26:36,310 --> 00:26:37,630 Sim, Alden. 567 00:26:37,630 --> 00:26:39,860 >> ALDEN: Então isso é completamente alheios, mas podemos simplesmente passar por cima 568 00:26:39,860 --> 00:26:42,760 muito rapidamente o que precisa de saber sobre a diferença entre um 32 e 569 00:26:42,760 --> 00:26:46,345 Máquina de 64 bits? 570 00:26:46,345 --> 00:26:47,740 >> JASON HIRSCHHORN: sim. 571 00:26:47,740 --> 00:26:52,111 Assim, 32 bits é quantos bytes? 572 00:26:52,111 --> 00:26:53,060 >> ALDEN: É quatro bytes. 573 00:26:53,060 --> 00:26:54,360 >> JASON HIRSCHHORN: É quatro bytes. 574 00:26:54,360 --> 00:26:58,420 E 64 bits é quantos bytes? 575 00:26:58,420 --> 00:26:59,112 >> ALUNO: Oito. 576 00:26:59,112 --> 00:27:00,610 >> JASON HIRSCHHORN: Oito bytes. 577 00:27:00,610 --> 00:27:03,980 Então, novamente, oito bits é um byte. 578 00:27:03,980 --> 00:27:08,340 O seu aparelho é CS50 uma máquina de 32-bit. 579 00:27:08,340 --> 00:27:13,650 Assim, os endereços de memória são quatro bytes de comprimento. 580 00:27:13,650 --> 00:27:17,460 Existem 2 para o 32 endereços de memória. 581 00:27:17,460 --> 00:27:21,310 De 0 a 2 para o 32 menos 1. 582 00:27:21,310 --> 00:27:27,630 E eu não sou positivo, mas isso é provavelmente o escopo do que você precisa 583 00:27:27,630 --> 00:27:35,230 saber para uma máquina de 32 bits, que a memória endereços são, mais uma vez, quatro bytes de comprimento, 584 00:27:35,230 --> 00:27:39,620 e essa é a quantidade máxima de endereços de memória. 585 00:27:39,620 --> 00:27:41,680 >> Além disso, os tipos de dados - 586 00:27:41,680 --> 00:27:45,020 isso pode ser algo tão bem, isso é digno de nota. 587 00:27:45,020 --> 00:27:49,610 O tamanho de um tipo de dados depende a máquina que você está trabalhando. 588 00:27:49,610 --> 00:27:56,760 Assim, um char, um único personagem, é como muitos bytes em nosso aparelho CS50? 589 00:27:56,760 --> 00:27:57,980 Um byte. 590 00:27:57,980 --> 00:28:02,310 E é realmente um byte como bem em uma máquina de 64 bits. 591 00:28:02,310 --> 00:28:05,920 >> E a maioria dos tipos de dados são o mesmo número de bytes em ambas as máquinas. 592 00:28:05,920 --> 00:28:11,620 Mas alguns tipos de dados será diferente em ambas as máquinas. 593 00:28:11,620 --> 00:28:14,590 Assim que seria potencialmente única coisa que você precisa saber. 594 00:28:14,590 --> 00:28:16,710 >> Mas mesmo isso, eu acho, está além dos limites - 595 00:28:16,710 --> 00:28:20,990 Tenho quase certeza, se você olhar para trás em quizzes velhos, diz que, para assumir 596 00:28:20,990 --> 00:28:24,090 codificação problemas que você está usando uma máquina de 32-bit. 597 00:28:24,090 --> 00:28:26,620 598 00:28:26,620 --> 00:28:30,620 Mas há, para ir junto com isso em Caso você esteja interessado, há 599 00:28:30,620 --> 00:28:35,920 tipos de dados que são os mesmos tamanho em todas as máquinas. 600 00:28:35,920 --> 00:28:42,670 >> Se você já viu algo parecido uint32_t, você pode ou 601 00:28:42,670 --> 00:28:43,260 não vi isso. 602 00:28:43,260 --> 00:28:44,290 Isso é um tipo de dados. 603 00:28:44,290 --> 00:28:47,570 Isso está dizendo, seja de 32 bits não importa o que esta máquina está ligada. 604 00:28:47,570 --> 00:28:50,350 Então, quando as pessoas estão escrevendo portátil código, eles provavelmente não vai usar ints. 605 00:28:50,350 --> 00:28:53,260 Eles em vez vou usar esses outros dados tipos que sabe que vai ser o mesmo 606 00:28:53,260 --> 00:28:54,780 tamanho em cada máquina individual. 607 00:28:54,780 --> 00:28:58,080 608 00:28:58,080 --> 00:28:58,250 Madhu. 609 00:28:58,250 --> 00:29:00,150 >> MADHU: Eu tinha uma pergunta sobre o processo de compilação. 610 00:29:00,150 --> 00:29:04,110 Então, se você está escrevendo um programa que usa uma biblioteca como CS50 ou algo 611 00:29:04,110 --> 00:29:06,840 assim, eu sei que essa biblioteca tem que, em algum momento, ser 612 00:29:06,840 --> 00:29:08,590 compilado e ligado dentro 613 00:29:08,590 --> 00:29:13,380 Mas quanto do que acontece durante a compilação do seu programa? 614 00:29:13,380 --> 00:29:15,880 Que parte desse processo biblioteca ocorre quando você está 615 00:29:15,880 --> 00:29:18,560 compilar seu próprio programa? 616 00:29:18,560 --> 00:29:24,020 >> JASON HIRSCHHORN: Então vamos passar por cima em geral, os passos do presente processo. 617 00:29:24,020 --> 00:29:26,280 Você escreve seu arquivo c.. 618 00:29:26,280 --> 00:29:33,530 Em seu arquivo c., Você # include seu bibliotecas de cabeçalho, por exemplo, cs50.h. 619 00:29:33,530 --> 00:29:39,480 O que isso acentuada incluem linha de fazer para o seu programa? 620 00:29:39,480 --> 00:29:40,525 Akchar. 621 00:29:40,525 --> 00:29:43,350 >> AKCHAR: Acrescenta os protótipos de as funções a partir do cabeçalho 622 00:29:43,350 --> 00:29:45,120 arquivos das bibliotecas. 623 00:29:45,120 --> 00:29:45,600 >> JASON HIRSCHHORN: Exatamente. 624 00:29:45,600 --> 00:29:49,870 Acrescenta esses protótipos de função ao seu código. 625 00:29:49,870 --> 00:29:55,230 Então, quando seu código está sendo compilado em estágios iniciais, o compilador sabe 626 00:29:55,230 --> 00:29:59,250 que essas funções realmente existem, e que em algum lugar eles foram definidos. 627 00:29:59,250 --> 00:30:02,460 Os arquivos. H não incluem o definições para estas funções ou como 628 00:30:02,460 --> 00:30:03,950 eles realmente funcionam. 629 00:30:03,950 --> 00:30:07,960 Cs50.h apenas inclui algo que diz getstring é uma coisa real que 630 00:30:07,960 --> 00:30:09,270 pode acontecer. 631 00:30:09,270 --> 00:30:14,240 E standardio.h diz printf é uma coisa real que pode acontecer. 632 00:30:14,240 --> 00:30:23,190 >> Portanto, sua linguagem c com isso. Cabeçalho arquivo é transformado em alguns 633 00:30:23,190 --> 00:30:27,750 código de leitura óptica, que eventualmente se transformou em binário 634 00:30:27,750 --> 00:30:30,030 código, 0 e 1 do. 635 00:30:30,030 --> 00:30:33,590 E esse é o código que, em última instância é executado. 636 00:30:33,590 --> 00:30:38,550 A l-line CS50 - por exemplo, quando você está escrevendo Clang - 637 00:30:38,550 --> 00:30:41,830 e então você incluir-l CS50, que você digita dentro 638 00:30:41,830 --> 00:30:42,180 E você vê isso. 639 00:30:42,180 --> 00:30:43,890 Quando você escreve faz, você vai ver que line-up aqui. 640 00:30:43,890 --> 00:30:47,740 E vamos ver que em um segundo quando codificamos ou mais tarde, quando código. 641 00:30:47,740 --> 00:30:50,390 >> Mas a linha que CS50-l faz algo um pouco diferente do que 642 00:30:50,390 --> 00:30:52,440 o # include cs50.h. 643 00:30:52,440 --> 00:30:56,300 O que faz linha que-l CS50 fazer? 644 00:30:56,300 --> 00:30:56,820 Avi? 645 00:30:56,820 --> 00:31:00,310 >> AVI: Eu quero dizer que ele se vincula a biblioteca para a função 646 00:31:00,310 --> 00:31:02,710 chamar, como os arquivos. Ó. 647 00:31:02,710 --> 00:31:08,200 >> JASON HIRSCHHORN: Então muito perto, se não spot-on. 648 00:31:08,200 --> 00:31:16,220 A l-CS50 leva o arquivo binário e funde-se com o seu arquivo binário. 649 00:31:16,220 --> 00:31:21,410 Então cs50.h, não há ponto de viragem cs50.h da linguagem C para binário cada 650 00:31:21,410 --> 00:31:23,130 única hora que ele está sendo usado. 651 00:31:23,130 --> 00:31:26,650 Isso seria bobagem, porque isso seria um desperdício de tempo. 652 00:31:26,650 --> 00:31:30,420 Por isso, já foi compilado e se transformou em um executável. 653 00:31:30,420 --> 00:31:35,430 E agora ele vai ser fundidas com o seu arquivo no final. 654 00:31:35,430 --> 00:31:38,370 Portanto, aqueles 1 e 0 estão indo fundir-se com os seus entes 655 00:31:38,370 --> 00:31:39,150 e 0 no final. 656 00:31:39,150 --> 00:31:43,670 Então, agora você vai realmente ter o real 1 e 0 que definem como getstring, 657 00:31:43,670 --> 00:31:47,890 por exemplo, trabalha, ou como printf, por exemplo, funciona. 658 00:31:47,890 --> 00:31:52,750 >> E para mais informações, há uma compiladores curtas que Nate dá que 659 00:31:52,750 --> 00:31:55,410 você deve verificar que vai por estas etapas. 660 00:31:55,410 --> 00:31:56,050 Mas - 661 00:31:56,050 --> 00:31:56,560 Sim. 662 00:31:56,560 --> 00:32:01,700 >> ALUNO: eles estão sempre em arquivos S. quando estão na forma de biblioteca, 663 00:32:01,700 --> 00:32:06,764 pronto a ser incorporado, ligado - como eles estão no código binário? 664 00:32:06,764 --> 00:32:07,600 >> JASON HIRSCHHORN: OK. 665 00:32:07,600 --> 00:32:08,420 O que - 666 00:32:08,420 --> 00:32:11,780 >> ALUNO: É sempre o caso para as bibliotecas quando você ligá-los? 667 00:32:11,780 --> 00:32:12,500 >> JASON HIRSCHHORN: sim. 668 00:32:12,500 --> 00:32:17,300 Portanto, há arquivos, o que será é. S o código de máquina, que também será 669 00:32:17,300 --> 00:32:17,975 enigmática para você. 670 00:32:17,975 --> 00:32:19,410 Você não precisa se preocupar com esses. 671 00:32:19,410 --> 00:32:24,930 Mas, geralmente, sim, eles vão estar no formato. o arquivos prontos para ir. 672 00:32:24,930 --> 00:32:27,170 >> Estudante: Então, quando você enviar para uma biblioteca, não só enviamos 673 00:32:27,170 --> 00:32:28,880 o h. eo. o? 674 00:32:28,880 --> 00:32:32,210 Você não enviar o. C ou o. S. 675 00:32:32,210 --> 00:32:33,070 >> JASON HIRSCHHORN: So - 676 00:32:33,070 --> 00:32:36,260 e este é neste curto, bem como, se esta informação parece vir a 677 00:32:36,260 --> 00:32:36,700 pouco rapidamente. 678 00:32:36,700 --> 00:32:39,870 Mas o curto em compiladores fala sobre isso também. 679 00:32:39,870 --> 00:32:43,290 Quando você envia uma biblioteca, se você enviar o h., o arquivo de cabeçalho, os 680 00:32:43,290 --> 00:32:46,290 protótipos de função, ea 1 de e 0 de, isso é tudo que você precisa para dar. 681 00:32:46,290 --> 00:32:50,640 Você não precisa dar a forma como o função funciona, o arquivo c.. 682 00:32:50,640 --> 00:32:56,360 Porque o ponto de abstração, ou o apontar APIs, o ponto neste SPL, 683 00:32:56,360 --> 00:32:59,650 a biblioteca portátil de Stanford, é para você não se preocupar sobre como novo 684 00:32:59,650 --> 00:33:04,220 GRect funciona, ou como mover obras, ou como adicionar obras. 685 00:33:04,220 --> 00:33:06,520 Tudo o que você precisa saber é que add é uma função que você pode 686 00:33:06,520 --> 00:33:08,880 usar, e ele faz isso. 687 00:33:08,880 --> 00:33:12,760 Então, você realmente não precisa saber como é escrito em C. Você só precisa 688 00:33:12,760 --> 00:33:15,460 sabe, aqui são as funções, o que eles fazer, e aqui estão as de 1 e 0 689 00:33:15,460 --> 00:33:18,870 quando você realmente quiser usá-los. 690 00:33:18,870 --> 00:33:19,530 >> Legal. 691 00:33:19,530 --> 00:33:26,980 Mais alguma pergunta sobre compiladores ou de outros tópicos sobre a placa? 692 00:33:26,980 --> 00:33:30,300 >> ALUNO: Eu tenho uma pergunta de implementação de funções recursivas. 693 00:33:30,300 --> 00:33:31,170 Uma pergunta sobre a recursividade. 694 00:33:31,170 --> 00:33:33,030 Eu tinha a sensação de que iria vir para cima. 695 00:33:33,030 --> 00:33:38,310 Então, vamos rapidamente passar por recursão com um específico 696 00:33:38,310 --> 00:33:40,690 exemplo, uma função fatorial. 697 00:33:40,690 --> 00:33:44,920 Porque este é um exemplo que muitas vezes surge ou é usado 698 00:33:44,920 --> 00:33:46,170 para ilustrar a recursividade. 699 00:33:46,170 --> 00:33:52,390 700 00:33:52,390 --> 00:33:56,410 >> Assim, "4!" é lido como 4 fatorial. 701 00:33:56,410 --> 00:33:59,120 E o que 4 fatorial significa? 702 00:33:59,120 --> 00:34:00,696 O que isso faz? 703 00:34:00,696 --> 00:34:02,235 Como calcular 4 fatorial? 704 00:34:02,235 --> 00:34:05,250 705 00:34:05,250 --> 00:34:07,960 4 vezes 3 vezes 2 vezes 1. 706 00:34:07,960 --> 00:34:11,889 >> Assim, uma outra maneira de escrever 4 fatorial é escrever isso. 707 00:34:11,889 --> 00:34:16,780 708 00:34:16,780 --> 00:34:19,022 4 vezes 3 fatorial. 709 00:34:19,022 --> 00:34:22,080 Porque 3 fatorial é 3 vezes 2 vezes 1. 710 00:34:22,080 --> 00:34:27,580 SO 4 vezes 3 fatorial é 4 vezes 3 vezes 2 vezes 1. 711 00:34:27,580 --> 00:34:32,679 É por isso que fatorial é um grande candidato a recursão, porque é 712 00:34:32,679 --> 00:34:36,630 claro que não é algo que acontece mais e mais e mais em um 713 00:34:36,630 --> 00:34:39,820 menor número de coisas até você chegar ao fim. 714 00:34:39,820 --> 00:34:42,570 Quando você chegar a 1, 1 fatorial é 1. 715 00:34:42,570 --> 00:34:43,719 Você não pode ir muito mais longe. 716 00:34:43,719 --> 00:34:47,219 0 fatorial também é definida como 1. 717 00:34:47,219 --> 00:34:50,679 Então, quando você começa a 1 ou 0, você está no final, e você pode 718 00:34:50,679 --> 00:34:53,219 começar a ir para cima. 719 00:34:53,219 --> 00:34:59,540 Então, se nós queria escrever uma recursiva função para calcular a fatorial, 720 00:34:59,540 --> 00:35:02,170 vamos escrever algum pseudocódigo para isso agora. 721 00:35:02,170 --> 00:35:03,300 Antes de escrever que pseudocódigo - 722 00:35:03,300 --> 00:35:05,660 Eu vou dar a vocês um par de minutos para escrever o código pseudo ou apenas pensar 723 00:35:05,660 --> 00:35:09,600 sobre isso - há duas coisas a cada função recursiva precisa. 724 00:35:09,600 --> 00:35:12,530 O que são essas duas coisas? 725 00:35:12,530 --> 00:35:13,220 >> JACK: Ele tem que se identificar. 726 00:35:13,220 --> 00:35:13,680 >> JASON HIRSCHHORN: Noah? 727 00:35:13,680 --> 00:35:14,460 Oh, Jack. 728 00:35:14,460 --> 00:35:15,100 Vá em frente. 729 00:35:15,100 --> 00:35:16,640 >> JACK: Ele tem que se identificar. 730 00:35:16,640 --> 00:35:19,220 >> JASON HIRSCHHORN: Então uma recursiva função precisa de uma chamada recursiva, uma 731 00:35:19,220 --> 00:35:20,220 chamar a si mesmo. 732 00:35:20,220 --> 00:35:20,770 Essa é uma. 733 00:35:20,770 --> 00:35:21,510 E qual é a outra coisa? 734 00:35:21,510 --> 00:35:22,250 >> JACK: Um caso base. 735 00:35:22,250 --> 00:35:23,780 >> JASON HIRSCHHORN: Um caso base. 736 00:35:23,780 --> 00:35:26,940 Um caso base é, aqui é quando paramos. 737 00:35:26,940 --> 00:35:29,510 Portanto, sua função é chamada. 738 00:35:29,510 --> 00:35:31,410 O caso base vem em primeiro lugar. 739 00:35:31,410 --> 00:35:33,710 Você quer saber se você está no final. 740 00:35:33,710 --> 00:35:37,110 E se você não está no fim, você fazer a sua chamada recursiva. 741 00:35:37,110 --> 00:35:39,880 E você passar por esta função novamente, verificar o seu caso base novamente. 742 00:35:39,880 --> 00:35:42,575 Se você não é o fim, você faz outra chamada recursiva, 743 00:35:42,575 --> 00:35:44,130 et cetera, et cetera. 744 00:35:44,130 --> 00:35:47,110 >> É por isso que funções recursivas sempre precisar desses casos base e aqueles 745 00:35:47,110 --> 00:35:48,210 chamadas recursivas. 746 00:35:48,210 --> 00:35:51,280 Se você não tem uma chamada recursiva, ele não seria uma função recursiva. 747 00:35:51,280 --> 00:35:53,210 Se você não tem um caso base, você iria para sempre e 748 00:35:53,210 --> 00:35:54,780 não haveria final. 749 00:35:54,780 --> 00:35:57,870 E o caso base sempre vem em primeiro lugar, porque você vai sempre querer verificar 750 00:35:57,870 --> 00:36:00,420 se você estiver no final primeiro. 751 00:36:00,420 --> 00:36:04,770 Então, antes de fazer algum pseudocódigo, por que você não dê um minuto para pensar sobre 752 00:36:04,770 --> 00:36:09,360 como uma função fatorial recursiva seria escrito? 753 00:36:09,360 --> 00:36:23,340 754 00:36:23,340 --> 00:36:26,010 >> Além disso, como muitos como você está fazendo, escrita -lo em uma folha de papel é 755 00:36:26,010 --> 00:36:27,960 o que você vai ter que fazer sobre o teste de amanhã. 756 00:36:27,960 --> 00:36:32,160 Então, provavelmente, uma boa prática para fazer Certifique-se o código que você está escrevendo 757 00:36:32,160 --> 00:36:34,420 para baixo na folha de papel - 758 00:36:34,420 --> 00:36:35,160 ou você pode fazer isso. 759 00:36:35,160 --> 00:36:36,710 Você sabe onde as vírgulas são. 760 00:36:36,710 --> 00:36:37,660 Você se lembra da sintaxe. 761 00:36:37,660 --> 00:36:40,400 Porque você não está ser capaz de ter uma compilador dizer que você fez um erro. 762 00:36:40,400 --> 00:37:02,356 763 00:37:02,356 --> 00:37:07,240 >> Além disso, ao longo destas linhas, amanhã, quando você tem problemas de codificação, se você 764 00:37:07,240 --> 00:37:11,490 está apressado para o tempo, ou se você estiver muito confuso a respeito de como você deveria 765 00:37:11,490 --> 00:37:16,030 escrever a coisa particular em c, é caberia a escrever pseudo-código 766 00:37:16,030 --> 00:37:18,160 ou escrever comentários no bem. 767 00:37:18,160 --> 00:37:21,940 Porque não há crédito parcial para um Muitas das perguntas sobre o quiz. 768 00:37:21,940 --> 00:37:24,840 Então você pode ser apressado, ou você só poderia ser confundido. 769 00:37:24,840 --> 00:37:28,030 Escrevendo em comentários ou pseudo-código são frequentemente formas que 770 00:37:28,030 --> 00:37:29,360 pode obter crédito parcial. 771 00:37:29,360 --> 00:37:31,440 >> Portanto, não deixe algo em branco no questionário. 772 00:37:31,440 --> 00:37:33,490 Não há penalidades para colocar as coisas dentro 773 00:37:33,490 --> 00:37:37,650 Na verdade, colocando em pseudo-código ou Comentários vai ajudar o aluno 774 00:37:37,650 --> 00:37:40,410 descobrir se você realmente sabe o que você está falando, e talvez prêmio 775 00:37:40,410 --> 00:37:42,030 lhe algum crédito parcial para isso. 776 00:37:42,030 --> 00:37:44,510 >> Também nesse sentido, escrever com clareza. 777 00:37:44,510 --> 00:37:47,650 Se nós não podemos realmente o que você está escrevendo, não vamos chamá-lo 778 00:37:47,650 --> 00:37:49,900 à meia-noite de amanhã a figura o que você escreveu. 779 00:37:49,900 --> 00:37:51,520 Nós apenas estamos indo para tirar pontos. 780 00:37:51,520 --> 00:37:56,570 Escreva de forma clara para que possamos ouvir, ou melhor, podemos ler o que você escreveu. 781 00:37:56,570 --> 00:38:00,230 >> E se ele diz duas frases, não escreva um parágrafo. 782 00:38:00,230 --> 00:38:02,280 Siga as instruções. 783 00:38:02,280 --> 00:38:03,500 Escrever de forma clara. 784 00:38:03,500 --> 00:38:07,720 E escrever nestes comentários ou pseudocódigo para questões que poderiam 785 00:38:07,720 --> 00:38:10,270 crédito parcial prêmio. 786 00:38:10,270 --> 00:38:12,520 >> OK, vamos ao fatorial. 787 00:38:12,520 --> 00:38:15,000 Portanto, temos uma função fatorial. 788 00:38:15,000 --> 00:38:18,400 789 00:38:18,400 --> 00:38:21,550 Se eu fosse realmente escrever isso em C, o que eu preciso para colocar antes do nome 790 00:38:21,550 --> 00:38:22,800 da função? 791 00:38:22,800 --> 00:38:24,880 792 00:38:24,880 --> 00:38:30,060 O tipo de retorno, o qual, neste caso, vamos dar-lhe int. 793 00:38:30,060 --> 00:38:35,450 E, em seguida, dentro das chaves, é o que se passa dentro das chaves para 794 00:38:35,450 --> 00:38:36,850 uma função? 795 00:38:36,850 --> 00:38:37,950 >> ESTUDANTES: tipo de argumento. 796 00:38:37,950 --> 00:38:39,150 >> JASON HIRSCHHORN: Os seus argumentos. 797 00:38:39,150 --> 00:38:42,680 Então, provavelmente, fatorial tomar um argumento. 798 00:38:42,680 --> 00:38:44,500 Ele provavelmente vai ter apenas um argumento. 799 00:38:44,500 --> 00:38:49,450 E vamos dizer que vai demorar um inteiro chamado x. 800 00:38:49,450 --> 00:38:52,770 E mais uma vez, ao escrever o protótipo de uma função ou escrever a função 801 00:38:52,770 --> 00:38:57,110 em seu código antes de defini-la, você escrever o tipo de dados e o nome 802 00:38:57,110 --> 00:39:01,370 essa variável para apenas essa função. 803 00:39:01,370 --> 00:39:06,350 Assim, você pode passar um número para este função, ele vai ser referido como x 804 00:39:06,350 --> 00:39:07,340 internamente. 805 00:39:07,340 --> 00:39:08,755 >> Nós temos nossa função fatorial. 806 00:39:08,755 --> 00:39:12,030 807 00:39:12,030 --> 00:39:15,850 Precisamos de duas coisas, um caso base e uma chamada recursiva. 808 00:39:15,850 --> 00:39:20,900 O que é o caso base para fatorial? 809 00:39:20,900 --> 00:39:24,850 Alguém que escreveu-lo e que não tem falado ainda, o que é a base 810 00:39:24,850 --> 00:39:26,100 caso para fatorial? 811 00:39:26,100 --> 00:39:28,400 812 00:39:28,400 --> 00:39:30,930 >> ALUNO: Se n é menor de 2, retornar 1. 813 00:39:30,930 --> 00:39:33,520 >> JASON HIRSCHHORN: Se n é inferior a 2, retornar 1. 814 00:39:33,520 --> 00:39:37,216 Eu gosto disso, porque isso cuida de 0 e 1. 815 00:39:37,216 --> 00:39:45,290 Então, vamos fazer x <2, o retorno 1. 816 00:39:45,290 --> 00:39:47,870 Se conseguir passar 0, se tivermos passou 1, esta função 817 00:39:47,870 --> 00:39:49,790 retornar imediatamente 1. 818 00:39:49,790 --> 00:39:54,020 Se conseguir passar algum número maior ou igual a 2, vamos 819 00:39:54,020 --> 00:39:55,370 temos nossa chamada recursiva. 820 00:39:55,370 --> 00:39:57,855 >> E então, como é que vai funcionar? 821 00:39:57,855 --> 00:40:01,070 Pode alguém que trabalhou neste que ainda não tenha falado me dar a 822 00:40:01,070 --> 00:40:07,380 chamada recursiva para esta função em pseudocódigo? 823 00:40:07,380 --> 00:40:10,770 Se conseguir passar em um número x e é superior a 2, o que 824 00:40:10,770 --> 00:40:13,370 que queremos fazer? 825 00:40:13,370 --> 00:40:17,930 Temos também um exemplo escrito no lado que pode lhe dar uma dica. 826 00:40:17,930 --> 00:40:20,770 >> ESTUDANTE: Call x vezes o fatorial de x menos 1? 827 00:40:20,770 --> 00:40:22,020 >> JASON HIRSCHHORN: Exatamente. 828 00:40:22,020 --> 00:40:24,610 829 00:40:24,610 --> 00:40:37,750 Nós vamos voltar x vezes o fatorial de x menos 1. 830 00:40:37,750 --> 00:40:41,810 E isso, mesmo que eu escrevi, basicamente, o que você disse em Inglês, 831 00:40:41,810 --> 00:40:44,580 esta função fatorial será chamado novamente. 832 00:40:44,580 --> 00:40:46,320 Ele vai executar em x menos 1. 833 00:40:46,320 --> 00:40:49,320 Vai voltar com algum inteiro, e então ele vai multiplicar estes dois 834 00:40:49,320 --> 00:40:52,050 em conjunto, e esse valor será voltou para o que chamou este 835 00:40:52,050 --> 00:40:55,010 função fatorial, o que pode ser outra instância do 836 00:40:55,010 --> 00:40:58,420 esta função fatorial. 837 00:40:58,420 --> 00:41:01,360 >> Assim que é um exemplo de um recursiva função, uma muito 838 00:41:01,360 --> 00:41:02,530 função recursiva simples. 839 00:41:02,530 --> 00:41:04,530 Mas a maioria deles vai ser assim. 840 00:41:04,530 --> 00:41:11,170 Se você gostaria de um bom recursiva desafio para o teste, tente codificação 841 00:41:11,170 --> 00:41:13,230 busca binária recursiva. 842 00:41:13,230 --> 00:41:18,950 Porque se você fez a busca binária para conjunto de problemas de três, você provavelmente fez isso 843 00:41:18,950 --> 00:41:21,730 iterativa em um loop while. 844 00:41:21,730 --> 00:41:23,700 >> Mas também pode ser escrito de forma recursiva. 845 00:41:23,700 --> 00:41:26,310 Você está indo a necessidade de escrever o seu próprio função separada que leva algum 846 00:41:26,310 --> 00:41:29,020 diferentes argumentos de linha de comando - ou nem argumentos de linha de comando, alguns 847 00:41:29,020 --> 00:41:30,910 diferentes argumentos apenas regulares. 848 00:41:30,910 --> 00:41:33,870 Mas você pode escrever de busca binária recursivamente bem. 849 00:41:33,870 --> 00:41:36,190 >> ALUNO: Então você poderia ter escrito também, em vez de x menos 1, você 850 00:41:36,190 --> 00:41:39,502 também poderia ter escrito x menos menos, ou você poderia ter 851 00:41:39,502 --> 00:41:40,830 escrito menos menos x. 852 00:41:40,830 --> 00:41:44,740 Você pode apenas explicar muito rapidamente porque esses seriam coisas diferentes, 853 00:41:44,740 --> 00:41:49,510 como o que é a diferença entre x menos menos e menos menos x? 854 00:41:49,510 --> 00:41:51,320 >> JASON HIRSCHHORN: Não, eu não sou vai entrar nessa. 855 00:41:51,320 --> 00:41:55,500 Mas vou falar com você sobre isso depois classe. x menos menos, menos negativo x 856 00:41:55,500 --> 00:41:57,780 diminuir x por 1. 857 00:41:57,780 --> 00:41:59,090 Mas eles fazem isso um pouco diferente. 858 00:41:59,090 --> 00:42:00,340 Mas eu não quero entrar em detalhes. 859 00:42:00,340 --> 00:42:04,330 860 00:42:04,330 --> 00:42:09,090 Outras perguntas sobre recursão ou esta função? 861 00:42:09,090 --> 00:42:10,140 Isso não é realmente mesmo pseudocódigo. 862 00:42:10,140 --> 00:42:15,060 Isso é basicamente o código C você escreveria para isso. 863 00:42:15,060 --> 00:42:19,393 >> OK, quaisquer outras perguntas sobre temas aqui em cima? 864 00:42:19,393 --> 00:42:19,864 É. 865 00:42:19,864 --> 00:42:23,130 >> ALUNO: Eu tenho um rápido resumo ponto flutuante de precisão e. 866 00:42:23,130 --> 00:42:24,260 >> JASON HIRSCHHORN: Flutuante ponto e precisão. 867 00:42:24,260 --> 00:42:26,920 Pode alguém realmente rapidamente dê-me um resumo de 868 00:42:26,920 --> 00:42:28,210 ponto flutuante e precisão? 869 00:42:28,210 --> 00:42:30,420 Todos vocês tiveram que fazer isso para o seu conjunto de problemas, de modo que você é tudo 870 00:42:30,420 --> 00:42:31,700 familiarizado com ele. 871 00:42:31,700 --> 00:42:35,090 Ou talvez não todos vocês. 872 00:42:35,090 --> 00:42:36,602 Qualquer um? 873 00:42:36,602 --> 00:42:39,530 Dê-me um ponto de começar. 874 00:42:39,530 --> 00:42:40,750 Ponto flutuante e precisão. 875 00:42:40,750 --> 00:42:42,380 Qual é o problema? 876 00:42:42,380 --> 00:42:42,960 Sim. 877 00:42:42,960 --> 00:42:43,680 Victoria? 878 00:42:43,680 --> 00:42:44,480 >> VANESSA: Vanessa. 879 00:42:44,480 --> 00:42:45,285 >> JASON HIRSCHHORN: Vanessa. 880 00:42:45,285 --> 00:42:45,680 Desculpe. 881 00:42:45,680 --> 00:42:51,550 >> VANESSA: Há apenas um número finito de números que podem ser representados 882 00:42:51,550 --> 00:42:57,930 porque você está em um em nossa caso, um sistema de 32 bits. 883 00:42:57,930 --> 00:43:03,080 Então você meio que tem que fazer-se alguns números. 884 00:43:03,080 --> 00:43:03,910 >> JASON HIRSCHHORN: Então é isso exatamente correto. 885 00:43:03,910 --> 00:43:08,110 Há apenas uma certa quantidade de números que podem ser representados. 886 00:43:08,110 --> 00:43:11,770 Se você multiplicar dois números muito grandes, pode transbordar a quantidade 887 00:43:11,770 --> 00:43:13,950 de espaços que você tem de representar um inteiro. 888 00:43:13,950 --> 00:43:17,930 É por isso que às vezes nós usamos um long long em vez de um int. 889 00:43:17,930 --> 00:43:19,210 Isso tem mais espaços. 890 00:43:19,210 --> 00:43:21,210 Que pode conter um número maior. 891 00:43:21,210 --> 00:43:24,310 >> Ponto flutuante de precisão tem a ver com que, mas também tem a ver com o 892 00:43:24,310 --> 00:43:29,300 fato de que os números decimais são Nem sempre representados. 893 00:43:29,300 --> 00:43:29,540 Desculpe. 894 00:43:29,540 --> 00:43:31,280 Deixe-me colocar isso de volta. 895 00:43:31,280 --> 00:43:36,610 O número decimal 1.0 nem sempre é representado como seria de esperar, 896 00:43:36,610 --> 00:43:40,770 1,000 milhões. 897 00:43:40,770 --> 00:43:50,360 Às vezes é representado como 1,000000001 ou 0,999999999. 898 00:43:50,360 --> 00:43:52,780 Pode-se até mesmo 89 jogados em algum lugar. 899 00:43:52,780 --> 00:43:56,560 Assim, os números decimais não são representado exatamente como você faria 900 00:43:56,560 --> 00:43:58,430 esperar que eles sejam representados. 901 00:43:58,430 --> 00:44:00,010 >> Assim, no conjunto de problemas - 902 00:44:00,010 --> 00:44:00,860 era dois? - 903 00:44:00,860 --> 00:44:05,290 conjunto de problemas dois, onde lidamos com números de ponto flutuante, quando queríamos 904 00:44:05,290 --> 00:44:08,690 los para representar exatamente o que queríamos los para representar o número 905 00:44:08,690 --> 00:44:12,860 de moedas de um centavo, ou o número de centavos, nós multiplicá-los por 100. 906 00:44:12,860 --> 00:44:14,750 Nós viramos eles. 907 00:44:14,750 --> 00:44:18,660 E, então, cortar tudo atrás do ponto decimal. 908 00:44:18,660 --> 00:44:22,020 Isso era para garantir que eles iriam realmente igual exatamente o que queríamos 909 00:44:22,020 --> 00:44:22,410 los para igualar. 910 00:44:22,410 --> 00:44:26,870 >> Porque quando você toma algo que é a flutuar e transformá-lo em um int, você 911 00:44:26,870 --> 00:44:29,860 cortar tudo para a direita do ponto decimal. 912 00:44:29,860 --> 00:44:33,900 Porque há algum ponto flutuante imprecisão, 100.000 poderiam ser 913 00:44:33,900 --> 00:44:37,440 representada como 99,999999999. 914 00:44:37,440 --> 00:44:40,350 E se você acabou de cortar tudo para o direito de imediato, você vai 915 00:44:40,350 --> 00:44:41,600 obter o número errado. 916 00:44:41,600 --> 00:44:44,050 917 00:44:44,050 --> 00:44:44,180 É. 918 00:44:44,180 --> 00:44:45,290 >> ALUNO: Eu tinha uma pergunta sobre o elenco. 919 00:44:45,290 --> 00:44:47,500 Que ordem ele ocorre em? 920 00:44:47,500 --> 00:44:54,480 Se você faria flutuar, suportes, 1 dividido por 10, ele faz 1 dividido por 10, 921 00:44:54,480 --> 00:44:58,910 em seguida, obter 0,1, em seguida, ligue -lo em um carro alegórico? 922 00:44:58,910 --> 00:45:01,470 >> JASON HIRSCHHORN: Se você fizer flutuar 1 dividido por 10 - 923 00:45:01,470 --> 00:45:02,550 >> ALUNO: Sim, e, em seguida, é igual a - 924 00:45:02,550 --> 00:45:04,240 Bem, seria normalmente tê-lo em igual - 925 00:45:04,240 --> 00:45:04,690 É. 926 00:45:04,690 --> 00:45:06,760 Você quer torná-lo um carro alegórico, certo? 927 00:45:06,760 --> 00:45:12,790 >> JASON HIRSCHHORN: OK, então vamos usar isso para segue em descobrir 928 00:45:12,790 --> 00:45:15,390 as respostas a estas perguntas através de codificação. 929 00:45:15,390 --> 00:45:18,180 Porque você provavelmente vai ter um monte de estas perguntas minutos, e uma boa maneira 930 00:45:18,180 --> 00:45:19,100 para resolvê-los é através da codificação. 931 00:45:19,100 --> 00:45:21,320 Então, nós estamos indo para codificar isso agora, e então vamos voltar e 932 00:45:21,320 --> 00:45:24,020 codificar a pergunta que você tinha. 933 00:45:24,020 --> 00:45:24,950 >> Assim, a primeira linha - 934 00:45:24,950 --> 00:45:29,390 Eu não deveria ter escrito - o que é a primeira coisa que queremos fazer quando 935 00:45:29,390 --> 00:45:32,250 abrir um novo arquivo no gedit? 936 00:45:32,250 --> 00:45:34,190 >> ALUNO: Incluir. 937 00:45:34,190 --> 00:45:35,920 >> JASON HIRSCHHORN: Incluir o quê? 938 00:45:35,920 --> 00:45:37,952 >> ALUNO: biblioteca CS50. 939 00:45:37,952 --> 00:45:39,920 >> JASON HIRSCHHORN: OK. 940 00:45:39,920 --> 00:45:42,590 O que mais devemos incluir? 941 00:45:42,590 --> 00:45:46,820 Nós apenas estamos indo para verificar o que acontece quando você lançar algo a uma bóia. 942 00:45:46,820 --> 00:45:48,605 Mas o que precisamos incluir, se estamos vai escrever um programa em C? 943 00:45:48,605 --> 00:45:49,300 >> ALUNO: Padrão I / O. 944 00:45:49,300 --> 00:45:50,625 >> JASON HIRSCHHORN: stdio.h. 945 00:45:50,625 --> 00:45:54,880 Nós realmente não precisa, para este programa, cs50.h, mesmo que seja 946 00:45:54,880 --> 00:45:55,920 sempre útil para incluí-lo. 947 00:45:55,920 --> 00:45:58,260 Mas nós sempre precisamos stdio.h. 948 00:45:58,260 --> 00:45:59,660 >> ALUNO: Quando a codificação em C? 949 00:45:59,660 --> 00:46:15,770 >> JASON HIRSCHHORN: Quando a codificação em C. 950 00:46:15,770 --> 00:46:17,090 >> Então eu salvá-lo como este arquivo c.. 951 00:46:17,090 --> 00:46:18,590 Eu recebo algum bom destaque de sintaxe. 952 00:46:18,590 --> 00:46:22,890 Escrevi vazio dentro principal. 953 00:46:22,890 --> 00:46:24,792 O que o vazio significa? 954 00:46:24,792 --> 00:46:26,740 >> ALUNO: Não tomar qualquer argumentos de linha de comando. 955 00:46:26,740 --> 00:46:28,900 >> JASON Hirschhorn: meio vazio, neste caso, o principal não assume qualquer 956 00:46:28,900 --> 00:46:29,700 argumentos de linha de comando. 957 00:46:29,700 --> 00:46:32,720 Em outros casos, isto significa que a função não leva argumentos de linha de comando. 958 00:46:32,720 --> 00:46:36,560 Ou a função, se eu fosse escrever vazio main (void), que diria principais do 959 00:46:36,560 --> 00:46:38,460 não devolver nada. 960 00:46:38,460 --> 00:46:39,960 Então vazio só não significa nada. 961 00:46:39,960 --> 00:46:42,510 O que eu iria escrever, se eu fosse ter argumentos de linha de comando? 962 00:46:42,510 --> 00:46:45,250 963 00:46:45,250 --> 00:46:47,150 >> ALUNO: int arco c corda do arco v 964 00:46:47,150 --> 00:46:49,055 >> JASON HIRSCHHORN: int argc argv string. 965 00:46:49,055 --> 00:46:54,050 966 00:46:54,050 --> 00:46:55,572 É isso mesmo? 967 00:46:55,572 --> 00:46:58,720 >> ALUNO: É carac suportes estrela argv. 968 00:46:58,720 --> 00:47:01,730 >> JASON HIRSCHHORN: Então você poderia escrever suportes de corda argv ou char estrela argv 969 00:47:01,730 --> 00:47:03,710 colchetes, mas você precisa dos colchetes. 970 00:47:03,710 --> 00:47:06,290 Porque argv é um array de cordas, lembre-se. 971 00:47:06,290 --> 00:47:07,360 Não é apenas uma string. 972 00:47:07,360 --> 00:47:10,350 Então corda argv é, aqui está uma corda chamado argv. 973 00:47:10,350 --> 00:47:13,630 Suportes de Cordas argv é, aqui está uma matriz de strings. 974 00:47:13,630 --> 00:47:17,865 Então int argc argv suportes cadeia seria algo que eu 975 00:47:17,865 --> 00:47:18,810 provavelmente escrever. 976 00:47:18,810 --> 00:47:23,050 >> Então você queria salvar em um inteiro? 977 00:47:23,050 --> 00:47:24,285 >> ALUNO: Sim, inteiro. 978 00:47:24,285 --> 00:47:25,840 Ou, em um carro alegórico. 979 00:47:25,840 --> 00:47:26,710 >> JASON HIRSCHHORN: Em uma bóia? 980 00:47:26,710 --> 00:47:30,790 Como, float x é igual a 1 dividido por 10. 981 00:47:30,790 --> 00:47:32,040 >> JASON HIRSCHHORN: OK. 982 00:47:32,040 --> 00:47:40,160 983 00:47:40,160 --> 00:47:42,240 Como faço para imprimir um float em printf? 984 00:47:42,240 --> 00:47:45,100 985 00:47:45,100 --> 00:47:46,714 O quê? 986 00:47:46,714 --> 00:47:47,560 >> ALUNO:% f. 987 00:47:47,560 --> 00:47:48,300 >> JASON HIRSCHHORN:% f. 988 00:47:48,300 --> 00:47:50,810 O que é um número inteiro? 989 00:47:50,810 --> 00:47:52,110 d ou i. 990 00:47:52,110 --> 00:47:53,000 O que é uma string? 991 00:47:53,000 --> 00:47:54,240 >> ALUNO: s. 992 00:47:54,240 --> 00:47:56,140 >> JASON HIRSCHHORN: s. 993 00:47:56,140 --> 00:47:57,550 Como faço para obter uma nova linha? 994 00:47:57,550 --> 00:47:58,800 >> ALUNO: barra invertida n. 995 00:47:58,800 --> 00:48:04,610 996 00:48:04,610 --> 00:48:07,100 >> JASON HIRSCHHORN: O que eu retorno se principal é executado corretamente? 997 00:48:07,100 --> 00:48:08,360 >> ESTUDANTE: 0. 998 00:48:08,360 --> 00:48:09,430 Preciso escrever essa linha, embora? 999 00:48:09,430 --> 00:48:10,170 >> ALUNO: Não. 1000 00:48:10,170 --> 00:48:11,513 OK, não vamos escrevê-lo, então. 1001 00:48:11,513 --> 00:48:16,450 1002 00:48:16,450 --> 00:48:17,190 Qualquer pessoa pode ler isso? 1003 00:48:17,190 --> 00:48:18,485 Parece um pouco pequeno. 1004 00:48:18,485 --> 00:48:20,160 Todos podem ver, ou deveria Eu torná-lo maior? 1005 00:48:20,160 --> 00:48:23,480 1006 00:48:23,480 --> 00:48:25,100 Acho que para a câmera, vamos fazer um pouco maior, no entanto. 1007 00:48:25,100 --> 00:48:35,750 1008 00:48:35,750 --> 00:48:38,410 >> JASON HIRSCHHORN: Se eu quero transformar este . C arquivo em um arquivo executável, o que 1009 00:48:38,410 --> 00:48:39,260 que eu escrevo? 1010 00:48:39,260 --> 00:48:41,610 >> ESTUDANTE: Faça teste. 1011 00:48:41,610 --> 00:48:42,080 >> JASON HIRSCHHORN: Desculpe? 1012 00:48:42,080 --> 00:48:42,790 >> ESTUDANTE: Faça teste. 1013 00:48:42,790 --> 00:48:44,040 >> JASON HIRSCHHORN: Faça teste. 1014 00:48:44,040 --> 00:48:46,700 1015 00:48:46,700 --> 00:48:48,410 Nós estávamos falando sobre esta linha anterior. 1016 00:48:48,410 --> 00:48:49,140 Clang. 1017 00:48:49,140 --> 00:48:51,270 O que há de bumbum? 1018 00:48:51,270 --> 00:48:52,200 O nome do compilador. 1019 00:48:52,200 --> 00:48:53,920 O que é essa linha? 1020 00:48:53,920 --> 00:48:55,580 >> ALUNO: Define-lo para uso de GDB. 1021 00:48:55,580 --> 00:48:59,230 >> JASON Hirschhorn: Define -lo para uso de GDB. 1022 00:48:59,230 --> 00:49:02,338 Esta linha, que é isso? 1023 00:49:02,338 --> 00:49:03,290 >> ALUNO: O código-fonte. 1024 00:49:03,290 --> 00:49:06,010 >> JASON HIRSCHHORN: Esse é o arquivo de origem, o arquivo c.. 1025 00:49:06,010 --> 00:49:08,150 O que essas duas linhas de fazer? 1026 00:49:08,150 --> 00:49:10,245 Ou estes dois não linhas. 1027 00:49:10,245 --> 00:49:12,300 >> ALUNO: It nomes que testar. 1028 00:49:12,300 --> 00:49:15,410 >> JASON HIRSCHHORN: Então o traço o diz, nomeá-lo algo diferente. 1029 00:49:15,410 --> 00:49:16,790 E aqui você está chamando-o de teste. 1030 00:49:16,790 --> 00:49:18,900 Se eu não tenho isso em, o que seria o nome disso? 1031 00:49:18,900 --> 00:49:20,260 >> ALUNO: a.out. 1032 00:49:20,260 --> 00:49:22,340 >> JASON HIRSCHHORN: a.out. 1033 00:49:22,340 --> 00:49:25,366 O que isso faz? 1034 00:49:25,366 --> 00:49:27,670 >> ALUNO: Ligações da biblioteca matemática. 1035 00:49:27,670 --> 00:49:29,550 >> JASON HIRSCHHORN: Liga a biblioteca matemática. 1036 00:49:29,550 --> 00:49:32,880 Nós não incluir a biblioteca de matemática, mas já que é tão comum, eles têm 1037 00:49:32,880 --> 00:49:35,780 make escrito para incluir sempre a biblioteca de matemática. 1038 00:49:35,780 --> 00:49:39,050 E da mesma forma, isso inclui a biblioteca de CS50. 1039 00:49:39,050 --> 00:49:43,010 >> OK, então se listar, agora temos um executável chamado teste. 1040 00:49:43,010 --> 00:49:45,150 Para executá-lo, eu escrevo teste. 1041 00:49:45,150 --> 00:49:48,330 Eu vejo que o meu ponto flutuante, como esperado, é igual a 0. 1042 00:49:48,330 --> 00:49:50,890 1043 00:49:50,890 --> 00:49:51,590 Será que isso - 1044 00:49:51,590 --> 00:49:52,060 so - 1045 00:49:52,060 --> 00:49:55,210 >> Estudante: Então, se você colocar flutuar agora, como você lançá-lo como float - 1046 00:49:55,210 --> 00:49:56,870 >> JASON HIRSCHHORN: Elenco o 1 a uma bóia? 1047 00:49:56,870 --> 00:49:59,180 >> ALUNO: Não, atire a coisa completa - 1048 00:49:59,180 --> 00:49:59,500 sim. 1049 00:49:59,500 --> 00:50:02,460 Se você acabou de fazer isso, não que fazê-lo de 0,1? 1050 00:50:02,460 --> 00:50:07,170 >> JASON HIRSCHHORN: OK, então muito rapidamente, 1 dividido por 10, são 1051 00:50:07,170 --> 00:50:08,690 inteiros sendo dividido. 1052 00:50:08,690 --> 00:50:13,580 Então, quando você dividir inteiros, eles são 0, e você está salvando que 0 em um 1053 00:50:13,580 --> 00:50:17,170 flutuar, porque a barra está apenas divisão inteira. 1054 00:50:17,170 --> 00:50:19,180 Então agora estamos transformando algo em um carro alegórico. 1055 00:50:19,180 --> 00:50:21,650 >> Vamos ver o que acontece. 1056 00:50:21,650 --> 00:50:22,900 Nós vamos fazer teste. 1057 00:50:22,900 --> 00:50:25,870 1058 00:50:25,870 --> 00:50:31,090 Então, agora vemos que esse corte não era divisão inteira, ele estava flutuando 1059 00:50:31,090 --> 00:50:32,640 divisão ponto. 1060 00:50:32,640 --> 00:50:35,700 Porque um dos seus argumentos tinha sido convertido em um float. 1061 00:50:35,700 --> 00:50:38,380 Então, agora ele estava dizendo, tratar esta divisão como estamos lidando com 1062 00:50:38,380 --> 00:50:40,140 Os pontos de flutuação, não com números inteiros. 1063 00:50:40,140 --> 00:50:42,760 E, assim, obter a resposta que esperamos. 1064 00:50:42,760 --> 00:50:44,620 >> Vamos ver o que acontece - 1065 00:50:44,620 --> 00:50:47,103 oops. 1066 00:50:47,103 --> 00:50:51,646 Se eu quisesse imprimir mais decimal manchas, como eu poderia fazer isso? 1067 00:50:51,646 --> 00:50:55,550 >> ALUNO: Ponto ponto f, ou como muitos casas decimais que você deseja. 1068 00:50:55,550 --> 00:51:02,280 1069 00:51:02,280 --> 00:51:04,440 >> JASON HIRSCHHORN: Então eu imprimir 10 pontos decimais. 1070 00:51:04,440 --> 00:51:06,610 E agora vemos que estamos recebendo algumas coisas estranhas. 1071 00:51:06,610 --> 00:51:09,650 E isso vai voltar para a sua pergunta cerca de ponto flutuante imprecisão. 1072 00:51:09,650 --> 00:51:10,950 Há coisas estranhas armazenados aqui. 1073 00:51:10,950 --> 00:51:13,650 1074 00:51:13,650 --> 00:51:15,275 >> OK, isso responde sua pergunta? 1075 00:51:15,275 --> 00:51:18,550 1076 00:51:18,550 --> 00:51:20,200 O que mais você quer para codificar rapidamente? 1077 00:51:20,200 --> 00:51:25,470 >> ALUNO: Eu só queria ver se ou não, se você liberou alguns ponteiro, 1078 00:51:25,470 --> 00:51:30,410 se esse ponteiro ainda tinha armazenado em que o endereço que tinha sido 1079 00:51:30,410 --> 00:51:32,170 apontando para anteriormente. 1080 00:51:32,170 --> 00:51:34,100 >> JASON HIRSCHHORN: OK, então vamos fazer isso. 1081 00:51:34,100 --> 00:51:38,030 Char ptr estrela, isso cria uma variável chamado ptr do tipo char estrela. 1082 00:51:38,030 --> 00:51:39,280 Como faço para escrever malloc? 1083 00:51:39,280 --> 00:51:40,550 Alden? 1084 00:51:40,550 --> 00:51:41,800 >> ALDEN: Apenas malloc. 1085 00:51:41,800 --> 00:51:44,820 1086 00:51:44,820 --> 00:51:51,040 Mas, então, ele tem que ser o tamanho de, e neste caso, eu acho que você 1087 00:51:51,040 --> 00:51:52,465 estar apontando para char. 1088 00:51:52,465 --> 00:51:54,450 Assim, seria de char. 1089 00:51:54,450 --> 00:51:57,520 >> JASON HIRSCHHORN: OK, então mais genericamente, Dentro - 1090 00:51:57,520 --> 00:51:58,770 vamos editar. 1091 00:51:58,770 --> 00:52:05,100 1092 00:52:05,100 --> 00:52:09,260 Dentro malloc, você deseja que o número de bytes na pilha. 1093 00:52:09,260 --> 00:52:12,320 Geralmente, o que temos visto que estamos fazendo é que estamos indo para malloc 1094 00:52:12,320 --> 00:52:14,940 cadeias, por exemplo, ou matrizes de inteiros. 1095 00:52:14,940 --> 00:52:21,600 Portanto, se queremos 10 inteiros, ou 10 caracteres, 10 nos dará 10. 1096 00:52:21,600 --> 00:52:24,370 E, em seguida, tamanho de caracteres daria nos de que o tamanho de caracteres, que na 1097 00:52:24,370 --> 00:52:25,120 Neste caso, é de 1 byte. 1098 00:52:25,120 --> 00:52:26,250 Ficamos com 10 bytes. 1099 00:52:26,250 --> 00:52:28,540 Se fôssemos escrever tamanho de int, que nos daria 40 bytes. 1100 00:52:28,540 --> 00:52:31,520 >> Então, mais genericamente, dentro de malloc é o número de bytes que você deseja. 1101 00:52:31,520 --> 00:52:34,620 Neste caso, estamos recebendo um byte. 1102 00:52:34,620 --> 00:52:36,900 Que parece ser um uso estranho de malloc, mas para o nosso 1103 00:52:36,900 --> 00:52:38,470 propósitos faz sentido. 1104 00:52:38,470 --> 00:52:40,420 Portanto, não é isso. 1105 00:52:40,420 --> 00:52:43,420 >> Vamos chamar livre. 1106 00:52:43,420 --> 00:52:47,040 Nós se livrar dele e usamos ptr novamente. 1107 00:52:47,040 --> 00:52:48,750 E o que você deseja verificar? 1108 00:52:48,750 --> 00:52:50,550 >> ALUNO: Eu só queria verificar se houve ou não qualquer coisa 1109 00:52:50,550 --> 00:52:51,900 no interior do mesmo. 1110 00:52:51,900 --> 00:52:53,050 >> JASON HIRSCHHORN: Então, se ele apontou para alguma coisa? 1111 00:52:53,050 --> 00:52:57,740 >> ALUNO: Sim, exatamente, se ele ainda tinha um endereço de memória. 1112 00:52:57,740 --> 00:53:02,220 >> JASON HIRSCHHORN: Então você quer para verificar o valor do PTR? 1113 00:53:02,220 --> 00:53:03,470 >> ALUNO: Sim, exatamente. 1114 00:53:03,470 --> 00:53:07,940 1115 00:53:07,940 --> 00:53:10,160 >> JASON HIRSCHHORN: O que eu escrevo aqui se eu quiser verificar o valor do 1116 00:53:10,160 --> 00:53:11,880 ponto - o que é, na Jordânia Dito isto, o valor? 1117 00:53:11,880 --> 00:53:13,720 Ou o que é armazenado dentro do PTR? 1118 00:53:13,720 --> 00:53:14,620 >> ESTUDANTE: Um endereço de memória. 1119 00:53:14,620 --> 00:53:16,330 >> JASON HIRSCHHORN: Um endereço de memória. 1120 00:53:16,330 --> 00:53:20,520 Então, se eu escrevo apenas isso, ele vai dá-me o valor de ptr. 1121 00:53:20,520 --> 00:53:22,800 E como faço para imprimir um endereço de memória? 1122 00:53:22,800 --> 00:53:26,470 Qual é a string de formato para um endereço de memória? 1123 00:53:26,470 --> 00:53:27,430 >> ALUNO:% p. 1124 00:53:27,430 --> 00:53:28,050 >> JASON HIRSCHHORN:% p. 1125 00:53:28,050 --> 00:53:29,500 % S é uma string. 1126 00:53:29,500 --> 00:53:30,750 % P para ponteiro. 1127 00:53:30,750 --> 00:53:40,820 1128 00:53:40,820 --> 00:53:43,540 É isso mesmo? 1129 00:53:43,540 --> 00:53:44,790 Isso é certo. 1130 00:53:44,790 --> 00:53:49,450 1131 00:53:49,450 --> 00:53:51,040 Então ptr é igual - 1132 00:53:51,040 --> 00:53:53,350 ainda tem algo no mesmo. 1133 00:53:53,350 --> 00:53:56,110 1134 00:53:56,110 --> 00:53:57,645 Este é provavelmente um maior pergunta interessante. 1135 00:53:57,645 --> 00:53:59,198 O que é que essa linha faz? 1136 00:53:59,198 --> 00:54:00,830 >> ALUNO: Seg falhas. 1137 00:54:00,830 --> 00:54:01,310 >> JASON HIRSCHHORN: O quê? 1138 00:54:01,310 --> 00:54:02,678 >> ALUNO: Eu acho que SEG falhas. 1139 00:54:02,678 --> 00:54:03,574 >> JASON HIRSCHHORN: Hm? 1140 00:54:03,574 --> 00:54:04,920 >> ALUNO: Eu acho que vai SEG culpa. 1141 00:54:04,920 --> 00:54:08,265 >> JASON HIRSCHHORN: Então esta linha de código, estrela ptr, o que 1142 00:54:08,265 --> 00:54:10,152 que a estrela significa? 1143 00:54:10,152 --> 00:54:11,240 >> ESTUDANTE: Conteúdo. 1144 00:54:11,240 --> 00:54:11,560 >> JASON HIRSCHHORN: Yeah. 1145 00:54:11,560 --> 00:54:13,910 Vá para obter o conteúdo de. 1146 00:54:13,910 --> 00:54:16,830 Portanto, este está indo para ir para a memória dirigir lá e me dar isso. 1147 00:54:16,830 --> 00:54:21,030 Eu costumava% c certo aqui, porque há são personagens armazenados lá. 1148 00:54:21,030 --> 00:54:23,390 Então, nós estamos indo para ir para que endereço acabei de ver - ou ele provavelmente vai ser um 1149 00:54:23,390 --> 00:54:25,190 pouco presente diferente vez que executar o programa. 1150 00:54:25,190 --> 00:54:28,010 Mas vamos para esse endereço que sabemos que ainda existe 1151 00:54:28,010 --> 00:54:29,260 e ver o que está lá. 1152 00:54:29,260 --> 00:54:35,640 1153 00:54:35,640 --> 00:54:37,110 >> Então não SEG culpa. 1154 00:54:37,110 --> 00:54:38,970 Ele só não nos deu nada. 1155 00:54:38,970 --> 00:54:43,350 Ele poderia ter realmente nos deu alguma coisa, nós apenas não podemos vê-lo. 1156 00:54:43,350 --> 00:54:45,110 E isso vai voltar a essa idéia - 1157 00:54:45,110 --> 00:54:47,270 e nós não vamos conseguir muito em isso, porque isso é para além da 1158 00:54:47,270 --> 00:54:48,460 escopo deste curso. 1159 00:54:48,460 --> 00:54:51,260 Mas falamos aqui, se nós foi além dos limites da matriz por 1160 00:54:51,260 --> 00:54:54,890 1, podemos não ficar em apuros. 1161 00:54:54,890 --> 00:54:58,550 >> Às vezes, quando você acabou de sair por 1, você está fazendo algo errado, e você 1162 00:54:58,550 --> 00:54:59,220 poderia ficar em apuros. 1163 00:54:59,220 --> 00:55:00,820 Mas nem sempre você terá problemas. 1164 00:55:00,820 --> 00:55:05,170 Depende de quanto de uma coisa ruim você não, você vai ficar em apuros. 1165 00:55:05,170 --> 00:55:07,790 O que não quer dizer, ser desleixado com o seu código. 1166 00:55:07,790 --> 00:55:12,080 Mas é para dizer que o programa não sempre desistir, mesmo se você ir a algum lugar 1167 00:55:12,080 --> 00:55:14,130 você não deveria ir. 1168 00:55:14,130 --> 00:55:18,170 >> Um bom exemplo do que é, um monte de pessoas em seu conjunto de problemas 3, que 1169 00:55:18,170 --> 00:55:22,350 tinha 15 anos, não se verifique a limites da placa. 1170 00:55:22,350 --> 00:55:25,860 Então você olhou para a esquerda, olhou para o direita, olhou para cima, olhou 1171 00:55:25,860 --> 00:55:27,000 para a parte inferior. 1172 00:55:27,000 --> 00:55:31,540 Mas você não verificar para ver se o topo foi realmente vai ser na placa. 1173 00:55:31,540 --> 00:55:35,220 E um monte de pessoas que fizeram isso e virou-se que em, seu programa funcionou 1174 00:55:35,220 --> 00:55:38,960 perfeitamente, porque sempre que este era armazenados na memória, se você fosse um 1175 00:55:38,960 --> 00:55:42,300 acima, ou verificado que a memória endereço, não havia nada 1176 00:55:42,300 --> 00:55:44,870 particularmente horrível sobre isso, para que o seu programa não era 1177 00:55:44,870 --> 00:55:45,970 vai gritar com você. 1178 00:55:45,970 --> 00:55:48,870 >> Mas ainda iria decolar pontos se você não verificar isso, porque você 1179 00:55:48,870 --> 00:55:50,850 estavam fazendo algo que você não estava deveria fazer, e você poderia ter 1180 00:55:50,850 --> 00:55:51,860 ficado em apuros. 1181 00:55:51,860 --> 00:55:54,040 As probabilidades são, no entanto, você provavelmente não o fez. 1182 00:55:54,040 --> 00:55:57,790 Então, isso é para mostrar que, sim, ainda podemos ir a ele. 1183 00:55:57,790 --> 00:55:59,010 E nós não vamos a problema neste caso. 1184 00:55:59,010 --> 00:56:04,000 Se tentássemos fazer ler a próximos 100 caracteres, teríamos 1185 00:56:04,000 --> 00:56:06,000 provavelmente terá problemas. 1186 00:56:06,000 --> 00:56:09,400 E você pode codificar a ler o próximo 100 caracteres, se você quiser, fazendo algumas 1187 00:56:09,400 --> 00:56:10,110 espécie de loop for. 1188 00:56:10,110 --> 00:56:10,850 É. 1189 00:56:10,850 --> 00:56:16,250 >> ALUNO: Desde que foram atribuídos que espaço um valor real, não teríamos 1190 00:56:16,250 --> 00:56:17,050 realmente ser capaz de ver nada. 1191 00:56:17,050 --> 00:56:21,740 Devemos tentar com a criação que igual a gostar c ou algo assim? 1192 00:56:21,740 --> 00:56:22,640 >> JASON HIRSCHHORN: Ótima pergunta. 1193 00:56:22,640 --> 00:56:25,340 Como faço para configurar esse valor - 1194 00:56:25,340 --> 00:56:28,980 que linha de código que eu escrevo na linha sete para fazer o que você disse? 1195 00:56:28,980 --> 00:56:34,040 >> ALUNO: Estrela ptr iguala único Citação c acabar aspas simples. 1196 00:56:34,040 --> 00:56:36,970 >> JASON HIRSCHHORN: Para que está colocando um personagem, c, naquele local, 1197 00:56:36,970 --> 00:56:40,200 porque mais uma vez, que a estrela significa ir para lá. 1198 00:56:40,200 --> 00:56:43,320 E quando usado do lado esquerdo do um operador de atribuição, que é igual a 1199 00:56:43,320 --> 00:56:47,270 assinar, nós não vamos conseguir que valor tanto como definido esse valor. 1200 00:56:47,270 --> 00:56:48,520 Agora vamos ver o que acontece. 1201 00:56:48,520 --> 00:56:54,700 1202 00:56:54,700 --> 00:56:56,770 >> Nós colocamos algo lá e foi lá. 1203 00:56:56,770 --> 00:56:58,000 Chamamos livre. 1204 00:56:58,000 --> 00:57:00,100 Algumas coisas provavelmente aconteceu na pilha. 1205 00:57:00,100 --> 00:57:01,890 Portanto, não é mais lá. 1206 00:57:01,890 --> 00:57:07,440 Mas, novamente, não estamos recebendo em apuros para ir lá. 1207 00:57:07,440 --> 00:57:10,260 >> Estou fazendo isso em código para ilustrar que muitos destes 1208 00:57:10,260 --> 00:57:12,410 perguntas que você tem, eles são realmente interessante 1209 00:57:12,410 --> 00:57:13,650 responde a um monte de tempo. 1210 00:57:13,650 --> 00:57:15,260 E eles estão realmente boas perguntas. 1211 00:57:15,260 --> 00:57:19,010 E você pode entendê-los em seu próprio, se, por exemplo, 1212 00:57:19,010 --> 00:57:19,990 não estamos na seção. 1213 00:57:19,990 --> 00:57:20,940 É. 1214 00:57:20,940 --> 00:57:24,430 >> ALUNO: Porque você não está enviando o ponteiro em qualquer lugar, você precisa de 1215 00:57:24,430 --> 00:57:26,530 usar malloc? 1216 00:57:26,530 --> 00:57:28,400 >> JASON HIRSCHHORN: Então, isso vai voltar à sua pergunta inicial. 1217 00:57:28,400 --> 00:57:28,620 [? ?] 1218 00:57:28,620 --> 00:57:29,980 É apenas uma variável local? 1219 00:57:29,980 --> 00:57:32,280 Malloc aqui não é que convincente. 1220 00:57:32,280 --> 00:57:35,260 O uso de malloc aqui não é que convincente porque é 1221 00:57:35,260 --> 00:57:36,500 apenas uma variável local. 1222 00:57:36,500 --> 00:57:40,970 >> ALUNO: Então você poderia fazer de char estrela ptr é igual Olá? 1223 00:57:40,970 --> 00:57:41,400 >> JASON HIRSCHHORN: Ah. 1224 00:57:41,400 --> 00:57:43,300 Então, vamos agora voltar à sua pergunta inicial. 1225 00:57:43,300 --> 00:57:46,885 Eu acho que você não estavam satisfeitos com a minha resposta. 1226 00:57:46,885 --> 00:57:48,220 OK? 1227 00:57:48,220 --> 00:57:49,226 Assim? 1228 00:57:49,226 --> 00:57:49,682 >> ESTUDANTE: Yeah. 1229 00:57:49,682 --> 00:57:50,932 Espere. 1230 00:57:50,932 --> 00:57:54,090 1231 00:57:54,090 --> 00:57:57,850 >> JASON HIRSCHHORN: E onde que você quer imprimir? 1232 00:57:57,850 --> 00:58:00,026 Então, vamos imprimir uma string assim? 1233 00:58:00,026 --> 00:58:06,380 1234 00:58:06,380 --> 00:58:07,630 >> ESTUDANTE: Interessante. 1235 00:58:07,630 --> 00:58:09,900 1236 00:58:09,900 --> 00:58:14,285 >> JASON HIRSCHHORN: Então, isso diz que esta argumento tem o tipo de caráter. 1237 00:58:14,285 --> 00:58:17,200 1238 00:58:17,200 --> 00:58:18,620 Portanto, este deve ser um personagem. 1239 00:58:18,620 --> 00:58:25,170 1240 00:58:25,170 --> 00:58:26,280 >> ALUNO: só tem o primeiro. 1241 00:58:26,280 --> 00:58:28,610 >> JASON HIRSCHHORN: Então isso é o que eu disse antes. 1242 00:58:28,610 --> 00:58:34,240 Como eu disse, ele não está armazenando o corda dentro ponteiro variável. 1243 00:58:34,240 --> 00:58:35,120 É o armazenamento - 1244 00:58:35,120 --> 00:58:36,350 >> ALUNO: O primeiro valor da cadeia. 1245 00:58:36,350 --> 00:58:40,810 >> JASON HIRSCHHORN: O endereço de o primeiro valor da seqüência. 1246 00:58:40,810 --> 00:58:46,940 Se tivéssemos que imprimir isso, estamos ficando o valor dentro do ponteiro. 1247 00:58:46,940 --> 00:58:51,005 E vamos ver que é, de fato, um endereço de memória. 1248 00:58:51,005 --> 00:58:53,595 1249 00:58:53,595 --> 00:58:56,440 >> Será que isso faz sentido? 1250 00:58:56,440 --> 00:58:56,940 Desculpe. 1251 00:58:56,940 --> 00:58:58,996 Espere, isso responde a sua questão, embora? 1252 00:58:58,996 --> 00:58:59,790 >> ESTUDANTE: Yeah. 1253 00:58:59,790 --> 00:59:05,830 >> JASON HIRSCHHORN: Esta linha de código é criando uma string e depois outro 1254 00:59:05,830 --> 00:59:09,115 ponteiro variável que está apontando para essa seqüência, essa matriz. 1255 00:59:09,115 --> 00:59:14,320 1256 00:59:14,320 --> 00:59:14,980 É. 1257 00:59:14,980 --> 00:59:19,200 >> Estudante: Então, se nós fomos uma memória aprofundar, se chegarmos a horas? 1258 00:59:19,200 --> 00:59:21,990 1259 00:59:21,990 --> 00:59:23,150 Tem sido armazenado como uma string? 1260 00:59:23,150 --> 00:59:24,400 >> JASON HIRSCHHORN: Como, nós fizemos - 1261 00:59:24,400 --> 00:59:28,540 1262 00:59:28,540 --> 00:59:30,790 por isso este é valioso para fazer. 1263 00:59:30,790 --> 00:59:33,780 Este é o ponto de aritmética, que vocês tenha visto antes e deve ser 1264 00:59:33,780 --> 00:59:35,550 relativamente confortável. 1265 00:59:35,550 --> 00:59:36,905 Isto é semelhante a escrever - 1266 00:59:36,905 --> 00:59:41,980 1267 00:59:41,980 --> 00:59:46,350 se fôssemos escrever esta linha de código, temos visto a notação de matriz antes. 1268 00:59:46,350 --> 00:59:55,900 Isso deveria nos dar a segunda valor neste array, h. 1269 00:59:55,900 --> 01:00:05,010 >> Se fizéssemos isso, isso também deve dar nós o segundo valor do array. 1270 01:00:05,010 --> 01:00:08,320 Porque ele não vai para a memória endereço do primeiro lugar, mas o 1271 01:00:08,320 --> 01:00:10,530 endereço de memória da coisa que se acabou. 1272 01:00:10,530 --> 01:00:14,360 E então os dereferences operador estrela esse ponteiro. 1273 01:00:14,360 --> 01:00:16,940 E mais uma vez, vamos ver. 1274 01:00:16,940 --> 01:00:18,664 Recebemos h novamente. 1275 01:00:18,664 --> 01:00:20,980 >> ALUNO: O que exatamente faz dereference significa? 1276 01:00:20,980 --> 01:00:23,650 >> JASON HIRSCHHORN: Dereference é uma palavra chique para ir. 1277 01:00:23,650 --> 01:00:26,390 Ir para isso e obter o que está lá é para excluir a referência de um ponteiro. 1278 01:00:26,390 --> 01:00:28,240 É apenas uma palavra chique para isso. 1279 01:00:28,240 --> 01:00:29,986 >> ALUNO: Se quiséssemos impressão a corda toda, poderíamos 1280 01:00:29,986 --> 01:00:31,930 fazer ponteiro e comercial? 1281 01:00:31,930 --> 01:00:33,490 >> JASON HIRSCHHORN: OK, estamos vai fazer uma pausa aqui. 1282 01:00:33,490 --> 01:00:35,480 Vamos terminar aqui. 1283 01:00:35,480 --> 01:00:41,760 Ampersand dá-lhe o endereço de um localização, por isso, quando você faz comercial de 1284 01:00:41,760 --> 01:00:44,080 uma variável, que lhe dá o endereço onde a variável está armazenada. 1285 01:00:44,080 --> 01:00:48,580 Ponteiro Ampersand lhe dará a endereço de onde ptr ptr está na memória. 1286 01:00:48,580 --> 01:00:50,140 >> Nós não estamos indo para ir em com este exemplo. 1287 01:00:50,140 --> 01:00:52,640 Você pode descobrir estes as coisas por conta própria. 1288 01:00:52,640 --> 01:00:55,740 Mas, novamente, isso pode até ser uma beirando pouco além do que você precisa saber para 1289 01:00:55,740 --> 01:00:58,000 o âmbito do presente intercalar - 1290 01:00:58,000 --> 01:00:59,070 ou este teste, melhor dizendo. 1291 01:00:59,070 --> 01:01:00,270 Desculpe. 1292 01:01:00,270 --> 01:01:03,770 >> Vamos seguir em frente, porque eu faria gostaria de fazer um problema de codificação 1293 01:01:03,770 --> 01:01:05,100 antes do tempo é para cima. 1294 01:01:05,100 --> 01:01:09,340 E nós estamos indo para codificar o que eu penso é a mais convincente delas 1295 01:01:09,340 --> 01:01:11,020 exemplos, atoi. 1296 01:01:11,020 --> 01:01:14,520 Portanto, esta foi uma pergunta sobre um quiz, há dois anos. 1297 01:01:14,520 --> 01:01:17,810 E eu tenho isso no conselho aqui. 1298 01:01:17,810 --> 01:01:20,680 >> Pessoas foram convidados para o teste - 1299 01:01:20,680 --> 01:01:23,640 eles receberam um pouco mais em tesxt a pergunta, mas eu eliminou o 1300 01:01:23,640 --> 01:01:26,640 texto, porque não era necessário para os nossos propósitos agora. 1301 01:01:26,640 --> 01:01:29,180 Foi apenas algumas fundo em que atoi fez. 1302 01:01:29,180 --> 01:01:31,425 Mas todos sabem e são muito familiarizado com atoi. 1303 01:01:31,425 --> 01:01:35,620 >> Sugiro que este código sobre uma folha de papel. 1304 01:01:35,620 --> 01:01:39,310 Sugiro também que você usar a estratégia que já sabemos 1305 01:01:39,310 --> 01:01:41,040 muito em nossa seção. 1306 01:01:41,040 --> 01:01:44,130 Primeiro, certifique-se de compreender atoi que está fazendo. 1307 01:01:44,130 --> 01:01:47,580 Faça um desenho ou chegar a algum imagem mental do que em sua cabeça. 1308 01:01:47,580 --> 01:01:51,120 Em seguida, escreva o pseudocódigo para isso. 1309 01:01:51,120 --> 01:01:53,120 No questionário, se tudo que você recebe é pseudocódigo, pelo menos você 1310 01:01:53,120 --> 01:01:54,550 colocar algo para baixo. 1311 01:01:54,550 --> 01:02:00,070 E, em seguida, mapear esse pseudocódigo para C. Se você tem um cheque em seu 1312 01:02:00,070 --> 01:02:03,760 pseudocódigo, como verificar se algo é 1, que mapeia para um caso 1313 01:02:03,760 --> 01:02:05,750 estado e assim por diante. 1314 01:02:05,750 --> 01:02:07,850 E, finalmente, o código do programa em C. 1315 01:02:07,850 --> 01:02:15,000 >> Então volte para atoi e levar cinco minutos para este código em uma folha de 1316 01:02:15,000 --> 01:02:19,480 papel, que é, provavelmente, sobre a quantidade de tempo que você levaria em uma 1317 01:02:19,480 --> 01:02:21,260 quiz para atoi código. 1318 01:02:21,260 --> 01:02:27,060 Cinco a 15 minutos, de cinco a 12, para cinco 10 minutos, é sobre a quantidade de 1319 01:02:27,060 --> 01:02:30,150 tempo que você gastaria neste pergunta no questionário. 1320 01:02:30,150 --> 01:02:31,670 Então, levar cinco minutos, por favor. 1321 01:02:31,670 --> 01:02:35,957 E se você tiver alguma dúvida, levantar sua mão e eu vou chegar perto. 1322 01:02:35,957 --> 01:06:39,570 1323 01:06:39,570 --> 01:06:41,066 >> [conversas paralelas] 1324 01:06:41,066 --> 01:08:35,279 1325 01:08:35,279 --> 01:08:37,580 >> JASON HIRSCHHORN: OK, então que foi de cinco minutos. 1326 01:08:37,580 --> 01:08:39,880 Essa foi, provavelmente, sobre a quantidade de tempo que você gastaria em que, em um teste, 1327 01:08:39,880 --> 01:08:42,120 talvez a baixa final da época. 1328 01:08:42,120 --> 01:08:44,010 Vamos recapitular um pouco. 1329 01:08:44,010 --> 01:08:45,740 Vamos começar a programar isso. 1330 01:08:45,740 --> 01:08:49,479 E se nós não temos todo o tempo, as respostas para este e este 1331 01:08:49,479 --> 01:08:54,189 questionário questão estão disponíveis, mais uma vez, Outono de 2011 é quando esta pergunta 1332 01:08:54,189 --> 01:08:54,913 apareceu no quiz. 1333 01:08:54,913 --> 01:08:57,830 >> E valeu a pena de oito pontos em seguida, o questionário. 1334 01:08:57,830 --> 01:09:01,140 Oito pontos é na parte alta da quantidade de pontos de algo vale a pena. 1335 01:09:01,140 --> 01:09:04,790 A maioria das perguntas estão na faixa de um a seis pontos. 1336 01:09:04,790 --> 01:09:08,500 Portanto, esta é uma mais desafiador pergunta, com certeza. 1337 01:09:08,500 --> 01:09:09,750 Alguém pode me fale? 1338 01:09:09,750 --> 01:09:13,260 1339 01:09:13,260 --> 01:09:15,380 >> Geralmente, o que vamos querer fazer com essa 1340 01:09:15,380 --> 01:09:17,550 funcionar atoi, logicamente? 1341 01:09:17,550 --> 01:09:19,569 O que queremos fazer? 1342 01:09:19,569 --> 01:09:22,279 Então vamos escrever alguns pseudocódigo. 1343 01:09:22,279 --> 01:09:24,090 >> ESTUDANTE: Converter caracteres em números inteiros. 1344 01:09:24,090 --> 01:09:26,700 >> JASON HIRSCHHORN: Converter caracteres em números inteiros. 1345 01:09:26,700 --> 01:09:27,479 OK. 1346 01:09:27,479 --> 01:09:30,870 Então, quantos personagens somos nós vai precisar para passar? 1347 01:09:30,870 --> 01:09:32,295 >> ALUNO: Todos eles. 1348 01:09:32,295 --> 01:09:34,100 >> ALUNO: Todos os personagens na seqüência. 1349 01:09:34,100 --> 01:09:35,540 >> Jason HIRSCHHORN: Todo o caracteres na string. 1350 01:09:35,540 --> 01:09:42,180 Então, se nós queria passar por todos os caractere em uma string, o que é uma coisa 1351 01:09:42,180 --> 01:09:44,560 em C vimos que tem permitido nós que passar por todos os 1352 01:09:44,560 --> 01:09:45,939 caractere em uma string? 1353 01:09:45,939 --> 01:09:46,819 >> ALUNOS: Um loop for. 1354 01:09:46,819 --> 01:09:48,069 >> JASON HIRSCHHORN: Um loop for. 1355 01:09:48,069 --> 01:09:52,020 1356 01:09:52,020 --> 01:09:55,330 Então, nós estamos indo para percorrer cada personagem em s. 1357 01:09:55,330 --> 01:10:00,940 >> Então, o que vamos querer fazer quando temos um personagem específico? 1358 01:10:00,940 --> 01:10:02,480 Digamos que está se passou a 90. 1359 01:10:02,480 --> 01:10:03,460 Ficamos com a 9. 1360 01:10:03,460 --> 01:10:04,240 É um personagem. 1361 01:10:04,240 --> 01:10:07,440 O que nós queremos fazer com que o personagem 9? 1362 01:10:07,440 --> 01:10:10,082 >> ALUNO: subtrair caráter 0? 1363 01:10:10,082 --> 01:10:11,860 >> ALUNO: Adicionar 0? 1364 01:10:11,860 --> 01:10:13,350 >> JASON HIRSCHHORN: Subtrair lo do caráter 0? 1365 01:10:13,350 --> 01:10:13,800 >> ESTUDANTE: Yeah. 1366 01:10:13,800 --> 01:10:15,573 >> JASON HIRSCHHORN: Por que você quer fazer isso? 1367 01:10:15,573 --> 01:10:16,560 >> Estudante: [inaudível] 1368 01:10:16,560 --> 01:10:17,010 valor. 1369 01:10:17,010 --> 01:10:18,380 Seu valor int. 1370 01:10:18,380 --> 01:10:21,580 >> JASON HIRSCHHORN: OK, então tomamos o caráter 9, subtrai-lo a partir de 1371 01:10:21,580 --> 01:10:25,820 caractere 0 para obter uma inteiro real 9. 1372 01:10:25,820 --> 01:10:27,070 Doce. 1373 01:10:27,070 --> 01:10:31,255 1374 01:10:31,255 --> 01:10:37,000 E como você sabe que o personagem 9 menos 0 personagem é 9? 1375 01:10:37,000 --> 01:10:39,222 O gráfico que você olhar? 1376 01:10:39,222 --> 01:10:43,130 >> ALUNO: Há nove logicamente lugares entre 9 e 0. 1377 01:10:43,130 --> 01:10:44,620 Ou você pode olhar para a tabela ASCII. 1378 01:10:44,620 --> 01:10:45,120 >> JASON HIRSCHHORN: tabela ASCII. 1379 01:10:45,120 --> 01:10:46,490 Mas sim, você está correto também. 1380 01:10:46,490 --> 01:10:47,780 Então subtraímos 0. 1381 01:10:47,780 --> 01:10:49,010 Portanto, agora temos o inteiro 9. 1382 01:10:49,010 --> 01:10:49,970 E o que nós queremos fazer com isso? 1383 01:10:49,970 --> 01:10:54,970 Se tivermos 90, é o primeiro número inteiro temos, o que queremos fazer? 1384 01:10:54,970 --> 01:10:58,180 >> ALUNO: Eu colocaria em um inteiro temporário matriz, em seguida, fazer a matemática para ele 1385 01:10:58,180 --> 01:11:02,088 mais tarde para fazê-lo em um fim. 1386 01:11:02,088 --> 01:11:03,020 >> JASON HIRSCHHORN: OK. 1387 01:11:03,020 --> 01:11:06,990 >> ALUNO: Você pode começar no final de a matriz e, em seguida, seguir em frente assim 1388 01:11:06,990 --> 01:11:10,350 que cada vez que você se move para a frente, você multiplicá-lo por 10. 1389 01:11:10,350 --> 01:11:10,830 >> JASON HIRSCHHORN: OK. 1390 01:11:10,830 --> 01:11:12,250 Isso soa como uma bonita idéia atraente. 1391 01:11:12,250 --> 01:11:16,040 Podemos começar no final de nossa matriz, e podemos usar strleng. 1392 01:11:16,040 --> 01:11:17,030 Podemos usar strleng aqui. 1393 01:11:17,030 --> 01:11:18,870 Vamos obter o comprimento da nossa string. 1394 01:11:18,870 --> 01:11:20,100 Começamos no final. 1395 01:11:20,100 --> 01:11:29,170 E + o primeiro, só levamos isso inteiro, e talvez nós criamos como um 1396 01:11:29,170 --> 01:11:32,270 nova variável inteira em cima onde estamos armazenando tudo. 1397 01:11:32,270 --> 01:11:37,340 Então, nós loop através de cada caractere em s de trás para a frente, subtraímos 0, e 1398 01:11:37,340 --> 01:11:42,790 então vamos levá-lo, e, dependendo da onde ele está, nós multiplicá-lo 1399 01:11:42,790 --> 01:11:45,860 por uma potência de 10. 1400 01:11:45,860 --> 01:11:50,644 Como o primeiro, o que é que vamos multiplicar o caractere mais à direita por? 1401 01:11:50,644 --> 01:11:51,440 >> ALUNO: 10 ao 0. 1402 01:11:51,440 --> 01:11:53,170 >> JASON HIRSCHHORN: 10 a 0. 1403 01:11:53,170 --> 01:11:56,010 O que queremos multiplicar o segundo mais à direita de caracteres por? 1404 01:11:56,010 --> 01:11:57,450 >> Estudante: [inaudível]. 1405 01:11:57,450 --> 01:11:57,960 >> JASON HIRSCHHORN: O quê? 1406 01:11:57,960 --> 01:11:59,150 >> ALUNO: 10 para a 1. 1407 01:11:59,150 --> 01:12:00,420 >> Jason HIRSCHHORN: 10 para o 1. 1408 01:12:00,420 --> 01:12:03,754 O personagem terço mais à direita? 1409 01:12:03,754 --> 01:12:04,580 >> ALUNO: 10 para a 2. 1410 01:12:04,580 --> 01:12:05,350 >> Jason HIRSCHHORN: 10 para o 2. 1411 01:12:05,350 --> 01:12:07,200 >> ESTUDANTE: Desculpe, eu não entendo o que estamos fazendo aqui. 1412 01:12:07,200 --> 01:12:08,640 >> JASON HIRSCHHORN: OK, Vamos voltar, então. 1413 01:12:08,640 --> 01:12:12,500 Então, nós estamos indo para obter aprovada em uma string. 1414 01:12:12,500 --> 01:12:14,470 Porque estamos escrevendo atoi. 1415 01:12:14,470 --> 01:12:15,260 Por isso, são passadas em uma string. 1416 01:12:15,260 --> 01:12:17,640 Digamos que está se passou na seqüência de 90. 1417 01:12:17,640 --> 01:12:19,930 >> A primeira coisa que vamos fazer é definir uma nova variável inteiro que nós somos 1418 01:12:19,930 --> 01:12:22,150 só vai criar como o nosso novo inteiro. 1419 01:12:22,150 --> 01:12:24,630 Isso é o que vamos para retornar no final. 1420 01:12:24,630 --> 01:12:30,110 Precisamos passar por todos os personagens a corda porque temos determinado 1421 01:12:30,110 --> 01:12:34,430 que precisamos para tocar cada um e em seguida, adicioná-lo ao nosso novo inteiro. 1422 01:12:34,430 --> 01:12:36,330 >> Mas não podemos simplesmente adicioná-lo como um número. 1423 01:12:36,330 --> 01:12:38,270 Não podemos simplesmente pegar e 9 adicionar 9 ao nosso inteiro. 1424 01:12:38,270 --> 01:12:40,560 Depende de que lugar é na cadeia. 1425 01:12:40,560 --> 01:12:42,960 Nós vamos precisar de multiplicar ele por uma potência de 10. 1426 01:12:42,960 --> 01:12:45,580 Porque é assim que 10 obras de base. 1427 01:12:45,580 --> 01:12:49,050 >> Então, nós estamos indo para obter o real personagem, ou o número inteiro real 1428 01:12:49,050 --> 01:12:53,860 número, por caractere 0 subtraindo de caráter 9 como fizemos com 1429 01:12:53,860 --> 01:12:57,560 subtraindo capital caráter A partir de tudo o que personagem que tinha em um dos 1430 01:12:57,560 --> 01:12:58,120 esses problemas. 1431 01:12:58,120 --> 01:13:04,190 Então, vamos realmente ter um número de 0 a 9 salvo como um número real, e nós vamos 1432 01:13:04,190 --> 01:13:07,590 multiplicá-lo por uma potência de 10, dependendo de onde estamos na corda. 1433 01:13:07,590 --> 01:13:19,430 1434 01:13:19,430 --> 01:13:22,575 E então nós vamos adicioná-lo de volta em nossa nova variável inteira. 1435 01:13:22,575 --> 01:13:32,840 1436 01:13:32,840 --> 01:13:37,890 >> Então, o que seria algo como faria ser - vamos chamar aqui. 1437 01:13:37,890 --> 01:13:40,086 Se conseguir passar na seqüência de 90 - 1438 01:13:40,086 --> 01:13:41,336 >> Estudante: [inaudível]. 1439 01:13:41,336 --> 01:13:43,190 1440 01:13:43,190 --> 01:13:45,540 >> JASON HIRSCHHORN: Mas atoi recebe uma string. 1441 01:13:45,540 --> 01:13:46,350 Então vamos passar por da exploração. 1442 01:13:46,350 --> 01:13:49,900 Vamos ter passado em 90. 1443 01:13:49,900 --> 01:13:51,540 Nós vamos na parte de trás para a frente. 1444 01:13:51,540 --> 01:13:53,920 Tomamos a 0. 1445 01:13:53,920 --> 01:13:55,080 >> ALUNO: Eu sinto muito. 1446 01:13:55,080 --> 01:13:55,880 Talvez isso é estúpido. 1447 01:13:55,880 --> 01:13:59,440 Se estamos a ser aprovada em uma corda, por que é de 90 o que estamos 1448 01:13:59,440 --> 01:14:00,260 se passou em? 1449 01:14:00,260 --> 01:14:03,160 Porque 90 é um inteiro. 1450 01:14:03,160 --> 01:14:06,820 >> JASON HIRSCHHORN: Porque atoi leva um string e transforma-lo em o inteiro 1451 01:14:06,820 --> 01:14:08,320 representação dessa string. 1452 01:14:08,320 --> 01:14:13,650 Mas a corda 90 não é o número inteiro 90 ou o número 90. 1453 01:14:13,650 --> 01:14:17,920 A seqüência de 90 é um conjunto de dois ou três personagens, ao invés, a 9 1454 01:14:17,920 --> 01:14:22,740 caráter, o personagem 0, e a barra invertida 0 personagem. 1455 01:14:22,740 --> 01:14:26,260 >> E nós estamos escrevendo atoi porque, por exemplo, quando você toma o comando 1456 01:14:26,260 --> 01:14:30,230 argumento de linha, e é guardada em argv, é guardada como uma string. 1457 01:14:30,230 --> 01:14:32,940 Mas se você quer tratá-lo como um número, você precisa convertê-lo em um 1458 01:14:32,940 --> 01:14:34,700 inteiro real. 1459 01:14:34,700 --> 01:14:37,210 Que fizemos um dos nossos conjuntos de problemas. 1460 01:14:37,210 --> 01:14:38,800 Que fizemos em um número dos nossos conjuntos de problemas. 1461 01:14:38,800 --> 01:14:41,690 Todo mundo que teve um número inteiro como um argumento de linha de comando. 1462 01:14:41,690 --> 01:14:46,490 É por isso que a nossa função atoi recebe uma string. 1463 01:14:46,490 --> 01:14:51,910 >> Então, novamente, no nosso exemplo aqui, estamos vai tomar o último. 1464 01:14:51,910 --> 01:14:55,050 Nós estamos indo para subtrair o caráter 0 dele, porque os personagens 0 1465 01:14:55,050 --> 01:14:58,810 subtraído pelo personagem 0 dá-lhe o número real de 0, de acordo com a 1466 01:14:58,810 --> 01:15:00,950 a matemática ASCII que fazemos. 1467 01:15:00,950 --> 01:15:04,870 >> Como os caracteres são representados como diferente do que o seu real - o 1468 01:15:04,870 --> 01:15:08,830 caráter de um, por exemplo, minúsculas é um 97. 1469 01:15:08,830 --> 01:15:10,260 Não é - oops! 1470 01:15:10,260 --> 01:15:13,290 Não é o que você esperaria que seja, 0, por exemplo. 1471 01:15:13,290 --> 01:15:16,200 Então você tem que subtrair o caráter de um para chegar a 0. 1472 01:15:16,200 --> 01:15:18,950 >> Então, vamos fazer isso aqui para obter o número real. 1473 01:15:18,950 --> 01:15:22,560 E então nós estamos indo para multiplicá-lo por uma potência de 10, dependendo de onde ele 1474 01:15:22,560 --> 01:15:27,030 é na cadeia, e depois tomar esse e adicioná-lo ao nosso espaço reservado 1475 01:15:27,030 --> 01:15:32,520 variável, para que possamos chegar a nosso inteiro novo final. 1476 01:15:32,520 --> 01:15:35,080 Será que faz sentido para todos? 1477 01:15:35,080 --> 01:15:37,730 >> Então, nós não estamos indo para este código agora, porque estamos 1478 01:15:37,730 --> 01:15:38,830 ficando em curto tempo. 1479 01:15:38,830 --> 01:15:40,860 Peço desculpas pelo tempo do que isso. 1480 01:15:40,860 --> 01:15:44,620 Mas isso é o que, esperamos, você faria ser capaz de fazer no questionário - no 1481 01:15:44,620 --> 01:15:47,710 muito menos, obter este pseudocódigo escrito. 1482 01:15:47,710 --> 01:15:50,840 >> E então, se fôssemos escrever o pseudocódigo, na verdade, poderíamos fazer isso 1483 01:15:50,840 --> 01:15:51,490 muito rapidamente. 1484 01:15:51,490 --> 01:15:55,230 Cada linha de comentários que nós escrevemos aqui se traduz em cerca de 1485 01:15:55,230 --> 01:15:56,970 uma linha de código C. 1486 01:15:56,970 --> 01:16:01,780 Declarando uma variável nova, escrita um loop, alguns subtração, alguns 1487 01:16:01,780 --> 01:16:07,070 multiplicação, e alguns atribuição. 1488 01:16:07,070 --> 01:16:09,020 Nós provavelmente também querem escrever uma linha de retorno. 1489 01:16:09,020 --> 01:16:12,040 Também pode querer colocar algumas verificações aqui. 1490 01:16:12,040 --> 01:16:12,655 É. 1491 01:16:12,655 --> 01:16:15,720 >> ALUNO: Então podemos tratar s como a seqüência real? 1492 01:16:15,720 --> 01:16:18,730 Porque eu sei que é apenas um endereço. 1493 01:16:18,730 --> 01:16:22,090 Como, como você obter o comprimento de a corda que está sendo passado através de? 1494 01:16:22,090 --> 01:16:25,310 >> JASON HIRSCHHORN: Então, como é que o comprimento de uma corda? 1495 01:16:25,310 --> 01:16:25,830 Strlen. 1496 01:16:25,830 --> 01:16:26,660 >> ALUNO: strlen, sim. 1497 01:16:26,660 --> 01:16:30,550 Mas você pode colocar s como o argumento para isso? 1498 01:16:30,550 --> 01:16:34,620 >> JASON HIRSCHHORN: Então strlen leva uma estrela de char. 1499 01:16:34,620 --> 01:16:38,090 E segue-se que a estrela char, e mantém a contagem até que se chega a um 1500 01:16:38,090 --> 01:16:41,865 barra invertida 0. strlen era realmente um dos outros programas que 1501 01:16:41,865 --> 01:16:42,850 iam código. 1502 01:16:42,850 --> 01:16:44,560 Essa é outra boa para código. 1503 01:16:44,560 --> 01:16:47,270 Esse é um pouco mais fácil, porque se você vai pensar sobre isso 1504 01:16:47,270 --> 01:16:47,830 conceitualmente - 1505 01:16:47,830 --> 01:16:51,620 Eu apenas disse em voz alta - strlen segue um ponteiro e continua indo e 1506 01:16:51,620 --> 01:16:54,210 contar e manter o controle até chegar a uma barra invertida 0. 1507 01:16:54,210 --> 01:16:56,530 >> ALUNO: OK, entendi. 1508 01:16:56,530 --> 01:17:00,200 >> JASON HIRSCHHORN: Então, o melhor de sorte no teste 0 amanhã. 1509 01:17:00,200 --> 01:17:03,170 Se você tiver alguma dúvida, eu vou estar fora após esta. 1510 01:17:03,170 --> 01:17:05,610 Sinta-se livre para me e-mail. 1511 01:17:05,610 --> 01:17:08,480 Estenda a mão para seu próprio TF se você é não em minha seção, ou buscar o meu 1512 01:17:08,480 --> 01:17:10,005 enviar e-mail, se você quiser. 1513 01:17:10,005 --> 01:17:13,140 >> Se você quer surtar e basta enviar me um e-mail, um e-mail freakout, eu vou 1514 01:17:13,140 --> 01:17:16,710 mandar de volta, assim como, um rosto sorridente, ou, tipo, uma piada ou algo assim. 1515 01:17:16,710 --> 01:17:18,190 Então, fique à vontade para fazer isso também. 1516 01:17:18,190 --> 01:17:20,750 Boa sorte mais uma vez, e eu vou ver todos vocês na próxima semana. 1517 01:17:20,750 --> 01:17:23,435