>> [MÚSICA DE JOGO]
DAVID J. MALAN: Tudo bem.
Este é CS50, e esta é o final da quarta semana.
E um dos temas hoje é a de forense digital,
técnica de recuperar a informação.
E, de fato, muito embora você está no meio
agora da Paz em Três e Breakout, na próxima semana,
o foco será em precisamente neste domínio.
>> Então, um dos trabalhos mais legais que eu já teve foi em pós-graduação,
quando eu estava trabalhando para o local, Middlesex County District Attorney
escritório, fazendo forense trabalhar.
Então, basicamente, o Massachusetts Polícia do Estado, na ocasião,
quando se trabalha em casos seria trazer coisas como discos rígidos
e disquetes e cartões de memória e similares.
E eles iriam entregá-los para mim e meu mentor,
e nosso objetivo era encontrar provas, se havia algum, nestes meios.
Vislumbres Agora, você pode ter visto deste mundo da ciência forense
na mídia, TV e cinema.
Mas o trabalho que eu tinha, e ouso dizer que o mundo,
não é bem assim que você vê-lo.
Vamos dar uma olhada no que você provavelmente já viu.
[REPRODUÇÃO]
-OK.
Agora, vamos dar uma boa olhada em você.
>> [MÚSICA DE JOGO]
>> -Segure Ele.
Correr de volta.
>> Espere um minuto.
Vá para a direita.
-Há.
Congelar isso.
Tela -Full.
>> -OK.
Congelar isso.
-Tighten-Se sobre isso, você vai?
>> -vector Em em que cara pela roda traseira.
>> -zoom Em direito aqui neste local.
>> -Com O equipamento certo, o imagem pode ser ampliada e afiada.
>> -Qual Que é isso?
>> -É Um programa de melhoramento.
>> -Consegue Claro que se for o caso?
>> Năo sei.
Vamos melhorá-lo.
>> -Aprimore Seção A6.
Eu aumentei o detalhe, e--
-Acho Há o suficiente para melhorar.
Liberá-lo para a tela do computador.
>> -I Reforçada a reflexão em seus olhos.
-Vamos Executar este meio aprimoramento de vídeo.
>> -Edgar, Você pode melhorar isso?
>> -hang Em.
>> -Eu Vindo a trabalhar sobre esta reflexão.
>> Reflexo de alguém -Há.
>> -Reflection.
-Há Um reflexo do rosto do homem.
>> Reflexão -The!
-Há Uma reflexão.
-zoom Em no espelho.
Você pode ver um reflexo.
>> Você-pode melhorar a imagem a partir daqui?
Você-pode melhorá-lo?
-Podemos Melhorar isso?
Você-pode melhorá-lo?
-Segure Um segundo.
Eu vou melhorar.
-zoom Em na porta.
-Times 10.
-Zoom.
-Mover Em.
-Mais.
Espere, pare.
Pare.
-PAUSE Ele.
-Rotate Nos 75 graus em torno da vertical, por favor.
>> Pare.
Volte para a parte sobre a porta novamente.
>> -Tem Um intensificador de imagem que pode bitmap?
>> -Talvez Podemos usar o Pradeep Singh método para ver nas janelas.
>> -The Software é o estado da arte.
>> -The Autovalor está desligado.
>> -Com Direita combinação de algorithms--
>> Iluminação tomadas -Ele algoritmos para o próximo nível,
e eu posso usá-los para melhorar esta fotografia.
>> -lock On e ampliar o eixo z.
>> -Aprimore.
Aprimorar.
-Aprimore.
-Freeze E melhorar.
[FIM REPRODUÇÃO DE VÍDEO]
DAVID J. MALAN: Então, essas são todas as palavras, mas não eram
usado em frases corretamente.
E, de fato, no futuro, a qualquer hora, por favor, você ouve alguém dizer a palavra,
"Melhorar", rir um pouco.
Porque quando você tenta melhorar, por exemplo, isso é o que acontece.
>> Então aqui vai uma foto linda.
Isto é próprio Daven de CS50.
E suponha que queríamos focar na brilho nos olhos,
ou a reflexão do bandido que estava claramente
capturada pela câmera de segurança.
Isto é o que acontece quando você aumentar o zoom em uma imagem que
tem apenas um número finito de bits associados.
>> Isso é o que você iria ficar.
E, de fato, está no olho do Daven é, mas quatro, talvez seis pixels
que compõem exatamente o que foi brilhando lá.
Então Problem Set Quatro acabará por ter você explorar este mundo, especialmente
pela natureza de algo que chamamos de arquivo I / O, onde
i / o é apenas uma maneira elegante de dizendo entrada e saída.
>> Então, até agora, todas as interações que tivemos com um computador
ter sido em grande parte com o seu teclado e ecrã,
mas não tanto com o disco rígido, ou gravar os ficheiros para além dos que você
você mesmo escrever.
Seus programas, até agora, tem não vindo a criar e salvar,
e atualização de seus próprios arquivos.
>> Bem, o que é um arquivo?
Bem, algo como um JPEG.
Esta é uma imagem que você pode ter ou fazer upload para o Facebook,
ou ver em qualquer lugar na web.
Na verdade, essa foto que acabamos de serra de Daven foi um JPEG.
E o que é interessante sobre arquivos como JPEGs
é que eles podem ser identificados, tipicamente, por certos padrões de bits.
>> Em outras palavras, o que é que distingue um JPEG a partir de um GIF
a partir de um PING a partir de uma palavra documento a partir de um arquivo do Excel?
Bem, é apenas diferente padrões de bits.
E esses padrões diferentes são geralmente no início desses ficheiros.
>> De modo que quando o computador abre uma Palavra doc, ou quando um computador abre um JPEG,
parece tipicamente na primeiro de vários bits no arquivo.
E se reconhece um padrão, ele diz, oh, esta é uma imagem.
Deixe-me apresentá-lo ao o usuário como um gráfico.
Ou, oh, isso se parece com um documento do Word.
Deixe-me mostrar para o usuário como um ensaio.
>> Assim, por exemplo, JPEGs, ao que parece, são
bastante sofisticado debaixo do capô.
Mas os três primeiros bytes em quase todas as JPEG começar com estes três números.
Assim byte zero, um, dois e são, em mais cada JPEG, 255, então o número
216, em seguida, o número 255.
>> E o que você vai ser capaz para começar a fazer na próxima semana
é, na verdade, cutucando por baixo a capa de arquivos como JPEGs
e como arquivos de bitmap, e vendo o que sempre esteve lá por tanto tempo
como você está usando um computador.
>> Mas o que está lá não é tipicamente escrito como números decimais como este.
Os cientistas da computação não tendem a falar em decimal.
Eles realmente não falam em binário.
Normalmente, quando queremos para expressar números,
nós realmente usar hexadecimal, que você pode recordar
de, digamos, Conjunto de Problemas Um deles, que desafiou
você pensar em um sistema diferente.
>> Nós, é claro, estão familiarizados com decimal, de zero a nove.
Nós conversamos sobre binário.
E nós realmente não têm usar muito aqui
em diante, porque os computadores irão usar isso.
Mas os programadores vão muito muitas vezes, mas não sempre,
usar hexadecimal, o que significa apenas você tem 16 letras no alfabeto,
em oposição a duas ou 10.
>> Então, como você contar até maior de nove em hexadecimal?
Você vai 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, apenas por convenção.
Mas o que é fundamental é que cada destes é um único símbolo.
Não há 10.
Não existe 11, por si só, porque cada de seus dígitos, assim como em decimal
e, assim como no sistema binário, deve apenas ser um personagem único, por convenção.
>> Para que, então, é o alfabeto que temos à nossa disposição para hexadecimal.
Então, o que um JPEG olhar como se você eram para escrever os três primeiros
não bytes como decimal, mas, por exemplo, como hexadecimal?
E por que é hex mesmo tão útil?
>> Bem, uma rápida olhada em um exemplo.
Então, se eu escrever os bits que representam estes Números de decimal
isso pode ser um pouco enferrujado agora de algumas semanas atrás,
mas o esquerdo e o um direito é muito fácil.
255 foi o maior que o número poderia representar com oito bits.
Era todos os queridos.
Então, a única que é ligeiramente interessante é o do meio.
E se você tipo de fazer a matemática, você vai deduzir que, de fato,
esse padrão de um e zeros representa 216.
Então vamos estipular para agora que estes estão corretos.
Mas por que isso é interessante?
>> Bem, um byte, é claro, é de oito bits.
E verifica-se que se você pensar de um byte de dois blocos de quatro bits,
assim.
Deixe-me apenas acrescentar um pouco de espaço.
Então, antes, depois.
Eu acabei de adicionar algum espaço em branco pelo amor de visualização aqui.
Como podemos agora representar em, digamos, hexadecimal cada quad de bits,
cada conjunto de quatro bits?
>> Assim, por exemplo, no lado esquerdo agora, temos 1111 em binário.
Qual é esse número em decimal, se você fizer a matemática?
Você tem a casa das unidades, o local dois, o lugar de quatro, eo lugar oitos.
>> AUDIÊNCIA: 15.
DAVID J. MALAN: É 15.
Então, se fizermos oito mais quatro mais dois mais um, temos 15.
Então, eu poderia escrever 15 abaixo 1111, mas o ponto aqui
é hexadecimal, não decimal.
Então, ao invés de escrever 15, 1-5, Eu vou escrever isso em hexadecimal,
que se você olhar para trás, se você tiver zero a f, o que é 15 vai ser?
AUDIÊNCIA: f.
DAVID J. MALAN: Então não é que a sua f.
E você pode resolver isso, dizendo: assim, se um é 10, então OK, f é 15.
Então, na verdade, poderíamos reescrever este mesmo conjunto de números como f f.
E então, se fizermos um pouco de matemática, vamos deduzir que isso é d.
Oito é muito fácil, porque nós ter um no lugar oitos.
E então, temos um casal mais f f do.
>> Então, o que os seres humanos tendem a fazer por convenção quando usam hexadecimal é que eles simplesmente
escrever este um pouco mais sucinta, se livrar da maior parte desse espaço em branco.
E só para ser super claro para leitores que este é hexadecimal,
a simples convenção entre seres humanos é você escrever de zero
x, que não tem outro significado do que um identificador visual,
aqui vem um número hexadecimal.
>> E então, você coloca os dois dígitos, f f neste caso, em seguida, d a, então f f.
Então, longa história curta, hexadecimal só tende
para ser útil porque cada um dos seus dígitos, de zero a f, perfeitamente linhas
acima com um padrão de quatro bits.
>> Então, se você tem dois dígitos hexadecimais, zero a F, uma e outra vez,
que lhe dá perfeitamente oito bits ou um byte.
Então é por isso que tende a convencionalmente ser útil.
Não há intelectual conteúdo muito além disso,
diferente da sua real utilidade.
>> Agora JPEGs não são a única formatos de arquivo para gráficos.
Você deve se lembrar que existem arquivos como este no mundo,
pelo menos a partir de alguns anos atrás.
>> Portanto, este foi realmente instalado no Windows XP
em milhões de PCs em todo o mundo.
E este era um arquivo bitmap, BMP.
E um arquivo de bitmap, como você verá no próximo semana, apenas significa um padrão de pontos,
pixels, como são chamados, Um mapa em pedaços, na verdade.
>> Então, o que é interessante, porém, sobre o formato de arquivo, BMP, é
que debaixo do capô, ele tem mais do que apenas três bytes
que compor seu cabeçalho, assim dizer, as primeiras mordidas.
Ele realmente parece um pouco complicado à primeira vista.
E você vai ver isso no conjunto P.
E recebendo algo especial deste agora
não é tão importante, como apenas o facto que, no início de cada bitmap
arquivo, um formato gráfico, há um monte de números.
>> Agora, a Microsoft, a autor deste formato,
tende a chamar aqueles As coisas não inteiros e caracteres
e carros alegóricos, mas palavras e d palavras e anseia e bytes.
Então, eles são apenas diferentes tipos de dados.
Eles são nomes diferentes para a mesma coisa.
Mas você vai ver que em P Set Four.
>> Mas isso é só para dizer que se um ser humano clica duas vezes em algum arquivo bmp em seu
ou seu disco rígido, e uma janela se abre up mostrando-lhe que a imagem,
isso aconteceu porque a operação sistema presumivelmente notado não só
a extensão do arquivo bmp no nome do arquivo,
mas também o fato de que há alguns convenção para o padrão de bits
no início desse arquivo bitmap.
>> Mas vamos agora concentrar-se em um arquivo complicado tal,
mas em algo como isso.
Suponha que aqui em GEdit, I só tem o começo
de um programa que é muito simples.
Eu tenho algumas inclui em cima.
Agora eu tenho "structs.h" # include mas Eu vou voltar a isso em um momento.
Mas isto é útil para agora.
Portanto, este é um programa que vai implementar
como banco de dados do registrador.
Assim, um banco de dados de alunos, e cada aluno no mundo
tem um nome e uma casa e, provavelmente, alguns outras coisas, mas vamos mantê-lo simples.
Cada estudante tem um nome e uma casa.
>> Então, se eu queria escrever um programa cujo objetivo na vida
foi apenas para fazer uma iteração do zerar em até três,
se há três estudantes na Universidade de Harvard.
E eu só quero pegar, usando GetString, O nome de cada aluno e da casa,
e depois é só imprimir os para fora.
>> Esta é uma espécie de Semana One, Two Week coisas agora,
onde eu só quero uma para loop ou algo parecido.
E eu quero chamar GetString alguns vezes, e em seguida, imprimir f algumas vezes.
Então, como eu poderia fazer isso, porém, quando um nome e uma casa
estão envolvidos para cada aluno?
>> Então, meu primeiro instinto pode ser para fazer algo assim.
Eu poderia dizer em primeiro lugar, bem, dê-me, dizer, uma matriz de strings chamados nomes.
E eu não quero um hardcode três aqui.
O que eu quero colocar lá?
Para que os alunos, porque isso é apenas uma constante declarado na parte superior,
apenas para que eu não tenho que codificar três em vários lugares.
Desta forma, eu posso mudá-lo um lugar, e isso afeta uma mudança em todos os lugares.
E então, eu poderia fazer cadeia abriga alunos.
>> E agora, eu poderia fazer algo assim for (int i = 0; i <ESTUDANTES; i ++.
Então, eu estou escrevendo rápido, mas isso é provavelmente familiar sintaxe agora.
>> E agora, este foi mais recente.
Se eu quiser colocar no i-th nome do aluno, eu acho que eu faço isso.
E então, não os nomes mas casas adaptador.
Eu faço isso, GetString, e deixar me voltar atrás e corrigir esta linha.
Concordar?
Discorda?
Não é muito fácil de usar.
Eu não disse que o usuário o que fazer.
>> Mas agora, se eu também queria mais tarde, vamos
digamos, imprimir essas coisas out-- assim TODO posterior.
Vou fazer mais com isso-- este sem dúvida é
uma correcta execução recebendo nomes e casas, três
do total de cada um deles, a partir de um utilizador.
>> Mas isso não é muito bom design, certo?
E se um aluno não tem apenas um nome e uma casa, mas também um número de identificação,
e um número de telefone, e um endereço de e-mail,
e talvez um home page, e talvez uma alça Twitter,
e qualquer número de outros detalhes associado com um aluno ou uma pessoa,
de modo mais geral.
Como é que nós começamos a adicionar funcionalidade para este programa?
>> Bem, eu sinto que a maneira mais simples pode ser para fazer algo assim, digamos,
int id alunos.
Portanto, posso colocar todos os seus IDs lá.
E, em seguida, para algo como números de telefone,
Eu não sei como representa que apenas ainda.
Então, vamos em frente e apenas chamada este twitters alunos, o que
É um pouco estranho, mas-- e mais um monte campos.
>> Eu comecei a efetivamente copiar e colar aqui.
E isso vai crescer muito pesado muito rapidamente, certo?
Não seria bom se houvesse em todo o mundo uma estrutura de dados conhecida
não como um int ou uma corda, mas algo nível superior, uma abstração, de modo
dizer, conhecido como um aluno?
C não veio com built-in funcionalidade para os estudantes,
mas e se eu queria dar-lhe tal?
>> Bem, ao que parece, eu vou abrir um arquivo chamado structs.h aqui,
e você pode fazer exatamente isso.
E vamos começar a fazer isso agora.
E debaixo do capô de P Conjunto Três, você já venho fazendo isso agora.
Não existe tal coisa como um g ret ou um g oval na linguagem de programação C.
>> Pessoal da Stanford implementado aqueles tipos de dados usando esta abordagem aqui,
declarando sua própria novos dados tipos usando uma nova palavra-chave
chamada estrutura e outra um chamado typedef.
E, de facto, embora a sintaxe parece um pouco diferente a partir de material
que já vimos antes, em princípio, é super simples.
>> Isto significa apenas "definir um tipo."
Isso vai ser um estrutura, e uma estrutura
é como um recipiente para várias coisas.
E essa estrutura vai para ter uma seqüência chamada nome,
e uma série chamada casa.
E vamos chamar, apenas por conveniência, esta estrutura de dados inteira estudante.
>> Assim, no momento que você começa a o ponto e vírgula, você tem agora
criou seu próprio dados tipo chamado estudante
que agora está ao lado de int, e float e char, e corda,
e g rect, e g oval, e qualquer número de outras coisas que as pessoas inventaram.
>> Então, o que é útil sobre esta agora é que se eu voltar
para a estrutura 0 e terminar esta implementação, o que eu escrevi
com antecedência aqui, notar que todos da desordem inevitável que
estava prestes a começar a acontecer como eu adicionei números de telefone e twitters e tudo
essas outras coisas para definição de um aluno,
agora está envolto sucintamente up apenas como um conjunto de alunos.
>> E cada um desses estudantes agora tem várias coisas dentro dela.
Assim que deixa apenas uma pergunta.
Como você começa no nome, ea casa, eo ID,
e tudo aquilo que é dentro do aluno?
Super simples, também.
Nova sintaxe, mas uma idéia simples.
>> Você simplesmente índice para a matriz, como fizemos na semana passada e esta.
E o que é claramente o nova peça de sintaxe?
Just., Que significa "ir para dentro do estrutura e se o campo chamado
nome, obter o campo chamado casa, obter o campo chamado de estudante. "
>> Então, em P Conjunto Três, se você estiver ainda trabalhando nisso,
ea maioria das pessoas ainda são, percebo que, como você
começar a usar coisas como rects G e G ovais
e outras coisas que não parecem vêm de Semana Zero, um, ou dois,
perceber que isso é porque Stanford declarou alguns novos tipos de dados.
>> E, de fato, isso é exatamente o que vamos fazer, assim, em P Set Four, quando
começamos a lidar com as coisas como imagens, bitmaps, e muito mais.
Então, isso é apenas um teaser e um modelo mental para o que está por vir.
Agora, eu procrastinado um pouco esta manhã.
Eu era uma espécie de curiosidade para ver o que o papel de parede Microsoft realmente
parece hoje.
E acontece que alguém em 2006 realmente foi para quase precisamente
o mesmo local para fotografar na realidade o que parece que nos dias de hoje.
O campo está agora coberto um pouco.
>> Então, falando agora de imagens, Vamos trazer de volta Daven aqui
na tela e Nicholas, e apenas lembrá-lo
que se você quiser se juntar a nós para o almoço nesta sexta-feira, de cabeça para o nosso URL habitual
Aqui.
>> Então, de onde paramos na segunda-feira?
Nós introduzimos este problema, certo?
Esta foi aparentemente a correta implementação de swap,
em que você tomar dois inteiros, um chamado, um chamado b,
trocá-los, assim como Laura fez aqui no palco com o leite ea água,
usando um temporária variável, ou um copo vazio,
para que pudéssemos colocar em um b e um em b sem fazer uma bagunça de coisas.
Nós usamos uma variável.
É chamado de temperatura.
>> Mas o que era fundamental problema com este código na segunda-feira?
Qual foi o problema aqui?
Sim.
>> AUDIÊNCIA: É preciso mais espaço.
>> DAVID J. MALAN: Leva-se mais espaço, porque eu estou usando uma variável,
e isso é OK.
Isso é verdade, mas eu sou vai dizer que está tudo bem.
É apenas 32 bits na grande esquema das coisas, então não é um grande negócio.
Outros pensamentos?
AUDIÊNCIA: só troca as variáveis ​​localmente.
DAVID J. MALAN: Exatamente.
É apenas troca os variáveis ​​localmente.
Porque sempre que você chamar um function-- quando eu tinha as bandejas a partir Annenberg
última vez, você tem principal na parte inferior.
Assim que você chamar uma função chamada swap, swap de não obter x e y,
os valores originais.
O que faz troca get, que nós reivindicamos?
Audiência: Cópias.
DAVID J. MALAN: Então cópias deles.
Assim, torna-se um e dois, se você recordar o exemplo da última vez,
mas uma cópia de um e dois que são trocados com sucesso.
Mas, infelizmente, no final, esses valores ainda são os mesmos.
Assim, podemos ver isso com a nossa novo amigo, espero que GDB,
que você ou os TFs e Ca de ter foi guiando-o para a seguinte.
>> Portanto, não há recordação de swap parece como-- vamos abrir isso-- esta aparência.
Nós inicializado x para um y a dois.
Tinha um monte de impressão de f.
Mas, em seguida, a tecla de chamada aqui era para trocar, o que
é exatamente o que o código só vi um momento atrás.
O que é correto em primeiro vista, mas funcionalmente,
este programa não funciona, porque não trocar permanentemente x e y.
>> Então vamos ver isso, um ambiente aconchegante rápida aqui com GDB, um ./noswap.
Um monte de informações contundentes de que Vou me livrar de L com controle por enquanto.
E agora, eu vou vá em frente e execute-o.
E, infelizmente, que não era tão útil.
Ele executou o programa dentro deste programa chamado GDB, um depurador,
mas não deixe-me bisbilhotar.
>> Então, como eu posso realmente fazer uma pausa execução dentro deste programa?
Então quebrar.
E eu poderia quebrar em qualquer linha número, um, 10, 15.
Mas também posso quebrar simbolicamente dizendo quebra principal.
E que vai definir um intervalo ponto, aparentemente na linha 16 na principal.
E onde está a linha 16?
Vamos subir para o código e vão até noswap.
E, de fato, a linha 16 é o primeiro no programa.
>> Então, agora, se eu ir em frente e tipo executar este tempo, Enter, ele fez uma pausa.
Então, vamos bisbilhotar.
Imprimir x-- por que é x Zero?
E ignorar o sinal de dólar.
Isso é apenas para columbófilo utilização do programa.
Por que é x zero no momento?
Sim.
>> AUDIÊNCIA: Ele fez uma pausa antes de direita linha 16, não, na verdade, na linha 16.
DAVID J. MALAN: Exatamente.
GDB, por padrão, tem uma pausa execução um pouco antes da linha 16.
Por isso, não foi executado, o que significa que x é de algum valor desconhecido.
E nós temos sorte de que é algo limpo como zero.
Portanto, agora se eu digito seguinte, agora é executado 16.
Ele está esperando por mim para executar 17.
Deixe-me ir em frente e impressão x.
É uma.
Deixe-me ir em frente e impressão y.
O que eu deveria ver agora?
>> AUDIÊNCIA: [inaudível]
>> DAVID J. MALAN: Um pouco mais alto.
>> AUDIÊNCIA: [inaudível]
DAVID J. MALAN: Não é bem um consenso.
Então, sim, nós vemos algum valor de lixo.
Agora, y é 134514064 lá.
Bem, isso é só um valor de lixo.
Meu programa usa RAM para fins diferentes.
Há outras funções.
Outras pessoas escreveram no meu computador.
Então, os bits tenham sido utilizados para outros valores, eo que eu estou vendo
representa os restos de alguns uso prévio de que a memória.
>> Portanto, não é grande coisa, porque assim enquanto eu digito seguinte e, em seguida, imprimir y,
é inicializado para o valor que eu quero.
Então, agora, vamos em frente um pouco mais rápido.
N para o próximo.
Vamos fazer isso de novo.
Mas eu não quero bater lo aqui, porque se eu
quero ver o que está acontecendo dentro de swap, que é o comando?
>> AUDIÊNCIA: passos.
>> DAVID J. MALAN: passos.
Então isso me pisa em um função, em vez de por cima.
E agora, é um pouco enigmática honestamente, mas este é apenas
me dizendo que eu estou na linha 33 agora.
E vamos fazer isso de novo.
Temperatura de impressão.
Valor de lixo, negativo, desta vez, mas isso é só ainda um valor de lixo.
Então, vamos fazer a seguir, temp impressão.
Ele é inicializado a 1, o que foi o valor de x, aka a.
>> Agora, onde está o nosso A e X está vindo?
Bem, aviso no principal, que chamou esses valores x e y.
Em seguida, passou-os para trocar como se segue.
X veio primeiro, vírgula y.
E, em seguida, troca poderia chamá-los de x e y.
Mas, para clarificar, é chamando-a e b.
Mas a e b estão agora vai ser cópias de x e y, respectivamente.
>> Então, se eu voltar para o GDB, temp é agora um e é agora um.
Mas, se eu faço agora e agora fazer print um, um já foi movido mais.
O leite foi derramado em ex- copo de suco de laranja, ou vice-versa.
>> E se eu faço agora novamente, e agora se eu imprimir como uma verificação de sanidade,
é ainda um dois, mas é agora uma b.
Francamente, ele ainda está lá.
Eu não me importo o que é temporário.
Mas assim que eu agora escrever, digamos, continuar a voltar, agora estou no final
o programa.
E, infelizmente, x é ainda um e y é ainda dois.
>> Então, qual foi a utilidade do GDB lá?
Ele não me ajudar a corrigir o problema por si só,
mas espero que me ajude compreendê-lo através da realização
que sim, a minha lógica é certo, mas meu código não é, em última análise ter
um impacto permanente.
Então, isso é um problema que estamos vai agora resolver hoje.
>> Mas vamos chegar lá por meio deste.
String é uma mentira.
É, também, não é um tipo de dados que existe em C. É
sido um sinônimo para alguns tempo para outra coisa,
e que pode revelar que, como se segue.
>> Deixe-me ir em frente e abrir Um programa chamado comparar-0.
E ao invés de digitar essa modalidade, vamos começar a percorrer o código
Eu já escrevi, mas é apenas algumas linhas.
Portanto, este é comparar-0.
E a primeira coisa que eu estou fazendo está recebendo uma linha de texto.
>> Mas note o que eu sou fazendo para a primeira vez.
O que é diferente claramente sobre a linha 21?
Na verdade, espere um minuto.
Esta é cópia dois.
Isso não é nem mesmo o programa certo.
Tudo alerta direita, saqueador.
Tudo bem, então não importa.
Essa é a resposta a uma pergunta futuro.
>> Aqui é comparar-0, e eu sou prestes a receber uma linha de texto.
Programa de muito mais simples.
Então, isso é simples.
Isto é como Week One, Two Week coisas no momento. string s = GetString.
Agora, eu digo novamente aqui.
corda t = GetString.
E, em seguida, a última coisa neste programa, como o próprio nome sugere,
é que eu vou tentar compará-los.
>> Então, se s, a primeira corda, é igual a = t, então eu sou
vai dizer que você digite a mesma coisa.
Senão, eu vou dizer você digita coisas diferentes.
Então, vamos compilar e executar este programa.
Então faça comparar zero.
Parece bom.
Não há erros de compilação.
>> Deixe-me ir em frente agora e digite ./compare-0.
Deixe-me ir em frente e dizer alguma coisa : Daven e algo: Rob.
E eu escreva coisas diferentes.
Por enquanto, tudo bem.
Programa parece ser correto.
>> Mas vamos executá-lo novamente.
Diga alguma coisa: Gabe.
Tudo certo.
Talvez eu bater a barra de espaço ou algo funky.
Vamos fazer isso de novo.
Então Zamyla.
Zamyla.
Coisas diferentes.
Então, o que está acontecendo?
>> Portanto, temos estas duas linhas de código, GetString ser chamado duas vezes.
E então, eu sou simplesmente tentar comparar s e t.
Mas o que realmente está acontecendo, então?
Bem, sobre o meu manuscrito para açougueiro este exemplo um pouco.
E vamos realmente jogar isso aqui, também.
>> Portanto, temos uma linha como string s = GetString.
Então, isso é simplesmente o primeiro linha interessante desse programa.
Mas o que todo esse tempo tem sido acontecendo debaixo do capô?
Bem, sobre a mão esquerda lado é cadeia, que é algum tipo de variável,
e chama-se s.
Então, eu sei que isso é usando a memória, ou RAM, no meu computador de alguma forma.
Então eu vou abstratamente chamar isso como um quadrado.
32 bits, verifica-se, mas mais sobre isso no futuro.
E então, o que está acontecendo aqui?
>> Bem, obviamente GetString recebe uma string do usuário.
E tem GetString Zamyla ou Gabe ou Daven.
Então, vamos escolher a primeira daqueles, que foi Daven.
Então, efetivamente, o que GetString tem me nesse primeiro caso foi D-a-v-e-n.
E então, o que mais fez ele me dar secretamente?
AUDIÊNCIA: [inaudível]
DAVID J. MALAN: Sim, o / 0 ou nulo personagem.
Por isso, efetivamente me deu uma string.
Mas nós já sabemos a partir de anterior Parece que uma string é apenas uma matriz
de personagens, e é denunciado por este caráter especial sentinela, / 0.
>> Mas se isso é verdade e isto é um quadrado,
este é claramente um retângulo muito maior.
E, de fato, este é, Eu afirmo, apenas 32 bits.
E isto é claramente mais do que 32 bits, porque este é, provavelmente,
oito mais oito mais oito mais oito mais oito,
só por causa de bytes em ASCII.
Como o diabo é que vamos caber Daven nessa caixinha aqui?
>> Bem, o que está realmente fazendo GetString?
Bem, essa grade representa aqui memória do meu computador ou RAM.
Então vamos arbitrariamente dizer que se cada um deles representa um byte,
então podemos pensar em cada byte como tendo um endereço,
como 33 Oxford Street, ou 34 Oxford Street, ou 35 Oxford Street.
>> Assim como as casas têm endereços e os edifícios têm endereços,
assim como de bytes individuais memória têm endereços ou números
que identificá-las unicamente.
Agora, este é arbitrária.
Mas mantê-lo simples, eu vou usar hexadecimal apenas por convenção,
mas o 0x não significa outra coisa que "este é hexadecimal."
e eu vou afirmar que a "D" acaba em Byte One na memória.
>> Eu não tenho nada mais acontecendo no memória, assim Daven conseguiu o primeiro lugar
Um byte no.
Este, então, vai ser 0x2.
Isso vai 0x3.
Este vai ser 0x4.
Isso vai 0x5.
Este vai ser 0x6.
>> Mas uma vez que você começar a pensar sobre o que procede do computador
debaixo do capô, você pode começar a inferir
como você, há alguns anos, seria Implementamos C em si.
O que é provavelmente GetString returning-- porque
Parece que não é retornando Daven, por si só,
porque ele certamente não vai para caber neste pequeno box--
então o que é GetString provavelmente retornando?
>> AUDIÊNCIA: [inaudível]
>> DAVID J. MALAN: O local de Daven.
E ele vem fazendo isso desde Primeira Semana.
O que é realmente GetString retornando não é uma string, per se.
Essa é uma das mentirinhas.
É retornar o endereço do cadeia na memória, o endereço único.
Daven vive a 33 Oxford Street.
Mas de forma mais sucinta, Gavin vive em 0x1, Address Number One.
>> Então, o que é colocado neste pequena caixa, em seguida, para ser claro,
é apenas o endereço dessa string.
Então todo esse tempo, este vem acontecendo.
Mas o que isso sugere agora é que se todo s tem
é um número dentro do mesmo, que é para impedi-lo, o programador,
de colocar qualquer número em qualquer variável e apenas pulando
para que pedaço de memória?
E, de fato, vamos ver isso é uma ameaça próxima vez.
>> Mas, por enquanto, isso parece insuficiente.
Se eu disser, arranja-me um string, você me dar Daven.
Mas você realmente não me dar Daven.
Tudo o que você me dá é o endereço de Daven.
Como posso então saber ao certo Daven onde começa e ends--
a história está ficando weird-- Daven onde começa e termina,
e, em seguida, o próximo seqüência na memória começa?
>> Bem, se você está entregando me o início de Daven,
essencialmente, como eu sei onde o fim do seu nome é?
Esse personagem nulo especial, que é ainda mais importante agora
se cordas debaixo do capô são simplesmente identificados
exclusivamente pela sua localização na memória.
Então todo esse tempo, que é o que está acontecendo.
>> Assim, quando olhamos agora em o código aqui, explicar
se você faria o bug na linha 26.
Por que é Zamyla e Zamyla diferente?
Porque é que Gabe e Gabe diferente?
Sim, na parte de trás.
>> AUDIÊNCIA: Eles têm endereços diferentes.
>> DAVID J. MALAN: Simplesmente porque eles têm endereços diferentes.
Porque quando você chamar GetString novamente, o que eu vou fazer rapidamente aqui,
se esta é a segunda linha, cadeia t, como eu fiz nesse programa,
é igual a outra chamada para GetString.
A próxima vez que eu chamo GetString, eu vou
para obter um pedaço diferente de memória.
>> GetString é permitido pedir ao funcionamento
sistema para obter mais e mais memória.
Não vai reutilizar a mesma seis bytes cada vez.
Vai começar um novo pedaço de memória, o que
significa t vai ficar algum outro valor aqui.
>> Então, quando eu faço s é igual a = t, você não está comparando
D contra este e contra A este e V contra este.
Você está comparando este contra este, o qual
francamente é muito useless-- useful-- é inútil, porque quem realmente
importa onde as cordas estão na memória?
>> E, de fato, nós não temos.
E nós não vamos iniciar particularmente carinhoso.
Só na medida em que os erros podem surgir e as ameaças à segurança podem surgir vontade
nós realmente começar a se preocupar com isso.
Então vamos corrigir esse problema.
Acontece que, de corrigir-lo super simples.
>> E vamos de fato, antes de eu revelam que mais uma vez, o que seria
você faria se em uma classe CS50, e você teve que implementar
uma comparação com duas cordas.
Você claramente não pode apenas usar s é igual a = t.
Mas, logicamente, como Como você comparar esta cadeia
contra essa string usando o código C?
Sim.
>> AUDIÊNCIA: Basta fazer o loop [inaudível]
DAVID J. MALAN: Perfeito.
AUDIÊNCIA: [inaudível]
DAVID J. MALAN: Yeah.
Basta usar um loop ou um while ou o que quer.
Mas basta aplicar a idéia básica de que, se este é um pedaço de memória ou um array
e este é, iterar os dois ao mesmo tempo.
E basta comparar as letras.
>> E você tem de ser um pouco cuidado, porque você
Não quero um dedo para passar a outra
porque uma string é mais do que o outro.
Então você vai querer verificar para este valor especial no final, nulo.
Mas ele realmente é, na final, tão simples como isso.
E, francamente, nós não precisamos reinventar a roda.
Aqui é versão dois.
E o que eu vou dizer aqui é que em vez de comparar s é igual a = t,
Estou vez vai dizer, se a cadeia comparação de s vírgula t é igual a = 0.
Agora, o que é String de comparação?
>> Acontece, é uma função que vem com C, cujo propósito na vida
é comparar duas strings.
E mexa comparar, se lermos a sua página ou documentação ou CS50 homem
referência, será simplesmente dizer-lhe que mexa
comparar retorna um negativas número ou um número positivo ou zero,
em que zero significa que eles são iguais.
>> Portanto, apenas conjecturas.
O que isso pode significar se agitar retornos comparar
valor negativo ou um valor positivo?
AUDIÊNCIA: Maior ou menor que.
DAVID J. MALAN: Sim, superior ou inferior.
Então, se você quisesse classificar um todo grupo de cordas em um dictionary--
como nós acabará por baixo do road-- função perfeita para usar potencialmente,
porque ele vai fazer isso comparação de strings para você, e dizer
você faz um vem antes de b, ou não b vir antes de uma ordem alfabética.
Nós podemos fazer exatamente isso.
>> E notem que eu fiz um outro coisa neste exemplo.
O que mais mudou maior se nesta função principal?
Char *.
E esta é a outra mentira.
Todo esse tempo, quando você tem escrito corda,
temos sido secretamente reescrever string como char * para que, na verdade, clang
compreende.
>> Em outras palavras, em CS50.h e como vamos finalmente ver,
fizemos uma corda sinônimo chamado isso é a mesma coisa que char *.
E, por enquanto, só sei que o *, Neste contexto, pelo menos,
significa o endereço.
>> O endereço de quê?
Bem, o fato de que eu disse char *, e não int * ou float *,
significa que char * é o endereço de um char.
Então essa caixinha aqui, aka corda, é realmente do tipo char *,
que é simplesmente uma maneira elegante de dizer, nessa caixa vai um endereço.
E o que é que o endereço se refere?
Aparentemente, um char.
>> Mas poderíamos absolutamente tem int * e outras coisas.
Mas, por enquanto, char * é realmente o mais simples e uma de interesse.
Portanto, este problema vai a subir, apesar de, outra vez.
>> Suponha que eu abrir este programa.
Vamos ver se agora podemos prever o que há de errado com este código.
Então, neste programa, copie-0, estou indo para a frente e novamente chamar
GetString e armazenar o valor em s.
>> E então, por que eu estou fazendo isso, apenas como um lembrete de semana passado?
Fizemos dizer que GetString às vezes retorna nulo.
O que significa se GetString retorna null?
Algo deu errado.
Isso provavelmente significa a seqüência é muito grande, para fora do computador de memória.
Acontece super, super, super raramente, mas pode acontecer.
Queremos verificar para ele, e isso é tudo o que estamos fazendo.
>> Porque nós vamos ver agora, se não o fizer começar a verificar habitualmente para as coisas
como nulo, que você pode realmente começar a ir
para endereços na memória que são inválidas.
E você vai começar a induzir mais e mais falhas de segmentação.
Ou em um Mac ou um PC, apenas fazendo com que um computador para pendurar
ou um programa de congelamento, potencialmente.
>> Então, agora, eu afirmo na cópia-0.c, que eu vou copiar essas seqüências por meio
da linha 28.
E então, eu vou a reivindicação, na parte inferior
aqui que eu vou para alterar um deles.
>> Então, observe isso.
Vou chamar o nosso velho amigo strlen.
E só explicar em Inglês o que esta linha 34 está fazendo?
O que faz t suporte 0 representam à esquerda.
Sim.
>> AUDIÊNCIA: primeiro caractere de t?
DAVID J. MALAN: primeiro caractere de t.
É isso aí.
Primeiro caractere de t, eu quero para atribuir a versão em maiúsculas
do primeiro caractere t.
Portanto, esta é a capitalização a primeira letra.
E, em seguida, a última coisa que eu faço neste programa é eu reclamo aqui
o original, é, e aqui está a cópia, t.
>> Mas baseado na história que acabamos de contou sobre o que realmente são cordas,
o que é realmente 28 linha fazendo, eo que é
o erro resultante vai para ser exibida na tela?
>> Então, primeiro, a primeira pergunta, 28.
O que é String t = s realmente fazendo?
Se tivermos na mão esquerda lado aqui corda t = s;
que me dá uma caixa de aqui e uma caixa aqui.
E suponha que este endereço é 0x, vamos dizer, 50, desta vez, de forma arbitrária.
O que significa corda t = s fazer debaixo do capô?
>> AUDIÊNCIA: [inaudível]
>> David J. MALAN: Armazena a memória tratar lá, então 0x50 vai lá.
Então, se agora, eu vou para o primeiro personagem em t e maiúsculas que,
O que estou fazendo de forma eficaz para s?
Eu realmente estou fazendo a mesma coisa, certo?
Porque se Endereço 0x50-- e só, eu não tem muito espaço na placa aqui,
mas supor que esta é 0x50 até aqui, em algum lugar na memória do meu computador.
>> E eu, por exemplo, gabe em minúscula aqui, assim.
E tenho dito suporte t 0 fica maiúscula.
Bem, t suporte 0 é a primeira letra t.
Tão pouco g vai tornar-se grande G. Mas o problema
é, o que s também apontam para?
>> AUDIÊNCIA: O mesmo.
>> DAVID J. MALAN: Exatamente a mesma coisa.
Assim, uma explicação simples, talvez, mesmo que a sintaxe é um pouco estranho.
Então, vamos fazer isso.
Fazer cópia-0 e, em seguida, ./copy-0.
Diga alguma coisa: Gabe.
E, infelizmente, ambos eles já foram capitalizados,
mas para que, subjacente razão que estamos simplesmente
agora a lidar com endereços.
>> Então, como vamos começar a address-- sem trocadilho intended--
como é que vamos começar a resolver este problema em particular?
Bem, em copy1.c, as coisas vão a ficar um pouco mais complicado.
Mas eu gostaria de reivindicar uma solução conceitualmente simples.
>> Tão difícil de chegar à primeira vista.
Não vai ser fácil para o primeiro vez que você digitá-lo, talvez,
mas se o problema é que simplesmente fazendo t = s apenas
copia o endereço, o que, novamente se eu posso pegar em você,
vai ser a solução para realmente copiar uma string?
>> AUDIÊNCIA: Nós provavelmente utilizar um ciclo novo.
>> DAVID J. MALAN: Yeah.
Então, nós vamos precisar de um loop novamente.
E porque se deseja copiar uma string s em outra seqüência,
que provavelmente vai querer fazê-lo caractere por caractere.
Mas o problema é que, se este é inicialmente s,
agora precisamos começar explicitamente alocação de memória para t.
>> Em outras palavras, vamos redesenhar uma última vez.
Se esta é a string s = GetString.
E vamos colocar isso aqui, também.
Este é GetString.
E, em seguida, a imagem de algo como que vai ser como antes,
g-a--b eletrônico / 0.
Isso parece um pouco algo como isto.
E s por isso, nós chamamos isso de 0x50, e que vai ser 51, 52.
>> Portanto, esta é 0x50.
E então, eu faço corda t.
Na memória, que só vai dê-me um pouco quadrado assim.
Então, qual é o passo fundamental agora?
Se eu quiser copiar s em t, o que em branco que precisamos preencher aqui?
Ou o que precisamos fazer a um nível elevado?
Sim?
Alguém?
Sim.
>> AUDIÊNCIA: Precisamos [inaudível].
DAVID J. MALAN: Sim, nós precisa preencher este campo em branco.
Eu não posso copiar e, em seguida, capitalizar o nome de Gabe
até eu pedir para o sistema operacional para um outro pedaço de memória
que é pelo menos tão grande quanto o original.
Então isso nos deixa com uma pergunta.
>> Como posso pedir o sistema operacional não apenas para um pouco de Pointer simples
como esta é chamada, um endereço, a não Pointer
para uma caixa pequena e simples assim chamado uma string?
Como posso pedir o operacional sistema para uma grande parte da memória?
Até agora, eu só comecei isso de volta indiretamente chamando GetString.
Então, como é GetString mesmo recebendo sua memória?
>> Bem, acontece que há esta outra função aqui
que agora nós vamos começar a usar.
Agora, isso parece than-- forma mais críptica e eu sou o único que pode ver ele--
esta linha parece muito mais enigmática então deve à primeira vista.
Mas vamos provocá-lo à parte.
>> No lado esquerdo, eu tenho char * t.
Assim, em Inglês, vamos começar a formular apropriadas em jargão técnico.
Portanto, esta é a atribuição de uma variável do tipo char * chamado t.
Agora, o que isso realmente significa?
>> Bem, isso significa que, o que eu vou colocar nesta variável chamada t?
Um endereço de um char.
Então, isso é apenas o mais simples, maneira mais razoável
de descrever o lado esquerdo.
Assim que cria esta caixa aqui só.
Então, o lado direito, presumivelmente, vai
alocar que maior pedaço de memória como?
Então, vamos brincar com este apart.
>> É impressionante à primeira vista, mas o que está acontecendo aqui dentro?
Primeiro, há malloc, que é, aparentemente, o nosso novo amigo,
"Memória alocar."
Portanto, este é o argumento que está sendo passado para ele, por isso é um argumento muito grande.
Então, vamos brincar com este apart.
>> strlen de s, é claro, representa o--
AUDIÊNCIA: O número de caracteres.
DAVID J. MALAN: Apenas o número de caracteres em s.
Assim, o comprimento de s, a string original.
Assim G-a-b-e.
Então é provavelmente quatro neste caso.
Por que estou fazendo um depois chamando strlen de s?
AUDIÊNCIA: [inaudível]
David J. MALAN: Para isso caractere especial nulo.
Se você me perguntar qual é o comprimento de O nome de Gabe, eu vou dizer quatro.
Debaixo do capô, porém, eu preciso que o quinto byte para o caracter nulo.
Então é por isso que eu estou fazendo o 1.
>> Agora é só no caso de você estiver executando este programa em um computador diferente, digamos,
o aparelho CS50, em que o tamanho de um char
pode ser diferente de minha própria Computador--
Acontece que eu posso chamar isso de sizeof operador, é só pedir o computador,
o que é o tamanho de um carbonizar neste computador?
>> E multiplicando cinco neste por exemplo o tamanho de um carvão animal, que
na maioria dos computadores vai ser apenas um, malloc
vai destinar para mim este grande pedaço de memória aqui à direita.
E isso vai return-- é uma function-- por isso é
vai voltar para mim o que?
AUDIÊNCIA: O endereço?
DAVID J. MALAN: O endereço de quê?
AUDIÊNCIA: É a memória que alocados?
DAVID J. MALAN: Do memória que ele alocado.
Então, eu não tenho nenhuma idéia, francamente, onde é que isto vai acabar.
Vou propor que isso vai acabar em 0x88.
Completamente arbitrário, mas em algum lugar diferente 0x50,
porque o sistema operativo, o Windows e Mac OS fazer para mim, é
certificar-se de que ele está dando me diferentes pedaços de RAM.
>> Portanto, este é o valor que esta pedaço de memória pode acabar.
Então é isso que acaba por aqui, 0x88.
Então, agora claramente, eu posso entender que este não é o mesmo como esta,
porque eles estão apontando para diferentes pedaços de memória.
Então, se eu agora realmente deseja copiar esta em, vamos fazer a solução proposta.
>> Vamos embora, crie um loop for, e fazer suporte t i recebe suporte s i.
Porque agora eu posso usar esta notação de matriz-like,
porque mesmo que malloc muito genericamente me atribui memória,
bytes de memória é apenas contíguos.
Byte, byte, byte, back to back to back.
>> Eu posso certamente como um programador tratá-la como uma matriz, que
significa que eu posso usar este finalmente familiarizado notação de apenas alguns colchetes.
>> Então deixe-me fazer uma pausa lá, porque este é um lote de uma só vez, até
embora a idéia básica para recapitular é essa cadeia, todo esse tempo,
não é um novo tipo de dados per se.
É apenas um ponteiro chamado, um endereço de um personagem,
que apenas significa que é um número que, por convenção, humano
que tendem a escrever como 0x algo.
>> Mas é apenas um número, como 33 Oxford Street,
que passa a ser o Endereço do CS edifício.
Qualquer dúvida sobre esses detalhes?
Sim?
>> AUDIÊNCIA: Por que nós verificamos fazer para t igual a nulo?
>> DAVID J. MALAN: Por que verificar a existência de t igual a nulo?
Se lermos o documentation-- grande pergunta-- para malloc,
ele vai dizer em letras miúdas, às vezes malloc pode retornar nulo,
assim como GetString.
E, de fato, GetString retorna null se, por sua vez, malloc retorna nulo,
porque GetString usa malloc.
>> E isso pode acontecer se o sistema operacional, Mac OS, Windows, qualquer que seja, é simplesmente
falta de memória para você.
Então, isso é o que aconteceu lá.
>> E deixe-me revelar uma outra coisa que só poderia explodir sua mente
ou completamente estar muito em cima da linha.
Mas deixe-me puxar para cima o mesmo laço for para copiar,
que há um momento, a retirada foi este. suporte t i recebe suporte s i.
>> Nice and user-friendly.
Parece Week Two novamente.
Mas esta versão, na verdade, pode ser reescrita como este, que parece enigmática.
É um ponteiro técnica chamada aritmética, aritmética endereço.
Mas por que isso funciona?
>> Agora irritantemente, o C autores decidiram utilizar
o símbolo * para fins diferentes.
Já vimos isso usado uma vez já, char *, que significa "me dê uma variável
que vai conter o endereço de um char. "
* Então caractere em que contexto significa "me dê uma variável."
>> Infelizmente, se você usar o * sem uma palavra em frente do mesmo, como carvão,
agora é chamado de operador de dereferência.
E vamos ver mais deste antes do tempo.
Mas isso apenas significa "ir para lá."
É como dizer que, se alguém me entregou em um pedaço de papel "33 Oxford Street,"
se eu fizer "* 33 Oxford Street", que significa "Descer a estrada para a construção CS."
>> Então * significa apenas ir para lá se não há nenhuma palavra na frente dele.
Então, o que é t, para ser claro?
t é o endereço do bloco de memória que foi dado de volta para mim.
s é o endereço de que, para ser claro, no exemplo que estamos discutindo,
gabe de minúsculas?
s é o endereço de--
AUDIÊNCIA: A string.
DAVID J. MALAN: É o nome original de Gabe.
Então, é o endereço de este pedaço de memória.
Então, se eu digo t + i-- i, o aviso prévio, é apenas o nosso velho amigo.
É apenas uma variável de índice que é a iteração de zero em cima
para o comprimento da string s.
Por isso, vai ser zero, em seguida, um, depois dois, depois três, depois quatro.
Então, vamos montar esses novos O enigma de raspadinhas-like, se quiser,
apesar de, novamente, a sintaxe é muito mais misterioso do que zero.
Então t é um endereço + i vai me dar
um número, porque estes são todos números que temos vindo a desenhar como hex.
Mas eles são apenas números.
>> Então, se o endereço de t dissemos era 0x88, o que é 0x88 mais zero.
Mesmo se você não está confortável com hex ainda, dar um palpite.
>> AUDIÊNCIA: The original.
>> DAVID J. MALAN: Ainda 0x88.
Então, o que * 0x88 significa?
Quer dizer, "ir lá", que significa efetivamente, "colocar o dedo aqui."
E agora no lado da mão direita de esta expressão, * e, em seguida, em parênteses,
s + i significa s, que é o tratar-se aqui da pequena g.
s + 0 é, naturalmente, é, tudo o que é s.
>> Então, agora, é * s, que assim como * 33 Oxford Street significa ir para o endereço
s.
Então aqui está esse dedo, a mão direita.
Então o que é que eu vou copiar para o quê?
A coisa sobre o direito, que é gabe, pouco g aqui, para aqui.
>> E assim o efeito de que primeira iteração do loop,
como proposto, mesmo que pareça louco mais complicado do que qualquer coisa
que já vimos antes, está simplesmente dizendo clique aqui e copie esse personagem aqui.
É o que lhe dá um mapa para ambos os locais.
>> E vamos ver muito mais disso.
Mas, por agora, a esperança é apenas para introduzir algumas dessas idéias básicas.
E, de fato, vejamos um programa de final aqui,
e então o claymation prometido, que irá fazer tudo certo.
Tudo certo.
Então deixe-me abrir up-- lá vamos nós.
Então vamos me-- vamos voltar a esse quadro antes do tempo.
Deixe-me abrir este último exemplo aqui.
>> Então aqui vai uma super, super programa que realiza
nada na vida que faz o seguinte.
Primeiro, ele declara duas variáveis, x e y, que não são números este tempo,
per si.
Eles não estão inteiros, per se.
Eles são aparentemente int *.
Então, qualquer um, o que significa Se o seu tipo de dados, a sua variável,
é do tipo int * star?
Esse é o endereço de um int.
>> Então, eu não tenho nenhuma idéia de onde é ainda.
Significa apenas "colocar, eventualmente, o endereço de um int aqui. "
0x50, 0x88, onde quer que seja em memória, um endereço está acontecendo lá.
E é isso que y é vai ser, também.
>> Se eu agora dizer x = malloc (sizeof (int)), esta é uma maneira elegante de dizer,
hey sistema operacional, via malloc, dá-me a memória suficiente para o tamanho
de um int, que é provavelmente vai ser de 32 bits ou quatro bytes.
>> Então, o que malloc retornar?
Malloc retorna um endereço.
Então, o que vai ser armazenado em x?
O endereço do bloco de memória, os quatro bytes, que malloc
só encontrei para me perguntando o sistema operativo.
>> Agora, entretanto, a linha quatro aqui, a * x = 42.
Só para ficar claro, o que está acontecendo lá embaixo?
No lado esquerdo, * x.
que é como * 33 Oxford Street.
Então * x significa o quê?
>> AUDIÊNCIA: Vá para.
>> DAVID J. MALAN: Vá para esse endereço.
Onde quer que esse pedaço de memória é, ir para ele.
E colocar o que há, obviamente?
AUDIÊNCIA: 42.
DAVID J. MALAN: 42.
Tudo bem, * y, mesma idéia.
Ir para o endereço em y.
Coloque o número 13 lá, mas o que é y no momento?
AUDIÊNCIA: Não há memória para y.
DAVID J. MALAN: Não há memória para y.
Então, o que faz y provavelmente conter, como temos vindo a dizer?
>> AUDIÊNCIA: Garbage.
>> DAVID J. MALAN: Algum valor de lixo.
Agora, o valor de lixo ainda é um número.
Ele ainda pode ser confundido com um endereço.
É como se alguém rabiscou algo,
e eu mal interpretado como significando um prédio no final da rua.
E se você apenas tentar entrar em um prédio que não possui,
ou algum pedaço de memória que você não tem sido dado, as coisas ruins podem acontecer.
Computador pode falhar, ou algum outro comportamento indeterminado pode acontecer.
>> Assim, a introdução, em seguida, para Binky é isso.
Eu ainda me lembro, 20 tantos anos depois,
onde eu estava quando eu finalmente compreendida ponteiros.
>> O que quer dizer, se você deixe aqui em três minutos
e acho que não entender ponteiros, perceber
Tenho lembrado por 20 anos, por alguma razão maluca
quando e por que finalmente afundado em, sentado com o meu ensino
companheiro, Nishat Mehta no volta de Eliot Refeitório.
Agora, eu me lembrei isso porque foi
um dos temas I, em particular, lutou com.
E então, finalmente clicado, como eu ouso dizer um monte de tópicos
acabará.
E agora, para fazer que sentir toda a mais feliz e tudo o mais convincente,
vamos dar uma olhada final na nossa últimos três minutos aqui no Binky,
do nosso amigo, Nick Parlante de Stanford.
>> [REPRODUÇÃO]
>> Ei, Binky.
Acorde!
É hora de diversão ponteiro.
>> -Qual Que é isso?
Saiba mais sobre ponteiros?
Ah, que bom!
>> Bem, para começar, eu acho que estamos vai precisar de um par de ponteiros.
>> -OK.
Este código aloca dois ponteiros, que pode apontar para números inteiros.
-OK.
Bem, eu vejo os dois ponteiros, mas eles não parecem estar apontando para qualquer coisa.
>> -É Direita.
Inicialmente, os ponteiros não apontam para nada.
As coisas que eles apontam para são chamados pointees, e configurá-los de
um passo separado.
>> Ah, certo, certo.
Eu sabia disso.
Os pointees são separados.
Er, assim como você alocar uma pointee?
>> -OK.
Bem, este código aloca um novo pointee inteiro,
e isso define Parte X para apontar para ele.
>> Ei, que parece melhor.
Então ele fazer alguma coisa.
>> -OK.
Vou cancelar o ponteiro x para armazenar o número 42 na sua pointee.
Para este truque, eu vou precisar da minha Varinha Mágica de desreferenciação.
>> -Seu Magic Wand de Dereferencing?
Que-- isso é ótimo.
>> -Este É o que o código se parece.
Eu só vou definir o número, e [POP]
>> Ei, olha.
Não vai.
>> -Então Fazendo um desreferenciava em x segue a seta para acessar sua pointee.
Neste caso, uma loja de 42 em lá.
Hey tentar usá-lo para armazenar o número 13 através do outro ponteiro, y.
>> -OK.
Eu vou passar por cima aqui para y, e obter o número 13 set up.
E, em seguida, pegue a varinha de Dereferencing e apenas [BUZZ]
>> Ah!
>> Oh, hey!
Isso não funcionou.
Diga, Binky, eu não acho que dereferencing y é uma boa idéia, porque você sabe,
criação do pointee é um passo separado.
E eu não acho que nunca fiz isso.
>> Ponto -Boa.
Sim.
Alocamos o ponteiro y, mas nós nunca defini-lo para apontar para um pointee.
>> -Muito Observador.
Ei, você está olhando bom lá, Binky.
Você pode corrigi-lo assim que os pontos y ao mesmo pointee como x?
>> -sure.
Vou usar a minha varinha mágica Ponteiro de Cessão.
>> -É Que vai ser um problema como antes?
-No.
Este não toca nos pointees.
Ele só muda um ponteiro para apontam para a mesma coisa que o outro.
>> Oh, eu vejo.
Agora y aponta para o mesmo lugar que x.
Então, espere.
Agora, y é fixo.
Tem um pointee.
Então você pode tentar o Wand of Dereferencing novamente para enviar a 13 terminado.
>> Uh, OK.
Aqui vai. [POP]
>> Ei, olha isso.
Agora dereferencing obras sobre y.
E porque os ponteiros estão compartilhando que um pointee, ambos ver o 13.
Sim.
Compartilhando, qualquer que seja.
Então, vamos trocar de lugar agora?
>> Oh, olhe.
Estamos sem tempo.
>> -Mas
>> -Basta Lembrar as três regras de ponteiro.
Number One, a estrutura básica é que você tem um ponteiro,
e aponta mais para um pointee.
Mas o ponteiro e pointee são separados,
e o erro comum é a criação de um ponteiro,
mas esquecer-se de dar-lhe um pointee.
>> Número Dois, dereferencing ponteiro começa no ponteiro
e segue a sua seta sobre para acessar sua pointee.
Como todos sabemos, este só funciona se houver
um pointee, que tipo de recebe de volta a regra número um.
>> Número Três, ponteiro atribuição é um ponteiro
e muda-lo para apontar para o mesmo pointee como outro ponteiro.
Assim, após a atribuição, os dois ponteiros
irá apontar para o mesmo pointee.
Às vezes, isso é chamado de partilha.
E isso é tudo que existe para ela, realmente.
Bye-bye agora.
[FIM REPRODUÇÃO DE VÍDEO]
DAVID J. MALAN: Isso é tudo para CS50.
Vamos vê-lo na próxima semana.