>> DAVID Malan: Hola, i benvinguts a CS50.
Així que aquest és el final de la quarta setmana.
Només un anunci primer.
Així l'anomenada cinquena dilluns és ve dilluns que ve.
Aquesta és l'oportunitat de canviar de SAT / UNSAT a un grau de la lletra, o de
grau de la lletra SAT / UNSAT.
Molest, el procés requereix una signatura, perquè cal omplir
a terme una de les formes d'inserció / extracció de color rosa.
>> Perquè tècnicament, el SAT / UNSAT versió i la versió qualificació de lletra
tenen números de catàleg diferents.
Però no és gran cosa.
Només vine a mi o a Rob o a Lauren en qualsevol punt.
O envieu-nos un correu electrònic si vostè no té el tipus de paperassa que necessita avui, i
serà segur per ajudar a prendre compte que abans de dilluns.
>> Molt bé, així que avui -
En realitat, hi ha una mica d'eco.
Podem to em una mica?
D'acord.
Així que avui, s'introdueix un tema conegut com punters.
I vaig a admetre que aquest és un dels els temes més complexos que tendim a
cobrir en aquesta classe, o en realitat qualsevol curs introductori que utilitza C.
>> Però prengui la meva paraula per a ella, sobretot si la seva ment se sent una mica més inclinada
avui i en les properes setmanes.
No és representatiu de vostè aconseguir pitjor en aquest només vol dir que
és un tema particularment sofisticat que prometen, un parell de setmanes
per tant, li semblarà molt cridaner directa en retrospectiva.
>> Encara recordo a aquest dia.
Jo estava assegut a Elliott Dining Hall, assegut al costat de la meva TF Nishat Mehta,
que era un resident d'Elliott casa.
I per alguna raó, aquesta tema simplement fa clic.
Què vol dir que jo també vaig lluitar amb ell durant algun temps, però
Faré el meu millor per ajudar a evitar qualsevol lluita amb un tema que en última instància,
és bastant potent.
>> De fet, un dels temes que anem a discutir en les properes setmanes és que
de seguretat, i com en realitat es pot explotar màquines en formes
que no es pretenia.
I aquestes explotacions són típicament el resultat d'errors, errors que
la gent fa per no entendre alguns de la implementació subjacent
detalls a través de la qual es fan els programes.
>> Ara, per fer que això sembli encara més usuaris amable, vaig pensar que jugaria a 10
segona vista prèvia d'una mica d'animació amb plastilina xifra anomenat Binky, que va ser portat a
vida per un amic nostre a Stanford, professor Nick Parlant.
Així que permeteu-me que li dono a aquest teaser del Binky aquí.
>> [REPRODUIR VIDEO]
>> -Ei, Binky.
Desperta.
És temps per a la diversió punter.
>> -Què és això?
Assabenti dels punters?
Oh, que bé.
>> [FI REPRODUCCIÓ DE VÍDEO]
>> DAVID Malan: És Stanford la informàtica.
Així que més del que vindria.
>> [Aplaudiments]
>> DAVID Malan: Ho sento, Nick.
>> Així que recorda que l'última vegada que vam acabar de això realment emocionant melodrama
pel que aquesta funció simplement no va funcionar.
Almenys intuïtivament, se sentia com ha de funcionar.
Simplement canviant els valors de dos nombres enters.
Però recordo que quan imprimim la valors originals en principal, una i
dos, que seguien una i dos i no dos i un.
>> Així que en realitat m'encenc sobre l'aparell.
I vaig escriure una mica de codi esquelètic en avançar aquí, on afirmo que x
serà 1, i serà 2.
Llavors jo imprimeixo tant de la seva valors amb print f.
>> Llavors jo sostinc aquí que anem a canviar-los.
He deixat un espai en blanc aquí perquè ompli avui en un moment.
Llavors, vaig a afirmar que el dues variables que s'han intercanviat.
A continuació, vaig a imprimir cap a fora una altra vegada.
I així, amb sort, he de veure 1, 2.
2, 1.
Aquest és el super simple objectiu en aquests moments.
>> Llavors, com fem per intercanviar dues variables?
Bé, si em proposo aquí que aquestes copes podria representar la memòria en un ordinador.
Es tracta d'uns pocs mossos, això és una altra de les picades.
Podríem haver arribat a un voluntari en un màxim i ens barregi algunes begudes, si resulta familiar?
Anem amunt.
Com et dius?
>> JESS: Jess.
>> DAVID Malan: Jess?
Anem amunt, Jess.
Si no t'importa, hem de posar el Google Glass en vostè perquè puguem
immortalitzar això.
Acceptar, vidre.
Gravar un vídeo.
I bé, estem ben anar amb Jess aquí.
Està bé.
Gust a conèixer-lo.
>> Així que el que m'agradaria fer aquí - si es pogués, amb força rapidesa -
només ens aboca la meitat d'un got de taronja suc i la meitat d'un got de llet,
representa efectivament els nombres 1 en una tassa i 2 en l'altre got.
>> Això serà bo metratge.
>> JESS: Ho sento.
>> DAVID Malan: No, no.
Està bé.
Niça.
Molt bé, així que tenim quatre octets val la pena de suc de taronja.
Ens dèiem el valor 1.
Ara quatre bytes de valor de la llet.
Anomenarem valor 2.
Així que x i y, respectivament.
>> Molt bé, així que ara si la tasca en qüestió - per a tu, Jess, davant de tots
dels seus companys de classe -
és per intercanviar els valors de x i y tals que volem que el suc de taronja a la
altra tassa i la llet en aquesta copa, com podria vostè - abans que vostè faci
ella - anar fent això?
>> Bé, sàvia decisió.
Així que hi ha una mica més de memòria.
Així que anem a assignar un temporal tassa, si es vol.
I ara procedir a canviar x i y.
>> Excel · lent.
Així que molt ben fet.
Moltes gràcies, Jess.
Aquí té.
Un petit record.
>> OK, així que òbviament, idea super simple.
Totalment intuïtiu que necessitem una mica més espai d'emmagatzematge - d'aquesta manera,
una tassa - si en realitat volen intercanviar aquestes dues variables.
Així que anem a fer exactament això.
Fins aquí, al mig, on afirmo que sóc va a fer una mica d'intercanvi, ho faré
seguir endavant i declarar la temp.
I em vaig posar igual a, diguem, x.
>> Llavors em canviaré el valor de x igual que Jess va fer aquí amb el
llet i suc de taronja perquè sigui igual a i.
I jo canviaré i ser igual a no x, perquè ara estaríem
atrapat en un cercle, sinó més aviat TEMP.
On temporalment - o on Jess aparcar temporalment el suc de taronja
abans que apallissar tassa amb la llet.
>> Així que permetin-me anar endavant ara i faig això.
Es diu noswap.c.
I ara m'ho dius córrer cap intercanvi.
I de fet ho veig, si puc ampliar la finestra una mica, que
x és 1, i és 2.
I llavors x és 2, i és 1.
>> Però recordem que dilluns vam fer coses una mica diferent pel que
vegada implementat una funció auxiliar, si es vol, que en realitat era nul · la.
El vaig trucar intercanviar.
Li vaig donar dos paràmetres, i vaig trucar ells una i em deien b.
>> Francament, jo podria anomenar x i y.
Res li deté jo faci això.
Però jo diria que és llavors una mica ambigua.
Com recordatori per dilluns que Van al · legar que aquests paràmetres van ser
còpies dels valors passats polz
Pel que només es fica amb el seu ment, crec que, si utilitza
exactament les mateixes variables.
>> Així que vaig a trucar a ells en lloc d'una i b, només per a major claredat.
Però podríem anomenar més el que vulguem.
I jo vaig a copiar i enganxar efectivament aquest codi des d'allà
baix a aquí.
Perquè acabo de veure que funciona.
Així que això és en molt bona forma.
I vaig a canviar el meu x a una, el meu x a una, i per a mi i la meva b i a b.
>> En altres paraules, exactament la mateixa lògica.
Exactament el mateix que Jess va fer.
I llavors l'únic que he de fer fins aquí, per descomptat, ara invocar aquest
funció, o trucar a aquesta funció.
Així que vaig a cridar a aquesta funció amb dos entrades, x i y, i premeu Desa.
>> D'acord, fonamentalment, la mateixa cosa.
De fet, probablement he fet el programa innecessàriament complexa per
escriure una funció que acaba de prendre uns sis línies de codi mentre que jo
prèviament havien implementat això en tan sols tres.
>> Així que permetin-me anar endavant ara i refer això, no fan swap.
Bé, em vaig cagar aquí.
Això ha de ser un error que podria veure cada vegada més comunament com el
programes es tornen més complexes.
Però hi ha una solució fàcil.
Permetin-me retrocedir fins aquí.
>> I el que és el primer error que estic veient?
Declaració implícita.
Què és el que sol indicar?
Ah, se va oblidar el prototip.
Em vaig oblidar d'ensenyar al compilador que permuta va a existir tot i que
no hi ha al principi del programa.
Així que només vaig a dir nul · la, swap, int, int a b, punt i coma.
>> Així que no vaig a tornar a implementar.
Però ara que coincideix amb el que està aquí baix.
I fixin-se, l'absència d'un punt i coma aquí, la qual cosa no és necessari quan
implementar.
>> Així que permetin refer això, no ens swap.
Molt millor manera.
Executar sense swap.
I maleïda sigui.
Ara estem de tornada on érem el dilluns, on la cosa no intercanviar.
>> I quina és l'explicació intuïtiva de per què això és així?
Sí?
>> ESTUDIANT: [inaudible].
>> DAVID Malan: Exactament.
Així que a i b són còpies de x i y.
I, de fet, cada vegada que he estat cridar a una funció que fins ara
passa variables com ints -
així com intercanvi d'espera aquí -
vostès han estat passant en les còpies.
>> Ara que significa que es necessita una mica de temps, una fracció de segon, per al
ordinador per copiar els bits d'un variables en els bits de l'altre.
Però això no és una cosa molt important.
Però són, però, una còpia.
>> I ara, en el context de l'intercanvi, De fet, estic amb èxit
canviar a i b.
De fet, farem una ràpida comprovació de validesa.
Imprimir f a és% i, nova línia.
I introduïm a.
Ara farem el mateix amb b.
I farem el mateix aquí.
>> I ara, permetin-me copiar la mateixa línia de nou a la part inferior de la funció
després dels meus tres línies d'interès podria haver executat, i
imprimir una i altra vegada b.
Així que ara anem a fer això, assegureu-vos de no intercanvi.
Vull deixar la finestra de terminal d'un mica més alt, pel que podem veure
més del mateix alhora.
>> I corre cap intercanvi.
x és 1, i és 2. a és 1, b és 2.
I després, a és 2, b és 1.
Així que s'està treballant, igual que Jess va fer aquí, dins de swap.
Però, és clar, és que no té efecte en les variables de principal.
>> Així que vam veure un truc que puguem podria solucionar aquest problema, oi?
Quan t'enfrontes a aquesta determinació de l'abast tema, només va poder aclarir i fer x
e i quin tipus de variables en el seu lloc?
>> Vostè podria fer global.
Poseu-los en la part superior de l'arxiu com ho vam fer, fins i tot en el joc de la 15.
Utilitzem una variable global.
Però en el context del joc un 15, és raonable tenir un mundial
variable que representa el tauler, perquè la totalitat 15.c és tot
sobre la implementació d'aquest joc.
Això és el que hi ha a l'arxiu per fer.
>> Però en aquest cas aquí, estic cridar a una funció d'intercanvi.
Vull intercanviar dues variables.
I ha de començar a sentir només descuidat si la solució a tots els nostres
problemes quan ens trobem amb l'abast qüestions és que sigui global.
Com que molt aviat el nostre programa és va a convertir en un bon embolic.
I ho vam fer amb molta moderació com a resultat en 15.c
>> Però resulta que hi ha una millor manera per complet.
Permetin-me realment tornar enrere i eliminar la imprimir f de, només per simplificar el codi.
I permetin-me proposo això, de fet, és dolent.
Però si en lloc d'afegir en alguns asteriscs i les estrelles, que en canvi poden convertir aquesta
funció en un que és en realitat operativa.
>> Així que permetin-me tornar aquí i admetre dient asteriscs és sempre difícil,
així que li dic estrelles.
Vaig a confessar a aquella.
Està bé.
I ara, què vaig fer en el seu lloc?
>> Així que en primer lloc, vaig a especificar que en lloc de passar un int en
la funció d'intercanvi, estic en el seu lloc d'anar a dir estrella int.
Ara, què indica l'estrella?
Aquesta és la noció d'un punter que Binky, el personatge d'animació amb plastilina, va ser
es fa referència a fa un moment.
>> Així que si diem int estrella, el significat de això ara és que no serà
aprovada en pel seu valor.
No va a copiar polz
Més aviat, la direcció d'una és passarà polz
>> Així que recorda que en l'interior del seu equip és un munt de memòria, en cas contrari
coneguda com RAM.
I que la memòria RAM és només un manat sencer de bytes.
Així que si el teu Mac o el teu PC té dos gigabytes, té 2
milers de milions de bytes de memòria.
>> Ara anem a suposar que només per mantenir les coses bé i ordenat, que
assignar una adreça -
un nombre -
a cada byte de RAM en el seu ordinador.
El primer byte dels 2 MIL MILIONS és pel nombre zero.
El següent és el byte número u, nombre 2, tot el camí cap amunt, punt punt
punt, a prop de 2 mil milions.
>> Així que vostè pot comptar dels bytes de la memòria en el seu ordinador.
Així que anem a suposar que això és el que que entenem per una adreça.
Així que quan veig una int estrelles, el que està passant hauran de ser introduïts en bescanvi ara és el
direcció d'una.
No és el seu valor, però sigui quina sigui la seva postal direcció és, per dir-ho -
la seva ubicació en la memòria RAM.
>> I el mateix per b, vaig dir el mateix.
Int, estel, b.
Com acotació al marge, tècnicament l'estrella podria anar en altres llocs.
Però anem a estandarditzar en l'estrella de ser just al costat del tipus de dades.
>> Així intercanviar signatura significa ara, dóna'm la direcció d'un int, i anomenada
que la direcció a.
I dóna'm una altra direcció d'un int i trucar a aquesta direcció b.
>> Però ara el meu codi aquí ha de canviar.
Perquè si jo declaro temp int -
que encara és de tipus int -
però guardo en una, quin tipus de valor?
Perquè quedi clar, m'estic posant una amb una el codi com està escrit en aquest moment?
>> Estic posant la ubicació en un arxiu.
Però no importa l' lloc, no?
Temperatura hi ha just tercera tassa de Jess existit, amb quin propòsit?
Per emmagatzemar un valor.
Llet o suc de taronja.
No és realment el d'emmagatzemar la direcció de cap d'aquestes coses, que se sent una
poc sense sentit, en aquest veritable context mundial de totes maneres.
>> Així que en realitat, el que jo vull posar en temp no és l'adreça d'una, però el
contingut d'una.
Així que si a és un nombre com 123, aquest és el byte 123 de memòria que un sol
passa a ser ocupant, que el valor en una passa a ser ocupant.
>> Si vull anar a aquesta direcció, He de dir que un estel.
De la mateixa manera, si hagués de canviar el que en la direcció d'una, canvi
aquest per iniciar una.
Si vull emmagatzemar en el que està en el lloc a amb el que està en el lloc
en b, b estrella estrelles.
>> Així que en resum, fins i tot si això no és prou enfonsant encara - i jo no esperaria
que seria tan ràpid -
adonar que tot el que estic fent és prefixar aquestes estrelles als meus variables,
dient que no prendre els valors.
No canvieu els valors.
Però més aviat, anar a les adreces i obtenir el valor.
Anar a aquesta adreça i el canvi el valor allà.
>> Ara permetin-me retrocedir fins al cim, només per corregir aquesta línia aquí, per
canviar el prototip d'igualar.
Però ara he de fer una cosa més.
Intuïtivament, si he canviat els tipus intercanvi d'arguments que està esperant,
Què més he de canviar en el meu codi?
>> Quan dic swap.
Perquè ara mateix, què sóc Em passa de canviar encara?
El valor de x i el valor de i, o la llet i el suc de taronja.
Però jo no vull fer això.
En lloc vull transmetre en què?
La ubicació de xi la ubicació de i.
Quines són les seves adreces postals, per dir-ho.
>> Així que per fer això, hi ha un símbol d'unió.
Ampersand tipus de sons com la direcció.
per a n, signe, la direcció de x, i la direcció d'i.
Així que és deliberat que fem servir símbols d'unió quan es crida a la funció,
i les estrelles quan es declara que l'aplicació de la funció.
>> I pensa en signe com direcció de l'operador, i l'estrella que el
anar-hi operador -
o, més correctament, el operador d'indirecció.
Així que això és un munt de paraules només per diuen que ara, amb sort, bescanvi va
ser correcte.
>> Deixin-me seguir endavant i fer -
anem a realment canviar el nom del fitxer, perquè no Aquest programa encara no es dirà swap.
Jo sostinc que l'anomenarem swap.c ara.
Així que, d'intercanvi.
Dot, slash, intercanviar.
>> I ara de fet, x és 1, i és 2.
I llavors, x és 2, I és un.
Bé anem a veure si podem fer-ho una mica diferent del que és
passant aquí.
En primer lloc, permetin-me apropar una nostre pantalla de dibuix aquí.
I permetin-me proposar un moment - i cada vegada que trec aquí es reflectirà
hi ara - permetin-me proposar que aquí hi ha un munt de memòria o
RAM, dins del meu ordinador.
>> I aquest serà el nombre mossegada, diguem, 1.
Aquest serà bytes número 2.
I vaig a fer un munt més, i després un munt de punts punt punts a
indiquen que hi ha 2000000000 d'aquestes coses.
4, 5, i així successivament.
>> Així estan els primers cinc bytes de la memòria de l'ordinador.
D'acord?
Molt pocs de 2 milions de dòlars.
Però ara vaig a proposar el següent.
Vaig a proposar que x va a emmagatzemar el número 1, i i va
per emmagatzemar el número 2.
I me n'aniré endavant ara i representa aquests valors de la següent manera.
>> Farem això de la següent manera.
Dóna'm només un segon.
Un segon.
D'acord.
Vull fer això una mica més -
farem això una altra vegada.
En cas contrari vaig a utilitzar i el mateixos números, sense voler,
múltiples vegades.
>> Així que el que tenim diferents nombres parlar, anem a trucar a aquest byte
nombre 123, 124, 125, 126, i punts suspensius.
I permetin-me pretenc ara que vaig a posar el valor 1 aquí, i el valor 2
aquí, també conegut com x i y.
Així que dóna la casualitat que aquest és x, aquesta és i.
>> I només per algun atzar, la ordinador, el sistema operatiu,
va passar a posar en la posició x nombre 123.
I i va acabar en la posició 124 -
maleïda sigui.
Hi hauria d'haver fixat això.
Oh home, és el que realment vull fer això?
Sí, vull solucionar aquest problema i b adequada sobre això avui.
Ho sentim, nou en això.
>> 127, 131, i jo no volia ser tan complex, però per què es canvia el
nombres allà?
Perquè vull que els punts a en realitat ser de quatre bytes.
Així que serem super anal sobre això.
Així que si 1 passa a ser tractats 123, el 2 serà en la direcció
127, ja que són només 4 byes de distància.
Això és tot.
I ens oblidem de tot el altres direccions del món.
>> Així que x és en la ubicació 123, I és en la ubicació 127.
I ara, què faig jo en realitat vol fer?
Quan dic intercanvi ara, quin és realment està passant?
Bé, quan jo dic swap, que estic passant la direcció de xi la direcció de i.
Així, per exemple, si aquestes dues peces de paper ara representen els dos
arguments a i b per intercanviar, què sóc jo va a escriure a la primera d'elles,
que vaig a trucar a referir-se com a?
>> Exactament, 123.
Així que això és un reclam.
Aquest és el paràmetre a.
Vaig a posar l'adreça de x en aquest país.
>> Què és això?
>> No, no.
Això està bé.
Segueix sent bo, segueix sent bo.
Així que aquesta és una.
I ara en el segon full de paper, això serà b, i el que estic
serà escrit en aquest tros de paper?
127.
>> Així que l'únic que ha canviat des nostre relat anterior d'aquesta història és,
en lloc de literalment 1 i 2, estic passarà l'any 123 i 127.
I ara vaig a posar això a l'interior d'aquesta caixa de text, d'acord?
Així que aquest quadre negre representa ara la funció d'intercanvi.
>> Mentrestant, anem ara tenen algú implementar la funció d'intercanvi.
Podria algú per aquí Vols ser voluntari?
Anem amunt.
Com et dius?
Charlie.
D'acord, Charlie.
Anem amunt.
>> Així que Charlie jugarà el paper del nostre quadre negre.
I Charlie, el que m'agradaria que vostè faci ara està implementar intercanvi de tal manera
que, donades aquestes dues direccions, estigués realment va
per canviar els valors.
I vaig a xiuxiuejar a l'orella com executar la TV aquí.
>> Així que endavant, i vostè és el quadre negre.
Arribar allà.
Quins valors li veu a una, i quins valors li veu a b?
>> CHARLIE: a és 123 i b és 127.
>> DAVID Malan: OK, exactament.
Ara hi ha una pausa per un moment.
El primer que farem ara, d'acord amb el codi - que
Ara vaig a tirar a la pantalla -
serà la d'assignar una mica mica de memòria anomenat temp.
Així que seguiré endavant i que te de la memòria.
>> Així que això serà una tercera variable que té accés a la
vas temp.
I què vas a escriure en la peça de temp de paper?
>> CHARLIE: Punters, oi?
>> DAVID Malan: OK, bé, no necessàriament punters.
Així que la línia de codi que he ressaltat en la part dreta,
anem a començar per aquí.
Es diu que una estrella.
Així que un emmagatzema actualment el nombre 123.
I només intuïtivament, el que significava estrelles 123?
>> Però específicament, si a és 123, un estel vol dir què?
El valor de a.
O més casual, anar-hi.
Així que em proposo, la celebració de la a en la mà, seguir endavant i intentar que
com si fos un mapa.
I caminar a tu mateix a l'ordinador d' memòria i ens trobarà el que és
en la ubicació 123.
Exactament.
>> Així veiem en la ubicació 123 és el que, òbviament?
OK, llavors quin valor ara és vostè posarà en temperatura?
Exactament.
Així que endavant i fer això.
I escriviu el número 1 en el full de paper que està actualment titulat temp.
>> I ara el següent pas que vostè va a posar en pràctica
serà el.
Doncs bé, en el costat dret de la següent línia de codi és l'estrella b. b, de
Per descomptat, emmagatzema una adreça.
Que s'ocupa 127.
Estrella b vol dir que, casualment parlant?
>> Aneu a la ubicació.
Així que endavant i ens trobar el que és en la ubicació 127.
D'acord.
Per descomptat, en la ubicació 127, segueix sent el valor de 2.
Llavors, què vas ara botiga a el que està en el lloc en el a?
Així que estrella un mitjà aneu a la ubicació a.
Quina és la ubicació d'una?
>> Exactament.
Així que ara, si vostè vol canviar el que està en aquest lloc -
Vaig a seguir endavant i executar l'esborrany és aquí.
I ara posar de nou en el raspall.
Quin nombre vas a escriure en aquest quadre en blanc ara?
>> Exactament.
Així que aquesta línia de codi, que quedi clar - i molt m'aturo el que Charlie està fent i
assenyalar aquí, el que acaba de fer és escriure a la caixa en la posició 123
el valor que estava prèviament en b.
I pel que hem fet ara implementem aquesta segona línia de codi.
>> Ara, per desgràcia, no hi ha segueix una línia que queda.
Ara el que està en temp, literalment?
És obvi que és el número u.
No és una adreça.
És només un nombre, tipus de una variable d'una setmana.
>> I ara quan dius estrelles b, que significa anar a l'adreça b, que és de
curs aquí.
Així que una vegada que arribi allà -
Vaig a seguir endavant i esborrar el que en realitat és allà - ¿I què estàs
vaig a escriure ara en 127 ubicació?
>> CHARLIE: Temp, que és un.
>> DAVID Malan: Temp, que és un.
I el que passa a la temperatura a la final?
Bé, en realitat no ho sabem.
En realitat no importa.
Cada vegada que hem implementat una funció fins al moment, cap de les variables locals que tenen
són, en efecte local.
I simplement desapareixen.
Estan reclamats per l'operació sistema amb el temps.
>> Per tant el fet que la temperatura encara té valor 1 és fonamental
poc interessant per a nosaltres.
Molt bé, així que un aplaudiment si poguéssim de Charlie.
Molt ben fet.
>> Molt bé, així que què més fa Això significa que podem fer?
Així que resulta que hem estat dient algunes mentides piadoses
des de fa força temps.
En efecte, resulta que una cadena, tot aquest temps, no és realment un
seqüència de caràcters per se.
En certa manera és que intuïtivament.
>> Però tècnicament parlant, la cadena és una tipus de dades que es declaren dins de la
la biblioteca CS50 per simplificar el món durant les primeres setmanes de classe.
El que realment és una cadena és l'adreça d'un caràcter en la memòria RAM en algun lloc.
Una cadena és realment un nombre, com 123 o 127, que passa a delimitar
on una cadena comença a la memòria de l'equip.
>> No obstant això, no representa la cadena, per si mateix, a si mateix.
I podem veure això com segueix.
Déjame anar per davant i obrir un codi que està entre
exemples de codi font de l'actualitat.
I jo vaig a seguir endavant i obrir fins, diguem, compari-0.C.
Aquest és un programa amb errors que va per ser implementat de la següent manera.
>> En primer lloc.
Vaig a dir alguna cosa.
A continuació, vaig a seguir endavant i obtenir una cadena de l'usuari
en aquesta línia següent.
A continuació, vaig a dir-ho una vegada més.
Llavors vaig a tenir una altra cadena de l'usuari.
>> I fixin-se, estic mostrant una de les cadenes en una variable anomenada s, i
altra d'aquestes cadenes en una variable anomenada t.
I ara vaig a reclamar, molt raonablement, que si s és igual a és igual a t,
les cadenes són iguals.
Vostè escriu el mateix.
Si no, les cadenes són no és el mateix.
>> Després de tot, si l'entrada de dos enters, dues caràcters, dues carrosses, dues d'elles dobles, qualsevol de
els tipus de dades de què hem parlat fins ara per comparar -
recordem que vam fer molt clar fa un temps que no ho fa, perquè un
signe igual senzill, per descomptat, l'operador d'assignació.
Així que això seria un error.
>> Fem servir el signe igual igual, que de fet compara
coses per a la veritable igualtat.
Però jo afirmo això és erroni.
Si segueixo endavant i fer comparació de zero, i després quin punt slash comparar zero.
I escric en, diguem, hola.
I després direm hola de nou.
Literalment el mateix, l'equip Reclamacions escriure coses diferents.
>> Ara potser jo escrit malament alguna cosa.
Jo escric el meu nom en aquesta ocasió.
Vull dir, hola.
Hola.
És diferent cada vegada.
>> Bé, per què és això?
Què està passant en realitat sota de la caputxa?
Bé, el que realment està passant per sota la campana és la cadena a continuació
He escrit en la primera vegada, per exemple, és la paraula hola, és clar.
Però si representem aquesta sota el capó, recordem que un
cadena té una matriu.
I hem dit tant en el passat.
>> Així que si em baso aquesta matriu com aquesta, estic va a representar alguna cosa molt
similar al que vam fer fa un moment.
I en realitat hi ha alguna cosa especial aquí, també.
Què va ser el que determinem ser en Al final de cada cadena?
No, aquest zero barra invertida, que és només la forma de representar,
literalment, 00000000.
Vuit bits 0 en una fila.
>> No ho sé, la veritat, el que és després d'això.
Això és només un munt més memòria RAM dins del meu ordinador.
Però aquesta és una matriu.
Parlem sobre les matrius abans.
I en general parlem d'arrays com a posició zero,
llavors un, després dos.
Però això és només per conveniència.
I això és totalment relativa.
>> Quan vostè està aconseguint realment la memòria de l'equip, és per descomptat, qualsevol
2 mil milions de alguns bytes imparells, potencialment.
Així que en realitat sota de la caputxa, tot aquest temps, si.
Això podria molt bé ser zero suport.
Però si vostè cava més profund sota el capó, que és realment
abordar nombre 123.
Aquesta és l'adreça 124.
Aquesta és l'adreça 125.
>> I no m'equivoco aquest moment.
Aquests són convertit en un octets més per quina raó?
Què tan gran és un char?
Un char és només un byte.
Un int és típicament quatre bytes.
Així que per això ho vaig fer 123, 127, 131 i així successivament.
Ara puc mantenir la matemàtica més simple i simplement ho fan més 1.
I això és ara el que realment està passant de sota el capó.
>> Així que quan es declara alguna cosa com això, string s, això és en realitat -
resulta -
estrelles caràcters.
Estrella, per descomptat, significa direcció, també conegut com a punter.
Així que és la direcció d'alguna cosa.
Què és l'adreça?
>> Bé -
Sóc l'únic que pot veure el punt important que estic fent, o pensar
Estic fent.
Així cadena -
el trist és que tinc un monitor allà on
podria haver vist que.
>> Bé, llavors cadena s és el Jo vaig declarar anteriorment.
Però resulta que, gràcies a un petit màgia a la biblioteca CS50, tot això
cadena de temps té, literalment, estat estrelles caràcters.
L'estrella significa nou punter o direcció.
El fet que està flanquejant la paraula caràcters significa que és la
direcció d'un personatge.
>> Així que si aconsegueix cadena es diu, i escriviu en H-I-L-L-O, proposar ara el que ha aconseguir
literalment cadena estat tornant tots aquesta vegada, tot i que he lloc
simplificada del món?
Què vol aconseguir string realitat tornar com el seu valor de retorn?
>> 123, en aquest cas, per exemple.
Hem dit anteriorment que arribar cadena simplement retorna una cadena, una seqüència de
personatges.
Però això és una mica d'una mentida piadosa.
La forma obtenir string realment funciona sota de la caputxa és que es posa una
cadena de l'usuari.
Es deixa caure els personatges que ell o ella els tipus en la memòria.
Posa un zero barra invertida al final dels quals la seqüència de caràcters.
>> Però llavors, ¿què no aconseguir string literalment, tornar?
És, literalment, torna la direcció del molt primers bytes en RAM que
s'utilitza perquè la força.
I resulta que només mitjançant la devolució una sola direcció de l'
primer caràcter en la cadena, que és suficient per a la recerca de la totalitat de
la cadena.
>> En altres paraules, arribar cadena no té tornar 123 i 124 i 125.
No m'ha de donar un llarg llista de tots els bytes que
la meva cadena està utilitzant.
Perquè un, tots estan esquena contra esquena.
I dos, la base de la primera adreça, em pot esbrinar on acaba la cadena.
Com?
>> El caràcter nul especial, el barra invertida zero al final.
Així, en altres paraules, si es passa al voltant -
dins de les variables -
la direcció d'un char, i assumeix que al final de qualsevol cadena, qualsevol
seqüència de caràcters com els éssers humans pensar en cadenes, si s'assumeix que
al final de la cadena hi un zero barra invertida, ets d'or.
Perquè sempre es pot trobar el final d'una cadena.
>> Ara el que realment està passant després en aquest programa?
Per què és aquest programa, comparar-0.C, amb errors?
El que en realitat s'està comparant?
Sí?
>> ESTUDIANT: [inaudible].
>> DAVID Malan: Exactament.
És la comparació dels llocs de les cadenes.
Així que si l'usuari ha escrit en hola una vegada, com jo, la memòria podria acabar
buscant d'aquesta manera.
Si l'usuari llavors envia a Hola de nou, però cridant obtenir string nou, c és
no particularment intel · ligent a menys que vostè ensenya que sigui intel · ligent escrivint codi.
>> C -
i els ordinadors en general -
si escriu en la paraula hola de nou, ja saps el que vas a obtenir.
No ets més que va a aconseguir una segona matriu de memòria que, sí, passa ser
emmagatzemar H-I-L-L-O i així successivament.
>> Va a tenir el mateix aspecte que nosaltres els éssers humans, però aquesta adreça
podria no ser 123.
Només podria passar que la sistema operatiu compta amb alguns
espai, per exemple en el lloc -
direm alguna cosa arbitrària, com això és la ubicació 200.
I aquesta és la ubicació 201.
I aquesta és la ubicació 202.
No tenim ni idea d'on és estarà en la memòria.
>> Però el que això vol dir és que el que és va a ser emmagatzemat en última instància, en si?
El nombre 123.
Què va a ser emmagatzemat en t, en aquest exemple arbitrària?
El nombre 200.
I tot això significa és, llavors, òbviament, 123 no és igual a 200.
I així, aquesta condició si no s'avalua en true.
A causa cadena get utilitza diferents trossos de memòria cada vegada.
>> Ara podem veure això de nou en un altre exemple.
Déjame anar per davant i obrir copy-0.C.
Sostinc que aquest exemple es va a provar - però fallen - copiar dues cadenes
de la següent manera.
>> Vaig a dir alguna cosa per a l'usuari.
Llavors vaig a tenir una corda i cridar s.
I ara, que estic fent aquesta prova aquí.
Comptem això fa un temps.
Però quan pot obtenir retorn cadena nul · la, altre caràcter especial, o especials
símbol direm.
Si està fora de la memòria.
>> Per exemple, si l'usuari és realment sent difícil i escriu un atroç
nombre de caràcters en la teclat i accessos Retorn.
Si aquest nombre de caràcters no pot cabre a la RAM per la babalà
raó, també aconsegueixi cadena podria molt bé tornar null.
>> O si el seu programa en si està fent molt d'altres coses i no només
No hi ha prou memòria per a la cadena get Per tenir èxit, podria acabar
tornant nul.
Però siguem més precisos pel que fa al que és això.
Què és el tipus de dades de s realment?
Estrelles Char.
>> Així que resulta que ara ens pot pelar còpies de la capa d'nul.
Resulta que, null és - sí, òbviament, un símbol especial.
Però què és realment?
Realment, nul · la és només un símbol que els éssers humans utilitzen per representar a zero també.
>> Així que els autors de C i ordinadors més en general, va decidir fa anys
que, ja saps què.
Per què no ens assegurem que cap usuari les dades són sempre, sempre, sempre
emmagatzemat en zero adéu?
De fet, fins i tot en el meu exemple arbitrària abans, jo no vaig començar la numeració
bytes en zero.
Vaig començar a un.
Perquè sabia que la gent en el món han decidit reservar el zero
octet en la memòria RAM de ningú com alguna cosa especial.
>> La raó és que, en qualsevol moment que desitgi un senyal que alguna cosa ha anat malament
respecte de les adreces, que va tornar null - també conegut com a zero -
i perquè saps que no hi ha fiar de dades a l'adreça zero, clarament
que significa un error.
I és per això que, per convenció, el registre de nul · la i tornada una mica
com un d'aquests casos.
>> Així que si ens desplacem fins ara, això és només a continuació, alguns de comprovació d'errors, per si de cas
alguna cosa va sortir malament amb [? rescatar?]
en conjunt i sortir del programa mitjançant la devolució primerenca.
Aquesta línia ara podria reescriure com aquest, el que significa què?
A la banda esquerra, dóna'm una altra punter a un caràcter, i en diuen t.
Què estic emmagatzemant dins de t, amb base en aquesta línia de codi?
>> Estic emmagatzemar una ubicació.
Específicament la ubicació això va ser en si.
Així que si l'usuari ha escrit en hola, i aquest primer hola passi a acabar
aquí, a continuació, el nombre 123 és tornarà a aconseguir
corda i ser emmagatzemats -
com hem dit abans -
al s.
>> Quan ara em declaro un altre punter a un char i cridar t, quin nombre és
literalment, va a acabar en t segons la història?
Així que 123.
>> Així que tècnicament ara tant s com t apunten a l'exacta
mateixos fragments de memòria.
Així adonar del que faré ara per demostrar que aquest programa està lliure d'errors.
>> Primer vaig a reclamar, amb 1 f impressió, capitalitzant
la còpia de la cadena.
A continuació, faré una mica de Comprovació d'errors.
Vaig a estar segur.
Anem a fer de la cadena es troba en t com a mínim major que zero de longitud,
així que hi ha una mica de caràcter no per capitalitzar en realitat.
>> I llavors vostè pot recordar aquesta dels exemples anteriors.
2 superior - que és en l'arxiu ctype.h.
T bracket zero em dóna zero caràcter de la cadena t.
I 2 superior d'aquest mateix valor, de Per descomptat, la converteix a majúscules.
>> Així intuïtiva, aquesta línia va destacar de codi és majúscula la primera
lletra t.
Però no és la capitalització, de manera intuïtiva, la primera lletra s.
Però si vostè està pensant en el futur, ¿què sóc jo a veure quan executo aquest programa
i imprimir tant en l'original, s, i l'anomenada còpia, t?
>> Són en realitat va a ser la mateixa.
¿I per què van a ser els mateixos?
Els dos estan apuntant a exactament el mateix.
Així que anem a fer això.
>> Fer còpia zero.
Compila acord.
Déjame córrer zero còpia.
Permetin-me Escriu alguna cosa com hola a en minúscules feu clic a D'acord.
I afirma que tant la s original, i la còpia són de fet idèntics.
>> Així que el que realment ha passat aquí?
Permetin-me tornar a dibuixar la imatge només per explicar la història d'una
lleugerament diferent manera.
El que realment està passant per sota de la campana quan em declaro una cosa així com
Char inici s, o una cadena s, M'estic fent un punter -
que passa a ser 4 bytes en l'aparell CS50
i en una gran quantitat d'ordinadors.
I jo vaig a trucar a aquest s.
I això té actualment algun valor desconegut.
>> Quan es declara una variable, llevat que vostè posar un valor no, que
sap el que hi ha.
Podria ser una seqüència aleatòria de bits de l'execució anterior.
Així que quan jo, en la meva línia de codi poso cadena i, a continuació, guardar la tornada
valor de s aconsegueix cadena d'alguna manera -
i que finalment va a pelar com arribar obres de corda, d'alguna manera assigna un
matriu que sembla probable una mica com això.
H-I-L-L-O, la barra invertida zero.
>> Suposem que aquesta és l'adreça 123 acaba primer consistència.
Així que torna de corda, al línia ressaltada no, torna el
nombre vam dir, 123.
Així que el que realment succeeix a l'interior de s aquí?
>> Bé, el que realment passa interior de s és 123.
Però, francament, m'estic posant una mica confós per totes aquestes direccions,
tots aquests nombres arbitraris.
123, 124, 127.
Així que anem a simplificar la realitat el món una mica.
>> Quan parlem de punters, francament, a nosaltres els éssers humans, qui diables li importa d'on
les coses són a la memòria?
Això és completament arbitrària.
Això dependrà de com quantitat de RAM que té l'usuari.
Això dependrà del moment en el dia d'executar el programa, potser, i
el que d'entrada l'usuari li dóna.
Estem aturar-se en detalls sense importància.
>> Així que anem a abstreure i dir que, quan s'executa una línia de codi com aquest,
caràcters estrelles s 'aconsegueix el retorn valor de cadena get.
Per què no en lloc de simplement dibuixem el que seguir trucant a un punter com si fos
que apunta a alguna cosa?
Així que pretenc ara que s fins hi ha un punter -
sota de la caputxa és una direcció.
Però és només apunta el primer byte al
cadena que ha estat retornat.
>> Si ara torno al codi aquí, el que està passant en aquesta línia?
Bé, en aquesta línia ressaltada ara, Estic declarant semblar una altra
variable anomenada t.
Però també és un punter, així que vaig treure, ja que, en teoria, l'exacta
mateix quadre de mida.
I jo vaig a dir-t.
>> I ara, si ens remuntem al codi nou, quan guardo s dins de t,
el que estic tècnicament posar dins t?
Bé, tècnicament, aquest va ser el número 123.
Així que en realitat hauria d'estar escrivint el número 123 allà.
Però anem a prendre més alt nivell.
t, si és només un punter, intuïtivament, és només això.
Això és tot el que s'està emmagatzemat allà.
>> Així que ara a les últimes línies interessants del Codi, quan en realitat vaig sobre
aprofitant el caràcter zero en t, el que està passant?
Bé, t bracket zero ara apunta a quin personatge, presumiblement?
>> Està assenyalant h.
Perquè t bracket zero -
recorda, aquesta és la sintaxi antiga. t suport zero simplement vol dir que si t és una cadena, t
Suport de zero significa aconseguir el zero caràcter en que la força.
Així que el que realment significa és anar a aquesta sèrie -
i sí, això podria ser 123, això podria ser 124.
Però tot és relatiu, recorda.
Sempre parlant d'una matriu, tenim l'avantatge de parlar de
índexs relatius.
>> I així que ara només podem suposar que t és zero suport h.
Així que si et dic 2 amunt en ell, el que és realment fent és aprofitar
la h minúscula a majúscula H. Però, és clar, el que és s?
S'assenyala a la mateixa corda donaran.
>> Així que això és tot el que està passant en aquest codi fins ara.
Quina és llavors la conseqüència?
Com podem solucionar aquests dos problemes?
Com ens comparem amb cordes reals?
>> Bé intuïtivament, com vostè va sobre la comparació de dues
cadenes per a la igualtat real?
>> Què vol dir que si dos cadenes són iguals?
És evident que no és que les seves adreces són igual en la memòria, perquè això és un baix
detall d'implementació de nivell.
Tots els caràcters són els mateixos.
Així que em proposo, i permetin-me presentar en la versió un compare.c
aquí, així que compari-1.c.
>> Permetin-me proposar que encara obtenim un punter anomenat s, i emmagatzemar en ella el
tornar el valor de la cadena de get.
Farem el mateix amb t.
Així que res que el codi és diferent.
Vaig a afegir una mica de més comprovació d'errors ara.
Així que ara que estem en una mena de pelar això capes en CS50 del que una cadena
és en realitat, hem de ser més anal tracta d'assegurar-se que no abusem
valors no vàlids com nul · la.
>> Així que només vaig a comprovar.
Si s no fa iguals nul · la i T no igual null, el que significa que estem bé.
Get string no ficar la pota aconseguir cap d'aquestes cadenes.
I vostè pot potser endevinar ara, què Què STR CMP presumiblement fer?
Cadena comparar.
>> Així que si vostè té el programa en Java abans, això és com el mètode és igual al
classe string.
Però per a aquells de vostès que no tenen programat abans,
això és només una funció de c.
Passa que vénen en un arxiu anomenat string.h.
Aquí és on està declarat.
>> I string comparar -
En realitat no recordo el seu ús, però això no importa.
Recordem que podem fer home, regiri comparar.
I això portarà el Manual de programadors Linux.
I és, francament, una mica críptic.
Però puc veure que aquí, si.
He de incloure string.h.
>> I aquí diu en la descripció, "la funció de comparació de cadena compara
les dues cadenes S1 i S2. "I S1 i S2 són pel que sembla els dos
arguments passats polz
Realment no recordo el que const és, però ara es va adonar -
i vostè va poder haver vist això ja quan has utilitza les pàgines de manual
tenir-ho tot -
aquesta estrella char és només sinònim de amb una corda.
>> Per tant, compara les dues seqüències, S1 i S2, i que retorna un enter menor
o igual que o major que zero si es troba S1, respectivament, per a ser
menor que, o el partit, o ser més gran que S2.
Aquesta és una forma molt complexa de dir aquesta cadena comparar rendiments
zero si dues cadenes són intuïtivament idèntiques, caràcter de
caràcter a caràcter.
>> Es retorna un nombre negatiu si s, per ordre alfabètic, se suposa
venir abans de t.
O retorna un nombre positiu si s se suposa que vénen després de t
alfabèticament.
Així, amb aquesta simple funció, podria que, per exemple, ordenar una
manat sencer de paraules?
>> Així que en aquesta nova versió, vaig per seguir endavant i fer Comparación1.
Dot slash comparar un.
Jo escric en hola en minúscules.
Vaig a escriure hola en minúscules nou.
I per sort ara s'adona He escrit el mateix.
>> Mentrestant, si escric en hola a menor HOLA cas i en majúscules i
comparar, vaig escriure coses diferents.
Com que no només són les adreces diferent, però estem comparant
diferents personatges una i altra vegada.
>> Bé, anirem a arreglar un un altre problema ara.
Permetin-me obro una versió de còpia, que ara dirigeix
aquest problema de la següent manera.
I aquest va a buscar una mica més complex.
Però si es pensa en quin és el problema que necessitat de resoldre, espero que això serà
esborrar en un moment ara.
>> Així que aquesta primera línia, caràcters d'inici t, en termes senzills podria algú proposar
el que aquí significa aquesta línia?
Char estrella t, el que fa?
>> Bé.
Crear un punter a alguna lloc en la memòria.
I m'ho dius perfeccionar una mica.
Declari una variable que emmagatzemarà la direcció d'algunes xerrades a la memòria, simplement
a ser una mica més adequat.
>> OK, així que ara en el costat dret, no tinc mai havia vist una d'aquestes funcions
abans, malloc.
Però, què pot significar això?
L'assignació de memòria.
>> Així resulta que, fins ara, realment no han tingut una poderosa manera de
demanant el sistema operatiu, dóna'm una mica de memòria.
Més aviat, ara tenim una funció anomenada malloc que fa exactament això.
Tot i que això és una mica d'un distracció en aquest moment, notar que en
entre els dos parèntesis és només serà un nombre.
On he escrit en qüestió les marques poden ser un nombre.
>> I aquest nombre significa, dóna'm 10 bytes.
Dóna'm 20 bytes.
Dóna'm 100 bytes.
I malloc farà tot el possible per demanar al sistema operatiu -
Linux, en aquest cas -
bo, són els seus 100 bytes de RAM?
Si és així, tornar aquests bytes a mi per tornar la direcció de
aquests bytes, potser?
El primer de tots.
>> Així que aquí també - i això és predominant en C, en qualsevol moment que ets
tractar amb adreces?
Estàs gairebé sempre es tracta de la primer com la direcció, no importa el gran
un tros de memòria que està sent retornat, per dir-ho.
>> Així que anem a bussejar aquí.
Estic intentant assignar la forma molts bytes, exactament?
Bé.
Longitud de la seqüència de s - anem a fer un exemple concret.
Si s és hola, H-I-L-L-O, quin és el longitud de la cadena de s, per descomptat?
Així que és de cinc anys.
Però estic fent un plus 1 en això, per què?
Per què vull 06:00 bytes en lloc de cinc?
El caràcter nul.
>> No vull deixar fora d'aquest caràcter nul especial.
Perquè si faig una còpia de Hola i Acabo de fer H-I-L-L-O, però no poso
aquest caràcter especial, l'equip potser no tingui, per casualitat, una barra invertida
zero allà per a mi.
I pel que si que estic tractant d'esbrinar la La longitud de la còpia, jo podria pensar que
és 20 caràcters de llarg, o un milió caràcters si mai passa
per colpejar una barra invertida zero.
>> Així que necessitem 6 bytes per emmagatzemar H-I-L-L-O, la barra invertida zero.
I a continuació, això és només ser super anal.
Suposem que se m'oblida el que la grandària d'un char és.
Seguim dient que és un byte.
I en general és.
En teoria, podria ser alguna cosa diferent, en un Mac diferent o una
diferents PC.
>> Així que resulta que hi ha aquest operador anomenat sizeof que si se li passa la
nom d'un tipus de dades - com char o int o float -
se li informarà, de forma dinàmica, el nombre de bytes un char ocupa en aquest
en particular equip.
>> Així que això és efectivament només com temps de 1 o dient
vegades res en absolut.
Però ho estic fent per estar súper anal, que en cas d'un char difereix
en el seu equip davant la meva, així les matemàtiques sempre va a la sortida.
>> Finalment, aquí puc comprovar null, que és sempre una bona pràctica - de nou,
qualsevol moment que estem tractant amb punters.
Si malloc no era capaç de donar em 06:00 byes - que és
poc probable, però per si de cas -
tornar immediatament.
I ara, endavant i copiar la cadena com segueix.
I aquesta és la sintaxi familiar, encara que en un paper diferent.
>> Vaig a seguir endavant i obtenir la cadena longitud s i deseu-lo en n.
Llavors repetiré d'i és igual zero fins i incloent N,
més gran que o igual a.
Així que en cada iteració, vaig posar el caràcter i-èsim de s en l'i-èsim
caràcter de t.
>> Així que el que realment està passant per sota la campana d'aquí?
Bé, si aquest, per exemple, és s -
i he escrit en la paraula H-I-L-L-O i hi ha una barra invertida zero.
I de nou, això és s apuntant aquí.
I aquí és t.
>> I això està apuntant ara a una còpia de la memòria, oi?
Malloc m'ha donat un conjunt tros de memòria.
No sé el que és un principi en qualsevol d'aquestes ubicacions.
Així que vaig a pensar en ells com un munt de signes d'interrogació.
>> Però tan aviat com em poso un bucle de zero en un màxim a través de la longitud de s, t
suport de zero i t suport de 1 -
i vaig a posar això ara a la sobrecàrrega -
t suport de zero i s suport de mitjana zero que vaig a copiar
iterativa h aquí, E-L-L-O. A més, com ho vaig fer en el signe més
1, la barra invertida zero.
>> Així que ara en el cas de comparació-1.c, al final, si imprimeixo el
capitalització de t, hem veure que s ha canviat.
Déjame anar endavant ara i fer això.
Així que copy1.
Dot slash copy1.
Vaig a escriure hola, Retorn.
I ara compte, només la còpia s'ha capitalitzat.
Perquè jo realment tinc dos fragments de memòria.
>> Desafortunadament, vostè pot fer alguna cosa bonica les coses dolentes i molt perillós aquí.
Permetin-me llevo un exemple aquí ara, que ens dóna un exemple d'uns pocs
diferents línies.
Així que intuïtivament aquí, la primera línia de codi, int estrelles x, està declarant
una variable anomenada x.
¿I quin és el tipus de dades d'aquesta variable?
Quin és el tipus de dades d'aquesta variable?
Aquest no va ser el melodrama.
>> El tipus de dades és l'estrella int.
Llavors, què significa això? x emmagatzemar la direcció d'un int.
Tan simple com això.
I es va a emmagatzemar el direcció d'un int.
Quina és la tercera línia de codi fent allà?
Es assignació de quants bytes, més probable?
Quatre.
Degut a la mida d'un int és generalment 4, malloc de quatre dóna
em torna la direcció d'una part de la memòria, el primer de els bytes és
emmagatzemat ara en x.
>> Ara ens estem movent una mica més ràpid.
Estrella x significa què?
Significa anar a aquesta adreça i posar el que el nombre allà?
Poseu el número 42 allà.
Star i significa anar al que és a i i posar el número 13 allà.
>> Però espereu un minut.
El que està en i en aquest moment?
Quina és l'adreça i l'emmagatzematge?
No ho sabem, oi?
Mai hem una vegada utilitzar l'assignació i la participació d'operador.
Per tant i com es va declarar en la segona línia de codi és només un valor del fem, un gran
signe d'interrogació per dir-ho.
Podria estar apuntant a l'atzar a res en la memòria, el qual
en general és dolent.
>> Així que tan aviat com arribem a aquesta línia allà, estrella i és igual a 13, una cosa dolenta,
una cosa molt dolenta està a punt a passar a Binky.
Així que anem a veure el que va a acabar passant a Binky aquí en aquest moment
o així que busca.
>> [REPRODUIR VIDEO]
>> -Ei, Binky.
Desperta.
És temps per a la diversió punter.
>> -Què és això?
Assabenti dels punters?
Oh, que bé.
>> -Bé, per començar, crec que estem Va a 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 ser apuntant a res.
>> -Això és.
Inicialment, els punters no ho fan apuntar a res.
Les coses que apunten són anomenats pointees i configurar és un
etapa separada.
>> -Oh, és clar, és clar.
Ja ho sabia.
Els pointees estan separats.
Llavors, com s'assigna un pointee?
>> -OK.
Bé, el codi assigna una nova sencers pointee, i aquesta part fixa x
perquè apunti a ell.
>> -Escolta, que es veu millor.
Així que faci alguna cosa.
>> -OK.
Vaig a eliminar la referència del punter x per emmagatzemar el número 42 en el seu pointee.
Per aquest truc, necessitaré meva màgia vareta d'eliminació de referències.
>> -La teva vareta màgica de l'eliminació de referències?
Uh, això és genial.
>> -Això és el que el codi es sembla.
Vaig a configurar el nombre, i -
>> -Ei, mira.
Aquí va.
Així que fent un dereference en x segueix la fletxa per accedir al seu pointee.
En aquest cas, per emmagatzemar 42 en allà.
Ei, intenteu fer servir per emmagatzemar el nombre 13 a través de l'altre punter, i.
>> -OK.
Jo vaig a anar d'aquí cap ii Obtenir el número 13 establert.
I després prendre la vara de eliminació de referències i just -
Whoa!
>> -Oh, hey.
Això no va funcionar.
Diguem, Binky, jo no crec que la eliminar la referència i és una bona idea,
perquè la creació de la pointee és un pas separat.
I jo no crec que mai ho vam fer.
>> -Hmm.
Bon punt.
>> -Sí, ens van donar la i punter.
Però mai ens vam posar a apuntar a una pointee.
>> -Hmm.
Molt observador.
>> -Ei, vostè està buscant bo allà, Binky.
Pots arreglar-ho de manera que i punts a la mateixa pointee com x?
>> -És clar.
Vaig a utilitzar el meu vareta màgica de la assignació de punter.
>> -És que serà un problema com abans?
>> -No.
Això no toca els pointees.
Només canvia un punter per assenyalar a la mateixa cosa que una altra.
>> -Oh, ja veig.
Ara i apunta al mateix lloc que x.
Així que esperar.
Ara i és fix.
Té una pointee.
Així que vostè pot provar la vareta d'eliminar la referència de nou
per enviar el 13 més.
>> -OK.
Heus aquí.
>> -Ei, mira això.
Ara dereferencing obres i.
I pel fet que els punters estan compartint que un pointee, es
tant veure el 13.
>> -Sí.
Compartint.
El que sigui.
Així que anem canvien de lloc ara?
>> -Oh, mira.
Se'ns acaba el temps.
>> -Però -
>> -Només recorda els tres normes punter.
Número u, 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 establir un punter, però a
oblidi donat un pointee.
>> Número dos, el punter comença desreferenciació en el punter i segueix el seu
fletxa per accedir al seu pointee.
Com tots sabem, això només funciona si hi ha és un pointee, que torna a
la regla número u.
>> Número tres, assignació de punter pren un punter i canvis perquè apunti a
la mateixa pointee com un altre punter.
Així que després de la cessió, els dos punters es
apuntar a la mateixa pointee.
A vegades això es diu compartir.
I això és tot el que cal fer, de veritat.
Bye bye ara.
>> [FI REPRODUCCIÓ DE VÍDEO]
>> DAVID Malan: Així que més de punters, més en Binky setmana.
Ens veiem el dilluns.