>> [MUZIKO Ludante]
>> DOUG LLOYD: Montriloj, jen ni estas.
Tio sendube iranta esti la plej malfacila temo
ke ni raportas en CS50.
Se vi legis ion pri punteros
antaŭ vi povus esti iomete intimidar iranta en tiu video.
Ĝi estas vera la montriloj cxu vi permesas la kapablon
eble ŝraŭbo supren bela malbone kiam vi estas
laborante kun variabloj, kaj datumoj, kaj kaŭzante via programo por frakasi.
Sed ili estas efektive vere utila kaj ili permesos al ni vere grandan vojon
pasi datumojn reen kaj reen inter funkcioj,
ke ni estas alie nekapablaj fari.
>> Kaj tiel kion ni vere volas fari tie estas trajno
vi havi bonan montrilo disciplino, do ke vi povas uzi punteros efike
fari vian programoj kiuj multe pli bone.
Kiel mi diris punteros al ni malsaman maniero pasi datumojn inter funkcioj.
Nun se vi memoras de frua vídeo, kiam
ni parolis pri ŝanĝiĝema amplekso, mi menciis
ke ĉiuj datumoj kiujn ni pasas inter funkcioj en C preterpasis valoro.
Kaj mi ne uzis ke termino, kion mi signifis tie
estis ke ni pasas kopiojn de datumoj.
Kiam ni pasas variablo al funkcio, ni fakte ne pasante la variablo
al la funkcio, ĉu ne?
Ni pasante kopion de ke datumoj por la funkcio.
La funkcio faras kio volas, kaj ĝi kalkulas iu valoro,
kaj eble ni uzu tiun valoron kiam donas ĝin reen.
>> Ekzistis unu escepto al tiu regulo trapasu valoro,
kaj ni revenos al kio tiu estas iom pli poste en ĉi tiu video.
Se ni uzas punteros anstataŭe de uzante variabloj,
aŭ anstataŭ uzi la variabloj sin aŭ kopiojn de la variabloj,
ni povas nun pasas la variabloj ĉirkaŭ inter funkcioj en malsama maniero.
Tio signifas ke se ni faras ŝanĝo en unu funkcio,
ke ŝanĝo estos reale preni efekto en malsama funkcio.
Denove, tiu estas iu kiu ni ne povis fari antaŭe,
kaj se vi iam provis interŝanĝi la valoro de du variabloj en funkcio,
vi rimarkis tiun problemon ia rampanta supren, dekstra?
>> Se ni volas interŝanĝi X kaj Y, kaj ni pasas ilin al funkcio nomita interŝanĝa,
interne de la funkcio interŝanĝi la variabloj fari interŝanĝon valoroj.
Igas du, du iĝas unu, sed ni ne vere
ŝanĝi ion en la originala funkcion, en la telefonanto.
Ĉar ni ne povas, ni estas nur laborante kun kopioj de ili.
Kun punteros tamen, ni povas reale pasi X kaj Y al funkcio.
Ke funkcio povas fari iun kun ili.
Kaj tiuj variabloj valoroj povas fakte ŝanĝi.
Do tio estas tute ŝanĝo en nia kapablo labori kun datumoj.
>> Antaŭ ni plonĝi en punteros, mi pensas ĝi estas valora
prenante kelkajn minutojn reiru al Bazaj tie.
Kaj rigardu kiamaniere komputila memoro verkoj
cxar tiuj du temoj estas irantaj por fakte esti bela interrilatigitaj.
Kiel vi probable scias, sur via komputilo
vi havas malmolan diskon aŭ eble solida stata stirado,
ia dosieron stokado loko.
Ĝi estas kutime ie najbaraĵo de 250 gigabajtoj
al eble kelkaj terabajtoj nun.
Kaj estas kie ĉiuj viaj dosierojn finfine vivi,
Eĉ kiam via komputilo estas fermitaj for, vi povas turni ĝin reen sur
kaj vi trovos viajn dosierojn tie denove kiam vi restartas vian sistemon.
Sed diskoj, kiel malmola disko, oni HDD, aŭ solida stata stirado, SSD,
estas nur stora.
>> Ni ne povas vere fari ion kun la datumoj kiuj estas en malmola disko,
aŭ en solida stata stirado.
Por reale ŝanĝi datumojn aŭ movi ĝin ĉirkaŭe,
Ni devas movi ĝin al RAM, hazarda aliro memoro.
Nun RAM, vi havas multe malpli en via komputilo.
Vi povas havi ie en la najbaraĵo de 512 megabajtoj
se vi havas pli malnovan komputilon, al eble du, kvar, ok, 16
eble eĉ iom pli, gigabajtoj de RAM.
Do jen multe pli malgranda, sed tio estas kie ĉio el la volátil datumoj ekzistas.
Tie estas kie ni povas ŝanĝi aferojn.
Sed kiam ni turnas nian komputilon for, ĉiuj de la datumoj en RAM estas detruita.
>> Tial do ni bezonas havi malmola disko por la pli permanenta loko de ĝi,
tiel ke ĝi exists- ĝi farus esti vere malbona se ĉiufoje ni
turnis niajn komputilo malproksime, ĉiu dosiero en nia sistemo estis forviŝita.
Do ni laboras ene de RAM.
Kaj ĉiufoje ni parolas pri memoro, preskaux, en CS50,
ni parolas pri RAM, ne fiksita disko.
>> Do kiam ni movi objektojn en memoro, ĝi okupas certan kvanton de spaco.
Ĉiuj de la datumtipoj, ke ni estis laboranta kun
levu malsamajn kvantoj de spaco en RAM.
Do ĉiufoje oni kreas entjero variablo, kvar bajtoj de memoro
ili flankenmetis en RAM tiel vi povas labori kun tiu entjero.
Vi povas deklari la entjero, ŝanĝi ĝin, atribui ĝin
al valoro 10 incremented post alia, tiel plu kaj tiel plu.
Ĉiuj kiu bezonas okazi en RAM, kaj vi ricevas kvar bajtoj
labori kun por ĉiu entjera ke vi kreas.
>> Ĉiu karaktero vin krei ricevas unu bajto.
Tio estas nur kiom spaco estas bezonas stoki karaktero.
Ĉiu flosilo, vera nombro, ricevas kvar bajtoj
krom se ĝi estas duobla precizeco glitpunktaj
nombro, kiu permesas vin havi pli preciza aŭ pli ciferoj
post la dekuma punkto sen perdi precizecon,
kiun levu ok bajtoj de memoro.
Longe sopiras, vere granda entjeroj, ankaŭ levu ok bajtoj de memoro.
Kiom da bajtoj de memoro ĉu kordoj kolektis?
Nu ni metis pinglon en tiu demando por nun, sed ni revenos al tio.
>> Do reen al tiu ideo de memoro kiel granda tabelo de bajto grandeco ĉeloj.
Tio estas vere ĉiuj estas, estas nur grandegan tabelo de ĉeloj,
same kiel ĉiu alia tabelo kiu vi konas kaj vidas,
krom ĉiu ero estas unu bajton larĝa.
Kaj ĝuste kiel tabelo, ĉiu elemento havas adreson.
Ĉiu elemento de tabelo havas indicon, kaj ni
povas uzi tiun indekson fari tn hazarda aliro sur la tabelo.
Ni ne devas komenci je la komenco de la tabelo,
persisti tra ĉiu sola elemento gxia
trovi kion ni serĉas.
Ni povas nur diri: Mi volas atingi la 15a elemento aŭ la 100a elemento.
Kaj vi povas simple pasas en tiu nombro kaj akiri la valoron vi serĉas.
>> Simile ĉiu loko memore havas adreson.
Do via memoro povus aspektas tiel.
Jen tre malgranda bloko de memoro, tiu estas 20 bajtoj de memoro.
La unuaj 20 bajtoj ĉar mia alparolas tie funde
Estas 0, 1, 2, 3, kaj tiel sur la tuta vojo ĝis 19.
Kaj kiam mi deklaras variablojn kaj kiam mi komencas labori kun ili,
la sistemo tuj starigis flanken iun spacon por mi
en tiu memoro labori kun mia variabloj.
Do mi povus diri, char c egalas ĉefurbo H. Kaj kio okazos?
Nu la sistemo tuj flankenmetis por mi unu bajto.
En ĉi tiu kazo elektis bajto nombro kvar, la bajto je adreson kvar,
kaj ĝi tuj stoki la letero ĉefurbo H en tie por mi.
Se mi tiam diri int rapido limo egalas 65, estas
tuj flankenmetis kvar bajtoj de memoro por mi.
Kaj ĝi tuj trakti tiujn kvar bajtojn kiel ununura unuo
ĉar kion ni laboras kun estas entjero tie.
Kaj ĝi tuj stoki 65 en tie.
>> Nun jam mi estas speco de diranta vin iom de mensogo,
Bone, ĉar ni scias ke komputiloj labori en duuma.
Ili ne komprenas nepre kio majuskla H estas
aŭ kia estas la 65, ili nur kompreni duuma, nuloj kaj aĵoj.
Kaj tial fakte kio ni stokante tien
ne estas la litero H kaj la numero 65, sed prefere la duuma reprezentoj
gxia aspekti iom io tiamaniere.
Kaj precipe en la kunteksto de la entjera variablo,
ĝi ne iras por ĵus kraĉis ĝin, ĝi ne tuj trakti ĝin kiel unu kvar
bajto chunk nepre, ĝi estas vere iranta
trakti ĝin kiel kvar unu bajto pecoj, kiu eble aspektas tiel.
Kaj eĉ tio ne tute vera ankaŭ ne,
pro io nomata an endianness, kiun ni ne
tuj eniri nun, sed se vi estas scivola pri,
vi povas legi sur iom kaj granda endianness.
Sed pro tiu argumento, pro tiu video,
ni nur supozas ke estas, en Fakte, kiel la numero 65 estus
esti reprezentitaj en memoro sur ĉiu sistemo,
kvankam ĝi ne estas tute vera.
>> Sed ni vere simple akiri liverita de ĉiuj binaraj tute,
kaj nur pensas pri kiel H kaj 65, estas multe pli facile
pensi pri ĝi kiel ke kiel homo.
Bone, do ĝi ankaŭ ŝajnas eble iom hazarda ke I've- mia sistemo
ne donis al mi bajtoj 5, 6, 7, kaj 8 stoki la entjero.
Pro bona kialo por tio, ankaŭ, kiu ni ne enir ĝuste nun, sed sufiĉas
diri ke kio la komputilo faras tie
estas verŝajne bona movo sur lia parto.
Por ne doni al mi memoro kiu estas nepre malantaŭo al dorso.
Kvankam ĝi estas iranta fari ĝin nun se mi volas ricevi alian ĉenon,
nomata familian nomon, kaj mi volas meti Lloyd en tie.
Mi tuj devas persvadi unu karaktero, ĉiu litero de tio
tuj postulos unu karaktero, unu bajto da memoro.
Do se mi povus meti Lloyd en mia tabelo tiel mi estas sufiĉe bona iri, ĉu ne?
Kio mankas?
>> Memoru ke ĉiu linio ni laboras kun en C finiĝas kun backslash nula,
kaj ni ne povas preterlasi ke ĉi tie, ĉu.
Ni devas flankenmetis unu bajto de memoro por teni ke do ni
scias kiam nia kordoj finis.
Do denove tiu aranĝo de la aferoj
aperas en memoro potenco esti iom hazarda,
sed fakte estas kiel plej multaj sistemoj estas desegnitaj.
Por vicigi ilin sur obloj de kvar, por kialoj denove
ke ni ne bezonas enir nun.
Sed tiu, do sufiĉas diri ke Post tiuj tri linioj de kodo,
jen kion memoro povus aspekti.
Se mi bezonas memoro lokoj 4, 8, kaj 12 por teni mian datumojn,
jen kion mia memoro povus aspekti.
>> Kaj nur esti aparte pedanta tie, kiam
ni parolas pri memoro adresojn ni kutime
tion fari uzante deksesumaj notacioj.
Do kial ni ne konverti ĉiujn tiujn el dekuma al deksesuma notacio
nur ĉar tio estas ĝenerale kiamaniere ni priparolas memoro.
Do anstataŭ esti 0 tra 19, kion ni havas estas nulo
x zero tra nulo x1 tri.
Tiuj estas la 20 bajtoj de memoro kiun ni esti aŭ ni rigardas en ĉi tiu bildo
ĝuste ĉi tie.
>> Do ĉio tiu estado diris, ni paŝi for el memoro dum sekundo
kaj reen al punteros.
Jen la plej grava afero memori
kiel ni komencas labori kun punteros.
Montrilo estas nenio pli ol adreson.
Mi diros ĝin denove, ĉar ĝi estas tiel grava,
montrilo estas nenio pli ol adreson.
Montriloj estas adresoj por lokoj memore kie variabloj vivi.
Sciante ke ĝi iĝas espereble iomete pli facile labori kun ili.
Alia afero mi ŝatas fari estas havas varon
de diagramoj vide reprezenti kio estas okazas kun diversaj linioj de kodo.
Kaj ni faros ĉi paro de tempoj en punteros,
kaj kiam ni parolas pri dinamika memoro atribuo tiel.
Ĉar mi pensas ke tiuj diagramoj povas esti precipe helpema.
>> Do se mi diras ekzemple, int k en mia kodo, kio okazas?
Nu kio esence estas okazanta Mi ricevas memoro flankenmetis por mi,
sed mi eĉ ne ŝatas pripensas ĝin kiel tio, mi
ŝatas pensi pri ĝi kiel skatolo.
Mi havas skatolon kaj ĝi estas kolora verda ĉar mi
povas meti entjeroj en verda skatoloj.
Se ĝi estis karaktero mi havu blua skatolo.
Sed mi ĉiam diras, se mi kreanta skatolo kiu povas teni entjeroj
ke skatolo estas kolorita verda.
Kaj Mi prenos permanenta markilo kaj Mi skribos sur la k flanko.
Do mi havas skatolon nomita k, en kiun mi povas meti entjeroj.
Do kiam mi diras int k, jen kio okazas en mia kapo.
Se mi diras k egalas kvin, kion mi faras?
Nu, mi metante kvin en la skatolo, dekstre.
Tiu estas sufiĉe simpla, se Mi diras int k, krei skatolon nomita k.
Se mi diras k egalas 5, metis kvin en la skatolo.
Espereble tio ne tro bona salto.
Jen kien aferoj iras iom interesa kvankam.
Se mi diras int * pk, bone eĉ se mi ne scias kion tio nepre signifas,
ĝi estas klare ion fari kun entjero.
Do mi tuj kolori tiu skatolo verda-ish,
Mi scias ĝin estas atingis ion fari kun entjero,
sed ĝi ne estas entjero mem, ĉar ĝi estas int stelo.
Estas io iomete malsama pri ĝi.
Do entjero estas implikitaj, sed alie ĝi estas
ne tro malsama de kion ni parolis.
Ĝi estas skatolo, liaj ricevis etiketon, ĝi surhavas etiketo pk,
kaj estas kapabla je posedo int steloj ajn tiuj estas.
Ili havas ion por fari kun entjeroj, klare.
Jen la lasta linio tamen.
Se mi diras pk = & k, halt, kio ĵus okazis, ĉu ne?
Do tiu hazarda nombro, ŝajne aleatoria nombro, gets ĵetitaj en la skatolo.
Ĉiuj kiu estas, estas pk akiras la adreson de k.
Do mi senmoviĝanta kie k vivas en memoro, lia adreso, la adreso de lia bajtoj.
Ĉiuj mi faras estas mi dirante ke valoro estas kion mi tuj
meti ene de mia skatolo nomita pk.
Kaj ĉar ĉi tiuj aferoj estas punteros, kaj ĉar rigardanta
ĉe ĉenon kiel nulon x ok nul c sep kvar ok
du nulo estas probable Ne tre senchava.
Kiam ni ĝenerale bildigi punteros, ni fakte faris tiel, kiel punteros.
Pk donas nin la informo ni devas trovi k en memoro.
Do esence pk havas sagon.
Kaj se ni iradas la longo de tiu sago, imagi
ĝi estas io vi povas marŝi sur, se ni marŝi laŭ la longo de la sago,
ĉe la pinto de tiu sago, ni trovos la lokon en memoro
kie k vivas.
Kaj tio estas vere grava ĉar iam ni scios kie k vivas,
ni povas komenci labori kun la datumoj ene de tiu memoro loko.
Kvankam ni estas duumaj teeny mordis antaŭen de ni mem nun.
>> Do kio estas puntero?
Montrilo estas datumo artikolon kies valoro estas memoro adreso.
Tio estis tiu nulo x ok nul havajxoj okazas, ke estis memoro adreso.
Tio estis loko en memoro.
Kaj la tipo de puntero priskribas la specon
de datumoj vi trovos ĉe tiu memoro adreso.
Do ekzistas la int stelo parto dekstra.
Se mi sekvas ke sago, ĝi estas tuj konduku min al loko.
Kaj tiu loko, kion mi trovos tie en mia ekzemplo,
Estas verda kolora skatolo.
Ĝi estas entjero, jen kion mi trovos se mi iras al tiu adreso.
La datumtipo de montrilo priskribas kion
Vi trovos ĉe tiu memoro adreso.
Do jen la vere malvarmeta afero tamen.
Montriloj nin permesas pasi variabloj inter funkcioj.
Kaj fakte okazis variabloj kaj ne pasi kopiojn de ili.
Ĉar se ni scias precize kie memore trovi variablon,
ni ne bezonas fari kopion de ĝin, ni povas nur iri al tiu loko
kaj labori kun tiu variablo.
Do en esenco punteros speco de fari komputila medio
multe pli kiel la reala mondo, dekstre.
>> Do jen analogion.
Diru ke mi havas kajeron, dekstra, kaj ĝi estas plena de notoj.
Kaj mi ŝatus ke vi ĝisdatigi ĝin.
Vi estas funkcio kiu ĝisdatigoj notoj, dekstre.
En la vojo ni estis laboras ĝis nun, kio
okazas estas vi prenos mian notlibron, vi iros al la kopion vendejo,
vi faros Xerox kopion de ĉiun paĝon de la kajero.
Vi lasos mian notlibron reen sur mia skribtablo kiam vi faris,
vi iros transiri ekstere aferojn en mia kajero kiu estas eksdata aŭ erara,
kaj tiam vi pasos al mi la stako de Xerox paĝoj
ke estas repliko de mia kajero kun la ŝanĝojn kiujn vi faris al ĝi.
Kaj je tiu punkto, ĝi estas supren al mi kiel kunvokado funkcio, kiel la llamador,
decidi preni viajn notojn kaj integri ilin reen en mia notlibro.
Do ekzistas multaj paŝoj implikitaj tie, dekstre.
Kiel ĉu ne estus pli bone se Mi nur diras, hej, ĉu vi
ĝisdatigi mian notlibron por mi transdonos al vi mian notlibron,
kaj vi prenu aferojn kaj laŭvorte transiri ilin
kaj ĝisdatigi miajn notojn en mia notlibro.
Kaj donu al mi mian notlibron reen.
Tio estas speco de kio punteros permesi nin fari,
ili faras ĉi medio multe pli kiel kiel ni funkcias en realo.
>> Bone do tio estas kion montrilo estas, ni parolu
pri kiel punteros labori en C, kaj kiel ni povas komenci al labori kun ili.
Do tie estas tre simplaj montrilon en C nomita la nula puntero.
La nula puntero punktoj al nenio.
Ĉi tio probable similas ĝi estas fakte ne tre utila afero,
sed kiel ni vidos iom poste, la fakto
ke nula puntero ekzistas vere vere povas veni en oportuna.
Kaj kiam ajn vi krei puntero, kaj vi ne metis sian valoron immediately-
ekzemplo de enkadrigo lia valoro tuj
Estos paro diapozitivoj reen Kie mi diris pk egalas & k,
pk ricevas k la adreso, kiel ni vidos, kion ĝi signifas,
ni vidos kiel kodigi ke shortly- se ni ne fiksita ĝian valoron al io
signifoplena tuj, Vi devas ĉiam
agordi vian puntero atentigi al nula.
Vi devus agordi ĝin por indiki al nenio.
>> Tio estas tre malsama ol nur lasante la valoron kiel ĝi estas
kaj tiam deklari montrilo kaj nur supozante
ĝi estas nula pro tio malofte vera.
Do vi devus ĉiam fiksita la valoro de puntero
al nula se vi ne metis ĝian valoron al io signfa tuj.
Vi povas kontroli ĉu montrilo valoro estas nula uzante la egaleco operatoro
(==), Nur ŝatas vin kompari ajna entjero valoroj aŭ karaktero valoroj uzante (==)
ankaŭ.
Ĝi estas speciala speco de konstanta valoro, kiun vi povas uzi por provi.
Do kiu estis tre simpla puntero, la nula puntero.
Alia maniero por krei montrilo estas ĉerpi
la adreson de variablo vi jam kreis,
kaj vi faros tion uzante la & operatoro Adreso eltiro.
Kiun ni jam vidis antaŭe en la unua diagramo ekzemplo mi montris.
Do se x estas variablo kiu ni jam kreita de tipo entjero,
tiam & x estas puntero al entjero.
& x estas- memoras, & iras ĉerpi la adreso de la afero dekstre.
Kaj ekde puntero estas nur parolado, ol & x estas puntero al entjero
kies valoro estas kie en memoro x vivojn.
Estas x-adreson.
Do & x estas la adreso de x.
Ni prenu ĉi unu paŝo pli kaj konekti al io
Mi aludis en unuavican vídeo.
Se arr estas tabelo de duobloj, tiam & arr kvadrata krampo i estas montrilo
al duobla.
BONE.
arr kvadrata krampo i, se arr estas tabelo de duobloj,
tiam arr kvadrata krampo i estas la i-a ero de tiu tabelo,
kaj & arr kvadrata krampo i estas kie en memoro la i-a ero de arr ekzistas.
>> Do kio estas la implikaĵon tie?
An arrays nomo, la implico de tiu tuta afero,
estas ke tabelo nomo estas fakte mem montrilo.
Vi estis laboranta kun punteros ĉiuj kune
ĉiufoje ke vi uzis tabelo.
Rememoru el la ekzemplo sur ŝanĝiĝema amplekso,
proksime de la fino de la video mi prezentas ekzemplo kie ni havas funkcion
nomata aro int kaj funkcio nomita aro tabelo.
Kaj via defio por determini ĉu aŭ ne, aŭ kio la
valoroj kiujn ni presis eksteren la fino de la funkcio,
ĉe la fino de la ĉefa programo.
>> Se vi memoras de tiu ekzemplo aŭ se vi jam spektis la video,
vi scias, ke kiam vi- la alvoko al aro int efike faras nenion.
Sed la alvoko agordi tabelo faras.
Kaj mi ia glosada super kial kiu estis la kazo en la momento.
Mi nur diris, nu ĝi estas tabelo, estas specialaj, vi scias, ke estas kialo.
La kialo estas ke la tabelo nomo estas vere nur puntero,
kaj ekzistas tiu speciala kvadrata krampo sintakso ke
fari aferojn multe pli agrabla por labori kun.
Kaj ili faru la ideo de Pointer multe malpli timiganta,
kaj tial ili estas speco de prezentita en tiu maniero.
Sed vere arrays estas nur montriloj.
Kaj tial kiam ni faris ŝanĝon al la tabelo,
ni preteriris tabelo kiel parametro al funkcio aŭ kiel argumento
al funkcio, la enhavo de la tabelo fakte ŝanĝis en ambaŭ la callee
kaj en la telefonanto.
Kiu por ĉiu alia speco de ŝanĝiĝema ni vidis ne estis la kazo.
Do tio estas nur io teni en menso kiam vi laboras kun punteros,
estas ke la nomo de tabelo reale montrilo
al la unua elemento de tiu tabelo.
>> OK tiel nun ni havas ĉiujn tiujn faktojn, ni plu iri, dekstre.
Kial ni zorgas pri kie io vivas.
Nu kiel mi diris, ĝi estas bela utile scii kie io vivas
do vi povas iri tie kaj ŝanĝi ĝin.
Labori kun ĝi kaj reale havas nenion, pri kio vi
volas fari al tiu variablo efektiviĝos, kaj ne efektiviĝas sur iun kopion de ĝi.
Tio nomiĝas dereferencing.
Ni iru al la referenco kaj ni ŝanĝas la valoron tie.
Do se ni havas puntero kaj ĝi nomiĝas pc, kaj ĝi notas al karaktero,
tiam ni povas diri * pc kaj * pc estas la nomo de kion ni trovos, se ni iros
al la adreso pc.
Kion ni trovos tie estas karaktero kaj * pc estas kiel ni rilatas al la datumoj en tiu
situon.
Do ni povus diri ion kiel * pc = D aŭ io simila,
kaj tio signifas ke kio ajn Estis ĉe memoro Adreso pc,
ajn rolulo antaŭe tie, nun D, ​​se ni diri * pc = D.
>> Do jen ni iras denove kun iuj strangaj C stuff, dekstre.
Do ni vidis antaŭe * kiel estante iel parto de la datumtipo,
kaj nun ĝi estas uzata en iomete malsama kunteksto
aliri la datumojn al loko.
Mi scias ke estas iom konfuza kaj ke estas fakte parto de tiu tuta
kiel, kial punteros havas ĉi mitologio ĉirkaŭ ili kiel estanta tiel kompleksaj,
estas speco de sintaksa problemo, honeste.
Sed estas uzata en ambaŭ kuntekstoj: ambaŭ kiel parto de la tipo nomon
kaj ni vidos iom poste ion alian.
Kaj nun estas la dereference operatoro.
Do li iras al la referencon, ĝi aliroj la datumoj
ĉe la loko de la montrilo, kaj permesas manipuli ĝin ĉe volo.
>> Nun tiu estas tre simila al vizitante viajn proksimulon, dekstre.
Se vi scias kion viaj najbaro vivas, vi estas
ne eliri kun via najbaro.
Vi scias vi hazarde scias kie ili vivas,
sed tio ne signifas, ke per virto de havado ke scio
vi interagas kun ili.
Se vi volas interagi kun ili, Vi devi iri al sia domo,
Vi devi iri al kie ili vivas.
Kaj unufoje vi faras tion, tiam vi povas interagi
kun ili nur ŝatas vin volus.
Kaj simile kun variabloj, vi bezonas iri al ilia adreson
se vi volas interagi ilin, ne eblas simple konas la adreson.
Kaj la vojon vi iru al la adreso estas uzi *, la dereference operatoro.
Kion vi pensas okazas se ni provas kaj dereference
montrilo kies valoro estas nula?
Memoru ke la nula puntero punktoj al nenio.
Do se vi provas kaj dereference nenio aŭ iri al direkto nenion,
Kio vi pensas okazas?
Nu, se vi divenis segmentación kulpo, ke vi estus prava.
Se vi provas kaj dereference nula puntero,
vi suferos segmentación kulpo. Sed atendu,
ĉu mi ne diris al vi, ke se vi ne tuj
agordi vian valoron de via montrilon al io signfa,
vi ekus al nula?
Mi faris kaj fakte la segmentación kulpo estas speco de bona konduto.
>> Ĉu vi iam deklaris variablo kaj ne atribuita ĝia valoro tuj?
Do vi simple diru int x; vi ne reale atribui ĝin al ion
kaj tiam pli poste en via kodo, vi presi la valoro de x,
havi ankoraŭ ne atribuis al nenio.
Oftaj vi ricevos nulo, sed kelkfoje vi
povus akiri iom hazarda nombro, kaj vi ne havas ideon de kie ĝi devenas.
Simile povas aferoj okazi kun punteros.
Kiam vi deklaras puntero int * pk ekzemple,
kaj vi ne atribui ĝin al valoro, vi ricevas kvar bitokoj por memoro.
Whatever kvar bajtoj de memoro la sistemo povas
trovi ke havas iuj signfa valoro.
Kaj eble ekzistis iu jam tie
jam ne bezonas alian funkcio, do vi simple devos
ajn datumoj estis tie.
>> Kio se vi provus fari dereference iu adreso kiun vi don't- ekzistis
Jam bajtoj kaj informo en tie, tio estas jam en viaj montrilo.
Se vi provas kaj dereference ke puntero, vi eble rompado kun iu memoro
ke vi ne intencas salaton kun ĝi ĉiuj.
Kaj fakte vi povus fari io vere ruiniga,
kiel rompi alia programo, aŭ rompi alian funkcion,
aŭ fari ion malican ke vi ne intencas taŭgus.
Kaj tiel tio estas kial ĝi estas fakte bona ideo
agordi vian punteros al nula se vi ne starigu ilin al iu signifa.
Estas probable pli bona ĉe la fino de la tago por via programo
kraŝi tiam por ĝin fari iu kiu ŝraŭboj supren
alia programo aŭ alia funkcio.
Ke konduto estas verŝajne eĉ malpli idealo ol nur frakasante.
Kaj tiel tio estas kial ĝi estas fakte bona kutimo
enir agordi vian punteros al nula se vi ne metis ilin
al senchava valoro Tuj, valoro kiu vi scias
kaj ke vi povas sekure la dereference.
>> Do ni revenu nun kaj rigardu ĉe la entuta sintakso de la situacio.
Se mi diras int * p ;, kion mi ĵus faris!
Kion mi faris estas tiu.
Mi konas la valoron de p estas adreso ĉar ĉiuj indikoj estas nur
adresoj.
Mi povas dereference p uzante la * operatoro.
En tiu kunteksto ĉi tie, ĉe la tre supro rememori * estas parto de la tipo.
Int * estas la datumtipo.
Sed mi povas dereference p uzante la * operatoro,
kaj se mi faras tion, se mi iras al tiu direkto, kion mi trovis en tiu adreso?
Mi trovos entjero.
Do int * p estas esence dirante, p estas adreso.
Mi povas dereference p kaj se Mi faros, mi trovos entjero
en tiu memoro loko.
>> OK tiel mi diris estis alia ĝena afero per steloj
kaj jen kien ke ĝena afero kun steloj estas.
Ĉu vi iam provis deklari multoblaj variabloj de la sama tipo
sur la sama linio de kodo?
Do dum sekundo, ŝajnigi ke la linio, la kodo mi efektive havas tie en verda
ne estas tie kaj ĝi nur diras int x, y, z ;.
Kio kiu farus estas reale krei tri entjeraj variabloj por vi,
unu nomita x, unu nomita y, kaj oni nomis z.
Estas maniero de fari ĝin sen devi disfendita sur tri linioj.
>> Jen kie steloj akiri ĝena denove kvankam,
ĉar la * estas reale parto de ambaŭ la speca nomo kaj parto
de la variablo nomo.
Kaj do se mi diras int * px, py, PZ, kion mi reale preni estas puntero al entjero
nomata px kaj du entjeroj, py kaj Pz.
Kaj tio estas probable ne kion ni volas, tio estas ne bona.
>> Do se mi volas krei plurajn punteros sur la sama linio, de la sama tipo,
kaj stelojn, kion mi efektive bezonas nur diri int * pa, * pb, * pc.
Nun li ĵus diris ke kaj nun diras al vi tion,
vi probable neniam faros tion.
Kaj estas probable bona afero honeste, ĉar vi povus distrite
preterlasi stelo, iu kiel tio.
Ĝi estas probable plej bone eble deklari punteros sur individuaj linioj,
sed ĝi estas nur alia de tiuj ĝenaj sintakso
aferojn kun steloj kiuj faras punteros tiel malfacila labori kun.
Ĉar estas nur ĉi sintaksa salaton vi devas labori tra.
Kun praktiko jes vere fariĝis dua naturo.
Mi ankoraŭ faras erarojn kun ĝi ankoraŭ post programado dum 10 jaroj,
do ne esti agitita se io okazas al vi, estas sufiĉe komuna honeste.
Estas vere ia difekto de la sintakso.
>> OK tiel mi specon de promesitaj ke ni reviziti
la koncepto de kiel granda estas ĉeno.
Nu, se mi dirus al vi ke kordo, ni vere ia
kuŝis al vi la tutan tempon.
Mankas datumtipo nomata kordo, kaj fakte mi
menciis tion en unu el niaj fruaj videoj sur datumtipoj,
ke kordoj estis datumtipo ke estis kreita por vi en cs50.h.
Vi devas include Cs50.h por uzi ĝin.
>> Nu kordoj estas vere nur alias ion
vokis la char *, a montrilon al karaktero.
Nu punteros, revokon, estas nur alparolas.
Do kio estas la grandeco en bajtoj de kordo?
Nu ĝi estas kvar aŭ ok.
Kaj la kialo mi diras kvar aŭ ok estas ĉar reale
dependas de la sistemo, Se vi uzas CS50 ide, char * estas la grandeco de char
* Estas ok, estas 64-bita sistemo.
Ĉiu adreson en memoro estas 64 bitojn longa.
Se vi uzas CS50 aparaton aŭ uzante ajna 32-bita maŝino,
kaj ke vi aŭdis ke termino 32 bitoj maŝino, kio estas 32-bita maŝino?
Bone ĝi nur signifas ke ĉiu adreson en memoro estas 32 bitojn longa.
Kaj do 32 bitoj estas kvar bajtoj.
Do char * estas kvar aŭ ok bajtoj depende de via sistemo.
Kaj efektive neniu datumtipoj, kaj montrilo al ajna datumoj
tajpi, ĉar ĉiuj indikoj estas nur adresojn, estas kvar aŭ ok bajtoj.
Do ni reviziti ĉi diagramon kaj ni konkludi
tiu video kun iom ekzerco tie.
Do jen la diagramo ni finis per tuj en la komenco de la video.
Do kio okazas nun se mi diras * pk = 35?
Do kio faras ĝi signifi kiam mi diras, * pk = 35?
Prenu duan.
* pk.
En kunteksto tie, * estas dereference operatoro.
Do kiam la dereference operatoro estas uzata,
ni iru al la adreso indikis per pk, kaj ni ŝanĝas kion ni trovas.
Do * pk = 35 efike faras tion por la bildo.
Do estas esence sintakse identa al de dirinte k = 35.
>> Unu pli.
Se mi diras int m Mi kreos nova variablo nomas m.
Nova skatolo, ĝi estas verda skatolo ĉar ĝi tuj teni entjero,
kaj ĝin etikeditaj m.
Se mi diras m = 4, mi metis entjero en tiun skatolon.
Se diru pk = & m, kiel faras tiu diagramo ŝanĝo?
Pk = & m, do vi memoras, kion la & Operatoro faras aŭ nomiĝas?
Memoru ke & iu variablo nomo estas la adreso de variablo nomo.
Do kion ni diras estas pk akiras la adreson de m.
Kaj tiel efike kio okazas la diagramo estas ke pk plu punktoj
al k, sed punktoj al m.
>> Denove punteros estas tre malfacila labori kun
kaj ili prenas multajn praktiko, sed ĉar
de ilia kapableco permesi vin pasi datumojn inter funkcioj
kaj efektive havas tiujn Ŝanĝoj efektiviĝas,
akiranta vian kapon ĉirkaŭe estas vere grava.
Ĝi probable estas la plej komplikitaj temo ni diskutas en CS50,
sed la valoro kiun vi preni de uzante punteros
malproksime superpezas la komplikaĵoj kiuj venas de lernanta ilin.
Do mi deziras al vi la plej bonajn sorto lernanta pri punteros.
Mi Doug Lloyd, tiu estas CS50.