>> [MUSIC PLAYING]
>> DOUG LLOYD: Pointers, burada biz.
Bu yəqin ki, gedir ən çətin mövzusu
biz CS50 haqqında danışmaq ki.
Və oxumaq sonra əgər göstəricilər haqqında bir şey
bir az ola bilər əvvəl qorxuducu Bu video gedən.
Bu göstəricilər doğru siz imkanı verir yoxdur
bəlkə qıymaq olduqca pis siz olduğunuzda
dəyişənlərin və məlumat ilə iş, və proqram qəza səbəb.
Lakin onlar, həqiqətən, həqiqətən faydalı istəyirik və onlar bizə həqiqətən böyük yol verir
geri məlumat keçmək və irəli funksiyaları arasında,
ki, biz başqa bunu etmək iqtidarında deyilik.
>> Və belə ki, biz, həqiqətən, qatar burada etmək istəyirəm
Siz yaxşı göstərici nizam-intizam var, belə ki, Siz səmərəli göstəricilərinə istifadə edə bilərsiniz ki,
Sizin proqramları daha yaxşı etmək.
Dediyim kimi göstəricilər bizə müxtəlif vermək yol funksiyaları arasında data keçmək.
İndi geri əgər bir əvvəlki video, zaman
biz söhbət dəyişən daxilində, mən qeyd
ki, biz arasında keçir ki, bütün data C funksiyaları dəyəri tərəfindən qəbul edilir.
Mən ki, istifadə ola bilər müddətli Mən demək nə
biz məlumatların surətlərini keçən idi.
Biz bir funksiyası dəyişən keçmək zaman, biz, həqiqətən, dəyişən keçən deyilik
funksiyası, sağ?
Biz surəti keçən edirik funksiyası ki, məlumat.
funksiyası nə edər və bəzi dəyəri hesablayır,
və bəlkə ki, dəyəri istifadə onu geri verir.
>> Bir istisna var idi dəyəri keçən bu qayda,
və biz nə üçün geri gəlmək lazımdır Bu video sonra bir az.
Biz əvəzinə göstəricilərinə istifadə əgər dəyişənlər istifadə,
və ya dəyişənlər istifadə əvəzinə özləri və ya dəyişənlərin surətləri,
biz indi ətrafında dəyişənlərin keçə bilər fərqli bir şəkildə funksiyaları arasında.
Bu etmək əgər o deməkdir ki, bir funksiyası bir dəyişiklik,
ki, dəyişiklik həqiqətən olacaq fərqli bir funksiyası təsir.
Yenə də, bu bir şeydir ki, Biz əvvəllər edə bilmədim
və heç dəyişdirmək üçün cəhd varsa funksiyası iki dəyişənlərin dəyəri,
Bu problem fark etdik qədər sürünən sort, sağ?
>> Biz X və Y və biz dəyişdirmək istəyirsinizsə svop adlı funksiyası onları keçmək
funksiyası daxilində dəyişdirmək dəyişənlər mübadiləsi dəyərlər yoxdur.
Bir iki olur, iki olur bir, lakin biz, həqiqətən, yoxdur
orijinal bir şey dəyişdirmək funksiyası zəng edir.
Çünki biz bilməz, biz etdiyiniz yalnız Onların nüsxə ilə işləyir.
Baxmayaraq ki göstəricilər ilə, biz əslində bir funksiyası X və Y keçir.
Ki, funksiyası edə bilərsiniz onlarla bir şey.
Və bu dəyişənlər dəyərlər həqiqətən dəyişə bilərsiniz.
Belə ki, kifayət qədər bir dəyişiklik var data ilə işləmək üçün qabiliyyəti.
>> Biz daxil dalış əvvəl göstəricilər, mən bu dəyər hesab edirəm
bir neçə dəqiqə alaraq burada geri əsasları gedin.
Və necə bir göz var kompüter yaddaş işləri
Bu iki subyektləri gedir çünki həqiqətən olduqca qarşılıqlı olmalıdır.
Siz yəqin bilirsiniz ki, Sizin kompüter sistemi
Bir sabit və ya bəlkə bir bərk dövlət sürücü,
fayl storage yeri bir növ.
Bu yerdə adətən var 250 gigabayt məhəllə
İndi terabayt bəlkə bir neçə.
Və harada bütün sizin faylları nəticədə, yaşamaq
Sizin kompüter bağlamaq hətta off, siz onu geri bilər
və sizin faylları var tapa bilərsiniz daha sistem reboot zaman.
Amma bir sabit disk drive kimi disk sürücüler, bir HDD və ya bərk dövlət sürücü, bir SSD,
yalnız storage var.
>> Biz, həqiqətən, bir şey edə bilməz sabit disk olan məlumatlar,
və ya bərk dövlət sürücü.
Həqiqətən dəyişdirmək üçün məlumat və ya ətrafında hərəkət,
biz hərəkət etmək lazımdır RAM, rasgele erişim yaddaşını.
İndi RAM, bir çox kompüter az.
Siz haradasa ola bilər 512 megabayt məhəllə
Eski kompüter varsa, bəlkə iki, dörd, səkkiz, 16,
bəlkə hətta bir az daha RAM gigabayt.
Belə ki, daha kiçik, lakin ki burada uçucu data bütün mövcuddur.
Biz hər şeyi dəyişə bilərsiniz harada.
Amma biz kompüter söndürmək zaman, RAM məlumatların bütün məhv edilir.
>> Biz sabit disk lazımdır nə ki, var Bunun daha qalıcı yeri,
Bu exists- ki olardı həqiqətən, pis əgər hər dəfə biz
bizim kompüter söndürüldükdə hər Bizim sistemində fayl məhv edilib.
Beləliklə, biz RAM daxilində işləmək.
Və hər dəfə bəhs edirik yaddaş, olduqca çox, CS50,
biz RAM deyil, sabit disk söhbət edirik.
>> Beləliklə, biz yaddaş şeyi hərəkət zaman, bu yer müəyyən tutur.
Məlumat növləri Bütün biz iş etdik
up müxtəlif almaq RAM yer məbləğlər.
Belə ki, hər zaman tam yaratmaq yaddaş dəyişən dörd bytes
belə ki, RAM kənara müəyyən edilir ki, tam ilə işləyə bilər.
Siz tam elan edə bilər, dəyişdirmək, onu təyin
artırılacağını bir dəyər 10 bir, belə ki, və s ilə.
Baş lazımdır ki, bütün RAM, və dörd bayt almaq
hər ilə işləmək üçün yaratmaq tam.
>> Hər bir xarakter sizə yaratmaq bir byte olur.
Bu kosmik yalnız nə qədər var Bir xarakter saxlamaq lazımdır.
Hər float, bir real sayı, dörd bayt olur
bir cüt var halda dəqiq üzən point
sizə imkan verir sayı, Daha dəqiq və ya daha çox rəqəm ola
Bu kəsir sonra dəqiq itirmədən,
olan yaddaş səkkiz bayt almaq.
Long longs, həqiqətən böyük integers, də yaddaş səkkiz bayt almaq.
Neçə yaddaş bytes strings qədər alır?
Yaxşı ki, sözügedən bir pin qoymaq bildirin İndi, lakin biz geri gəlmək lazımdır.
>> Belə ki, geri yaddaş bu ideya kimi byte ölçülü hüceyrələrinin böyük array.
Bu, həqiqətən, bütün var, bu hüceyrələri yalnız bir böyük array,
yalnız hər hansı digər array kimi ki, Siz tanış olduğunuz və görmək,
hər element istisna olmaqla, bir byte genişdir.
Və yalnız bir sıra kimi, hər element bir ünvan var.
Bir sıra hər element indeksi, və biz var
sözdə bunu index istifadə edə bilərsiniz sıra təsadüfi giriş.
Biz başlamaq üçün yoxdur serialın əvvəlində,
hər vasitəsilə təkrarlamaq bir element onların,
biz aradığınız nə tapa bilərsiniz.
Biz yalnız mən almaq istəyirəm, demək olar 15 element və ya 100 element.
Və yalnız ki sayı keçə bilər və aradığınız dəyər almaq.
>> Eynilə hər yeri yaddaşında bir ünvan var.
Belə ki, yaddaş bilər bu kimi bir şey.
Burada bir çox kiçik bir yığın var yaddaş, bu yaddaş 20 bytes edir.
ilk 20 bytes, çünki mənim alt var müraciət
3, 2, 1, 0, və belə 19 qədər bütün yol.
Mən dəyişənlərin elan zaman Mən onlarla iş başlamaq zaman,
sistem qurmaq niyyətindədir Mənim üçün kənara bəzi kosmik
Bu yaddaş işləmək Mənim dəyişənlərin.
Belə ki, char c paytaxtı bərabərdir, demək olar ki, H. Və nə baş verəcək?
Yaxşı sistemi gedir Mənə bir byte üçün ayrılmış.
Bu halda byte sayı seçdi Dörd ünvan dörd byte,
və saxlamaq olacaq mənim üçün orada məktub kapital H.
Mən sonra int sürəti demək olarsa limit bu, 65 bərabərdir
kənara dörd müəyyən olacaq Mənim üçün yaddaş bytes.
Və bu müalicə olacaq vahid kimi dörd bytes
Biz çalışırıq çünki burada tam deyil.
Və orada 65 saxlamaq olacaq.
>> İndi artıq mən cür deyiləm bir yalan bir az izah
sağ, biz bilirik ki, çünki kompüter ikili çalışır.
Onlar başa düşmürəm mütləq kapital H nə
və ya 65 onlar yalnız nə ikili, adet sıfır və olanları başa düşürük.
Və belə ki, həqiqətən nə biz orada saxlanılması edirik
məktub H və sayı 65 deyil əksinə ikili nümayəndəlikləri
onların hansı baxmaq bu kimi kiçik bir şey.
Və xüsusilə tam dəyişən kontekstində,
Bu, yalnız daxil tüpürmək etmək niyyətində deyil bu bir dörd kimi müalicə etmək niyyətində deyil
byte yığın mütləq bu, həqiqətən gedir
dörd bir byte chunks kimi müalicə etmək, bu kimi bir şey ola bilər.
Və hətta bu deyil tamamilə doğru və ya,
adlı bir şey görə biz deyilik bir endianness,
İndi almaq üçün gedir, lakin Siz merak etdiyiniz halda,
Siz az qədər oxuya bilərsiniz və böyük endianness.
Amma bu arqument naminə, Bu video naminə,
Yalnız ki, güman edək əslində, necə 65 olardı
təmsil olunacaq hər sistem yaddaş,
Bu tamamilə doğru deyil, baxmayaraq ki.
>> Amma həqiqətən, yalnız almaq imkan tamamilə bütün ikili xilas,
və yalnız H kimi düşünmək 65, bir çox asandır
kimi bu barədə düşünmək bir insan kimi.
Bütün hüquqlar, bu da görünür ki, bəlkə bir az təsadüfi ki I've- mənim sistemi
bytes 5, 6, 7, mənə vermədi, 8 tam saxlamaq üçün.
Ki, bir səbəbi də var ki, biz indi almaq, lakin kifayət deyil
bu nə demək kompüter burada edir
yəqin ki, onun hissəsi yaxşı hərəkət edir.
Mənə yaddaş vermək deyil mütləq geri geri.
Indi bunu olacaq, baxmayaraq ki, Başqa bir string almaq istəyirsinizsə,
soyadı adlanır və mən istəyirəm orada Lloyd qoymaq.
Mən bir uyğun lazımdır gedirəm xarakteri, ki, hər bir məktub var
bir tələb edir xarakteri, yaddaş bir byte.
Mən array daxil Lloyd qoymaq bilər, belə ki, oxşar Mən getmək üçün olduqca yaxşı Ben?
Nə itkin?
>> Hər simli biz iş olduğunu unutmayın C backslash sıfır ilə başa çatır ilə,
və biz, ya burada buraxmaq olmaz.
Biz kənara bir byte təyin etmək lazımdır yaddaş belə ki keçirilməsi
Bizim string sona çatdı zaman bilirik.
Belə ki, yenə bu tənzimləmə yol şeyi
yaddaş gücü görünür bir az təsadüfi ola
lakin bu, həqiqətən necə Ən sistemləri nəzərdə tutulmuşdur.
Multiples onları sıralamaq dörd, səbəblərdən yenidən
biz lazım deyil ki, İndi almaq.
Amma bu, belə ki, demək kifayətdir kodu bu üç xətləri sonra,
Bu yaddaş kimi baxmaq bilər nə.
Mən yaddaş yerlərdə ehtiyac varsa 4, 8, 12, mənim məlumat keçirmək üçün
bu mənim yaddaş kimi baxmaq bilər nə.
>> Və yalnız xüsusilə olmaq Burada zaman xırdaçı
biz yaddaş söhbət edirik URL adətən biz
belə hexadecimal notlari istifadə etmək.
Belə ki, niyə biz bu bütün çevirmək deyil hexadecimal notation decimal-dan
ki, yalnız adətən, çünki necə xatirəsinə baxın.
Belə ki, əvəzinə vasitəsilə 0 olan 19, nə biz sıfır
sıfır X1 üç vasitəsilə x sıfır.
Həmin yaddaş 20 bytes var ki, biz və ya biz bu image baxırıq var
burada.
>> Belə ki, dedi olunur bütün edək ikinci yaddaş üz addım
və geri göstəricilərinə.
Burada ən əhəmiyyətli şey xatırlamaq
biz göstəricilər ilə iş başlamaq kimi.
A göstərici bir şey deyil Bir ünvan çoxdur.
Mən bir daha, çünki demək lazımdır Bu, vacibdir
bir göstərici bir şey deyil Bir ünvan çoxdur.
Pointers yerlərdə ünvanları yaddaş dəyişənlərin yaşadığı.
Bu inşallah olur ki, bilmədən asan az onlarla işləmək.
Mən istəyirəm, başqa bir şey nə sort var
vizual nə təmsil şemalar kodu müxtəlif xətləri ilə baş.
Və biz bu bir neçə edəcəyik göstəricilər dəfə,
və biz dinamik haqqında danışmaq zaman yaddaş ayrılması həmçinin.
Mən bu diaqramları ki, hesab edirəm, çünki xüsusilə faydalı ola bilər.
>> Mən, məsələn demək Belə ki, int k mənim kodu, nə baş verir?
Well əsasən nədir baş Mən, mənim üçün ayrılmış yaddaş alıram
lakin mən hətta kimi deyil Mən kimi bu barədə düşünmək
bir qutu kimi bu barədə düşünmək istəyirəm.
Mən bir qutusu var və bu rəngli yaşıl Çünki
yaşıl qutuları integers bilər.
Bu bir xarakter I idi mavi qutusu ola bilər.
Mən yaradılması alıram Lakin mən həmişə deyirlər integers aça bilər bir qutusu
ki, box, yaşıl rəngli olunur.
Mən daimi marker almaq və mən tərəfində k yazın.
Mən k adlı qutusu var hansı Mən integers bilər.
Mən int k deyəndə ki, ki, nə mənim baş verir.
Mən k beş bərabərdir demək, mən nə edirəm?
Bəli, mən beş qoyulması alıram qutusuna, doğru.
Bu halda, olduqca sadə deyil Mən int k, k adlı qutusu yaratmaq deyirlər.
Əgər mən k 5 bərabərdir demək qutusuna beş qoydu.
Ümid edirəm ki, bir sıçrayış çox deyil.
Hər şeyi bir getmək burada baxmayaraq maraqlı kiçik.
Mən int * pk demək olarsa, mən deyil, hətta bu mütləq nə deməkdir,
Bu aydın bir şey var bir tam ilə.
Beləliklə, mən rəng gedirəm Yaşıl-ish bu qutusu,
Mən bir şey var bilirəm bir tam ilə,
lakin bu tam özü deyil, bir int ulduz çünki.
Bir şey bir az var bu barədə fərqli.
Belə ki, bir tam nin cəlb, lakin başqa bu
Çox fərqli deyil biz haqqında söhbət.
Bu bir qutusu var, onun, bir etiket var bir etiket pk qalıcı oldu,
və keçirilməsi qadir olanlar nə int ulduz.
Onlar bir şey var integers ilə, aydın.
Burada son line baxmayaraq var.
Mən demək olarsa pk = k, Vay, nə sağ, oldu?
Belə ki, bu təsadüfi sayı, zahirən təsadüfi sıra var qutusuna atılan olur.
Ki, bütün, pk edir k ünvanı olur.
K yaddaşında yaşayır Beləliklə, mən yapışdırılması alıram, ünvanı, onun bayt ünvanı.
Edirəm All I dedi alıram deyil ki, dəyəri gedirəm nə
Mənim qutusu adlı PK daxilində qoymaq.
Və bunlar çünki göstəricilərinə, və axtarır, çünki
sıfır x kimi bir simli səkkiz sıfır c yeddi dörd səkkiz
iki sıfır yəqin ki, çox mənalı deyil.
Biz ümumiyyətlə göstəricilərinə görüntüləmək zaman, Biz, həqiqətən, göstəricilər kimi bunu.
Pk bizə məlumat verir biz yaddaş k tapmaq lazımdır.
Belə ki, əsasən pk bu bir arrow var.
Və biz uzunluğu gəzmək əgər ki arrow təsəvvür
bu gəzmək bilər bir şey var, biz əgər arrow boyunca gəzmək,
ki arrow çox ucunda, biz yaddaşında yer tapa
burada k yaşayır.
Və həqiqətən vacibdir k yaşadığı biz bir dəfə, çünki,
biz data ilə işləmək üçün başlaya bilərsiniz ki, yaddaş yeri daxilində.
Biz bir ufacık əldə etdiyiniz baxmayaraq İndi irəlidə özümüz bit.
>> Belə bir göstərici nədir?
A göstərici olan bir veri maddə dəyəri yaddaş ünvanı.
Idi ki, sıfır x səkkiz sıfır stuff ki davam, bir yaddaş ünvanı oldu.
Ki, yaddaş bir yer idi.
Və bir göstərici növü cür təsvir
məlumatların siz tapa bilərsiniz ki, yaddaş ünvanı.
Belə ki, int ulduz hissəsi hüququ var.
Hesab edirəm ki, arrow edin, bu bir yerə mənə yol gedir.
Və yeri, nə Mənim nümunə orada tapa bilərsiniz,
yaşıl rəngli qutusu edir.
Bu nə var, bir tamsayı Mən Hesab edirəm ki, ünvana getmək əgər tapa bilərsiniz.
bir veri növü pointer nə təsvir
ki, yaddaş ünvanda tapa bilərsiniz.
Belə ki, burada olsa, həqiqətən, sərin şey var.
Pointers us keçmək üçün imkan verir funksiyaları arasında dəyişənlər.
Və həqiqətən dəyişənlərin keçmək və onların surətlərini keçə.
Bildiyimiz Çünki əgər dəqiq yaddaş dəyişən tapmaq üçün,
biz çıxarmaq lazım deyil Bu, biz yalnız yeri getmək olar
ki, dəyişən ilə işləmək.
Mahiyyəti göstəricilər belə sort bir kompüter mühit etmək
daha çox real dünya kimi, doğru.
>> Belə ki, burada bir bənzətmə var.
Mən bir notebook var ki, deyirlər, sağ və bu qeydlər tam deyil.
Mən onu yeniləmək istəyirəm.
Siz bir funksiyası var ki, yenilikləri qeydlər, doğru.
Yolla biz oldum bu günə qədər iş, nə
Siz mənim notebook olacaq olur, Siz surəti mağaza getmək lazımdır
Siz bir Xerox surəti etmək lazımdır notebook hər səhifə.
Siz geri notebook tərk edəcəyik mənim masası üzərində Bitirdiğinizde,
Siz getmək və hər şeyi keçmək lazımdır mənim tarixi və ya yanlış həyata notebook,
və sonra geri keçmək lazımdır Mənə Xerox pages yığını
ki, mənim notebook bir replica ilə siz etdiyiniz dəyişikliklər.
Və o nöqtədə, bu kimi mənə var zəng funksiyası zəng kimi,
sizin qeyd etmək qərar və mənim notebook onları geri inteqrasiya edir.
Belə addımlar bir çox var Burada iştirak hüququ.
Like daha yaxşı ola bilməz Mən yalnız demək əgər, hey, edə bilərsiniz
mənim notebook yeniləmə Mənə, mənim notebook əl
və siz hər şeyi almaq və sanki onları keçmək
və mənim notebook mənim qeyd yeniləmə.
Və sonra mənim notebook geri vermək.
Bu cür nə göstəricilər, bizə imkan verir
bu mühit çox etmək biz əslində fəaliyyət necə Kimi daha çox.
>> Ki, bütün sağ nə var bir göstərici, danışaq ki,
göstəricilər C işləmək və necə haqqında necə onlarla işləmək üçün başlaya bilərsiniz.
Belə ki, bir çox sadə göstərici var C null göstərici çağırıb.
heç bir şey null göstərici xal.
Bu kimi Bu yəqin ki, görünür həqiqətən çox faydalı bir şey,
lakin biz bir görəcəksiniz kimi sonra az, fakt
bu null göstərici var ki, həqiqətən, həqiqətən lazımlı gəlmək olar.
Və bir pointer yaratmaq zaman, və Siz onun dəyəri immediately- müəyyən deyil
qəbulu nümunəsi onun dəyəri dərhal
geri bir neçə slaydlar olacaq Mən pk & K bərabərdir söylədi
pk kimi, K ünvanı olur Biz o deməkdir ki, nə görürsünüz
ki, kod necə görürsünüz shortly- biz bir şey onun dəyəri müəyyən deyil əgər
dərhal mənalı, Siz həmişə olmalıdır
null qeyd etmək üçün göstərici müəyyən.
Siz heç bir şey qeyd etmək müəyyən etməlidir.
>> Daha çox fərqli Bu kimi yalnız dəyəri tərk
və sonra bir elan pointer və yalnız fərz
ki, nadir hallarda doğrudur, çünki bu null.
Beləliklə, siz həmişə müəyyən etməlidir bir göstərici dəyəri
Siz onun dəyəri müəyyən yoxsa null dərhal mənalı bir şey.
Siz kontrol edə bilərsiniz bir göstərici dəyər olub bərabərlik operator istifadə edərək null deyil
(==), Yalnız hər hansı bir tam müqayisə istəyirəm dəyərlər və ya character dəyərlər istifadə (==)
həmçinin.
Bu daimi xüsusi sort Siz test üçün istifadə edə bilərsiniz dəyəri.
Belə ki, bir çox sadə idi pointer, null göstərici.
Başqa bir yolu yaratmaq bir göstərici çıxarmaq üçün
dəyişən ünvanı Əgər siz artıq yaratdıq,
və və bu istifadə etmək operator ünvanı hasilatı.
Hansı biz artıq əvvəllər gördüm ilk diagram Məsələn mən göstərdi.
X biz bir dəyişən əgər Belə ki, artıq növü tam yaradılmış,
sonra və x bir tam bir göstəricisidir.
& X edir- & çıxarış gedir unutmayın sağ şey ünvanı.
Və pointer yalnız bir ünvanı ildən, daha & x bir tam bir göstəricisidir
onların dəyəri harada yaddaş x həyatında edir.
Bu X ünvanı var.
Belə ki, & x x ünvanı.
Bu bir addım olsun daha və bir şey qoşulmaq
Mən əvvəl video alluded.
Varış cütlərin bir sıra sonra, Əgər & Varış kvadrat mötərizə i bir göstərici
ikiqat üçün.
OLDU.
i, əgər kvadrat mötərizə Varış Varış, cütlərin bir sıra edir
sonra i kvadrat mötərizə Varış ki, serialın i-ci element,
və & kvadrat mötərizə Varış i harada edir Yaddaş arr i-ci element mövcuddur.
>> Belə ki, dolayısı burada nə var?
Bir Diziler adı, dolayısı bu bütün şey,
bir serialın adı ki, həqiqətən özü bir göstərici.
Siz iş etdik bütün boyunca göstəricilər ilə
Siz bir sıra istifadə etdiyiniz hər zaman.
Məsələn saxla dəyişən daxilində,
Mən təqdim Videonu sonuna yaxın biz bir funksiyası var nümunə
adlı set int və funksiyası set array çağırıb.
Və problem müəyyən etmək üçün və ya, və ya nə
biz çap dəyərlər funksiyası sonu,
Əsas Proqramın sonunda.
>> Siz ki, məsələn geri əgər və ya video seyr etdik əgər,
Siz zəng qaynar zaman bilirik ki, set int səmərəli heç bir şey yoxdur.
Amma zəng array yoxdur təyin etmək üçün.
Mən növ niyə üzərində cilalanacaq o zaman belə idi.
Mən də, bu, bir sıra var ki, dedi: xüsusi, bilirsiniz, bir səbəb var.
Bunun səbəbi bir sıra nin adı, həqiqətən, yalnız bir göstərici
və bu xüsusi var kvadrat mötərizə sintaksis ki,
ilə işləmək üçün hər şeyi çox gözəl edir.
Onlar bir fikir etmək çox az qorxuducu göstərici
onlar sort istəyirik niyə və ki ki, şəkildə təqdim.
Amma həqiqətən serialların yalnız göstəricilər var.
Və niyə zaman biz serialın bir dəyişiklik etdi
biz bir parametri kimi bir sıra keçərkən funksiyası və ya bir arqument kimi
serialın bir funksiyası, məzmunu həqiqətən də callee dəyişdi
və zəng edir.
Hər bir digər növ hansı gördük dəyişən halda deyildi.
Belə ki, saxlamaq üçün bir şey var Siz göstəricilər ilə çalışırıq zaman ağla,
ki, bir adı array həqiqətən bir pointer
ki, serialın ilk element.
>> OK, belə ki, indi biz bütün bu var faktlar, sağ, davam edək.
Niyə biz qayğı yoxdur burada bir şey yaşayır.
Dediyim Yaxşı kimi, bu olduqca var bir şey yaşadığı bilmək faydalıdır
belə ki, orada getmək və onu dəyişə bilərsiniz.
Bu iş və həqiqətən şey var ki,
ki, dəyişən take təsiri etmək istəyirəm, və bəzi surəti qüvvəyə deyil.
Bu dereferencing adlanır.
Biz yalnız getmək və biz dəyər dəyişir.
Biz bir göstərici var və əgər Belə ki, deyirlər pc, və bir xarakter göstərir,
sonra biz * pc və * pc demək olar biz getmək əgər biz tapa bilərsiniz nə adı
Ünvan PC.
Biz orada tapa bilərsiniz bir xarakter və * Pc ki, data baxın necə
yeri.
Beləliklə, biz kimi bir şey deyə bilər * Pc = D ya kimi bir şey,
ki, o deməkdir ki, hər hansı , yaddaş ünvanı pc idi
nə xarakter əvvəl idi biz pc = D * demək əgər orada, indi D edir.
>> Belə ki, burada biz yenə getmək bəzi qəribə C stuff, doğru.
Beləliklə, biz kimi əvvəllər * gördük elə data type hissəsi,
və indi istifadə olunur bir az fərqli kontekstində
bir yerdə məlumat daxil olmaq üçün.
Mən bunu bir az confusing bilirik və ki, həqiqətən, bu bütün hissəsi
kimi, niyə göstəricilər bu mifologiya var onların ətrafında belə mürəkkəb kimi,
vicdanla, bir syntax problem növüdür.
Lakin * Hər iki kontekstlərdə istifadə olunur, həm növü adı hissəsi kimi,
və biz bir az görürsünüz çox başqa sonra bir şey.
Və indi dereference operator.
Belə ki, yalnız gedir, Bu data çatmaz
göstərici yeri, və Siz iradəsi ilə manipulyasiya etməyə imkan verir.
>> İndi bu çox oxşardır Sizin qonşu ziyarət hüququ.
Əgər bilirsinizsə, nə qonşu sen, yaşayır
Sizin qonşu ilə həyata asma deyil.
Siz başına bilirik yaşadıqları bilirik,
lakin çox demək deyil ki, ki, bilik olan fəziləti
Siz onlara ilə əlaqə olunur.
Onlarla qarşılıqlı istəyirsinizsə, Siz öz evinə getmək üçün var
Əgər onlar yaşadığı getmək üçün var.
Və bunu bir dəfə, sonra qarşılıqlı bilər
onlarla yalnız istəyirəm istəyirəm.
Və eyni dəyişənlərin, onların ünvanına getmək lazımdır
Əgər siz onları qarşılıqlı istəyirsinizsə, Yalnız Ünvanı bilmirəm bilər.
Və ünvana getmək yoldur *, dereference operator istifadə etmək.
Siz nə düşünürsünüz biz cəhd və dereference əgər
onların dəyəri bir göstərici null edir?
Null Xatırladaq ki, pointer heç bir şey göstərir.
Siz cəhd və dereference əgər heç bir şey bir ünvan heç bir şey getmək və ya,
Siz nə düşünürsünüz?
Yaxşı Siz guessed əgər seqmentasiya günah, doğru olarıq.
Siz cəhd və dereference əgər bir null pointer,
Bir seqmentasiya əziyyət günah. Lakin, gözləyin
Mən ki, siz demək deyildi Siz fikrində deyilik əgər
Sizin dəyəri təyin etmək üçün mənalı bir şey göstərici,
Siz null müəyyən etməlidir?
Mən və həqiqətən seqmentasiya günah yaxşı davranış növüdür.
>> Heç bir dəyişən elan var dərhal onun dəyər təyin deyil?
Belə ki, yalnız int x demək; siz deyil həqiqətən bir şey üçün təyin
və sonra sizin kodu, Siz x dəyəri çap
hələ olmayan bir şey üçün təyin.
Tez-tez almaq lazımdır sıfır, lakin bəzən
bir təsadüfi nömrə almaq və bilər Siz gələn heç bir fikrim yoxdur.
Eynilə şeyi edə bilərsiniz göstəricilər ilə baş verir.
Bir göstərici elan zaman int * məsələn pk,
və siz bir dəyər təyin deyil Siz yaddaş üçün dörd bayt almaq.
Nə olursa olsun dörd bytes sistem yaddaş bilərsiniz
bir mənalı dəyəri var ki, tapa bilərsiniz.
Və ola artıq bir şey
başqa lazım artıq funksiyası, yalnız belə
nə data var idi.
>> Nə dereference etməyə çalışdı əgər Siz var idi don't- bəzi ünvan
artıq bayt və məlumat orada ki, pointer indi.
, Siz cəhd əgər ki, pointer dereference Bəzi yaddaş ilə messing edilə bilər
Siz niyyətində deyil ki, bütün mess üçün.
Və əslində siz edə bilər həqiqətən dağıdıcı bir şey,
kimi başqa bir proqram qırmaq, və ya, başqa bir funksiyası qırmaq
və ya zərərli bir şey Siz bütün etmək niyyətində deyil idi.
Bu niyə və ki var həqiqətən yaxşı bir fikirdir
əgər null sizin göstəricilərinə təyin etmək mənalı bir şey onlara müəyyən deyil.
Bu, yəqin ki, daha yaxşıdır Proqram üçün gün sonu
Bunu sonra qəza bir şey vintlər qədər
başqa bir proqram və ya başqa bir funksiyası.
Bu davranış, hətta yəqin ki, yalnız şaqqıltılı az ideal.
Bu niyə və ki var həqiqətən yaxşı bir vərdiş
Sizin göstəricilərinə qurmaq üçün daxil olmaq Əgər siz onları müəyyən yoxsa null
mənalı dəyəri Bildiyiniz dərhal dəyəri
və siz dereference təhlükəsiz bilərsiniz.
>> Belə ki, indi geri gəlsin və bir göz atın vəziyyət ümumi sintaksis.
Mən int * p demək olarsa ;, Mən nə etmişəm?
Mən etdik bu.
Mən p dəyəri bir ünvan olduğunu bütün göstəricilər yalnız çünki
ünvanları.
Mən dereference p * operator istifadə edərək.
Çox burada Bu əhatədə top * Növü hissəsi xatırlayıram.
Int * data növüdür.
Amma dereference bilər * operator istifadə edərək p,
Mən bunu, mən ki, ünvan üçün getmək əgər, Hesab edirəm ki, ünvanda nə tapa bilərsiniz?
Mən tam tapa bilərsiniz.
Belə ki, int * p əsasən deyərək, p bir ünvanı.
Mən p dereference əgər Mən, mən tam tapa
ki, yaddaş yeri.
>> OK, belə ki, mən başqa olduğunu ifadə etdi ulduzları ilə annoying şey
və burada yerləşir ki ulduzları ilə annoying şeydir.
Əgər elan cəhd eyni tipli çox dəyişənlər
kod eyni xətt üzrə?
Belə ki, ikinci, xətt iddia Mən, həqiqətən, yaşıl var code
yoxdur və yalnız int x, y, z deyir ;.
Hansı ki, nə olardı həqiqətən yaratmaq sizin üçün üç tam dəyişənlər,
bir adlı x, bir adlı y, bir z çağırıb.
Bu olmadan bunu etmək üçün bir yol var üç xətt üzərində split olan.
>> Stars almaq burada baxmayaraq yenə annoying,
* həqiqətən hissəsidir, çünki həm növü adı və bir hissəsi
dəyişən adı.
Və mən demək əgər int * px, py, Pz, nə həqiqətən almaq bir tam bir göstəricisidir
px və iki integers, py və Pz çağırıb.
Və yəqin ki, nə var ki, yaxşı deyil, istəyirəm.
>> Bir neçə göstəricilərinə yaratmaq istəyirsinizsə Belə ki, eyni xətt üzrə, eyni tipli,
Mən, həqiqətən, ehtiyac nə və ulduzları, etmək üçün * pb * pc, int * pa demək deyil.
İndi yalnız dedi ki və indi, sizə bu izah
Siz yəqin ki, bunu heç vaxt.
Və bu, vicdanla, yəqin ki, yaxşı bir şey deyil siz təsadüfən bilər, çünki
bir ulduz, belə bir şey buraxmaq.
Bu bəlkə elan etmək yəqin ki, ən yaxşı fərdi xətləri üzrə göstəricilər,
lakin bu, yalnız bir biri o annoying sintaksis
etmək ulduzları ilə şeyi ilə işləmək üçün belə çətin göstəricilər.
Yalnız bu sintaktik, çünki mess vasitəsilə işləmək lazımdır.
Təcrübə ilə yoxdur həqiqətən ikinci təbiət olur.
Mən hələ də bu səhvlər 10 il üçün proqramlaşdırma sonra,
Bir şey olsa belə pərişan olmayın Sizə, vicdanla olduqca ümumi var.
Bu cür həqiqətən var sintaksis bir qüsur.
>> OK, belə ki, I növ vəd biz yenidən ki,
necə böyük anlayışı bir simli edir.
Yaxşı mən sizə deyib ki, əgər simli, biz növ həqiqətən var
Sizə bütün vaxt yalan edilmişdir.
Deyilən data type var simli və əslində mən
biri bu qeyd bizim data növləri üzrə erkən video,
ki, simli bir veri növü idi ki, cs50.h. sizin üçün yaradılmışdır
Siz # daxil etmək lazımdır Istifadə etmək üçün cs50.h.
>> Yaxşı string yalnız həqiqətən bir şey üçün bir alias
, char * adlı bir xarakter göstərici.
Yaxşı göstəricilər, geri, yalnız müraciət edir.
Belə ki, ölçüsü nədir simli bayt?
Yaxşı dörd və ya səkkiz var.
Və səbəb deyirəm dörd və ya səkkiz çünki əslində
Siz istifadə edirsinizsə, sistem asılıdır CS50 ide, char * bir char ölçüsü
* Bu bir 64-bit sistemi var, səkkiz edir.
Yaddaş Hər ünvan üçün 64 bit uzun.
Siz CS50 cihaz istifadə edirsinizsə və ya hər hansı 32-bit maşın istifadə edərək,
və bu müddət 32-parça eşitdim maşın, bir 32-bit maşın nədir?
Yaxşı yalnız hər o deməkdir ki, yaddaş ünvan 32 bit uzun.
Və belə 32 bit dörd bayt edir.
Belə ki, bir char * dörd və ya səkkiz edir sistem asılı olaraq bayt.
Həqiqətən hər hansı bir məlumat növləri, və hər hansı bir məlumat bir göstərici
bütün göstəricilər yalnız çünki, yazın ünvanları, dörd və ya səkkiz bytes var.
Belə ki, bu yenidən edək diaqram və bir-bağlamaq imkan
burada bir az həyata keçirilməsi ilə bu video.
Belə ki, burada biz off sol diagram var Videonu çox əvvəlində.
I * pk = 35 demək əgər Belə ki, nə indi baş verir?
Belə ki, * pk = 35 Mən deyəndə nə deməkdir?
Ikinci edin.
* Pk.
Burada kontekstində * deyil dereference operator.
Belə ki dereference operator istifadə olunur
Ünvan işarə biz getmək PK ilə, və biz tapmaq nə dəyişir.
Belə ki, * pk = 35 səmərəli şəkil bu yoxdur.
Belə ki, syntactically əsasən bir eyni k = 35 söyləyib.
>> Daha bir.
Mən int m demək, mən yaratmaq m adlı yeni dəyişən.
Yeni qutusu, bir yaşıl qutu, çünki Bu tam keçirmək olacaq,
və m etiketli edir.
I m = 4 desəniz, mən qoymaq ki qutusuna tam.
Demək pk = & m, necə varsa bu diaqram dəyişiklik?
Pk = & m, siz nə geri edə & Operator yoxdur və ya adlanır?
Ki, və bəzi dəyişən adını xatırlayıram dəyişən adı ünvanı.
Belə ki, nə biz deyərək edirik edir pk m ünvanı olur.
Və belə səmərəli nə olur diagram artıq xal PK
m, lakin xal k.
>> Yenə göstəricilərinə çox var ilə işləmək üçün çətin
və onlar bir çox təcrübə, lakin
imkan üçün onların qabiliyyəti funksiyaları arasında data keçmək
və həqiqətən o var dəyişikliklər qüvvəyə,
ətrafında baş almaq həqiqətən vacibdir.
Bu yəqin ki, ən mürəkkəb biz CS50 müzakirə mövzusu
lakin dəyəri ki, göstəricilərinə istifadə almaq
qədər fəsadlar üstələyir ki, onları öyrənmək gəlir.
Beləliklə, mən sizə uğurlar arzulayıram Uğurlar göstəricilər haqqında öyrənmək.
Mən Doug Lloyd deyiləm, bu CS50 edir.