>> JASON HIRSCHHORN: Welcome a A5, todos.
Temos uma semana emocionante à frente de nós, principalmente porque há tantos novos
enfrenta nesta sala.
É maravilhoso.
Muitos de vocês estão aqui por acaso, o que é ainda melhor.
Portanto, esperamos que você vai continuar se juntar a nós.
>> Esta semana estamos indo para gastar a maior parte da secção
preparando para o quiz.
Então por nossa agenda, vamos falar um pouco sobre os recursos para a classe,
, mas também para o teste e, em seguida, novamente, passar a maior parte da classe falar
sobre as perguntas.
Uma vez que estamos a fazer responder a sua perguntas, ou se as suas perguntas
naturalmente nos levar a alguma codificação, eu tem problemas de amostra midterms
passado que vai codificar ao vivo na seção juntos que também trazer algum outro
bons temas para cobrir.
>> Então, primeiro, como nós passamos para o duas últimas semanas para lembrá-lo
caras, há uma tonelada de recursos disponíveis para este curso.
Muitos deles vão ser extremamente útil para você como você continuar a
estudar para concurso 0, porque é terça-feira à tarde.
Então, todos vocês têm sido estudar um pouco.
>> Há notas de aula e fonte código que você deve
definitivamente check-out.
Assista os calções.
Confira study.cs50.net.
E, em seguida, listados abaixo, um número de outros recursos.
>> Mais uma vez, quiz 0 é amanhã à 1 hora.
Se você não tiver feito isso, verifique Sobre o documento quiz 0 no
página inicial do curso para descobrir onde você está tomando o quiz.
O concurso começa às 1:10 e termina 70 minutos mais tarde.
Então, se você mostrar-se após 1:10, você está vai ter que muitos menos minutos
de 70 para fazer o teste.
Portanto, verifique se você está lá na hora.
Se você é um estudante de extensão ou ter algumas outras considerações de teste, isto
pode não ser a 1:00 de amanhã.
Mas, novamente, verifique a 0 sobre Quiz documentar para se certificar de que você saiba quando
você está tomando o quiz.
Escrevi 75 minutos aqui.
Eu acho que é isso mesmo, não 70.
>> Ela abrange todo o material a partir de uma semana 0 a palestra da semana passada na quarta-feira.
E, novamente, para este teste, por que documento, você recebe um de dois lados e 8
1/2 por 11 folha de papel que você obtenha para usar como notas durante o quiz.
Muitas pessoas, se não a maioria das pessoas, tem descobriu que a única forma mais útil
para estudar para o teste é fazer uma folha de estudo, uma
one-sider, da sua própria.
Então olhe para os últimos se você já viu os últimos.
Chegar aos amigos para ver o que eles estão colocando em suas.
>> Mas as mãos para baixo, a melhor maneira que você puder estudo é que passar por tudo e
talhar-lo para o que devem ou não pertence a essa folha de
papel, porque isso é apenas um realmente maneira útil para que você tenha certeza
você está passando por tudo e ter alguma familiaridade com ele.
A maioria das pessoas, encontramos, ainda que ter a folha de papel sentado
ao lado deles no questionário, não ligue para isso, uma vez que, de novo, que muito
processo de ir através da informação ajudou a aprender.
>> Alguém tem alguma dúvida sobre questionário 0?
Tem todos -
Eu não vou fazer um show de mãos.
Nunca mente.
Eu ia perguntar quem começou a estudar.
Mas eu não quero fazer você tudo não levantem suas mãos.
Então, como eu disse - sim, Avi, vá em frente.
>> AVI: O que seria uma coisa útil para colocar no one-pager?
>> ALUNO: Isso é com você.
>> JASON HIRSCHHORN: Você começa para usar o seu julgamento.
Coisas úteis para colocar no one-pager, se você está confuso sobre o grande O
tempo de execução de diferentes tipos de pesquisas e tipo, colocar isso lá em um
gráfico dandy acessível.
Dessa forma, se você é pedido que na questionário, você não precisa tentar e figura
lo ou razão pela execução.
Você pode simplesmente copiá-lo para baixo.
Se você olhar para quizzes passado, uma série de vezes, não está correndo questões de tempo.
Assim que seria um exemplo de um bom coisa para colocar no seu one-pager.
>> Outras coisas boas de colocar, se você estiver confusos sobre como declarar um
função ou quais as diferentes partes a declaração da função é, escrever
que lá, uma versão genérica e, em seguida, talvez um exemplo.
Se você está confuso sobre ponteiros, um diagrama de como ponteiros trabalho é
provavelmente realmente útil.
Se você está confuso sobre recursão, um provar função recursiva lá
também pode vir a ser muito útil.
Será que isso lhe dar algumas idéias?
>> AVI: Você precisa entender a todo o processo de compilação, como
como isso tudo funciona?
>> JASON HIRSCHHORN: Tudo que foi coberto podia
aparecer no quiz.
Perguntas -
mas, novamente, algumas coisas vão ser ponderados fortemente do que outros.
Algumas coisas vêm-se novamente e novamente em sala de aula, em
palestra e seção.
Outras coisas que não tem surgem com freqüência.
>> Nós conversamos muito sobre # include e -L alguma coisa e que aqueles significam em
o processo de compilação.
Nós conversamos muito sobre o GDB, se agarram, essas bandeiras diferentes que usamos quando
compilamos algo, eo que make15, por exemplo, realmente
significa e realmente faz.
Nós não falar tanto sobre cada passo em
o processo de compilação.
Nós ainda falamos sobre isso.
Por isso, ainda é algo que você deve estar familiarizado.
Mas, novamente, não vamos ser -
coisas que surgem com mais freqüência em sala de aula são mais propensos a chegar a mais
e muitas vezes ser mais fortemente ponderados no quiz.
>> Legal.
Quaisquer outras perguntas sobre teste 0?
>> OK, então eu coloquei uma lista de tópicos sobre a placa.
Eu atravessei o programa.
Eu atravessei a seção de revisão de ontem à noite e os slides para chegar
com uma lista não exaustiva de tópicos que nós cobrimos até agora em CS50
e coisas que podem aparecem no quiz.
Então eu não vou passar por cada um único destes.
Isso levaria muito mais tempo do que o que temos agora.
Mas eu coloquei isso aqui à espera jog sua memória como a coisas que podem
ou pode não ser tão familiar com você.
>> E eu adoraria passar a maior parte do seção respondendo suas perguntas sobre
estes temas, temas que não são aqui tratados.
Nós podemos escrever um código pseudo.
Nós podemos escrever o código real, para garantir que você -
Eu posso responder a sua pergunta e ajudar todos fundamentalmente entender um
Muitos desses temas de forma que você sente preparado e confortável indo para
o amanhã quiz.
Então leia sobre a lista.
Você espero ter chegado a seção com algumas perguntas também.
Quando estiver pronto, levante a mão e vamos começar.
>> Tenha em mente, as perguntas que você tem, não há perguntas estúpidas.
Ouvimos muito isso.
E as perguntas que você tem, estou disposto apostar, muitas outras pessoas, tanto
aqui sentado e assistindo on-line têm também.
Assim, você só pode ajudar as pessoas fazendo perguntas.
Marcus.
>> MARCUS: entre a pilha e o pilha, há uma pré-alocado
percentagem de memória que é definido como isto é para a pilha ou para o monte?
Ou como é que isso funciona exatamente?
>> JASON HIRSCHHORN: Ótima pergunta.
Eu estou indo para trás traçar um pouco.
Será que toda a gente -
por favor, seja honesto aqui.
Eu sei que eu estou pedindo para você aumentar a sua mão na frente de seus pares.
Mas há pessoas que se sentem desconfortável com a pilha e pilha
e gostaria de passar por cima desse eo que os significa?
Levante a mão se -
OK.
Obrigado.
Então, vamos passar por cima da pilha e a pilha muito rapidamente e, em seguida,
mover-se em responder a sua pergunta.
>> Então, se nós tirar uma caixa para representar memória em seu computador, o que são alguns
coisas que vão nessa caixa?
Main.
A função principal.
Onde o principal ir?
>> Estudante: [inaudível].
>> JASON HIRSCHHORN: Então nós vamos colocar principal aqui.
O que mais vai nessa caixa?
>> ALUNO: As funções que você chama.
>> JASON Hirschhorn: As funções que chamamos.
E onde eles vão?
>> ALUNO: Na pilha.
>> JASON HIRSCHHORN: Eles ir na pilha.
Então, vamos chamar isso de coisa aqui em baixo da pilha.
E lá em cima, temos a heap.
Assim, a memória não é uma caixa assim.
Mas é realmente muito similar.
Vai ser um monte de caixas ao longo do e mais, dependendo de como é grande o seu
computador é ou o quão grande é a sua memória.
>> Ao entre aspas "bottom" é a pilha.
E há várias coisas que vão para a pilha.
E aqueles dependem das funções você tem no seu código.
Você sempre tem uma função em seu código chamado principal, por isso há sempre um
seção aqui no empilhar dedicado à principal.
>> Estas seções da pilha são chamados quadros de pilha.
Quando você chamar outra função, dizer principal chama uma função de busca binária,
vamos colocar outro quadro na pilha.
Mais especificamente, nós vamos doar um pedaço de memória em nosso
computador para armazenar binário busca de locais variáveis ​​e para executar o binário
código de pesquisa.
>> Então chamamos de busca binária.
Neste pedaço de memória, nós vamos para armazenar suas variáveis ​​locais.
Nós estamos indo para armazenar suas chamadas printf.
Aconteça o que acontecer, essa função é vai ser armazenado ali.
Pesquisa binária vai executar.
Ele vai para concluir a execução.
Qual é a palavra em C que significa uma função que deve
completar a sua execução?
>> ALUNO: Return.
>> JASON HIRSCHHORN: Return.
Assim, sempre que você vê uma instrução de retorno, as extremidades de função
quando bate aquele.
Então busca binária vai acertar seu retorno.
Esta parte da memória será, essencialmente, ser liberada.
E principal vai voltar para execução.
Assim principal fará uma pausa sempre que era, chamada busca binária, obter algum valor de retorno,
e continuar a execução.
Este quadro de pilha vai embora.
>> Se chamarmos uma função recursiva, que é uma função que chama a si mesmo ao longo do
e mais, podemos chegar - dizer que fez busca binária recursiva.
Podemos obter uma versão binária de pesquisa, busca binária dois, busca binária
três, busca binária quatro, busca binária cinco.
E então esta pesquisa binário final cinco vai bater o caso base, ea pilha
quadros voltar e manter fechamento até chegarmos de volta à principal.
Nós podemos passar por cima de recursão em um pouco.
Mas tudo isso é para dizer que, se você estiver chamar várias funções ao mesmo tempo,
haverá pilha múltipla quadros na pilha.
>> A pilha, por outro lado, se aqui, não é para as funções,
não para variáveis ​​locais.
É para alocada dinamicamente variáveis.
Então, essas são as variáveis ​​que podem ser inicializado no principal ou uma
Função que principais chamadas.
Em qualquer lugar no seu código, eles pode ser inicializado.
E para inicializar um dinamicamente variável alocada.
Qual a função em C que usamos?
>> ALUNO: Malloc.
>> JASON HIRSCHHORN: Malloc.
Você chama malloc.
Você ganha um espaço de memória.
E que o espaço de memória está no heap.
E esse espaço de memória permanece lá até que você ligue grátis.
>> Então variáveis ​​alocadas dinamicamente em pilha vai existir por tanto tempo quanto você
quer que eles existem, e eles não vão ir embora até que você explicitamente
dizer-lhes para ir embora.
Você pode criá-los em uma função.
Aquela pilha de função quadro vai embora.
Mas essa variável ainda existirá na pilha até que ele seja liberado,
potencialmente pela função que chamou busca binária ou o que seja.
>> Então, essas variáveis ​​heap ficar lá durante o tempo que você quiser
eles para ficar lá.
E eles se colocar aqui.
E, em seguida, o próximo é colocado lá.
Mantêm-se preenchido, e eles ficar lá até que você ligue grátis.
>> E, essencialmente, a pilha ea pilha, ficando à pergunta de Marcus,
crescem em direcção um ao outro.
E se correr para o outro, você tem usou toda a memória do seu
computador, e seu programa vai sair porque você não tem mais memória
deixaram de usar.
Entre eles, existem potencialmente outras coisas.
Mas, para o escopo deste curso, você não precisa se preocupar com isso.
>> Então essa foi a resposta à sua pergunta.
Não se preocupe com isso.
Mas essa era a resposta longa.
Tudo o que você precisa saber é o pilha ea pilha vai -
um começa na parte inferior.
A pilha faz.
A pilha está lá em cima.
Eles irão crescer mais perto um do outro.
>> E se tocar, isso é um problema.
Você ficou sem memória.
Mas também, além de saber onde eles estão, o que está armazenado em ambos os
pilha e heap.
Curtis.
>> CURTIS: Quando eles colidem, é que um estouro de pilha?
>> JASON HIRSCHHORN: Quando eles colidem, isso não é um estouro de pilha.
Um estouro de pilha é uma área diferente que podemos passar por cima se você quiser.
OK, vamos voltar a isso daqui a pouco.
>> Estudante: Qual é a palavra chamada quando eles batem um no outro, o
pilha e da pilha?
>> JASON HIRSCHHORN: Por agora, não se preocupe.
Só sei -
Eu vou responder a essa pergunta depois da aula.
Se eles correm para o outro, você correu para fora de memória, porque não há mais
espaço ali.
>> ESTUDANTE: Desculpe, mas o que é uma falha de seg?
>> JASON HIRSCHHORN: Um segmento falha pode ser chamado para -
depende por que chamou o culpa seg.
Às vezes, o estouro de pilha, vai dizer seg falhas como o erro.
>> ALUNO: E sobre dereferencing uma variável null?
Isso é uma falha de seg?
>> JASON HIRSCHHORN: Dereferencing um ponteiro nulo -
OK, então se você tem um ponteiro que você definir igual a nulo, ponteiros, recall,
endereços de memória loja como os seus valores.
E um ponteiro nulo é essencialmente armazenamento de 0, o 0-th
abordar nessa variável.
Assim 0x, 0, 0, 0, 0, et cetera.
Isso 0-th endereço na memória que não é em nossa imagem, que está lá em cima
em algum lugar, que é reservado para o computador.
Não temos permissão para tocá-lo.
>> Assim, quando o programa está em execução, se algo está tentando ir para a memória
endereço 0, ele sabe que que é um valor vazio.
Ele não sabe nada deveria estar lá.
Então, se você tentar usar alguma coisa lá e tratar algo como lá ou
tentando ir para esse local, você está vai ter uma falha ou um erro seg.
Isso responde a sua pergunta?
>> E agora vamos voltar de estouro de pilha.
As coisas na pilha, como vocês têm visto antes, em - vamos desenhar um close
-se de um quadro de pilha.
Todos podem ver isso?
Então, nós temos o nosso quadro de pilha.
Estamos salvando uma matriz como um local de variável nesta função.
Então, dizer que a nossa matriz tem cinco pontos.
Todos os cinco desses vai ser armazenado nesse quadro de pilha.
>> Se começar a escrever para além do limites deste conjunto -
por isso, se começar a escrever em, vamos dizer que é 0.
Esses são os cinco índices da nossa matriz.
Se começar a escrever em índice 5, que não temos quando temos uma
matriz de tamanho 5, começamos a escrever em índice de 6, 7, 8, 9, podemos obter uma Stack
Erro de estouro.
>> Geralmente não é -
você provavelmente vai ter problemas se você passar por cima por um.
Mas, geralmente, você vai entrar no mais problemas, se você passar por cima de um monte
e você ir tão longe mais que você escreve sobre o endereço de retorno que
função, que está localizado no parte inferior do quadro de pilha.
>> Porque, certo?
You - no - desculpe.
Não ", porque a direita."
>> No quadro de pilha, você tem suas variáveis ​​locais.
Na parte inferior da pilha quadro é o endereço de retorno.
É aí que a função vai quando acabar.
E se você substituir esse retorno endereço, em seguida, quando este quadro de pilha,
quando você está indo através da pilha enquadrar e execução de cada linha, você está
indo para ir para o seu novo endereço de retorno que está escrito lá em vez de o
um real.
E é assim que nós vimos algumas falhas de segurança
pode acontecer com os computadores.
>> Então estouro de pilha, em suma, é quando você substituir o papel na pilha
você deveria usar, o local de variável que você deveria usar, e
em especial, quando você começa a sobrescrever coisas importantes, como o
endereço de retorno.
E é aí que você vai ter um erro.
Ou talvez até mesmo você pode começar mesmo escrevendo em -
dizer de busca binária foi logo acima principal.
Se você substituiu muito, você poderia escrever em principal.
Mas, geralmente, você recebe um erro antes então, porque o computador sabe
você está fazendo algo que você não deveria estar fazendo.
É.
>> Estudante: Qual é a diferença entre um estouro de pilha
e um buffer overflow?
>> JASON HIRSCHHORN: Buffer overflow é um tipo mais genérico de
o que eu acabei de descrever.
>> ALUNO: Então um estouro de pilha é um exemplo de um buffer overflow.
>> JASON HIRSCHHORN: Exatamente.
Esta é uma matriz que podemos pensar como buffer, um espaço para que as coisas vão dentro
Este é um estouro de buffer de pilha.
Poderíamos ter um estouro de buffer de pilha.
Se houve um tampão, o qual muitas vezes existe é uma matriz da pilha, e nós
overwrote desses limites, então nós ter um estouro de buffer de pilha.
>> E além do escopo deste curso, eles são detectados um pouco diferente.
O compilador tem especial meios de detecção de cada uma.
Mas um buffer overflow é um mais genérico tipo do que eu descrevi,
que foi um estouro de buffer de pilha.
Será que isso responde sua pergunta?
Doce.
>> Havia outras questões relacionadas para a pilha ou a pilha?
É.
>> ALUNO: Eu sei que você tem que cordas livres porque eles estão no heap
e você não quer vazar memória.
Mas você tem que liberar as variáveis ​​globais e coisas assim?
Ou eles são liberados automaticamente?
>> JASON HIRSCHHORN: Boa pergunta.
Assim, em CS50.H, criamos essa coisa para você chamou uma string.
Uma corda é realmente o que?
>> ALUNO: Char estrela.
>> JASON HIRSCHHORN: Uma estrela char, um ponteiro a um personagem, um ponteiro para
um conjunto de caracteres.
Isso é o que a corda é.
Então, precisamos libertá-la, porque getstring, que usamos muito -
nome da seqüência é igual getstring -
que mallocs para nós um pouco de memória no heap e retorna um ponteiro para a
primeiro caractere que corda, uma estrela de char.
>> Então, aparentemente, se você não tiver sido escrevendo livre em qualquer de suas cordas
que você já chamou até agora, você tem foi vazando um pouco de memória.
Claro que nós não falamos sobre lo, de modo que ninguém é chegado em
problemas para fazê-lo.
Mas daqui para frente, sim.
Quando você chamar getstring, você está mallocing algum espaço no heap.
E se você não chamar livre, mais tarde, que corda, você tem um vazamento de memória.
Isso responde a sua pergunta?
>> Sim
>> Estudante: Então, para fazer isso, usamos direito livre antes do retorno?
Como, no âmbito de, eu acho que se dizemos, como, int main, dentro do
âmbito do código que está dentro daqueles chaves, bem antes -
você sabe onde você gostaria costumo colocar retorno.
Você coloca livre antes disso?
>> JASON HIRSCHHORN: Então você pode colocar livre onde quer que você colocá-livre.
Porque estes são alocados dinamicamente variáveis, porque eles podem
viver para além do âmbito de uma determinada função, se você chamar malloc em um
função separada, por exemplo, getstring, você pode ligar gratuitamente no principal.
Você não precisa de chamá-lo na função específica
onde malloc é chamado.
Mas você precisa fazer para chamá-lo antes da volta principais.
>> E isso realmente depende.
Depende de qual você malloced que espaço, em primeiro lugar.
Algumas pessoas vão chamar libertar muito rapidamente.
Algumas pessoas não vão ligar gratuitamente até No final do seu programa.
E eles vão passar por e livre de tudo.
Depende de por que você chamou malloc.
>> ALUNO: E o que você diria se você chamou uso getstring?
Você diria que livre o quê?
>> JASON HIRSCHHORN: Então a sintaxe de graça é simplesmente livre, parêntese aberto, perto
paren, e o nome do ponteiro.
Então, se você escrever iguais String nome getstring, você colocar o nome aqui.
Esse é o nome do ponteiro.
E ele sabe que para libertar memória.
>> Estudante: Então, quando ele libera a memória, o ponteiro ainda aponta para aquele lugar
na memória?
Ou é o ponteiro também esvaziada de o endereço que ele aponta.
>> JASON HIRSCHHORN: Devemos tentar isso.
Devemos codificar isso.
Vamos voltar quando chegarmos codificação, e vamos codificar isso.
E se você quiser descobrir a resposta para isso, você também pode código que
no mesmo período.
Mas isso é uma grande questão.
>> ALUNO: É possível algo livre cedo demais?
Então, você ainda precisa para o seu programa, e você libertou esse espaço de memória?
>> JASON HIRSCHHORN: sim.
É possível, se algo livre e depois de usá-lo novamente, você vai
deparar com um erro.
Mas isso é para você, porque você libertou alguma coisa e, em seguida, chamou-lhe mais tarde.
Então isso foi um erro do programador.
Mas sim.
Você pode escrever isso.
>> Mais alguma pergunta sobre -
Sim.
>> Estudante: Então, se você é suposto a apenas libertá-lo, em geral antes da
programa termina, isso significa que se o programa termina e você não liberá-lo,
que a memória ainda é alocado?
>> JASON HIRSCHHORN: Se o programa termina e você se esqueça de liberar alguma coisa, então
que a memória foi alocada ao longo a vida útil do seu programa.
Quando o programa se fecha completamente, que a memória não está acontecendo
para ficar lá para sempre.
O computador é inteligente o suficiente para saber que, quando o programa é fechado, ele
deve se livrar de toda a memória que foi associado com o referido programa.
>> No entanto, existem ferramentas que podem ser executados em um programa para detectar se, quando o
programa terminar, você esqueceu para liberar memória.
E para o seu próximo conjunto de problemas onde você estará usando malloc e usando
ponteiros, você estará correndo este programa em seu programa para ver se,
quando retorna principais, você teve algum coisas que foram deixadas não-liberto.
>> Então, eles não vão ficar malloced para sempre em seu computador.
Isso seria um desperdício, porque muito rapidamente, computadores
iria ficar sem memória.
Mas, se eles correm até o final do seu programar e eles não estão liberados e seu
programa sai, isso ainda é um problema que esta ferramenta irá ajudá-lo a resolver.
>> ALUNO: É isso Valgrind?
>> JASON HIRSCHHORN: É chamado Valgrind.
E você vai ser -
>> ALUNO: Mas não temos de saber que, para o teste, embora?
Quero dizer, foi falado um pouco na palestra.
>> JASON HIRSCHHORN: Então Valgrind é o nome dessa ferramenta.
Saber o que ele faz é suficiente para o quiz.
Mas você não tê-lo usado ainda em seu conjunto de problemas, porque nós não tivemos uma
conjunto de problemas que tem explicitamente tratado com malloc ou você está usando malloc.
Então, você não usou Valgrind ainda.
Mas você vai usá-lo, mais cedo em vez de mais tarde.
>> ALUNO: Você pode repetir Valgrind que é?
>> JASON HIRSCHHORN: Desculpe?
>> ALUNO: Você pode repetir o que a finalidade de Valgring é?
>> JASON HIRSCHHORN: Valgrind é o nome -
como GDB ajuda a depurar o seu programa, Valgrind ajuda você a descobrir se
as coisas não foram libertados quando o programa é fechado.
Então você vai executá-lo em seu programa.
E o seu programa sai, e ele vai dizer seu programa chamado malloc isso muitos
vezes por isso muitos bytes, e você apenas chamado de livre isso muitas vezes.
E assim você deixou esses muitos bytes sem ser libertados.
Ou vai dizer que você libertou tudo.
Bom trabalho.
>> ALUNO: OK.
E ele é chamado Valgring?
>> Jason HIRSCHHORN: V-A-G-G-R-I-N-D.
>> ALUNO: Uma pergunta sobre ponteiros.
Então, digamos que você tenha n estrelar x é igual a alguma coisa.
Isso equivale a, o que você está colocando lá, é que o que está sendo colocado dentro
o que x está apontando para, ou o ponteiro de x?
>> JASON HIRSCHHORN: Você pode repetir a pergunta?
Podemos chamar a isso enquanto você diz isso?
>> ALUNO: No questionário, na verdade, a aquele que você nos enviou, era como, char
estrela verdade é igual a CS50 rochas, certo?
Então, isso significa que esse CS50 rochas é o que a verdade está apontando para?
>> JASON HIRSCHHORN: Então você está falando sobre uma estrela de caractere em uma string, como
que funciona?
É.
OK.
Vamos chamar isso aqui.
>> [SIDE CONVERSA]
>> JASON HIRSCHHORN: Então esta variável vai ser do tipo char estrela.
Quão grande é uma variável do tipo char estrela?
Quantos bytes?
>> ESTUDANTES: quatro.
>> JASON HIRSCHHORN: É quatro bytes.
Quantos direitos é uma variável do tipo int estrela?
>> ESTUDANTES: quatro.
>> JASON HIRSCHHORN: Quatro bytes.
Se for um ponteiro, então é sempre quatro bytes, pois os ponteiros, o seu
valor é um endereço de memória.
E os endereços de memória sobre o CS50 aparelho são quatro bytes.
Então, quando nós chamamos getstring, ou quando nós digamos, Nomedestring iguais, e, em seguida, em
aspas colocar uma corda, estamos colocando -
bem, isso é um pouco diferente.
Nós vamos fazer getString como o exemplo.
Ou char estrela algo é igual à string.
Desculpe, me dê o exemplo que você leu?
>> ESTUDANTE: char estrela verdade é igual a "CS50 pedras" entre aspas duplas.
>> JASON HIRSCHHORN: Então esta estrela, este vamos chamar esta variável x para o nosso
propósitos genéricos.
Nós criamos uma variável chamada x.
É tipo char estrela.
É um ponteiro para uma série de caracteres.
Então, aqui em baixo -
>> Portanto, esta é a forma como isso seria trabalho na memória.
Isso iria armazenar um endereço de memória.
Seria armazenar o endereço de memória o primeiro caractere na matriz.
E então, quando você seguiu o ponteiro, você faria
obter o primeiro caractere.
>> E se você está lendo essa coisa como uma corda, o computador é inteligente
o suficiente para saber, leia tudo isso até chegar a uma reação 0.
Mas se você está lendo isso em um personagem um tempo, assim que você está interagindo através
esta cadeia, então você só vai ler um caractere de cada vez até chegar ao
barra invertida 0.
Isso pode não responder à sua pergunta.
>> ALUNO: Sim, mas você não tem malloced que o espaço
Ainda para esse ponteiro.
>> JASON HIRSCHHORN: Então, eu não tenho certeza exatamente o que você está olhando,
porque eu não fiz que quiz.
Isso era para ser um útil recurso de outro TF.
Se você estiver criando uma corda no pilha ou como uma variável local, ele vai
ser apenas matriz de cargas, em vez de geralmente uma estrela de char apontando para
outra string.
Mas eu não sei.
Isso poderia ser um ponteiro para outro string na pilha também.
É.
>> ALUNO: Eu sei que você precisa alocar memória se o ponteiro estiver
sendo declarada dentro de outra função.
Você precisa fazer a mesma coisa, se é ser declarada dentro de principal,
você está usando-o dentro do principal?
>> JASON HIRSCHHORN: Então, sim.
Você pode declarar um ponteiro para qualquer endereço de memória na memória.
Ele pode ser o endereço de memória de um local de variável, embora, muitas vezes,
as pessoas não declarar os endereços de memória a variáveis ​​locais, porque eles vão
longe, uma vez que a função retorna, o que É por isso que geralmente malloc coisas.
Mas sim, você poderia declarar um ponteiro a outra variável local.
Não é apenas geralmente feito.
Mas eu posso dar uma olhada no que coisa específica depois da aula.
É.
>> ALUNO: Eu acho que isso é uma espécie do que está sendo solicitado.
Parece estranho para ser inicializado um ponteiro não como um
endereço, mas como o parece ser um valor.
Parece que o CS50 é o que está dentro a coisa que está sendo apontado e
não o endereço real, certo?
>> JASON HIRSCHHORN: Então é isso não é o caso, porém.
Não é isso que está acontecendo.
Quando você declara uma estrela char, é um endereço de memória.
Os ponteiros são todos os endereços de memória apontando para algo mais.
Que outra coisa poderia estar no pilha, mas é quase sempre sobre o
amontoar na forma como vai vê-lo usado.
Mas Nomedestring igual de aspas duplas "GetString", podemos ver isso e nós
pode olhar por isso e codificar isso.
getString cadeia não está sendo salvo em essa variável, ou o que a string
nome não está sendo salvo na medida em que variável, não porque é assim que
ponteiros funcionam.
Será que isso faz sentido?
>> ESTUDANTE: Yeah.
>> JASON HIRSCHHORN: OK.
Felizmente, isso não era confuso para qualquer um.
Mas se fosse, nós podemos olhar para ele de novo daqui a pouco, porque na verdade estamos indo
codificar algo que venha a trabalhar com cordas e ajudá-lo a sentir-se
mais confortável com eles.
>> Quaisquer outras questões relacionadas com estes tópicos ou outros tópicos que
Vou colocar de volta?
E -
agora.
Sim, Alden.
>> ALDEN: Então isso é completamente alheios, mas podemos simplesmente passar por cima
muito rapidamente o que precisa de saber sobre a diferença entre um 32 e
Máquina de 64 bits?
>> JASON HIRSCHHORN: sim.
Assim, 32 bits é quantos bytes?
>> ALDEN: É quatro bytes.
>> JASON HIRSCHHORN: É quatro bytes.
E 64 bits é quantos bytes?
>> ALUNO: Oito.
>> JASON HIRSCHHORN: Oito bytes.
Então, novamente, oito bits é um byte.
O seu aparelho é CS50 uma máquina de 32-bit.
Assim, os endereços de memória são quatro bytes de comprimento.
Existem 2 para o 32 endereços de memória.
De 0 a 2 para o 32 menos 1.
E eu não sou positivo, mas isso é provavelmente o escopo do que você precisa
saber para uma máquina de 32 bits, que a memória endereços são, mais uma vez, quatro bytes de comprimento,
e essa é a quantidade máxima de endereços de memória.
>> Além disso, os tipos de dados -
isso pode ser algo tão bem, isso é digno de nota.
O tamanho de um tipo de dados depende a máquina que você está trabalhando.
Assim, um char, um único personagem, é como muitos bytes em nosso aparelho CS50?
Um byte.
E é realmente um byte como bem em uma máquina de 64 bits.
>> E a maioria dos tipos de dados são o mesmo número de bytes em ambas as máquinas.
Mas alguns tipos de dados será diferente em ambas as máquinas.
Assim que seria potencialmente única coisa que você precisa saber.
>> Mas mesmo isso, eu acho, está além dos limites -
Tenho quase certeza, se você olhar para trás em quizzes velhos, diz que, para assumir
codificação problemas que você está usando uma máquina de 32-bit.
Mas há, para ir junto com isso em Caso você esteja interessado, há
tipos de dados que são os mesmos tamanho em todas as máquinas.
>> Se você já viu algo parecido uint32_t, você pode ou
não vi isso.
Isso é um tipo de dados.
Isso está dizendo, seja de 32 bits não importa o que esta máquina está ligada.
Então, quando as pessoas estão escrevendo portátil código, eles provavelmente não vai usar ints.
Eles em vez vou usar esses outros dados tipos que sabe que vai ser o mesmo
tamanho em cada máquina individual.
Madhu.
>> MADHU: Eu tinha uma pergunta sobre o processo de compilação.
Então, se você está escrevendo um programa que usa uma biblioteca como CS50 ou algo
assim, eu sei que essa biblioteca tem que, em algum momento, ser
compilado e ligado dentro
Mas quanto do que acontece durante a compilação do seu programa?
Que parte desse processo biblioteca ocorre quando você está
compilar seu próprio programa?
>> JASON HIRSCHHORN: Então vamos passar por cima em geral, os passos do presente processo.
Você escreve seu arquivo c..
Em seu arquivo c., Você # include seu bibliotecas de cabeçalho, por exemplo, cs50.h.
O que isso acentuada incluem linha de fazer para o seu programa?
Akchar.
>> AKCHAR: Acrescenta os protótipos de as funções a partir do cabeçalho
arquivos das bibliotecas.
>> JASON HIRSCHHORN: Exatamente.
Acrescenta esses protótipos de função ao seu código.
Então, quando seu código está sendo compilado em estágios iniciais, o compilador sabe
que essas funções realmente existem, e que em algum lugar eles foram definidos.
Os arquivos. H não incluem o definições para estas funções ou como
eles realmente funcionam.
Cs50.h apenas inclui algo que diz getstring é uma coisa real que
pode acontecer.
E standardio.h diz printf é uma coisa real que pode acontecer.
>> Portanto, sua linguagem c com isso. Cabeçalho arquivo é transformado em alguns
código de leitura óptica, que eventualmente se transformou em binário
código, 0 e 1 do.
E esse é o código que, em última instância é executado.
A l-line CS50 - por exemplo, quando você está escrevendo Clang -
e então você incluir-l CS50, que você digita dentro
E você vê isso.
Quando você escreve faz, você vai ver que line-up aqui.
E vamos ver que em um segundo quando codificamos ou mais tarde, quando código.
>> Mas a linha que CS50-l faz algo um pouco diferente do que
o # include cs50.h.
O que faz linha que-l CS50 fazer?
Avi?
>> AVI: Eu quero dizer que ele se vincula a biblioteca para a função
chamar, como os arquivos. Ó.
>> JASON HIRSCHHORN: Então muito perto, se não spot-on.
A l-CS50 leva o arquivo binário e funde-se com o seu arquivo binário.
Então cs50.h, não há ponto de viragem cs50.h da linguagem C para binário cada
única hora que ele está sendo usado.
Isso seria bobagem, porque isso seria um desperdício de tempo.
Por isso, já foi compilado e se transformou em um executável.
E agora ele vai ser fundidas com o seu arquivo no final.
Portanto, aqueles 1 e 0 estão indo fundir-se com os seus entes
e 0 no final.
Então, agora você vai realmente ter o real 1 e 0 que definem como getstring,
por exemplo, trabalha, ou como printf, por exemplo, funciona.
>> E para mais informações, há uma compiladores curtas que Nate dá que
você deve verificar que vai por estas etapas.
Mas -
Sim.
>> ALUNO: eles estão sempre em arquivos S. quando estão na forma de biblioteca,
pronto a ser incorporado, ligado - como eles estão no código binário?
>> JASON HIRSCHHORN: OK.
O que -
>> ALUNO: É sempre o caso para as bibliotecas quando você ligá-los?
>> JASON HIRSCHHORN: sim.
Portanto, há arquivos, o que será é. S o código de máquina, que também será
enigmática para você.
Você não precisa se preocupar com esses.
Mas, geralmente, sim, eles vão estar no formato. o arquivos prontos para ir.
>> Estudante: Então, quando você enviar para uma biblioteca, não só enviamos
o h. eo. o?
Você não enviar o. C ou o. S.
>> JASON HIRSCHHORN: So -
e este é neste curto, bem como, se esta informação parece vir a
pouco rapidamente.
Mas o curto em compiladores fala sobre isso também.
Quando você envia uma biblioteca, se você enviar o h., o arquivo de cabeçalho, os
protótipos de função, ea 1 de e 0 de, isso é tudo que você precisa para dar.
Você não precisa dar a forma como o função funciona, o arquivo c..
Porque o ponto de abstração, ou o apontar APIs, o ponto neste SPL,
a biblioteca portátil de Stanford, é para você não se preocupar sobre como novo
GRect funciona, ou como mover obras, ou como adicionar obras.
Tudo o que você precisa saber é que add é uma função que você pode
usar, e ele faz isso.
Então, você realmente não precisa saber como é escrito em C. Você só precisa
sabe, aqui são as funções, o que eles fazer, e aqui estão as de 1 e 0
quando você realmente quiser usá-los.
>> Legal.
Mais alguma pergunta sobre compiladores ou de outros tópicos sobre a placa?
>> ALUNO: Eu tenho uma pergunta de implementação de funções recursivas.
Uma pergunta sobre a recursividade.
Eu tinha a sensação de que iria vir para cima.
Então, vamos rapidamente passar por recursão com um específico
exemplo, uma função fatorial.
Porque este é um exemplo que muitas vezes surge ou é usado
para ilustrar a recursividade.
>> Assim, "4!" é lido como 4 fatorial.
E o que 4 fatorial significa?
O que isso faz?
Como calcular 4 fatorial?
4 vezes 3 vezes 2 vezes 1.
>> Assim, uma outra maneira de escrever 4 fatorial é escrever isso.
4 vezes 3 fatorial.
Porque 3 fatorial é 3 vezes 2 vezes 1.
SO 4 vezes 3 fatorial é 4 vezes 3 vezes 2 vezes 1.
É por isso que fatorial é um grande candidato a recursão, porque é
claro que não é algo que acontece mais e mais e mais em um
menor número de coisas até você chegar ao fim.
Quando você chegar a 1, 1 fatorial é 1.
Você não pode ir muito mais longe.
0 fatorial também é definida como 1.
Então, quando você começa a 1 ou 0, você está no final, e você pode
começar a ir para cima.
Então, se nós queria escrever uma recursiva função para calcular a fatorial,
vamos escrever algum pseudocódigo para isso agora.
Antes de escrever que pseudocódigo -
Eu vou dar a vocês um par de minutos para escrever o código pseudo ou apenas pensar
sobre isso - há duas coisas a cada função recursiva precisa.
O que são essas duas coisas?
>> JACK: Ele tem que se identificar.
>> JASON HIRSCHHORN: Noah?
Oh, Jack.
Vá em frente.
>> JACK: Ele tem que se identificar.
>> JASON HIRSCHHORN: Então uma recursiva função precisa de uma chamada recursiva, uma
chamar a si mesmo.
Essa é uma.
E qual é a outra coisa?
>> JACK: Um caso base.
>> JASON HIRSCHHORN: Um caso base.
Um caso base é, aqui é quando paramos.
Portanto, sua função é chamada.
O caso base vem em primeiro lugar.
Você quer saber se você está no final.
E se você não está no fim, você fazer a sua chamada recursiva.
E você passar por esta função novamente, verificar o seu caso base novamente.
Se você não é o fim, você faz outra chamada recursiva,
et cetera, et cetera.
>> É por isso que funções recursivas sempre precisar desses casos base e aqueles
chamadas recursivas.
Se você não tem uma chamada recursiva, ele não seria uma função recursiva.
Se você não tem um caso base, você iria para sempre e
não haveria final.
E o caso base sempre vem em primeiro lugar, porque você vai sempre querer verificar
se você estiver no final primeiro.
Então, antes de fazer algum pseudocódigo, por que você não dê um minuto para pensar sobre
como uma função fatorial recursiva seria escrito?
>> Além disso, como muitos como você está fazendo, escrita -lo em uma folha de papel é
o que você vai ter que fazer sobre o teste de amanhã.
Então, provavelmente, uma boa prática para fazer Certifique-se o código que você está escrevendo
para baixo na folha de papel -
ou você pode fazer isso.
Você sabe onde as vírgulas são.
Você se lembra da sintaxe.
Porque você não está ser capaz de ter uma compilador dizer que você fez um erro.
>> Além disso, ao longo destas linhas, amanhã, quando você tem problemas de codificação, se você
está apressado para o tempo, ou se você estiver muito confuso a respeito de como você deveria
escrever a coisa particular em c, é caberia a escrever pseudo-código
ou escrever comentários no bem.
Porque não há crédito parcial para um Muitas das perguntas sobre o quiz.
Então você pode ser apressado, ou você só poderia ser confundido.
Escrevendo em comentários ou pseudo-código são frequentemente formas que
pode obter crédito parcial.
>> Portanto, não deixe algo em branco no questionário.
Não há penalidades para colocar as coisas dentro
Na verdade, colocando em pseudo-código ou Comentários vai ajudar o aluno
descobrir se você realmente sabe o que você está falando, e talvez prêmio
lhe algum crédito parcial para isso.
>> Também nesse sentido, escrever com clareza.
Se nós não podemos realmente o que você está escrevendo, não vamos chamá-lo
à meia-noite de amanhã a figura o que você escreveu.
Nós apenas estamos indo para tirar pontos.
Escreva de forma clara para que possamos ouvir, ou melhor, podemos ler o que você escreveu.
>> E se ele diz duas frases, não escreva um parágrafo.
Siga as instruções.
Escrever de forma clara.
E escrever nestes comentários ou pseudocódigo para questões que poderiam
crédito parcial prêmio.
>> OK, vamos ao fatorial.
Portanto, temos uma função fatorial.
Se eu fosse realmente escrever isso em C, o que eu preciso para colocar antes do nome
da função?
O tipo de retorno, o qual, neste caso, vamos dar-lhe int.
E, em seguida, dentro das chaves, é o que se passa dentro das chaves para
uma função?
>> ESTUDANTES: tipo de argumento.
>> JASON HIRSCHHORN: Os seus argumentos.
Então, provavelmente, fatorial tomar um argumento.
Ele provavelmente vai ter apenas um argumento.
E vamos dizer que vai demorar um inteiro chamado x.
E mais uma vez, ao escrever o protótipo de uma função ou escrever a função
em seu código antes de defini-la, você escrever o tipo de dados e o nome
essa variável para apenas essa função.
Assim, você pode passar um número para este função, ele vai ser referido como x
internamente.
>> Nós temos nossa função fatorial.
Precisamos de duas coisas, um caso base e uma chamada recursiva.
O que é o caso base para fatorial?
Alguém que escreveu-lo e que não tem falado ainda, o que é a base
caso para fatorial?
>> ALUNO: Se n é menor de 2, retornar 1.
>> JASON HIRSCHHORN: Se n é inferior a 2, retornar 1.
Eu gosto disso, porque isso cuida de 0 e 1.
Então, vamos fazer x <2, o retorno 1.
Se conseguir passar 0, se tivermos passou 1, esta função
retornar imediatamente 1.
Se conseguir passar algum número maior ou igual a 2, vamos
temos nossa chamada recursiva.
>> E então, como é que vai funcionar?
Pode alguém que trabalhou neste que ainda não tenha falado me dar a
chamada recursiva para esta função em pseudocódigo?
Se conseguir passar em um número x e é superior a 2, o que
que queremos fazer?
Temos também um exemplo escrito no lado que pode lhe dar uma dica.
>> ESTUDANTE: Call x vezes o fatorial de x menos 1?
>> JASON HIRSCHHORN: Exatamente.
Nós vamos voltar x vezes o fatorial de x menos 1.
E isso, mesmo que eu escrevi, basicamente, o que você disse em Inglês,
esta função fatorial será chamado novamente.
Ele vai executar em x menos 1.
Vai voltar com algum inteiro, e então ele vai multiplicar estes dois
em conjunto, e esse valor será voltou para o que chamou este
função fatorial, o que pode ser outra instância do
esta função fatorial.
>> Assim que é um exemplo de um recursiva função, uma muito
função recursiva simples.
Mas a maioria deles vai ser assim.
Se você gostaria de um bom recursiva desafio para o teste, tente codificação
busca binária recursiva.
Porque se você fez a busca binária para conjunto de problemas de três, você provavelmente fez isso
iterativa em um loop while.
>> Mas também pode ser escrito de forma recursiva.
Você está indo a necessidade de escrever o seu próprio função separada que leva algum
diferentes argumentos de linha de comando - ou nem argumentos de linha de comando, alguns
diferentes argumentos apenas regulares.
Mas você pode escrever de busca binária recursivamente bem.
>> ALUNO: Então você poderia ter escrito também, em vez de x menos 1, você
também poderia ter escrito x menos menos, ou você poderia ter
escrito menos menos x.
Você pode apenas explicar muito rapidamente porque esses seriam coisas diferentes,
como o que é a diferença entre x menos menos e menos menos x?
>> JASON HIRSCHHORN: Não, eu não sou vai entrar nessa.
Mas vou falar com você sobre isso depois classe. x menos menos, menos negativo x
diminuir x por 1.
Mas eles fazem isso um pouco diferente.
Mas eu não quero entrar em detalhes.
Outras perguntas sobre recursão ou esta função?
Isso não é realmente mesmo pseudocódigo.
Isso é basicamente o código C você escreveria para isso.
>> OK, quaisquer outras perguntas sobre temas aqui em cima?
É.
>> ALUNO: Eu tenho um rápido resumo ponto flutuante de precisão e.
>> JASON HIRSCHHORN: Flutuante ponto e precisão.
Pode alguém realmente rapidamente dê-me um resumo de
ponto flutuante e precisão?
Todos vocês tiveram que fazer isso para o seu conjunto de problemas, de modo que você é tudo
familiarizado com ele.
Ou talvez não todos vocês.
Qualquer um?
Dê-me um ponto de começar.
Ponto flutuante e precisão.
Qual é o problema?
Sim.
Victoria?
>> VANESSA: Vanessa.
>> JASON HIRSCHHORN: Vanessa.
Desculpe.
>> VANESSA: Há apenas um número finito de números que podem ser representados
porque você está em um em nossa caso, um sistema de 32 bits.
Então você meio que tem que fazer-se alguns números.
>> JASON HIRSCHHORN: Então é isso exatamente correto.
Há apenas uma certa quantidade de números que podem ser representados.
Se você multiplicar dois números muito grandes, pode transbordar a quantidade
de espaços que você tem de representar um inteiro.
É por isso que às vezes nós usamos um long long em vez de um int.
Isso tem mais espaços.
Que pode conter um número maior.
>> Ponto flutuante de precisão tem a ver com que, mas também tem a ver com o
fato de que os números decimais são Nem sempre representados.
Desculpe.
Deixe-me colocar isso de volta.
O número decimal 1.0 nem sempre é representado como seria de esperar,
1,000 milhões.
Às vezes é representado como 1,000000001 ou 0,999999999.
Pode-se até mesmo 89 jogados em algum lugar.
Assim, os números decimais não são representado exatamente como você faria
esperar que eles sejam representados.
>> Assim, no conjunto de problemas -
era dois? -
conjunto de problemas dois, onde lidamos com números de ponto flutuante, quando queríamos
los para representar exatamente o que queríamos los para representar o número
de moedas de um centavo, ou o número de centavos, nós multiplicá-los por 100.
Nós viramos eles.
E, então, cortar tudo atrás do ponto decimal.
Isso era para garantir que eles iriam realmente igual exatamente o que queríamos
los para igualar.
>> Porque quando você toma algo que é a flutuar e transformá-lo em um int, você
cortar tudo para a direita do ponto decimal.
Porque há algum ponto flutuante imprecisão, 100.000 poderiam ser
representada como 99,999999999.
E se você acabou de cortar tudo para o direito de imediato, você vai
obter o número errado.
É.
>> ALUNO: Eu tinha uma pergunta sobre o elenco.
Que ordem ele ocorre em?
Se você faria flutuar, suportes, 1 dividido por 10, ele faz 1 dividido por 10,
em seguida, obter 0,1, em seguida, ligue -lo em um carro alegórico?
>> JASON HIRSCHHORN: Se você fizer flutuar 1 dividido por 10 -
>> ALUNO: Sim, e, em seguida, é igual a -
Bem, seria normalmente tê-lo em igual -
É.
Você quer torná-lo um carro alegórico, certo?
>> JASON HIRSCHHORN: OK, então vamos usar isso para segue em descobrir
as respostas a estas perguntas através de codificação.
Porque você provavelmente vai ter um monte de estas perguntas minutos, e uma boa maneira
para resolvê-los é através da codificação.
Então, nós estamos indo para codificar isso agora, e então vamos voltar e
codificar a pergunta que você tinha.
>> Assim, a primeira linha -
Eu não deveria ter escrito - o que é a primeira coisa que queremos fazer quando
abrir um novo arquivo no gedit?
>> ALUNO: Incluir.
>> JASON HIRSCHHORN: Incluir o quê?
>> ALUNO: biblioteca CS50.
>> JASON HIRSCHHORN: OK.
O que mais devemos incluir?
Nós apenas estamos indo para verificar o que acontece quando você lançar algo a uma bóia.
Mas o que precisamos incluir, se estamos vai escrever um programa em C?
>> ALUNO: Padrão I / O.
>> JASON HIRSCHHORN: stdio.h.
Nós realmente não precisa, para este programa, cs50.h, mesmo que seja
sempre útil para incluí-lo.
Mas nós sempre precisamos stdio.h.
>> ALUNO: Quando a codificação em C?
>> JASON HIRSCHHORN: Quando a codificação em C.
>> Então eu salvá-lo como este arquivo c..
Eu recebo algum bom destaque de sintaxe.
Escrevi vazio dentro principal.
O que o vazio significa?
>> ALUNO: Não tomar qualquer argumentos de linha de comando.
>> JASON Hirschhorn: meio vazio, neste caso, o principal não assume qualquer
argumentos de linha de comando.
Em outros casos, isto significa que a função não leva argumentos de linha de comando.
Ou a função, se eu fosse escrever vazio main (void), que diria principais do
não devolver nada.
Então vazio só não significa nada.
O que eu iria escrever, se eu fosse ter argumentos de linha de comando?
>> ALUNO: int arco c corda do arco v
>> JASON HIRSCHHORN: int argc argv string.
É isso mesmo?
>> ALUNO: É carac suportes estrela argv.
>> JASON HIRSCHHORN: Então você poderia escrever suportes de corda argv ou char estrela argv
colchetes, mas você precisa dos colchetes.
Porque argv é um array de cordas, lembre-se.
Não é apenas uma string.
Então corda argv é, aqui está uma corda chamado argv.
Suportes de Cordas argv é, aqui está uma matriz de strings.
Então int argc argv suportes cadeia seria algo que eu
provavelmente escrever.
>> Então você queria salvar em um inteiro?
>> ALUNO: Sim, inteiro.
Ou, em um carro alegórico.
>> JASON HIRSCHHORN: Em uma bóia?
Como, float x é igual a 1 dividido por 10.
>> JASON HIRSCHHORN: OK.
Como faço para imprimir um float em printf?
O quê?
>> ALUNO:% f.
>> JASON HIRSCHHORN:% f.
O que é um número inteiro?
d ou i.
O que é uma string?
>> ALUNO: s.
>> JASON HIRSCHHORN: s.
Como faço para obter uma nova linha?
>> ALUNO: barra invertida n.
>> JASON HIRSCHHORN: O que eu retorno se principal é executado corretamente?
>> ESTUDANTE: 0.
Preciso escrever essa linha, embora?
>> ALUNO: Não.
OK, não vamos escrevê-lo, então.
Qualquer pessoa pode ler isso?
Parece um pouco pequeno.
Todos podem ver, ou deveria Eu torná-lo maior?
Acho que para a câmera, vamos fazer um pouco maior, no entanto.
>> JASON HIRSCHHORN: Se eu quero transformar este . C arquivo em um arquivo executável, o que
que eu escrevo?
>> ESTUDANTE: Faça teste.
>> JASON HIRSCHHORN: Desculpe?
>> ESTUDANTE: Faça teste.
>> JASON HIRSCHHORN: Faça teste.
Nós estávamos falando sobre esta linha anterior.
Clang.
O que há de bumbum?
O nome do compilador.
O que é essa linha?
>> ALUNO: Define-lo para uso de GDB.
>> JASON Hirschhorn: Define -lo para uso de GDB.
Esta linha, que é isso?
>> ALUNO: O código-fonte.
>> JASON HIRSCHHORN: Esse é o arquivo de origem, o arquivo c..
O que essas duas linhas de fazer?
Ou estes dois não linhas.
>> ALUNO: It nomes que testar.
>> JASON HIRSCHHORN: Então o traço o diz, nomeá-lo algo diferente.
E aqui você está chamando-o de teste.
Se eu não tenho isso em, o que seria o nome disso?
>> ALUNO: a.out.
>> JASON HIRSCHHORN: a.out.
O que isso faz?
>> ALUNO: Ligações da biblioteca matemática.
>> JASON HIRSCHHORN: Liga a biblioteca matemática.
Nós não incluir a biblioteca de matemática, mas já que é tão comum, eles têm
make escrito para incluir sempre a biblioteca de matemática.
E da mesma forma, isso inclui a biblioteca de CS50.
>> OK, então se listar, agora temos um executável chamado teste.
Para executá-lo, eu escrevo teste.
Eu vejo que o meu ponto flutuante, como esperado, é igual a 0.
Será que isso -
so -
>> Estudante: Então, se você colocar flutuar agora, como você lançá-lo como float -
>> JASON HIRSCHHORN: Elenco o 1 a uma bóia?
>> ALUNO: Não, atire a coisa completa -
sim.
Se você acabou de fazer isso, não que fazê-lo de 0,1?
>> JASON HIRSCHHORN: OK, então muito rapidamente, 1 dividido por 10, são
inteiros sendo dividido.
Então, quando você dividir inteiros, eles são 0, e você está salvando que 0 em um
flutuar, porque a barra está apenas divisão inteira.
Então agora estamos transformando algo em um carro alegórico.
>> Vamos ver o que acontece.
Nós vamos fazer teste.
Então, agora vemos que esse corte não era divisão inteira, ele estava flutuando
divisão ponto.
Porque um dos seus argumentos tinha sido convertido em um float.
Então, agora ele estava dizendo, tratar esta divisão como estamos lidando com
Os pontos de flutuação, não com números inteiros.
E, assim, obter a resposta que esperamos.
>> Vamos ver o que acontece -
oops.
Se eu quisesse imprimir mais decimal manchas, como eu poderia fazer isso?
>> ALUNO: Ponto ponto f, ou como muitos casas decimais que você deseja.
>> JASON HIRSCHHORN: Então eu imprimir 10 pontos decimais.
E agora vemos que estamos recebendo algumas coisas estranhas.
E isso vai voltar para a sua pergunta cerca de ponto flutuante imprecisão.
Há coisas estranhas armazenados aqui.
>> OK, isso responde sua pergunta?
O que mais você quer para codificar rapidamente?
>> ALUNO: Eu só queria ver se ou não, se você liberou alguns ponteiro,
se esse ponteiro ainda tinha armazenado em que o endereço que tinha sido
apontando para anteriormente.
>> JASON HIRSCHHORN: OK, então vamos fazer isso.
Char ptr estrela, isso cria uma variável chamado ptr do tipo char estrela.
Como faço para escrever malloc?
Alden?
>> ALDEN: Apenas malloc.
Mas, então, ele tem que ser o tamanho de, e neste caso, eu acho que você
estar apontando para char.
Assim, seria de char.
>> JASON HIRSCHHORN: OK, então mais genericamente, Dentro -
vamos editar.
Dentro malloc, você deseja que o número de bytes na pilha.
Geralmente, o que temos visto que estamos fazendo é que estamos indo para malloc
cadeias, por exemplo, ou matrizes de inteiros.
Portanto, se queremos 10 inteiros, ou 10 caracteres, 10 nos dará 10.
E, em seguida, tamanho de caracteres daria nos de que o tamanho de caracteres, que na
Neste caso, é de 1 byte.
Ficamos com 10 bytes.
Se fôssemos escrever tamanho de int, que nos daria 40 bytes.
>> Então, mais genericamente, dentro de malloc é o número de bytes que você deseja.
Neste caso, estamos recebendo um byte.
Que parece ser um uso estranho de malloc, mas para o nosso
propósitos faz sentido.
Portanto, não é isso.
>> Vamos chamar livre.
Nós se livrar dele e usamos ptr novamente.
E o que você deseja verificar?
>> ALUNO: Eu só queria verificar se houve ou não qualquer coisa
no interior do mesmo.
>> JASON HIRSCHHORN: Então, se ele apontou para alguma coisa?
>> ALUNO: Sim, exatamente, se ele ainda tinha um endereço de memória.
>> JASON HIRSCHHORN: Então você quer para verificar o valor do PTR?
>> ALUNO: Sim, exatamente.
>> JASON HIRSCHHORN: O que eu escrevo aqui se eu quiser verificar o valor do
ponto - o que é, na Jordânia Dito isto, o valor?
Ou o que é armazenado dentro do PTR?
>> ESTUDANTE: Um endereço de memória.
>> JASON HIRSCHHORN: Um endereço de memória.
Então, se eu escrevo apenas isso, ele vai dá-me o valor de ptr.
E como faço para imprimir um endereço de memória?
Qual é a string de formato para um endereço de memória?
>> ALUNO:% p.
>> JASON HIRSCHHORN:% p.
% S é uma string.
% P para ponteiro.
É isso mesmo?
Isso é certo.
Então ptr é igual -
ainda tem algo no mesmo.
Este é provavelmente um maior pergunta interessante.
O que é que essa linha faz?
>> ALUNO: Seg falhas.
>> JASON HIRSCHHORN: O quê?
>> ALUNO: Eu acho que SEG falhas.
>> JASON HIRSCHHORN: Hm?
>> ALUNO: Eu acho que vai SEG culpa.
>> JASON HIRSCHHORN: Então esta linha de código, estrela ptr, o que
que a estrela significa?
>> ESTUDANTE: Conteúdo.
>> JASON HIRSCHHORN: Yeah.
Vá para obter o conteúdo de.
Portanto, este está indo para ir para a memória dirigir lá e me dar isso.
Eu costumava% c certo aqui, porque há são personagens armazenados lá.
Então, nós estamos indo para ir para que endereço acabei de ver - ou ele provavelmente vai ser um
pouco presente diferente vez que executar o programa.
Mas vamos para esse endereço que sabemos que ainda existe
e ver o que está lá.
>> Então não SEG culpa.
Ele só não nos deu nada.
Ele poderia ter realmente nos deu alguma coisa, nós apenas não podemos vê-lo.
E isso vai voltar a essa idéia -
e nós não vamos conseguir muito em isso, porque isso é para além da
escopo deste curso.
Mas falamos aqui, se nós foi além dos limites da matriz por
1, podemos não ficar em apuros.
>> Às vezes, quando você acabou de sair por 1, você está fazendo algo errado, e você
poderia ficar em apuros.
Mas nem sempre você terá problemas.
Depende de quanto de uma coisa ruim você não, você vai ficar em apuros.
O que não quer dizer, ser desleixado com o seu código.
Mas é para dizer que o programa não sempre desistir, mesmo se você ir a algum lugar
você não deveria ir.
>> Um bom exemplo do que é, um monte de pessoas em seu conjunto de problemas 3, que
tinha 15 anos, não se verifique a limites da placa.
Então você olhou para a esquerda, olhou para o direita, olhou para cima, olhou
para a parte inferior.
Mas você não verificar para ver se o topo foi realmente vai ser na placa.
E um monte de pessoas que fizeram isso e virou-se que em, seu programa funcionou
perfeitamente, porque sempre que este era armazenados na memória, se você fosse um
acima, ou verificado que a memória endereço, não havia nada
particularmente horrível sobre isso, para que o seu programa não era
vai gritar com você.
>> Mas ainda iria decolar pontos se você não verificar isso, porque você
estavam fazendo algo que você não estava deveria fazer, e você poderia ter
ficado em apuros.
As probabilidades são, no entanto, você provavelmente não o fez.
Então, isso é para mostrar que, sim, ainda podemos ir a ele.
E nós não vamos a problema neste caso.
Se tentássemos fazer ler a próximos 100 caracteres, teríamos
provavelmente terá problemas.
E você pode codificar a ler o próximo 100 caracteres, se você quiser, fazendo algumas
espécie de loop for.
É.
>> ALUNO: Desde que foram atribuídos que espaço um valor real, não teríamos
realmente ser capaz de ver nada.
Devemos tentar com a criação que igual a gostar c ou algo assim?
>> JASON HIRSCHHORN: Ótima pergunta.
Como faço para configurar esse valor -
que linha de código que eu escrevo na linha sete para fazer o que você disse?
>> ALUNO: Estrela ptr iguala único Citação c acabar aspas simples.
>> JASON HIRSCHHORN: Para que está colocando um personagem, c, naquele local,
porque mais uma vez, que a estrela significa ir para lá.
E quando usado do lado esquerdo do um operador de atribuição, que é igual a
assinar, nós não vamos conseguir que valor tanto como definido esse valor.
Agora vamos ver o que acontece.
>> Nós colocamos algo lá e foi lá.
Chamamos livre.
Algumas coisas provavelmente aconteceu na pilha.
Portanto, não é mais lá.
Mas, novamente, não estamos recebendo em apuros para ir lá.
>> Estou fazendo isso em código para ilustrar que muitos destes
perguntas que você tem, eles são realmente interessante
responde a um monte de tempo.
E eles estão realmente boas perguntas.
E você pode entendê-los em seu próprio, se, por exemplo,
não estamos na seção.
É.
>> ALUNO: Porque você não está enviando o ponteiro em qualquer lugar, você precisa de
usar malloc?
>> JASON HIRSCHHORN: Então, isso vai voltar à sua pergunta inicial.
[? ?]
É apenas uma variável local?
Malloc aqui não é que convincente.
O uso de malloc aqui não é que convincente porque é
apenas uma variável local.
>> ALUNO: Então você poderia fazer de char estrela ptr é igual Olá?
>> JASON HIRSCHHORN: Ah.
Então, vamos agora voltar à sua pergunta inicial.
Eu acho que você não estavam satisfeitos com a minha resposta.
OK?
Assim?
>> ESTUDANTE: Yeah.
Espere.
>> JASON HIRSCHHORN: E onde que você quer imprimir?
Então, vamos imprimir uma string assim?
>> ESTUDANTE: Interessante.
>> JASON HIRSCHHORN: Então, isso diz que esta argumento tem o tipo de caráter.
Portanto, este deve ser um personagem.
>> ALUNO: só tem o primeiro.
>> JASON HIRSCHHORN: Então isso é o que eu disse antes.
Como eu disse, ele não está armazenando o corda dentro ponteiro variável.
É o armazenamento -
>> ALUNO: O primeiro valor da cadeia.
>> JASON HIRSCHHORN: O endereço de o primeiro valor da seqüência.
Se tivéssemos que imprimir isso, estamos ficando o valor dentro do ponteiro.
E vamos ver que é, de fato, um endereço de memória.
>> Será que isso faz sentido?
Desculpe.
Espere, isso responde a sua questão, embora?
>> ESTUDANTE: Yeah.
>> JASON HIRSCHHORN: Esta linha de código é criando uma string e depois outro
ponteiro variável que está apontando para essa seqüência, essa matriz.
É.
>> Estudante: Então, se nós fomos uma memória aprofundar, se chegarmos a horas?
Tem sido armazenado como uma string?
>> JASON HIRSCHHORN: Como, nós fizemos -
por isso este é valioso para fazer.
Este é o ponto de aritmética, que vocês tenha visto antes e deve ser
relativamente confortável.
Isto é semelhante a escrever -
se fôssemos escrever esta linha de código, temos visto a notação de matriz antes.
Isso deveria nos dar a segunda valor neste array, h.
>> Se fizéssemos isso, isso também deve dar nós o segundo valor do array.
Porque ele não vai para a memória endereço do primeiro lugar, mas o
endereço de memória da coisa que se acabou.
E então os dereferences operador estrela esse ponteiro.
E mais uma vez, vamos ver.
Recebemos h novamente.
>> ALUNO: O que exatamente faz dereference significa?
>> JASON HIRSCHHORN: Dereference é uma palavra chique para ir.
Ir para isso e obter o que está lá é para excluir a referência de um ponteiro.
É apenas uma palavra chique para isso.
>> ALUNO: Se quiséssemos impressão a corda toda, poderíamos
fazer ponteiro e comercial?
>> JASON HIRSCHHORN: OK, estamos vai fazer uma pausa aqui.
Vamos terminar aqui.
Ampersand dá-lhe o endereço de um localização, por isso, quando você faz comercial de
uma variável, que lhe dá o endereço onde a variável está armazenada.
Ponteiro Ampersand lhe dará a endereço de onde ptr ptr está na memória.
>> Nós não estamos indo para ir em com este exemplo.
Você pode descobrir estes as coisas por conta própria.
Mas, novamente, isso pode até ser uma beirando pouco além do que você precisa saber para
o âmbito do presente intercalar -
ou este teste, melhor dizendo.
Desculpe.
>> Vamos seguir em frente, porque eu faria gostaria de fazer um problema de codificação
antes do tempo é para cima.
E nós estamos indo para codificar o que eu penso é a mais convincente delas
exemplos, atoi.
Portanto, esta foi uma pergunta sobre um quiz, há dois anos.
E eu tenho isso no conselho aqui.
>> Pessoas foram convidados para o teste -
eles receberam um pouco mais em tesxt a pergunta, mas eu eliminou o
texto, porque não era necessário para os nossos propósitos agora.
Foi apenas algumas fundo em que atoi fez.
Mas todos sabem e são muito familiarizado com atoi.
>> Sugiro que este código sobre uma folha de papel.
Sugiro também que você usar a estratégia que já sabemos
muito em nossa seção.
Primeiro, certifique-se de compreender atoi que está fazendo.
Faça um desenho ou chegar a algum imagem mental do que em sua cabeça.
Em seguida, escreva o pseudocódigo para isso.
No questionário, se tudo que você recebe é pseudocódigo, pelo menos você
colocar algo para baixo.
E, em seguida, mapear esse pseudocódigo para C. Se você tem um cheque em seu
pseudocódigo, como verificar se algo é 1, que mapeia para um caso
estado e assim por diante.
E, finalmente, o código do programa em C.
>> Então volte para atoi e levar cinco minutos para este código em uma folha de
papel, que é, provavelmente, sobre a quantidade de tempo que você levaria em uma
quiz para atoi código.
Cinco a 15 minutos, de cinco a 12, para cinco 10 minutos, é sobre a quantidade de
tempo que você gastaria neste pergunta no questionário.
Então, levar cinco minutos, por favor.
E se você tiver alguma dúvida, levantar sua mão e eu vou chegar perto.
>> [conversas paralelas]
>> JASON HIRSCHHORN: OK, então que foi de cinco minutos.
Essa foi, provavelmente, sobre a quantidade de tempo que você gastaria em que, em um teste,
talvez a baixa final da época.
Vamos recapitular um pouco.
Vamos começar a programar isso.
E se nós não temos todo o tempo, as respostas para este e este
questionário questão estão disponíveis, mais uma vez, Outono de 2011 é quando esta pergunta
apareceu no quiz.
>> E valeu a pena de oito pontos em seguida, o questionário.
Oito pontos é na parte alta da quantidade de pontos de algo vale a pena.
A maioria das perguntas estão na faixa de um a seis pontos.
Portanto, esta é uma mais desafiador pergunta, com certeza.
Alguém pode me fale?
>> Geralmente, o que vamos querer fazer com essa
funcionar atoi, logicamente?
O que queremos fazer?
Então vamos escrever alguns pseudocódigo.
>> ESTUDANTE: Converter caracteres em números inteiros.
>> JASON HIRSCHHORN: Converter caracteres em números inteiros.
OK.
Então, quantos personagens somos nós vai precisar para passar?
>> ALUNO: Todos eles.
>> ALUNO: Todos os personagens na seqüência.
>> Jason HIRSCHHORN: Todo o caracteres na string.
Então, se nós queria passar por todos os caractere em uma string, o que é uma coisa
em C vimos que tem permitido nós que passar por todos os
caractere em uma string?
>> ALUNOS: Um loop for.
>> JASON HIRSCHHORN: Um loop for.
Então, nós estamos indo para percorrer cada personagem em s.
>> Então, o que vamos querer fazer quando temos um personagem específico?
Digamos que está se passou a 90.
Ficamos com a 9.
É um personagem.
O que nós queremos fazer com que o personagem 9?
>> ALUNO: subtrair caráter 0?
>> ALUNO: Adicionar 0?
>> JASON HIRSCHHORN: Subtrair lo do caráter 0?
>> ESTUDANTE: Yeah.
>> JASON HIRSCHHORN: Por que você quer fazer isso?
>> Estudante: [inaudível]
valor.
Seu valor int.
>> JASON HIRSCHHORN: OK, então tomamos o caráter 9, subtrai-lo a partir de
caractere 0 para obter uma inteiro real 9.
Doce.
E como você sabe que o personagem 9 menos 0 personagem é 9?
O gráfico que você olhar?
>> ALUNO: Há nove logicamente lugares entre 9 e 0.
Ou você pode olhar para a tabela ASCII.
>> JASON HIRSCHHORN: tabela ASCII.
Mas sim, você está correto também.
Então subtraímos 0.
Portanto, agora temos o inteiro 9.
E o que nós queremos fazer com isso?
Se tivermos 90, é o primeiro número inteiro temos, o que queremos fazer?
>> ALUNO: Eu colocaria em um inteiro temporário matriz, em seguida, fazer a matemática para ele
mais tarde para fazê-lo em um fim.
>> JASON HIRSCHHORN: OK.
>> ALUNO: Você pode começar no final de a matriz e, em seguida, seguir em frente assim
que cada vez que você se move para a frente, você multiplicá-lo por 10.
>> JASON HIRSCHHORN: OK.
Isso soa como uma bonita idéia atraente.
Podemos começar no final de nossa matriz, e podemos usar strleng.
Podemos usar strleng aqui.
Vamos obter o comprimento da nossa string.
Começamos no final.
E + o primeiro, só levamos isso inteiro, e talvez nós criamos como um
nova variável inteira em cima onde estamos armazenando tudo.
Então, nós loop através de cada caractere em s de trás para a frente, subtraímos 0, e
então vamos levá-lo, e, dependendo da onde ele está, nós multiplicá-lo
por uma potência de 10.
Como o primeiro, o que é que vamos multiplicar o caractere mais à direita por?
>> ALUNO: 10 ao 0.
>> JASON HIRSCHHORN: 10 a 0.
O que queremos multiplicar o segundo mais à direita de caracteres por?
>> Estudante: [inaudível].
>> JASON HIRSCHHORN: O quê?
>> ALUNO: 10 para a 1.
>> Jason HIRSCHHORN: 10 para o 1.
O personagem terço mais à direita?
>> ALUNO: 10 para a 2.
>> Jason HIRSCHHORN: 10 para o 2.
>> ESTUDANTE: Desculpe, eu não entendo o que estamos fazendo aqui.
>> JASON HIRSCHHORN: OK, Vamos voltar, então.
Então, nós estamos indo para obter aprovada em uma string.
Porque estamos escrevendo atoi.
Por isso, são passadas em uma string.
Digamos que está se passou na seqüência de 90.
>> A primeira coisa que vamos fazer é definir uma nova variável inteiro que nós somos
só vai criar como o nosso novo inteiro.
Isso é o que vamos para retornar no final.
Precisamos passar por todos os personagens a corda porque temos determinado
que precisamos para tocar cada um e em seguida, adicioná-lo ao nosso novo inteiro.
>> Mas não podemos simplesmente adicioná-lo como um número.
Não podemos simplesmente pegar e 9 adicionar 9 ao nosso inteiro.
Depende de que lugar é na cadeia.
Nós vamos precisar de multiplicar ele por uma potência de 10.
Porque é assim que 10 obras de base.
>> Então, nós estamos indo para obter o real personagem, ou o número inteiro real
número, por caractere 0 subtraindo de caráter 9 como fizemos com
subtraindo capital caráter A partir de tudo o que personagem que tinha em um dos
esses problemas.
Então, vamos realmente ter um número de 0 a 9 salvo como um número real, e nós vamos
multiplicá-lo por uma potência de 10, dependendo de onde estamos na corda.
E então nós vamos adicioná-lo de volta em nossa nova variável inteira.
>> Então, o que seria algo como faria ser - vamos chamar aqui.
Se conseguir passar na seqüência de 90 -
>> Estudante: [inaudível].
>> JASON HIRSCHHORN: Mas atoi recebe uma string.
Então vamos passar por da exploração.
Vamos ter passado em 90.
Nós vamos na parte de trás para a frente.
Tomamos a 0.
>> ALUNO: Eu sinto muito.
Talvez isso é estúpido.
Se estamos a ser aprovada em uma corda, por que é de 90 o que estamos
se passou em?
Porque 90 é um inteiro.
>> JASON HIRSCHHORN: Porque atoi leva um string e transforma-lo em o inteiro
representação dessa string.
Mas a corda 90 não é o número inteiro 90 ou o número 90.
A seqüência de 90 é um conjunto de dois ou três personagens, ao invés, a 9
caráter, o personagem 0, e a barra invertida 0 personagem.
>> E nós estamos escrevendo atoi porque, por exemplo, quando você toma o comando
argumento de linha, e é guardada em argv, é guardada como uma string.
Mas se você quer tratá-lo como um número, você precisa convertê-lo em um
inteiro real.
Que fizemos um dos nossos conjuntos de problemas.
Que fizemos em um número dos nossos conjuntos de problemas.
Todo mundo que teve um número inteiro como um argumento de linha de comando.
É por isso que a nossa função atoi recebe uma string.
>> Então, novamente, no nosso exemplo aqui, estamos vai tomar o último.
Nós estamos indo para subtrair o caráter 0 dele, porque os personagens 0
subtraído pelo personagem 0 dá-lhe o número real de 0, de acordo com a
a matemática ASCII que fazemos.
>> Como os caracteres são representados como diferente do que o seu real - o
caráter de um, por exemplo, minúsculas é um 97.
Não é - oops!
Não é o que você esperaria que seja, 0, por exemplo.
Então você tem que subtrair o caráter de um para chegar a 0.
>> Então, vamos fazer isso aqui para obter o número real.
E então nós estamos indo para multiplicá-lo por uma potência de 10, dependendo de onde ele
é na cadeia, e depois tomar esse e adicioná-lo ao nosso espaço reservado
variável, para que possamos chegar a nosso inteiro novo final.
Será que faz sentido para todos?
>> Então, nós não estamos indo para este código agora, porque estamos
ficando em curto tempo.
Peço desculpas pelo tempo do que isso.
Mas isso é o que, esperamos, você faria ser capaz de fazer no questionário - no
muito menos, obter este pseudocódigo escrito.
>> E então, se fôssemos escrever o pseudocódigo, na verdade, poderíamos fazer isso
muito rapidamente.
Cada linha de comentários que nós escrevemos aqui se traduz em cerca de
uma linha de código C.
Declarando uma variável nova, escrita um loop, alguns subtração, alguns
multiplicação, e alguns atribuição.
Nós provavelmente também querem escrever uma linha de retorno.
Também pode querer colocar algumas verificações aqui.
É.
>> ALUNO: Então podemos tratar s como a seqüência real?
Porque eu sei que é apenas um endereço.
Como, como você obter o comprimento de a corda que está sendo passado através de?
>> JASON HIRSCHHORN: Então, como é que o comprimento de uma corda?
Strlen.
>> ALUNO: strlen, sim.
Mas você pode colocar s como o argumento para isso?
>> JASON HIRSCHHORN: Então strlen leva uma estrela de char.
E segue-se que a estrela char, e mantém a contagem até que se chega a um
barra invertida 0. strlen era realmente um dos outros programas que
iam código.
Essa é outra boa para código.
Esse é um pouco mais fácil, porque se você vai pensar sobre isso
conceitualmente -
Eu apenas disse em voz alta - strlen segue um ponteiro e continua indo e
contar e manter o controle até chegar a uma barra invertida 0.
>> ALUNO: OK, entendi.
>> JASON HIRSCHHORN: Então, o melhor de sorte no teste 0 amanhã.
Se você tiver alguma dúvida, eu vou estar fora após esta.
Sinta-se livre para me e-mail.
Estenda a mão para seu próprio TF se você é não em minha seção, ou buscar o meu
enviar e-mail, se você quiser.
>> Se você quer surtar e basta enviar me um e-mail, um e-mail freakout, eu vou
mandar de volta, assim como, um rosto sorridente, ou, tipo, uma piada ou algo assim.
Então, fique à vontade para fazer isso também.
Boa sorte mais uma vez, e eu vou ver todos vocês na próxima semana.