[MÜZİK OYUN] [VİDEO OYNATMA] -Yalan söylüyor. -Ne hakkında? -Bilmiyorum. Biz ne biliyoruz peki? 9:15, Ray -yani Santoya ATM oldu. -Evet. Yani soru, ne O 9:16 de yapıyordu? Bir şey de 9 milimetre -Shooting. Belki nişancıyı gördü. -Yoksa Onunla çalışıyordu. Bekle. Geri bir gidin. -Ne görüyorsun? Tam ekran yukarı yüzünü getir. -His Gözlük. Bir yansıması -İşte bu. -Bu Nuevitas beyzbol takımı. Bu onların logosu. -Ve Konuştuğu kim o ceketi giyiyor. [SON OYNATMA] DAVID MALAN: Pekala. Bu CS50 ve bu biraz daha ve [duyulamaz] hangi sen sorunu ile dabbling dört set. Bugün biraz daha bakmaya başlar derinden işaretçileri adı verilen bu şeylere, o olsa bile hangi Oldukça gizemli bir konu, o gidiyor çıkıyor aracı olarak hangi biz bina ve montaj başlayabilirsiniz daha karmaşık programlar. Ama biz geçen Çarşamba günü yaptım Önce bazı claymation yoluyla. Yani bu, hatırlama olduğunu Binky ve onu kullanılmış Bir program bakmak için o gerçekten bir şey ilginç yapmadım, ama birkaç problem ortaya yaptı. Peki neden değil yürümek, bugün başlayacak hızlı bir şekilde bu adımların bir kaç aracılığıyla, İnsanın açısından içine damıtmak deneyin tam olarak ne burada oluyor ve neden bu kötü, ve sonra hareket ve aslında bir şey oluşturmaya başlayabilirsiniz Bu teknikle? Peki bu ilk olduğunu Bu programda iki satır ve meslekten olmayan şartlarını, ne Bu iki satır yapıyorsun? Oldukça rahat biri Ne ekranda ilan ediyor ile? Yapıyor bu iki satır nelerdir? Her olmadığını Haftanın tek farklı, ancak bazı yeni özel sembol var. Evet? Geri orada. HEDEF KİTLE: işaretçiler bildirmek? DAVID MALAN: Tekrar söyle? HEDEF KİTLE: işaretçiler bildirmek? DAVID MALAN: bildirmek işaretçileri ve en biraz daha rafine edelim. HEDEF KİTLE: [duyulamaz] adres, x ve y sonra. DAVID MALAN: Ve sonra adres. Yani özellikle biz ne yapıyoruz Biz iki değişken bildirmek edilir. Bu değişkenler, olsa da, gidiyoruz türü int yıldızın, olmak için hangi daha spesifik olarak ifade Onlar saklamak için gidiyoruz bir int adresi, sırasıyla x ve y. Şu anda herhangi bir değerler vardır? Bu herhangi bir fiili adresleri var mı zaman içinde bu noktada iki değişken? Hayır. Bu sadece çöp değerleri sözde var. Aslında bir atamazsanız RAM oldu ne olursa olsun, değişken, Daha önce sıfırlarla doldurmak için gidiyor ve olanlar bu değişkenlerin her ikisi de. Ama biz henüz bilmiyoruz ne olduklarını ve işte Neden Binky anahtarı olacak Geçen hafta başını kaybetti. Yani bu claymation oldu Bu enkarnasyonunun bu sayede sadece iki değişken vardır, kil küçük dairesel parçalar, Bu değişkenler depolamak, ama olabilir sarılmış oklar önermek aslında işaret değil herhangi bir yerde bilinen. Öyleyse biz bu çizgi vardı ve bu bellek oldu yeni geçen hafta, malloc sadece bir fantezi yoludur tahsisi, İşletim sistemini anlatan, Linux veya Mac OS veya Windows, Hey, bana bazı bellek ver ve sahip tüm anlatmak için İşletim sistemi bellek için bunu isterken budur. Bu ne bakım gitmiyor Eğer onunla yapmak için gidiyoruz ancak işletim söylememe gerek yok Ne malloc yoluyla sistem. Evet? HEDEF KİTLE: Ne kadar? DAVID MALAN: Ne kadar? Ne kadar bayt ve böylece, bu, yine zoraki bir örnek, sadece söylediğini Bana bir int boyutunu verir. Bir int Şimdi büyüklüğü Dört bayt veya 32 bit. Yani bu sadece bir yoludur diyerek, hey, işletim sistemi, Bana hafıza dört bayt vermek Benim emrinde kullanabileceğiniz, ve özellikle, ne yaptığını saygı ile malloc dönüş Dört bayt o yığın? HEDEF KİTLE: Adres? DAVID MALAN: adresi. Dört bayt bu öbek adresi. Kesinlikle. Ve böylece sonuçta depolanan ne biz gerçekten yok neden x ve işte bakım şey bu sayısı o OX1 veya ox2 olsun adresi, ya da bazı şifreli onaltılık adresi. Biz sadece pictorially bakım O x değişkeni artık olduğunu belleğin o öbek işaret. Yani ok bir işaretçi temsil veya daha özel olarak, bir bellek adresi. Fakat yine de, biz genellikle umurumda değil Bu gerçek adresleri nelerdir. Şimdi, bu hat diyor Ne meslekten olmayan açısından? Yıldız x 42 noktalı virgül alır. Bu ne anlama gelir? Gitmek istiyorsun? Boynunu çizmeyin. İZLEYİCİ: x adresi 42 yer almaktadır. David MALAN: x adresi 42 yer almaktadır. Tam değil. Çok yakın, ama oldukça, var, çünkü Bu x önek var yıldızı. Yani biz biraz oynamak gerekiyor. Evet? HEDEF KİTLE: değer, işaretçi x 42 olduğunu işaret ediyor. DAVID MALAN: Tamam. Işaretçi x bu değer 42 olması, diyelim etmek zorundadır işaret ederek, ya da, yıldız başka bir deyişle x ne olursa olsun adrese gidin diyor bu 1 Oxford olsun, x ise Sokak ya da 33 Oxford Street ya OX1 ya OX33, ne olursa olsun sayısal adres olduğu Yıldız x x dereferencing olduğunu. Yani bu adrese gidin ve sonra oraya numarayı 42. koydu. Yani olacak bir söyleyerek eşdeğer yolu. Yani her şey yolunda ve sonra biz resmi temsil edeceğini aşağıdaki gibi biz ekledik nerede Dört bu öbekte 42 Sağ taraftaki bayt ama işler ters gitti bu nerede çizgi ve Binky kafası attı Bu noktada kapalı, kötü şeyler olur, çünkü ne zaman Eğer çöp değerler inceleyebilirsiniz Geçersiz inceleyebilirsiniz sen ya işaretçiler ve geçersiz say çünkü bu noktada Hikaye, y içinde ne var? Temelli y değeri nedir Geçtiğimiz birkaç adım? Evet? Bu da ne? HEDEF KİTLE: bir adres. DAVID MALAN: bir adres. Bu bir adres olmalı ama ben başlatılmış var? Yani henüz yok. Yani orada olmak ne biliniyor? Sadece bazı çöp değerdir. O sıfırdan için herhangi bir adres olabilir 2 milyar RAM iki konser varsa, ya da sıfır 4 milyar Sizin yasiyorsaniz RAM dört gigabayt var. Bu, bazı çöp değer ama sorun işletim sistemi olduğu, Seni verilmediği takdirde bu bellek öbek özellikle Eğer gitmek için çalışıyoruz ki genellikle ne neden oluyor Biz parçalama arızası olarak gördüm. Yani aslında, size herhangi birine sahip olan ofis saatlerinde sorunlara mücadele veya sorunlar o daha var Genellikle anlamaya çalışıyorum ile Bir segmentasyon hatası, Bu genellikle gelir Eğer bir segment dokunuyorsun Eğer olmamalıdır bellek. Belleği dokunmadan konum İşletim sistemi değildir vardır o olsun, sen dokunmak için izin senin dizide çok giderek olsun veya olmasın, şimdi başlıyor Eğer dokunmadan çünkü bu kadar sadece bazı çöp değeri bellek. Yani burada yıldız x yapıyor tanımsız davranış tür. Bunu oran çünkü bunu asla , program sadece çökmesine gidiyor vardır, Söylediğiniz çünkü, Bu adrese gitmek ve hiç bir fikrim var nereye Bu adres aslında. Yani işletim sistemi muhtemeldir Programınızı çökmesine gidiyor bir sonucu olarak gerçekten, işte Ne Binky orada oldu. Bu yüzden, sonuçta, Binky sabit Bu bu sorun. Bu programın Yani kendisi hatalıydı. Ama tür adımlarla ilerlemek eğer ve bunun yerine bu satırı yürütmek, y sadece x eşittir ne demekse adresi bir x, y de koydum. Ve böylece resimsel, biz ettik İki oklarla bu temsil x ve y den işaret itibaren Aynı yerde. Yani semantik x eşittir y olanların hem çünkü Aynı depolamak adres, ergo, 42 işaret ve şimdi, ne zaman yıldız demek y, y adrese gitmek Bu ilginç bir yan etkisi yoktur. Yani y adresi x adrese aynı şey. Yani eğer sen adrese gitmek demek ve y 13 değerini değiştirin, başka kim etkileniyor? X, D noktası, yani, konuşmak için bir hem de etkilenmiş olmalıdır. Ve gerçekten, nasıl Nick bu resmi çizdim claymation tam olarak oldu. Biz işaretçi izleyin olsa y biz aynı yerde sona erdi ve bu yüzden yazdırmak için olsaydı x veya y en pointee üzerinden, o zaman 13 değerini görecekti. Şimdi, ben pointee olmak demek Video tutarlı. Programcılar için benim bilgi, asla gerçekte Kelime pointee demek, sivri olan bu en ama tutarlılık video ile gerçekleştirmek oldu hepsi bu durumda geliyordu. Claymation üzerinde Yani herhangi bir soru veya işaretçileri veya malloc henüz? Hayır mı? Pekala. Bu yüzden daha fazla olmadan ado, en bir göz atalım Bu aslında sahip olduğu at bir süre kullanılmıştır. Yani biz bu CS50 kütüphanesi yaşadım Bu bu fonksiyonların hepsi var. Biz, GETINT getString çok kullandım Muhtemelen daha önce GetLongLong Benim Pset bir ya da öylesine, ama aslında neler oluyor? Peki, hızlıca bir göz atalım Bir programda başlık altında olduğunu Size CS50 vermek neden ilham Kütüphane ve aslında geçen hafta olduğu gibi, Biz o almaya başladı Eğitim tekerlekleri kapalı. Yani bu şimdi sıralanır Bir postmortem ne vardır devam CS50 kütüphane içinde, Şimdi hareket başlayacak olsa da ondan programların çoğu için. Yani bu, 0 scanf denilen bir programdır. Bu süper kısa. Sadece bu satırları vardır, ama Bir işlevi çağrılır scanf tanıttı biz aslında görmek için gidiyoruz CS50 kütüphane içinde bir an, biraz farklı bir biçimde de olsa. Hat 16 Yani bu program değişken x ilan edilir. Bu yüzden bana bir int için dört bayt verir. Bu kullanıcıyı söyleyip duruyor sayı, lütfen ve sonra Bu ilginç bir çizgi olduğunu Aslında geçen hafta birbirine bağlayan ve bu. SCANF ve sonra bir alır fark biçim dizesi, sadece printf gibi, % i bir int anlamına gelir ve sonra bir sürer Biraz görünüyor İkinci argüman korkak. Bu işareti x, ve hatırlamak için, biz sadece bu kez geçen hafta gördüm. Işareti x neyi temsil ediyor? Işareti C ne yapar? Evet? HEDEF KİTLE: adresi. DAVID MALAN: adresi. Yani tam tersi Yıldız operatörün, Yıldız operatörü diyor, oysa gitmek Bu adres, işareti operatörü anlamaya diyor Bu değişkenin adresi, ve böylece bu, çünkü anahtar Hayatta scanf amacı kullanıcının taramak için klavyeden girdi, ne bağlı o tipleri, ve sonra bu kullanıcı girişi okumak Bir değişkene, ama biz Son iki hafta içinde gördüm Bu takas fonksiyonu o biz uygulamaya zahmetsizce çalıştı Sadece kırıldı. Swap fonksiyonu ile hatırlayın, biz sadece ints olarak A ve B ilan eğer, başarıyla takas yaptım swap içinde iki değişken Sadece süt ve oj gibi, ancak takas, iade kısa sürede saygı ile sonuç ne oldu x ve y, özgün değerleri? Hiçbir şey. Evet. Hiçbir şey, çünkü o zaman oldu swap, sadece yerel kopyaları değiştirmek Tüm demek olan Bu sefer, ne zaman biz ettik argümanlar geçen edilmiş işlevleri nedeniyle, konum sadece bu argümanlar kopyalarını geçen. Bunu yapabilirsiniz Onlarla ne istersen, ama onlar hayır için gidiyoruz Orijinal değerler üzerinde etkisi. Yani bu eğer sorunlu scanf gibi bir işlevi var istiyorum Hayatta, amacı taramak için klavyeden kullanıcının giriş ve daha sonra bu yüzden, boşlukları doldurmak konuşmak olduğunu, x gibi bir değişken vermek Bir değer, ben olsaydım, çünkü Sadece scanf için x geçmek için, son mantığını düşünün hafta, scanf bunu istediğini yapabilir x bir kopyası, ama yapamadım Verdiğimiz takdirde kalıcı x değiştirmek , tabiri caizse, bir hazine haritası scanf x nokta işaretleri nerede, bu sayede Biz böylece x adresinde geçmek scanf orada aslında değişim gidebilirsiniz x değeri. Ve böylece aslında tüm bu program yapar Benim kaynağında scanf 0, yaparsanız 5m rehberi, scanf 0 yapmak, dot scanf yırtmaç, sayı 50 Lütfen, 50 için teşekkürler. Yani, tüm bu ilginç değil ama aslında ne oluyor en kısa sürede ben aramak gibi olduğunu burada, x değerini scanf kalıcı değiştirildi ediliyor. Şimdi, bu güzel görünüyor ve İyi, ve aslında, o biz gerçekten ihtiyacımız yok gibi görünüyor Tüm artık at CS50 kütüphanesi. Örneğin, en çalışmasına izin Burada bu kez daha. Bana bir saniye için yeniden edelim. En bir numara deneyelim lütfen yerine eskisi gibi 50 söyleyerek, Sadece hayır diyelim. Tamam, bu biraz garip. TAMAM. Burada ve sadece bazı saçma. Bu yüzden görünmüyor hatalı durumlarla başa. Bu yüzden başlangıç ​​minimal gerekiyor Bazı hata denetimi ekleme kullanıcının sahip olduğundan emin olmak için 50 gibi bir gerçek sayı yazdığınız, görünüşe yazarak kelimelerin çünkü sorunlu olarak algılanmaz, ama muhtemelen olmalıdır. Şimdi de bu bu sürümü bakalım benim girişimi getString reimplement için. Scanf bu varsa fonksiyonellik, yerleşik Neden bu uğraşmaya edilmiştir getString gibi eğitim jantlar? Peki, burada belki de benim kendimin getString basit versiyonu bu sayede bir hafta önce, dedim olabilir, Bana bir dize vermek ve tampon diyoruz. Bugün, sadece başlamak için gidiyorum , karakter yıldızı, geri çağırma söyleyerek sadece eşanlamlı olduğunu. Bu korkunç görünüyor ama var aynı şey. Bu yüzden bana bir değişken olarak adlandırılan tampon vermek bir dize depolamak için gidiyor, Kullanıcı dizesini lütfen söyle ve daha sonra, daha önce olduğu gibi, Şimdi bu dersi ödünç çalışalım scanf % s bu kez ve sonra tampon içinde geçmektedir. Şimdi hızlı bir aklı kontrol. Neden demiyorum işareti bu sefer tampon? Önceki örnekte sonucuna. HEDEF KİTLE: Char yıldızı göstericisidir. DAVID MALAN: Kesinlikle, Bu sefer, Char çünkü Yıldız, zaten bir gösterici, bir adres Orada olmak o yıldızın tanımı gereği. Ve scanf bir adres bekliyorsa, sadece tamponda geçmesi yeterlidir. Ben işareti tampon söylemek gerekmez. Meraklı için, sen-ebil Böyle bir şey yapmak. Farklı bir anlamı olurdu. Bu size bir işaretçi verecek aslında bir işaretçi için C ancak için geçerli olan Şimdi, en basit tutalım ve tutarlı bir hikaye tutun. Ben sadece geçmek için gidiyorum tampon ve bu doğru. Sorun olsa budur. Beni go ahead ve bu çalıştıralım derlemeden sonra programı. Scanf 1 yapın. Lanet olsun, benim derleyici en benim hata yakalamak. Bana bir saniye izin ver. Clang. En scanf-1.c diyelim. TAMAM. Oraya gidiyoruz. Ona ihtiyacım var. CS50 kimliği farklı olan yapılandırma ayarları kendinize karşı korumak. Ben ederek bu devre dışı bırakmak için gerekli El ile bu defa clang çalışıyor. Yani dize lütfen. Devam edin ve yazın gidiyorum Benim en sevdiğim merhaba dünya. Null, tamam. Ben yazdığınız değil. Yani göstergesidir bir şeyler yanlış olmak. Beni go ahead ve yazın bakalım Gerçekten uzun dize. Null Teşekkür ve ben bilmiyorum eğer bunu çökmesine edebilmek için gidiyorum. Hadi biraz kopyasını deneyelim yapıştırın ve bu yardımcı olmadığını görmek. Sadece bu bir sürü yapıştırın. Kesinlikle büyük bir var Her zamankinden daha dize. Sadece gerçekten yazalım. Hayır. Kahretsin. Komut bulunamadı. Yani hiçbir ilişkisi yoktur. Ben yapıştırılan Çünkü bu Bazı kötü karakterler, ancak bu çıkıyor işe gitmiyor. Çünkü en bu kez daha deneyelim biz aslında çökmesine eğer daha eğlenceli. Şimdi bu tip edelim ve şimdi, ben gerçekten uzun bir dize kopyalamak için gidiyor ve şimdi en olmadığını görelim biz Bu şeyi çökmesine sebep olabilir. Ben boşluk ihmal ve Uyarı Yeni hatlar ve noktalı virgül ve tüm funky karakter. Girin. Ve şimdi ağ sadece yavaş davranıyor. Ben açıkça, çok uzun Command-V aşağı düzenledi. Kahretsin! Komut bulunamadı. TAMAM. Peki, nokta Yine de, aşağıdaki. Yani aslında neler olduğunu Bu deklarasyonla üzerinde hat 16 karakter yıldız tampon? Yani elde neyim Ben bir işaretçi bildirmek zaman? Ben alıyorum Bütün dört bayt değeri Tampon olarak adlandırılan, ancak bunun içinde ne o anda? Sadece bazı çöp değerdir. Herhangi bir zamanda Çünkü bir değişken bildirmek C, sadece bazı çöp değer, ve biz başlıyoruz Bu gerçeğin üzerinde yolculuk. Şimdi, ben scanf söyleyince, Bu adrese gitmek ve ne olursa olsun kullanıcı türleri koydu. Kullanıcı türleri varsa merhaba Dünya, iyi, bunu nereye koyacağım? Tampon bir çöp değeridir. Böylece bir ok gibi bir şey Bu nerede kim bilir işaret ediyor. Belki de işaret ediyor Burada benim bellek. Ve böylece, kullanıcı merhaba dünya tipleri, Program koymak için çalışır Dize merhaba dünya ters eğik çizgi 0 bu bellek öbekte. Ama yüksek olasılıkla ancak açıkça değil,% 100 olasılık, Daha sonra bilgisayar çökmesine gidiyor Program bu değil çünkü Hafıza Ben dokunmak için izin verilmelidir. Yani kısacası, bu program tam olarak bu nedenden dolayı kusurlu. Ben temelde neyi yapmıyorum? Hangi adımları gibi, ihmal var Biz Binky ilk örnek ihmal? Evet? HEDEF KİTLE: Bellek ayırma? DAVID MALAN: Bellek ayırma. Aslında tahsis değil Bu dize için herhangi bir bellek. Bu yüzden şekillerde bir çift bu çözebilirsiniz. Bir, biz basit tutabilirsiniz ve aslında, şimdi sen Bir bulanıklık görmeye başlayacağız Neyin arasındaki çizgilerin bir dizi, bir dize nedir, ne değildir Char yıldız karakter ne bir dizidir olduğunu. İşte ikinci örnek dizeleri ve bildirim içeren Tüm on line yaptık 16 yerine söyleyerek, bir Bu tampon bir karakter olacak Yıldız, belleğin bir yığın bir işaretçi, Ben çok proaktif vereceğim 16 karakter kendimi bir tampon, ve aslında, bilginiz varsa süreli tamponlama ile Muhtemelen videoları dünyasından, Bir video tamponlama tamponlama olduğu, tamponlama. Peki, bağlantı burada ne var? YouTube Eh, İç ve video oynatıcılar içinde genellikle bir dizidir Bu 16 daha büyük. Bu boyutta bir tane bir dizi olabilir megabayt, belki 10 megabayt, ve bu diziye tarayıcınızı yok bayt bir sürü indir megabayt bir sürü video ve video oynatıcı, YouTube ya da kim var, başlar Bu diziden bayt okuma, ve her zaman gördüğünüz Kelime tamponlama, tamponlama, o oyuncu var demektir Bu dizinin sonuna kazanılmış. Ağ değil sahip olduğu çok yavaş Daha fazla bayt ile dizi doldurulmuş ve böylece bit bitti kullanıcıya gösterilecek. Yani tampon bir apt terim ki burada bu sadece bir dizi, bellek yığın var. Ve bu bunu çözecektir çıkıyor çünkü Eğer diziler tedavi olabilir sanki onlar bile tampon olsa, adresler sadece bir sembol, bir olmasıdır karakter dizisi, tampon bu benim için yararlıdır, programcı, etrafında adını iletebilirsiniz o sanki bir gösterici olarak onun olsa bir yığın adresi vardı 16 karakter hafıza. Demek bu yüzden ben geçebilir tam scanf o kelime ve şimdi, ben bu programı yaparsanız, scanf 2 yapmak, nokta çizgi scanf 2, ve yazın merhaba dünya, Bu zamanımı girin Hmm, ne oldu? Dize lütfen. Neyi yanlış yaptım? Merhaba dünya tampon. Merhaba Dünya. Ah, o ne yaptığını biliyorum. TAMAM. Yani o kadar okuyor İlk uzay kadar. Yani sadece bir an için hile izin ve Ben sadece bir şey yazın istedim demek Gerçekten bu kadar uzun uzun cümle gibi de bu bir, iki, üç, dört, beş, altı, yedi, sekiz, dokuz, 10, 11, 12, 13, 14, 15, 16. TAMAM. Gerçekten uzun bir cümledir. Yani bu cümle uzun 16 karakter ve bu yüzden, Enter vurduğunuzda ne olacak? Eh, bu durumda Hikaye, ben ilan etmişti tampon aslında bir dizi olmanın gitmek için 16 karakter hazır olan. Bu yüzden, bir, iki, üç, dört, beş, altı, yedi, sekiz, dokuz, 10, 11, 12, 13, 14, 15, 16. Yani 16 karakter ve şimdi, ne zaman Bu bir uzun gibi bir şey okumak cümle ne ne olduğunu gidiyor Ben bu okuyacağım bir uzun S-E-K-T-E-N = C-E, cümle. Yani bu kasıtlı olduğunu kötü bir şey olduğunu ben ötesinde yazmaya devam Benim dizinin sınırları, Benim tampon sınırları ötesinde. Şanslı ve programın alabilir bakım çalışan tutmak ve olmayacak ancak genellikle, bu konuşma Gerçekten benim program kilitlenmesine, ve bir hata olduğunu benim Ben adım anı kod sınırları ötesinde Bu dizinin, çünkü ben bu kadar bilmiyorum mutlaka çökmesine gidiyor ya da ben sadece şanslı alacağım eğer. Yani bu sorunlu çünkü Bu durumda, işe görünmektedir ve en olsa bile, burada kader özendirmek izin IDE biraz tahammül gibi görünüyor of-- Oraya gidiyoruz. Sonunda. Yani bu görebiliyorum tek kişi benim. Yani sadece eğlenceli yazarak bir sürü vardı gerçekten uzun bir fiili ifade dışında kesinlikle aştı 16 byte, çünkü ben Bu deli uzun multi-line yazdığınız ifade ve sonra ne oldu fark. Program yazdırmadan çalıştı ve daha sonra bir segment hataya var ve segmentasyon hataları olduğunda ise Böyle bir şey olur ve işletim sistemi diyor hayır, bu bellek dokunamaz. Biz öldüreceğiz tamamen bir program. Yani bu sorunlu görünüyor. Ben programı sayede geliştirdik En azından, bazı bellek var ancak bu sınırlandırmak gibi görünüyor almak için fonksiyon GetString Bazı sonlu uzunluktaki 16 dizeleri. Daha uzun desteklemek istiyorsanız Yani 16 karakterden daha cümleler, ne yaparsınız? Peki, sen artırabilir 32, bu tampon boyutu veya bu tür kısa görünüyor. Neden biz sadece yapmazlar o 1000 ama geri itin. Sezgisel tepkisi nedir Sadece yaparak bu sorunu önleme 1000 karakter gibi, büyük benim tampon? Bu şekilde getString uygulayarak. Burada iyi ya da kötü? Evet? HEDEF KİTLE: Eğer çok fazla bağlarsanız alan ve bunu kullanmak değil, o zaman bu alanı tahsis edemiyor. DAVID MALAN: Kesinlikle. Bunu yapmazsanız sürece sanki savurgan var aslında bu bayt 900 ihtiyaç ve henüz sizin için soruyorsun Zaten toplam 1000, Sadece daha fazla bellek tüketen ediyoruz Gerekirse daha kullanıcının bilgisayarında, ve hepsi sonra bazı Zaten Karşılaştığınız hayatta sen o zaman programların çok çalışan ve onlar, büyük miktarda bellek kadar yiyorsanız Bu aslında performansı etkileyebilir ve kullanıcının deneyimi bilgisayarda. Yani bu tür bir tembel çözüm, emin ve tersine, değil sadece savurgan olduğunu, sorunun ne Hala benim tampon yapmak bile kalır 1000? Evet? HEDEF KİTLE: dize uzunluğu 1.001 olduğunu. DAVID MALAN: Kesinlikle. Senin dize uzunluğu 1001 ise, Eğer aynı sorun var, ve benim argümanı ile, yapardım Sadece o zaman 2000 yapmak, ama sen bilmiyorsun olması gerektiği kadar büyük ilerlemek, ve henüz, benim programı derlemek zorunda insanların kullanımı icar önce ve indirme o. Yani bu tam olarak tür şeyler CS50 kütüphane çalışır olduğunu bize yardımcı ve biz sadece bakışta olacak etmek altında yatan uygulama bazı Burada, ancak bu CS50 nokta C Bu CS50 IDE oldu dosyadır Eğer kullanmakta olduğunuz bütün bu hafta. Önceden derlenmiş ve sen ettik otomatik olarak kullanıyorum olan doğası gereği clang L CS50 bayrağı dash, ama hepsi aşağı kaydırma eğer Bu işlevler, burada getString var, ve sadece sana vermek için Neyin tadı oluyor en kısaca bir göz atalım göreceli karmaşıklık. Bu bir süper uzun var fonksiyonu, ama biz yoktu Tüm sabit düşünmek zorunda nasıl dizeleri alma hakkında gitmek için. Yani burada benim tampon ve ben var görünüşte null başlatılamadı. Bu, tabii ki, Char yıldızı olarak aynı şey, ama ben karar verdim CS50 kitaplığı uygulama Biz gidiyoruz eğer tamamen dinamik Ben ne kadar büyük önceden bilmiyorum Dize kullanıcıları almak istiyorum gidiyoruz. Yani başlamak için gidiyorum Sadece boş bir dize ile ve ben çok kurmak için gidiyorum Bellek I kullanıcı dizesi sığdırmak gerekiyor gibi ve ben yoksa Yeterince ben soracağım Daha fazla bellek için işletim sistemi. Ben onların dize taşımak için gidiyorum bellek, daha büyük bir yığın haline ve ben serbest veya serbest gidiyorum bellek yetersiz büyük bir yığın ve biz sadece gidiyoruz iteratif bunu yapmak için. Yani hızlı bir bakışta, Burada sadece bir değişken hangi ile ben takip edeceğim Benim tampon kapasitesi. Kaç bayt sığabilir? İşte değişken n var Ben tutmak için gidiyorum hangi Aslında kaç byte iz Kullanıcı yazdığınız ya da o tampon. Eğer daha önce bu görmedim varsa, sizi belirtebilirsiniz bir int gibi bir değişken , adından da anlaşılacağı gibi, hangi imzasız demek o negatif olmayan, ve niye Şimdiye kadar belirterek rahatsız istiyorum bir int sadece bir int olmadığı, ancak bir unsigned int değil mi? Bu negatif olmayan bir int var. [Duyulamaz] ne anlama gelir? HEDEF KİTLE: Bir miktar tanımladığı bellek [inaudible] olabilir. DAVID MALAN: Evet. Ben imzasız demek, yani bu aslında size ekstra bellek bir bit veren eğer ve aptalca tür gibi görünüyor, ama , ek bellek bir bit var Birçok iki kat var demektir Temsil değerler, bir 0 ya da 1 olabilir, çünkü. Yani, varsayılan olarak, bir int kabaca olabilir Negatif 2 milyar tüm yol Pozitif 2 milyar kadar. Bunlar büyük aralıkları, ama hala biraz savurgan var Sadece umurumda eğer boyutları, hangi sadece sezgisel Negatif olmayan olmalı veya olumlu ya da 0, iyi o zaman, Neden 2 milyar harcıyorsun Negatif sayılar için olası değerler asla bunları kullanmak için gidiyoruz eğer? Yani can imzasız, şimdi benim int söyleyerek 4 milyar 0 ile kabaca olacak. Yani burada nedenlerden dolayı sadece bir int C bulunuyor Biz sadece şimdi içine almazsınız yerine bir int var neden Bir char, ama burada Neler özü Senin ve bazı Örneğin, kullanıyor olabilir, Hatta Pset dört fgetc işlevi veya bundan sonra, biz onu göreceğiz Yine problem beş set fgetc nedeniyle adı olarak güzel tür, çeşit arcanely anlaşılacağı bir işlev olduğunu Bir karakter alır ve böylece Ne temelde farklı Biz getString ne yaptığınızı hakkında Kullandığımız değiliz olduğunu Aynı şekilde scanf. Biz sadece adım-adım boyunca sürünen ne olursa olsun üzerinde kullanıcı yazdığınız etti, biz her zaman bir tane tahsis çünkü Char, ve böylece biz her zaman güvenli olabilir Bir seferde bir Char bakmak ve Sihir burada gerçekleşmesi başlar. Ben aşağı kaydırmak için gidiyorum Bu fonksiyonun, orta Sadece kısaca bu işlevi tanıtmak. Çok bir var gibi malloc işlevi, var Bir realloc fonksiyonu burada realloc Eğer bellek yığın yeniden tahsis sağlar ve daha büyük veya daha küçük yapmak. Çok uzun lafın kısası ile Bugün için elimi bir dalga, Bu ne biliyor getString yapıyor bu çeşit olduğunu bir sihirli büyüyen ya da kullanıcı olarak tampon küçülen onun dize türleri. Yani eğer kullanıcı türleri kısa bir dize, bu kod Sadece yeterli ayırır Bellek dize sığdırmak için. Kullanıcı yazarak tutarsa Ben tekrar ve tekrar yaptığımız gibi ve yine de, eğer Tampon adlı başlangıçta bu büyük ve programı, anlar Bir dakika bekleyin, ben boş alan kulüpler, o iki katına gidiyor tampon boyutu ve daha sonra tamponu boyutunu iki katına ve iki katına yapan kod, Burada ona bakarsanız, bu kadar Sadece bu akıllı one-liner. Bu sözdizimi görmüş olabilir daha önce, ancak yıldız eşittir derseniz, Bu aynı şey gibidir kapasite kez 2 söyleyerek. Yani bu sadece katlama tutar tampon kapasitesi ve sonra realloc söylüyorum vermek kendisi çok daha fazla bellek. Şimdi, bir kenara, orada Burada diğer fonksiyonlar Biz herhangi bir ayrıntı içine bakmak olmaz GETINT göstermek için başka, Biz GETINT bölgesindeki getString kullanın. Biz olmadığını kontrol null, hangi, geri çağırma, özel bir değerdir bir şeyler ters gitti demektir. Biz bellek bitti. Daha bunun için kontrol edin. Ve biz nöbetçi değerini döndürür. Ama olarak yorumlarına erteleme edeceğiz Neden sonra biz scanf bu kuzeni kullanın sscanf denilen ve çıkıyor Bu sscanf, veya dize scanf, Çizginin bir göz atın sağlar o Kullanıcı yazdığınız ve size izin verdi esasen analiz ve ben neyi Burada ne ben sscanf söylüyorum olduğunu, kullanıcının sahip olursa olsun analiz yazdığınız ve emin% i yapmak, Orada buna arasında bir tam sayı, ve olmaz orada da tam olarak neden bugün içine almak Özetle bir% burada c, ama bu izin verir Kullanıcı yazdığınız varsa bize algılamak sayıdan sonra sahte bir şey. Yani Bunun nedeni GETINT ve GetString yeniden, yeniden denemek için size, yeniden çünkü tüm olduğu biz yazdık o kod, bu tür kullanıcının giriş bakıyor emin olarak tamamen sayısal bulunuyor ya da gerçek bir kayan var nokta değeri veya benzeri Ne değerine bağlı olarak Kullandığınız çalışır. Yaşasın. TAMAM. Bu bir lokma oldu ama mesele burada biz vardı nedeni Bu eğitim tekerlekler üzerinde Çünkü en düşük seviyede olduğunu Sadece çok şey olduğunu Biz istedik yanlış gidebilir preemptively işlemek kesinlikle böyle şeyler sınıfının ilk hafta ama şimdi Pset dört ve beş ve Pset ötesinde bunu şöyle fazlası var olduğunu göreceksiniz Eğer aynı zamanda daha yetenekli olduğunu sorunları bu tür çözme Kendinizi. GetString veya GETINT üzerinde herhangi bir sorunuz var mı? Evet? HEDEF KİTLE: Neden iki katına çıkacak tampon kapasitesi yerine sadece artan daha bunun tam miktarda? DAVID MALAN: İyi bir soru. Neden kapasitesi iki katına çıkacak tampon aksine Sadece artan Bazı sabit değeri ile? Bu bir tasarım karardı. Biz sadece eğilimi nedeniyle karar verdi Zaman bilge biraz pahalı sormak için bir olmak İşletim sistemi bellek, we did not biniyorlar kadar bitirmek istiyorum Büyük dizeleri için bir durum biz soran ki tekrar ve tekrar işletim sistemi ve tekrar ve tekrar bellek için hızlı arkaya. Yani biz sadece biraz, karar keyfi ama biz makul umut, , sen, haydi biliyorum öncesinde kendimizi elde etmeye çalışmak ve sadece bu yüzden iki katına tutmak biz kez miktarını en aza indirmek Biz malloc aramak zorunda veya realloc, ancak toplam yargı bilerek yokluğunda çağrı Ne Kullanıcıların yazın isteyebilirsiniz. Her iki yol tartışılabilir olabilir. Tartışmasız iyi. Yani bir çift de bir göz atalım bellek başka yan etkilerin, ters gidebilir şeyler ve araçlar yapabilirsiniz hatalar bu tür yakalamak için kullanın. O halde hepiniz çıkıyor check50 size kadar söylemedi buggy yazıyorum edilmiştir Haftanın tek beri kod hatta tüm check50 testler ise geçti ve hatta eğer sizin ve TF süper eminiz amaçlanan gibi kod çalışır. Kodunuzu adamcağız olmuştur veya sizin bütün kusurlu, CS50 kütüphanesi kullanarak, bellek sızıntısı oylandı. Sen işletim sistemini soran oldum programlarının çoğunda bellek Eğer yazdım, ama sen ettik aslında iade asla. Sen GetString aradım ve GETINT ve GetFloat, ama getString, sen ettik unGetString veya Give aramadı Dize Arka veya benzeri ama biz gördük GetString bellek ayrılamadı yaptığı malloc yoluyla veya bu tarafından Sadece bir fonksiyon realloc, ruhu çok benzer, ve henüz biz oldum işletim sistemini soran hafıza ve bellek tekrar tekrar ama geri vermeyi asla. Şimdi, bir kenara olarak, o çıkıyor Bir program, belleğin tüm çıkar, otomatik olarak serbest. Bu yüzden büyük bir anlaşma olmadı. Bu kırmak için gitmiyor IDE veya yavaş aşağı şeyler, ama ne zaman programlar yapmak genellikle bellek sızdırıyor ve uzun bir süre için koşuyoruz. Hiç aptal gördüm Eğer Mac OS veya kum plaj topu Windows bu tür nerede yavaşlatan veya düşünce ya da düşünce ya da sadece gerçekten başlar Bir tarama yavaş, Çok büyük olasılıkla olabilir Bir bellek sızıntısı sonucu. Yazdı programcılar Kullandığınız yazılım bellek işletim sistemi isteyin her birkaç dakikada, her saat. Ama çalıştırıyorsanız o olsa bile yazılım, Bilgisayarınızda minimize saatlerce veya günlerce, Eğer daha soran olabilir Bellek ve asla aslında bunu kullanarak ve böylece kod olabilir veya olabilir programları, bellek sızıntısı olabilir ve bellek sızdırıyor başlarsanız, diğer programlar için daha az bellek var, ve etkisi olan Her şeyi yavaşlatmak. Şimdi, bu kadar biri tarafından En iğrenç programlar Eğer fırsat olacaktır CS50 çalıştırmak için sürece onun çıkış bile daha ezoterik olarak clang ya da 's yapmak veya komut herhangi Daha önce koşuyoruz satırı programları ama Neyse ki, onun çıkış gömülü Bazı süper yararlı ipuçları olduğunu yararlı ya Pset dört olacak ya kesinlikle beş Pset. Yani valgrind bir araçtır Bu bakmak için kullanılabilir Programda, bellek sızıntıları için. Bu çalıştırmak nispeten basit. Hatta, valgrind ve ardından koşmak Biraz ayrıntılı olsa, dash dash kaçak kontrolü Tam eşittir, ve sonra nokta çizgi ve programın adıdır. Yani valgrind sonra programı çalıştırmak olacak ve programın en sonunda bu beraberliği önce çalışan ve size başka istemi verir o analiz gidiyor senin Program yürütüyor esnada ve sen kaçak söylemedi daha henüz bellek ve Belleği dokunma ki sana ait değil mi? Her şeyi yakalamak değil, ama bu birçok şey yakalamak oldukça iyi. Yani burada benim sahip vadede bir örnek Bu program çalıştırmak valgrind sahip adı verilen bir program Bellek ve ben gidiyorum olan satırları vurgulamak için sonuçta bize ilgi. Yani daha fazla dikkat dağıtıcı var Ben slayt silinir ettik. Ama sadece ne bu görelim Program anlattıklarını yeteneğine sahiptir. Bu bize bir şeyler anlatmaya yetenekli büyüklüğü 4 geçersiz yazma gibi. Başka bir deyişle, bellek dokunursanız, bellek, özellikle 4 bayt Eğer olmamalıdır, valgrind sana bunu söyleyebilirim. Büyüklüğü 4 Geçersiz yazma. Sen dört bayt dokundu Eğer olmamalıdır. Nerede yaptın bunu? Bu güzelliktir. Bellek nokta c line 21 nereye olduğunu berbat ve yararlı olur bu yüzden. Çok GDB gibi, yardımcı olabilir Gerçek hataya işaret. Şimdi, bu biraz daha var ayrıntılı, karmaşık değilse. 1 blokta 40 bayt kesinlikle kayıp kaydının 1 1 kaybetti. Bu ne anlama gelir? Peki, bu sadece sizin için sorduk demektir 40 byte ve bunu geri vermedim. Sen malloc denilen ya da denilen GetString ve işletim sistemi Seni 40 byte, ancak sizi asla verdi serbest veya bellek serbest, ve adil olmak, biz göstermek hiç nasıl bellek geri vermek. Süper var Çıkıyor basit bir işlev ücretsiz çağırdı. Bir argüman, bir şey alır Eğer, ücretsiz ya da geri vermek istiyorum ancak 40 byte, görünüşe göre, Bu programda satırında kaybolmuş Bellek 20 c nokta. Yani bu programı görelim. Bu süper yararsız. Sadece gösteriyor Bu belirli bir hata. Yani bir göz atalım. Burada ana ve ana, haber, aramalar Bir f fonksiyonu ve daha sonra döner çağırdı. Yani tüm bu ilginç değil. F ne yapar? Ben bir prototip ile uğraşmadı dikkat edin. Ben kodu tutmak istedim mümkün olduğu kadar az. Yani ana yukarıda f koymak ve Bu kesinlikle iyi, Böyle kısa programlar için. Yani f şeyi dönmek ve does değil değil bir şey almak, ama bunu yapmak yok. Bu çok gibi, beyan Binky örnekte Bu x adında bir işaretçi gidiyor bir int adresini saklamak için. Böylece sol taraf var. İngilizce, nedir yapıyor sağ taraf? Herkes? Bu bizim için ne yapıyor? Evet? HEDEF KİTLE: [duyulamaz] Zaman bir int boyutu olan 10 kat [duyulamaz] DAVID MALAN: İyi ve bana özetleyelim. Yani 10 tamsayılar için yeterli alan tahsis veya 10, bir int boyutu, ne bu 4 dört bayt, yani 10 kere bulunuyor 40, ben ettik o sağ tarafında, böylece Vurgulanan bana 40 bayt vermek ve İlk byte adresini saklamak x içine. Ve şimdi son olarak, burada nerede Bu program, buggy, ne olduğunu hat 21 yanlış olduğunu mantığa dayalı? Ne hat 21 nesi var? Evet? HEDEF KİTLE: Yapamazsınız [duyulamaz] x içine dizin. DAVID MALAN: Evet. Ben böyle x içine dizin olmamalıdır. Yani sözdizimsel, sorun değil. Ne güzel senin gibi çok olduğu Bir dizinin adını tedavi edebilir sanki benzer bir işaretçi var bu kadar sanki bir işaretçi davranabilirsiniz bir dizi ve bu yüzden sözdizimsel can x braket şeyler söylemek x braket i, ama 10 problemlidir. Neden? HEDEF KİTLE: Bu içeride değil çünkü. DAVID MALAN: Öyle değil bu bellek yığın içinde. En büyük değeri ne olmalıdır var Bu köşeli parantez içinde koyarak? 9 arasındaki 9, 0. Sıfır indeksleme çünkü. Yani 0 ile 9 arasında iyi olurdu. Parantez 10 iyi değil ve ancak, her zaman olsa da hatırlamak Ben CS50 IDE yapmaya görünüyor sahte değerler yazarak kazasında, her zaman, işbirliği yok ve gerçekten de, sık sık şanslı sırf İşletim sistemi yok dikkat edin hiç bu kadar biraz belleğin bazı öbek geçmesi, Eğer teknik olarak içinde kaldı çünkü senin bölüm, ama daha bu konuda Bir işletim sistemleri sınıfında, Böyle bir şey ve bu yüzden çok kolay algılanmayan gidebiliriz. Programınız asla çökmesine gidiyor sürekli ama belki bir süre içinde. Ve o yüzden valgrind deneyelim Bunun üzerine, ve burada nerede bunalmış alırsınız anlık çıkışı. Yani bellek valgrind sızıntısı kontrolü yapmak Tam nokta çizgi belleği eşittir. Söz veriyorum yüzden burada Bu mahçup olur. İşte valgrind, burada ne var ne Bir programcı, birkaç yıl önce- iyi bir fikir olacağını karar verdi gibi çıktı bakmak için. Yani bu anlamda yapalım. Sol-el Yani tüm yol sebepsiz tarafı Programın süreç kimliğidir Biz sadece, benzersiz bir tanımlayıcı çalıştırmak Program için biz sadece koştu. Biz o silindi slayt, ama orada Burada bazı yararlı bilgiler. En çok üst yukarı edelim. Biz başladı burada. Yani tüm bu çok çıktı değil. İşte bu geçersiz yazma bulunuyor hat 21 büyüklüğü 4. Peki, line 21 neydi? Satır 21 tam olarak Bu ve mantıklı Ben validly içinde olduğumu Ben çünkü 4 bayt yazma Bu tamsayı koymak için çalışırken, hangi bir şey olabilir Sadece olur sıfır, ama ben çalışıyorum bir yerde koymak için Bu bana ait değil. Tek üstelik, buraya, 40 byte bloklar kesinlikle kayıt 1 kaybolur. Ben malloc çağırdığınızda çünkü var Burada, ben aslında belleği serbest asla. Peki bu düzeltebilirim? Bana devam edelim ve biraz daha güvenli ve orada 9 yapın ve burada serbest x beni. Bu bugün için yeni bir işlevdir. Ben şimdi hafıza nokta çizgi yapmak yeniden varsa, , yine buna valgrind çalışmasına izin Benim pencere maksimize etmek ve Enter tuşuna basın. Şimdi, bu iyi. Onlar iyi bir haber gömmek Bu çıkış tüm. Tüm yığın blokları özgürdü. Biz neyi yığın geri geleceğiz ancak herhangi bir sızıntı mümkündür. Yani bu sadece başka bir senin alet kiti için aracı hangi ile başlayabilirsiniz Şimdi böyle hataları bulmak. Ama bakalım neler daha Burada yanlış gidebilir. Şimdi geçişi edelim aslında bir sorun çözme. Bir kenara, bu bir rahatlatmak eğer konfüzyon veya gerginlik biraz, Bu artık komik. Evet. Bu oldukça iyi. Göstericiler Çünkü adresleri ve adresleri Kongre tarafından genellikle onaltılık yazılmış. Ha, ha, bu artık komik. Her neyse, bu yüzden şimdi atalım aslında bir sorunu çözmek. Bu, süper olmuş süper şimdiye kadar düşük seviyeli, ve biz aslında yararlı yapabiliriz Bu düşük seviyeli detayları ile işler. Bu yüzden birkaç hafta tanıttı önce bir dizi kavramı. Bir dizi güzeldi çünkü Bizim kodunu temizlemek zor Biz yazmak istedim çünkü eğer Birden öğrencilerle programı veya birden fazla isim ve evler ve Yurtlar ve kolejler ve bütün, Biz her şeyi daha saklamak temiz bir dizi içinde. Ama bir olumsuz önermek Bir dizinin bugüne kadar. Bunu kendiniz acı değil olsanız bile Bir programda, sadece içgüdüsel, kötü bir şey ne Bir dizi hakkında, belki? Bazı üfürümler duyuyorum. HEDEF KİTLE: Zor boyutunu değiştirmek için. DAVID MALAN: Bu zor boyutunu değiştirmek için. Sen boyutunu değiştiremezsiniz Bir dizinin, aslında, tek başına C. başka dizi ayırabilirsiniz, eski olandan şeyi taşımak şimdi yeni ve içine bazı ekstra boşluk var, ama bir gibi değil Java veya Python gibi dil ya da diğer herhangi bir sayıda diller bazılarınız tanıdık olabilir nereye Sadece bir şeyler eklemeye devam edebilirsiniz Bir dizinin sonuna bıktıracak. Eğer bir dizi varsa onun büyüklüğü büyüklüğü 6, ve fikri daha önce benzeri çok Belirli bir boyutta bir tampon sahip Eğer kapıdan tahmin etmek zorunda Ne boyutu olmasını istiyorsun? Eğer çok büyük tahmin ederseniz Eğer uzay harcıyorsun. Eğer çok küçük tahmin ederseniz sizi En azından, bu verileri depolamak olamaz çok daha fazla işsiz. Işaretçileri Yani bugün, teşekkürler, biz Birlikte kendi özel dikiş başlangıç veri yapıları, ve Aslında, burada bir şey Bu biraz daha bakar ilk bakışta şifreli, ama bu bir bağlantılı arayacağım budur Liste ve özetliyor onun adını tür o. Bu sayı bir liste veya Bu durumda, numaralarının listesini, ama bu şey bir liste olabilir, ama Bu arada okları yolu ile bağlantılıdır ve sadece bir tahmin almak hangi teknik ile biz güçlü olacak Birlikte dikiş, çeşit iplikle patlamış mısır gibi, burada bir liste dikdörtgenler bağlantılı? Onun numaralar? Altta yatan bir dil özelliği nedir? HEDEF KİTLE: Bir işaretçi. DAVID MALAN: Bir işaretçi. Peki bu okların her burada temsil Bir gösterici ya da sadece bir adres. Yani diğer bir deyişle, ben istiyorum numaralarının listesini saklamak için, Ben istiyorum ben sadece bunu saklayamazsınız büyümek ve küçültmek yeteneği Bir dizide benim veri yapısı. Bu yüzden biraz olması gerekir daha sofistike, ama bu fark Resim tür anlaşılacağı Sadece küçük parçacığı var eğer o her şeyi birlikte bağlama, Muhtemelen yer açmak için o kadar da zor değil Bu dikdörtgenler içinde arasında iki ya da bu düğümlerin iki olarak biz başlayacağız Yeni bir düğüm koymak, onları çağıran, ve daha sonra bazı yeni iplikle, sadece Birlikte üç düğüm hendek, Birincisi, sonuncusu, ve bir Sadece orta takıldığında söyledi. Ve gerçekten bir bağlantılı liste, Bir dizi farklı dinamiktir. Bu büyüyebilir ve can küçültmek ve yok bilmek ya da peşin nasıl bakmak zorundasınız kadar veri depoladığınız için gidiyoruz, ama biz biraz olmak zorunda çıkıyor Bu nasıl uygulanacağına dikkat. Bu yüzden ilk en biz uygulamak nasıl düşünelim Bu küçük dikdörtgenler biri. Bir int uygulamak kolaydır. Sadece o int n ve say Eğer bir int için 4 byte olsun, ama ben bir int alırım nasıl, n diyoruz ve daha sonra bir gösterici, gelecek diyelim. Biz bu diyebiliriz şeyler şey istediğimiz ama özel bir veri yapısı gerekir. Evet? HEDEF KİTLE: Ampersand [duyulamaz]. DAVID MALAN: Yani işareti biz kullanacağız potansiyel bir düğümün adresini almak. Ama biz başka bir ihtiyacımız C özelliği sipariş Bana oluşturma becerisi vermek Bu özel dikdörtgen, bu özel Değişken hafızada, olacak eğer. HEDEF KİTLE: A struct. DAVID MALAN: Bir struct. Geçen hafta hatırlayın, biz tanıttı yapı, bu nispeten basit kelime bu bize böyle şeyler yapmanıza olanak sağlar. C verilerle gelmedi yapı öğrenciyi denir. Bu int ve şamandıra ve char ile birlikte geliyor Böyle, ancak öğrenci ile gelmiyor, ama biz bir öğrenci veri türü oluşturabilir, Bu sözdizimi ile bir öğrenci yapısı, İşte. Ve tekrar tekrar bu görürsünüz. Yani dert etmeyin Anahtar kelimeleri ezberlemeye, ama önemli anahtar kelime dedik sadece gerçeği yapı ve sonra biz öğrenciyi denilen ve içinde Öğrencinin bir isim ve bir evdi Bir yurt veya benzeri ya da. Ve şimdi, bugün, en bu teklif edelim. Ben birkaç kelime ekledi, ama isterseniz ettik var bu dikdörtgen uygulamak için bir int ve her ikisi de var işaretçi, sen ne olduğumu biliyorum düğüm denilen bir yapı bildirmek için gidiyor. Ben diyecektim, bunun içinde de değilim Bir düğüm, bu dikdörtgen, bir int olduğunu ve biz onu arayacağım n ve Bir sonraki işaretçi vardır. Ve bu, biraz ayrıntılı bir ama bu konuda düşünüyorsanız, Resimde vardı oklar Bir an önce nasıl veri türü vardır? Nerede bu okların her işaret ediyor veri yapısı ne tür mi? Bu sadece kendi başına bir int işaret değil. Bu işaret ediyor Bütün dikdörtgen şey ve bu dikdörtgen şey Biz düğüm denir, dedi. Ve böylece biz tür var yinelemeli bu tür tanımlar bir düğüm, biz, diyelim n adında bir int içerecektir ve bir işaretçi bir sonraki ve denir veri yapısının tipi Bu işaretçi noktaları görünüşte struct düğüm olacak. Yani bu rahatsız edici ayrıntılı bir ve sadece bilgiçlik olmak sebebi biz değil sadece bu demek, hangi açıkçası , çok daha okunabilir görünüyor hatırlama okumak C o çünkü şeyler yukarıdan aşağıya, sağdan sola. Biz noktalı virgül elde edene kadar bu değil Anahtar kelime düğüm aslında var olduğunu. Biz bu tür olmasını istiyorsanız Yani verilerin içinde döngüsel başvuru yapı, biz bunu yapmak zorunda, nerede Biz üstündeki yapı düğüm demek ki bize bu tanımlamanın daha uzun bir yol verir şey, biz yapı düğüm demek o içinde ve daha sonra çok son satırında diyoruz, tamam, C, bu arada, Sadece tüm bu lanet çağrı şey bir düğüm ve durdurma tamamen anahtar yapı kullanma. Yani bu sadece bir çeşit sözdizimsel olduğu sonuçta bize oluşturmanızı sağlar hüner aynen şuna benzer bir şey. Şimdi varsayalım eğer biz So C Bu şeyi uygulamak, nasıl aslında biz bunu Bu geçme başlar? Eh, aslında, yapmamız gereken tek şey sağa ve sadece soldan yineleme tür düğümleri eklemek veya düğümleri silmek ya da istediğiniz yere şeyler aramak, ama bunu yapmak için, en önde gidip yapalım işler biraz daha gerçek bu çünkü Bugüne kadar süper düşük seviyeli olmuştur. Herkes tam anlamıyla ilk olmak ister misiniz? TAMAM. Yukarı gel. Adın ne? DAVID: David. DAVID MALAN: David. Tanıştığımıza memnun oldum. Ben de. Pekala. Ve biz bir numara 9 ihtiyacım var. Değil kadar iyi ilk olarak, belki. Tamam, 9 numaralı. Bir sayı 17, lütfen. Bana biraz geriye dönelim. Sayı 22, lütfen, ve nasıl geriye hakkında Ben herhangi bir elleri görürseniz Tüm ışık veya hiç sahip. Birisi orada gönüllü ediliyor. Eğer gelmek ister misin? Sizin kol zorla gidiyor. 17 Tamam. 22. 26 iniyor. Başkasının ister misiniz forcefully-- yukarı gel. Gerçek bir gönüllü. Yani çok hızlı bir şekilde, eğer Siz düzenlemek olabilir Kendinizi tıpkı Ekranda düğümler. Teşekkür ederim. Ve 26 olacak. Pekala ve hızlı tanıtımları. Yani Davut değilim ve ayrıca nelerdir? DAVID: David. DAVID MALAN: Ve sen? Jake: Jake. SUE: Sue. ALEX: Alex. RAPHAEL: Raphael. TAYLOR: Taylor. DAVID MALAN: Taylor. Mükemmel. Peki bu bizim gönüllüler bugün ve go ahead ve, bu şekilde biraz vardiya ve sadece go ahead ve tutmak Eğer ya sizin yanınızdaki gibi numaralar tutan ilk işareti ve sol elinizi kullanarak, go ahead ve sadece uygulamak Bu oklar, sadece sol eli tam anlamıyla böylece Eğer işaret etmelidir ne işaret ve en kendinizi o yüzden bazı oda vermek görsel olarak aslında kollarınızı görebilir işaret ve sadece işaret edebilir çeşit zemin gayet iyi. Yani burada biz, tek bir bağlantılı liste var iki, üç, dört, beş düğüm başlangıçta ve biz bu özel olması fark var başında işaretçi Anahtar biz takip etmek zorunda, çünkü Bütün uzunluk listesinin nasılsa. Onlar kalacaksın bile bu adamlar, sağa, geriye bellekte arkaya, aslında herhangi bir yerde olabilir bilgisayarın belleğinde. Yani bu adamlar olabilir sahnede her yerde ayakta ve böylece sürece konum olarak iyi, aslında birbirlerine göstererek ama şeyleri tutmak için temiz ve basit, yaparız sadece onları çizmek gibi soldan sağa Bu, ancak büyük boşluklar olabilir Bu düğümler arasında. Şimdi, ben aslında bazı eklemek istiyorsanız yeni değer, en önde gidip yapalım. Biz şimdi bir fırsat var başka bir düğüm seçin. En 55 mallocing ile başlayalım söyleyin. Birisi malloc olmak misin? Tamam, yukarı gel. Adın ne? RAINBOW: Gökkuşağı. DAVID MALAN: Gökkuşağı? Pekala. Malloc Gökkuşağı. Yukarı gel. Şimdi biz kendimize sormak zorundayız algoritmik biz 55 koyabilirsiniz. Yani hepimiz biliyoruz, Açıkçası, nerede o muhtemelen biz çalışıyorsanız aittir bu sıralama tutmak ve siz birini almak eğer geri adım yüzden düşmek yok sahne, bu harika olurdu. Yani aslında, Gökkuşağı, burada benimle baştan başlamak, Çünkü biz şimdi bilgisayardan olarak Bir seferde sadece tek bir değişkeni bakın. Bu ilk düğümü Yani eğer. O bir düğüm değil dikkat edin O, sadece bir işaretçi var o olmak çizilir neden ve işte Bir işaretçi sadece boyutu değil, Bu tam dikdörtgenler biri. Yani biz her birinde kontrol için gidiyoruz yineleme 9 den 55 daha azdır? Hayır. 17 den 55 az mı? Hayır. 22 Az? 26 Az? 34 Az? Ve şimdi, tabii ki Gökkuşağı sonunda aittir. Yani net ve ne Senin adın, Taylor? TAYLOR: Taylor. DAVID MALAN: Taylor arasında Yani sol el ve burada Rainbow elleri, kimin eli de ne işaret etmek gerekiyor Bu listeye 55 eklemek için sipariş? Ne yapmamız gerekiyor? Evet? HEDEF KİTLE: Taylor'ın eli Sol işaret gerekiyor. DAVID MALAN: Kesinlikle. Yani bir düğüm ekleyerek Listenin sonunda içine oldukça basit çünkü Taylor, sadece zemin, yerine noktasına sahip ya da biz, boş arayacağım Boş yokluğu tür bir işaretçi veya özel bir sıfır gösterici, sen sol ile işaret edecek El Gökkuşağı ve ardından Rainbow, nerede sol gereken El muhtemelen gelin? Down. Elini tür eğer iyi değil Burada veya sıralama herhangi kapalı işaret hangi yön. Bu düşünülebilir Bir çöp değeri, ama o işaret eğer bazı bilinen değer, biz olacak sıfır veya boş diyoruz ki tamam Bu bir terim var, çünkü ve biz liste artık tamamlanmıştır biliyoruz. Peki başka var nispeten basit dava? Biz 5 malloc miyiz? Yukarı gel. Adın ne? Tiffany: Tiffany. DAVID MALAN: Üzgünüm? Tiffany: Tiffany. DAVID MALAN: Tiffany. Pekala. Tiffany malloced edilmiştir değeri 5 ile. Yukarı gel. Bu kimse, çok nispeten kolay ama Şimdi işlemlerin sırasını düşünelim. Oldukça kolay oldu sonunda Taylor ile. Sayı 5, tabii ki daha az 9 taşımaktadır ve bu yüzden, biz Tiffany var, David var ve senin adın neydi? Jake: Jake. DAVID MALAN: Jake. Tiffany, Jake ve David. Kimin eli öncelikle güncellenmesi gerekir? Burada ne yapmak istiyorsun? Birkaç olası yolları var, ama Bir veya daha fazla yanlış yolları da var. HEDEF KİTLE: soldakinden ile başlayın. DAVID MALAN: soldakinden ile başlayın. Kim o zaman burada soldaki var? HEDEF KİTLE: İlk. DAVID MALAN: Tamam. Yani ilk ile başlar ve sizi nereye do David'in ellerini olmak güncelleştirmek istiyor? HEDEF KİTLE: 5 Doğru. DAVID MALAN: Tamam. Beşte Böylece Davut, gelin veya Tiffany burada ve şimdi? HEDEF KİTLE: Tiffany 9 işaret? DAVID MALAN: Mükemmel, Binky en haricinde Kafa sadece tür doğru, düştü? Nesi var, çünkü kelimenin tam anlamıyla bu resmi? HEDEF KİTLE: Hiçbir şey işaret ediyor. DAVID MALAN: Nothing Şimdi Jake işaret. Biz tam anlamıyla 9 yetim ettik ve 17 ve tam anlamıyla ettik Bu belleğin tüm sızan tarafından çünkü İlk David'in elini güncellenmesi, işte Doğru olduğu gibi sürece ince Şimdi Tiffany işaret ederek, ama kimse olsaydı Jake işaret etmek görüşte, o zaman kaybettik Bu listenin tamamı. O yüzden geri verelim. Yani iyi bir şey oldu düşmeyeceği ama şimdi düzeltmek edelim. Ne zaman biz ilk yerine yapmalıyız? Evet? HEDEF KİTLE: Tiffany 9'da işaret etmelidir? DAVID MALAN: Yapamam Size bu kadar yakın olsun. 9 kimler işaret etmelidir? HEDEF KİTLE: Tiffany. DAVID MALAN: Pekala. Yani Tiffany 9'da Birinci nokta olmalıdır. Yani Tiffany almalı benzer bir değer Davut'a, hangi görünüyor Bir an için gereksiz, ancak ikinci, çünkü artık gayet iyi adım biz David'in elini güncelleyebilirsiniz Tiffany ve daha sonra eğer işaret Biz sadece tür temiz şeyler kadar Bu bahar gibi tür sanki, Şimdi bu doğru sokma var. Yani mükemmel. Yani şimdi neredeyse oradayız. En tek finalini eklemek edelim değeri 20 gibi değer. Biz son bir gönüllüye malloc olsaydı? Yukarı gel. Yani bu biraz daha zor. Ama gerçekten, kod we ' yazma, sözlü de olsa, sadece bir demet olması gibi Şimdi koşulları, doğru olur? Biz bir durum vardı o aitse kontrol Sonunda, belki başında. Biz döngü çeşit gerekiyor ortasında yer bulmak. Yani senin adın ne o yapsın? ERIC: Eric. DAVID MALAN: Eric? Eric. Tanıştığımıza memnun oldum. Yani biz 20 var. Beşten az? Hayır. Dokuz Az? Hayır. 17 Az? Hayır. TAMAM. O buraya ait ve senin isimleri yine? SUE: Sue. DAVID MALAN: Sue. ALEX: Alex. DAVID MALAN: Sue, Alex ve? ERIC: Eric. DAVID MALAN: Eric. Kimin elleri ilk güncellenen almak gerekir? HEDEF KİTLE: Eric. TAMAM. Yani Eric nerede işaret etmelidir? 22 at. İyi. Ve şimdi sırada ne var? Sue sonra Eric işaret edebilir ve şimdi, eğer çocuklar sadece gayet bazı oda yapmak görsel, şimdi ekleme yaptık. Yani şimdi bir soru düşünelim ama Bizim gönüllüler için size çok teşekkür ederim. Çok iyi yapılmış. İsterseniz, bu tutabilirsiniz. Ve biz güzel bir ayrılık hediyesi eğer var Her bir stres topu almak istiyorum. Bana sadece bu aşağı geçmek edelim. Yani bu paket nedir? Bu inanılmaz gibi görünüyor şimdi var sürece Bir alternatif tanıttı yani sınırlı değildir dizisi Bazı sabit boyutta bir dizi. Onlar dinamik büyüyebilir. Ama biz gibi çok haftalarda gördüm Geçmiş, biz ücretsiz bir şey asla gibi kesinlikle burada bir trade-off var. Bağlantılı bir ters Yani Liste, bu dinamizm nedir? Bu yetenek, açıkçası büyümek ve Biz silme yapmış olabilir gerektiği gibi ve biz küçültmek olabilir. Ne fiyat ödüyoruz? Twice her şeyden önce çok alanı olarak. Resimde bakarsanız, artık ben ben tamsayılar listesini depolamak. I'e ait bir listesini depolamak ediyorum tamsayılar artı işaretçiler. Yani alan miktarını iki katına ediyorum. Şimdi, belki böyle değil büyük bir anlaşma 4 bayt, 8 bayt, ama kesinlikle ekleyebilirsiniz büyük veri kümeleri için. Başka bir dezavantajı nedir? Evet? HEDEF KİTLE: Biz var onları bir-bir hareket. DAVID MALAN: Evet. Biz onları bir-birer hareket ettirmek zorunda. Sen bu super vazgeçti, ne biliyor Kare dirseğin kullanışlı özellik gösterim, daha düzgün Rasgele erişim olarak bilinen, biz sadece atlayabilir nerede bağımsız bir elemana ama şimdi hala olsaydı Burada benim gönüllüler, Ben bulmak istiyorsa 22 numara, ben sadece yapamam braket şey şey atlamak. Ben çok, liste üzerinde bakmak zorunda doğrusal bizim arama örneklerde olduğu gibi, sayı 22 bulmak için. Yani biz orada bir fiyat ödemiş gibi görünüyor. Ama biz yine de can diğer sorunları çözmek. Aslında, bana tanıştırayım görsellerin sadece bir çift. Aşağı oldum Yani eğer Mather'ın Yemekhane son zamanlarda Bunu Hatırlayacaksınız onların Böyle tepsiler yığınları, Biz bu ödünç Dersten önce Annenberg. Yani tepsileri bu yığını olsa da, temsilcisi aslında Bir bilgisayar bilimi veri yapısının. Bir veri yapısı vardır bilgisayar bilimi bir yığın olarak bilinen hangi çok güzel Tam bu görsel için oldukça rahat. Bu kasetlerin her bir değilse Yani tepsi ancak bir sayı gibi ve ben istediğim sayıları saklamak için, ben Burada bir aşağı koymak olabilir, ve ben, burada başka bir yere koymak olabilir ve sayıları istifleme devam birbirlerine ve ne var üstünde Bu konuda potansiyel yararlı Ne ima olmasıdır Bu veri yapısı? Ben çekin hangi numara İlk en uygun? Orada en son tek koymak. Yani bu biz dediğimiz olur bilgisayar bilimi, bir LIFO veri yapısı. , İlk out sürer. Ve uzun neden önce görürsünüz Bu, artık yararlı ama için olabilir Sadece özelliğini düşünün. Eğer düşünüyorsanız ve bu tür aptal yemekhane yapıyor nasıl. Her zaman onlar temiz tepsiler ve üstüne taze olanları koymak, Daha önce temiz olabilir ama sonunda çok kirli ve tozlu çok altında tepsi eğer hiç aslında Bunun altına almak yığın, çünkü sen sadece Yeni koyarak tutmak bunun üstüne temiz olanlar. Aynı şey gerçekleşebilir Bir süpermarkette de. Bir vitrinin varsa süt ve her zaman CVS ya da daha fazla süt alır kim, Sadece sütler kıpırdamak Zaten arka ve Eğer ön yenilerini koymak Eğer bazı oldukça kötü zorunda gidiyoruz veri yapısının sonunda süt, o dibinde daima çünkü ya eşdeğer o arka hep. Ama düşünmek için başka bir yolu var veri ve örneğin, bu sıraya. O insanlardan biri iseniz kim sever Apple mağazaları dışında sıraya ne zaman yeni bir ürün geliyor dışarı, muhtemelen konum Bir yığın verileri kullanılarak değil yapısı sizin için herkes kim uzaklaştıracaktır sıraya bazı yeni oyuncağı satın almak için. Aksine, muhtemelen kullanarak konum veri yapısının ne tür Sistemin veya ne tür gerçek dünyada? Umarım bu bir çizgi, ya da daha fazla Düzgün veya daha fazla İngiliz gibi bir kuyruk. Ve bir kuyruk da olduğunu çıkıyor bilgisayar bilimi veri yapısı, ama bir kuyruk çok var Farklı özellik. Bu LIFO değil. , İlk out sürer. Allah korusun. Bunun yerine FIFO var. İlk giren ilk çıkar. Ve bu iyi bir şey adalet 'uğruna Kesinlikle ne zaman astar ediyoruz sabah süper erken. Eğer size orada ilk alırsanız İlk yanı çıkmak istiyorum. Ve böylece bu verilerin hepsi yapıları, kuyruklar ve yığınlar ve diğerleri salkımları, seni çıkıyor Bu tıpkı bir dizi düşünebilirsiniz. Bu, belki bir dizidir Sabit boyutu 4, ama istiyorum biz sadece kazık eğer tür güzel olacak tepsiler neredeyse sonsuz uzun boylu biz eğer birçok tepsileri veya numaraları vardır. Bu yüzden belki biz istiyoruz Burada bağlantılı listesini kullanın, ama ticaret-off olacak Potansiyel biz daha fazla bellek gerektiğini, biraz daha fazla zaman alır, ama biz yığının yüksekliğini sınırı yok, çok Mather'ın vitrinin gibi yığının boyutunu sınırlamak olabilir, ve bu yüzden bu tasarım kararları veya vardır sonuçta bizim için mevcut seçenekler. Bu verilerle Yani yapıları, biz başladık Potansiyel yeni üst sınırları görme ne daha önce süper hızlı ve biz bırakacağım nerede kapalı, bugün ve nerede biz almak için umut olacak Çarşamba günü, biz olacak Bir veri bakmaya başlar Bizi arama yapmanızı sağlar yapı Günlük bitiş zamanında veri üzerinden yeniden. Ve biz hafta sıfır, hatırlama, gördüm İkili arama veya bölmek olan ve bir ve fethetmek. Bu, henüz geri ve daha iyi geliyor Bu Çarşamba Holy Grail ile gelip olacak Gerçekten çalışan veri yapısı ya da teorik olarak zaman sabiti, bu sayede, o kaç önemli değil milyonlarca ya da milyarlarca şeylerin Biz veri yapısı var, o olacak Bize sürekli zaman alabilir, belki bir adım veya iki adım veya 10 adım ama adımlarla sürekli sayılar Bu veri yapısı üzerinden aramak için. Bu gerçekten Kutsal Kâse olacak ama Çarşamba günü bu konuda daha fazla. Sonra görüşürüz. [MÜZİK OYUN]