>> [Mūzikas atskaņošanai]
>> Doug LLOYD: Pointers, šeit mēs esam.
Tas ir iespējams, gatavojas būt visgrūtāk tēmu
ka mēs runājam par in CS50.
Un, ja jūs esat lasīt kaut kas par norādes
Pirms jūs varētu būt mazliet iebiedēt nonākšana šajā video.
Tā ir taisnība, ka norādes do ļauj jums iespēju
varbūt screw up diezgan slikti, ja esat
strādājot ar mainīgajiem, un datiem, un rada savu programmu crash.
Bet viņi tiešām ļoti noderīga un tie ļauj mums tiešām lielisks veids
nodot datus atpakaļ un atpakaļ starp funkcijām,
ka mēs esam citādi nevaram darīt.
>> Un tā, ko mēs patiešām gribu darīt, šeit ir vilciens
Jums ir labas rādītājs disciplīnu, tāpēc ka jūs varat efektīvi izmantot norādes
lai padarītu jūsu programmas, kas daudz labāk.
Kā jau teicu norādes dod mums atšķirīga veids, kā nodot datus starp funkcijām.
Tagad, ja jūs atceraties no agrāku video, kad
mēs runājām par mainīga joma, es teicu
ka visi dati, kas mums paiet funkcijas C tiek pieņemts pēc vērtības.
Un es, iespējams, nav izmantotas, ka termins, ko es gribēju tur
bija tas, ka mēs iet kopijas datiem.
Kad mēs caurlaide mainīgo līdz funkcijai mēs esam ne faktiski iet mainīgo
funkcijai, vai ne?
Mēs iet kopiju ka dati funkcijai.
Funkcija, ko tā būs un tā aprēķina dažas vērtības,
un varbūt mēs izmantojam šo vērtību kad tas dod to atpakaļ.
>> Tur bija izņēmums viens šis noteikums iet pēc vērtības,
un mēs būsim atpakaļ uz to, ka ir nedaudz vēlāk šajā video.
Ja mēs izmantojam norādes vietā izmantojot mainīgos lielumus,
vai vietā, izmantojot mainīgos lielumus paši vai kopijas mainīgo,
mēs tagad varam iet mainīgos apkārt starp funkcijām savādāk.
Tas nozīmē, ka, ja mēs izmaiņas vienu funkciju,
ka izmaiņas būs faktiski veikt ietekmēt citā funkciju.
Atkal, tas ir kaut kas mēs nevarētu darīt agrāk,
un, ja jūs esat kādreiz mēģinājis mijmaiņas vērtība divu mainīgo funkcija,
esat ievērojuši šo problēmu veida Ložņu augšu, vai ne?
>> Ja mēs gribam, lai mijmaiņas X un Y, un mēs nodot tos uz funkciju sauc swap,
iekšpusē funkciju mijmaiņas mainīgie darīt maiņas vērtības.
Viens kļūst divi, divi kļūst viens, bet mums nav reāli
mainīt neko oriģinālu funkcija, kas zvanītājam.
Tāpēc, ka mēs nevaram, mēs esam tikai strādā ar kopijas.
Ar norādes, lai gan, mēs varam faktiski iet X un Y, lai funkciju.
Šo funkciju var darīt kaut kas ar viņiem.
Un šie mainīgie lielumi faktiski var mainīties.
Tātad tas ir diezgan izmaiņas Mūsu spēja strādāt ar datiem.
>> Pirms mēs pikējošais norādes, es domāju, ka tas ir tā vērts
ņemot dažas minūtes, lai iet atpakaļ uz pamatus šeit.
Un ir apskatīt, kā datoru atmiņas darbi
jo šie divi priekšmeti gatavojas faktiski būt diezgan savstarpēji saistīti.
Kā jūs droši vien zināt, datorā sistēmas
Jums ir cieto disku vai varbūt cietvielu disks,
daži no failu glabāšanas vietu kārtošanas.
Tas parasti ir kaut kur apkārtnē 250 gigabaitiem
uz varbūt pāris terabaitiem tagad.
Un tas ir, ja visas jūsu failus galu galā dzīvo,
pat tad, kad dators ir izslēgts off, jūs varat pārvērst to atpakaļ
un jūs atradīsiet jūsu faili ir tur atkal, kad jūs atsāknēšana jūsu sistēmā.
Bet diskdziņi, piemēram, cietā diska, HDD, vai cietā stāvoklī vadīt, SSD,
ir tikai uzglabāšanas telpa.
>> Mēs nevaram reāli darīt kaut ko ar dati, kas ir cietā diska,
vai cietā stāvoklī vadīt.
Lai reāli mainīt dati vai pārvietot to apkārt,
mums ir, lai pārvietotu to uz RAM, brīvpiekļuves atmiņas.
Tagad RAM, jums ir daudz mazāk datorā.
Jums var būt kaut kur apkārtnē 512 megabaitu
ja jums ir vecāks dators, līdz varbūt divi, četri, astoņi, 16,
iespējams, pat nedaudz vairāk, gigabaitu RAM.
Tātad tas ir daudz mazāks, bet tas ir kur visi gaistošo datu eksistē.
Tas ir, ja mēs varam mainīt lietas.
Bet, kad mēs savukārt mūsu datoru off, visi dati RAM ir iznīcināta.
>> Tātad, tāpēc mums ir cietā diska par vairāk pastāvīgā atrašanās vieta no tā,
lai tā exists- tas būtu būt patiesi slikti, ja katru reizi, kad mēs
Izrādījās mūsu datoru off, ik failu mūsu sistēmā tika iznīcinātas.
Tāpēc mēs strādājam iekšā RAM.
Un katru reizi, kad mēs runājam par atmiņa, diezgan daudz, jo CS50,
mēs runājam par RAM, nevis cietā diska.
>> Tātad, kad mēs pārvietot lietas atmiņā, tas aizņem zināmu daudzumu telpā.
Visi datu tipu, kas mēs esam strādājuši ar
aizņem atšķirīgs summas telpas RAM.
Tātad, katru reizi, kad jūs izveidot vesels skaitlis mainīgs, četri baiti atmiņas
ir atcelt RAM, lai jūs var strādāt ar šo skaitlim.
Jūs varat atzīt skaitlim, mainīt to, piešķirt to
līdz vērtībai 10 palielina ar vienu, tā tālāk un tā tālāk.
Viss, kas nepieciešams, lai notiktu RAM, un jūs saņemsiet četras baiti
strādāt ar katru skaitlis, ka jūs izveidojat.
>> Katram varonim jums izveidot saņem vienu baitu.
Tas ir tikai, cik daudz vietas ir nepieciešams, lai saglabātu raksturs.
Katru peldēt, īsta numurs, saņem četri baiti
ja vien tas ir dubultā precizitātes peldošā komata
numurs, kas ļauj būt precīzākiem vai ciparus
aiz komata nezaudējot precizitāti,
kas aizņem astoņas baiti atmiņas.
Garas ilgojas, tiešām liels veseli skaitļi, arī aizņem astoņas baiti atmiņas.
Cik daudz atmiņas baiti do stīgas aizņem?
Nu pieņemsim likts pin šajā jautājumā tagad, bet mēs atgriezīsimies pie tā.
>> Tātad atpakaļ uz šo ideju atmiņas kā liels masīvs baitu izmēra šūnās.
Tas ir tiešām viss, kas ir, tas ir tikai milzīgs masīvs šūnām,
tāpat kā jebkuru citu masīvs, ka Jūs esat iepazinušies ar un redzēt,
izņemot katram elementam ir viens baits plata.
Un tāpat kā masīva, katrs elements ir piegādes adrese.
Katrs masīva elements ir indekss, un mēs
var izmantot šo indeksu darīt tā saukto brīvpiekļuves uz masīvu.
Mums nav jāsāk at sākums masīva,
atkārtot, izmantojot katru vienots elements punktu,
atrast to, ko mēs meklējam.
Mēs varam tikai teikt, es gribu, lai nokļūtu 15. elements vai 100. elements.
Un jūs varat vienkārši iet šo numuru un iegūt vērtību, jūs meklējat.
>> Tāpat ik vieta atmiņā ir adrese.
Tātad jūsu atmiņa varētu izskatīties kaut kas līdzīgs šim.
Lūk ļoti mazs rieciens atmiņa, tas ir 20 baiti atmiņas.
Pirmie 20 baiti, jo mans adreses tur apakšā
ir 0, 1, 2, 3, un tā par visu ceļu līdz 19.
Un, kad es deklarēt mainīgos un kad es sāku strādāt ar viņiem,
sistēma, kas notiek, lai uzstādītu malā dažas vietas par mani
Šajā atmiņu strādāt ar manu mainīgajiem.
Tāpēc es varētu teikt, char c vienāds kapitāls H. Un kas notiek varētu notikt?
Nu sistēma ir gatavojas rezervēti man vienu baitu.
Šajā gadījumā tā izvēlējās baitu skaits četri, baitu pēc adreses četri,
un tas notiek, lai saglabātu burts kapitāls H tur par mani.
Ja es tad saka int ātrumu limits vienāds 65, tas ir
gatavojas atcelt četras baiti atmiņas par mani.
Un tas notiek, lai ārstētu tos, četri baiti par vienu vienību
jo tas, ko mēs strādājam ar ir vesels skaitlis šeit.
Un tas notiek, lai saglabātu 65 tur.
>> Tagad jau es esmu veida stāsta jums mazliet meliem,
labi, jo mēs zinām, ka datori strādā bināro.
Viņi nesaprot vienmēr kāds kapitāls H ir
vai kāds 65 ir, viņi tikai izprast binārā, nullēm un uzņēmumiem.
Un tā faktiski ko mēs esam uzglabātu tur
nav burts H un skaitu 65, bet gan bināro pārstāvniecības
apakšpunktu, kas izskatās mazliet kaut kas līdzīgs šim.
Un jo īpaši, konteksts skaitlim mainīgo,
tas nav gatavojas tikai spļaut to, tas nav gatavojas, lai ārstētu to kā vienu četrām
baitu rieciens obligāti, tas tiešām notiek
lai ārstētu to kā četri viena baitu gabalos, kas varētu izskatīties kaut kas līdzīgs šim.
Un pat tas nav pilnīgi taisnība, vai nu,
jo kaut ko sauc endianness, kas mēs neesam
gatavojas nokļūt tagad, bet Ja jūs esat ieinteresēti par,
Jūs varat izlasīt pat par maz un liels endianness.
Bet labad šo argumentu, labad šo video,
pieņemsim tikai pieņemt, tas ir, Fakts, cik skaits 65 būtu
ir pārstāvētas Atmiņas par katru sistēmu,
lai gan tas nav pilnīgi taisnība.
>> Bet pieņemsim faktiski tikai iegūt atbrīvoties no visiem bināro pilnīgi,
un tikai domā par kā H un 65, tas ir daudz vieglāk
domāt par to kā ka kā cilvēks.
Visas tiesības, tāpēc tas arī šķiet, varbūt maz izlases ka I've- mana sistēma
nedeva man baitu 5, 6, 7, un 8, lai uzglabātu ir vesels skaitlis.
Tur ir iemesls tam, pārāk, kas mums nebūs iekļuvuši tieši tagad, bet pietiek
tā teikt, ka tas, ko dators dara šeit
iespējams, ir labs solis no savas puses.
Lai nedod man atmiņu, kas ir obligāti atpakaļ atpakaļ.
Lai gan tas ir gatavojas darīt to tagad ja es vēlos saņemt vēl virkni,
sauc uzvārdu, un es gribu likt Lloyd tur.
Es esmu gatavojas nepieciešams uzstādīt vienu raksturs, katrs no šī vēstule ir
gatavojas pieprasīt vienu raksturs, viens baits atmiņas.
Tātad, ja es varētu likt Lloyd manā masīvs kā šis es esmu diezgan labi iet, vai ne?
Kas ir pazudis?
>> Atcerieties, ka katrs string mēs strādājam ar in C beidzas ar slīpsvītru nulles,
un mēs nevaram izlaist, ka šeit, vai nu.
Mums ir nepieciešams atcelt vienu baitu atmiņas turēt, ka, lai mēs
zināt, kad mūsu string ir beigusies.
Tātad atkal šī vienošanās par to, kā lietas
parādās atmiņas varenību būt mazliet izlases,
bet tas patiesībā ir, kā lielākā daļa sistēmas ir paredzētas.
Līnija tos uz sastāvēt četri, dēļ atkal
ka mums nav nepieciešams nokļūt tieši tagad.
Bet tas, tāpēc pietiek pateikt, ka Pēc šiem trim koda rindiņas,
tas ir tas, ko atmiņa varētu izskatīties.
Ja man vajag atmiņas vietas 4, 8, 12 un, lai noturētu savus datus,
tas ir tas, ko mana atmiņa varētu izskatīties.
>> Un tikai būt īpaši pedantiska šeit, kad
mēs runājam par atmiņu adreses Mēs parasti
darīt, izmantojot heksadecimālo apzīmējumus.
Tātad, kāpēc nav mēs pārvērst visi šie no komata uz heksadecimālo notācija
tikai tāpēc, ka tas ir vispār kā mēs atsaucamies uz atmiņu.
Tā vietā ir no 0 līdz 19, kas mums ir, ir nulle
x nulle caur nulles x1 trīs.
Tie ir 20 baiti atmiņas, ka mēs ir vai mēs esam apskatot šo attēlu
tieši te.
>> Tātad visi, kas to teica, pieņemsim solis prom no atmiņas uz otru
un atpakaļ uz norādes.
Šeit ir svarīgākais lieta atcerēties
kā mēs sākam strādāt ar norādes.
Rādītājs nav nekas vairāk nekā adresi.
Es saku vēlreiz, jo tas ir tik svarīgi,
rādītājs nav nekas vairāk nekā adresi.
Norādes ir adreses uz vietām atmiņā kur mainīgie dzīvo.
Zinot, ka tas kļūst cerams mazliet vieglāk strādāt ar viņiem.
Vēl viena lieta, ko es gribētu to darīt, ir, lai būtu sava veida
diagrammu vizuāli pārstāv to, kas ir notiek ar dažādiem koda rindiņas.
Un mēs to izdarītu pāris reizes pēc norādes,
un tad, kad mēs runājam par dinamisku atmiņas sadali, kā arī.
Tā kā es domāju, ka šie diagrammas var būt īpaši noderīga.
>> Tātad, ja es saku, piemēram, int k manā kodu, kas notiek?
Nu to, kas būtībā notiek, ir Es saņemu atmiņu atmatā par mani,
bet man nav pat patīk domāju par to, piemēram, ka, es
patīk domāt par to, kā kaste.
Man ir kastē, un tas ir zaļā krāsā, jo I
var likt veselus skaitļus zaļajās kastēs.
Ja tas bija raksturs I varētu būt Blue Box.
Bet es vienmēr saku, ja es esmu radot kastē, kas var būt veseli skaitļi
ka kaste ir zaļā krāsā.
Un es pastāvīgu marķieri un es rakstu k par pusi no tā.
Tāpēc man ir kaste sauc k, kurā es varētu likt veseli skaitļi.
Tātad, kad es saku int k, kas ir kas notiek manā galvā.
Ja es saku k vienāds pieci, ko es daru?
Nu, es esmu liekot piecus lodziņā, pa labi.
Tas ir diezgan vienkārši, ja Es saku int k, izveidot kasti sauc k.
Ja es saku k ir vienāds ar 5, nodot piecas lodziņā.
Cerams, ka tas nav pārāk daudz lēciens.
Lūk, kur lietas iet maz interesanti gan.
Ja es saku int * pk, arī tad, ja man nav zināt, ko tas vienmēr nozīmē,
Tas ir skaidri ieguvuši kaut ko darīt ar veselam skaitlim.
Tāpēc es esmu gatavojas krāsu šī kaste zaļa-ish,
Es zinu, tas ir got kaut darīt ar veselam skaitlim,
bet tas nav vesels skaitlis pati, jo tas ir int zvaigzne.
Tur ir kaut nedaudz atšķirīgs par to.
Tātad vesels skaitlis ir iesaistīts, bet citādi tas ir
ne pārāk atšķiras no ko mēs runājam.
Tas ir kaste, tā ieguva etiķeti, tā mugurā etiķete PK,
un tas spēj noturēt int zvaigznes, kāds tiem ir.
Viņiem ir kaut ko darīt ar veseliem skaitļiem, ir skaidri.
Lūk pēdējā rindā, lai gan.
Ja es saku pk = & k, paga, kas tikko notika, vai ne?
Tātad šis izlases numuru, šķietami nejauši numurs, tiek iemesta kastē tur.
Viss, kas ir, ir PK izpaužas adresi k.
Tāpēc es esmu uzlīmēšanu kur k dzīvo atmiņu, tā adrese, adrese tās baitu.
Viss, ko es daru, ir es saku šī vērtība ir tas, ko es esmu gatavojas
likt iekšā manā kastē, ko sauc pk.
Un tāpēc, ka šīs lietas ir norādes, un tāpēc meklē
pie virknes, piemēram, nulles x astoņi nulle c septiņi četri astoņi
divi nulle ir iespējams nav ļoti nozīmīgs.
Kad mēs vispār iztēloties norādes, mēs faktiski darīt kā norādes.
Pk dod mums informāciju mums ir nepieciešams, lai atrastu k atmiņā.
Tātad būtībā pk ir bultiņa tajā.
Un, ja mēs staigājam garumu Šīs bultas, iedomājieties
tas ir kaut kas jūs varat iet tālāk, ja mēs pastaigāties gar bultiņas,
pašā galā šīs bultiņas, mēs atradīs vietu atmiņā
kur k dzīvo.
Un tas ir patiešām svarīgi jo, kad mēs zinām, kur k dzīvo,
mēs varam sākt strādāt ar datiem iekšā šajā atmiņas vietā.
Lai gan mēs esam nonākuši maziņš mazliet priekšā sevi tagad.
>> Tātad, kas ir rādītājs?
Rādītājs ir datu postenis, kura vērtība ir atmiņas adrese.
Tas bija tas, ka nullei x astoņi nulle sīkumi notiek, ka bija atmiņas adrese.
Tas bija vieta atmiņā.
Un rādītāju veids apraksta veidu
Datu jūs atradīsiet pie ka atmiņas adrese.
Tātad tur ir int zvaigzne daļa taisnība.
Ja man sekot ka bulta, tas ir gatavojas novest mani uz vietu.
Un šajā vietā, ko es atradīs tur manā piemērā,
ir zaļā krāsā kaste.
Tas ir vesels skaitlis, tas ko es atradīs, ja es eju uz šo adresi.
Datu tipam rādītājs apraksta, ko
Jūs atradīsiet šajā atmiņas adresi.
Tātad, šeit ir patiešām atdzist lieta though.
Norādes ļauj mums nodot mainīgie starp funkcijām.
Un faktiski iet mainīgie un nevis iet kopijas.
Jo, ja mēs zinām, kur tieši atmiņā atrast mainīgo,
mums nav nepieciešams veikt kopiju tā, mēs varam vienkārši doties uz šo vietu
un strādāt ar šo mainīgo.
Tātad būtībā norādes kārtošanas no padarīt datorvidi
daudz vairāk kā reālajā pasaulē, labi.
>> Tātad, šeit ir analoģija.
Pieņemsim, ka man ir notebook, tiesības, un tas ir pilns ar piezīmēm.
Un es gribētu, lai jūs to atjaunināt.
Jums ir funkcija, kas atjauninājumus piezīmes, pa labi.
Jo, kā mēs esam bijuši Līdz šim darba, ko
notiek, ir jums prasīs manu notebook, jums iet uz veikalu kopiju,
jūs veicat Xerox kopiju katra lapa notebook.
Jūs atstāt manu notebook atpakaļ uz mana galda, kad esat pabeidzis,
jums iet un izsvītrot lietas manā notebook kas ir novecojuši vai nepareizi,
un tad jums iet atpakaļ uz man kaudze Xerox lapām
kas ir reprodukcija no mana notebook ar izmaiņas, kas jūs esat, kas izgatavoti uz to.
Un tajā brīdī, tas ir atkarīgs no manis, jo izsaucēja funkcijas, kā zvanītājam,
izlemt veikt savas piezīmes un integrēt tos atpakaļ manā notebook.
Tātad tur ir daudz soļiem iesaistīti šeit, pa labi.
Tāpat tas nebūtu labāk ja es tikai saku, hey, vai varat
mainīšu notebook man, rokas jums manu notebook,
un jūs ņemt lietas un burtiski šķērsot tos
un atjaunināt savas piezīmes manā notebook.
Un tad dod man manu notebook atpakaļ.
Tas ir sava veida, ko norādes ļauj mums darīt,
tie padara šo vidi daudz vairāk patīk, kā mēs darbojamies realitātē.
>> Viss tā ka taisnība ir kas rādītājs ir, parunāsim
par to, kā norādes strādā C, un Kā mēs varam sākt strādāt ar viņiem.
Tātad tur ir ļoti vienkāršs rādītājs C sauc null rādītāju.
Nulles rādītājs norāda uz neko.
Tas, iespējams, šķiet, tāpat kā tas ir faktiski nav ļoti noderīga lieta,
bet kā mēs redzam nedaudz vēlāk, tas,
ka šis null rādītājs eksistē patiesībā tiešām var būt parocīgs.
Un, kad jūs izveidot rādītāju, un jums nav noteikt tā vērtību immediately-
piemērs, kurā tā vērtība uzreiz
būs pāris slaidus atpakaļ kur es teicu pk vienāds & K,
pk izpaužas k adresi, kā mēs redzēsim, ko tas nozīmē,
mēs redzēsim, kā ar kodu, kas shortly- ja mums nav noteikt tā vērtību uz kaut
jēgpilna nekavējoties, Jums vajadzētu vienmēr
iestatīt rādītāju, lai norādītu uz null.
Jums vajadzētu iestatīt tā, lai norādītu uz neko.
>> Tas ir ļoti atšķirīgi, nekā vienkārši atstājot vērtību, kā tas ir
un pēc tam atzīst par rādītāju un tikai pieņemot
tas ir spēkā, jo tas ir reti taisnība.
Tātad jums vajadzētu vienmēr iestatīt vērtība rādītāju
null, ja jums nav noteikt tā vērtību lai kaut ko nozīmīgu nekavējoties.
Jūs varat pārbaudīt, vai rādītāju vērtības ir spēkā, izmantojot līdztiesības operatoru
(==), Tāpat kā jūs salīdzināt jebkurš vesels skaitlis vērtības vai rakstzīmju vērtības, (==)
arī.
Tā ir īpaša veida konstante vērtība, ko varat izmantot, lai pārbaudītu.
Tā, ka bija ļoti vienkāršs rādītājs, tad null rādītājs.
Vēl viens veids, kā izveidot rādītājs ir iegūt
adrese ir mainīgs jūs jau esat izveidojis,
un jūs to izdarītu, izmantojot & operators adrese ieguve.
Ko mēs jau esam redzējuši iepriekš Pirmajā diagramma piemēru es parādīja.
Tātad, ja x ir mainīgais, kas mēs esam jau izveidots tipa skaitlim,
tad & x kalpo par norādi uz veselam skaitlim.
un x ir-atceros, un gatavojas iegūt adrese lieta pa labi.
Un tā rādītājs ir tikai adrese, nekā & x kalpo par norādi uz veselam skaitlim
kuru vērtība ir, ja atmiņas x dzīvē.
Tas ir X adresi.
Tātad, un x ir adrese x.
Paņemsim šo vienu soli tālāk un izveidot savienojumu ar kaut ko
Man norādīja uz iepriekšēju video.
Ja arr ir masīvs dubultspēlē, tad & arr kvadrātiekava i ir rādītājs
lai dubultā.
LABI.
Arr kvadrātiekava i, ja arr ir masīvs dubultspēlē,
tad Arr kvadrātiekava i ir i-th elements šī masīva,
un & Arr kvadrātiekava i ir kur atmiņas i-th elements ARR pastāv.
>> Tātad, kāda ir saistība šeit?
Bloki vārds, kas nozīmē Šī visa lieta,
ir tā, ka masīva vārds ir faktiski pats rādītājs.
Jūs esat strādājuši ar norādes visi kopā
katru reizi, kad jūs esat izmantojis masīvu.
Atcerieties, no piemēra uz mainīgo jomu,
pie beigām video es iesniedzu piemērs, kur mums ir funkcija
sauc komplekts int un funkcija sauc komplekts masīvs.
Un jūsu uzdevums, lai noteiktu vai nav, vai kāda
vērtības, kuras mēs izdrukā beigām, funkciju,
beigās galvenās programmas.
>> Ja jūs atceraties no šo piemēru vai, ja jūs esat noskatījos video,
jūs zināt, ka tad, kad you- aicinājumu komplekts int efektīvi neko nedara.
Bet aicinājums noteikt masīvs dara.
Un es veida noklusēti kāpēc ka tas bija tajā laikā.
Es tikai teicu, labi tas ir masīvs, tas ir īpašs, jūs zināt, tur ir iemesls.
Iemesls ir tas, ka masīvs ir vārds patiešām ir tikai rādītājs,
un tur ir šis īpašais kvadrātiekava sintakse ka
padarīt lietas daudz nicer strādāt.
Un viņi dara ideju par rādītāju daudz mazāk biedējoša,
un tas ir iemesls, kāpēc viņi veida no uzrāda šādā veidā.
Bet tiešām masīvi ir tikai norādes.
Un tāpēc, kad mēs veicis izmaiņas masīva,
kad mēs nodots masīvu kā parametru līdz funkcijai vai kā arguments
līdz funkcijai saturs masīva faktiski mainīja gan callee
un zvanītāju.
Kas par katru cita veida mainīgais mēs redzējām nebija gadījums.
Tātad tas ir tikai kaut kas jāpatur prātā, kad jūs strādājat ar norādes,
ir tas, ka nosaukumam masīvs faktiski rādītājs
uz minētā masīva pirmā elementa.
>> Labi, tāpēc tagad mums ir visi šie fakti, pieņemsim glabāt notiek, vai ne.
Kāpēc mums rūp ja kaut kas dzīvo.
Nu kā jau teicu, tas ir diezgan noderīgi zināt, kur kaut kas dzīvo
lai jūs varētu iet uz turieni un mainīt to.
Strādāt ar to un faktiski ir lieta, kas jums
vēlaties darīt, lai šo mainīgo stātos spēkā, un nav spēkā uz kādu tā kopiju.
To sauc dereferencing.
Mēs ejam uz atskaites un mēs mainītu vērtību tur.
Tātad, ja mums ir rādītāju un to sauc pc, un tas norāda uz raksturu,
tad mēs varam teikt * pc un * pc ir vārds, ko mēs atrast, ja mēs ejam
uz adresi pc.
Ko mēs atradīsim tur ir raksturs un * pc ir, kā mēs atsaucamies uz datiem, kas
location.
Tātad mēs varētu teikt kaut ko līdzīgu * pc = D vai kaut kas tamlīdzīgs,
un tas nozīmē, ka neatkarīgi no bija atmiņas adrese pc,
kāds raksturs bija agrāk tur, tagad ir D, ja mēs sakām * PC = D.
>> Tātad, šeit mēs aiziet vēlreiz ar daži dīvaini C sīkumi, labi.
Tāpēc mēs esam redzējuši * agrāk kā kaut kā daļa no datu tipa,
un tagad tas tiek izmantots nedaudz citā kontekstā
lai piekļūtu datiem par atrašanās vietu.
Es zinu, tas ir mazliet mulsinoši un tas faktiski ir daļa no šī visa
piemēram, kāpēc rādītāji ir šī mitoloģija ap tiem kā tik sarežģīta,
ir sava veida sintakses problēmas, godīgi.
Bet * izmanto gan kontekstā, gan kā daļu no tipa fragmentu,
un mēs redzēsim nedaudz vēlāk kaut kas cits, too.
Un tieši tagad ir dereference operators.
Tā tas notiek ar atsauci, tas piekļūst datiem
atrašanās vietā rādītāja, un ļauj manipulēt ar to būs.
>> Tagad tas ir ļoti līdzīgs apmeklējot savu tuvāko, pa labi.
Ja jūs zināt, kādas ir jūsu kaimiņš dzīvo, tu esi
nav piekārtiem ar savu kaimiņu.
Jūs zināt, jums gadās zina, kur viņi dzīvo,
bet tas nenozīmē, ka, tikums, kam šīs zināšanas
Jums ir saskarsme ar tiem.
Ja vēlaties sadarboties ar viņiem, Jums ir jādodas uz savu māju,
Jums jādodas uz to, kur viņi dzīvo.
Un, kad jūs to izdarītu, tad jūs varat sazināties
ar viņiem tāpat kā jūs vēlaties.
Un līdzīgi ar mainīgajiem, Jums jādodas uz to adresi
ja jūs vēlaties, lai mijiedarbotos tos, Jūs varat ne tikai zināt adresi.
Un kā jums iet uz adresi, ir izmantot * The dereference operatoru.
Ko jūs domājat notiek ja mēs mēģinātu dereference
rādītājs, kura vērtība ir nulle?
Atgādināt, ka null rādītājs norāda uz neko.
Tātad, ja jūs mēģināt un dereference nekas vai dodieties uz adresi neko,
ko jūs domājat notiek?
Nu, ja jūs uzminējāt segmentācija vaina, tu būsi labi.
Ja jūs mēģināt un dereference Null rādītājs,
jūs cieš segmentāciju vaina. Bet pagaidiet,
nebija es jums saku, ka Ja jūs neesat gatavojas
noteikt savu vērtību jūsu rādītāju uz kaut ko nozīmīgu,
Jums vajadzētu noteikt null?
I did, un faktiski segmentācija vaina ir sava veida labu uzvedību.
>> Vai jūs kādreiz esat pasludinājis mainīgo un ne uzreiz piešķir savu vērtību?
Tātad jūs vienkārši pateikt int x; jums nav faktiski piešķirt to neko
un tad vēlāk savu kodu, jūs izdrukāt vērtību x,
kam vēl nav piešķirts to neko.
Bieži jūs saņemsiet nulle, bet reizēm jūs
varētu dabūt izlases numuru, un Jums nav ne jausmas, no kurienes tas nācis.
Līdzīgi var lietas notikt ar norādes.
Kad jūs atzīt rādītāju int * pk piemēram,
un jums nav piešķirtu to vērtību, jums četri baiti atmiņas.
Neatkarīgi četri baiti atmiņa sistēma var
konstatē, ka ir zināma nozīmīgu vērtību.
Un tur varēja būt kaut kas jau tur, ka
vairs nav vajadzīgs vēl viens funkcija, tāpēc jums vienkārši ir
kāds dati bija tur.
>> Ko darīt, ja esat mēģinājis darīt dereference daži adrese ka tu don't- tur bija
jau baiti un informācija tur, ka tagad jūsu rādītājs.
Ja jūs mēģināt un dereference šo rādītāju, Jums varētu būt messing ar kādu atmiņu
ka jūs nevēlējāties sajaukt ar to visu.
Un patiesībā jūs varētu darīt kaut kas tiešām postoša,
tāpat pauze citu programmu, vai salauzt citu funkciju,
vai kaut ļaunprātīgu kas darīt Jūs nevēlējāties darīt vispār.
Un tā, ka tāpēc tā ir tiešām laba ideja
iestatīt norādes uz null, ja jums nav noteikti viņiem kaut ko jēgpilnu.
Tas ir iespējams, labāk pie dienas beigās jūsu programmai
crash tad tas jādara Kaut kas, kas skrūves augšu
cita programma vai cita funkcija.
Tas uzvedība ir iespējams, pat mazāk nekā ideāls tikai crashing.
Un tā, ka tāpēc tā ir tiešām labs ieradums
iekļūt noteikt jūsu norādes null, ja jums nav noteikt tos
uz jēgpilnu vērtību nekavējoties, vērtība, ka jūs zināt,
un ka jūs varat droši dereference.
>> Tātad pieņemsim nāk atpakaļ tagad, un to apskatīt pie kopējā sintaksi situācijas.
Ja es saku int * p ;, ko es esmu tikko darījis?
Ko es esmu darījis, ir šis.
Es zinu vērtība p ir adrese jo visas norādes ir tikai
adreses.
Es varu dereference p Izmantojot * operatoru.
Šajā kontekstā šeit, pašā tops atgādināt * ir daļa no tipa.
Int * ir datu tips.
Bet es varu dereference p izmantojot * operatoru,
un, ja es to daru, ja es eju uz šo adresi, ko es atrast šajā adresē?
Es atradīs skaitli.
Tātad int * p būtībā sakot, p ir adrese.
Es varu dereference p un ja Es daru, es atrast skaitli
šajā atmiņas vietā.
>> Labi, tāpēc es teicu, ka bija vēl viens kaitinošas lieta ar zvaigznēm
un lūk, kur tas kaitinošas lieta ar zvaigznēm ir.
Vai jūs kādreiz esat mēģinājuši deklarēt vairākas mainīgie viena un tā paša tipa
uz vienas līnijas ar kodu?
Tātad uz otru, izlikties, ka līnija, kods Man tiešām ir tur zaļš
nav tur un tas tikai norāda int x, y, z ;.
Ko tas varētu darīt, ir faktiski izveidot Trīs vesels mainīgie jums,
vienu sauc x, viens sauc y, un viens sauc par z.
Tas ir veids, kā to izdarīt bez ņemot sadalīt uz trim līnijām.
>> Lūk, kur zvaigznes nokļūt kaitinošas atkal, lai gan,
jo * ir faktiski daļa Gan tipa nosaukums un daļa
no mainīgā nosaukums.
Un tāpēc, ja es saku int * px, py, PZ, ko es faktiski saņemt ir rādītājs līdz veselam skaitlim
sauc px un divi veseli skaitļi, py un pz.
Un tas ir iespējams, nav ko mēs gribam, ka tas nav labi.
>> Tātad, ja es gribu, lai izveidotu vairākus norādes uz vienas līnijas, un tā paša tipa,
un zvaigznes, ko es tiešām ir nepieciešams to darīt, ir teikt int * gadā, * pb, * gab.
Tagad to tikko teica, ka un tagad stāsta jums šo,
jūs, iespējams, nekad to izdarītu.
Un tas ir iespējams, ir laba lieta godīgi, tāpēc, ka jūs varētu nejauši
izlaist zvaigzne, kaut kas tamlīdzīgs.
Tas ir iespējams, vislabāk varbūt deklarēt norādes uz atsevišķām pozīcijām,
bet tas ir tikai vēl viens no tiem, kaitinošas sintakse
lietas ar zvaigznēm, kas padara norādes tik grūti strādāt.
Jo tas ir tikai tas sintaktisko haoss jums ir jāstrādā ar.
Ar praksē tas patiešām kļūst par otro dabu.
Es joprojām kļūdīties ar to vēl pēc plānošanu 10 gadus,
tāpēc nebēdā, ja kaut kas notiek jums, tas ir diezgan izplatīta godīgi.
Tas ir tiešām sava veida plaisāt no sintaksi.
>> Labi, tāpēc es veida apsolīju ka mēs varētu pārskatīt
jēdziens, cik liels ir virkne.
Nu, ja es tev teicu, ka string, mēs esam patiesi veida
ir atrodas uz jums visu laiku.
Nav datu tipu sauc virkne, un faktiski es
minēts šis vienā no mūsu Agrākais video par datu tipiem,
ka string bija datu tips, kas tika izveidots, lai jums CS50.h.
Jums ir # Ietvert CS50.h, lai izmantotu to.
>> Nu string ir patiešām vienkārši alias kaut ko
sauc char * A rādītāju uz raksturu.
Nu norādes, atgādināt, ir tikai adreses.
Tātad, kas ir lielums no virknes baitu?
Nu tas ir četras vai astoņas.
Un iemesls, kāpēc es saku četras vai astoņi ir tāpēc, ka tā faktiski ir
ir atkarīgs no sistēmas, ja jūs izmantojat CS50 ide, char * ir lielums char
* Ir astoņi, tas ir 64 bitu sistēma.
Katru adrese atmiņā ir 64 bitus garš.
Ja jūs izmantojat CS50 ierīces vai izmantojot jebkuru 32 bitu mašīna,
un jūs esat dzirdējuši šo terminu 32 bitu mašīna, kas ir 32 bitu mašīna?
Nu tas tikai nozīmē, ka katrs adrese atmiņā ir 32 bitus garš.
Un tā 32 biti ir četri baiti.
Tātad char * ir četras vai astoņas baiti atkarībā no jūsu sistēmā.
Un tiešām jebkādus datu tipi, un rādītājs uz jebkuru datiem
rakstīt, jo visas norādes ir tikai adreses, ir četras vai astoņas baiti.
Tātad pieņemsim pārskatīt šo shēma un pieņemsim noslēgt
Šis video ar nelielu izmantošanu šeit.
Tātad, šeit ir diagramma mēs left off ar pašā sākumā no video.
Tātad, kas notiek tagad, ja es saku * PK = 35?
Tātad, ko tas nozīmē, kad es saku, * pk = 35?
Veikt sekundi.
* pk.
Šajā kontekstā šeit, * ir dereference operators.
Tātad, kad dereference operators tiek izmantots,
mēs ejam uz adresi norādīja uz PK, un mēs mainīt to, ko mēs redzam.
Tātad * pk = 35 efektīvi vai tas uz attēla.
Tātad, tas ir būtībā sintaktiski identisks sacījis k = 35.
>> Vēl vienu.
Ja es saku int m, es izveidot jauns mainīgais sauc m.
Jauna kaste, tā ir zaļa kaste, jo tas gatavojas rīkot vesels skaitlis,
un tas ir marķēti m.
Ja es saku m = 4, es ielieciet skaitlis vērā, ka kastē.
Ja teiksim pk = & m, kā tas šis diagramma pārmaiņas?
Pk = & m, vai jūs atceraties to, ko & Operators dara vai sauc?
Atcerieties, ka & kādu mainīgā nosaukums ir adrese mainīgā nosaukuma.
Tātad, ko mēs esam sakot, ir pk izpaužas adresi m.
Un tik efektīvi, kas notiek diagramma ir tas, ka pk vairs punktus
k, taču norāda uz m.
>> Atkal norādes ir ļoti grūts strādāt ar
un tās veic daudz prakse, bet gan tāpēc, ka
par to spēju, lai ļautu jums nodot datus starp funkcijām
un patiesībā ir tie, izmaiņas stājas spēkā,
iegūt savu galvu apkārt ir ļoti svarīgi.
Tas, iespējams, ir vissarežģītākais temats mēs apspriest CS50,
bet vērtība, kas tevi nokļūt izmantot norādes
tālu pārsniedz komplikācijas kas nāk no mācīšanās viņiem.
Tāpēc es vēlos jums labāko luck iepazīstot norādes.
Es esmu Doug Lloyd, tas ir CS50.