[Powered by Google Translate] [Bölmə 4 - Daha Rahat]
[Rob Bowden - Harvard Universiteti]
[Bu CS50 edir. - CS50.TV]
Uşaqlar olduğunu bilmirdim halda biz, bir viktorina sabah var.
Bu sinif görüldü ola bilər və ya sinif görüldü olmalıdır hər şey əsasən var.
Yəni onlar bir çox son mövzu olmalarına baxmayaraq göstəricilərinə daxildir.
Siz ən azı onların yüksək səviyyədə başa düşməlidir.
Siz viktorina üçün anlamaq lazımdır sinif üzərində getdi ki, bir şey.
Əgər siz onları sualınız varsa Belə ki, indi onlara verə bilərsiniz.
Uşaqlar sual yerləşir Amma bu, tələbə-nun çox sessiyası olacaq
belə ümid insanlar sual var.
Hər kəs sualınız varmı?
Bəli. >> [Tələbə] Siz göstəricilər üzərində yenidən getmək edə bilərəmmi?
Mən göstəricilərinə artıq getmək lazımdır.
Sizin dəyişənlərin bütün mütləq yaddaş yaşayır
lakin adətən bu barədə narahat olmayın və yalnız x + 2 və y + 3 demək
və compiler şeyi sizin üçün yaşadığı həyata rəqəm olacaq.
Sonra indi aydın o yaddaş ünvanları kullanıyorsanız göstəricilər ilə məşğul olursunuz.
Belə bir dəyişən yalnız heç bir zaman bir ünvan yaşayacaqdır.
Biz bir pointer bəyan etmək istəyirsinizsə, nə növü kimi baxmaq edir?
>> Mən bir pointer p bəyan etmək istəyirəm. Növü necə görünür?
[Tələbə] int * p. >> Bəli. Belə ki, int * p.
Və nasıl x qeyd edə bilərəm? >> [Tələbə] Ampersand.
[Bowden] Belə işareti sözün operator ünvan adlanır.
Mən demək və zaman x bu dəyişən x xatirəsinə ünvan əldə edir.
Belə ki, indi mən göstərici p var, hər yerdə mənim kodu I * p istifadə edə bilərsiniz
və ya x istifadə edə bilər və eyni şey olacaq.
(* P). Bu nə edir? Ki, ulduz nə deməkdir?
[Tələbə] Bu nöqtədə bir dəyəri deməkdir. >> Bəli.
Biz baxmaq Belə ki, bu diaqramlardan çıxartmaq üçün çox faydalı ola bilər
bu dəyər 4 üçün baş verən x yaddaş bir az qutusu, olduğu
sonra biz, p üçün yaddaş kiçik bir qutu var
və belə x üçün p bal, biz p x üçün arrow çəkmək.
Beləliklə, biz deyəndə * p biz p olduğunu qutusu getmək deyərək edirik.
Star arrow edin və sonra siz orada ki qutusuna istəyirəm nə.
Belə ki, I * p = 7 demək olar; və x və 7 dəyişiklik olduğunu qutusu gedəcək.
Və ya demək olar int z = * p * 2; çaşdırıcı ki, bu ulduz, star, çünki.
Bir ulduz p dereferencing ki, digər ulduz 2 vurulması olunur.
Mən həmçinin x ilə * p əvəz edə bilərsiniz.
Siz eyni şəkildə istifadə edə bilərsiniz.
Və sonra mən tamamilə yeni bir şey p nöqtəsi ola bilər.
Mən demək olar p = &z;
İndi x artıq bal P o z göstərir.
Mən * p bunu heç vaxt z bunu kimi eyni.
Biz funksiyaları nəzərə almaq başlamaq bir dəfə bu barədə faydalı bir şey.
>> Bu bir şey ki, bal bir pointer elan yararsız növü var
və sonra yalnız dereferencing edirik
siz başlamaq üçün orijinal dəyişən istifadə edə bilər.
Lakin funksiyaları nəzərə almaq zaman - belə ki, biz bir funksiyası, int foo var deyək
bir göstərici edir və yalnız * p = 6 edir;
Biz mübadilə ilə əvvəl gördüm kimi, bir effektiv mübadilə və ayrı-ayrı funksiyası edə bilməz
C hər şeyi həmişə dəyər keçən çünki yalnız integers keçərək.
Siz göstəricilər keçən bile zaman dəyəri ilə keçən edirik.
Bu, yalnız həmin dəyərlərin yaddaş ünvanları ki, baş verir.
Beləliklə, mən demək foo (p); mən funksiyası foo daxil göstərici keçən alıram
və sonra foo * p = 6 edir;
Daxili ki, funksiyası Beləliklə, * p, hələ x bərabərdir
bu funksiya ərzində scoped deyil, çünki ancaq funksiyası daxilində x istifadə edə bilməz.
Belə * p = 6 başqa bir funksiya bir yerli dəyişən edə bilərsiniz yeganə yoludur.
Və ya, yaxşı, göstəricilər başqa bir funksiya bir yerli dəyişən gedə bilərsiniz yalnız bir yoldur.
[Tələbə] edək bir pointer qayıtmaq istədiyini deyirlər. Necə dəqiq ki etməliyəm?
[Bowden] int y = 3 kimi bir şey kimi bir pointer qayıt; qaytarılması və y? >> [Tələbə] Bəli.
[Bowden] Okay. Bunu heç vaxt. Bu pis.
Mən bu məruzə slaydlar gördüm edirəm yaddaş bu bütün diaqram görən açılmış
Ü qədər burada yaddaş ünvan 0 var
və aşağı burada, 32 yaddaş ünvan 4 gigs ya 2 var.
Beləliklə, bəzi məhsulları və bəzi şeylər var və sonra sizin yığını var
və sizə yalnız böyüyən, öyrənmək açılmış olan yığın, var.
[Tələbə] yığını yuxarıda yığın deyilmi?
>> Bəli. Bu yığın üst, bu deyil? >> [Tələbə] Bəli, o üst 0 qoydu.
[Tələbə] Oh, o, üst 0 qoydu. >> [Tələbə] Oh, tamam.
Disclaimer: Yerdə CS50 ilə belə görmək olacaq. >> [Tələbə] Okay.
Bu, sadəcə ki, siz ilk borular gördükdə zaman
Siz bir-birinə üst şeyi yığma hesab bir yığın hesab zaman istəyirəm.
Beləliklə, biz yığını bir yığın zamanki kimi artır belə ətrafında bu flip edirlər
əvəzinə yığını aşağı asma. >> [Tələbə] olsa vaxt texniki, çox böyümək edirsiniz?
Bu böyümək sizə demək nə asılıdır.
Yığını və yığın həmişə əks istiqamətdə inkişaf edir.
A yığını həmişə böyüyür ki mənada qədər artır
ali yaddaş ünvanları və yığın aşağı artır qarşı
ki, bu, aşağı yaddaş ünvanları qarşı artan.
Belə ki, yüksək 0 və aşağı yüksək yaddaş ünvanları edir.
Onlar yalnız istiqamətləri qarşı artan edirik də.
[Tələbə] Siz altındakı yığını sürüb, çünki yalnız o deməkdir
bu yığını bir yığın üst başlamaq çünki daha asan görünür, çünki
yığın də özü üst belə that's var - >> Bəli.
Siz həmçinin yığını daha çox böyüyür və böyük kimi yığın hesab, lakin.
Belə ki, biz yığını cür böyüyən göstərmək istəyirəm ki biridir.
Amma hər yerdə başqa baxmaq üst ünvan 0 göstərmək niyyətindədir
və altındakı ən yüksək yaddaş ünvanı, bu yaddaş sizin adi rəyidir.
>> Bir sual var?
[Tələbə] bizə yığın haqqında daha demək olarmı?
Bəli. Mən ikinci olduğu almaq lazımdır.
Birincisi, & y qaytarılması niyə geri gedir, pis şey
yığını sizi funksiyaları bütün olan yığını çərçivəsində bir dəstə var
adlanan edilmişdir.
Əvvəlki şeylər məhəl Belə ki, yığın üst həmişə əsas funksiyası olacaq
ki adlanan olan ilk funksiyası var-ci ildən.
Və sonra başqa bir funksiyası zəng zaman yığın aşağı artmaqda davam edir.
Mən bəzi funksiyası, foo zəng və öz yığını çərçivəsində əldə əgər,
bəzi funksiyası, bar zəng edə bilərsiniz; öz yığını çərçivəsində olur.
Və bar recursive ola bilər və özü zəng edə
və belə bar ikinci zəng öz yığını çərçivəsində almaq üçün gedir.
Və bu yığını çərçivəsində gedir nə yerli dəyişənlərin bütün
və funksiyası dəlilləri bütün -
Bu funksiya yerli scoped ki, hər hansı bir şeyi bu yığını çərçivəsində gedin.
Belə ki, mən bar kimi bir funksiyası olduğunu bildirib zaman deməkdir
Mən yalnız bir tam bəyan və sonra tam bir pointer qayıtmaq üçün gedirəm.
Belə y yerləşir yaşayır?
[Tələbə] y bar yaşayır. >> [Bowden] Bəli.
Somewhere yaddaş bu kiçik meydanında bu y bir littler kvadrat edir.
I qayıtmaq & y, mən yaddaş bu kiçik blok bir pointer qaytarılması alıram.
Amma sonra bir funksiyası qaytarır, onun yığını çərçivəsində yığını off atdı olur.
Bu yığını deyirlər niyə və ki.
Ki, nə əgər O, yığını data strukturu kimi.
Və ya hətta qablar bir yığın kimi, həmişə nümunə
əsas alt getmək gedir, sonra zəng ilk funksiyası ki, üst getmək niyyətindədir
zəng edilmiş bütün funksiyaları geri qədər və əsas geri ala bilmir
ki, üst yerləşdirilib.
>> Siz əgər [tələbə] Beləliklə & y ki, dəyəri xəbərdarlıq etmədən dəyişiklik etmək məcburiyyətindədir qayıtmaq.
Bəli, it's - >> Bu üzerine ola bilər [tələbə]. >> Bəli.
Cəhd edin və - Bu tamamilə var -
Bir göstərici qaytarılması, çünki Bu, bir int * bar olacaq
belə, onun qaytarılması növü int * edir.
Bu funksiya qaytarılması dəyəri istifadə etməyə cəhd edərsə, bu, müəyyən davranış deyil
ki, göstərici pis yaddaş işarə edir. >> [Tələbə] Okay.
Bəs əgər, məsələn, elan int * y = malloc (sizeof (int))?
Bu daha yaxşıdır. Bəli.
[Tələbə] biz zibil bin şeyi sürükleyin Biz necə danışıb
onlar həqiqətən silinə deyilik, biz yalnız onların göstəricilərinə itirirlər.
Belə ki, bu halda biz həqiqətən yaddaşında hələ dəyəri silmək və ya yoxdur?
Çox hissəsi üçün, hələ də olacaq.
Amma qoy biz bəzi digər funksiyası, baz zəng nə deyirlər.
Baz burada öz yığını çərçivəsində almaq üçün gedir.
O, bu məhsulları bütün yadda olacaq
sonra sonra, əvvəl var ki pointer cəhd və istifadə
eyni dəyər olacaq deyil.
Bu funksiya baz adlı çünki yalnız dəyişib olacaq.
[Tələbə] Amma biz hələ 3 almaq deyil?
[Bowden] bütün ehtimalı, Siz edərdim.
Amma siz ki, etibar edə bilməz. C yalnız müəyyən davranış deyir.
>> [Tələbə] Oh, bunu edir. Okay.
Malloc istifadə gəlir harada Belə bir göstərici qayıtmaq istədiyiniz zaman, bu.
Mən, həqiqətən, yazıyoruz yalnız malloc qayıtmaq (3 * sizeof (int)).
Biz ikinci daha malloc artıq getmək lazımdır, lakin malloc ideyası sizin yerli dəyişənlərin bütün
həmişə yığını getmək.
Malloced ki, bir şey yığın gedir və bu, əbədi və daim yığın olacaq
siz açıq-aydın onu azad qədər.
Belə ki, bu zaman malloc bir şey, bu funksiya yekunları sonra yaşamaq olacaq deməkdir.
Proqram çalışan dayanır sonra [tələbə] Əgər yaşamaq olacaq? >> No
OK, belə ki, bu proqram bütün yol axar görülən qədər orada olacaq. >> Bəli.
Biz proqram çalışan dayanır ne olur detalları üzərində bilərsiniz.
Siz mənə xatırlatmaq lazımdır bilər, lakin tamamilə ayrı bir şeydir.
[Tələbə] Belə malloc bir pointer yaradır? >> Bəli.
Malloc - >> [tələbə] Mən malloc bir pointer istifadə edə bilərsiniz yaddaş blokunun təyin edirəm.
[Bowden] Mən daha diaqram istəyirəm. >> [Tələbə] Beləliklə, bu funksiyası olsa da, işləyir?
[Tələbə] Bəli, malloc istifadə edə bilərsiniz ki, yaddaş blokunun təyin,
və sonra bu yaddaş ilk blokunun ünvan qaytarır.
>> [Bowden] Bəli. Belə ki, zaman malloc, siz yaddaş bəzi məhəllə qənimətçilik edirik
ki, yığın-hazırda var.
Yığın çox kiçik, onda yığın yalnız artmaqda davam edir və bu istiqamətdə artır.
Beləliklə də yığın çox kiçik deyək.
Sonra bir az artır və yalnız artmışdır ki, bu blok bir pointer qayıtmaq haqqında.
Pulsuz stuff, siz yığın daha çox otaq edirik zaman,
belə daha sonra malloc zəng daha azad idi ki, yaddaş yenidən istifadə edə bilərsiniz.
Malloc və pulsuz haqqında əhəmiyyətli şey tam nəzarət verir ki,
Bu yaddaş bloklarının ömrü ərzində.
Qlobal dəyişənlər həmişə diri var.
Yerli dəyişənlərin onların daxilində yaşayır.
Qısa bir buruq brace keçmiş getmək kimi, yerli dəyişənlərin ölü.
Siz onu diri-diri olmaq üçün istədiyiniz zaman Malloced yaddaş sağdır
siz azad demək zaman və sonra azad edilir.
Bu, həqiqətən, həqiqətən, yaddaş yalnız 3 növ var.
Yığını olan avtomatik yaddaş idarəetmə, var.
Things sizin üçün avtomatik olaraq baş verir.
Siz int x deyəndə, yaddaş int x yerləşir.
X çərçivəsində həyata gedir zaman, yaddaşlı x emalı olunur.
Sonra dinamik yaddaş idarə olan malloc nə deyil, var
kontrol zaman olan.
Siz dinamik yaddaş və ayrılmış lazım deyil zaman qərar.
Və sonra statik var, olan yalnız, əbədi yaşayır deməkdir
olan qlobal dəyişənlər nə edir.
Onlar yaddaşında yalnız həmişə istəyirik.
>> Suallar?
[Tələbə] yalnız qıvrım aşırma istifadə edərək, bir blok müəyyən edə
lakin olmayan bir bəyanat və ya kimi bir müddət bəyanat və ya bir şey varsa?
Siz bir funksiyası kimi bir blok müəyyən edə bilərsiniz, lakin çox qıvrım aşırma var.
[Tələbə] Beləliklə, siz yalnız kodu qıvrım aşırma bir təsadüfi cüt kimi ola bilməz
yerli dəyişənlər var ki? >> Bəli, edə bilər.
Int bar daxilində biz {int y = 3;} ola bilər.
Yəni burada ehtimal edir.
Amma tamamilə int y daxilində müəyyən edir.
Ikinci buruq brace sonra, y artıq istifadə edilə bilməz.
Siz də, bunu demək olar ki, heç vaxt.
, Proqram başa zaman nə geri alınması
biz yalnız şeyi daha asan etmək üçün verir ki, bir misconception / yarım yalan cür var.
Biz sizə ki, siz yaddaş ayrılması zaman
ki, dəyişən üçün RAM bəzi yığın ayrılması edirik.
Amma həqiqətən birbaşa proqramları heç RAM aid deyilik.
Siz düşünüyorsanız, necə çəkdi -
Siz gdb vasitəsilə getmək əgər həqiqətən, eyni şey görəcəksiniz.
Asılı olmayaraq sizin proqram və ya yürütüyorsanız hansı proqram çalıştırmak neçə dəfə
yığını həmişə başlamaq niyyətindədir -
həmişə ünvan oxbffff bir şey ətrafında dəyişənlərin görmək olacaq.
Bu bölgədə bir yerdə adətən var.
Amma necə 2 proqramları bəlkə eyni xatirəsinə göstəricilərinə ola bilər?
[Tələbə] oxbfff RAM haqqında ehtimal yerləşir bəzi özbaşına təyin var
əslində funksiyası adlanır zaman asılı olaraq müxtəlif yerlərdə ola bilər.
Bəli. Müddəti virtual yaddaş.
Bu ideya ki, hər bir proses, bilgisayarınızda çalışan hər bir proqram
öz var - tamamilə müstəqil ünvan space - Gəlin 32 bit daşımır.
Bu ünvan sahibidir.
Bu istifadə etmək üçün öz tamamilə müstəqil 4 gigabayt var.
>> Siz eyni zamanda 2 proqramları çalıştırmak Belə ki, bu proqram özünü 4 gigabayt görür
Bu proqram, özünü 4 gigabayt görür
və bu proqram üçün dereference bir pointer mümkün deyil
və bu proqram yaddaş ilə son.
Və nə virtual yaddaş bir proseslərin ünvan kosmik bir harita edir
RAM faktiki şeylər.
Belə ki, bilirik ki, sizin əməliyyat sistemi var,
hey, bu oğlan dereferences göstərici oxbfff ki, həqiqətən deməkdir
o RAM byte 1000, istəyir ki,
halbuki bu proqram dereferences oxbfff, əgər o, həqiqətən RAM byte 10000 istəyir.
Onlar özbaşına qədər ayrı ola bilər.
Bu bir proseslərin ünvan məkanının şeyi hətta doğrudur.
Belə ki, kimi özünü bütün 4 gigabayt görür, amma demək edək -
[Tələbə] hər bir proses mu -
Gəlin siz RAM yalnız 4 gigabayt ilə kompüter demək.
Hər bir proses bütün 4 gigabayt görür? >> Bəli.
Amma görür 4 gigabayt bir yalandır.
Bu, sadəcə onu hər hansı digər proses var bilmir, çünki bütün bu yaddaş var düşünür edir.
Həqiqətən ehtiyacı yalnız çox yaddaş istifadə edir.
Əməliyyat sistemi bu prosesi RAM vermək niyyətində deyil
bu bütün regionda hər hansı bir yaddaş istifadə əgər.
Bu ki, region üçün yaddaş verəcəyəm deyil.
Amma fikir ki, - mən hesab çalışıram - Mən analogiya hesab edə bilməz.
Analogiya çətindir.
Virtual yaddaş məsələlərdən biri və ya həll edir hər bir
proseslər bir-birinə tamamilə xəbərsiz olsun.
Və siz hər hansı bir proqram yazmaq olar ki, yalnız dereferences heç bir göstərici,
yalnız * (ox1234) deyir ki, bir proqram yazmaq istəyirəm
və ki dereferencing yaddaş ünvan 1234.
>> Amma sonra nə 1234 vasitəsilə tərcümə əməliyyat sistemi var.
Belə ki, əgər 1234, bu proses üçün etibarlı yaddaş ünvan olur
bu yığını və ya bir şey var kimi, bu yaddaş ünvan dəyəri qayıdacaq
qədər proses bilir.
Bu torpaq olur kimi Lakin, əgər 1234, cari mail deyil
yığını kənarda ki, burada yaddaş bəzi parça və yığın kənarda
və həqiqətən segfaults kimi şeylər almaq zaman ki, sonra ki istifadə etməyib
sizə aid edilməməlidir yaddaş aid etdiyiniz çünki.
Bu da doğru deyil -
A 32-bit sistemi 32 bit bir yaddaş ünvan müəyyən etmək üçün 32 bit var deməkdir.
Və ya 4 bayt - göstəricilərinə 8 bayt niyə 32 bit 8 bayt çünki bu.
Pointers 4 bayt var.
Beləliklə, siz oxbfffff kimi bir pointer görəndə ki, -
Hər hansı bir proqram çərçivəsində yalnız hər hansı bir ixtiyari pointer tikintisi bilər
yerdə ox0 olan öküz 8 f's üçün - ffffffff.
[Tələbə] Əgər onlar 4 bayt edirik demədimmi? >> Bəli.
[Tələbə] Sonra hər bayt olacaq - >> [Bowden] hexadecimal.
Hexadecimal - 5, 6, 7, 8. Göstəricilərinə Beləliklə, siz həmişə hexadecimal görmək olacaq.
Bu göstəricilər təsnif necə yalnız var.
Hexadecimal hər 2 rəqəm 1 byte edir.
Belə ki, 4 bayt 8 hexadecimal rəqəm olmalıdır olacaq.
Belə ki, bir 32-bit sistem hər bir pointer, 4 bayt olacaq
sizin prosesində hər hansı bir ixtiyari 4 bayt tikintisi o deməkdir ki,
və bu, bir pointer həyata
olan qədər onu xəbərdar kimi, bu, yaddaş, 32 bayt bütün 2 müraciət edə bilərsiniz.
Həqiqətən ki, çıxışı yoxdur baxmayaraq,
kompüter yalnız 512 megabayt olsa da, bu, çox yaddaş var düşünür.
Və əməliyyat sistemi yalnız siz həqiqətən ehtiyac nə ayıracaq ki, kifayət qədər ağıllı deyil.
4 gigs: Bu yalnız, oh, bir yeni prosesi getmir.
>> Bəli. >> [Tələbə] Bu öküz nə deməkdir? Niyə yazmaq edirsiniz?
Bu yalnız hexadecimal üçün rəmzi var.
Siz öküz ilə bir sıra start gördükdə, ardıcıl şeyi hexadecimal var.
[Tələbə] Siz proqram başa zaman nə haqqında izah edilmişdir. >> Bəli.
Nə proqram başa olur əməliyyat sistemi
yalnız erases bu URL malikdir və bu ki mappings.
Əməliyyat sistemi yalnız istifadə başqa bir proqram üçün yaddaş verə bilər.
[Tələbə] Okay.
Beləliklə, siz yığın və ya yığını və ya qlobal dəyişənlər və ya bir şey haqqında bir şey ayıra zaman,
onlar yalnız qısa müddətdə proqram sona kimi yox
əməliyyat sistemi hər hansı digər proses üçün yaddaş vermək pulsuz edir.
[Tələbə] yazılı dəyərləri hələ yəqin ki, var olsa? >> Bəli.
Dəyərləri hələ ehtimal var.
Bu, sadəcə onları əldə etmək çətin olacaq edir.
Bir silinmiş fayl əldə etmək daha onlara almaq üçün daha çətin
və silinmiş fayl cür uzun müddət orada oturur və sabit bir çox böyükdür, çünki.
Belə ki, yaddaş müxtəlif üzerine olacaq
bu fayl olmaq üçün istifadə yaddaş yığın üzerine olur əvvəl.
Amma əsas yaddaş, daha sürətli bir çox vasitəsilə dövrü RAM,
belə ki, çox sürətlə üzerine olacaq.
Bu və ya başqa bir şey Suallar?
[Tələbə] Mən fərqli bir mövzu haqqında suallarınız var. Okay. >>
Hər kəs bu barədə sualınız varmı?
>> Okay. Müxtəlif mövzu. >> [Tələbə] Okay.
Mən təcrübə testlər bəzi keçir edilib
və onlardan biri bu sizeof haqqında söhbət
və dəyəri qaytarır və ya müxtəlif dəyişən növ edir. >> Bəli.
Və int və uzun həm qaytarılması 4, həm onlar, həm də 4 bayt uzun olduğunu bildirib.
Bir int və uzun arasında fərq var, ya da eyni şeydir?
Bəli, bir fərq var.
C standart -
Yəqin ki, mess qədər gedirəm.
C standart yalnız C, C. rəsmi sənədləri nə istəyirəm edir
Bu deyir.
Belə ki, C standart yalnız bir char əbədi və həmişə 1 byte olacaq deyir.
Bundan sonra hər şey - qısa bir zaman yalnız və ya daha çox bir char bərabər olan kimi müəyyən edir.
Bu ciddi daha çox, lakin müsbət ola bilər.
Bir int yalnız və ya daha çox qısa bərabər olan kimi müəyyən edilir.
Və uzun yalnız və ya daha çox bir int bərabər olan kimi müəyyən edilir.
Və uzun uzun və ya daha çox uzun bərabərdir.
Belə ki, C standart müəyyən tək şey hər şey nisbi Siparişinizi edir.
Şeyi almaq yaddaş faktiki məbləği qədər həyata keçirilməsi adətən
lakin bu, olduqca bu nöqtədə müəyyən edir. >> [Tələbə] Okay.
Belə ki, şort həmişə 2 bytes olacaq.
Ints həmişə 4 bayt olacaq.
Uzun longs demək olar ki, həmişə 8 bayt olacaq.
Və siz bir 32-bit və ya 64-bit sistemi kullanıyorsanız asılıdır, longs.
Belə ki, uzun bir sistem növü uyğun gedir.
Siz Aracı kimi bir 32-bit sistemi istifadə edirsinizsə, 4 bayt olacaq.
Siz son kompüter bir çox kimi 64-bit istifadə edirsinizsə, bu, 8 bayt olacaq.
>> Ints demək olar ki, həmişə bu nöqtədə 4 bayt var.
Uzun longs demək olar ki, həmişə 8 bayt var.
Keçmişdə ints yalnız 2 bytes olmaq üçün istifadə.
Amma bu tamamilə daha çox və bərabər bu münasibətlərin bütün cavab fark.
Belə ki, uzun mükəmməl bir tam kimi eyni ölçüdə ola bilər,
və bu da uzun uzun eyni ölçüsü icazə var.
Və yalnız belə sistemlərinin 99.999%, o, bərabər olacaq ki olur
bir int və ya uzun uzun ya. Bu, yalnız 32-bit və ya 64-bit asılıdır. >> [Tələbə] Okay.
Üzüb gedirdi ildə bit baxımından nəzərdə tutulmuş kəsir necə?
Binar kimi istəyirsiniz? >> Bəli.
Siz CS50 ki, bilmək lazım deyil.
Siz hətta 61-ci olduğunu öyrənmək deyil.
Siz hər hansı bir kurs ki, həqiqətən öyrənmək deyil.
Bu yalnız bir təmsil edir.
Mən dəqiq bit ayırmalar unutmayın.
Üzən point ideyası siz təmsil bit müəyyən sayda ayrılması ki -
Ümumiyyətlə, hər şey elmi notation edir.
Beləliklə, siz 1,2345 kimi sayını özü təmsil bit müəyyən sayda ayırırlar.
Mən 5-dən çox rəqəm bir sayı təmsil bilməz.
Bu kimi çalışır ki, Sonra da bit müəyyən sayda ayrılması
ki, siz ola bilər ən böyük göstərici deyil kimi, yalnız müəyyən qədər getmək olar,
və yalnız müəyyən bir eksponent enmək bilər
siz ola bilər ən kiçik eksponent ki, istəyirəm.
>> Mən dəqiq şəkildə bit bu dəyərlərin bütün verilir xatırlamıram
lakin bit sayı müəyyən, 1,2345 həsr olunur
bit başqa müəyyən sayı, eksponent həsr olunur
və müəyyən bir ölçüsü bir eksponent təmsil yalnız mümkündür.
[Tələbə] Və ikiqat? Ki, əlavə uzun float kimi? >> Bəli.
İndi yerine 4 bayt 8 bayt istifadə etdiyiniz başqa bir float kimi eyni şey.
İndi, 9 rəqəm və ya 10 rəqəm istifadə edə bilərsiniz
və bu 300 yerinə 100-ə getmək mümkün olacaq. >> [Tələbə] Okay.
Və üzüb gedirdi də 4 bayt var. >> Bəli.
Bəli, yenə, bu, yəqin ki, ümumi həyata keçirilməsi üzrə ümumi asılıdır
lakin üzüb gedirdi 4 bayt var, ikiqat 8 olunur.
Onlar ikiqat üzüb gedirdi həcmi çünki Çiftler ikiqat deyilir.
[Tələbə] Okay. Və ikiqat iki olunur? >> Yoxdur.
Mən hesab edirəm - uzun longs Bəyəndim >> [tələbə]? >> Bəli. Mən belə düşünmürəm. Bəli.
Keçən il test On [tələbə] əsas funksiyası haqqında bir sual idi
proqram hissəsi olan.
Cavab sizin proqram hissəsi mövcut deyil idi.
Nə vəziyyətdə? Mən gördüm budur.
[Bowden] Görünür - >> [tələbə] nə vəziyyətdə?
Siz problem var? >> [Tələbə] Bəli, Mən mütləq onu qoparmaq bilər.
Bu texniki, olmaq deyil, əsasən bu olacaq.
[Tələbə] Mən fərqli bir il bir gördüm.
Bu doğru və ya yalan kimi olmuşdur: A qüvvədə - >> Oh, bir c faylı.?
. [Tələbə] Hər c faylı olmalıdır - [dəfə danışan hər ikisi - anlaşılmaz]
Okay. Belə ki, ayrı-ayrı deyil.
>> A. C fayl yalnız funksiyaları ehtiva etməlidir.
Siz maşın kodu daxil fayl, ikili, nə olursa olsun, tərtib edə bilərsiniz
olmadan hələ çalıştırılabilir olan.
Cari çalıştırılabilir bir əsas funksiyası olmalıdır.
Siz 100 1 fayl funksiyaları, lakin heç bir əsas yaza bilərsiniz
və sonra, ikili ki, aşağı tərtib
sonra yalnız əsas var ki, başqa bir fayl yazmaq lakin bu funksiyaları bir dəstə çağırır
burada bu ikili fayl.
Və belə yürütülebilir edirik zaman ki, Linker nə var
bu 2 ikili faylları çalıştırılabilir daxil birləşdirir olunur.
Belə ki, bir. C fayl bütün əsas funksiyası lazımdır deyil.
Və böyük kodu əsaslarla siz. C faylları və 1 əsas fayl minlərlə görəcəksiniz.
Ətraflı suallar?
[Tələbə] başqa bir sual var idi.
Bu etmək bir compiler bildirib. Doğru və ya yalan?
Və cavab yalan idi və bu cingilti kimi deyil nə başa düşülür.
Amma biz bunu deyil əgər etmək nə zəng edirsiniz?
Etmək yalnız əsasən - Mən onu çağırır dəqiq nə edə bilərsiniz.
Amma bu yalnız əmrləri çalışır.
Olun.
Mən bu qoparmaq bilər. Bəli.
Oh, evet. Etmək də yoxdur.
Bu markası kommunal məqsədi avtomatik müəyyən etmək üçün deyir
böyük bir proqram ədəd recompiled lazım olan
və onlara derleyeceğiz üçün əmrləri vermək.
Siz tamamilə böyük faylları etmək edə bilərsiniz.
Olun, biz əvvəlki kimi, faylları vaxt stamps baxır və
Siz fərdi faylları aşağı tərtib edə bilərsiniz və siz Linker almaq qədər deyil
onlar bir yürütülebilir daxil araya etdiyiniz.
Siz 10 müxtəlif fayllar var və siz onlardan 1-bir dəyişiklik əgər
sonra nə edə bilərəm gedir yalnız yeniden derlemeyle ki, 1 fayl
və sonra birlikdə hər şey relink.
Amma daha çox dumber var.
Bu tamamilə ki, bunu etmək lazımdır nə olduğunu müəyyən etmək üçün sizə var.
Bu mənim, bu vaxt möhürü məhsulları tanımaq imkanı var
lakin bir şey etmək bir markası fayl yaza bilərsiniz.
Siz yaza bilər bir fayl etmək ki, siz yalnız cd-nin başqa bir dizine etmək yazın zaman.
Mən incidir əldə edilib mən tack hər şey mənim Aracı daxilində çünki
və sonra mən Mac PDF bilərsiniz.
>> Mən Finder getmək və mən dön yoxdur bilər, Server qoşulmaq
və mən qoşulmaq server mənim Aracı, sonra mən PDF açmaq
ki, lateks tərəfindən tərtib edilir.
Amma incidir əldə edilib Mən PDF yenilemek üçün lazım olan hər bir vaxt, çünki
Mən gedə bilər ki, müəyyən bir kataloq kopyalamak üçün idi
və annoying əldə edilib.
Belə ki, əvəzinə mən onu şeyi edir necə müəyyən etmək olan bir markası fayl yazdı.
Siz etmək necə PDF lateks edir.
Hər hansı digər markası fayl kimi - və ya sizə markası faylları görməmişik tapmaq,
lakin biz Aracı yalnız deyir ki, qlobal markası fayl var
Bir C fayl tərtib edildikdə, cingilti istifadə edin.
Və burada markası fayl Mən demək ki,
Bu faylı PDF lateks ilə tərtib etmək istəyirəm olacaq.
Və bu tərtibi edir ki, PDF lateks var.
Olun tərtib deyil. Bu, sadəcə mən göstərilən ardıcıllıqla bu əmrləri çalışan edir.
Belə ki, PDF lateks çalışır ki, mən bu kopyalanır istədiyiniz qovluğu üçün nüsxə
bu cd nin kataloq və başqa şeylər edir
lakin bunu bütün bir fayl dəyişikliklər tanımaq olunur
bu dəyişikliklər, əgər, o, run etməli olan əmrləri davam edəcək
zaman fayl dəyişikliklər. >> [Tələbə] Okay.
Mən qlobal markası faylları mənə kontrol üçün olduğu bilmirəm.
Digər suallar? Keçmişdən şey viktorina? Hər hansı bir pointer şeylər?
Kimi göstəricilər ilə incə şey var -
Mən bu barədə bir viktorina sual tapa olacaq deyiləm -
ancaq şey bu cür kimi.
Mən deyəndə ki, siz başa əmin olun int * x * y -
Bu, məhz burada bir şey deyil, hərhalda.
Amma kimi * x * y, o yığını olan 2 dəyişənlər var.
Mən deyəndə x = malloc (sizeof (int)), x, hələ yığını üzrə dəyişir
malloc yığın artıq bir blok və biz yığın x point qarşılaşdıqda.
>> Yığın üçün yığını xal bir şey idi.
Zaman malloc bir şey varsa, siz qaçılmaz bir pointer daxilində saxlanılması edirik.
Ki, pointer yığını olduğunu Belə ki, malloced bloku yığın edir.
Bir çox qarışıq almaq və demək int * x = malloc; x yığın edir.
X işarə nə saylı yığın edir.
hər hansı səbəbdən siz x qlobal dəyişən ola halda x özü, yığını deyil
bu halda yaddaş bir bölgədə olmaq olur.
Track saxlanılması Belə ki, bu qutu və arrow diaqramlardan viktorina üçün olduqca eynidir.
Bu viktorina 0 bağlı deyil və ya əgər bu viktorina 1 olacaq.
Siz tərtib addımlar bütün bu bilməlidir
bu barədə suallara cavab idi-ci ildən. Bəli.
[Tələbə] biz bu addımlar artıq getmək bilər - >> Sure.
Addımlar və tərtib əvvəl biz preprocessing var
, tərtib quraşdırma və əlaqələndirilməsi.
Preprocessing. O nə edir?
Bu asan addım - də deyil, kimi -
ki, açıq-aydın olmalıdır demək deyil, lakin bu asan addım var.
Siz uşaqlar bunu özünüz həyata bilər. Bəli.
[Tələbə] nə sizin bu kimi daxil edin və nüsxə və sonra da müəyyən edir.
O, # daxildir kimi şeylər üçün görünür və # müəyyən
və yalnız surətləri və pastalar o həqiqətən nə demək.
Beləliklə, siz # cs50.h daxildir demək zaman, preprocessor çıxarmaq və cs50.h sovuşdurmaq olunur
o xəttə.
Siz # 4 x müəyyən demək zaman, preprocessor bütün proqram keçir
və 4 x bütün hallarda əvəz edir.
Belə ki, preprocessor cari C fayl edir və etibarlı C fayl nəticələri
Ü şeyi kopyalanamaz və yapışdırılır edilmişdir.
İndi tərtib. O nə edir?
[Tələbə] Bu C ikili gedir.
>> [Bowden] Bu ikili bütün yol getmək deyil.
[Tələbə] maşın kodu To sonra? >> Bu maşın kodu deyil.
[Tələbə] Assambleyası? >> Assambleyasının.
O C kodu bütün yol gedir əvvəl Assambleyasının gedir,
və ən languages ​​bu kimi bir şey yoxdur.
Hər hansı yüksək səviyyəli dil seçin, siz tərtib olacaq əgər,
bu addımlar tərtib bilər.
İlk növbədə C Python tərtib olacaq, o, Məclis C tərtib olacaq
və sonra Assambleyasının ikili tərcümə almaq üçün gedir.
Belə ki, tərtib C Assambleyasının çatdırmaq niyyətindədir.
Tərtib sözü adətən daha yüksək səviyyədə onu gətirilməsi deməkdir
aşağı səviyyəli proqramlaşdırma dili.
Belə ki, bu yüksək səviyyəli dil ilə başlamaq yerləşir tərtib yeganə addım
və aşağı səviyyəli dil başa və addım tərtib adlanır edirdi.
Tərtib zamanı [tələbə], sizə # daxil etdik ki, qoy cs50.h.
Derleyiciyi yeniden derlemeyle olan cs50.h Will, orada olan funksiyaları kimi,
və, həmçinin ki Assambleyasının kodu tərcümə
və ya pre-Assambleyası oldu ki, bir şey seçin və yapışdırıb olacaq?
cs50.h olduqca çox Assambleyası sona heç vaxt.
Funksiyası prototipləri və əşyalar kimi Stuff siz ehtiyatlı olmaq yalnız üçün.
Bu funksiyaları zəng etdiyiniz kimi compiler şeyi kontrol edə bilərsiniz ki təminat
doğru geri növləri və sağ dəlilləri və məhsulları ilə.
>> Bu tərtib edir Belə ki, cs50.h sonra fayla preprocessed ediləcək
hər şeyi düzgün adlanan əmin edir sonra əsasən atılmalıdır edir.
Amma CS50 kitabxana müəyyən funksiyaları, cs50.h ayrı olan
o ayrı-ayrılıqda tərtib edəcək.
Əslində birləşdirən addım aşağı olacaq ki, biz ikinci olduğu almaq lazımdır.
Lakin ilk, nə montaj edilir?
Binar üçün [tələbə] Assambleyası? >> Bəli.
Montaj.
Məclis olduqca çox ikili bir təmiz tərcümə Çünki Biz onu tərtib demirik.
Assambleyasının ikili gedən çox az məntiq var.
Bu, sadəcə bir masa qədər axtarır istəyirəm ki, oh, biz bu təlimat var;
olan ikili 01110 uyğundur.
Və belə faylları çıxış edir, ümumiyyətlə, montaj. O faylları.
Və. O faylları biz əvvəl deyirdilər nə var,
necə bir fayl bir əsas funksiyası üçün lazım deyil.
Hər hansı bir faylı cari C fayl kimi uzun kimi. O fayl aşağı tərtib edilə bilər.
Bu. O aşağı tərtib edilə bilər.
İndi keçid. Həqiqətən bir dəstə gətirir nə o faylları və bir yürütülebilir onları gətirir.
Və nə linking yoxdur bir. O fayl kimi CS50 kitabxana hesab bilər.
Bu artıq tərtib ikili fayl.
Və belə GetString çağırır olan fayl, sizin hello.c, tərtib edərkən
hello.c, hello.o aşağı tərtib olur
hello.o ikili indi.
Bu GetString istifadə edir, belə ki, cs50.o artıq getmək lazımdır
və Linker birlikdə onlara smooshes və bu fayla GetString nüsxə
və ehtiyacı bütün funksiyaları olan bir yürütülebilir ilə çıxır.
Belə cs50.o həqiqətən bir O faylı deyil, lakin heç bir əsaslı fərq var ki, yaxın kifayətdir.
Belə ki, yalnız birləşdirən birlikdə faylları bir qom gətirir
ayrı funksiyaları bütün ehtiva mən istifadə etmək lazımdır
və həqiqətən davam edəcək yürütülebilir yaradır.
>> Və belə ki, əvvəl deyirdilər nə də var
1000 ola bilər yerləşir. c faylları, onları sizə bütün tərtib edir. o faylları,
yəqin ki, bir müddət davam edəcək, sonra 1 dəyişir. c faylı.
Siz yalnız 1. C fayl və sonra başqa relink hər derleyeceğiz lazımdır
geri birlikdə hər şey bağlayırlar.
[Tələbə] biz lcs50 yazmaq bağlıyoruz zaman?
Bəli, belə lcs50. Əgər kitabxana keçid etmək lazımdır ki, Linker ki, bayraq siqnalları.
Suallar?
Biz ilk mühazirə ki, 5 saniyə-dən başqa bir ikili üzərində getdi?
Mən belə düşünmürəm.
Siz, biz artıq getdi etdiyiniz böyük Os bütün bilməlidir
biz bir funksiyası verdi, əgər siz, lazımdır
siz təxminən, böyük O demək lazımdır. Və ya yaxşı, böyük O kobuddur.
Şeyi eyni sayda üzərində loop loops üçün iç içə görmək əgər,
>> [tələbə] n kare - int j, j <n; int i, i > O kvadrat ola n çalışır.
Siz üç iç içə varsa, bu n Cubed olmağa çalışır.
Belə şey ki, sort dərhal qeyd etmək lazımdır.
Siz daxil sort və bubble sırala bilirik və sort və hamısı daxil etmək lazımdır.
Onlar n kare və n log n və ki, bütün var nə anlamaq üçün asan
Mən biz əsasən verdi bir il viktorina var idi, çünki
bubble cür icra və "bu funksiya çalışan zaman nədir?" dedi
Siz bubble sırala kimi tanınması Beləliklə, əgər, sonra dərhal n kvadrat demək olar.
Yalnız baxmaq Lakin, hətta bu bubble sırala həyata ehtiyac yoxdur;
yalnız bu və bunu deyə bilər. Bu kvadrat n.
[Tələbə] sizə gələ bilər hər hansı sərt nümunələri var,
həyata figuring bir oxşar fikir kimi?
>> Mən sizə hər hansı sərt nümunələr verəcək düşünmürəm.
Bubble sırala şey getmək kimi haqqında kimi sərt deyil
və hətta kimi uzun siz anlamaq kimi serialın üzərində iterating edirik ki,
serialın hər element üçün, bu kvadrat n ki, bir şey olacaq.
Biz burada kimi ümumi suallar var - Oh.
Sadəcə, digər gün, Doug iddia, "Mən bir sıra sort edə bilər ki, bir alqoritm icad
"O (Giriş n) vaxt! Ildə n sayda"
Belə ki, necə ki, mümkün deyil bilirik?
[Işitilemez tələbə cavab] >> Bəli.
Ən azı, siz array hər element toxunmaq var
belə ki, bir sıra sort mümkün deyil -
Hər şey çeşidlənməmiş üçün, onda siz array hər şeyi aid etmək olacaq
belə n Ey az bunu mümkün deyil.
[Tələbə] Siz bizə n O bunu edə ki, misal göstərdi
yaddaş çox istifadə edin. >> Bəli.
Və that's - Mən that's nə unutmaq - bu cür hesablanması mı?
Hmm. Yəni tam çeşidlənməsi alqoritm edir.
Mən keçən həftə xatırlayıram ki, bunun üçün xüsusi ad axtarırdı.
Bəli. Bu n böyük O şeyi yerinə yetirmək olar ki, növ növ var.
Yalnız müəyyən bir sıra integers qədər istifadə edə bilərsiniz kimi Lakin məhdudiyyətlər var.
Plus bir şey that's düzmək üçün çalışdığınız halda -
Sizin array 012, -12, 151, 4 milyon Əgər
o vahid element tamamilə bütün çeşidlənməsi məhv edir.
>> Suallar?
[Tələbə] Siz rekursiv funksiya və yalnız recursive zənglər edərsə
geri hesabatda ki, quyruq recursive var
və ki, iş zamanı daha çox yaddaş istifadə deyil
bir həll iterativ kimi və ya ən azı müqayisə yaddaş istifadə edir?
[Bowden] Bəli.
Bu ehtimal bir qədər aşağı, amma həqiqətən. Olardı
Recursive Tail olduqca yaxşı.
Yığını çərçivəsində yenidən baxaraq, qoy biz əsas var demək
və biz int bar (int x) və ya bir şey var.
Bu mükəmməl recursive funksiyası deyil, geri bar (x - 1).
Belə ki, açıq-aydın, bu flawed edir. Siz baza hallarda və stuff lazımdır.
Lakin burada fikir, bu recursive quyruq ki,
bu onun yığını çərçivəsində olacaq zaman əsas zənglər bar deməkdir.
Bu yığını çərçivəsində yaddaş bir az blok olmasına olacaq
onun dəlil x uyğundur.
Və belə edək əsas bar (100) zəng etmək olur demək;
Belə x 100 kimi həyata başlamaq niyyətindədir.
Derleyiciyi bu, quyruq recursive funksiyanın tanıyarsa
bar, onun recursive zəng bar edir sonra zaman
əvəzinə yığını əsasən artan başlayır Ü olan yeni yığını çərçivəsində edilməsi,
nəticədə bu yığın daxil olacaq və sonra segfaults almaq
yaddaş colliding başlayır, çünki.
>> Əvəzinə öz yığını çərçivəsində qəbul Belə ki, o, həyata keçirə bilər
hey, mən, həqiqətən, bu yığını çərçivəsində qayıtmaq lazımdır heç
əvəzinə yalnız 99 ilə bu arqument dəyişdirmək və sonra bar bütün başlarsınız.
, - (1 x) sonra yenə bunu edəcək və geri bar çatacaq
və əvəzinə yeni yığını çərçivəsində edilməsi, yalnız 98 ilə cari dəlil əvəz edəcək
və sonra bar çox əvvəlinə geri jump.
Həmin əməliyyatlar, yığın ki, 1 dəyər əvəz və əvvəlinə geri jumping,
olduqca səmərəli edir.
Belə ki, təkcə bu iterativ olan ayrı-ayrı funksiyası eyni yaddaş istifadə edir
yalnız 1 yığını çərçivəsində istifadə edirsinizsə, ancaq downsides çəkən deyilik, çünki
funksiyaları zəng üçün olan.
Bütün bu quraşdırma nə var, çünki Zəng funksiyaları qədər bahalı ola bilər
və teardown və bütün bu stuff.
Beləliklə, bu quyruq recursion yaxşıdır.
[Tələbə] Nə üçün yeni addımlar yaratmaq deyil?
Bu həyata Çünki bu lazım deyil.
Bar üçün zəng yalnız recursive zəng qayıdır.
Belə ki qaytarılması dəyəri bir şey etmək lazım deyil.
Bu, sadəcə dərhal geri olacaq.
Belə ki, yalnız öz arqumenti əvəz və yuxarı başlamaq olacaq.
Həmçinin, siz quyruq recursive versiyası yoxsa,
sonra bu bar qaytarır zaman bütün bu bar almaq
bu bar dərhal geri sonra, bu onun dəyəri qayıtmaq üçün var
və bu bir dəyəri qaytarır, o, yalnız dərhal geri olacaq
və bu bir dəyəri geri.
Beləliklə, siz yığını bu şeyi bütün off yaratma bu qənaət edirik
qaytarılması dəyəri hər halda geri bütün yolu keçmişdir olacaq ildən.
Belə ki, niyə yalnız yenilənir arqumenti ilə mübahisə əvəz və yuxarı başlamaq deyil?
- Sizin kimi bir şey varsa funksiyası, quyruq recursive deyil
[Tələbə] əgər bar (x + 1). >> Bəli.
>> Siz vəziyyətdə qoymaq Əgər, sonra qaytarılması dəyəri bir şey edirik.
Yoxsa yalnız qaytarılması 2 bile * bar (x - 1).
Belə ki, indi bar - 2 dəfə dəyərini hesablamaq üçün (x 1), üçün qayıtmaq lazımdır
İndi o, öz ayrı-ayrı yığını çərçivəsində ehtiyac yoxdur
və indi cəhd necə ağır olursa olsun, sizə lazım olacaq -
Bu recursive quyruq deyil.
[Tələbə] Mən bir quyruq recursion üçün məqsəd bir recursion gətirmək üçün cəhd istəyirsiniz -
[Bowden] ideal dünyada, lakin CS50 sizə yoxdur.
Quyruq recursion almaq üçün, ümumiyyətlə, bir əlavə dəlil qurmaq
bar y daxil int x edəcəyi
və y geri istədiyiniz son şey uyğundur.
(1 - x), 2 * y Beləliklə bu bar qaytarılması üçün olacaq.
Yalnız belə bir yüksək səviyyəli şeyi quyruq recursive olmaq çevirmək necə.
Lakin əlavə arqument -
Və sonra sonunda sizin baza halda çatdıqda, yalnız y qayıtmaq
Siz bütün vaxt istədiyiniz qaytarılması dəyəri yığılan etdik çünki.
Siz cür iteratively bunu ancaq recursive zənglər istifadə edilmişdir.
Suallar?
Strings istifadə edərkən kimi Bəlkə göstərici hesab haqqında [tələbə]. >> Sure.
Pointer hesab.
Strings char ulduz çünki strings istifadə edərkən, bu, asan
Sandıqı, əbədi və daim bir byte var
və belə göstərici hesab siz strings ilə məşğul olduğunuz zaman müntəzəm hesab bərabərdir.
Gəlin yalnız char * s = "salam" deyirlər.
Beləliklə, biz yaddaş blok var.
Her zaman null terminator lazımdır, çünki 6 bytes lazımdır.
Və char * s bu serialın əvvəlində qeyd edir.
Beləliklə s orada göstərir.
İndi, bu, əsasən hər hansı bir sıra işləri necə
asılı olmayaraq malloc ya bu yığını var olub geri idi olub.
Hər dizi, əsasən serialın başlanmasına bir göstəricisidir
və sonra heç bir array əməliyyat, hər hansı endeksleme, yalnız müəyyən bir ofset ki massivinə gedir.
>> Mən s [3] kimi bir şey deyəndə, bu s gedir və içəri 3 chars hesablanması edir
Belə ki, s [3], biz 0 var, 1, 2, 3, belə s [3] Bu l müraciət edir.
[Tələbə] Və s + 3 etdiyini və sonra mötərizədə ulduz eyni dəyər çata bilər?
Bəli.
Bu * (s + 3) bərabərdir;
və əbədi və daim ekvivalent siz nə məsələdir.
Siz bracket sintaksis istifadə etmək lazımdır heç vaxt.
Siz həmişə (s + 3) sintaksis olan * istifadə edə bilərsiniz.
İnsanlar da, bracket sintaksis kimi edirlər.
[Tələbə] Belə bütün Diziler yalnız faktiki göstəricilər var.
Deyə bir cüzi fərq var int x [4] >> [tələbə] ki, yaddaş yaratmaq varmı?
[Bowden] Bu belə 16 bytes ümumilikdə yığını 4 ints yaratmaq niyyətindədir.
Bu yığını 16 bytes yaratmaq olacaq.
x yerdə saxlanılır deyil.
Bu, yalnız bir şey başlanğıc istinad rəmzidir.
Siz, bu funksiya daxilində array elan Çünki
derleyiciyi edəcəyimiz nə yalnız dəyişən x bütün hallarda əvəz olunur
bu 16 bytes qoymaq üçün seçin baş Ü ilə.
S faktiki göstərici çünki char * s ilə bunu edə bilərsiniz.
Daha sonra başqa şeylər qeyd etmək pulsuzdur.
x sabit deyil. Siz müxtəlif array bu nöqtə ola bilməz. >> [Tələbə] Okay.
Amma bu fikir, bu endeksleme, bir ənənəvi array olub asılı olmayaraq eyni
bir şey və ya bir pointer varsa və ya bir malloced array bir göstərici var.
Və əslində, bu, eyni şeydir ki, belə bərabərdir.
Bu, faktiki olaraq yalnız Mötərizədə daxilində nə tərcümə və nə Mötərizədə sol oldu
onlara birlikdə edər və dereferences.
Belə ki, bu kimi etibarlıdır * (s + 3) və ya s [3].
[Tələbə] 2 ölçülü Diziler işarə göstəricilərinə edə bilərəmmi?
>> Bu çətindir. Ənənəvi olaraq, yoxdur.
A 2 ölçülü array yalnız bəzi əlverişli sintaksis ilə 1-ölçülü array edir
çünki mən deyəndə int x [3] [3], bu, həqiqətən 9 dəyərləri ilə yalnız 1 array edir.
Və mən indeksi compiler nə demək bilir.
Mən x [1] [2], mən ikinci sırada getmək istəyirəm bilir, belə ki, ilk 3 keçmək olacaq, demək edin
sonra, belə ki, bu olacaq ki, ikinci şey istəyir.
Amma hələ yalnız bir-ölçülü array edir.
Və mən ki, serialın bir pointer təyin etmək istəyirdi
Mən deyərdim ki, int * p = x;
X növü yalnız -
, Yalnız bir simvol çünki x kobud deyərək növü var və faktiki dəyişən deyil
lakin bu, yalnız bir int * edir.
x yalnız bu başlamasından bir göstəricisidir. >> [Tələbə] Okay.
Və mən [1] [2] daxil olmaq üçün bilməyəcək.
Mən xüsusi sintaksis bir pointer elan üçün var
int kimi gülünc bir şey (* p [-. tamamilə gülünc bir şey mən belə bilmirəm.
Amma parantez və əşyalar kimi göstəricilərinə elan üçün sintaksis var.
Bu da ki, bunu bildirin bilər.
Mən həqiqəti demək ki, bir şey geri baxmaq bilər.
Nöqtəsi üçün bir sintaksis var, mən sonra üçün görünür. Amma siz onu görmək heç vaxt.
Və hətta sintaksis siz istifadə əgər, insanların baffled olunacaq ki, arxaik edir.
Bu kimi Boyutlu serialların olduqca nadirdir.
Olduqca çox Siz -
Siz matrix şeyler edirsinizsə Bəli, bu, nadir olacaq deyil
lakin C siz nadir hallarda çoxölçülü seriallarda istifadə olacaq.
Bəli. >> [Tələbə] Gəlin bir həqiqətən uzun array var deyirlər.
>> Belə ki, virtual yaddaş ki, bütün ardıcıl görünür ki,
bir-birinə doğru növbəti elementləri kimi,
lakin fiziki yaddaş, onu bölmək ki, mümkün ola bilər? >> Bəli.
Yaddaş işləri necə virtual yalnız ayırır -
Bölüşdürülməsi ədəd 4 kilobayttan olmağa çalışır olan bir səhifə deyil,
və belə bir proses deyir zaman, hey, mən bu yaddaş istifadə etmək istədiyiniz
əməliyyat sistemi yaddaş ki, kiçik blok üçün 4 kilobayttan ayırmaq niyyətindədir.
Yalnız yaddaş bütün blok bir az byte, istifadə bile
əməliyyat sistemi tam 4 kilobayttan vermək niyyətindədir.
Belə ki, bu vasitə nə ola bilər - bu mənim yığını demək edək.
Bu yığını ayrıla bilər. Mənim yığını megabayt və megabayt ola bilər.
Mənim yığını böyük ola bilər.
Amma yığını özü fərdi pages bölmək var
bu RAM demək biz burada baxmaq əgər edək,
Mən RAM 2 gigabaytlık varsa, bu, mənim RAM zeroth byte kimi faktiki ünvan 0 deyil
və bu burada 2 gigabaytlık bütün yol aşağı deyil.
Beləliklə, bu səhifə burada bu blok uyğun ola bilər.
Bu səhifə burada bu blok uyğun ola bilər.
Bu burada bu cavab bilər.
Əməliyyat sistemi fiziki yaddaş təyin pulsuz edir
özbaşına hər hansı bir fərdi səhifə etmək.
Və o deməkdir ki, bu sərhəd bir sıra ayaqlarını aralamaq olur, əgər
bir sıra, bu qalmaq olur və hüququ səhifə bu qaydada
o array fiziki yaddaş split olacaq.
Prosesi başa zaman sonra, proqram çıxmaq zaman,
bu mappings silinə almaq və sonra başqa şeylər üçün bu kiçik blokları istifadə etmək pulsuzdur.
Ətraflı suallar?
[Tələbə] Bu göstərici hesab. >> Bəli Oh.
Strings daha asan idi, lakin ints kimi bir şey axtarır
belə geri int x [4];
Bu bir sıra olsun və ya 4 integers bir malloced array bir pointer olsun,
eyni şəkildə müalicə olacaq.
Belə ki, diziler yığın haqqında [tələbə] var?
[Bowden] Diziler yığın haqqında deyil. >> [Tələbə] Oh.
>> [Bowden] array Bu yığını olmaq niyyətindədir
əgər siz bu elan - qlobal dəyişənlər məhəl. Qlobal dəyişənlər istifadə etməyin.
Deyə bir funksiyası daxilində int x [4];
Bu array üçün yığını üzrə 4-tam blok yaratmaq olacaq.
Amma bu malloc (4 * sizeof (int)); yığın getmək niyyətindədir.
Lakin bu nöqtədən sonra mən olduqca çox eyni yolla x və p istifadə edə bilərsiniz
siz p təkrar təyin edə bilərsiniz haqqında əvvəl Mən istisna başqa.
Texniki, onların ölçüləri qədər müxtəlif, lakin tamamilə əlaqəsiz deyil.
Siz, həqiqətən, onların ölçüləri istifadə heç vaxt.
Mən demək olar p p [3] = 2 və ya x [3] = 2;
Siz eyni yolla istifadə edə bilərsiniz.
Indi göstərici hesab - Bəli.
[Tələbə] siz Mötərizədə varsa p * nə yoxdur?
Mötərizədə bir gizli dereference var. Okay. >>
Əslində, həmçinin nə ilə deyərək etdiyiniz siz çoxölçülü serialların əldə edə bilərsiniz
göstəricilər ilə, nə edə bilərsiniz deyək, bir şey kimi, int ** s = malloc (sizeof (int *) * 5);
Mən yalnız bütün ilk yazmaq lazımdır.
Mən bir istəmədi.
Okay.
Burada nə var - That s [i] olmalıdır.
Belə ki, pp bir göstərici bir göstəricisidir.
Siz 5 int ulduz bir sıra qeyd etmək səh mallocing edirik.
Belə yaddaş siz yığını s var
Bu, bütün göstəricilərinə özləri olan 5 blokları bir sıra qeyd etmək olacaq.
Və sonra zaman burada malloc aşağı, mən malloc həmin fərdi göstəricilərinə hər
yığın 4 bayt ayrı bir blok qeyd edilməlidir.
4 bayt Belə ki, bu xal.
Və müxtəlif 4 bayt bu xal.
>> Onların bütün öz 4 bayt qeyd.
Bu mənə çoxölçülü şeyler bir yol verir.
Mən s [3] [4], lakin bu eyni şey deyil çoxölçülü serialların deyə bilər
çoxölçülü serialların tərcümə çünki [3] [4] x massivinə ofset bir daxil.
Bu dereferences p, dereferences sonra, üçüncü index erişen
və girişler - 4 etibarsız olardı - ikinci index.
Halbuki biz idi zaman int x [3] [4] bir çoxölçülü array əvvəl
və bracket ikiqat zaman, həqiqətən, yalnız bir dereference var
, bir göstərici aşağıdakı etdiyiniz və sonra ofset
Bu, həqiqətən 2D istinadlar edir.
Siz 2 ayrı-ayrı göstəricilərinə baxın.
Bu da texniki imkan verir Beləliklə, siz çoxölçülü serialların var
hər fərdi sıra müxtəlif ölçülü edir.
Mən kələ-kötür çoxölçülü seriallarda o deyirlər nə düşünürəm
həqiqətən ilk şey 10 elementlər vardır ki, bir şey qeyd edə bilər-ci ildən,
ikinci şey 100 elementlər vardır ki, bir şey qeyd edə bilər.
[Tələbə] Siz ola bilər göstəricilərinə sayı heç bir limit var
digər göstəricilərinə işarə? >> No
Siz int ***** p ola bilər.
Geri göstərici hesab üçün - >> [tələbə] Oh. >> Bəli.
[Tələbə] Mən sonra int *** p və Əgər mən bir dereferencing etmək və mən p * Bu dəyərinə bərabərdir ki,
yalnız dereferencing 1 səviyyəsi nə olacaq? >> Bəli.
- Mən son göstərici ilə işarə edir ki, şey daxil etmək istədiyiniz Belə ki, əgər
Sonra *** p yoxdur. Okay. >>
Belə ki, bu 1 blok, digər blok bal, başqa bir blok xal p bal.
Siz * əgər Sonra p = başqa bir şey, sonra bu dəyişir
İndi müxtəlif blok qeyd etmək. Okay. >>
>> Bu malloced əgər [Bowden], onda indi yaddaş sızan var
Bu müxtəlif referanslar üçün nə halda
Siz yalnız üz atdı ki, bu isə geri ala bilmir-ci ildən.
Pointer hesab.
int x [4] 4 integers bir sıra ayırmaq niyyətindədir
x serialın əvvəlində qeyd edir yerləşir.
Belə ki, mən x [1] kimi bir şey demək, mən bu serialın ikinci tam getmək demək istəyirəm ki,
bu bir olardı.
Bu tam 4 bayt çəkir Lakin, həqiqətən, ki massivinə 4 bayt var.
1 ofset bir həqiqətən 1 ofset deməkdir Beləliklə
serialın növü hər hansı dəfə ölçüsü.
Bu integers bir sıra edir, belə ki, ofset istəyir zaman int 1 dəfə ölçüsü edə bilir.
Digər sintaksis. Bu * (x + 1) ekvivalent olduğunu unutmayın;
Mən göstərici nə qaytarır göstərici saxlanılması ki ünvanı + 1, deyəndə
plus 1 dəfə pointer növü və ölçüsü.
Belə ki, əgər x = ox100, sonra x + 1 = ox104.
Və bu sui-istifadə və bir şey deyə bilərsiniz char kimi * c = (char *) x;
və indi c x eyni ünvan olacaq.
c, ox100 bərabər olacaq
lakin c + 1 ox101 bərabər olacaq
göstərici hesab siz əlavə olunur ki, pointer növündən asılıdır bəri.
Belə c + 1, bu c baxır, bir char göstərici deyil, belə ki, karakter 1 dəfə ölçüsü əlavə olacaq
olan həmişə 1 olacaq, belə ki, 101 almaq
Mən hələ də 100 olan x, əgər, x + 1 104 olacaq halbuki.
[Tələbə] siz c + + 1 ilə pointer inkişaf üçün istifadə edə bilərəmmi?
Bəli, edə bilər.
X yalnız rəmzidir çünki x ilə edə bilməz, bu, bir sabit deyil, siz x dəyişə bilməz.
>> Lakin c yalnız bir göstərici olur, belə ki, c + + mükəmməl etibarlı və 1 arttırmayı edəcək.
C yalnız bir int * idi, onda c + + 104 olardı.
+ + Edir göstərici hesab kimi c + 1 göstərici hesab edilir ki, var.
Bu əslində birləşmə sort kimi şeylər necə bir çox -
Əvəzində şeyi surətlərini yaratmaq, yerine keçə bilər -
Bu bəzi silmək edək - Mən serialın bu yarım keçmək istəyirdi əgər kimi.
Gəlin bir funksiyası daxil serialın bu yan keçmək istədiyini deyirlər.
Mən ki, fəaliyyət keçmək olar?
Mən x keçmək varsa, bu ünvan keçən edirəm.
Amma bu ünvan keçmək istəyirəm. Mən nə keçməlidir?
[Tələbə] Pointer + 2?
[Bowden] Belə x + 2. Bəli.
Yəni bu ünvan olacaq.
Siz də çox tez-tez kimi görürsünüz x [2] və sonra ki, ünvanı.
Beləliklə, siz bracket bir gizli dereference çünki onun ünvan etmək lazımdır.
x [2], bu qutusuna ki, dəyəri istinad edir, və sonra o qutusu ünvan istəyirəm
belə demək & x [2].
Belə ki, siz bir şey yarım siyahısına keçmək istədiyiniz birləşmə sort necə bir şey var
siz həqiqətən keçmək & x [2], indi kimi uzaq recursive zəng narahat olduğu kimi,
Yeni array orada başlayır.
Son dəqiqə suallar.
[Tələbə] biz bir işareti qoymaq və ya bir deyilsə - nə deyirlər? >> Star?
[Tələbə] Star. >> Texniki dereference operator, ancaq - >> [tələbə] Dereference.
>> Biz bir ulduz və ya bir işareti qoymaq yoxsa sadəcə y desək, nə olar = x və x bir göstəricisidir?
Y növü nədir? >> [Tələbə] Mən yalnız bu göstərici 2 demək lazımdır.
Yalnız demək Əgər y = x, indi x və y nöqtəsi eyni şey. >> Eyni şey üçün [tələbə] Point.
Və x bir int göstərici olur? Siz göstəricilərinə təyin edə bilməz, çünki >> Bu şikayət edirəm.
[Tələbə] Okay.
Biz oxlar kimi cəlb baxmayaraq ki, göstəricilər saxla,
həqiqətən onlar mağaza - int * x - həqiqətən bütün x saxlanılması olunur ox100 kimi bir şeydir
olan 100 saxlanılır blokunun işarə kimi təmsil verir.
Mən deyəndə int * y = x; Mən y daxil ox100 çıxarmaq deyiləm,
olan biz də ox100 işarə edərək, y kimi təmsil olacaq.
Mən demək əgər int i = (int) x, sonra i ox100 dəyəri nə saxlamaq niyyətindədir
bu daxilində, amma artıq yerinə göstərici bir tam kimi təfsir edilə olacaq.
Amma cast lazımdır və ya başqa bu şikayət edəcək.
[Tələbə] Beləliklə, siz salmaq deməkdir -
Bu y x və ya tökmə int və int tökmə olacaq?
[Bowden] nədir?
[Tələbə] Okay. Bu parantez sonra orada bir x və ya orada ay olacaq?
>> [Bowden] Ya. x və y ekvivalent edir. >> [Tələbə] Okay.
Onlar həm göstəricilərinə etdiyiniz çünki. >> Bəli.
[Tələbə] Belə ki, tam şəkildə hexadecimal 100 saxlaya bilər? >> [Bowden] Bəli.
Amma bu işarə hər hansı dəyəri.
[Bowden] Bəli. >> [Tələbə] Belə tam formada yalnız ünvan. Okay.
Bəzi qəribə səbəbdən istədi [Bowden] Əgər
Siz yalnız göstəricilər ilə məşğul və integers ilə məşğul heç vaxt
və yalnız int * x = 0 kimi.
Sonra göstərici hesab baş başlayır bir dəfə həqiqətən qarışıq almaq olacaq.
Onlar mağaza ki nömrələri mənasız edir.
Bu onlara tərcümə sona yalnız nasıl.
Mən, bir int bir int * dən ox100 surəti pulsuz deyiləm
yəqin ki, tökmə üçün də yelled almaq üçün gedir you're - və mən təyin pulsuz Ben -
Mən bu ixtiyari int * daxil (int *) ox1234 kimi bir şey təyin pulsuz deyiləm.
Belə ox123 etibarlı bir yaddaş ünvanı və y yalnız kimi.
Və y olduqca çox ox123 ki, bir şey geri olur.
[Tələbə] ki, hexadecimal olan decimal şəklində getmək üçün həqiqətən cool yol olardı,
bir göstərici Əgər istəyirəm və bir int kimi tökmə?
[Bowden] Siz, həqiqətən, yalnız printf kimi istifadə çap edə bilərsiniz.
Gəlin mən int y = 100 var deyirlər.
Belə printf (% d \ n - Bildiyiniz olmalıdır kimi - çap kimi bir tam,% x.
Biz yalnız hexadecimal kimi çap edəcəyik.
Belə bir göstərici, hexadecimal kimi saxlanılır deyil
və tam decimal kimi saxlanılır deyil.
Hər şey binar kimi saxlanılır.
Bu hexadecimal kimi göstəricilər nümayiş edirlər ki, yalnız var
biz bu 4-byte bloklar şeyi edirəm, çünki
və yaddaş ünvanları tanış olur.
Bu bf ilə başlayır, onda bu yığını olmaq olur, kimi Biz istəyirik.
Belə ki, yalnız hexadecimal kimi göstəricilər bizim şərh edir.
Okay. Hər keçən suallar?
>> Başqa bir şey varsa, sonra bir az burada olacaq.
Və ki, sonunda deyil.
>> [Tələbə] Yay! [Alqış]
>> [CS50.TV]