>> [REPRODUCCIÓ DE MÚSICA]
DAVID J. Malan: Molt bé.
Això és CS50, i això és el cap de setmana quatre.
I un dels temes avui és el de la ciència forense digital,
l'art de la recuperació de la informació.
I, en efecte, tot i que vostè està en el medi
en aquests moments de la Pau a Tres i Breakout, la setmana que ve,
l'atenció se centrarà en precisament aquest domini.
>> Així que un dels treballs més meravellosos que mai tenia estava de tornada a l'escola de postgrau,
quan treballava per al local de Middlesex County District Attorney de
oficina, fent els forenses treballen.
Així que, essencialment, el Massachusetts Policia de l'Estat, en ocasions,
quan es treballa en els casos faria portar coses com discs durs
i disquets i targetes de memòria i similars.
I se'ls lliurés per a mi i el meu mentor,
i el nostre objectiu era trobar proves, si hi havia alguna, en aquests mitjans.
Indicis Ara, és possible que hagi vist d'aquest món de la ciència forense
en els mitjans de comunicació, la televisió i les pel · lícules.
Però el treball que tenia, i m'atreviria a dir que aquest món,
no és prou com vostè veurà.
Fem una ullada al que el que has vist.
[REPRODUCCIÓ DE VÍDEO]
-ok.
Ara, anem a obtenir un bon cop d'ull.
>> [REPRODUCCIÓ DE MÚSICA]
>> -Mantenir Ella.
Corre de tornar.
>> Espera un minut.
Anar a la dreta.
Hi ha.
Congeli això.
De pantalla Full.
>> -ok.
Congeli això.
Endurirà fins en això, oi?
>> -vector En el qual noi per la roda del darrere.
>> -Zoom En aquí en aquest lloc.
>> -Amb L'equip adequat, la imatge es pot ampliar i afilada.
>> Què és això?
>> És un programa de millora.
>> -Pots Clar que qualsevol?
>> No Sé.
Anem a millorar-lo.
>> Millorar Secció A6.
Vaig augmentar el detall, y--
Crec Hi ha prou per millorar.
Deixeu anar a la meva pantalla.
>> -I Va millorar la reflexió en el seu ull.
-Anem Executar això a través de millora de vídeo.
>> -Edgar, Pots millorar això?
>> -hang Successivament.
>> -Fa Treballant en aquesta reflexió.
>> Reflexió d'algú -Hi.
>> Reflexió.
Hi ha un reflex de la cara de l'home.
>> Reflexió -El!
Hi ha una reflexió.
-Zoom En el mirall.
Es pot veure un reflex.
>> -CAN A millorar la imatge d'aquí?
-CAN A potenciar?
-Podem Millorem això?
-CAN A potenciar?
-Mantenir En un segon.
Vaig a Millorar.
-Zoom A la porta.
-veces 10.
-Zoom.
-Moure En.
-Més.
Espera, atura't.
-STOP.
-PAUSE Ella.
Ens -Girar 75 graus al voltant de la vertical, si us plau.
>> -STOP.
Tornar a la part sobre la porta de nou.
>> -va Una millora d'imatge de mapa de bits que poden?
>> -Potser Podem utilitzar el Pradeep Singh mètode per veure per les finestres.
>> -El Software és estat de la tècnica.
>> -El Valor propi està apagat.
>> -Amb La dreta combinació de algorithms--
>> Il · luminació portat de -Ell algoritmes per al següent nivell,
i puc utilitzar-los per millorar aquesta fotografia.
>> -lock En engrandir i l'eix z.
>> Millorar.
Millorar.
-Freeze I millorar.
[FI REPRODUCCIÓ DE VÍDEO]
DAVID J. Malan: Així que aquests són totes les paraules, però no eren
usat en oracions correctament.
I de fet, en el futur, en qualsevol moment, si us plau, escolti algú dir la paraula,
"Millorar" riure una mica.
Perquè quan es tracta de millorar, per exemple, això és el que passa.
>> Així que aquí està una foto magnífica.
Això és propi de Daven CS50.
I suposem que volíem centrar-se en la brillantor en els seus ulls,
o el reflex de la dolent que era clarament
capturat per la càmera de seguretat.
Això és el que passa quan fer zoom en una imatge que
té només un nombre finit de bits associats.
>> Això és el que pots aconseguir.
I, en efecte, a l'ull de Daven no és més que 4, potser sis píxels
que componen exactament el estava brillant allà.
Així de problemes Quatre tindrà en última instància explorar aquest món, en particular
per la naturalesa d'alguna cosa que anomenem arxiu i / o, si
I / O és només una forma elegant de dient d'entrada i sortida.
>> Així fins al moment, totes les interaccions que hem tingut amb un ordinador
han estat en gran part amb el seu teclat i la pantalla,
però no tant amb el disc dur, o l'estalvi dels arxius més enllà dels quals
mateix escriu.
Els seus programes fins ara tenen no estat creant, i l'estalvi,
i l'actualització dels seus propis arxius.
>> Bé, què és un arxiu?
Bé, alguna cosa així com un arxiu JPEG.
Aquesta és una imatge que et poden tenir o pujar a Facebook,
o veure qualsevol part del web.
De fet, aquesta foto que acabem de serra de Daven era un JPEG.
I el que és interessant sobre els arxius, com els arxius JPEG
és que poden ser identificades, típicament, mitjançant certs patrons de bits.
>> En altres paraules, ¿què és el que distingeix un JPEG des d'un GIF
des d'un PING des d'una Paraula document d'un arxiu d'Excel?
Bé, és simplement diferent patrons de bits.
I aquests patrons són diferents en general en l'inici d'aquests arxius.
>> Així que quan l'equip obre una Paraula doc, o quan un equip s'obre un arxiu JPEG,
es veu normalment en la primer diversos bits a l'arxiu.
I si es reconeix un patró, que diu, oh, això és una imatge.
Permetin-me exhibeixo a l'usuari com un gràfic.
O, oh, això s'assembla a un document de Word.
Déjame mostrar a l'usuari com un assaig.
>> Així, per exemple, arxius JPEG, Resulta que són
bastant sofisticat sota de la caputxa.
Però els tres primers bytes en la majoria de cada JPEG començar amb aquests tres nombres.
Així byte zero, un, i dos són, en la majoria de cada JPEG, 255, llavors el nombre
216, llavors el nombre 255.
>> I el que podràs per començar a fer la setmana vinent
en realitat està ficant sota el capó d'arxius com fitxers JPEG
i igual que els arxius de mapa de bits, i veure El que sempre ha estat aquí tot el temps
com vostè ha estat utilitzant un ordinador.
>> Però el que hi ha allà no és típicament escrita com nombres decimals com aquest.
Els informàtics no fan tendeixen a parlar en decimal.
En realitat, no parlen en binari.
Normalment, quan volem per expressar nombres,
realment fem servir hexadecimal, que vostè pot recordar
de, per exemple, de problemes Un, que va desafiar
a pensar en un sistema diferent.
>> Nosaltres, per descomptat, estem familiaritzats amb decimals, del zero al nou.
Parlem d'binari.
I nosaltres realment no tenim d'usar que molt aquí
des d'ara, perquè els ordinadors que utilitzaran.
Però els programadors ho farà molt sovint, però no sempre,
utilitzar hexadecimal, que només significa vostè té 16 lletres en el seu alfabet,
en lloc de dos o 10.
>> Llavors, ¿com explicar a un major de nou de cada hexadecimal?
Vas 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, només per convenció.
Però el que és fonamental és que cada d'ells és un sol símbol.
No hi ha 10.
No hi ha 11, per se, ja que cada de les seves xifres, igual que en decimal
i igual que en el sistema binari, només ha ser un sol caràcter, per convenció.
>> Així que a continuació és l'alfabet que tenim a la nostra disposició per hexadecimal.
Així que el que té un aspecte una JPEG com si eren per escriure els tres primers
No bytes com decimal, però, per exemple, com hexadecimal?
I per què és hexagonal fins i tot tan útil?
>> Bé, una ràpida ullada a un exemple.
Així que si jo escric els bits que representar aquests numbers-- decimal
això pot resultar una mica rovellat ara des de fa unes setmanes,
però el de l'esquerra i la dret són bastant fàcil.
255 era el nombre més gran que podria representar amb vuit bits.
Va ser tot uns.
Així que l'únic que està lleugerament interessant és el del mig.
I si ho fas tipus de la matemàtiques, es dedueix que, de fet,
que el patró d'una i zeros representa 216.
Així que anem a estipular ara que aquests són correctes.
Però per què és interessant?
>> Bé, un byte, per descomptat, és de vuit bits.
I resulta que si vostè pensa d'un byte com dos trossos de quatre bits,
com aquest.
Voldria afegir una mica d'espai.
Així que abans, després.
Acabo d'afegir una mica d'espai en blanc per l'amor de la visualització aquí.
Com podem ara representar a, diguem, hexadecimal cada quad de bits,
cada conjunt de quatre bits?
>> Així, per exemple, a l'esquerra ara, tenim 1111 en binari.
Quin és aquest nombre en decimal, si ho fa fora de les matemàtiques?
Vostè té el lloc de les unitats, el lloc de dos en dos, el lloc de quatre grapes, i el lloc vuits.
>> AUDIÈNCIA: 15.
DAVID J. Malan: És 15.
Així que si ho fem huit més 4 més dos més un, obtenim 15.
Així que podria anotar 15 infra 1111, però el punt aquí
és hexadecimal, no decimal.
Així que en lloc d'escriure 15, 1-5, Vaig a escriure que en hexadecimal,
que si pensa tornar, si vostè té zero a través de f, que 15 serà?
AUDIÈNCIA: f.
DAVID J. Malan: Així que resulta que de l'f.
I vostè pot treballar en això, dient: així, si a és 10, llavors bé, f és de 15.
Així que de fet, podríem reescriure Aquest mateix conjunt de nombres com f f.
I després, si fem una mica de matemàtiques, anem a deduir que això és d.
Vuit és bastant fàcil, ja que tenir un un al lloc vuits.
I després, tenim un parell més de f f.
>> Així que el que els humans tendeixen a fer per convenció quan utilitzen hexadecimal és simplement
escriure això una mica més succinta, desfer-se de la major part d'aquest espai en blanc.
I només per ser súper clar per lectors que aquesta és hexadecimal,
simple convenció entre els éssers humans li escriuen zero
x, que no té un altre significat d'un identificador visual de,
aquí ve un nombre hexadecimal.
>> I llavors, de posar els dos dígits, f f en aquest cas, a continuació, d a, llavors f f.
Així que conte llarg, hexadecimal només tendeix
per a ser útil perquè cadascun dels seus dígits, del zero al f, perfectament línies
amb un patró de quatre bits.
>> Així que si vostè té dos dígits hexadecimals, zero a la F, i una altra,
que li dóna a la perfecció vuit bits o un byte.
Així que per això es tendeix a ser útil convencionalment.
No hi ha intel · lectual contingut realment més enllà d'això,
a part de la seva utilitat real.
>> Ara els fitxers JPEG no són l'única formats d'arxius de gràfics.
Vostè pot recordar que hi ha arxius d'aquest tipus al món,
almenys des de fa uns anys.
>> Així que això era en realitat instal · lat en Windows XP
en milions d'ordinadors de tot el món.
I aquest era un arxiu de mapa de bits, BMP.
I un arxiu de mapa de bits, com es veurà el proper setmana, només significa un patró de punts,
píxels com se'ls anomena, un mapa a partir dels bits, de veritat.
>> Així que el que és interessant, però, sobre aquest format d'arxiu, BMP, és
que sota la capella, que compta amb més de només tres bytes
que componen la seva capçalera, de manera parlar, els primers mossos.
En realitat es veu una mica complicat a primera vista.
I veurà això en el conjunt P.
I aconseguir alguna cosa en particular d'aquesta empresa
que no és tan important, ja que només el fet de que al començament de cada mapa de bits
arxiu, un format gràfic, hi ha tot un munt de nombres.
>> Ara Microsoft, el autor d'aquest format,
tendeix a cridar als Les coses no sencers i caràcters
i flotadors però les paraules i d paraules i llargs i bytes.
Així que són només diferents tipus de dades.
Són diferents noms per a la mateixa cosa.
Però veuràs que a P setembre Four.
>> Però això és només per dir que si un ésser humà doble clics algun arxiu BMP en el seu
o el seu disc dur, i una finestra s'obre fins a ell o ella que la imatge que mostra,
això va succeir perquè l'operatiu sistema presumiblement va notar no només
l'extensió d'arxiu BMP en el nom del fitxer,
sinó també el fet que hi ha una mica de convenció per al patró de bits
en el començament d'aquest arxiu de mapa de bits.
>> Però ara ens centrarem en un arxiu complicada tal,
sinó en alguna cosa com això.
Suposem que aquí a gedit, I només tenen els inicis
d'un programa que és bastant simple.
Tinc una mica inclou fins a dalt.
Ara tinc "structs.h" # include però Vaig a tornar a això en un moment.
Però això és útil per ara.
Així que aquest és un programa això va a aplicar
com la base de dades del registrador.
Així que una base de dades dels estudiants, i tots els estudiants en el món
té un nom i una casa i probablement alguns altres coses, però anem a mantenir les coses simples.
Cada estudiant té un nom i una casa.
>> Així que si jo volia escriure una programa el propòsit a la vida
va ser simplement per recórrer des zero en un màxim de tres,
si hi ha tres estudiants a la Universitat de Harvard.
I jo només vull arribar, mitjançant GetString, el nom de cada estudiant i de la casa,
i després simplement imprimir aquells terme.
>> Això és una mena de Setmana Un, Setmana Dues coses ara,
on jo només vull una per bucle o alguna cosa per l'estil.
I vull cridar GetString alguns vegades i, a continuació, s'imprimeixen f diverses vegades.
Llavors, ¿com podria jo fer això, però, quan un nom i una casa
estan involucrats per a cada estudiant?
>> Així que el meu primer instint podria la de fer alguna cosa com això.
Jo podria dir primer, bé, dóna'm, dir, una matriu de cadenes anomenats noms.
I jo no vull un hardcode tres aquí.
Què vull posar-hi?
Perquè els estudiants, perquè això és només una constant declarada a la part superior,
només perquè jo no he de codificar tres a múltiples llocs.
D'aquesta manera, puc canviar un sol lloc, i que afecta un canvi a tot arreu.
I llavors, jo podria fer cadena alberga ESTUDIANTS.
>> I ara, jo podria fer alguna cosa com for (int i = 0; i <ESTUDIANTS, i ++.
Així que estic escrivint ràpid, però això és probablement sintaxi familiar ara.
>> I ara, això era més recent.
Si vull posar en l'i-th el nom de l'estudiant, crec que faig això.
I llavors, no noms però les cases mènsula.
Faig això, GetString, i deixo em tornar enrere i corregir aquesta línia.
D'acord?
En desacord?
No és molt fàcil d'utilitzar.
No li he dit a l'usuari què fer.
>> Però ara, si jo també volia més tard, anem a
diguem, imprimiu aquestes coses sortir-- TOT el més tard.
Vaig a fer més amb esto-- aquest és sens dubte
una correcta aplicació de la aconseguir noms i cases, 03:00
d'ells total de cada un, d'un usuari.
>> Però això no és molt bon disseny, no?
Què passa si un estudiant té no només un nom i una casa, però també un nombre d'identificació,
i un nombre de telèfon, i una adreça de correu electrònic,
i potser una pàgina d'inici, i potser un mànec Twitter,
i qualsevol nombre d'altres detalls associada a un estudiant o una persona,
de manera més general.
Com podem començar a afegir funcionalitat d'aquest programa?
>> Bé, sento que la manera més simple podria ser per fer alguna cosa com, diguem,
int ids ESTUDIANTS.
Així que puc posar tots els seus documents d'identitat en aquest país.
I llavors, una cosa com números de telèfon,
No estic segur de com representar això encara.
Així que seguirem endavant i simplement anomenada aquest twitters ESTUDIANTS, que
és una mica estrany, pero-- i un munt més camps.
>> He començat a amb eficàcia copieu i enganxeu aquí.
I això creixerà bastant difícil de manejar bastant ràpid, oi?
¿No seria agradable si hi havia al món una estructura de dades coneguda
no com un int o una cadena, però alguna cosa nivell superior, una abstracció, per la qual
parlar, coneguda com a estudiant?
C no va venir amb una funció de funcionalitat per als estudiants,
però el que si volia donar-li tal?
>> Bé, resulta que vaig a obrir un fitxer anomenat structs.h aquí,
i vostè pot fer exactament això.
I anem a començar a fer això ara.
I sota de la caputxa de P Set de tres, que ja ha estat fent això ara.
No hi ha tal cosa com un g rect o 1 g ovalada en el llenguatge de programació C.
>> La gent a Stanford implementen els tipus de dades mitjançant l'ús d'aquest enfocament aquí,
declarant la seva pròpia noves dades tipus utilitzant una nova paraula clau
anomenada struct i un altre un anomenat typedef.
I de fet, tot i que la sintaxi es veu una mica diferent de les coses
que hem vist abans, en principi, és super simple.
>> Això només vol dir "definir un tipus."
Això serà un estructura, i una estructura
és com un contenidor per a múltiples coses.
I aquesta estructura es va tenir una cadena anomenada nom,
i una cadena flama casa.
I anem a cridar, només per conveniència, tot aquest estudiant estructura de dades.
>> Així que el moment en què arribi a el punt i coma, que té ara
creat les seves pròpies dades tipus anomenat estudiant
que ara està al costat de int, i el flotador, i char, i la cadena,
ig rect, i g oval, i qualsevol nombre d'altres coses que la gent ha inventat.
>> Així que el que és útil sobre ara és que si torno
a struct 0 i acabar aquest aplicació, que vaig escriure
per avançat aquí, observi que tots del desordre inevitable que
estava a punt de començar a succeir com vaig agregar números i twitters de telèfon i tot
aquestes altres coses definició d'un estudiant,
ara està succintament concloure tan sols una varietat d'estudiants.
>> I cada un d'aquests estudiants ara té diverses coses dins d'ella.
Així que només deixa una pregunta.
Com s'arriba al nom, i la casa, i la ID,
i per tot el que interior de l'estudiant?
Súper simple, també.
Nova sintaxi, sinó una idea simple.
>> Simplement índex en la matriu, com ho vam fer la setmana passada i aquesta.
I el que és clarament la nova peça de sintaxi?
Just., Que significa "anar dins la estructura i fer el camp anomenat
nom, obtenir el camp anomenat casa, obtenir el camp anomenat estudiant ".
>> Així que en el conjunt P de tres, si ets segueix treballant en això,
i la majoria de la gent encara són, adonar-se que a mesura que
començar a utilitzar coses com g rectes i g ovals
i altres coses que no semblen provenir de la Setmana Zero, un, o dos,
s'adonen que això és perquè Stanford declarat alguns nous tipus de dades.
>> I de fet, això és exactament el que farem fer, així, en el conjunt P de Cuatro, quan
vam començar a tractar amb les coses com imatges, mapes de bits i molt més.
Així que això és només un avanç i un model mental del que està per venir.
Ara, he demorat una mica aquest matí.
Jo era una mena de curiositat per veure el que el fons de pantalla Microsoft realitat
sembla que avui.
I resulta que algú el 2006 en realitat va ser gairebé exactament
el mateix lloc per fotografiar a la realitat el que sembla que en aquests dies.
El camp és ara una mica de mala herba.
>> Així que parlar ara de les imatges, anem a portar de tornada a Daven aquí
a la pantalla i Nicholas, i just recordar
que si voleu unir-se a nosaltres per dinar aquest divendres, el cap a la nostra adreça habitual
Aquí.
>> Llavors, on ens deixem fos el dilluns?
Hem introduït aquest problema, oi?
Aquest va ser aparentment una correcta implementació de swap,
mitjançant el qual es pren dos enters, una crida, una crida b,
intercanviar, igual que Laura va fer aquí a l'escenari amb la llet i l'aigua,
mitjançant l'ús d'un temporal variable o una tassa buida,
perquè poguéssim posar b en una i una a b sense fer un embolic de coses.
Es va utilitzar una variable.
Es diu temp.
>> Però el que era la fonamental problema amb aquest codi dilluns?
Quin va ser el problema?
Sí.
>> AUDIÈNCIA: Es necessita més espai.
>> DAVID J. Malan: ocupa més espai, perquè estic fent servir una variable,
i això està bé.
Això és cert, però estic dirà que està bé.
És a 32 bits en la gran esquema de les coses, així que no és gran cosa.
Altres pensaments?
AUDIÈNCIA: Només s'intercanvia les variables a nivell local.
DAVID J. Malan: Exactament.
Només canvia les variables de forma local.
Perquè cada vegada que et truqui un function-- quan vaig tenir les safates de Annenberg
l'última vegada, tens principal a la part inferior.
Tan aviat com es crida a una funció anomenada intercanvi, bescanvi no obté x i y,
els valors originals.
Què significa intercanvi get, ens reclamem?
AUDIÈNCIA: Còpies.
DAVID J. Malan: Així còpies d'ells.
Així es posa un i dos, si recordar l'exemple de l'última vegada,
però una còpia d'un i dos que s'intercanvien amb èxit.
Però, per desgràcia, al final, aquests valors segueixen sent els mateixos.
Així que podem veure això amb la nostra nou amic, espero GDB,
que vostè o els TFS i Ca de tenir estat guiant cap a la següent manera.
>> Així que no hi ha memòria d'intercanvi es veu com-- anem obrir esto-- són aquestes.
Inicialitzem x per un, i per a dos.
Tenia un munt d'impressió de f.
Però llavors, l'anomenada clau aquí calia canviar, que
és exactament el que el codi acabo de veure fa un moment.
Què és correcta en primera vista, però funcionalment,
aquest programa no funciona, perquè no intercanviar de manera permanent x i y.
>> Així que vegem això, un escalfament ràpid fins aquí amb el BGF, un ./noswap.
Un munt d'informació aclaparadora que Em desfaré de L amb control per ara.
I ara, me'n vaig a seguir endavant i executar-lo.
I, per desgràcia, que no era tan útil.
Es va córrer el programa dins d'aquest programa anomenat GDB, un depurador,
però no em va deixar furgar.
>> Llavors, com puc realment fer una pausa execució dins d'aquest programa?
Així trencar.
I podria trencar en qualsevol número, un, 10, 15 de línia.
Però també puc trencar simbòlicament dient ruptura principal.
I això va a establir un descans punt, pel que sembla, en la línia 16 a la principal.
¿I on és la línia 16?
Anem a anar fins al codi i pujar a noswap.
I, de fet, la línia 16 és la molt primer en el programa.
>> Així que ara, si em vaig per davant i el tipus executar aquest temps, Enter, es va aturar.
Així que anem a furgar.
Imprimir x-- què és x zero?
I ignorar el signe de dòlar.
Això és només per als més de luxe ús del programa.
Per què és x zero en aquest moment?
Sí.
>> AUDIÈNCIA: Es va aturar just abans de línia 16, no realment en la línia 16.
DAVID J. Malan: Exactament.
GDB, per defecte, s'ha aturat execució just abans de la línia 16.
Així que no s'ha executat, el que significa x és d'algun valor desconegut.
I tenim la sort que és alguna cosa net com zero.
Així que ara si escric següent, ara és executat 16.
Està esperant que jo executo 17.
Déjame anar endavant i print x.
És un.
Déjame anar endavant i d'impressió i.
Què he de veure ara?
>> AUDIÈNCIA: [inaudible]
>> DAVID J. Malan: Una mica més fort.
>> AUDIÈNCIA: [inaudible]
DAVID J. Malan: No fa ni un consens.
Així que sí, veiem un cert valor de les escombraries.
Ara, i és 134514064 allà.
Bé, és només un valor de les escombraries.
El meu programa utilitza memòria RAM per a diferents propòsits.
Hi ha altres funcions.
Altres persones van escriure dins del meu ordinador.
Així que aquests bits s'han utilitzat per altres valors, i el que estic veient
és les restes d'alguns utilització anterior d'aquesta memòria.
>> Així que no és gran cosa, perquè tan aviat mentre escric següent i després imprimir i,
s'inicialitza a el valor que vull.
Així que ara, seguirem endavant una mica més ràpid.
N per al següent.
Anem a fer-ho de nou.
Però jo no vull colpejar aquí, perquè si
voler veure el que està passant a l'interior d'intercanvi, el que és la comanda?
>> AUDIÈNCIA: passos.
>> DAVID J. Malan: passos.
Així que això em fica en un funció, en lloc de sobre ella.
I ara, que és una mica críptic honestament, però això és només
em diu que estic en la línia 33 ara.
I farem això de nou.
Temp impressió.
Valor escombraries, negatiu aquest cop, però això és només encara un valor escombraries.
Així que farem a continuació, la temperatura d'impressió.
S'inicialitza a 1, la qual cosa era el valor de x, també conegut com un.
>> Ara, ¿on són els nostres A i X ve?
Doncs bé, advertim en principal, cridat a aquests valors x i y.
A continuació, passem a intercanviar la següent manera.
X va ser primer, coma i.
I llavors, d'intercanvi podria anomenar xi y.
Però per a major claredat, és cridant a i b.
Però aib ara seran còpies de x i y, respectivament.
>> Així que si torno a GDB, temp és ara un any i s'ha convertit en un.
Però si ho faig al costat i ara fer d'impressió A, A ja s'ha mogut més.
La llet ha estat vessat a l'antiga el got de suc de taronja, o viceversa.
>> I si faig el següent una altra vegada, i ara si imprimeixo com una comprovació de validesa,
una continua sent dos, però b és ara un.
Francament, encara és allà.
No m'importa el que la temperatura és.
Però tan aviat com ara escric, diguem, continuï a tornar, ara sóc al final
el programa.
I, per desgràcia, x és sent un e i segueix sent dos.
>> Llavors, ¿quina era la utilitat de GDB allà?
No va ajudar a arreglar- el problema per se,
però espero que m'ajudi entendre realitzant
això sí, la meva lògica és correcta, però el meu codi és no tenir en última instància
un impacte permanent.
Així que això és un problema que estem resoldrà ara avui.
>> Però anem a arribar-hi a través d'aquest.
La cadena és una mentida.
És, també, no un tipus de dades que existeix en C. És
estat sinònim d'alguns temps per a una altra cosa,
i podem revelar que la manera següent.
>> Déjame anar per davant i obro Un programa anomenat compara-0.
I en lloc d'escriure aquest cap a fora, començarem a caminar a través del codi
Ja he escrit, però és només unes poques línies.
Així que això es compara-0.
I el primer que estic fent és aconseguir una línia de text.
>> Però noto que estic fent per primera vegada.
El que és diferent amb claredat sobre la línia 21?
De fet, espera un minut.
Aquesta és la còpia de dos.
Això no és ni tan sols el programa adequat.
Molt bé, spoiler alert.
Molt bé, així que no importa que.
Aquesta és la resposta a una pregunta futur.
>> Aquí es compara-0, i estic a punt d'aconseguir una línia de text.
De molt més simple programa.
Així que això és senzill.
Això és com la Setmana Un, Setmana Dues coses En el moment. string s = GetString.
Ara, ho dic de nou aquí.
cadena t = GetString.
I després, l'última cosa en aquest programa, com el seu nom indica,
és que em vaig a tractar de comparar-les.
>> Així que si s, la primera cadena, és igual a = t, aleshores jo sóc
dirà que escriu el mateix.
Si no, jo vaig a dir escriu coses diferents.
Així que anem a compilar i executar aquest programa.
Així que compara zero.
Es veu bé.
No hi ha errors de compilació.
>> Déjame anar per davant ara i escriviu ./compare-0.
Deixin-me seguir endavant i dir alguna cosa : Daven i una mica: Rob.
I escric coses diferents.
Fins ara, tot bé.
Programa sembla ser correcta.
>> Però anem a córrer de nou.
Dir alguna cosa: Gabe.
Bé.
Potser em va colpejar la barra d'espai o alguna cosa funky.
Anem a fer-ho de nou.
Així Zamyla.
Zamyla.
Diferents coses.
Llavors, què està passant?
>> Així que tenim aquestes dues línies de codi, GetString es truca dues vegades.
I llavors, estic simplement tractar de comparar s i t.
Però el que realment està passant llavors?
Bé, sobre la meva pròpia mà a carnisser aquest exemple alguna cosa.
I siguem realment tiren això aquí, també.
>> Així que tenim una línia com string s = GetString.
Així que això és simplement la primera interessant línia d'aquest programa.
Però el que tot aquest temps ha estat passant per sota de la caputxa?
Bé, a la esquerra lateral és una cadena, que és algun tipus de variable,
i es diu s.
Així que sé que això és usar la memòria, o RAM, en el meu equip d'alguna manera.
Així que vaig a abstractament dibuixar que com un quadrat.
32 bits, resulta, però més sobre això en el futur.
I llavors, ¿què està passant aquí?
>> Bé, òbviament GetString per crear una cadena de l'usuari.
I GetString aconseguir Zamyla o Gabe o Daven.
Així que anem a triar la primera d'aquests, que era Daven.
Així que efectivament, ho va aconseguir GetString mi en aquest primer cas era D-a-v-s-n.
I llavors, què més va fer que em dóna en secret?
AUDIÈNCIA: [inaudible]
DAVID J. Malan: Sí, el / 0 o null caràcter.
Així que em va donar efectivament una cadena.
Però ja sabem d'anteriors Sembla que una cadena és simplement un arranjament
de caràcters, i s'acaba per aquest caràcter especial sentinella, / 0.
>> Però si això és cert i això és un quadrat,
això és clarament un rectangle molt més gran.
I, de fet, és a dir, Jo reclam, només 32 bits.
I això és clarament més de 32 bits, ja que aquesta és probablement
vuit més vuit més vuit més vuit més vuit,
només perquè de bytes ASCII.
Com diables anem a cabre Daven en aquest petit quadre aquí?
>> Bé, el que està fent en realitat GetString?
Bé, aquesta quadrícula representa aquí de memòria o la memòria RAM de l'ordinador.
Així que anem a dir que si arbitràriament cadascun d'ells representa un byte,
llavors podem pensar en cada byte com tenint una adreça,
com 33 Oxford Street, o 34 Oxford Street, o 35 Oxford Street.
>> Així que igual que les cases tenen direccions i els edificis tenen adreces,
també ho fan bytes individuals de memòria té adreces o números
que la identificació exclusiva d'ells.
Ara, això és arbitrari.
Però que sigui senzill, que vaig a utilitzar hexadecimal només per convenció,
però el 0x no significa una altra cosa que "aquest és hexadecimal."
i jo vaig a afirmar que el "D" acaba en Byte One a la memòria.
>> No tinc res més a fer a memòria, de manera Daven va obtenir el primer lloc
Un Byte.
Això, llavors, serà 0x2.
Això va a 0x3.
Això serà 0x4.
Això va a 0x5.
Això serà 0x6.
>> Però una vegada de començar a pensar sobre el que està fent l'equip
sota de la campana, vostè pot començar a inferir
com, fa uns anys, ho faria han implementat C si.
Què és GetString probablement returning-- perquè
se sent com que no és tornar Daven, per se,
perquè segurament no per encaixar en aquest petit box--
així que el que es GetString probablement tornant?
>> AUDIÈNCIA: [inaudible]
>> DAVID J. Malan: La ubicació de Daven.
I ha estat fent això des de la setmana 1.
Què és realment GetString tornar no és una cadena, per se.
Aquesta és una de les mentides piadoses.
Es retorna l'adreça de la cadena a la memòria, la direcció única.
Daven viu a 33 Oxford Street.
Però de forma més succinta, Gavin viu en 0x1, Direcció Nombre Un.
>> Així que el que es va posar en aquest petita caixa a continuació, per ser clars,
és només la direcció d'aquesta cadena.
Així que tot aquest temps, aquest que ha estat succeint.
Però el que això apunta ara és que si tot s té
és un número dins d'ella, que és per aturar, el programador,
de posar qualsevol nombre en qualsevol variable i només saltar
a aquest tros de memòria?
I, de fet, ja veurem això és una amenaça propera vegada.
>> Però per ara, això se sent insuficient.
Si dic, aconseguir-me un cadena, dóna'm Daven.
Però en realitat no em dones Daven.
Tot el que em dones és l'adreça de Daven.
Com puc llavors sé amb seguretat on Daven comença i ends--
la història d'aconseguir weird-- on Daven comença i acaba,
i, a continuació, el següent cadena en la memòria comença?
>> Bé, si vostè està lliurant em al principi de Daven,
en essència, com puc saber on al final del seu nom és?
Aquest caràcter nul especial, que és encara més important ara
Si cordes sota de la campana són simplement identifica
de forma única per la seva ubicació en la memòria.
Així que tot aquest temps, que és el que ha estat passant.
>> Així que quan ens fixem ara en el codi aquí, explicar
si ho faria l'error en la línia 26.
Per què és Zamyla i Zamyla diferent?
Per què és Gabe Gabe i diferent?
Sí, a la part posterior.
>> AUDIÈNCIA: Tenen diferents direccions.
>> DAVID J. Malan: Simplement perquè tenen diferents direccions.
Perquè quan vostè diu GetString de nou, el que faré ràpidament aquí,
si aquesta és la segona línia, cadena t, com ho vaig fer en aquest programa,
és igual a una altra crida a GetString.
La propera vegada que dic GetString, vaig
per obtenir un tros diferent de la memòria.
>> GetString es permet preguntar a l'operatiu
sistema per obtenir més i més memòria.
No tornarà a utilitzar la mateixa 6 bytes cada vegada.
Es va a obtenir un nou tros de memòria, que
significa t aconseguirà algun altre valor aquí.
>> Així que quan ho faig s és igual a = t, que no està comparant
D i A en contra d'aquest contra això i V contra d'això.
Vostè està comparant aquest en contra d'aquesta, que
francament és força useless-- useful-- és bastant inútil, ja que realment
li importa on les cordes són a la memòria?
>> I, de fet, no ho hem fet.
I no anem a iniciar particularment cura.
Només en la mesura que poden sorgir errors i les amenaces de seguretat poden sorgir voluntat
que en realitat vam començar a preocupar per això.
Així que anem a resoldre aquest problema.
Resulta que, a solucionar súper simple.
>> I anem realitat, abans que jo revelen que una vegada més, el que faria
de fer si en una classe CS50, i ha hagut de posar en pràctica
una comparació amb dues cadenes.
Vostè clarament no només pot utilitzar s és igual a = t.
Però així, lògicament, com compararia aquesta cadena
contra aquesta cadena utilitzant codi C?
Sí.
>> AUDIÈNCIA: Només fer el de llaç [inaudible]
DAVID J. Malan: Perfect.
AUDIÈNCIA: [inaudible]
DAVID J. Malan: Si.
Només ha d'utilitzar un bucle for o un while o el que sigui.
Però només s'aplica la idea bàsica que si aquest és un tros de memòria o una matriu
i això és, iterar sobre tots dos a la vegada.
I just comparar les lletres.
>> I has de ser un poca cura, perquè
no volen un dit per anar més enllà de l'altra
perquè una cadena és ja que l'altre.
Així que vas a voler comprovar si hi ha Aquest valor especial al final, null.
Però el que realment és, al final, tan simple com això.
I, francament, no necessitem reinventar la roda.
Aquí hi ha la versió 2.
I el que vaig a dir aquí és que en lloc de comparar s és igual a = t,
Estic en comptes d'anar a dir, si la cadena comparació de coma s és igual a t = 0.
Ara, el que es compara la cadena?
>> Resulta, que és una funció que ve amb C, el propòsit a la vida
és comparar dues cadenes.
I regiri comparar, si llegim la seva pàgina de manual o documentació o CS50
referència, ho farà simplement dir-los que enrenou
comparar els rendiments, ja sigui un cable negatiu nombre o un nombre positiu o zero,
on zero significa que són iguals.
>> Així que només conjectures.
Què podria significar si regiri retorns comparar
valor negatiu o el valor positiu?
AUDIÈNCIA: Major o menor que.
DAVID J. Malan: Sí, més gran que o menys que.
Així que si volem ordenar el seu conjunt manat de cordes en un dictionary--
com ho farem amb el temps per la road-- funció perfecta per utilitzar potencialment,
perquè farà que comparació de cadenes per a vostè, i dir-li
vostè fa una ve abans de b, o fa b venir abans d'un ordre alfabètic.
Podem fer exactament això.
>> I noti que vaig fer un altre cosa en aquest exemple.
Què més ha canviat més alta en aquesta funció principal?
Char *.
I és que una altra mentida blanca.
Durant tot aquest temps, quan has estat escrivint cadena,
hem estat reescrivint en secret cadena com char * perquè Clang realitat
vostè entén.
>> En altres paraules, en CS50.h i com veurem finalment veiem,
vam fer una cadena de sinònims en crida això és el mateix que char *.
I per ara, només saber que el *, En aquest context, almenys,
significa la direcció.
>> La direcció de què?
Bé, el fet que et vaig dir char *, i no int * o surar *,
significa que char * és la direcció d'un char.
Així que aquest petit quadre aquí, també conegut com cadena, és realment de tipus char *,
que és simplement una manera elegant de dir, En aquest quadre es destinarà una adreça.
I què fa que la direcció es refereix?
Pel que sembla, un char.
>> Però vam poder absolutament tenir int * i altres coses.
Però per ara, char * és realment el més senzill i un interès.
Així que aquest problema es va augmentant, tot i que, de nou.
>> Suposem que jo obro aquest programa.
A veure si ara podem predir el que està malament amb aquest codi.
Així que en aquest programa, copiar-0, estic seguirà endavant i cridar de nou
GetString i emmagatzemar el valor en s.
>> I llavors, per què estic fent això, només com un recordatori de la setmana passada?
Vam dir que GetString de vegades retorna null.
Què significa si GetString retorna null?
Quelcom ha fallat.
Probablement significa la cadena és massa gran, fora de l'ordinador de la memòria.
Succeeix super, super, super poques vegades, però podria succeir.
Volem trobar-lo, i això és tot el que estem fent.
>> Perquè anem a veure ara, si no ho fa començar a comprovar habitualment per les coses
com nul, que et poden en realitat començar a anar
a adreces de memòria que no són vàlids.
I vostè va a començar a induir més i més violacions de segment.
O en un Mac o un PC, simplement fer que un ordinador per penjar
o un programa per congelar, potencialment.
>> Així que ara, jo reclamo en còpia-0.c, que Vaig a copiar aquestes cadenes a manera
de la línia 28.
I llavors, em vaig per reclamar a la part inferior
aquí que vaig per canviar un d'ells.
>> Així notar això.
Vaig a trucar al nostre vell amic strlen.
I només explicar en anglès la qual cosa aquesta línia 34 està fent?
Què suport t 0 representar a l'esquerra.
Sí.
>> AUDIÈNCIA: Primer caràcter de t?
DAVID J. Malan: Primer caràcter de t.
Això és tot.
El primer caràcter de te, vull per assignar la versió majúscula
del primer caràcter en t.
Així que aquesta és la capitalització la primera lletra.
I després, l'últim que faig en aquest programa és que pretenc aquí és
l'original, és, i aquí hi ha la còpia, t.
>> Però sobre la base de la història que acabem de parlat del que realment són les cadenes,
el que és realment la línia 28 fent, i el que és
la sentència que resulta anar per estar a la pantalla?
>> Així que primer, la primera pregunta, 28.
Què és String t = s fent en realitat?
Si tenim a la mà esquerra banda aquí string t = s;
això em dóna una caixa aquí i una caixa aquí.
I suposem que aquesta direcció és 0x, diguem, 50 aquest cop, de manera arbitrària.
Què cadena de t = s fer sota de la caputxa?
>> AUDIÈNCIA: [inaudible]
>> DAVID J. Malan: Emmagatzema la memòria aborden allà, així 0x50 va allà.
Així que si ara, vaig a la primera personatge en t i majúscules que,
¿Què estic fent amb eficàcia per s?
Realment estic fent el mateix, oi?
Perquè si Direcció 0x50-- i just, em no tenen molt espai al tauler aquí,
però assumir que això és 0x50 aquí baix, en algun lloc de la memòria del meu ordinador.
>> I he, per exemple, Gabe en minúscula aquí, així.
I he dit suport t 0 aconsegueix capitalitzats.
Bé, t 0 és el suport la primera lletra t.
Tan poc g va a convertit en un gran G. Però el problema
es, el que no s també assenyalar?
>> AUDIÈNCIA: La mateixa.
>> DAVID J. Malan: Exactament el mateix.
Així que una simple explicació potser, encara que la sintaxi és una mica estrany.
Així que farem això.
Fer còpia-0 i després ./copy-0.
Dir alguna cosa: Gabe.
I, per desgràcia, tant ells ara s'han capitalitzat,
però per a aquest subjacent raó per la qual estem simplement
ara es tracta d'adreces.
>> Llavors, com començar a address-- sense doble intended--
Com vam començar a abordar aquest problema en particular?
Bé, en copy1.c, les coses van a ser una mica més complicat.
Però m'agradaria reclamar un solució conceptualment simple.
>> Tan difícil d'aconseguir a primera vista.
No serà fàcil per al primer vegada que escrigui a terme, potser,
però si el problema és que simplement fent t = s només
copia la direcció, el que, de nou si puc triar en vostè,
serà la solució per copiar realment una cadena?
>> AUDIÈNCIA: Nosaltres probablement utilitzar un bucle de nou.
>> DAVID J. Malan: Si.
Així que necessitarem un bucle de nou.
I perquè si volem copiar una cadena s en una altra cadena,
probablement volem fer-ho caràcter per caràcter.
Però el problema és, si aquest és un principi s,
ara hem de començar de forma explícita l'assignació de memòria per at.
>> En altres paraules, anem redibuixar aquesta última vegada.
Si aquesta és string s = GetString.
I anem a posar això aquí, també.
Això és GetString.
I llavors, la imatge d'alguna cosa així que serà com abans,
g-a-b-i / 0.
Això es veu una mica d'alguna cosa com això.
I s, per tant, ens criden a aquest 0x50, i que serà 51, 52.
>> Així que això és 0x50.
I després, ho faig cadena t.
En la memòria, que només va a dóna'm una petita plaça com aquesta.
Així que quin és el pas clau ara?
Si vull copiar s en t, el que blank què necessitem per omplir aquí?
O el que és el que necessitem fer a un alt nivell?
Sí?
Algú?
Sí.
>> AUDIÈNCIA: Hem de [inaudible].
DAVID J. Malan: Sí, hauran d'ingressar en aquest espai en blanc.
No puc copiar i després capitalitzar el nom de Gabe
fins que li demano al sistema operatiu per un altre tros de memòria
això és almenys tan gran com l'original.
Així que ens deixa amb una pregunta.
>> Com sol · licito el sistema operatiu no només per un pointer-- senzilla
com això es diu, un adreça, un no pointer--
per una mica simple caixa com això es diu una cadena?
Com sol · licito l'operatiu sistema per a una gran part de la memòria?
Fins ara, només he aconseguit que tornar indirectament trucant GetString.
Llavors, com es GetString fins i tot aconseguir la seva memòria?
>> Bé, resulta que hi ha aquesta altra funció aquí
que ara començarem a utilitzar.
Ara, això sembla què-- manera més críptica i jo sóc l'únic que pot veure it--
aquesta línia es veu molt més críptic llavors deuria a primera vista.
Però anem a burlis part.
>> Al costat esquerre, tinc char * t.
Així que en anglès, anem a començar a formular oracions correctes en l'argot tècnic.
Així que aquesta és l'assignació d'un variable de tipus char * diu t.
Ara, què significa això realment?
>> Bé, això significa, què vaig per posar en aquesta variable anomenada t?
Una adreça d'un char.
Així que això és només el més simple, de manera més raonable
de descriure la banda esquerra.
Així que crea aquesta caixa aquí només.
Així que el costat dret, presumiblement, va
assignar que més gran tros de memòria, com?
Així que anem a burlen d'aquesta separació.
>> És aclaparador a primera vista, però el que està passant aquí dins?
En primer lloc, cal malloc, que aparentment és el nostre nou amic,
"Memòria assignar."
Així que aquest és l'argument que es passa en ella, per la qual cosa és un argument bastant gran.
Així que anem a burlen d'aquesta separació.
>> strlen de s, per descomptat, representa ell--
AUDIÈNCIA: El nombre de caràcters.
DAVID J. Malan: Només el nombre de caràcters en s.
Així la longitud de s, l'original.
Així G-a-b-e.
Així que és probable que quatre a aquest cas.
Per què faig després d'1 trucant strlen de s?
AUDIÈNCIA: [inaudible]
DAVID J. Malan: Perquè caràcter especial nul.
Si em pregunten quina és la longitud d' El nom de Gabe, jo vaig a dir quatre.
Sota el capó, però, he de que el cinquè byte per al caràcter nul.
Així que per això estic fent l'1.
>> Ara en cas que està executant aquest programa en un equip que no sigui, per exemple,
l'aparell CS50, on la mida d'un char
podria ser diferent de la meva pròpia computer--
resulta que jo puc trucar a aquest sizeof operador, simplement fer que l'equip,
el que és de la mida d'un xerrades en aquest equip?
>> I multiplicant cinc en aquest exemple per la grandària d'un char, que
en la majoria de les computadores només un, malloc
es va a assignar a mi aquesta gran tros de memòria més d'aquí a la dreta.
I va a return-- es tracta d'un function-- pel que és
tornarà a mi què?
AUDIÈNCIA: La direcció?
DAVID J. Malan: La direcció de què?
AUDIÈNCIA: De la memòria s'assigna?
DAVID J. Malan: De la la memòria s'assigna.
Així que no tinc ni idea, francament, on va a acabar.
Vaig a proposar que que acabarà a 0x88.
Completament arbitrària, però en algun lloc que no sigui 0x50,
perquè el sistema operatiu, el Windows i Mac OS fan per mi, és
assegurar-se que s'està donant Em diferents trossos de RAM.
>> Així que aquest és el valor que aquesta tros de memòria podria acabar.
Així que això és el que acaba aquí, 0x88.
Així que ara clarament, puc entendre que això no és el mateix que això,
perquè estan assenyalant a diferents fragments de memòria.
Així que si ara realment vull copiar aquest en, anem a fer la seva proposta de solució.
>> Anirem, crear un bucle, i fer t suport i Obté s suport de i.
Perquè ara puc utilitzar aquest tipus array notació,
perquè tot i malloc molt genèricament em assigna memòria,
bytes de memòria és només contigus.
Byte, byte, byte, esquena amb esquena amb esquena.
>> Puc certament com un programador tractar-lo com una matriu, que
vol dir que puc usar això finalment familiaritzat notació de només alguns claudàtors.
>> Així que permetin-me aturar-me allà, perquè aquesta és una gran quantitat d'una sola vegada, fins i tot
encara que la idea bàsica per recapitular és aquesta cadena, tot aquest temps,
no és un nou tipus de dades en si.
És només una trucada punter, la direcció d'un personatge,
que només vol dir que és un nombre que per convenció humana
tendim a escriure com 0x alguna cosa.
>> Però és només un nombre, com 33 Oxford Street,
que passa a ser el La direcció del CS edifici.
Qualsevol pregunta sobre aquests detalls?
Sí?
>> AUDIÈNCIA: Per què, comprovem per t igual a null?
>> DAVID J. Malan: Per què nosaltres comprovar si t igual a null?
Si llegim la documentation-- gran pregunta-- per malloc,
que dirà en la lletra petita, de vegades malloc podria tornar null,
igual que GetString.
I, en efecte, GetString retorna null Si, al seu torn, malloc retorna un valor nul,
perquè GetString utilitza malloc.
>> I això podria succeir si el sistema operatiu, Mac OS, Windows, el que sigui, és simplement
sense memòria per a vostè.
Així que això és el que va passar allà.
>> I permetin-me revelar altra cosa això podria volar la teva ment
o completament estar massa lluny de la ratlla.
Però m'ho dius a mi tiri cap amunt la mateix bucle per copiar,
que fa un moment, el record era això. t suport i aconsegueix s suport de i.
>> Agradable i fàcil d'utilitzar.
Se sent com la segona setmana de nou.
Però aquesta versió pot ser en realitat reescrit com aquest, que sembla críptica.
És un punter tècnica anomenada aritmètica, aritmètica d'adreces.
Però per què funciona això?
>> Ara era una nosa, la autors de C decidir utilitzar
el símbol * per a diferents propòsits.
Hem vist que s'usa un cop ja, char *, que significa "dóna'm una variable
això va a contenir la direcció d'un char ".
* Així carbó en aquest context significa "dóna'm una variable."
>> Per desgràcia, si s'utilitza el * sense una paraula davant d'ell, com char,
és ara cridat el operador per desfer referències.
I veurem més d'això en poc temps.
Però només significa "anar-hi."
És com dir, si algú em va lliurar en un tros de paper "33 Oxford Street,"
si ho faig "* 33 Oxford Street," que significa "Anar pel camí de la construcció de CS."
>> Així que * simplement vol dir anar-hi si no hi ha una paraula al davant d'ella.
Llavors, què és t, per ser clars?
t és la direcció de la part de memòria que se li va donar de nou a mi.
s és la direcció del que, per ser clars, en l'exemple que hem estat discutint,
de gabe minúscules?
s és la direcció de--
AUDIÈNCIA: La cadena.
DAVID J. Malan: De nom original de Gabe.
Així que és l'adreça d' aquest tros de memòria.
Així que si dic t + I I--, avís, és només el nostre vell amic.
És només una variable índex això és la iteració de zero en un màxim
a la longitud de la cadena s.
Així que serà zero, un, després dos, després tres, després quatre.
Així que anem a muntar aquests nous Peces del trencaclosques-zero com, si es vol,
tot i que, de nou, la sintaxi és molt més arcà de les ratllades.
Així que t és una adreça + i em donarà
un nombre, ja que aquests són tots números que hem vingut assenyalant com hexadecimal.
Però són només nombres.
>> Així que si la direcció de t ens va dir era 0x88, el que és 0x88 més zero.
Encara que no se sent còmode amb hex encara, prendre una conjectura.
>> AUDIÈNCIA: L'original.
>> DAVID J. Malan: Encara 0x88.
Llavors, ¿què vol dir * 0x88?
Significa, "anar-hi", que significa efectivament, "posar el dit aquí."
I ara al costat dret de aquesta expressió, * i després a parens,
s + s i significa, que és el tractar aquí de la petita g.
s + 0 és, per descomptat, s, s ho és.
>> Així que ara, és s *, que igual que * 33 Oxford Street significa anar a l'adreça
s.
Així que aquí està aquest dit, la mà dreta.
Llavors, què vaig a copiar en què?
La cosa a la dreta, que és gabe, poc g aquí, a aquí.
>> I pel que l'efecte d'aquesta primera iteració del bucle,
com vostè va proposar, tot i que sembla boig més complicat que qualsevol cosa
que hem vist abans, és simplement dir anar aquí i copiar aquest personatge aquí.
T'està donant un mapa per ambdues localitats.
>> I anem a veure molt més d'això.
Però per ara, l'esperança és només per introduir algunes d'aquestes idees bàsiques.
I, de fet, anem a veure un programa final aquí,
i després el claymation promès, el que farà que tot bé.
Bé.
Així que permetin-me obro up-- aquí anem.
Així que anem Me-- tornarem a aquest quadre en poc temps.
Permetin-me obrir aquest últim exemple aquí.
>> Així que aquí és un super, super programa que porta a terme
res a la vida que fa el següent.
En primer lloc, declara dues variables, x i i, que no són nombres d'aquest temps,
per se.
No són nombres enters, per se.
Ells són aparentment int *.
Així que ningú, què significa si el seu tipus de dades, la variable,
és de tipus int * estrelles?
Aquesta és la direcció d'un int.
>> Així que no tinc ni idea d'on està encara.
Només significa "posar, eventualment, la direcció d'un int aquí ".
0x50, 0x88, allà on estigui en memòria, una adreça es va allà.
I això és el que i és serà, també.
>> Si ara dic x = malloc (sizeof (int)), aquesta és una manera elegant de dir,
escolta sistema operatiu, mitjançant malloc, dóna'm prou memòria per a la grandària
d'un int, que és probablement serà de 32 bits o quatre bytes.
>> Llavors, ¿què tornar malloc?
Malloc retorna una adreça.
Llavors, què quedarà emmagatzemat en x?
La direcció de la part de memòria, els quatre bytes, que malloc
acaba de trobar per a mi preguntant el sistema operatiu.
>> Ara Mentrestant, la línia 04:00 aquí, el * x = 42.
Perquè quedi clar, el que està passant allà baix?
A la part esquerra, * x.
això és com * 33 Oxford Street.
Així * x vol dir què?
>> AUDIÈNCIA: Anar a.
>> DAVID J. Malan: Anar a aquesta direcció.
On sigui que parteix de la memòria és, anar-hi.
I posar el que hi ha, òbviament?
AUDIÈNCIA: 42.
DAVID J. Malan: 42.
Molt bé, * i, mateixa idea.
Aneu a la direcció en i.
Poseu el número 13 allà, però el que és i en aquest moment?
AUDIÈNCIA: No hi ha memòria per i.
DAVID J. Malan: Hi ha hi ha memòria per i.
Així que el que fa i, probablement, contenir, com hem vingut dient?
>> AUDIÈNCIA: Garbage.
>> DAVID J. Malan: Alguns valor escombraries.
Ara, el valor de les escombraries és encara un nombre.
Encara es pot confondre amb una adreça.
És com si algú gargotejar alguna cosa cap avall,
i em va malinterpretar el sentit de algun edifici pel carrer.
I si el que intenta entrar en algun edifici que no és amo,
o algun tros de memòria que no té estat donat, les coses dolentes poden succeir.
Ordinador podria bloquejar, o algun altre comportament indeterminat podria succeir.
>> Així que la introducció, a continuació, a Binky és això.
Encara recordo, 20 i tants anys més tard,
on era quan finalment entès punters.
>> És a dir, si vostè sortir d'aquí en tres minuts
i crec que no ho faig entendre punters, s'adonen
M'he recordat de 20 anys, per alguna raó boja
quan i per què finalment es va enfonsar en, assegut amb el meu ensenyament
company, Nishat Mehta al part posterior d'Eliot Dining Hall.
Ara, m'he acordat això perquè això era
un dels temes que, en particular, lluitat amb.
I llavors, per fi es fa clic, com m'atreveixo a dir un munt de temes
finalment ho farà.
I ara, per fer que se senti tot el més feliç i més convincent,
anem a fer un últim cop d'ull a la nostra últims tres minuts aquí a Binky,
del nostre amic, Nick Parlant de Stanford.
>> [REPRODUCCIÓ DE VÍDEO]
>> Escolta, Binky.
Despertar!
És temps per a la diversió punter.
>> Què és això?
Aprendre sobre els punters?
Que bé!
>> Bé, per començar, crec que estem Necessitarà un parell de punters.
>> -ok.
Aquest codi assigna dos punters, que pot apuntar a nombres enters.
-ok.
Bé, veig els dos punters, però no semblen estar apuntant a res.
>> Això és correcte.
Inicialment, punters no apunten a res.
Les coses que apunten als anomenats pointees, i que van ser creats d'
una etapa separada.
>> Oh, cert, cert.
Ho sabia.
Els pointees estan separats.
Er, així que com assignar un pointee?
>> -ok.
Bé, el codi assigna un nou pointee nombre enter,
i aquesta part es presenten xa apunten a la mateixa.
>> Escolta, que es veu millor.
Així que faci alguna cosa.
>> -ok.
Vaig a eliminar la referència al punter x per emmagatzemar el nombre 42 en el seu pointee.
Per a aquest truc, vaig a necessitar la meva Vareta màgica · lació de referència.
>> El teu Vareta màgica de Desreferenciar?
Això-- això és genial.
>> : Aquest és el que el codi es sembla.
Vaig a configurar el nombre, i [POP]
>> Escolta, mira.
Aquí va.
>> -Així Fent un desreferenciar en x segueix la fletxa per accedir al seu pointee.
En aquest cas, una botiga 42 en allà.
Hey tractar d'usar-lo per emmagatzemar el nombre 13 a través de l'altre punter, i.
>> -ok.
Vaig a anar per aquí ai, i obtenir el número 13 de posada en marxa.
I després, prendre la vareta de Eliminació de referències i just [BUZZ]
>> Oh!
>> Oh, bé!
Això no va funcionar.
Digui, Binky, no crec dereferencing i és una bona idea, perquè vostè sap,
la creació de la pointee és un pas separat.
I jo no crec que mai ho vam fer.
>> Punt Bé.
Si.
Assignem el punter i, però que Mai configurar perquè apunti a un pointee.
>> Molt Observador.
Escolta, et veus molt bé, Binky.
Es pot arreglar perquè els punts de Y a la mateixa pointee com x?
>> Assegurança.
Vaig a utilitzar el meu vareta màgica Punter d'assignació.
>> ¿És Que serà un problema com abans?
No.
Això no toca els pointees.
Només canvia un punter a apuntar a la mateixa cosa que una altra.
>> Oh, ja veig.
Ara i apunta al mateix lloc que x.
Així que esperar.
Ara, i es fixa.
Té un pointee.
Així que vostè pot provar la Vareta de Eliminació de referències tornar a enviar el 13 més.
>> Uh, OK.
Aquí va. [POP]
>> Escolta, mira això.
Ara dereferencing obres a i.
I pel fet que els punters estan compartint que un pointee, tots dos veuen el 13.
Si.
Compartir, el que sigui.
Així que anem a canviar de lloc ara?
>> Oh, mira.
Estem fora de temps.
>> -But--
>> -Simplement Recordar les tres regles de punter.
Nombre Un, l'estructura bàsica és que vostè té un punter,
i apunta a un pointee.
Però el punter i pointee estan separats,
i l'error comú és la creació d'un punter,
però que s'oblidi de donar-li una pointee.
>> Nombre Dos, desreferència punter comença en el punter
i segueix el seu ratolí a sobre per accedir al seu pointee.
Com tots sabem, aquest només funciona si hi ha
1 pointee, quin tipus de torna a la Regla Nombre Un.
>> Nombre Tres, punter assignació té un punter
i canvia perquè apunti a la pointee mateix com un altre punter.
Així que després de la cessió, els dos punters
apuntarà a aquesta pointee.
A vegades, això es diu intercanvi.
I això és tot el que cal fer, de veritat.
Bye-bye ara.
[FI REPRODUCCIÓ DE VÍDEO]
DAVID J. Malan: Això és tot per CS50.
Ens veiem la setmana que ve.