[Powered by Google Translate] [Semajno 4, daŭrigis]
[Davido J. Malan - Universitato Harvard]
[Jen CS50. - CS50.TV]
>> Ĉi tiu estas CS50, kaj ĉi tiu estas la fino de semajno 4.
Do iuj bonaj novaĵoj kaj iuj malbonaj novaĵoj.
Neniu prelego lundon, ne estas problemo starigis proksima semajno. [Studentoj huraado]
Vi ne tuj ŝatis kie ĉi iras.
Sed ni havas ĉi anstataŭ sekva merkredo,
kaj ekzistas ankaŭ por la syllabus 1 vendredo prelego venontan vendredon por ke ni povas resti sur vojo.
Sed ĉiu estos filmado kiel kutime, do ne zorgu.
>> Kaj rilate al kvizon 0 kion ni faros al semajno fino
estas eldoni en la kurso de hejmpaĝo cs50.net eksplikon
de kia atendojn vi devus havi, kiam temas pri la unua kvizo.
En ĝenerala, estos multnombraj elekto, vera-malvera, mallonga respondo, mallonga kodigo problemojn.
Vi ne tuj atendus apliki la ekvivalenta
de problemo ke vi vidus sur pset, por kiuj vi havas komputilon
kaj erarserĉilo kaj similaj, sed ne estos malgranda kodigo problemojn.
>> Kaj efektive, la plej bona gvidilo por akiri senton de tio, kion CS50 kvizojn estas kiel
estas iri al cs50.net, iru al la Quizzes ligilo,
kaj vi povas vidi la pasintaj kelkaj jaroj valoro de Quizzes.
Nur rimarkas ke la kursaro ne ĉiam estis la sama dum la jaroj.
Kelkfoje oni aldonas, foje subtrahi,
do se vi vidas iun temon en unu el tiuj malnovaj kvizojn
ke vi tute ne scias kion ĝi parolas, ĝi estas tre bone, ke ni ne kovras ĝin
aŭ kiu ne kovris ĝin.
Sed en la formo de recenzoj, ĉi dimanĉo, lundo, kaj Mardo
tiel kiel kurson mondaj revizio kunsido je dimanĉo nokte -
tempo kaj loko por anonci en la paso de hejmpaĝo -
vi ĉiuj havas ŝancon por revizii la kurson de instruado uloj
la materialo por ĉi tiu jaro, ambaŭ en sekcio kaj kiel plena klaso,
kaj tiuj estos filmado kiel kutime ankaŭ.
>> Bone. Do sen pli enkonduko, unu komenton pri pass / maltrafas kaj aldoni / faligi.
Vi eble vidis miajn notojn hieraŭ nokte, kaj ĉi tiu estas vere nur iuj aldonaj konsilojn
ke se vi estas inter tiuj aparte malpli komfortaj aŭ ie inter
kaj vi sentante malmulta en super via kapo,
rimarkas ke estas ja sufiĉe normala, kaj ekzistas ampleksa apogo strukturo en loko,
unu el kiuj oficejo horoj estis la intenco de plibonigo des pli por mia retpoŝto lasta nokto,
kaj realigi ankaŭ, ke estas eblo kiel pasas / malsukcesos por klaso kiel tiu
vere estas intencita kiel mekanismo por preni la rando ekstere de kurso kiel ĉi tiu,
por ke denove se vi elspezante tiuj 10, 15, 20 horoj
nur klopodis akiri pset labori kaj vi scias ke estas 90-95% de la vojo
sed vi ne povas trovi iujn malbenita cimo, en pass / malsukcesos modelo kiu estas speco de okay.
>> La ideo estas ke kun tiu mekanismo vi povas tiam iru fokuso sur via aliaj psets
aŭ dormi aŭ kiel ajn ĝi estas, ke vi volas enfokusigi.
Do rimarkas ke vi havas ĝis la proksima mardo - teknike la 5a lundo,
sed ĝi estas ferio, do ĉi venas mardo - ŝanĝi de pass / malsukcesas gradita aŭ inverse.
Kaj se vi estas vere en la abismon kaj pensas delasante aro,
bonvolu kapti min post prelego aŭ faligi min noton.
Ni ŝatus almenaŭ babilejo antaux vi diros adieu.
Bone. Do ni komencis prenante la trejnado radoj ekstere lasta fojo.
En aparta, ni centris en linio.
Linio estas io ke tio deklaris en la CS50 biblioteko,
specife en tiu dosiero nomata cs50.h kiu ni komencu rigardi ĉi tiun semajnon kaj apud.
Sed kordoj estas vere nur simpligo de io
ke estas iom pli arcanely priskribita kiel char *.
Char ni estas familiara kun. Estas nur sola karaktero.
Sed * ekde lundo signifita kio? >> [Studento] A puntero.
Al puntero. Kaj kio estas puntero? >> [Studento] An adreso.
>> Estas kiel adreson, loko en memoro.
Kio estas la adreso aŭ situo aŭ memoro?
Denove, ni ĉiuj havas tekkomputiloj kun koncerto aŭ 2 gigabajtoj de RAM probable tiuj tagoj,
kaj tio signifas ke vi havas miliardoj aŭ 2 miliardoj bitokoj valoro de memoro.
Kaj ĝi ne vere gravas kion fizike similas,
sed prenu sur fido, kiun vi povas kalkuli ĉiujn individuajn bitokoj ke via propra komputilo havas -
ĉi tiu estas bajto 0, ĉi tiu estas bajto 1, ĉi tiu estas bajto 2 miliardoj -
kaj tio estas ĝuste kion komputilo faras.
Kiam vi destini spaco por sola karaktero, ekzemple,
ĝi evidente havas por vivi ie en via komputilo memoro,
kaj eble ĝi estas en bajto numeron 12345,
kaj tio estas ie tie supre en via komputilo memoro.
Kaj la adreso tiam de tiu karaktero estas 12345.
>> Nun, en semajno 0 tra nun tiele nun, ni ne vere zorgis
kie en memoro aĵoj estas stokitaj ĉar ni kutime uzas simbolojn,
variabloj, kaj tabeloj por fakte atingi niajn datumojn.
Sed ekde lundo kaj des pli nuntempe, vi nun havos
des pli esprima kapablojn kun skribi programojn
por vere manipuli komputilon memoro tamen vi vidas persvadi,
por ambaŭ bonaj intencoj kaj malbonaj,
erarojn esti tre komuna rezulto je ĉi tiu punkto en lerni ĉi aĵoj.
Sed kion tio vere signifas esti char *?
Ni iru antaŭen al - kaj ni revenos al Binky kiel promesis hodiaŭ.
Ni iru al simpla ekzemplo tie.
Lasu min savi ĉi tiun dosieron kiel compare.c, kaj lasu min nur ricevi iun ŝablonon kodo tie
tiel inkluzivi stdio.h, lasu min ankaux doni min inkluzivas cs50.h. Mi zomi tie supre.
Lasu min komenci skribi ĉefa int, ĉefa (malplena), kaj nun mi volas fari ion kiel jene:
printf ("Donu al mi string:") kaj tiam mi uzos ĉenon s gets GetString
por havi ĉenon de la uzanto, tiam mi tuj demandos la uzanton por alia.
("Donu al mi alian string:") kaj mi tuj petas ilin tra GetString atingi tion.
Mi nomas ĝin t ĉar t venas post s kaj s estas bela nomo por kordoj, se ĝi estas bela generic.
Do GetString, kaj nun mi volas nur fari prudento ĉeko kaj mi tuj diros
se (j == t) tiam mi nur diros la uzanto printf ("Vi tajpis la samon! \ n");
alie mi tuj presi ion kiel ("Vi tajpitaj io malsama! \ n")
aŭ kion ajn la frazo estos. Do io simila.
Tiam kiel kutime, mi revenos 0 kiu ĵus indikis, ke nenio malbona okazis,
kaj mi tuj iros antaŭen kaj tradukigi kaj ruli tiun programon.
>> Sed lunde ni kuris koncerna programo,
kaj fakte estis dirinta ke SALUTON ne SALUTON kaj Adiaŭ ne estas adiaŭ.
La konduto ni vidis, estis iom pli kiel ĉi tio.
Lasu min iri al mia fonto dosierujo, zoom ĉi tien, kaj ni do faru kompari.
Kompilita okay. Mi kuros kompari. Donu al mi kordoj: SALUTON.
Donu al mi alian kordoj: SALUTON.
Vi tajpis ion malsama!
Nu, mi provos ion simplan kiel 50, 50. Vi tajpis ion malsama!
hi, hi. Do klare, iu okazas tie.
Sed kio estis la klarigo por tio?
Ŝajne, linio 12 estas tute disfuncional.
Kio estas la fundamenta problemo ĉi tie? Yeah. >> [Studento] Oni komparas la adresoj.
Yeah, precize. Ĝi estas vere komparas la adresoj
en kiu SALUTON kaj SALUTON estas stokitaj.
Ĝi estas ne kompari la literoj SALUTON denove kaj denove,
ĉar tio, kio vere okazis, ĉiuj ĉi tempo ni estis uzante GetString -
Tiu ĉi tabulo estas denove nia komputilo memoro,
kaj diru mi vokas GetString post deklari variablon s.
Kion do mia memoro aspektas?
Ni arbitre diras ke s aspektas kiel ĉi tio. Ĝi estas kvadrata.
Kaj preskaux iu tempo mi desegnis pecon de memoro sur la ekrano
se estas 32 bitoj Mi estis desegni kvadratoj kiel ĉi tion ĉar ĝuste en la aparaton,
puntero, adreson, estas 32 bitoj. Ĝi estas la sama kiel int.
Kiu povas varii bazita sur komputila sistemo.
Tiuj el vi, kiuj estas pigre familiara kun la fakto ke via Mac aŭ PC estas 64 bitoj,
ke en la praktiko signifas, ke via komputilo uzante 64-bitan punteros,
64-bita adresoj, kaj inter la upsides de tiu estas via komputiloj
povas havi multe pli RAM ol pasintaj tempoj.
Longan rakonton, reen en la tago, kiam komputiloj uzis nur 32 bitoj
por reprezenti adresoj, la plej granda nombro da bajtoj vi povus reprezenti
en tiu kazo estis kio, se vi havas 32 bitojn?
Do 4 miliardoj, rajto, ĉar 2 al la 32 estas 4 miliardoj.
Ĉi tiu nombro estas _recurring_ en la kurso.
>> Do, se vi nur havas 32 bitojn, la plej alta nombro vi povas rakonti al estas proksimume 4 milionoj.
Sed tio estis fundamenta limigo de komputiloj ĝis antaŭ kelkaj jaroj
ĉar se vi nur povas kalkuli tiel alta kiel 4 miliardoj,
ne gravas se vi aĉetos 8 gigabajtoj de RAM aŭ eĉ 5 gigabajtoj de RAM;
vi ne povas kalkuli ke alta, tiel estis senutila.
Vi nur povis aliri la unuaj 3 aŭ 4 gigabajtoj de via komputilo memoro.
Tio estas malpli de temo nun, kaj vi povas aĉeti MacBook Avantaĝoj kaj valetoj
kun 8 gigabajtoj de RAM aŭ eĉ pli ĉi tiuj tagoj.
Sed se mi rezervu sufiĉe simple en ĉi tiu programo puntero, puntero nomita s,
eble aspektas kiel tiu en la ekrano cxar ja ni bezonas senŝeligi reen ĉi tavolo.
Mi parolas tiele kordoj, sed ekde lundo, kordoj estas vere char *,
la adreso de iu gravulo.
Do ni prenu, ke trejnado rado ekstere kvankam ni daŭre uzi GetString por nun.
Do mi deklaris s, kaj ĉi tiu estas peco de memoro, 32 bitoj.
Kio estas en ĉi tie en memoro defaŭlte? >> [Inaudible studento respondon]
Kio estas tio? >> [Studento] Garbage. >> Garbage. Ekzakte.
Se vi la programisto ne metas valoron en variablo, kiu scias kio ĝi estas?
Kelkfoje vi ricevas bonŝanca kaj estas 0, kio estas speco de bona, pura defaŭlta valoro,
sed kiel ni vidis lundo, foje ĝi estas kompleta sensencaĵo,
iuj vere grandaj pozitivaj aŭ negativaj numero kiu venis de kie?
Yeah. >> [Studento] La funkcio antaŭe. >> Jes.
>> Ofte la funkcio kiu got nomis antaŭe pro memoras,
kiel vi nomas funkcioj en memoro, ili prenu pli kaj pli spaco de la fundo supren,
kaj tuj kiam la funkcio revenas, ke memoro gets reutilizado
per la venonta ulo kiun gets vokis, kiu uzas vian saman tranĉaĵo de memoro.
Kaj se vi havas maldekstre rubo tie, antaŭaj valoroj,
ni povus konfuzi s kiel havanta iun valoron kiam vere ni ne metu ion ajn tie.
Do nia RAM je ĉi tiu punkto aspektas kiel ĉi tio.
Nun sur la dekstra flanko de la linio 7 ni vokas GetString,
kiuj ni estas faras nun por semajnojn, sed kio GetString vere faras?
GetString skribita de la CS50 dungitaro estas iom inteligenta
en tiu tuj kiam la uzanto tajpas startas klavoj kaj sukcesojn Enter,
GetString figuroj el kiom da keystrokes faris la uzanto sukceson,
kiom da karakteroj mi bezonas destini RAM por.
Kaj kie tiu RAM devenas, kiu scias?
Estas ie en via komputilo 2 gigabajtoj aŭ whatnot de memoro.
Sed ni supozu, ke la komputilo trovis spacon por la vorto SALUTON ĉi tie.
La vorto mi tajpis estis H-E-L-L-O.
Kaj se ni desegni tiun kiel vico de karakteroj, ni povus desegni ĝin kiel ĉi tio.
Sed mi bezonas fari 1 aldona afero. Kio apartenas al la fino de ajna ĉeno en C?
La nula karaktero, kiujn ni skribu kiel \ 0.
Estas teknike la nombro 0, sed la backslash faras ĉiujn klara
ke tio estas laŭvorte la nombro 0, la entjero 0;
ĝi ne estas, ekzemple, citaĵo-unquote 0 kiu vi povus skribi en la klavaro.
Do ĉi tiu estas SALUTON.
>> Kaj kion ni diras lundon ke funkcio kiel GetString
Estas vere reveni ĉiuj tiuj semajnoj?
Oni ne reveni ĉenon per si mem pro tio ne vere havi signifo
ĉar ĉenoj ne ekzistas. Ili estas speco de fabrikada en la CS50 biblioteko.
Kio estas vere ŝnuro, pli teknike? >> [Studento] Ĝi estas la unua signo.
Ekzakte. Estas sufiĉe simple la adreso de la unua signo, ke la uzanto tajpas in
Do, se mi tion diros SALUTON finas ĝin en bajto numeron 123 kaj poste en bajto numeron 124,
125, 126, kaj tiel plu, se mi ĝuste nombro mia bitokoj de 0 plu supren,
kio vere GetString revenas estas laŭvorte la numeron 123.
Do kio gets metis en s estas la nombro 123, ne la litero H, ne la vorto SALUTON,
tute simple la adreso en kiu mi povas trovi la unuan literon de SALUTON.
Sed tio ne ŝajnas kiel sufiĉa. Mi demandis vin pro ĉenon, ne karakteron.
Nu do kiel ni aŭ al la komputilo scias ke ELLO ia venis kune kun la H?
Kio estas la tipo de interkonsento ni havas? Yeah.
[Studento] Ĝi gardas dirante mem trovi iun pli gravuloj. >> Ekzakte.
>> Estas ĉi tiu homa-komputila konvencio laŭ kiu kiam vi traktas kun kordoj,
alie konata nun kiel char steloj, vi simple devas kalkuli
kie la fino de ĉiu linio en la vivo estas por vere nur ripetanta super ĝi kun por ciklo,
momenton buklo, kion ajn, por ke kiam vi trovas la fino de la ŝnuro
nun vi povas konkludi el tio, ho, la tuta vorto SALUTON.
La de vi kun antaŭa programado sperto sciu en Java
vi povas simple nomi. longa kaj en aliaj lingvoj vi povas nomi longo aŭ simila.
Tio estas ĉar en multaj lingvoj, precipe tion nomis objekteman lingvoj,
la longo de io estas ia encapsuladas ene de la peco de datumoj mem,
multe ŝatis ni encapsuladas IDs kaj nomoj kaj domoj ene de studento lundon.
Sed C estas multe pli malalta nivelo. Ne estas objektoj aŭ klasoj, se vi aŭdis tiujn terminojn antaŭe.
Vi nur vere estas memoro adresoj.
Do ĉi tiu estas speco de la antikva maniero reprezenti interesa datumstrukturoj.
Vi havas komencon valoro kiel la adreson de la unua signo
kaj tiam nur iuj arbitraj konvencio kiu ĉiuj konsentas sekvi.
Do kiel estas cxeno longa implementado, ĉu ni proponas?
Strlen, strlen, kiun iuj el vi jam uzis kelkajn fojojn. Estas bela simpla, ĉu ne?
Estas kiel 2 linioj de kodo.
Estas preskaux a por buklo de iu varo, eble kun plia loka variablo.
Sed strlen nur devas preni puntero kaj poste komencu serĉi \ 0.
>> Kaj tuj kiam li trovas ĝin, ĝi povas reveni al la tuteca nombro de paŝoj kiuj ĝi estas prenita en tiu linio.
Do ni povas konkludi el tiu kio iras sur proksima.
Supozi tiam mi deklaras t kiel mi faris en linio 10.
Tio estas iom da rubo valoro. Kiu scias unue?
Sed sur la dekstra flanko de la linio de 10 Mi vokas GetString denove.
Kiu scias kie tio finas?
Ni arbitre diras ke la mastruma sistemo trovis lokon por ĝi maniero super tie.
Mi hazarde hazarde tajpi H-E-L-L-Aŭ denove,
kaj tiel ni povas desegni la sama speco de foto.
Sed la fakto, ke mi havas reviziitaj ĉi bildo estas intenca
ĉar tio estas malsama SALUTON ol ĉi tiu.
Do jen tiu povas esti loko 456, jen 457, kaj tiel plu.
Do kio gets metis kie la demandosigno iam estis?
En ĉi tiu kazo 456.
Ni pluki tiujn numerojn arbitre ĉar vere post hodiaŭ
ni ne tuj zorgas tiom pri kio la adreso de io estas.
Ĉiuj ni zorgas pri estas ke ni povas kalkuli la adreson de iu peco de datumoj kiel SALUTON.
>> Do vere kion multaj homoj faras en komputiko, kiam parolas pri memoro adresoj
kaj raportante punteros specife,
anstataŭ ĝeni elŝeligi 123 - who cares kie ĉi aĵoj vere estas,
ni nur scias ke estas en iu nombraj adreso -
ni simpligi la mondo kaj nur diri, ke s indikante ke karaktero
kaj t estas indikante ke karaktero.
Kaj la fakto ke ĝi estas sago estas sufiĉe intenca
ĉar laŭvorte nun s montrante H kaj t estas montrante ĉe la alia H
ĉar en la fino de la tago, ne gravas kion la adreso estas,
sed gravas, ke ni havas la kapablon esprimi ke adreso kun iu peco de kodo.
Ni ne vere manipulitaj tiuj adresoj nur ankoraŭ
do ni vidos, kie ni povas interject kaj ordigi de fari aferojn kun indikoj,
sed por nun en linio 12 laŭvorte kion valoroj ni komparas
laŭ tiu rakonto en linio 12?
Ni diras nur 123 egala egala al 456? Kaj tio certe ne estas la kazo.
Kaj eĉ koncepte, ĉi puntero certe ne estas la sama kiel tiu
ĉar vi nomas GetString dufoje, kaj GetString ne pretendas esti super saĝa,
ĝi ne provas realigi, ho, vi tajpis SALUTON 5 minutoj;
mi donos al vi la saman puntero kiel mi donis al vi antaŭe,
ĝi nur allocates nova bloko de memoro ĉiufoje vi nomas ĝin.
>> Nu do kiel ni ripari tiun problemon?
Se pli alta nivelo mi volas kompari la kordoj SALUTON kaj SALUTON -
Mi ne zorgas pri la punteros - kiel mi iros sur respondi la demandon,
ĉu la uzanto tajpas la saman aferon? Kio estas necesa ĉi tie? Yeah.
[Studento] Uzu funkcio. >> Mi povas uzi funkcio ekster la skatolo.
Mi povas uzi funkcio nomita strcmp, s-t-r-c-m-p,
nur la mallongigita versio de diri string kompari.
Kaj se ni iros en, ekzemple, komparu 2, kiu estas inter la hodiaŭa handouts,
Mi faras ĝuste tion.
Mi ĉion alie la sama de linio 1 en suben al 26 aŭ tiel,
kaj nun rimarkis tiun parton ŝanĝis malmulta.
Ni ignoru linio 28 dum momento kaj enfokusigi nur sur tiu ĉi.
Kion ni diras lundo tiu str kompari faras?
Ĝi manipulas la procezo de prenante 2 punteros, s kaj t en ĉi tiu kazo,
ia virtuale metante lian fingron sur tiuj 2 literoj,
kaj kion ŝi devas fari estas io kiel dum buklo aŭ por ciklo,
kaj ĝi diras estas tiuj la sama? Se jes, ĝi moviĝas la fingroj aŭ la punteros antaŭen.
Ĉu tiuj la sama, tiuj la sama, tiuj la sama,
tiuj la sama, tiuj la sama? Kaj ooh, mi estas ĉe la fino de la ŝnuro ĉe ambaŭ s kaj t.
Mi ne trovis ajnan kontraŭdiroj. Jes, tiuj kordoj estas la sama.
Kaj kion tio str kompari reveno se 2 kordoj estas samaj, ŝajne? Nulo.
Do 0 estas bona en tiu kazo ĉar se ĝi redonas -1 aŭ +1,
tio signifas, ke estas nur okazas veni antaux t alfabete aŭ post t.
Kaj kial tio estu utila havi funkcion kiu informas vin ke kordoj venas antaŭ
aŭ post en vortaro?
[Studento] Serĉado. >> Serĉado kaj ordigi.
>> Do vi povas fari tion kiel duuma serĉo aŭ bobelo varo aŭ kunfandi speco
kie vi devas kompari tion.
Tiel malproksime ni ia tranĉi kelkajn angulojn kaj nur parolis pri ordigi
en la kunteksto de nombroj ĉar ĝi estas agrabla kaj facila por paroli pri,
sed vi certe povas kompari kordoj, pomo kaj banano,
ĉar se pomo scias veni antaux banano, simile,
vi povas movi kordoj ĉirkaŭ en memoro ĝuste kiel Rob faris kun merge varo en la video
kaj ni faris ĉi tie sur la scenejo kun elekto varo, inserción varo, kaj bobelo varon.
Do kie ajn ni povas utiligi ĉi tiun? Ni provu tion.
Ni ia forgesas ke lecionon dum momento kaj provu nun kaj kopii 1.c fari la sekvajn.
En linio 21 Mi diras print ion,
tiam mi ricevas cxeno el la uzanto,
tiam Mi kontrolanta ĉi.
Ni ne vere alveninta en tiun kutimon ankoraŭ, sed ni nun faras tion.
Ni efektive senŝeligi reen ĉi tavolo. Tiu estas vere char *. Tiu ulo estas vere char *.
Do kion signifas esti kontrolanta se s == NULL?
Rezultas, ke kiam vi nomas funkcio kiel GetString
aŭ pli ĝenerale nur demandi komputilo por doni al vi iun memoron,
io povus iri malbone.
Vi povus esti freneza kaj peti la komputilon por terabajto de memoro
per petante bilionoj da bajtoj da memoro, ke simple ne ekzistas en la komputilo,
sed GetString kaj aliaj funkcioj bezonas iel de kriante pri vi
se vi jam petis tro multe.
Kaj la vojon GetString faras ĉi estas se vi petis por pli memoro
ol estas havebla en la komputilo, eĉ se tio estas super, super malalta probablo
ĉar neniu el ni tuj tajpi biliono karakteroj kaj tiam batis Enter,
sed malalta probablo kvankam ĝi povas esti, mi ankoraŭ volas kontroli por ĝi ĉiaokaze,
kaj la speciala valoro kiu GetString, respondo, kaj aliajn funkciojn revenas
se iu iris malbone estas NULL en ĉiuj ĉapoj.
>> Kaj kio estas NULL? NULL ĝuste tiel okazas por reprezenti puntero. Estas memoro adreso 0.
La mondo decidis ke arbitre, se ĉi tiu estas mia komputilo memoro - vi scias kion? -
ni iras ŝteli nur 1 bajto de ĉiu komputila memoro, kaj ĉi tiu estas loko 0.
Ni tuj donos ĝin alnomo de NULL, kaj ni tuj promesi
ke ni neniam vere metis realaj datumoj tie
ĉar ni nur arbitre bezonas specialan valoron, 0, aka NULL,
tiel ke ni povos krii ĉe la uzantoj se iu iras malbone.
Alie vi eble ne scias tio signifas 0 metis ion ĉi tie
aŭ ĝi signifas ion misokazis?
Ni devas cxiuj konsentas ke NULL per nenio revenis,
neniu reala adreso estis redonita.
Nun, ĉi tie mi nur adoptante mia homa konvencio de mi revenos 1 de ĉefa
se iu iras malbone.
Tio estas ĉar ĉefan la reveno konvencio estas reveni 0 se bona,
1 aŭ alian valoron se malbonaj.
Sed GetString kaj ajna funkcio kiu traktas en memoro revenas NULL se io iras malbone.
>> Okay. Do bedaŭrinde, linio 27, super simplan kvankam ĝi estas, tute maltrafas kopii la kordo.
Kial? Ni povas vidi tion kiel sekvas.
Mi asertas en linio 27 al esti farante kopion de s kaj nomante ĝin t.
Do mi ne demandante la uzanton dum 2 kordoj nun; Mi nur diras la valoron en s
devus esti metita en t tiel.
Do nun nur por pruvi kiom rompita ĉi tio estas, en linio 29 antaŭen kion mi faras?
Unue mi kontrolanta se la longo de t estas pli granda ol 0.
Ekzistas iuj kordoj tie. La uzanto tajpita io in
Kio estas linio 32 farante, ŝajne?
[Inaudible studento respondon] >> Ĝuste. Vi povas ia konkludi ĝin el kion mi diris ĝi estas farante.
Sed teknike, kio ĉi faras? t [0] reprezentas kio?
[Studento] La nula karaktero. >> [Malan] La nula karaktero.
Aŭ, pli homa-similaj, la unua gravulo en t, kion ajn tio estas, H eble en tiu kazo.
Kaj toupper faras kion ĝi diras. Ĝi capitalizes la nula karaktero de t kaj ŝanĝas ĝin.
Do tio signifas preni la nula karaktero de t, fari ĝin majuskle,
kaj remetis ĝin en tiu sama loko.
Do se mi tajpas saluton en minuskla, tiu devus ŝanĝi la minuskla h al ĉefurbo H.
Sed la problemo estas ke en linioj 35 kaj 36 kio mi estas faronta estas presi por ni s kaj t.
Kaj kio estas viaj corazonada?
Kion mi vere tuj vidos se mi tajpis en saluton en ĉiuj minuskla?
Kio okazas al get presita? >> [Inaudible studento respondon] >> Kio estas tio?
[Studento] Big H kaj la resto malgranda. >> La granda H kaj la resto malgranda por kiu, s aŭ t?
[Studento] Ambaŭ. >> Ambaŭ. Ekzakte. Do ni vidu kio okazas tie.
>> Lasu min kaj kompili ĉi. Ĉi tiu estas copy1, do fari copy1. Bone.
Zoom in Lasu min kaj kuras copy1, Enter, diru ion: saluton en minuskla.
Ĝi majusklon la kopion, sed ĝi ŝajne majusklon la originala tiel,
ĉar kio nun okazas en tiu rakonto?
En linio 27 Mi ne vere ŝajnas esti kopii la kordo,
sed kvankam vi povus esti intuicie esperis, ke esti la kazo,
se vi pensas pri tiu bildo, kio vere mi faris?
La duono de la bildo estas la sama.
Do ni ruliĝi malantaŭen en la tempo tiel ke t ankoraŭ ne ekzistas en la rakonto.
S povas ekzisti en la rakonto, sed estu la minuskla saluton ĉi tiu tempo.
Do lasu min ripari kion mi fakte tajpis in
En ĉi tiu kazo tie ni havas h-kaj-l-l-o.
Ni desegni ĝin kiel vico de signoj, metis mian separador linioj tie kaj mia \ 0.
Do tiu estas kie ni estas tiel frue kiel linio 1 ĝis 24-ish, donu aŭ preni, esti ekzekutita.
Tiu estas la portreto de mia memoro.
Kiam mi alvenas al linio 27, kio okazas?
Ĝuste kiel antaŭe, mi ricevas puntero, kiu mi desegni kiel ĉi placo.
Ĝi nomas t. Kaj kio estas ĝia valoro implicite? Kiu scias? Iuj rubo valoro.
>> Do Mi instruos vin abstrakta ke for kiel demandosigno.
Kaj tuj kiam la dekstra flanko de la linio 27 ekzekutas, kion mi meti ene de t?
La sama afero, ke estas en s.
Do, se ni por momento forigi ĉi abstraktado de la sago kaj ni diru,
oh, tio estas memoro ŝarĝo adreso 123, kiam vi diras t gets s, punktokomo,
vi laŭvorte metante 123 ĉi tie.
Nun se ni ia simpligi nia mondo denove kun bildoj,
kion vi vere faris estas simple aldonis alian sagon por via mondo
ke tio montrante el t al la sama ĝusta linio.
Do kiam en linio 31 kaj 32 Mi vere irad ŝanĝi t [0],
kio estas t [0] ŝajne sinonimo de nun? s [0]
Do jen ĉio tio okazas.
Kaj eĉ se ĉi tiu speco de sentas iom malalta nivelo kaj arcano
kaj ĉi speco de sentas eble intuicie ĉi devus esti ĝuste funkciis -
Mi faris kopiojn de aĵoj antaŭ kaj ĝi apenaŭ funkciis -
se vi vere pensas pri kio ĉenon vere estas, estas char *.
Nu, kio estas tio? Ĝi estas la adreso de iu gravulo.
Tiam eble faras pli senco ke kiam vi provas fari ion
super ŝajne simpla kiel tiu, ĉiu vi faras estas kopiado de memoro adreso.
Vi ne vere faras nenion kun la kordo mem.
Do eĉ se vi ne havas ideon kiom vi solvus tiun problemon en kodo,
alta nivelo, koncepte, kion ni devas fari por fari ta vera kopio de s, ŝajne?
Yeah. >> [Studento] Donu ĝin al nova loko? >> Ekzakte.
>> Ni devas doni t tute nova loko.
Ni devas iel krei mondon en kiu ni atingos novan eron de memoro,
kiu nur por klareco, kalkaj Mi desegni dekstra sub ĉi tiu, sed ĝi ne bezonas esti tie.
Sed bezonas esti la sama amplekso, do mi desegni tiujn vertikalaj linioj en la sama loko.
Ĝi estas bone se tio ne estas tuta rubo komence. Kiu scias, kio estas tie?
Sed paŝo 1 tuj devas doni al mi tiel memoro kiel mi bezonas
persvadi kopion de saluton, tiam manieron kopii la h tie, la TTT tie,
la l tie kaj tiel plu.
Sed ĉi tiu jam devas senti iom evidenta eĉ se kelkaj el la detaloj estas ankoraŭ abstrakta.
Kopii ĉi ŝnuro en tiun, ĝi estas nur por buklo aŭ dum buklo
aŭ iu kun kiu vi fariĝis des pli familiara.
Do ni provu tion. Lasu min iri en copy2.c.
En copy2.c ni havas preskaŭ la saman programon krom linio 27.
Ĝi aspektas iom kompleksa, sed se ni dispecigas ĝin pecon post peco,
la maldekstra flanko estas la sama.
Char * t kreas tiun aferon en memoro, kvankam kun demandosigno
ĉar ni ne havas ideon kio estas tie defaŭlte.
Sur la dekstra flanko ni nun enkonduki novan funkcion, malloc,
por memoro destini, donu al mi memoro,
kaj ĝi ŝajne prenas kiom argumentoj, kiom da aferoj ene krampoj?
Mi aŭdis murmuradon de 1 kaj 2, sed ĝi estas nur 1.
Ne komo, kiu signifas ke estas nur 1 afero ene de la krampoj.
Kvankam ekzistas aliaj krampoj, lasu min reliefigi
kio estas ene de la ekstrema krampoj, kaj ĝi estas tiu esprimo:
(Strlen (j) + 1) * sizeof (char).
Do, se ni vere kredas ke tiu tra, ĉi diras al mi la longo de s.
Kial estas mi, kvankam, aldonante 1 sur la longo? >> [Inaudible studento respondon]
Ekzakte. Ni bezonas spacon por tiu ulo ĉe la vosto, la sesa karaktero, kiu ne havas anglan signifon
sed ne havas specialajn programita signifon.
>> Do ni bezonas + 1 por ke ĉar strlen revenas la homa atendo de longa,
saluton aŭ 5, ĝi ne donas al vi la aldonaj nula karaktero.
Do mi permane aldoni tiun kun + 1.
Kaj tiam tiu, * grandeco de (char), ni ne vidis ĉi tion antaŭe.
Tio ne estas teknike funkcio.
Ĝi estas speciala ŝlosilvorto ke nur diras al vi, kion la grandeco estas de iu datumtipo en komputilo
ĉar fakte, iuj el ni havas 32-bitan komputiloj.
Mi havas belan malnova komputilo hejme, kaj ĝi nur uzas 32 bitojn por reprezenti punteros.
Kaj tial, se mi faris grandeco de datumtipo, ĝi povus esti 32 bitoj.
Sed se mi per mia nova kaprico komputilo, mi povus reiri valoro de 64 bitoj
por iu kiel adreson.
Do ĉi-kaze, nur por esti super sekura, ni ne tuj forte kodo ion kiel -
bone, kio estas la grandeco de char laŭ kion ni diris ĝis nun?
Ni preskaux diris parole, ke ĝi estas 1 bajto, kaj tio estas preskaux vera trans la tabulo.
Sed denove, supozoj inklinas esti malbona.
Ili kondukas al kalesxo programaro se homoj uzas viajn programaro en manieroj vi ne intencas.
Do estu la abstrakta ĉi for kaj nur pli genéricamente diri
Mi bezonas tiun multaj pecoj de memoro
kaj ĉiu eron de memoro devas esti ekvivalento al la grandeco de karaktero,
kio estas fakte egala al 1 en ĉi tiu kazo, sed estas pli ĝenerala metodo por skribi ĝin.
Do, se la vorto estas saluton, kiom da bitokoj ne malloc ŝajne destini por saluton?
[Studento] Ses. >> Ses. Ĝuste tiom kiom ni havas demandon markojn sur la ekrano.
Kaj poste preni supozas nun bazitaj sur via kompreno de GetString
kion signifas malloc probable revenos? >> [Studento] An adreso.
Adreson de kio? De la unua bloko de memoro.
>> Ni ne havas ideon kio estas tie ĉar iuj aliaj funkcioj
povus esti uzanta tiun memoron antaŭe.
Sed malloc, kiel GetString, denove la adreson de la unua bitoko de memoro
ke ĝi rezervis por vi.
Tamen, kion ne faras, plenumi la malplenan kun backslash nula karaktero
ĉar ĝi rezultas vi povas uzi malloc destini ion: ints, kordoj, tabeloj,
flosas, studento strukturoj.
Vi povas uzi malloc tute genéricamente.
Ne gravas aux devas scii kion vi atribuante memoro por.
Do estus orgojla por malloc meti \ 0
fine de ĉiu bloko de memoro ĝi estas donas al vi
ĉar ĉi \ 0 afero estas nur konvencio por kordoj.
Oni ne uzas por ints, ĝi ne uzas por kaleŝegoj, ĝi ne uzas por studentoj.
Kaj tial la gotcha kun malloc estas ke la ŝarĝo estas tute en vi la programisto
memori, kiom da bitokoj vi destinis kaj ne cxiam uzas por buklo
aŭ dum loop kaj iri preter la limo de la bloko de memoro vi donis.
Meti alia vojo, kiam vi rezervi memoron,
vi ne povas peti la mastruma sistemo, oh, por iu, kiom granda de eron de memoro estis tio?
Estas tute ĝis vi memoras se vi bezonas tiun valoron.
>> Do ni vidu kiel mi procedi por uzi ĉi tiun memoron.
En linio 28 kaj 29 kial mi faras tion?
Ĝuste tuta prudento ĉeko.
Ĉiaokaze ion misokazis, mi petas iom freneza kvanto de memoro
aŭ mi tiom da aferoj kurante en la komputilo kiu ne nur ne sufiĉas memoro,
io simila, mi almenaŭ volas kontroli por nula.
En realo, plej komputiloj donos al vi la iluzion, ke ĉiu programo
povas uzi la tuteco de via memoro RAM,
sed malgraŭ tio, se la uzanto tajpas en iu freneza longa ŝnuro eble ĉar ili estas malbonaj ulo
kaj ili estas efektive provas frakasi vian programon aŭ hack en ĝin,
vi volas almenaŭ kontrolu la reveno valoro de malloc kaj ĉu ĝi egalas nula.
Kaj se ĝi faras, ni ĵus forlasis nun ĉar mi ne sciis, kion fari en tiu kazo.
Kiel mi kopii la kordo? Estas kelkaj manieroj por fari tion.
Esas str kopii funkcioj en C, sed estas super simpla por ni fari tion la antikva vojo.
>> Unue lasu min elkompreni kiel la longo de s estas.
Mi povus esti meti ĉi tion en la maŝo, sed anstataŭe mi nur metis ĝin tie por klareco.
Do n nun stokas la longon de la originalaj ŝnuroj, kiuj estas ŝajne 5.
Tiam en mia por buklo min ripetanta de 0 sur ĝis n,
kaj sur ĉiu ripeto Mi metante s [i] ene de t [i].
Do jen kion mi implicis kun miaj 2 fingroj ĉe la kordoj antaŭe.
Kiel ĉi por buklo iterates kiel ĉi tiu, mi tuj iros kopiado h en ĉi tie,
TTT enen tie, l enen tie ĉar ĉi tiu estas s, ĉi tiu estas t.
Kaj poste laste, en linio 35 kial mi faras tion?
Mi bezonas certigi ke mi finas la kordo t.
Kaj mi faris tion ĉi tiu maniero al esti super eksplicita.
Sed proponas, ke iu, se vi povus, malsama maniero fari tion.
Mi ne vere bezonas linion 35. Ekzistas alia maniero por fari tion.
Yeah. >> [Inaudible studento respondon] >> Diru ĝin laŭte.
[Studento] Malpli ol aŭ egala al. >> Ekzakte.
Ni povus simple diri malpli ol aŭ egala al n, kiu ĝenerale estis malbona
ĉar preskaŭ ĉiam kiam ni supreniras al egala al la afero ni rakonti
ni iru 1 paŝo tro for.
Sed memoru, kiom da bitokoj ni ne destini?
Ni destinis strlen de s, do 5 + 1 por tuta de 6.
Do en ĉi tiu kazo ni povus fari ion kiel tiu
por ke ni kopiado ne nur la saluton sed ankaŭ la \ 0 je la fino.
Alternative, ni povus uzi funkcio nomita str kopion, strcpy,
sed kiu ne estus preskaŭ tiel amuza.
Sed tio ĉio ĝi faras sub la kapuĉo.
Tiam laste, ni faru tion saman kiel antaŭe.
Mi profiti t kaj poste mi asertas ke la originala aspektas kiel ĉi tiu kaj la kopio aspektas tiel.
Do ni provu tion. Lasu min iri en ĉi tie. Faru copy2. Ni zomi en kaj kuri copy2.
Mi iros por tajpi en saluton en minuskla, kaj ja I get minuskla saluton kiel la originalo
sed ĉefurbo Saluton por la kopio.
Sed mi ne faris nur ankoraŭ. Mi bezonas fari 1 lasta afero ĉi tie.
46 kaj 47 estas klare liberigi memoron, sed kion tio ke en la praktiko signifas?
Kion mi faras, vi opinias, nomante linio 46 kaj linio 47?
Kio efekto ĉu tio havas? Yeah.
[Inaudible studento respondon] >> Ekzakte.
>> Vi nur diras la mastruma sistemo, hey, dankon pro tiu memoro.
Vi povas nun uzi ĝin por iu alia.
Kaj jen perfekta ekzemplo de rubo valoroj.
Mi ĵus uzis tiun memoron noti la vorton saluton en 2 lokoj,
ĉi tie, tie, tie kaj tie.
Do tiu estas h-kaj-l-l-o-\ 0.
Sed tiam mi vokas linio 46 kaj linio 47, kaj vi scias kio okazas tie en terminoj de la foto?
Fakte, atendu, ĉi bildo estas la malnova.
Iam ni fari la kopion, tiu ulo estas vere montrante tie,
do ni forigu la nombroj kaj nur abstrakta for kiel nia sagojn denove.
Kio okazas en tiu ĉi bildo, kiam mi vokas libera?
[Inaudible studento respondon] >> Ne vespero.
Se mi nomas libera sur s kaj t - speco de lertaĵo demando - tiu bildo ne ŝanĝas tute
ĉar nomi s kaj nomante t simple rakontas la mastruma sistemo,
hey, vi povas uzi tiun memoro denove, sed ne ŝanĝas tion al nula
aŭ iu speciala karaktero, ĝi ne ŝanĝas tion,
ĝi ne ŝanĝas la h aŭ la TTT aux la l aŭ la l aŭ la o en ĉu loko por io alia.
En terminoj de la bildo, tuj kiam vi nomas libera, nenion ŝanĝas.
Kaj en gxi kusxas la origino de rubo valoroj ĉar se mi tiam poste en tiu programo
demandu la mastruma sistemo por pli memoro kun GetString aŭ malloc aŭ io simila
kaj la mastruma sistemo diras, certa, mi havas 12 bajtoj de memoro ĝuste liberigita supren,
uzi tiujn, kion vi tuj estos transdonita?
Vi tuj estos transdonita eron de memoro, ke ni devus tipe desegni
kun demando markoj, sed kion estas tiuj demando kadroj?
Ili hazarde estas h-kaj-l-l-o, h-kaj-l-l-o.
Tio estas nia nova rubo valoroj tiel frue kiel vi liberigi ke memoro.
>> Jen reala mondo implikacio tie ankaŭ.
Ĉi tio okazas al fari kun RAM, sed via komputiloj
fakte faras la samon per disko.
Ni parolos pri tio en aparta kun futura problemo aro kiu centras en forensics.
Sed kio efektive okazas se vi havas iujn sentema financa dosiero sur via labortablo
aŭ iu Sketchy JPEG kaj vi treni ĝin en vian rubon,
kio okazas dum movado gxin en la rubo aŭ la recicla bin?
Vi sciis, kion mi parolas. [Ridado]
Kio okazas kiam vi trenis ke provoj en viajn recicla bin aŭ rubo povas?
[Inaudible studento respondon]
Nu, tiel zorgema. Kio okazas kiam vi faros tion?
La mallonga respondo estas nenio, ĉu ne?
Sketchy aŭ sentema dosiero estas ankoraŭ nur sidas tie ie en via malmola disko.
La plejmulto el ni almenaŭ jam lernis la malmola vojo, kiun vi bezonas por malplenigi vian rubo
aŭ via recicla bin al reale forviŝi dosierojn.
Kaj efektive, kiam vi rajtas klaki aŭ Kontrolo klako en via rubo povas
aŭ elektu File, Malplena Trash aŭ kion ajn
kaj vi vere malplenigi la rubujon povas aŭ recicla bin, kio efektive okazas tiam al ĉi foto?
Pli nenion. Do nenio vere okazas en disko.
>> Kaj se ni nur portempe digress kaj skribi - I'll just use la dorso de ĉi.
Do nun la historio ŝanĝiĝas de RAM, kio estas kie programoj ekzistas
dum vi kuras ili, al disko, kiu estas kie estas stokita longtempe
eĉ kiam la potenco eliras, nuntempe - kaj ni revenos al tio en la estonteco -
ni nur ŝajnigi ke ĉi reprezentas la malmola disko interne de via komputilo
ĉar tie en la tago ili kutimis esti cirkuli diskoj, multe kiel disketoj.
Do se vi ja havas kelkajn sentema Excel-dosiero, ĝi povus preni tiun eron de memoro
en via komputilo disko, kaj mi simple desegni sama arbitraj 1s kaj _0s_.
Kiam vi treni la dosieron kiel tiu al via rubo povas aŭ reuzi bin,
laŭvorte nenio okazas ĉar Apple kaj Microsoft ĵus decidis
la rubo povas kaj recicla bin estas vere nur portempa lokokupilo.
Eble eventuale la VIN estos malplenigi gxin por vi, sed tipe, ne faras nenion,
almenaŭ ĝis vi estas vere malalte sur la spaco.
>> Tamen, kiam vi iras al malplena rubo aŭ malplena recicla bin,
simile, nenio okazas al tiu bildo.
Ĉio, kion okazas estas aliloke en via komputilo, estas ia tablo.
Estas iel kiel eta cheat folio kiu diras ke, diru, resume.doc,
tiel viaj currículum en Microsoft Word dosieron kutimis vivi en situo 123 en via malmola disko,
ne en memoro kaj ne en RAM sed sur via fiksita disko,
kaj via Sketchy JPEG vivoj en 456, kaj via Excel dosieron vivas 789 aŭ kie ajn.
Kiam vi forigi dosierojn per efektive malplenigante la rubo aŭ la recicla bin,
tiu bildo ne ŝanĝas. La _0s_ kaj _1s_ sur via malmola disko ne iras nenie.
Sed ĉi tablo, tiu malgranda datumbazo de varoj, faras ŝanĝon.
Kiam vi forviŝi vian currículum, estas kvazaŭ la dosiero estas forviŝita iusence,
sed ĉiuj la komputilo ne estas forgesi kie tiu afero vivas sur via fiksita disko.
La _0s_ kaj _1s_ kiuj formas viajn currículum aŭ iu el ĉi tiuj aliaj dosieroj estas ankoraŭ nerompita.
>> Do se vi faris tion akcidente, estas ankoraŭ ne-nula probablo
ke vi povas reakiri viajn datumojn uzante Norton Utilities aŭ iu komerca programaro
kies celo en la vivo estas trovi _0s_ kaj _1s_ kiuj ia estis orfo,
forgesis tie sed lasis tie, tiel ke vi povas akiri datumoj dorso.
Aŭ jura investigadores kun la polico aŭ FBI estus reale preni malmolan diskon
kaj fakte serĉas ŝablonoj de _0s_ kaj 1s ne aspektas kiel JPEG-oj, ĝi aspektas kiel Excel-dosieroj,
kaj forprenis ilin tiel, eĉ se la komputilo forgesis ilin tie.
Do la sola maniero vere forigi datumojn, kiel ni diskutos en la estonteco,
estas matoralo aŭ forviŝi la dosieron aŭ malmola disko de -
Vi ne povas vere forigi la _0s_ kaj _1s_
ĉar alie vi volas komenci per gigabajto malmola disko
kaj vi volas fini kun megabajto malmola disko se vi senĉese viŝante,
laŭvorte, _0s_ kaj _1s_.
Do kion vi farus se vi vere volis kovri vian temoj
kaj la fundamenta problemo estas, ke ekzistas ankoraŭ _0s_ kaj _1s_ en la disko?
Mi vidas iun gestante ke vi fizike rompi la artefakto. Kiu funkcios.
[Ridado] Sed se tio estas speco de multekosta solvo, kio estus pli racia?
Yeah. >> [Studento] Anstataŭigi ilin. >> Anstataŭigi ilin per kio? >> [Studento] Aliaj datumoj.
Aliaj datumoj. Vi povas simple anstataŭigi vian disko kun _0s_ aŭ 1s aŭ ĉiuj _0s_, ĉiuj 1s.
>> Kaj tio estas ja kion iuj de la programaro havas.
Vi povas aĉeti programaro aŭ eĉ akiri liberan programaron,
kaj eĉ konstruis por Mac OS tiuj tagoj, malpli tiel en Windows,
estas la kapablo sekure viŝi.
Fakte, se vi volas al la tuta sinsekvo hejmen hodiaŭ se vi havas Mac kaj fari tion,
se vi havas iujn aĵojn en via rubo povas, vi povas fari Secure Malplena Trash,
kiu faras ĝuste tion.
Anstataŭ nur viŝi dosierojn tie, ĝi ne viŝi la _0s_ kaj _1s_ tie,
iom, ĝi nur ŝanĝas ĉiujn, ekzemple, al _0s_ kaj pentras, pentras, punkto.
Do unu el viaj estontaj psets fakte estos por intence reakiri datumoj -
fotoj ke ni prenis de homoj, lokoj, kaj sur la kampuso
por kiu ni faros jura bildo de cifereca fotilo memoro karto,
kiu estas la ĝusta sama ideo - kaj vi devos esti defiis al reale trovi
la mastroj kiuj reprezentas JPEG-oj en via malmola disko,
multe kiel tiu iama studento kies retpoŝto mi legis kelkajn semajnojn faris
rekuperi sia fratino fotoj.
Kial ni ne prenos de 5-minuta paŭzo tie, kaj ni reagruparse kun pli en memoro.
Do jen kie aĵoj iom menso-fleksio, sed tio estas tre potenca paŝo
al kompreni tiun tutan pli.
Jen estas programo nomata pointers.c.
Ĝi estas inter la hodiaŭa specimeno kodo.
Rimarku ke en la unuaj kelkaj linioj, 19 tra 22, ĉiuj ni faras estas io kiel GetString
kaj revenante adreson, stokante ĝin en s.
Nun por pset eĉ 3 se vi volas sed pset 4 kaj sur
kie vi povas komenci preni tiujn trejnado radoj sur vin,
ne estas kialo por ŝajnigi ke kordoj plu ekzistas.
Estas certe bone al komencu diri char *.
>> Kiel flanken, en linio referencoj kaj en libroj vi ofte vidas la stelon apud la variablo.
Vi povus ecx vidi spacoj ĉirkaŭ ambaŭ flankoj.
Ĉiuj el tiuj estas funkcie ĝusta.
Nuntempe, tamen, ni normigi sur ĉi alproksimiĝo por fari super klara
ke char * estas kiel diri karaktero puntero.
Tio estas la datumtipo.
Kaj tiam la nomo de la variablo estas s en tiu kazo.
Do ni alvenas ĉenon kaj ni nomas ĝin s.
Kaj poste malsupren tie rimarkos ke mi faras vere iom da trompo.
Ĉi tio estas nomita puntero aritmetiko, kiu estas speco de super simpla.
Ĝi simple signifas adicii kaj subtrahi nombroj al punteros.
Sed ĉi efektive funkcias.
Ĉi tiu programo ŝajne presas la kordo s 1 karaktero por linio tia ke la fina rezulto -
Ĝuste tiel ni povas militakiro kie ĉi tiu tuj, fari punteros, kuri punteros, lasu min zoom in
Nun mi tipo en iu kiel SALUTON kaj tipon Entajpu
kaj presas 1 karaktero por linio.
Ĝis la dua monato, ni estus farinta tion kun kvadrata krampo skribmaniero.
Ni havus por buklo kaj ni farus printf de s [i] kaj ni volas fari tion denove kaj denove kaj denove
kun backslash n je la fino de ĉiu linio.
Sed tiu programo estas malsama. Ĉi tiu programo estas uzanta, laŭvorte, aritmetiko.
Do kio okazas ĉi tie?
Unue, antaŭ ĉi buklo eĉ ekzekutas, kion, nur por esti klara, estas s reale?
S estas? >> [Studento] An adreso. >> An adreso.
>> Kaj estas la adreso de, en la kazo de saluton, la unua gravulo en tiu vorto, kiu estas h.
Do s estas, en ĉi tiu aparta ekzemplo, la adreso de h.
Do kion tio signifas por fari s + i?
Nu, mi komencas al 0 en ĉi por buklo. Ni faris tion multfoje.
Mi tuj iros al la longo de la kordo, ŝajne.
Do en la unua ripeto de ĉi ciklo, mi estas evidente 0.
Do tiu esprimo dirante s + i - pli ĝuste, s +0--tio estas evidente nur s.
Do kio estas * s here?
Nun ni uzas la stelon en iomete malsama maniero.
Lasu min kaj liveri de t ĉar ni faris parolas t kaj kopioj de s.
Nun ni volas nur rakonti historio engaĝante s.
Kaj tial en ĉi tiu momento, post havi tipon kordoj, nia mondo aspektas sufiĉe ŝatas ĝin faris antaŭ
kun nur s stoki la adreson de h kaj pli ĝenerale montrante la kordo saluton.
Se mi nun faras linion kiel * (s + i), ni provos tiun eksteren.
Do * (j + mi). Lasu min simpligi ĉi tion ĉar ĉi estas 0, do ĉi tiu estas * (j +0).
Nu, atendu momenton. Simpligi plu. Tio estas * (j).
Nu, nun la krampoj estas speco de stulta, do nun ni nur faru * s.
Do en la unua ripeto de ĉi ciklo, tiun linion ke tio reliefigis, 26,
estas preskaux ekvivalenta al presi ĉi.
Kio estas la datumtipo de * s?
En ĉi tiu kunteksto, ĉar la stelo pasas esti apud la s sin,
sed pli specife, ĉar ni ne plu deklarante s,
ni ne kreante variablo plu, ne estas mencio de char * en linio 26,
ne estas mencio de la ŝlosilvorto kordoj, ni simple uzas variablon nomita s,
ĝi rezultas nun la stelo havas iomete malsama kaj, Certe, konfuzante signifon.
* S tie signifas iri al la adreso en s kaj presita ajn estas tie.
Do s estas tie, * s - ia kiel Chutes kaj Ladders, sekvu la sagon - ĉi tie.
Do tiu estas * s.
>> Do kio gets presita sur la unua ripeto de tiu ciklo en linio 26?
Mi presi% c, kiu estas la lokokupilo di karaktero,
tiam al \ n por nova linio. * (S + mi) kie mi estas 0 estas ĝuste ĉi tiu.
Do kio char mi meti en por% c? H.
En la sekvanta ripeto de la ciklo - povas probable vidos kie ĉi tiu tuj -
la venonta ripeto i estas evidente 1, do tio signifas j +1,
kaj poste nun mi bezonas la krampoj ĉar nun la stelo bezonas diri
iri al la memoro adreso j +1.
Kio estas s? Ni ruliĝi malantaŭen en la tempo, kaj diru ĉi sago nun ne vere faras ni neniu favoroj.
Lasu estas pli specife diras ke ĉi tiu estas stoki la nombro 123
ĉar la komenco de ĉi tiu linio saluton, jen adreso 123, ĉi tiu estas 124, kaj tiel plu.
Do je la dua iteracio kiam mi diris s +1, jen kiel diri 123 +1,
alie sciata kiel 124, do kio char gets presita sur la dua iteracio?
E en memoro adreso 124.
Tiam + denove, 125, 126, 127, kaj ĉi buklo dankeme por antaŭ ni preni tie
ĉar Mi uzas strlen certigi ke i ne rakontas tro alta.
Por ke tro estas.
Denove, tio estas nur kvazaŭ ni faris antaŭ unu semajno.
Lasu min skribi ĝin sur la linio sub kvankam ni ne volas fari ambaŭ.
Ĉi tiu estas identaj estas tiu.
>> Do eĉ se s estas ĉeno, kiel ni estis nomante ĝin dum semajnoj, s estas vere char *.
Do, se ni volas esti super anal, estas vere taŭga por skribi la specifa karaktero
ĉe la th,-a loko uzante tiujn nombraj adresoj kaj ĉi tiu stelo operatoro,
sed sincere, ĉi tiu estas nur tiom da pura. Do tiu estas ne malbona.
Neniu kialo por ĉesi fari linion 27 ĉi tie, sed 26 estas funkcie la samaj,
kaj estas funkcie la samaj por ĝuste la kialoj kiujn ni estis diskuti tiel for.
Kaj laste, 29 estas nur bona praktiko.
Nomante libera de s signifas ke nun vi redonante la memoro kiun GetString donis al vi
ĉar denove, kiel mi menciis lundo, GetString dum semajnoj
estis enkonduki cimon en vian kodon.
Via kodo por semajnoj havis memoron fugoj
per vi estis petante GetString por memoro sed vi neniam estis donante ĝin.
Kaj kiu estis intence elektitaj de ni pedagogie
ĉar ĝi estas simple tro multe pensi pri frue.
Sed nun ni bezonas pli simetria.
Se vi demandas la komputilo por memoro, kiel estas la kazo por GetString,
kiel estas la kazo ŝajne por malloc,
vi devas nun por pset 4 antaŭen ankaŭ libera tian memoron.
Rimarku ĉi estas malsama dirante int n.
Vi ne bezonas por liberigi tiun ĉar vi ne nomis GetString
kaj vi ne nomis malloc.
>> Kaj eĉ se vi nomas GetInt kiel ni eventuale vidi,
GetInt ne rezervi memoron por vi, ĉar vi povas reale pasi ĉirkaŭ entjeroj
kaj floto kaj signoj nur la vojo ni estis farante dum semajnoj.
Kordoj, tamen, estas speciala ĉar vere ili estas la kunmeto de multnombraj signoj.
Do ili estas ĝuste malsama signoj kaj floto kaj ints kaj similaj.
Sed ni revenos al tiu post nelonge.
Demandojn tiam ĉi komenco de punteros? Yeah.
[Inaudible studento demando]
Ah, tre bona demando.
Unu el la malmultaj aĵoj C efektive faras por vi, kio estas konvena,
ĉu ciferojn por vi kion la grandeco estas la datumtipo
kaj tiam faras tian multipliko por vi.
Tiu estas pala en la kazo de signoj ĉar preskaŭ ĉiam char estas 1 bajto,
tial ĉi nur funkcias.
Sed pro diskuto, se vi vere presi entjeroj
kaj vi volis presi iun valoron s kiu montrante entjero,
vi simile ne bezonas fari + 4 * i nur ĉar int estas 4 bitokoj.
Pointer aritmetiko signifas ke C kaj la tradukilo faros cxion, kion math por vi.
Vi nur zorgas pri estas la kalkula en varo de la homa sento. Yeah.
[Studento] Se vi deklaras ĉenon ene por ciklo, vi devas liberigi ĝin poste?
Bona demando.
>> Se vi deklaras ĉenon ene de la por buklo, ĉu vi bezonas por liberigi ĝin poste?
Vi nur devas libera memoro, ke vi rezervu kun GetString aŭ kun malloc.
Do, se vi simple diru ion kiel - mi metis frizita krampoj nun tiel la tuta kodo estas rilatigitaj.
Se vi faris iun, kvankam buggily, kiel ĉi tiu, char * t = s,
vi ne bezonas liberan t ĉar t ne implikis ajna mencio de malloc aŭ GetString.
Se kontraste vi faris tion, GetString, tiam jes, vi bezonus libera t.
Kaj fakte, via nura ŝanco fari tion nun estas ene ĉi tiu ciklo, por la sama temo de medio
ke ni diskutis en la estinteco.
Alie vi volas esti atribuo memoro, atribuante memoro, atribuante memoro,
kaj je la fino de la programo, ĉar vi estas ekstere de tiu ciklo,
t ne ekzistas, sed vi neniam rakontis al la mastruma sistemo
ke vi ne bezonas, ke memoro plu.
Kaj antaŭ longe, ĉar pset 4 aŭ 5 ni ekipi vin per programo nomata Valgrind,
kiu estas simila en spirito GDB en tiu ĝi estas atingis iom de arcano interfaco,
sed lia celo en la vivo estas por helpi vin.
Kaj Valgrind estas programo kiu estos en la estonteco serĉi vian programoj
serĉas memoro fugoj, ĉu el GetString aŭ malloc,
kiuj ni ekuzi des pli kiam ni ĉesi uzi la CS50 biblioteko tiel.
Ni fine nun havas varon de la vortaro kaj la speco de mensa modelo en teorio
kun kiu solvi ĉi rompita programo.
>> Do en ĉi rompita programo, interŝanĝa funkcias ene de interŝanĝa,
sed neniam reale laboris en ĉefaj ĉar ĉefa pasis en x kaj y, revokon,
kaj tiuj estis pasis tra valoroj, por tiel diri.
Kopioj de ili estis donita por interŝanĝi.
Por la fino de interŝanĝa, a kaj b estis ja estinta interŝanĝitaj,
sed kompreneble x kaj y, kiel ni diskutis lunde, ne estis.
Do mi proponas en verdo tie ke ĉi tio estas vere la solvo ĉi tie.
Kaj fakte, lasu min movi mian steloj nur por esti konsekvenca
kvankam, denove, funkcie ĉi tio ne gravas.
En la estonteco semajnoj ni klarigi kiam kaj kial tio gravas.
Do en verdo nun estas solvaĵo.
Sincere, ĝi aspektas tuta multe Messier ĉar mi havas ĉiujn tiujn stelojn.
Lasu min montri unu afero.
La supro linio tie kie diras int * a kaj int * b
estas fundamente fari la samon kiel ĝi ĉiam havas.
Estas deklarante 2 argumentojn aŭ parametroj por interŝanĝi,
la unua el kiuj estas int puntero nomata,
la dua el kiuj estas int puntero nomis b.
La sola afero, kiu estas nova en ĉi tiu punkto estas la fakto ke estas stelo tie.
>> Kion tio signifas? A ne estas int, b estas ne int.
A estas la adreso de int kaj b estas la adreso de malsama int.
Cxi tie, ĉi tiu estas kie mi agnoskas C ricevas konfuza.
Nun ni uzas stelon, sed ĝi havas malsaman signifon en tiu kunteksto.
Ĉar ni ne deklari punteros kiel ni estas ĉi tie,
jen ni estas dereferencing aĵoj.
Do teknike, la stelo en tiu kunteksto de la unua, dua, kaj tria linio ene de interŝanĝa
estas la dereference operatoro, kiu ĵus signifas iri tien.
Do same kiel mia fingro sekvis la sago al h,
* Rimedon iri al tiu adreso kaj trovu mi la int jen tie.
* B signifas iri al la adreso kaj pasi min kio estas tie.
Do ni redibujar la bildo de lundo nun uzante pilo de kadroj,
la fundo de kiuj tuj estos ĉefaj,
la supra unu el kiuj tuj estos interŝanĝa,
por ke nia mondo aspektas, kiel lundo, kiel ĉi tiu.
Jen eron de memoro kiu ĉefa tuj uzi.
>> Memori de lundo, ke la programo nur havis 2 variabloj,
unu nomita x kaj unu nomita y, kaj Mi metis la numeroj 1 kaj 2 tie.
Nun, kiam mi vokas interŝanĝi kiel mi faris lunde,
antaŭe, kiam mi uzis la ruĝa versio de tiu programo, kiu aspektas kiel ĉi tiu,
Mi akiris 2 parametrojn, a kaj b, kaj kion ni skribas ĉi tie kaj ĉi tie?
Nur 1 kaj 2, laŭvorte kopias de x kaj y.
Hodiaŭ ni ŝanĝu tion.
Hodiaŭ anstataŭ pasante en ints a kaj b nin tuj pasos en 2 adresoj.
Tiuj adresoj okazi al punkto al ints, sed tiuj adresoj ne ints sin.
Ili estas adresoj. Estas kiel poŝtan adreson anstataŭe.
Do nun ni bezonas nur doni al mi iom pli detale en la ekrano.
Ĉi tio estas mia komputilo memoro kiel jam pasis tuta tago.
Nun ni bezonas iujn arbitraj kalkulado skemon.
Do ni nur diros, nur por hazardo, ke ĉi tio estas memoro adreso 123, 124.
Ni nur diras estas 125, tiu estas 126, kaj tiel plu, sed tio estas tute arbitra.
Ni nur bezonas iom numerante skemon en mia memoro.
Do nun, kiam mi efektive pasas en x kaj y, mi ne tuj pasos en x kaj y;
Mi tuj pasos en la poŝta adreso, por tiel diri, de x kaj de y
por ke kion gets stokita tie kaj ĉi tie ne estas 1 kaj 2,
sed se vi povas vidi mian malgrandan tekston, kion gets pasis en ĉi tie kaj ĉi tie?
[Inaudible studento respondon] >> Ekzakte. 123 gets metis tien kaj 124 gets metis tie.
>> Nun, ĉar mi uzis la stelo en la nuna unua linio supren tie al supro,
mia programo nur scias ke 123 kaj 124, kvankam ili estas evidente entjeroj
ke iu homo povis rimarki, ili devus esti interpretita kiel adresojn, nombraj adresoj.
Ili ne estas en kaj pri si ints, ili estas adresojn,
kaj tio estas ĉar mi eksplicite metis la steloj tie.
Do nun en mia unua, dua, kaj tria linio de reala kodo kio okazas ĉi tie?
Ni desegni la resto de la pentraĵo.
Tmp estas kiel ĝi estis lundo. Nenio speciala pri tmp.
Ĝi estas nur loka 32 bitoj variablo, kaj ene de kiu mi estas ŝajne stoki la valoro de * a.
Nun, se mi nur diris tmp = al, kion mi metis ĉi tien? >> [Studento] 123.
123. Sed tio ne estas kion mi faras.
Mi dirante tmp = * al. Stelo per iri tien.
Do jen, 123. Kiel mi iras tien? Ŝajnigi kiel ekzistas sago.
Nu, tie estas, 1. Do kio gets stokitaj en tmp, ŝajne? Nur 1.
Do alivorte, tmp estas * a, * rimedon iri al la adreso kiu estas aktuale en,
kiu estas ŝajne 123.
>> Konsentite, jen ni estas en loko 123, mi vidas la numero 1,
do mi tuj metis la numero 1 tie.
Nun kion mi faras en linio 2, * al = * b?
Ĉi tiu estas iom pli implikitaj ĉar nun kio estas? Estas 123.
Do * a estas kie? Ĝuste kie mi estis antaŭe. Do iru tien. Okay.
Nun, laste, kaj tiam fine ĉi komencos sencon, mi esperas,
* B signifas kio estas en b? 124. Do mi bezonas iri tien, kiu estas 2.
Do kion mi metis kie?
2 eniras en ĉi tie, ĉar * b iras en * a. Do mi devos fari tion.
Kaj vi povas jam vidi, eble, ke ni estas tiom proksima
al solvi ĉi tiu stulta, simpla problemo ĝuste por la unua fojo
ĉar nun ni ankoraŭ havas rememoro pri tio, kion x estis,
ni havas 2 kopioj, Certe, de y,
sed la linio 3 nun diras * b.
Do jen b. * B signifas iri tien. Do kie estas loko 124?
Estas ŝajne tie. Do kion mi metis ĉi tien? Evidente, tmp.
Do nun mi tion faras. Do mi havas 1 tie kaj 2 ĉi tie.
Kaj nun kio pri ĉio ĉi, la 123, la 124, kaj la 1?
Apenaŭ interŝanĝa revenas, ĉi tiu memoro estas tiel bona kiel perdita
ĉar tiel frue kiel interŝanĝa revenas, la mastruma sistemo
estas libera por uzi tiu memoro denove en la estonteco.
Nur ĉefa memoro ĉe la malsupro de tiu tn pilo batas ĉirkaŭe.
>> Kaj tial ni fine havas nun funkciantan version.
Lasu min iri en swap.c, kaj rimarkis la sekvan.
Sur la supro de la programo mi ŝanĝis mian prototipo esti int * a kaj int * b.
Do la sola afero mi ŝanĝis al iri de ruĝa, kio estis malbona, al verdo, kiu estas bona,
estas mi aldonis tiujn stelojn hodiaŭ.
Sed tiam cxi tie en interŝanĝi mem mi devis kopii, alglui kio estis ĝuste sur la glito.
Mi havas stelon tie, stelo tie - tio egalas la prototipo -
kaj tiam ĉiuj tiuj aferoj nun havas stelojn krom tmp
ĉar la uzo de provizora variablo, ekzistas nenio nova tie.
Mi nur bezonas temporal stokado por int.
Do ni ne bezonas stelon tie.
Ni nur bezonas la stelo por ke ni povas transiri tiun specon de arbitra limo
inter tiuj 2 kadroj en mia komputilo memoro.
Sed unu lasta afero devas ŝanĝi, kaj vi povus esti duonvidis ĝin jam.
Kio alia linio estas evidente malsama nun? >> [Studento] & x.
>> Yeah, do 25 estas la lasta linio de kodo mi bezonas ŝanĝi por ĉi labori.
Semajno antaŭe kaj eĉ lundon linio 25 aspektis kiel ĉi tiu, interŝanĝi x kaj y,
kaj ĉi tiu estis nur rompita ĉar se vi diras swap (x, y)
vi donas kopiojn de x kaj y por interŝanĝi, tiam ĝi estas farante lia afero,
sed vi neniam vere ŝanĝas x kaj y sin.
Do eĉ se vi neniam vidis tiun karakteron antaŭe kun la signo en kodo,
nur preni diveni. Kion faras la signon fari, ŝajne?
[Studento] Takes la adreso. >> Takes la adreso.
Do la signo dirante al mi la adreson de x.
Kiu scias kie estas? Ĝi okazas esti 123. Mi ne zorgas. Nur donu al mi la adreson de x.
& Y signifas doni al mi la adreson de y.
Kaj je tiu punkto la historio estas perfekte kohera kun la bildo ni tiris antaŭ momento.
>> Do mi devos konfesi punteros, certe por mi, kiam mi unue eklernis tion,
estis definitive unu el la plej malfacilaj aferoj por kovri mian menson ĉirkaŭe.
Sed realigi, speciale kiel ni observu ludante kun tiuj specoj de aferoj,
se vi rompas gxin al tiuj super simpla speco de intelekte seninteresa problemoj
de nur movanta nombroj ĉirkaŭe, la respondo al multan konfuzon kun indikoj
vere povas esti derivita de tiuj tre baza mekaniko.
Jen adreso. Iri tien kun la stelo.
Aŭ male, jen kaj-simbolo. Elkompreni kiel la adreso fakte estas.
Bone.
Do kie estas ĉio ĉi memoro devenante?
Ni nomis tiun foton kelkajn fojojn, kaj mi gardas promesplena ni revenos al ĝi,
sed jen estas la reprezento de via komputilo la memoro
ke estas iom pli markitaj ol nia chalkboard tie estas.
La teksto segmento je supro reprezentas kio rilate al via programo?
[Inaudible studento respondon] >> Pardonu? Diru denove.
[Studento] La reala programo. >> La efektiva programo.
>> Do la _0s_ kaj _1s_ ke vi kompilis post skribi C-kodo kaj poste kurante Clang
kaj generante _0s_ kaj _1s_ finas getting tucked tie en memoro
ĉar kiam vi duoble musklaku ikono en via Mac aŭ PC
aŭ kuri komandon kiel mario ĉe via prompto, via _0s_ kaj _1s_ de disko
get ŝarĝas en memoro por ke la komputilo povas manipuli ilin
kaj ekzekuti ilin pli rapide.
Do inicializado datumoj kaj uninitialized datumoj, ni ne multe parolos pri tiuj,
sed tiuj estas nur tutmonda variabloj.
Inicializado signifas tutmonda variabloj kiujn vi donis valorojn al;
uninitialized signifas tutmonda variabloj kiujn vi ankoraux ne donas valorojn al.
Tiam ekzistas tiuj mediovariabloj kiuj mi tute skuos mian manon je,
sed ili estas tie kaj kiu tendencas aĵojn kiel vian uzantnomon
kaj aliaj speco de pli malalta nivelo detaloj.
Sed la juiciest pecoj de via memoro la aranĝo estas tiu afero nomata la pilo kaj la amaso.
La pilo denove, esti klara, estas la memoro kiun estas uzata kiam funkcioj estas nomata,
kiam ajn estas lokaj variabloj
kaj ĉiufoje kiam estas parametroj aprobotaj ĉirkaŭe.
Ĉiuj kiuj okazas en la stako.
La amaso ni ne raportis, sed preni guess kiu uzas la amaso.
Nur malsama eron de memoro.
Ĝi okazas esti desegnita tie supre, sed estas arbitra pictórico konvencio.
Kiu ŝajne estis uzante memoro de la amaso dum semajnoj?
Estas teknike vi sed nerekte. >> [Studento] GetString.
GetString kaj malloc. Do jen la fundamenta diferenco.
>> Vi scias la lastaj semajnoj, ke se vi bezonos memoro, simple deklaras variablon.
Se vi bezonas multan memoron, deklari tabelo tute interne de via funkcio.
Sed la problemo ni tenis alfrontas estas se vi rakontos variabloj loke ene de funkcioj,
tuj kiam la funkcio revenas, kio okazas al la memoro kaj tiuj variabloj?
Nur ia ĝi ne plu apartenas al vi, ĉu ne? Ĝi simple malaperas ia koncepte.
Estas ankoraŭ fizike tie, evidente, sed ĝi ne plu vian rajton uzi.
Tio estas evidente problema se vi volas skribi funkciojn en la vivo
ke efektive rezervi memoron kaj ne donas ĝin tuj.
Kazo en punkto: GetString la celo en la vivo estas havi nenian ideon anticipe
kiom granda de kordo mi iros por tajpi en la klavaro,
sed ĝi alvenis al povos rezervi memoron por teni Davido aŭ saluton
aŭ tuta eseo ke la uzanto eble tajpis in
Do GetString estis uzante malloc.
Malloc tial devas uzi ne la pilo;
anstataŭ ĝi estas uzanta tion nomis la amaso.
Nenio malsama pri la memoro. Ne pli rapida aŭ malrapida aŭ io kiel tio.
Estas nur fizike en malsama loko.
>> Sed la regulo estas, ke la memoro ke tio asignitaj sur la havaĵon
neniam estos prenita for de vi, gxis vi nomas - preni guess - libera.
Kontraŭe, ĉiu memoro vi petas en la stako de nur deklarante tabelo
aŭ deklari variablon kiel ni estis farante dum semajnoj,
ke defaŭlte finas sur la stako.
Kaj tio funkcias granda 90% de la tempo, sed en tiuj maloftaj okazoj
kie vi volas rezervi memoron kaj konservi ĝin ĉirkaŭe,
tiam vi devas uzi funkcio kiel malloc.
Aŭ ni uzis funkcio kiel GetString, kiu siavice uzas malloc.
Ni vidu kie ĉi povus rompi kaj poste preni travidi en Binky.
Ni revenos al tiu en la estonteco.
Jen super simpla programo kiu en la unuaj 2 linioj faras kio?
En la angla, kion ĉi tiuj unuaj 2 linioj de kodo fari ene de ĉefa?
[Inaudible studento respondon]
Zorga. Ne donu al mi la adreson de x aŭ y.
[Studento] Donas punteros al ints. >> Bona. Donu al mi 2 punteros al entjeroj.
En aliaj vortoj, donu al mi 2 pecoj de memoro, ke mi observu desegno hodiaŭ,
kvankam mi viŝis ĝin nun, kiel kvadratoj.
Donu al mi 2 pecoj de memoro, unu nomita x, unu nomita y -
antaŭe mi nomis ilin s kaj t - kaj kio estas la tipo de tiu bloko de memoro?
Ĝi okazas stoki adreson.
Estas de tipo int *.
>> Do la adreso de int eventuale loĝas en x,
la adreso de int eventuale loĝas en y,
sed komence, kio estas interne de x kaj y? Kiu scias? Garbage valoroj.
Ĝi havas nenion komunan kun indikoj.
Se ni ne metus ion tie, kiu scias kio estas reale ekzistas?
Nun, x. Kio okazas ĉi tie? Ĉi tiu estas legit nun ĉar x estas puntero. Ĝi estas int *.
Do tio signifas mi povas meti en x la adreso de iu bloko de memoro.
Kion malloc reveni? Perfekta, ĝi revenas adresojn,
la adreso de la unua bajto en tuta bloko de memoro.
Kiom da bajtoj estas ĉi ŝajne atribuo, ekzemple, en la aparaton?
Kio estas la grandeco de int? 4.
Se vi pensas reen al semajno 1, ne super grave ĉiam memoru, ke,
sed en ĉi tiu kazo ĝi estas utila por scii, 4 bitokoj.
Do tiu estas atribuo sur la havaĵon 4 bitokoj
kaj ĝin redoni la adreson de la unua al mi arbitre.
Nun, kio x faras?
A * x = 42 faras kio?
Se je ĉi tiu punkto en la historio ni havas x, kiu aspektas kiel tiu kun iu rubo valoro,
ĉi tiu estas nun y kun iuj rubo valoron, nun en linio 3 Mi destinis 4 bitokoj.
Ĉi tiu pentraĵo esence similas ĉi.
Aŭ pli konkrete, se ĉi tiu estas ajna adreso 123, tio estas, kion nia rakonto nun aspektas.
* X = 42 nun signifas kion? Tio signifas iri al la adreso 123 kaj metis la numero 42 tie.
Mi ne bezonas por desegni tiujn liniojn ĉar ni ne faras kordojn.
>> Mi devus esti ĵus skribis ĝin kiel tiun, kaj nur por pruvo de sake,
42 kiel int ia okupas multe da spaco, 4 bitokoj.
Do jen kio okazis tie, sed tie estas problemo nun.
* Y = 13. Kio okazos tie?
La problemo estas * y en nia simpligita mondo nur signifas iri al la adreso en y.
Kio estas en y? Estas iuj rubo valoro.
Do ni supozu, ke tiu rubo valoro estas 5551212, iu freneza tiel.
* Y signifas iri trakti 5551212.
Tio like super tie. Ĝi ne ekzistas, ekzemple.
Do * y ricevas 13 rimedoj Mi provas ĉerpi 13 ĉi tie. Ĝi ne ekzistas.
Mi superis la segmento de la tabulo. Kiel mi estas rekompenciĝita?
Ke críptico mesaĝon segmentación kulpo ĉar mi klopodis meti en memoron
valoro kiel 13, je loko kiu ne ekzistas.
La resto de la programo povus labori bone, sed ĝis tiu punkto ne.
Do ni provu diri ĉi tiu historio.
Ni revenos al tiu fojo ni jam parolis pri deksesumajn.
Ni reiru al oriento kaj konkludi kun tiu afero nomata Binky,
kiu revokon estas Stanford instruisto sidas hejme ludante kun Claymation,
rakonti la historion de ĝuste tiu sama programo.
Estas nur ĉirkaŭ 3 minutoj. Jen ni havas Binky.
[Masklo parolanto en video] Hey Binky, veki. Estas tempo por puntero amuzo.
[Binky] Kio estas tio? Lernu pri punteros? Ho, Goody!
[Masklo parolanto] Nu, por komenci, mi supozas ke ni tuj bezonas paron punteros.
>> [Binky] Okay. Tiu kodo allocates 2 punteros kiu povas marki entjeroj.
[Masklo parolanto] Okay. Nu, mi vidas la 2 punteros, sed ne ŝajnas esti indikante nenion.
[Binky] Tio estas prava. Komence, punteros ne indikas ion ajn.
La aferoj oni indikas nomas pointees, kaj fiksante ilin estas aparta paŝo.
[Masklo parolanto] Ho, dekstra, rajto. Mi sciis tion. La pointees estas apartaj.
Er, do kiel vi rezervu pointee?
[Binky] Okay. Tiu kodo allocates nova entjero pointee, kaj ĉi tiu parto aroj x atentigi al tio.
[Masklo parolanto] Hey, kiu serĉas pli bone.
Do fari ion. >> [Binky] Okay.
Mi instruos vin dereference la puntero x por stoki la numero 42 en ĝian pointee.
Por ĉi tiu lertaĵo Mi bezonas mian magian bastonon de dereferencing.
[Masklo parolanto] Via magio sceptron de dereferencing? Tio estas granda.
[Binky] Ĉi tio estas kion la kodo aspektas. Mi ĵus instalis la nombro kaj ... [Krevi sono]
[Masklo parolanto] Hey rigardi, ĝi iras.
Tion farante oni dereference sur x sekvas la sago por aliri lia pointee,
en ĉi tiu kazo por stoki 42 en tie.
Hej, provu uzi ĝin stoki la numero 13 tra la alia puntero, y.
[Binky] Okay. Mi simple iri tien al y kaj akiri la numero 13 starigis
kaj tiam preni la sceptron de dereferencing kaj simple ... [Bruado sono] Halt!
[Masklo parolanto] Oh hey, ke ne funkciis.
>> Diru Binky, mi ne kredas dereferencing y estas bona ideo
ĉar starigadon de la pointee estas aparta paŝo
kaj mi ne kredas ke ni iam faris.
[Binky] Hmm, bona punkto.
[Masklo parolanto] Yeah. Ni destinis la puntero y sed ni neniam starigis ĝin al punkto al pointee.
[Binky] Hmm, tre religiema.
[Masklo parolanto] Hey, kiun vi sercxas bonan tie, Binky.
Ĉu vi povas ripari ĝin tiel ke y punktoj al la sama pointee kiel x? >> [Binky] Certe.
Mi uzas mian magian bastonon de puntero farita.
[Masklo parolanto] Ĉu tiu tuj estos problemo kiel antaŭe?
[Binky] Ne, ĉi tio ne tuŝas la pointees.
Ĝi simple ŝanĝas unu puntero atentigi al la sama afero kiel la alia. [Krevi sono]
[Masklo parolanto] Ho, mi vidas. Nun y punktoj al la sama loko kiel x.
Do atendu. Nun y estas fiksita. Ĝi havas pointee.
Do vi povas provi la sceptron de dereferencing denove sendi la 13 pli.
[Binky] Uh, okay. Jen iras. [Krevi sono]
[Masklo parolanto] Hey, rigardu tion. Nun dereferencing laboroj sur y.
Kaj ĉar la punteros dividas tiun pointee, ili ambaŭ vidas la 13.
[Binky] Yeah, dividi. Kion ajn.
>> Do ni tuj ŝanĝos lokoj nun?
[Masklo parolanto] Ho rigardu, ni estas el la tempo. >> [Binky] Sed -
[Masklo parolanto] nur memoras la 3 puntero reguloj.
Nombro 1, la baza strukturo estas ke vi havas puntero kaj notas super al pointee.
Sed la montrilo kaj pointee estas apartaj, kaj la komuna eraro estas starigi puntero
sed forgesi doni al ĝi pointee.
Numero 2, pointer dereferencing komenciĝas ĉe la montrilo kaj sekvas lian sagon super
aliri lia pointee.
Kiel ni ĉiuj scias, tiu nur funkcias se estas pointee,
kio tia ricevas reen por regi numero 1.
Numero 3, pointer asigno prenas unu puntero kaj ŝanĝas ĝin
atentigi al la sama pointee kiel alia puntero.
Do post la farita, la 2 punteros notos la saman pointee.
Kelkfoje tiu nomas dividi.
>> Kaj jen ĉio estas al ĝi vere. Bye-bye nun.
Ĉi tiu estas Binky. Ĉi tiu estas CS50. Ni vidos vin proksima semajno. [Aplaŭdo]
>> [CS50.TV]