>> [MÚSICA DE XOGO]
DAVID J. Malan: Todo ben.
Este é CS50, e este é o final da cuarta semana.
E un dos temas hoxe é a de forense dixital,
técnica de recuperar a información.
E, de feito, moi aínda está no medio
agora da Paz en Tres e Breakout, a próxima semana,
o foco será en precisamente neste ámbito.
>> Entón, un dos traballos máis legais que eu xa tivo foi en posgrao,
cando estaba a traballar para o lugar, Middlesex County District Attorney
oficina, facendo forense traballar.
Entón, basicamente, o Massachusetts Policía do Estado, na ocasión,
cando se traballa en casos sería traer cousas como discos duros
e disquetes e tarxetas de memoria e similares.
E eles ían entrega-los para min e meu mentor,
eo noso obxectivo era atopar probas, se había algún, nestes medios.
Reflexos Agora, pode ver deste mundo da ciencia forense
nos medios, televisión e cine.
Pero o traballo que eu tiña, e atrévome a dicir que o mundo,
non é ben así que ve-lo.
Imos dar un ollo ao que probablemente xa viu.
[REPRODUCIÓN]
-OK.
Agora, imos dar unha boa ollada en ti.
>> [MÚSICA DE XOGO]
>> -Segure El.
Correr de volta.
>> Espere un minuto.
Vaia á dereita.
-Hai.
Conxelar iso.
Pantalla -Full.
>> -OK.
Conxelar iso.
-Tighten-Se sobre iso, vai?
>> -vector En en que cara pola roda traseira.
>> -zoom En dereito aquí neste lugar.
>> -Con O equipo certo, o imaxe pode ser máis grande e afiada.
>> -Cal Que é iso?
>> -É Un programa de mellora.
>> -Consegue Suposto se procede?
>> Non o sei.
Imos melloralo.
>> -Aprimore Sección A6.
Eu aumentei o detalle, e--
-Penso Hai abondo para mellorar.
Liberalos lo para a pantalla do ordenador.
>> I Reforzada a reflexión nos seus ollos.
-Imos Executar este medio perfeccionamento de vídeo.
>> -Edgar, Pode mellorar isto?
>> -hang en.
>> Eu Benvida a traballar sobre esta reflexión.
>> Reflexo de alguén -Hai.
>> -Reflection.
-Hai Un reflexo da cara do home.
>> Reflexión -The!
-Hai Unha reflexión.
-zoom En no espello.
Podes ver un reflexo.
>> Vostede-pode mellorar a imaxe dende aquí?
Vostede-pode mellora-lo?
-Podemos Mellorar iso?
Vostede-pode mellora-lo?
-Segure Un segundo.
Vou mellorar.
-zoom En na porta.
-Times 10.
-Zoom.
-Mover En.
-Máis.
Espere, pare.
Pare.
-PAUSE El.
-Rotate Nos 75 graos en torno á vertical, por favor.
>> Pare.
Voltar para a parte sobre a porta de novo.
>> -Ten Un intensificador de imaxe que pode bitmap?
>> -Talvez Podemos usar o Pradeep Singh método para ver nas fiestras.
>> -The Software é o estado da arte.
>> -The Autovalor está desactivado.
>> -Con Dereita combinación de algorithms--
>> Iluminación tomadas -El algoritmos para o seguinte nivel,
e podo usalos para mellorar esta foto.
>> -lock On e ampliar o eixe z.
>> -Aprimore.
Mellorar.
-Aprimore.
-Freeze E mellorar.
[FIN REPRODUCIÓN DE VIDEO]
DAVID J. Malan: Entón, estas son todas as palabras, pero non eran
usado en frases correctamente.
E, de feito, no futuro, a calquera hora, por favor, escoita a alguén dicir a palabra,
"Mellorar", rir un pouco.
Porque cando se trata de mellorar, por exemplo, iso é o que pasa.
>> Entón aquí vai unha foto fermoso.
Isto é propio Daven de CS50.
E supoña que queriamos centrar na brillo nos ollos,
ou a reflexión do bandido que estaba claramente
capturada pola cámara de seguridade.
Isto é o que pasa cando aumentar o zoom nunha imaxe que
ten só un número finito de bits asociados.
>> Isto é o que ía estar.
E, de feito, está no ollo do Daven é, pero catro, quizais seis píxeles
que compoñen o que foi brillo alí.
Entón Problem Set Catro acabará por ter explorar este mundo, especialmente
pola natureza de algo que chamamos ficheiro E /, onde
i / o é só un xeito elegante de dicindo entrada e saída.
>> Entón, ata agora, as interaccións que tivemos con un ordenador
ser en gran parte co seu teclado e pantalla,
pero non tanto co disco duro, ou gravar os ficheiros ademais dos que
vostede mesmo escribir.
Os seus programas, ata agora, ten non chegou a crear e gardar,
e actualización dos seus propios arquivos.
>> Ben, o que é un arquivo?
Ben, algo así como un JPEG.
Esta é unha imaxe que pode ter ou subir a Facebook,
ou ver en calquera lugar na web.
De feito, esta imaxe que acabamos de serra de Daven foi un JPEG.
E o que é interesante sobre arquivos como JPEGs
é que poden ser identificados, tipicamente, por certos patróns de bits.
>> Noutras palabras, que é o que distingue un JPEG dende un GIF
dende un Ping desde unha palabra documento a partir dun arquivo de Excel?
Ben, é só diferente patróns de bits.
E eses patróns diferentes son xeralmente no inicio destes ficheiros.
>> Así que cando o computador abre unha Palabra doc, ou cando un ordenador abre un JPEG,
parece tipicamente na primeiro de varios bits no ficheiro.
E se recoñece un defecto, el di, oh, esta é unha imaxe.
Deixe-me presenta-lo ao o usuario como un gráfico.
Ou, oh, iso parece un documento de Word.
Deixe-me amosar ao usuario como un ensaio.
>> Así, por exemplo, JPEGs, ao parecer, son
moi sofisticado debaixo do capó.
Pero os tres primeiros bytes en case todas as JPEG comezar con estes tres números.
Así byte cero, un, dous e son, en máis cada JPEG, 255, entón o número
216, a continuación, o número 255.
>> E o que vai ser capaz para comezar a facer a próxima semana
é, en realidade, cutucando por baixo a capa de arquivos como JPEGs
e como ficheiros de mapa de bits, e vendo o que sempre estivo aí durante tanto tempo
como está a usar un ordenador.
>> Pero o que está aí non é tipicamente escrito como números decimais como este.
Os científicos da computación non tenden a falar en decimal.
Realmente non falan en binario.
Normalmente, cando queremos para expresar números,
nós realmente usar hexadecimal, que pode lembrar
de, digamos, Conxunto de Problemas Un deles, que desafiou
pensar nun sistema diferente.
>> Nós, por suposto, está familiarizado con decimal, de cero a nove.
Nós falamos sobre binario.
E nós realmente non teñen usar moito aquí
en diante, porque os ordenadores irán usar iso.
Pero os desenvolvedores van moi moitas veces, pero non sempre,
usar hexadecimal, o que significa só ten 16 letras no alfabeto,
en oposición a dúas ou 10.
>> Entón, como contar ata máis de nove en hexadecimal?
Vai 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, só por convención.
Pero o que é fundamental é que cada destes é un único símbolo.
Non hai 10.
Non hai 11, por si só, xa que cada dos seus díxitos, así como en decimal
e, así como no sistema binario, que só ser un personaxe único, por convención.
>> Para que, entón, é o alfabeto que temos á nosa disposición para hexadecimal.
Entón, o que un JPEG ollar como se eran para escribir os tres primeiros
non bytes como decimal, pero, por exemplo, como hexadecimal?
E por que é hex mesmo tan útil?
>> Ben, unha rápida ollo a un exemplo.
Entón, se eu escribir os bits que representan estes números de decimal
isto pode ser un pouco enferrujado agora dalgunhas semanas,
pero o esquerdo e o un dereito é moi sinxelo.
255 foi o maior que o número podería representar con oito bits.
Era todo queridos.
Entón, a única que se lixeiramente interesante é o do medio.
E se tipo de facer a matemáticas, vai deducir que, de feito,
este patrón de un e ceros representa 216.
Entón imos estipular para agora que estes son correctos.
Pero por que isto é interesante?
>> Ben, un byte, por suposto, é de oito bits.
E verifícase que se pensar dun byte de dous bloques de catro bits,
así.
Déixeme só engadir un pouco de espazo.
Entón, antes, despois.
Acabo de engadir un espazo en branco polo amor de visualización aquí.
Como podemos agora representar en, digamos, hexadecimal cada catro de bits,
cada conxunto de catro bits?
>> Así, por exemplo, na parte esquerda agora temos 1111 en binario.
Cal é ese número en decimal, se fai a matemática?
Ten a casa das unidades, o lugar dous, o lugar de catro, eo lugar oitos.
>> Audiencia: 15.
DAVID J. Malan: É 15.
Entón, se facemos oito catro dous máis un, temos 15.
Entón, eu podería escribir 15 baixo 1111, pero o punto aquí
é hexadecimal, non decimal.
Entón, en vez de escribir 15, 1-5, Vou escribir isto en hexadecimal,
que se ollar cara atrás, se ten cero a f, o que é 15 será?
Audiencia: f.
DAVID J. Malan: Entón non é que a súa f.
E pode solucionar isto, dicindo: así, se un é 10, entón OK, f é 15.
Entón, en realidade, poderiamos reescribir este mesmo conxunto de números como f f.
E entón, se facemos un pouco de matemáticas, imos deducir que isto é d.
Oito é moi fácil, porque ter un no lugar oitos.
E entón, temos unha parella máis f f do.
>> Entón, o que os seres humanos tenden a facer por convención cando usan hexadecimal é que simplemente
escribir este un pouco máis sucinta, se librar da maior parte deste espazo en branco.
E só para ser super claro para lectores que esta é hexadecimal,
a simple convención entre seres humanos é escribir de cero
x, que non ten outro significado que un identificador visual,
aquí vén un número hexadecimal.
>> E entón, se pon os dous díxitos, f f neste caso, a continuación, d a, entón f f.
Entón, longa historia curta, hexadecimal só tende
para ser útil porque cada un dos seus díxitos, de cero a f, perfectamente liñas
arriba con un nivel de catro bits.
>> Entón, se ten dous díxitos hexadecimais, cero a F, unha e outra vez,
que lle dá perfectamente oito bits ou un byte.
Entón é por iso que tende a convencionalmente ser útil.
Non hai intelectual contido moi ademais,
distinta da súa real utilidade.
>> Agora JPEGs non son o único formatos de ficheiro para gráficos.
Debe lembrar que hai arquivos como este no mundo,
polo menos desde hai uns anos.
>> Polo tanto, este foi realmente instalado en Windows XP
en millóns de PCs de todo o mundo.
E este era un arquivo de mapa de bits, BMP.
E un ficheiro de mapa de bits, como podes ver no seguinte semana, só significa un patrón de puntos,
píxeles, como son chamados, Un mapa en anacos, en realidade.
>> Entón, o que é interesante, con todo, sobre o formato de arquivo, BMP, é
que debaixo do capó, el ten máis que tres bytes
que compoñer seu cabeceira, así dicir, as primeiras mordidas.
El realmente parece un pouco complicado a primeira vista.
E vai ver iso no conxunto P.
E recibir algo especial deste momento
non é tan importante, como só o feito que, ao comezo de cada bitmap
ficheiro, un formato gráfico, hai unha morea de números.
>> Agora, Microsoft, a autor deste formato,
tende a chamar os As cousas non enteiros e caracteres
e carrozas, pero palabras e d palabras e ansia e bytes.
Entón, son só diferentes tipos de datos.
Son nomes diferentes para o mesmo.
Pero vai ver que en I Set Four.
>> Pero isto é só para dicir que se un ser humano clic dúas veces nalgún arquivo bmp no seu
ou o seu disco duro, e unha ventá se abre up mostrando-lle que a imaxe,
isto aconteceu porque a operación sistema presuntamente notado non só
a extensión do ficheiro bmp o nome do ficheiro,
pero tamén o feito de que hai algúns convenio para o estándar de bits
no inicio deste arquivo bitmap.
>> Pero imos agora concentrar-se en un arquivo complicado tal,
pero en algo como isto.
Supoña que aquí en gedit, I só ten o comezo
dun programa que é moi sinxelo.
Teño algunhas inclúe enriba.
Agora eu teño "structs.h" # include pero Vou volver a iso nun momento.
Pero isto é útil para agora.
Polo tanto, este é un programa que vai aplicar
como base de datos do rexistro.
Así, unha base de datos de alumnos, e cada alumno no mundo
ten un nome e unha casa e, probablemente, algúns outras cousas, pero imos mantelo simple.
Cada estudante ten un nome e unha casa.
>> Entón, se eu quería escribir un programa cuxo obxectivo na vida
foi só para facer unha iteración do zerar en ata tres,
se hai tres estudantes na Universidade de Harvard.
E eu só quero incorporarse, usando GetString, O nome de cada alumno e da casa,
e despois é só imprimir os para fóra.
>> Esta é unha especie de Semana One, Two Week cousas agora,
onde eu só quero unha para loop ou algo parecido.
E quero chamar GetString algúns veces, e logo imprimir f algunhas veces.
Entón, como eu podería facelo, con todo, cando un nome e unha casa
están implicados para cada alumno?
>> Entón, o meu primeiro instinto pode ser para facer algo así.
Podería dicir en primeiro lugar, así, deixa-me, dicir, unha matriz de cadeas chamados nomes.
E eu non quero un hardcode tres aquí.
O que quero poñer alí?
Para que os alumnos, porque iso é só unha constante declarado na parte superior,
só para que eu non teño que codificar tres en varios lugares.
Desta forma, podo mudalo un lugar, e iso afecta un cambio en todas as partes.
E entón, eu podería facer cadea alberga alumnos.
>> E agora, eu podería facer algo así for (int i = 0; i <ESTUDANTES; i ++.
Entón, eu estou escribindo rápido, pero iso é probablemente familiar sintaxe agora.
>> E agora, este foi máis recente.
Se eu queira poñer no i-th nome do alumno, eu creo que eu fago iso.
E entón, non os nomes pero casas adaptador.
Fago iso, GetString, e deixar me volver atrás e corrixir esta liña.
Acordo?
Desacordo?
Non é moi doado de usar.
Eu non dixen que o usuario o que facer.
>> Pero agora, se eu tamén quería máis tarde, imos
digamos, imprimir estas cousas out-- así TODO posterior.
Vou facer máis con isso-- este sen dúbida é
unha correcta execución recibindo nomes e casas, tres
do total de cada un deles, a partir dun usuario.
>> Pero iso non é moi bo deseño, non?
E se un alumno non ten só un nome e unha casa, pero tamén un número de identificación,
e un número de teléfono, e un enderezo de correo electrónico,
e quizais un páxina principal, e quizais unha alza Twitter,
e calquera número de outros detalles asociado con un alumno ou unha persoa,
de modo máis xeral.
Como é que nós comezamos a engadir funcionalidade deste programa?
>> Ben, eu sinto que o xeito máis simple pode ser para facer algo así, por exemplo,
int id alumnos.
Polo tanto, podo poñer todos os seus IDs alí.
E, a continuación, para algo como números de teléfono,
Eu non sei como representa que só aínda.
Entón, imos adiante e só chamada este twitters alumnos, o que
É un pouco raro, mas-- e máis unha morea campos.
>> Comece a efectivamente copiar e pegar aquí.
E iso vai medrar moi pesado moi rapidamente, non?
Non sería bo se houbese en todo o mundo unha estrutura de datos coñecida
non como un int ou unha corda, pero algo nivel superior, unha abstracción, de xeito
dicir, coñecido como un alumno?
C non veu con built-in función para os estudantes,
pero e se eu quería darlle tal?
>> Ben, ao parecer, eu vou abrir un ficheiro chamado structs.h aquí,
e pode facer exactamente isto.
E imos comezar a facelo agora.
E debaixo do capó de I Conxunto Tres, xa veño facendo iso agora.
Non existe tal cousa como un g ret ou un g oval na linguaxe de programación C.
>> Persoal da Stanford aplicado aqueles tipos de datos usando esta visión aquí,
declarando a súa propia novos datos tipo usando un novo contrasinal
chamada estrutura e outra un chamado typedef.
E, de feito, aínda que a sintaxe parece un pouco diferente a partir de material
que xa vimos antes, en principio, é super sinxelo.
>> Isto significa só "definir un tipo."
Isto vai ser un estrutura, e unha estrutura
é como un recipiente para varias cousas.
E esa estrutura para ter unha secuencia chamada nome,
e unha serie chamada casa.
E imos chamar, só por conveniencia, esta estrutura de datos enteira estudante.
>> Así, no momento que comeza a o punto e coma, ten agora
creou o seu propio datos tipo chamado estudante
que agora está á beira de int, e float e char, e corda,
e g rect, e g oval, e calquera número doutras cousas que a xente inventaron.
>> Entón, o que é útil sobre esta agora é que se eu volver
á estrutura 0 e rematar esta implantación, o que escribín
con antelación aquí, ter en conta que todos da desorde inevitable que
estaba a piques de comezar a pasar como eu engade números de teléfono e twitters e todo
esas outras cousas para definición dun alumno,
agora está envolto sucintamente up só como un conxunto de alumnos.
>> E cada un deses estudantes agora ten varias cousas dentro dela.
Así que deixa só unha pregunta.
Como comeza o nome, ea casa, eo ID,
e todo o que se dentro do alumno?
Super simple, tamén.
Nova sintaxe, pero unha idea simple.
>> Simplemente índice para a matriz, como fixemos a semana pasada e esta.
E o que é claramente o nova peza de sintaxe?
Just., Que significa "ir a dentro do estrutura e se o campo chamado
nome, conseguir o campo chamado casa, obter o campo chámase estudante. "
>> Entón, en P Conxunto Tres, se está aínda traballando niso,
ea maioría da xente aínda son, entendo que, como
comezar a usar cousas como rects G e G ovais
e outras cousas que non parecen veñen de Semana Cero, un, ou dous,
entender que iso é porque Stanford declarou uns novos tipos de datos.
>> E, de feito, iso é o que imos facer, así, en I Set Four, cando
comezamos a xestionar as cousas como imaxes, bitmaps, e moito máis.
Entón, iso é só un teaser e un modelo mental para o que está por vir.
Agora, eu procrastinado algo esta mañá.
Eu era unha especie de curiosidade a ver que o fondo Microsoft realmente
parece hoxe.
E ocorre que alguén en 2006 realmente foi para case precisamente
o mesmo lugar para fotografía en realidade o que parece que nos días de hoxe.
O campo está cuberto un pouco.
>> Entón, falando agora de imaxes, Imos traer de volta Daven aquí
na pantalla e Nicholas, e só lembra-lo
que se quere unirse a nós para o xantar este venres, de cabeza para o noso URL habitual
Aquí.
>> Entón, de onde paramos o luns?
Nós introducimos este problema, non?
Esta foi aparentemente a correcta implementación de intercambio,
en que tomar dous enteiros, un chamado, un chamado b,
trocalos, así como Laura fixo aquí no escenario co leite ea auga,
usando un temporal variable, é un vaso baleiro,
para que puidésemos poñer nun b e un en b sen facer unha desorde de cousas.
Usamos unha variable.
Chámase de temperatura.
>> Pero o que era fundamental problema con este código o luns?
Cal foi o problema aquí?
Si.
>> Audiencia: Hai que máis espazo.
>> DAVID J. Malan: Leva-se máis espazo, porque está a usar unha variable,
e iso é OK.
Isto é certo, pero eu son vai dicir que está todo ben.
É só 32 bits na gran esquema das cousas, non é un gran negocio.
Outros pensamentos?
Audiencia: só cambio as variables locais.
DAVID J. Malan: Exactamente.
É só cambio os variables localmente.
Porque sempre que chamar un function-- cando tiña as bandexas dende Annenberg
última vez, ten principal na parte inferior.
Así que chamar a unha función chamada intercambio, intercambio de non obter xe y,
os valores orixinais.
O que fai intercambio get, que nós reivindicamos?
Audiencia: Copias.
DAVID J. Malan: Entón copias deles.
Así, torna-se un e dous, se recordar o exemplo a última vez,
pero unha copia de un e dous que son trocadas correctamente.
Pero, desgraciadamente, ao final, estes valores aínda son os mesmos.
Así, podemos ver que a nosa novo amigo, espero que GDB,
que ou os TFS e Ca de foi guiando-o para a seguinte.
>> Polo tanto, non hai recordo de intercambio parece como-- imos abrir isso-- esta aparencia.
Nós inicializar x para un y a dous.
Tiña unha morea de impresión de f.
Pero, a continuación, a tecla de chamada aquí era para cambiar, o que
é o que o código só vin un momento atrás.
Que é correcto en primeiro vista, pero funcionalmente,
este programa non funciona, porque non cambiar permanentemente xe y.
>> Entón imos ver iso, un ambiente acolledor rápida aquí con GDB, un ./noswap.
Unha morea de información contundentes de que Vou me librar de L con control de momento.
E agora, eu vou dalle executa-o.
E, por desgraza, que non era tan útil.
El executou o programa dentro deste programa chamado GDB, un depurador,
pero non deixe-me bisbilhotar.
>> Entón, como podo realmente facer unha pausa execución dentro deste programa?
Entón romper.
E eu podería romper en calquera liña número, un, 10, 15.
Pero tamén podo romper simbolicamente dicindo rompe principal.
E que vai definir un intervalo punto, ao parecer na liña 16 na principal.
E onde está a liña 16?
Imos subir ao código e van ata noswap.
E, de feito, a liña 16 é o primeiro no programa.
>> Entón, agora, se eu ir adiante e tipo realizar este tempo, Intro, fixo unha pausa.
Entón, imos bisbilhotar.
Imprimir x-- por que é x Cero?
E ignorar o sinal de dólar.
Isto é só para columbófilo utilización do programa.
Por que é x cero no momento?
Si.
>> Audiencia: Fixo unha pausa antes de dereita liña 16, non, en realidade, na liña 16.
DAVID J. Malan: Exactamente.
GDB, por defecto, ten un descanso execución un pouco antes da liña 16.
Por iso, non foi executado, o que significa que x é dalgún valor descoñecido.
E nós temos sorte de que é algo limpo como cero.
Polo tanto, agora se eu tecleo seguinte, agora corre 16.
Está esperando por min para realizar 17.
Deixe-me ir adiante e impresión x.
É unha.
Deixe-me ir adiante e impresión y.
O que eu debería ver agora?
>> Audiencia: [inaudível]
>> DAVID J. Malan: Un pouco máis alto.
>> Audiencia: [inaudível]
DAVID J. Malan: Non é así un consenso.
Entón, si, vemos algún valor de lixo.
Agora, y é 134514064 alí.
Ben, iso é só un valor de lixo.
O meu programa usa RAM para fins distintos.
Hai outras funcións.
Outras persoas escribiron no meu ordenador.
Entón, os bits fosen utilizados para outros valores, eo que estou vendo
representa os restos dalgúns uso previo de que a memoria.
>> Polo tanto, non é gran cousa, porque así mentres eu tecleo seguinte e, a continuación, imprimir y,
é inicializar cara o valor que quero.
Entón, agora, imos adiante un pouco máis rápido.
N para o próximo.
Imos facer iso de novo.
Pero eu non quero bater lo aquí, porque se eu
quero ver o que está a suceder dentro de intercambio, que é a orde?
>> Audiencia: pasos.
>> DAVID J. Malan: pasos.
Entón iso me pisa nun función, en vez de por riba.
E agora, é un pouco enigmática honestamente, pero este é só
me dicindo que eu estou na liña 33 agora.
E imos facelo de novo.
Temperatura de impresión.
Valor de lixo, negativo, esta vez, pero iso é só aínda un valor de lixo.
Entón, imos facer a continuación, tempo impresión.
El é inicializar a 1, o que foi o valor de x, aka a.
>> Agora, onde está o noso A e X está benvida?
Ben, aviso no principal, que chamou eses valores xe y.
Logo, pasou os para cambiar como segue.
X veu primeiro, coma y.
E, a continuación, cambio podería chamalos de xe y.
Pero, para aclarar, é chamando-a e b.
Pero a eb están será copia de x e y, respectivamente.
>> Entón, se eu volver para o GDB, tempo é agora un e é agora un.
Pero, se fago agora e agora facer print un, un xa movida máis.
O leite foi derramado en ex vaso de zume de laranxa, ou viceversa.
>> E se fago agora de novo, e agora se eu imprimir como unha comprobación de sanidade,
é aínda un dous, pero é agora unha b.
Francamente, que aínda está alí.
Eu non me importa o que é temporal.
Pero así que eu agora escribir, por exemplo, seguir volver, agora estou no final
o programa.
E, por desgraza, x é aínda un e y é aínda dous.
>> Entón, cal foi a utilidade do GDB alí?
Non me axudar a corrixir o problema por si só,
pero espero que me axude comprende-lo a través da realización
que si, a miña lóxica é certo, pero meu código non é, en definitiva ter
un impacto permanente.
Entón, iso é un problema que estamos vai agora resolver hoxe.
>> Pero imos chegar alí a través deste.
Cadea é unha mentira.
É, tamén, non é un tipo de datos que existe en C. É
foi un sinónimo para algúns tempo para outra cousa,
e que pode revelar que, como segue.
>> Deixe-me ir adiante e abrir Un programa chamado compararse 0.
E en vez de escribir esta modalidade, imos comezar a percorrer o código
Eu xa escribín, pero é só algunhas liñas.
Polo tanto, este é compararse 0.
E o primeiro que eu estou facendo está a recibir unha liña de texto.
>> Pero teña en conta o que eu son facendo a primeira vez.
Que é diferente claramente sobre a liña 21?
De feito, agarde un minuto.
Esta é copia dous.
Isto non é nin mesmo o programa correcto.
Todo alerta dereita, saqueador.
Todo ben, entón non importa.
Esta é a resposta a unha pregunta futuro.
>> Aquí é comparar-0, e eu son a piques de recibir unha liña de texto.
Programa de moito máis simple.
Entón, iso é simple.
Isto é como Week One, Two Week cousas no momento. cadea s = GetString.
Agora, eu digo de novo aquí.
corda t = GetString.
E, a continuación, o último neste programa, como o propio nome suxire,
é que eu vou tentar comparalos-los.
>> Entón, se s, a primeira corda, é igual a = t, entón eu son
vai dicir que escriba o mesmo.
Senón, eu vou dicir escribe cousas distintas.
Entón, imos compilar e executar este programa.
Entón faga comparar cero.
Parece bo.
Non hai erros de compilación.
>> Déixeme ir adiante agora e escriba ./compare-0.
Deixe-me ir adiante e dicir algo : Daven e algo: Rob.
E eu escriba cousas distintas.
De momento, todo ben.
Programa semella correcto.
>> Pero imos executa-lo de novo.
Diga algo: Gabe.
Todo correcto.
Poida que eu bater a barra de espazo ou algo funky.
Imos facer iso de novo.
Entón Zamyla.
Zamyla.
Cousas diferentes.
Entón, o que está pasando?
>> Polo tanto, temos estas dúas liñas de código, GetString chamarse dúas veces.
E entón, eu son simplemente tentar comparar s e t.
Pero o que realmente está a suceder, entón?
Ben, sobre o meu manuscrito para carniceiro este exemplo un pouco.
E imos realmente xogar iso aquí, tamén.
>> Polo tanto, temos unha liña como cadea s = GetString.
Entón, iso é simplemente o primeiro liña interesante dese programa.
Pero o que todo este tempo foi pasando debaixo do capó?
Ben, sobre a man esquerda lado é cadea, que é algún tipo de variable,
e chama-se s.
Entón, sei que iso é a través da memoria, ou RAM, no meu ordenador dalgunha forma.
Entón eu vou abstractamente chamar isto como un cadrado.
32 bits, verifica-se, pero máis sobre iso no futuro.
E entón, o que está pasando aquí?
>> Ben, obviamente GetString recibe unha cadea de usuario.
E ten GetString Zamyla ou Gabe ou Daven.
Entón, imos escoller a primeira daqueles, que foi Daven.
Entón, efectivamente, o que GetString ten me nese primeiro caso foi D-a-v-e-n.
E entón, o que máis fixo me dar secretaría?
Audiencia: [inaudível]
DAVID J. Malan: Si, o / 0 ou nulo personaxe.
Por iso, efectivamente me deu unha cadea.
Pero nós xa sabemos desde anterior Parece que a cadea é só unha matriz
de personaxes, e é denunciado por este carácter especial sentinela, / 0.
>> Pero se isto é certo e isto é un cadrado,
este é claramente un rectángulo moi grande.
E, de feito, este é, Eu afirmo, só 32 bits.
E isto é claramente máis que 32 bits, porque este é, probablemente,
oito oito oito oito máis oito,
só por mor de bytes en ASCII.
Como o demo é que imos caber Daven nesa caixiña aquí?
>> Ben, o que está realmente facendo GetString?
Ben, esa reixa representa aquí memoria do meu ordenador ou RAM.
Entón imos arbitrariamente dicir que se cada un deles representa un byte,
entón podemos pensar en cada byte como tendo un enderezo,
como 33 Oxford Street, ou 34 Oxford Street, ou 35 Oxford Street.
>> Así como as casas teñen enderezos e os edificios teñen enderezos,
así como de bytes individuais memoria teñen enderezos ou números
que identificalo las unicamente.
Agora, este é arbitraria.
Pero mantelo simple, vou usar hexadecimal só por convención,
pero o 0x non significa outra cousa que "este é hexadecimal."
e eu vou afirmar que a "D" acaba en Byte One na memoria.
>> Non teño nada máis a suceder no memoria, así Daven logrou o primeiro posto
Un byte no.
Este, entón, será 0x2.
Isto vai 0x3.
Este será 0x4.
Isto vai 0x5.
Este será 0x6.
>> Pero unha vez que comezar a pensar sobre o que procede do ordenador
debaixo do capó, pode comezar a inferir
como, hai algúns anos, sería Implementar C en si.
Que é probablemente GetString returning-- porque
Parece que non é retornando Daven, por si só,
porque seguro que non vai para caber neste pequeno box--
entón o que é GetString probablemente retornando?
>> Audiencia: [inaudível]
>> DAVID J. Malan: O lugar de Daven.
E ven a facer iso desde Primeira Semana.
O que é realmente GetString retornando non é unha cadea, per se.
Esa é unha das mentirinhas.
É volver a dirección do cadea na memoria, a dirección única.
Daven vive a 33 Oxford Street.
Pero de forma máis sucinta, Gavin vive en 0x1, Address Number One.
>> Entón, o que é colocado neste pequena caixa, a continuación, para ser claro,
é só a dirección desa cadea.
Entón todo este tempo, este vén pasando.
Pero o que iso suxire agora é que se todo s ten
é un número dentro do mesmo, que é para impedir-lo, o programador,
de poñer calquera número en calquera variable e só pulando
para que pedazo de memoria?
E, de feito, xa veremos iso é unha ameaza próxima vez.
>> Pero, de momento, isto parece insuficiente.
Se eu digo, arranxa-me un cadea, que me dar Daven.
Pero realmente non me dar Daven.
Todo o que me dá é a dirección de Daven.
Como podo entón saber de certo Daven onde comeza e ends--
a historia está quedando weird-- Daven onde comeza e remata,
e, a continuación, o seguinte secuencia na memoria comeza?
>> Ben, se está entregando me o inicio Daven,
esencialmente, como eu sei onde o fin do seu nome é?
Este personaxe nulo especial, que é aínda máis importante agora
se cordas debaixo do capo son simplemente identificados
exclusivamente pola súa situación na memoria.
Entón todo este tempo, que é o que está pasando.
>> Así, cando miramos agora en o código aquí, explicar
se faría o erro na liña 26.
Por que é Zamyla e Zamyla diferente?
¿Por que Gabe e Gabe diferente?
Si, na parte de atrás.
>> Audiencia: Teñen enderezos diferentes.
>> DAVID J. Malan: Simplemente porque eles teñen enderezos diferentes.
Porque cando chamar GetString de novo, o que eu vou facer rapidamente aquí,
se esta é a segunda liña, cadea t, como eu fixen ese programa,
é igual a outra chamada para GetString.
A próxima vez que eu chamo GetString, vou
para obter unha peza diferente de memoria.
>> GetString se permite pedir ao funcionamento
sistema para obter máis e máis memoria.
Non vai reutilizar o mesmo seis bytes cada vez.
Vai comezar un novo anaco de memoria, o que
significa t se ve algún outro valor aquí.
>> Entón, cando fago s é igual a = t, non está comparando
D contra este e contra A este e V contra este.
Está comparando este contra este, o cal
francamente é moi useless-- useful-- é inútil, porque o que realmente
importa onde as cordas están na memoria?
>> E, de feito, non temos.
E nós non imos iniciar particularmente cariñoso.
Só na medida en que os erros poden xurdir e as ameazas á seguridade poden xurdir vontade
nós realmente comezar a se preocupar con iso.
Entón imos corrixir este problema.
Acontece que, de corrixir-lo super sinxelo.
>> E imos de feito, antes de revelan que unha vez máis, o que sería
faría se nunha clase CS50, e tivo que aplicar
unha comparación con dúas cordas.
Vostede claramente non pode só usar s é igual a = t.
Pero, loxicamente, como Como comparar esta cadea
contra esa cadea utilizando o código C?
Si.
>> Audiencia: Só ten que facer o loop [inaudível]
DAVID J. Malan: Perfecto.
Audiencia: [inaudível]
DAVID J. Malan: Yeah.
Só ten que usar un loop ou un while ou o que quere.
Pero basta aplicar a idea básica de que, se este é un anaco de memoria ou un array
e este é, iterado os dous á vez.
E basta comparar as letras.
>> E ten que ser un pouco coidado, porque
Non quero un dedo para pasar a outra
porque unha cadea é máis que o outro.
Entón vai querer comprobar a este valor especial ao final, nulo.
Pero realmente é, na final, tan simple como iso.
E, francamente, nós non precisamos reinventar a roda.
Aquí é versión dous.
E o que eu vou dicir aquí é que no canto de comparar s é igual a = t,
Estou vez vai dicir si a cadea comparación de s coma t é igual a = 0.
Agora, o que é unha secuencia de comparación?
>> Acontece, é unha función que ven con C, cuxo propósito na vida
é comparar dúas cadeas.
E mexa comparar, se Lerma a súa páxina ou documentación ou CS50 home
referencia será simplemente dicirlle que mexa
comparar retorna un negativas número ou un número positivo ou cero,
en que cero significa que son iguais.
>> Polo tanto, só conxecturas.
O que isto pode significar que trasfega retorno comparar
valor negativo ou un valor positivo?
Audiencia: Maior ou menor que.
DAVID J. Malan: Si, superior ou inferior.
Entón, se quixese clasificar un todo grupo de cordas nun dictionary--
coma nós acabará por baixo do road-- función perfecta para utilizar potencialmente,
porque vai facelo comparación de cadeas para ti, e dicir
fai un vén antes de b, ou non b vir antes dunha orde alfabética.
Podemos facer exactamente isto.
>> E noten que eu fixen outro cousa neste exemplo.
Que máis cambiou maior nesta función principal?
Char *.
E esta é a outra mentira.
Todo este tempo, cando ten escrito corda,
fomos secretaría reescribir cadea como char * para que, en realidade, clang
comprende.
>> Noutras palabras, en CS50.h e como imos finalmente ver,
fixemos unha corda sinónimo chamado iso é o mesmo que char *.
E, polo momento, só sei que o *, Neste contexto, polo menos,
significa a dirección.
>> O enderezo de que?
Ben, o feito de que eu dixen char *, e non int * ou float *,
significa que char * é a dirección dun char.
Entón esa caixiña aquí, aka corda, é realmente o tipo char *,
que é simplemente un xeito elegante de dicir, nesa caixa vai un enderezo.
E que é o que a dirección se refire?
Ao parecer, un char.
>> Pero poderiamos absolutamente ten int * e outras cousas.
Pero, de momento, char * é realmente o máis simple e unha de interese.
Polo tanto, este problema vai a subir, a pesar de, outra vez.
>> Supoña que abrir este programa.
A ver se agora podemos predicir o que hai de malo con este código.
Entón, neste programa, copiar-0, estou indo para adiante e de novo chamar
GetString e almacenar o valor en s.
>> E entón, por que eu estou facendo iso, só como un recordatorio de semana pasado?
Fixemos dicir que GetString ás veces retorna nulo.
Que significa se GetString retorna null?
Algo deu mal.
Isto probablemente significa a secuencia é moi grande, fóra do ordenador de memoria.
Acontece super, super, super raramente, pero pode pasar.
Queremos comprobar a el, e iso é todo o que estamos facendo.
>> Porque imos ver agora, se non o fai comezar a comprobar habitualmente para as cousas
como nulo, que pode realmente comezar a ir
para enderezos na memoria que son válidos.
E vai comezar a inducir máis e máis fallos de segmentación.
Ou en un Mac ou PC, só facendo que un ordenador para colgar
ou un programa de conxelación, potencialmente.
>> Entón, agora, eu afirmo na copia-0.c, que eu vou copiar estas secuencias por medio
da liña 28.
E entón, eu vou a reivindicación, na parte inferior
aquí que vou para cambiar unha delas.
>> Entón, observe iso.
Vou chamar o noso vello amigo strlen.
E só explicar en inglés o que esta liña 34 está facendo?
O que fai t soporte 0 representan á esquerda.
Si.
>> Audiencia: primeiro carácter de t?
DAVID J. Malan: primeiro carácter de t.
É iso aí.
Primeiro carácter de t, quero para asignar a versión en maiúsculas
do primeiro carácter t.
Polo tanto, esta é a capitalización a primeira letra.
E, a continuación, o último que fago neste programa é eu reclamo aquí
o orixinal, é, e aquí está a copia, t.
>> Pero baseado na historia que acabamos de contou sobre o que realmente son cordas,
o que é realmente 28 liña facendo, eo que é
o erro resultante vai para ser exhibida na pantalla?
>> Entón, primeiro, a primeira pregunta, 28.
Que é cadea t = s realmente facendo?
Se temos na man esquerda banda aquí corda t = s;
que me dá unha caixa de aquí e unha caixa aquí.
E supoña que esta dirección é 0x, imos dicir, 50, esta vez, de forma arbitraria.
Que significa corda t = s facer debaixo do capó?
>> Audiencia: [inaudível]
>> David J. Malan: Almacena a memoria tratar alí, entón 0x50 vai alí.
Entón, agora, eu vou para o primeiro personaxe en t e maiúsculas que,
O que estou facendo de forma eficaz para s?
Realmente estou facendo o mesmo, non?
Porque se Enderezo 0x50-- e só, eu non ten moito espazo na tarxeta aquí,
pero supoñer que esta é 0x50 ata aquí, nalgún lugar na memoria do meu ordenador.
>> E eu, por exemplo, Gabe en minúscula aquí, así.
E teño dito soporte t 0 queda maiúscula.
Ben, t soporte 0 é a primeira letra t.
Tan pouco g vai tornar-se gran G. Pero o problema
é, o que s tamén apuntan?
>> Audiencia: O mesmo.
>> DAVID J. Malan: Exactamente o mesmo.
Así, unha explicación sinxela, quizais, aínda que a sintaxe é un pouco estraño.
Entón, imos facelo.
Facer copia-0 e, a continuación, ./copy-0.
Diga algo: Gabe.
E, por desgraza, os dous eles xa foron capitalizados,
pero para que, subxacente razón que estamos simplemente
agora a xestionar enderezos.
>> Entón, como imos comezar a address-- sen trocadilho intended--
como é que imos comezar a resolver este problema en particular?
Ben, en copy1.c, as cousas van a estar un pouco máis complicado.
Pero gustaríame reivindicar unha solución conceptualmente simple.
>> Tan difícil de chegar á primeira vista.
Non vai ser doado para o primeiro vez que escriba-lo, se cadra,
pero se o problema é que simplemente facendo t = s só
copia a dirección, o que, novo se podo pegar en ti,
vai ser a solución para realmente copiar unha cadea?
>> Audiencia: Nós probablemente utilizar un ciclo novo.
>> DAVID J. Malan: Yeah.
Entón, nós imos ter un loop de novo.
E por se quere copiar unha cadea s noutra secuencia,
que probablemente vai querer facelo carácter por carácter.
Pero o problema é que, se este é inicialmente s,
agora necesitamos comezar explicitamente distribución de memoria para t.
>> Noutras palabras, imos redeseñar unha última vez.
Se esta é a cadea s = GetString.
E imos poñer isto aquí, tamén.
Este é GetString.
E, a continuación, a imaxe de algo como que vai ser como antes,
g-a - b electrónico / 0.
Isto parece un pouco algo como isto.
E s por iso, chamamos iso de 0x50, e que será 51, 52.
>> Polo tanto, esta é 0x50.
E entón, fago corda t.
Na memoria, que só vai deixa-me un pouco cadrado así.
Entón, cal é o paso fundamental agora?
Se eu queira copiar s en t, o que baleiro que necesitamos cubrir aquí?
Ou o que necesitamos facer a un alto nivel?
Si?
Alguén?
Si.
>> Audiencia: Necesitamos [inaudível].
DAVID J. Malan: Si, nós que cubrir este campo en branco.
Eu non podo copiar e, a continuación, capitalizar o nome Gabe
ata eu pedir para o sistema operativo a outro anaco de memoria
que é polo menos tan grande como o orixinal.
Entón iso nos deixa con unha pregunta.
>> Como podo solicitar o sistema operativo non só para un pouco de Pointer simple
como esta é chamada, un dirección, a non Pointer
para unha caixa pequena e sinxela así chamado unha cadea?
Como podo solicitar o operativo sistema para unha gran parte da memoria?
Ata agora, eu só comecei isto de volta indirectamente chamando GetString.
Entón, como é GetString mesmo recibindo a súa memoria?
>> Ben, acontece que hai estoutra función aquí
que agora nós imos comezar a usar.
Agora, iso parece than-- forma máis críptica e eu son a única que pode ver ele--
esta liña parece moito máis enigmática entón debe a primeira vista.
Pero imos provocalo lo á parte.
>> No lado esquerdo, eu teño char * t.
Así, en inglés, imos comezar a formular apropiadas en argot técnico.
Polo tanto, esta é a concesión dunha variable do tipo char * chamado t.
Agora, o que iso realmente significa?
>> Ben, iso quere dicir que, o que eu vou poñer nesta variable chamada t?
Introduzca unha dirección de un char.
Entón, iso é só o máis simple, xeito máis razoable
de describir o lado esquerdo.
Así que crea esta caixa aquí só.
Entón, o lado dereito, presuntamente, vai
reservar que maior anaco de memoria como?
Entón, imos xogar con este apart.
>> É impresionante a primeira vista, pero o que está a suceder aquí dentro?
En primeiro lugar, hai malloc, que é, ao parecer, o noso novo amigo,
"Memoria reservar."
Polo tanto, este é o argumento que está a ser pasado para el, polo que é un argumento moi grande.
Entón, imos xogar con este apart.
>> strlen de s, claro, representa o--
Audiencia: O número de caracteres.
DAVID J. Malan: Só o número de caracteres en s.
Así, a lonxitude de s, a cadea orixinal.
Así G-a-b-e.
Entón pode ser catro neste caso.
Por que estou facendo un despois chamando strlen de s?
Audiencia: [inaudível]
David J. Malan: Para iso carácter especial nulo.
Se me preguntar cal é a lonxitude de O nome de Gabe, eu vou dicir catro.
Debaixo do capó, porén, eu teño que o quinto byte ao carácter nulo.
Entón é por iso que eu estou facendo o 1.
>> Agora é só no caso de que vostede está executando este programa nun ordenador diferente, digamos,
o aparello CS50, en que o tamaño dun char
pode ser diferente da miña propia Computador--
Acontece que podo chamar iso de sizeof operador, é só pedir o ordenador,
o que é o tamaño dun carbonizar neste ordenador?
>> E multiplicando cinco neste por exemplo o tamaño dun carbón animal, que
na maioría dos ordenadores vai ser só un, malloc
vai destinar para min este gran anaco de memoria aquí á dereita.
E iso vai return-- é unha function-- polo que é
vai voltar a min o que?
Audiencia: O enderezo?
DAVID J. Malan: O enderezo de que?
Audiencia: É a memoria que alocados?
DAVID J. Malan: Do memoria que asignado.
Entón, eu non teño ningunha idea, francamente, onde é que isto vai acabar.
Vou propoñer que iso vai acabar en 0x88.
Completamente arbitrario, pero nalgún lugar diferente 0x50,
porque o sistema operativo, o Windows e Mac OS facer para min, é
asegurarse de que está dando me diferentes anacos de memoria RAM.
>> Polo tanto, este é o valor que esta anaco de memoria pode acabar.
Entón é iso que acaba por aquí, 0x88.
Entón, agora claramente, podo entender que este non é o mesmo como esta,
porque están apuntando para diferentes anacos de memoria.
Entón, se eu agora realmente desexa eliminar esta en, imos facer a solución proposta.
>> Imos aínda, cree un loop for, e facer soporte t i recibe soporte s i.
Porque agora podo usar esta notación de matriz-like,
porque aínda que malloc moi xenericamente me atribúe memoria,
bytes de memoria é só contiguos.
Byte, byte, byte, back to back to back.
>> Podo certamente como un programador tratala como unha matriz, que
significa que podo usar este fin familiarizado notación de só uns corchetes.
>> Entón deixe-me facer unha pausa alí, porque este é un lote dunha soa vez, ata
aínda que a idea básica para recapitular é esa cadea, todo este tempo,
non é un novo tipo de datos per se.
É só un punteiro chamado, un enderezo dun personaxe,
que significa que é un número que, por convención, humano
que tenden a escribir como 0x algo.
>> Pero é só un número, como 33 Oxford Street,
que pasa a ser o Enderezo do CS edificio.
Calquera dúbida sobre estes detalles?
Si?
>> Audiencia: Por que nós encontramos facer para t igual a nulo?
>> DAVID J. Malan: Por que comprobar a existencia de t igual a nulo?
Se Lerma o documentation-- gran pergunta-- para malloc,
vai dicir en letras miúdas, ás veces malloc pode devolver nulo,
así como GetString.
E, de feito, GetString retorna null se, á súa vez, malloc retorna nulo,
porque GetString usa malloc.
>> E isto pode ocorrer se o sistema operativo, Mac OS, Windows, calquera que sexa, é simplemente
falta de memoria para ti.
Entón, iso é o que pasou alí.
>> E déixeme revelar outra cousa que só podería explotar a súa mente
ou totalmente estar moi encima da liña.
Pero déixeme puxar arriba o mesmo lazo é para copiar,
que hai un momento, a retirada foi este. soporte t i recibe soporte s i.
>> Nice and amigable.
Parece Week Two novo.
Pero esta versión, de feito, pode ser reescrita como este, que parece enigmática.
É un punteiro técnica chamada aritmética, aritmética enderezo.
Pero por que isto funciona?
>> Agora irritante, o C autores decidiron utilizar
símbolo * para fins distintos.
Xa vimos que usa xa xa, char *, que significa "me dea unha variable
que vai conter a dirección dun char. "
* Entón carácter en que contexto significa "me dea unha variable."
>> Desafortunadamente, se usa o * sen unha palabra fronte do mesmo, como carbón,
agora chámase operador de dereferência.
E veremos máis desta antes de tempo.
Pero iso só significa "ir máis alá".
É como dicir que, se alguén me entregou nun anaco de papel "33 Oxford Street,"
se eu fai "* 33 Oxford Street", que significa "Baixar a estrada para a construción CS."
>> Entón * significa só ir alí se non hai ningunha palabra diante del.
Entón, o que é t, para ser claro?
t é a dirección do bloque de memoria que foi dado de volta para min.
s é a dirección de que, para ser claro, no exemplo que estamos discutindo,
Gabe e minúsculas?
s é a dirección de--
Audiencia: A cadea.
DAVID J. Malan: É o nome orixinal de Gabe.
Entón, é a dirección de este anaco de memoria.
Entón, se eu digo t + i-- i, o aviso previo, é só o noso vello amigo.
É só unha variable de índice que é a iteración de cero enriba
ao longo da cadea s.
Por iso, será cero, a continuación, un, despois dous, despois tres, despois catro.
Entón, imos montar estes novos O enigma de raspadinhas-like, se quere,
a pesar de, de novo, a sintaxe é moito máis misterioso do que cero.
Entón t é un enderezo + i me vai dar
un número, porque estes son todos números que vimos deseñar como hex.
Pero son só números.
>> Entón, se o enderezo de t dixemos era 0x88, que é 0x88 máis cero.
Mesmo se non está cómodo con hex aínda, dar un palpite.
>> Audiencia: O orixinal.
>> DAVID J. Malan: Aínda 0x88.
Entón, o que * 0x88 significa?
É dicir, "ir alí", que significa efectivamente, "poñer o dedo aquí."
E agora no lado da man dereita de esta expresión, * e, a continuación, en parénteses,
s + i significa s, que é o tratar-se aquí da pequena g.
s +0 é, por suposto, é, todo o que é s.
>> Entón, agora, é * s, que así como * 33 Oxford Street significa ir ao enderezo
s.
Entón aquí está este dedo, a man dereita.
Entón que é o que eu vou copiar o que?
A cousa sobre o dereito, que é Gabe, pouco g aquí, para aquí.
>> E así o efecto de que primeira iteración do bucle,
como proposto, aínda que pareza tolo máis complicado do que calquera cousa
que xa vimos antes, está simplemente dicindo prema aquí e copie este personaxe aquí.
É o que lle dá un mapa para ambos os lugares.
>> E veremos moito máis diso.
Pero, por agora, a esperanza é só para introducir algunhas destas ideas básicas.
E, de feito, vexamos un programa de final aquí,
e entón o claymation prometido, que pode facer todo certo.
Todo correcto.
Entón deixe-me abrir up-- alí imos nós.
Entón imos me-- imos volver a ese cadro antes de tempo.
Déixeme abrir este último exemplo aquí.
>> Entón aquí vai unha super, super programa que realiza
nada na vida que fai o seguinte.
En primeiro lugar, el declara dúas variables, x e y, que non son números este tempo,
per si.
Eles non están enteiros, per se.
Son aparentemente int *.
Entón, calquera, o que significa Se o tipo de datos, a súa variable,
é do tipo int * star?
Este é o enderezo dun int.
>> Entón, eu non teño ningunha idea de onde é aínda.
Significa só "poñer, finalmente, a dirección dun int aquí. "
0x50, 0x88, onde queira que sexa en memoria, un enderezo está pasando alí.
E iso é o que y é será, tamén.
>> Se eu agora dicir x = malloc (sizeof (int)), esta é un xeito elegante de dicir,
hey sistema operativo, vía malloc, dáme a memoria suficiente para o tamaño
dun int, que é probabelmente será de 32 bits ou catro bytes.
>> Entón, o que malloc voltar?
Malloc retorna un enderezo.
Entón, o que vai ser almacenado en x?
O enderezo do bloque de memoria, os catro bytes, que malloc
só atopei para me pregunta o sistema operativo.
>> Agora, con todo, a liña catro aquí, a * x = 42.
Só para quedar claro, o que está pasando alí embaixo?
Na parte esquerda, * x.
que é como * 33 Oxford Street.
Entón * x significa o que?
>> Audiencia: Vaia.
>> DAVID J. Malan: Vaia a este enderezo.
Onde queira que ese anaco de memoria é, ir a el.
E poñer o que hai, obviamente?
Audiencia: 42.
DAVID J. Malan: 42.
Todo ben, * y, mesma idea.
Ir ao enderezo en y.
Pon o número 13 alí, pero o que é y no momento?
Audiencia: Non hai memoria para y.
DAVID J. Malan: Non hai memoria para y.
Entón, o que fai y probablemente conter, como vimos dicir?
>> Audiencia: Garbage.
>> DAVID J. Malan: Algún valor de lixo.
Agora, o valor de lixo aínda é un número.
El aínda pode ser confundido cun enderezo.
É como se alguén rabiscos algo,
e eu mal interpretado como significando un edificio ao final da rúa.
E se só tentar entrar un edificio que non posúe,
ou algún anaco de memoria que non ten foi dado, as cousas malas poden ocorrer.
Ordenador pode fallar, ou algún outro comportamento indefinido pode pasar.
>> Así, a introdución, a continuación, para Binky é iso.
Eu aínda me lembro, 20 tantos anos despois,
onde estaba cando finalmente comprendida punteiros.
>> O que quere dicir, se deixe aquí en tres minutos
e creo que non entender punteiros, entender
Teño lembrado por 20 anos, por algunha razón tolo
cando e por que finalmente afundido en, sentado co meu ensino
compañeiro, Nishat Mehta no redor de Eliot Comedor.
Agora, eu me lembrei iso porque foi
un dos temas I, en particular, loitou con.
E entón, finalmente premendo, como eu ouso dicir unha chea de temas
acabará.
E agora, para facer que sentir toda a máis feliz e todo o máis convincente,
imos dar un ollo final na nosa últimos tres minutos aquí no Binky,
do noso amigo, Nick Parlante de Stanford.
>> [REPRODUCIÓN]
>> Ei, Binky.
Acorde!
É hora de diversión punteiro.
>> -Cal Que é iso?
Máis información sobre punteiros?
Ah, que bo!
>> Ben, para comezar, creo que estamos Vai ter un par de punteiros.
>> -OK.
Este código aloca dous punteiros, que pode apuntar a números enteiros.
-OK.
Ben, eu vexo os dous punteiros, pero eles non parecen estar apuntando para calquera cousa.
>> -É Dereita.
Inicialmente, os punteiros non apuntan para nada.
As cousas que eles apuntan chámanse pointees, e configuralo los de
un paso separado.
>> Ah, non, non.
Eu sabía.
Os pointees son separados.
Er, así como reservar unha pointee?
>> -OK.
Ben, este código aloca un novo pointee enteiro,
e iso define Parte X para apuntar para el.
>> Ei, que parece mellor.
Entón el facer algo.
>> -OK.
Vou cancelar o punteiro x para almacenar o número 42 na súa pointee.
Para este truco, eu vou ter a miña Varinha Máxica de desreferenciação.
>> -O Seu Magic Wand de Dereferencing?
Que-- iso é óptimo.
>> -Este É o que o código se parece.
Eu só vou definir o número, e [POP]
>> Ei, mira.
Non vai.
>> Entón Facendo un desreferenciava en x segue a frecha para ter acceso ao seu pointee.
Neste caso, unha tenda de 42 en alí.
Hey tentar usalo para almacenar o número 13 a través do outro punteiro, y.
>> -OK.
Vou pasar por riba aquí para y, e obter o número 13 set up.
E, a continuación, tome a vara de Dereferencing e só [Buzz]
>> Ah!
>> Oh, hey!
Isto non funcionou.
Diga, Binky, eu non creo que dereferencing y é unha boa idea, xa sabedes,
creación do pointee é un paso separado.
E eu non creo que nunca fixen iso.
>> Punto -Boa.
Si.
Alocamos o punteiro y, pero nós nunca define-lo para ligar a un pointee.
>> -Moi Observador.
Ei, está mirando bo alí, Binky.
Pode resolve-lo así que os puntos y ao mesmo pointee como x?
>> -sure.
Vou usar a miña vara máxica Punteiro de Cesión.
>> -É Que será un problema como antes?
-No.
Este non toca nos pointees.
El só cambia un punteiro para apuntan o mesmo que o outro.
>> Oh, eu vexo.
Agora y apunta para o mesmo lugar que x.
Entón, agarde.
Agora, y é fixo.
Ten un pointee.
Entón podes probar o Wand of Dereferencing novo para enviar a 13 terminado.
>> Uh, Aceptar.
Aquí vai. [POP]
>> Ei, mira isto.
Agora dereferencing obras sobre y.
E por que os punteiros están compartindo que un pointee, ambos ver o 13.
Si.
Compartindo, calquera que sexa.
Entón, imos cambiar de lugar agora?
>> Oh, mire.
Estamos sen tempo.
>> -Mais
>> -Basta Recordar as tres regras de punteiro.
Number One, a estrutura básica é que ten un punteiro,
e apunta máis a un pointee.
Pero o punteiro e pointee son separados,
e o erro común é a creación dun punteiro,
pero esquecerse de darlle un pointee.
>> Número Dous, dereferencing punteiro comeza o punteiro
e segue a súa frecha sobre para ter acceso ao seu pointee.
Como todos sabemos, este só funciona se hai
un pointee, que tipo de recibe de volta a regra número un.
>> Número Tres, punteiro asignación é un punteiro
e cambia-lo para apuntar para o mesmo pointee como outro punteiro.
Así, tras a concesión, os dous punteiros
pode apuntar para o mesmo pointee.
Ás veces, iso é chamado de reparto.
E iso é todo o que existe para ela, realmente.
Bye-bye agora.
[FIN REPRODUCIÓN DE VIDEO]
DAVID J. Malan: Isto é todo para CS50.
Imos velo a próxima semana.