[MÜZİK OYUN] DAVID J. MALAN: Pekala. Bu CS50 ve bu Hafta Four sonudur. Ve konulardan biri bugün dijital adli tıp yani, bilgi kurtarma sanatı. Ve gerçekten de, olsa bile Eğer ortasında konum Şu anda Barış Üç at ve Breakout, önümüzdeki hafta, Odak olacak tam da bu etki. Havalı işlerin şimdiye kadar olan Yani bir vardı, geri lisansüstü okulda oldu Ben yerel için çalışırken Middlesex County Bölge Savcısı en ofis, yapıyor adli çalışır. Bu nedenle esas olarak, Massachusetts Eyalet Polisi, zaman zaman, davalar üzerinde çalışırken olur sabit diskler gibi şeyler getirmek ve disket ve hafıza kartları ve benzerleri. Ve onları el istiyorum Bana ve benim akıl hocası için, ve hedefimiz kanıt bulmak oldu, Bu medya üzerinde herhangi, varsa. Şimdi, sen görmüş olabilir Glimpses adli tıp bu dünya medya, televizyon ve sinemada. Ama işim vardı, ve daresay dünya, Bunu görmek istiyorsunuz gibi oldukça değildir. En az bir göz atalım ne muhtemelen gördüm. [VİDEO OYNATMA] -TAMAM MI. Şimdi, sana bir iyi bir görünüm elde edelim. [MÜZİK OYUN] Bunu tut. O geri çalıştırın. Bir dakika bekle. Sağa git. -Orada. Bu dondurun. -Tam Ekran. -Tamam. Bu dondurun. Eğer, bu konuda edecek kadar -Tighten? Bu üzerinde -Vector arka tekerlek ile adam. Burada bu noktada üzerinde -Zoom. Doğru ekipman -with, Görüntü genişlemiş ve bilenmiş edilebilir. Ne o? -Bu Bir geliştirme programı. Misin net o kadar herhangi? -Bilmiyorum. Şunu geliştirmek edelim. Kabiliyetlerinin Bölüm A6. Ben detay geliştirilmiş, ve- -Ben Geliştirmek için yeterli olduğunu düşünüyorum. Benim ekrana bırakın. -Ben Onun gözünde yansımasını gelişmiş. -Hadi Ile bu çalıştırılır video geliştirme. -Edgar, Bunu artırabilirsiniz? -Dayan. -Bunu Bu yansıma üzerinde çalışıyor. -Burada Birinin yansıması. -Reflection. Adamın yüzünün bir yansıması -İşte. -The Yansıması! Bir yansıma -İşte. Aynaya üzerinde -Zoom. Bir yansıma görebilirsiniz. Buradan imajını geliştirmek miyiz? Bunu geliştirmek miyiz? Bunu geliştirmek miyiz? Bu geliştirmek miyiz? Bunu geliştirmek miyiz? Bir saniye tut. Ben geliştirmek gerekir. Kapı üzerinde -Zoom. 10 -Times. -Zoom. Içinde -Move. -Daha. Bekle, dur. -Dur. Bunu -Pause. Bize 75 derece-döndürün Dikey etrafında, lütfen. -Stop. Kısmı geri dön Kapının hakkında tekrar. Bitmap bir görüntü arttırıcı Yakaladım? Biz Pradeep Singh kullanabilir -Belki yöntem pencereleri görmek için. -The Yazılım sanat durumudur. -The Özdeğer kapalıdır. Sağ -with algorithms-- kombinasyonu -Sigara Alınan aydınlatma Bir sonraki seviyeye algoritmaları, ve ben bunları kullanabilirsiniz Bu fotoğrafı geliştirmek. Üzerine -Lock ve z-eksenini büyütmek. Kabiliyetlerinin. Geliştirin. Kabiliyetlerinin. -Freeze Ve geliştirmek. [SON VİDEO OYNATMA] DAVID J. MALAN: Yani olanlardır Tüm kelimeleri, ama onlar değildi Doğru cümle kullanılır. Ve gerçekten de gelecekte, her zaman, , birisi kelime duymak lütfen, Sadece biraz kıkırdama ", geliştirmek". Eğer geliştirmek çalıştığınızda Çünkü, Örneğin, bu ne olur. Yani burada muhteşem bir fotoğraf var. Bu CS50 kendi Daven olduğunu. Ve biz istedik ki varsayalım Onun gözünde pırıltı odaklanmanızı, veya yansıması açıkça kötü adam güvenlik kamerası tarafından yakalanan. Bu ne olur Bir resmi yakınlaştırmak olduğunu Sadece sınırlı sayıda vardır bununla birlikte bulunan bit. Yani alacağı budur. Gerçekten de, Daven gözüne , belki altı piksel ama dört tam olarak ne oluşturmak Orada ışıltılı oldu. Yani Sorun Seti Dört sonuçta olacak Eğer özellikle, bu dünyayı keşfetmek şey doğası gereği Biz dosya g / ç, nerede çağrı i / o sadece bir fantezi yoludur giriş ve çıkış söyleyerek. Nedenle, şimdiye kadar, etkileşimleri Biz bilgisayar ile yaşadım büyük ölçüde olmuştur senin Klavye ve ekran, ancak sabit disk ile çok değil, veya olanlar dışında dosyaların kaydedilmesi kendiniz yazabilir. Sizin programları bugüne kadar var değil, yaratma ve kaydetme edilmiş ve kendi dosyalarını güncelleyerek. Peki, bir dosya nedir? Peki, bir JPEG gibi bir şey. Bu belki bir görüntü ya Facebook'a yüklemek, veya herhangi bir yerde web üzerinde bakın. Nitekim, bu fotoğraf sadece Daven testere JPEG oldu. Ve ne ilginç JPEG gibi dosyalar hakkında Bunlar tespit edilebilmesidir, tipik, bit belirli kalıpları ile. Diğer bir deyişle, ne var ki Bir GIF JPEG ayırır Bir Word bir PING gelen Bir Excel dosyasından belge? Peki, bu sadece farklı bit desenleri. Ve bu farklı desenleri Genellikle bu dosyaların aralığındadır. Böylece Bilgisayarınız bir Kelime açtığında doc veya bir bilgisayar JPEG açtığında, en tipik görünüyor dosyanın ilk birkaç bit. Ve bir model tanırsa, oh, bu bir görüntü, diyor. Bana bunu göstermek Let Bir grafik olarak kullanıcı. Ya da, ah, bu bir Word doc gibi görünüyor. Bana bir deneme olarak kullanıcıya göstermek edelim. Yani örneğin, JPEG, o vardır çıkıyor Oldukça sofistike Kaputun altında. Ama en her ilk üç bayt JPEG, bu üç sayı ile başlar. Böylece bayt, sıfır, bir, iki, bu bölgede en her JPEG, 255, daha sonra sayı 216, daha sonra sayı 255. Ve mümkün olacak ne Gelecek hafta yapmaya başlamak için aslında altında alay edilir JPEG gibi dosya başlık ve bitmap dosyaları gibi, ve görme ne zaman sürece orada oldu Bir bilgisayar kullanarak oldum gibi. Ama genellikle orada ne değil mi Bu gibi ondalık sayılar gibi yazılmış. Bilgisayar bilim adamları yok ondalık konuşmak eğilimindedir. Onlar gerçekten ikili do not speak. Tipik olarak, ne zaman biz istiyoruz sayıları ifade etmek, biz aslında onaltılık kullanmak, hangi Hatırlayacağınız Sorun Set, diyelim ki, Meydan biri, Eğer farklı bir sistem düşünmek. Biz, elbette, tanıdık dokuza kadar ondalık, sıfır ile. Biz ikili hakkında konuştuk. Ve biz gerçekten yok çok burada bu kullanmak için out, bilgisayarlar kullanan çünkü. Ama programcılar çok olacak çoğu zaman, ancak her zaman değil, Sadece, yani onaltılık kullanın Eğer, sizin alfabesinde 16 harf var olarak iki ya da 10 karşı çıktı. Yani daha yüksek saymak nasıl onaltılık dokuz daha? Gidip 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, Bir, sadece sözleşmeyle c, d, e, f, b. Ama ne anahtar her olduğunu Bu tek bir sembolüdür. Hiçbir 10 vardır. Her Çünkü, hiçbir 11, başına var senin basamak, sadece ondalık gibi Sadece ikili gibi ve sadece gerektiği Kongre tarafından tek bir karakter olmak. Peki o zaman biz alfabe onaltılık bizim emrinde. Yani JPEG eğer neye benziyor bu ilk üç yazmak için edildi , ondalık olarak değil bayt ama Örneğin, onaltılık olarak? Ve neden altıgen o yararlı hatta tüm mı? Peki, bir örnek hızlı bir bakış. Ben bit dışarı yazarsanız böylece Bu ondalık Numaraları temsil Bu biraz paslanmış olabilir Şimdi geri birkaç hafta, Sol bir ve ancak Doğru bir oldukça kolaydır. 255 büyük numara biz oldu Sekiz bit ile temsil edebilir. Tüm olanlar oldu. Yani hafif tek kişi ilginç orta biridir. Ve ne tür dışarı yaparsanız matematik, sen, gerçekten, bu anlamak olacaktır biri bu desen ve sıfır 216 temsil eder. Yani sadece için şart izin artık bu doğru olduğunu. Ama neden bu ilginç? Peki, bir bayt, elbette, sekiz bittir. Ve bu düşünüyorsanız çıkıyor Dört bitlik iki parçalarını bir bayt, böyle. Bana sadece bazı boşluk eklemek edelim. Yani önce, sonra. Ben sadece bazı beyaz boşluk ekledik Burada görselleştirme aşkına. Nasıl şimdi temsil edebilir, diyelim ki, onaltılık bit her dört, her dört bitlik dizi? Örneğin, soldaki Yani Şimdi, biz ikili 1111 var. Ondalık bu sayı nedir, Eğer matematik dışarı yaparsanız? Siz olanları bir yere sahip, ikişer ikişer yeri, ayak yer ve sekizli yer. İZLEYİCİ: 15. DAVID J. MALAN: Bu 15 var. Bu yüzden sekiz artı dört yaparsanız artı iki artı bir, biz 15 olsun. Yani aşağıda 15 aşağı yazabilirsiniz 1111, ama burada bütün mesele onaltılık olduğunu, ondalık değil. Bunun yerine yazarak 15, 1-5, Ben, onaltılık o yazmak için gidiyorum Eğer varsa, geri düşünüyorsanız, hangi f yoluyla sıfır, ne 15 olacak? HEDEF KİTLE: f. DAVID J. MALAN: Yani o en f çıkıyor. Ve sen diyerek dışarı çalışabilir, 10 ise iyi, sonra Tamam, f 15 olduğunu. Yani gerçekten, biz yazabilirsiniz f f olarak sayılar aynı seti. Ve sonra matematik biraz yaparsanız, biz d olduğunu anlamak gerekir. Sekiz, oldukça kolaydır çünkü biz Sekiz yerine bir tane. Ve sonra, biz f f en bir çift daha var. Peki insanlar kongre tarafından yapmak eğilimindedir Kullandıkları zaman onaltılık onlar sadece bir daha özlü Bu biraz geç, o beyaz alanı en kurtulmak. Ve sadece süper temiz olması için Bu onaltılık olduğunu okuyucular, arasında basit kongre İnsanlar size sıfır yazma Diğer anlamı yoktur x görsel bir tanımlayıcı daha, Burada bir altıgen numarası geliyor. Ve sonra, iki basamak koymak, f Bu durumda f sonra d, f, f sonra. Yani uzun lafın kısası, onaltılık sadece eğilimi yararlı olduğu her çünkü onun rakam, f yoluyla sıfır, mükemmel hatları dört bitlik bir desen ile. Iki onaltılık basamak var ise, sıfır tekrar F suretiyle, Bu mükemmel size verir Sekiz bit veya bir bayt. Bu eğilimi yüzden de bu geleneksel yararlı olabilir. Hiçbir fikri yok Gerçekten bunun ötesinde içerik, gerçek programı dışında. Şimdi JPEG sadece değil grafik biçimlerini dosya. Sen olduğunu hatırlatmak olabilir Dünyada böyle dosyalar, en azından bir kaç yıl. Peki bu aslında Windows XP yüklü Dünyada bilgisayarların milyonlarca. Ve bu bir bitmap dosyası, BMP oldu. Ve bitmap dosyası olarak gelecek görürsünüz Hafta, sadece noktaların bir desen anlamına gelmektedir, dedikleri gibi piksel, Gerçekten, bit üzerinde harita. Peki ama, ilginç ne, Bu dosya biçimi, BMP hakkında olduğunu Bu başlık altında, onu Sadece üç bayt daha vardır içerir, böylece başlık oluşturmak , ilk birkaç ısırıkları konuşmak. Aslında biraz görünüyor İlk bakışta karmaşık. Ve P set bu görürsünüz. Ve bir şey elde Bu özel dışarı şimdi Sadece gerçek olarak, çok önemli değil her bitmap başında Dosya, bir grafik formatı, sayıların bir sürü var. Şimdi Microsoft, Bu formatta yazarı, Bu çağrı eğilimindedir şeyler değil ints ve karakter ve yüzer ama sözcükler d kelimeler ve uzun ürün ve bayt. Yani sadece farklı veri türlerini konum. Onlar farklı isimler konum Aynı şey için. Ama P Seti Four olduğunu görürsünüz. Ama bu demek sadece bir insan eğer Bazı .bmp dosyasını çift tıkladığında onun ya da onu sabit disk, ve bir pencere açılır ona o görüntü gösteren kadar, Bu işletim nedeniyle oldu Sistem muhtemelen sadece fark BMP dosya uzantısı Dosya adı, ama aynı zamanda gerçek var ki, bazı bit desen kongre başında Bu bitmap dosyasının. Ama şimdi odaklanmak izin Böyle karmaşık bir dosya, ancak bunun yerine böyle bir şey. Ben, gedit burada varsayalım Sadece başlangıçlar var Oldukça basit bir program. Bazı kontör içerir var. Şimdi var #include "structs.h" ama Ben bir an geri buna geleceğiz. Ancak bu artık için yararlıdır. Yani bu bir program Bu uygulamaya gidiyor sicil veritabanı gibi. Yani öğrenci bir veritabanı, ve dünyadaki her öğrenci muhtemelen bazı isim ve bir ev vardır ve diğer şeyler, ama biz basit tutacağız. Her öğrenci bir isim ve bir evi var. Ben bir yazmak istedim Yani eğer Amacı hayatında programı Sadece gelen yineleme oldu üç yukarı sıfır, üç öğrenci varsa Harvard Üniversitesi'nde. Ve ben sadece GetString kullanarak, almak istiyorum, Her öğrencinin adı ve ev, ve daha sonra sadece bu çıktı. Bu Hafta gibi çeşit olduğunu Bir, Hafta İki şeyler şimdi, Ben sadece bir istediğiniz döngü veya böyle bir şey. Ve ben getString bir kaç aramak istediğiniz kez, ve sonra bir kaç kez f yazdırın. Yani olsa, bunu nasıl, ne zaman bir isim ve bir ev hem de Her öğrenci için katılmaktadırlar? Yani benim ilk içgüdüsü olabilir Böyle bir şey yapmak olacak. Ben ilk sıra, bana ver, diyebilirsiniz, isimler olarak adlandırılan dizelerden oluşan bir dizi söylüyorlar. Ve ben bir hardcode üç burada istemiyorum. Ne var koymak istiyorsun? Sadece, çünkü ÖĞRENCİLER Yani üstünde ilan sabit, Ben hardcode zorunda değilsiniz sadece bu yüzden Birden fazla yerde üç. Bu şekilde, ben, o, bir yerde değiştirebilirsiniz ve her yerde bir değişiklik etkiler. Ve sonra, ben yapabilirim dize ÖĞRENCİLERİ evler. Ve şimdi, ben böyle bir şey yapmak olabilir Ben ÖĞRENCİLER <;; for (i = 0 int i ++. Yani hızlı yazarak kulüpler, ama bu Şimdi muhtemelen tanıdık sözdizimi. Ve şimdi, bu daha yeni oldu. I-inci koymak istiyorsanız öğrencinin adı, ben bunu düşünüyorum. Ve sonra, değil isimleri ama evler i paranteze. Ben bu GetString yapmak ve izin bana geri dönmek ve bu hattı düzeltmek. Kabul? Katılmıyorum? Çok kullanıcı dostu değil. Ne yapacağımı kullanıcı söylemedim. Ama şimdi, aynı zamanda ben eğer Daha sonra, diyelim istedim diyelim ki, bu şeyleri yazdırmak Şunları bir konrtol böylece YAPILACAKLAR sonra. Ben daha fazla yapmak için gidiyorum belki isimli bu bu-- doğru bir uygulama isimleri ve evler, üç alıyorum bir kullanıcıdan gelen her bunların toplamı. Ama bu çok iyi bir tasarım hakkı, değil mi? Ne bir öğrenci sadece bir isim varsa ve bir ev değil, aynı zamanda bir kimlik numarası, ve bir telefon numarası, ve bir e-posta adresi, ve belki de bir ana sayfa ve belki Twitter sap, ve diğer detaylar herhangi bir sayı Bir öğrenci ya da bir kişi ile ilgili, daha genel olarak. Eklemek başlayacak nasıl Bu programa işlevselliği? Peki, ben olabilir basit yolu gibi hissediyorum gibi bir şey yapmak diyelim olsun, kimlikleri ÖĞRENCİLERİNE int. Yani orada bütün kimliklerini koyabilirsiniz. Ve sonra, bir şey için telefon numaraları gibi, Ben nasıl emin değilim Henüz bu temsil. Yani öncesinde ve adil çağrı gidelim Bu ÖĞRENCİLERİ, twitters hangi Biraz garip, ama- olduğunu ve alanlar bir demet daha. Ben etkin bir başladım kopyalayıp buraya yapıştırın. Ve bu oldukça büyümeye devam ediyor oldukça hızlı hantal, değil mi? Olsaydı güzel olmaz mıydı dünya veri yapısı, bilinen değil bir int veya bir dize, ancak bir şey olarak üst düzey bir soyutlama, yani Bir öğrenci olarak bilinen, konuşmak? C built-in ile gelmedi Öğrenciler için işlevsellik, ama ben böyle vermek istedim ne olur? Peki, ben gidiyorum, çıkıyor , structs.h burada adında bir dosyayı açmak ve tam olarak bunu yapabilirsiniz. Ve şimdi bu yapmaya başlamak için gidiyoruz. Ve P Seti Üç başlık altında, Zaten şimdi bu yapıyorum. Bir g rect olarak böyle bir şey yoktur ya da programlama dili C bir g oval Stanford'da Dostlarım bu uygulamaya Burada bu yaklaşımı kullanarak veri tipleri, Kendi yeni veri ilan Yeni bir anahtar kelime kullanarak tipleri adı yapı ve bir biri olarak adlandırılan typedef. Ve gerçekten de, olsa sözdizimi şeyler biraz farklı görünüyor Biz, daha önce görmüştüm prensibi, süper basit. Bu sadece "bir tür tanımlar." Anlamına gelir Bu bir olacak yapı ve bir yapı Sadece bir kap gibi Birden fazla şeyler için. Ve bu yapı gidiyor isim adında bir dize var, ve bir dize evini aradı. Ve Sadece kolaylık, diyelim, Bütün bu veri yapısı öğrencisi. Peki an olsun noktalı virgül, şimdi var Kendi veri yarattı tipi olarak adlandırılan öğrenci şimdi, int yanında duruyor ve şamandıra ve Char ve dize, ve g, ru, ve g, oval, herhangi bir sayıda Diğer şeylerin insanların icat. Peki bu konuda yararlı ne Şimdi geri giderseniz olduğunu 0 struct ve bu bitirmek için Yazdığım uygulama, Burada önceden tüm fark kaçınılmaz messiness o Ben ekledi oluyor başlamak üzereydi telefon numaralarını ve twitters ve Bu diğer şeyler Bir öğrencinin tanımı, şimdi kısaca sarılmış oluyor Öğrencilerin sadece bir dizi olarak. Ve şimdi bu öğrencilerin her biri Bunun içinde birden fazla şeyler vardır. Böylece sadece bir soru bırakır. Nasıl ismi de alırım, ve ev ve kimlik, ve ne olursa olsun başka bir Öğrencinin içinde? Süper basit, hem de. Yeni sözdizimi, ama basit bir fikir. Diziye Sadece endeksi, Biz geçen hafta ve bu yaptığı gibi. Ve ne açıkça var sözdizimi yeni parça? Sadece., Demek ki "içeri yapı ve saha denilen olsun isim, ev denilen alan olsun Öğrenci denilen alan olsun. " Yani P Seti Üç de, sen eğer Hala üzerinde çalışıyor, hala ve çoğu millet Senin gibi fark vardır gibi şeyler kullanmaya başlayabilirsiniz g rects ve g oval ve diğer şeyler görünmüyor ki Hafta Zero One, Two veya gelen, Bu Stanford çünkü olduğunu fark Bazı yeni veri türleri ilan etti. Ve gerçekten de, bu tam olarak ne olacak P Seti Four yanı sıra, yapmak, zaman Biz şeylerle uğraşmak başlar görüntüler, bitmap, ve daha fazlası gibi. Yani bu sadece bir teaser ve var gelmek ne için zihinsel bir model. Şimdi, Cloud Biraz bu sabah. Ben ne olduğunu görmek için bir tür merak ediyordum Microsoft duvar aslında bugün gibi görünüyor. Ve 2006 yılında birisi çıkıyor aslında neredeyse kesin gitti Aynı nokta gerçekte fotoğraflamak ne bu gün ki gibi görünüyor. alan şimdi biraz büyümüş. Böylece görüntülerin hemen olarak, burada Daven geri getirsin ekran ve Nicholas, ve sadece hatırlatmak Bu öğle yemeği için bize katılmak isterseniz Bizim her zamanki URL'ye bu Cuma, baş işte. Yani biz Pazartesi günü kapalı bıraktın nerede? Biz doğru, bu sorunu tanıttı? Bu görünüşte bir doğru swap uygulanması, bu sayede siz, iki ints alarak Bir b olarak adlandırılan bir, olarak adlandırılan Laura burada yaptığı gibi, onları takas süt ve su ile sahnede, Geçici kullanılarak değişken veya boş bir fincan, Biz ve bir in içinde b koymak böylece şeylerin bir karışıklık yapmadan, b. Bir değişken kullanılır. Bu geçici denir. Ama temel ne oldu Pazartesi günü bu kod ile sorun nedir? Buradaki sorun neydi? Evet. İZLEYİCİ: Bu daha fazla yer kaplıyor. DAVID J. MALAN: daha fazla Alır uzay, ben bir değişken kullanıyorum çünkü, ve bu Tamam. Bu doğru, ama ben değilim Bu Tamam diyecek. Bu büyük sadece 32 bit var şeylerin düzeni, öyle değil büyük bir anlaşma. Diğer düşünceler? HEDEF KİTLE: Sadece swapları Yerel değişkenler. DAVID J. MALAN: Kesinlikle. Sadece yerel değişkenleri değiştirir. Her zaman bir function-- çağrı Çünkü Ben Annenberg gelen tepsileri vardı son kez, sen alt ana var. En kısa sürede size adında bir işlev çağrısı olarak takas, takas x ve y almaz, Orijinal değerlerin. Ne iddia etmedi, takas get yapar? HEDEF KİTLE: kopyalar. DAVID J. MALAN: Bunlardan kopya Yani. Bu yüzden eğer, bir ve iki alır Son zaman örnek hatırlama, ama bir ve iki kopyası başarıyla takas edilir. Ama ne yazık ki sonunda, Bu değerler hala aynıdır. Yani biz bu görebilirsiniz bizim Yeni arkadaş, umarım GDB, Siz veya TF'ler ve Ca en olması aşağıdaki gibi doğru yönlendirmeye edilmiştir. Yani takas hatırlama yapalım da-- görünüyor Böyle paha görünüyor açmak. Biz iki, birine y x başlatıldı. Baskı f en bir grup vardı. Ama sonra, anahtar arama Burada, takas oldu tam kod biziz Sadece bir an önce gördüm. Hangi ilk başta doğru bakışta, ama işlevsel, Bu programın, çünkü çalışmıyor kalıcı x ve y takas olmaz. Peki, en bu bkz hızlı sıcak olsun Burada GDB, bir ./noswap ile. Ezici bir bilgi demet o Şimdi Kontrol L kurtulmak gerekir. Ve şimdi, ben gidiyorum go ahead ve çalıştırın. Ve ne yazık ki, o Bu kullanışlı değildi. Bu iç programı koştu Program, GDB, bir hata ayıklayıcı denilen ama bana etrafında kurcalamak izin vermedi. Yani aslında duraklama nasıl Bu program içinde yürütme? Yani kırmak. Ve ben herhangi kırılabilir satır numarası, bir, 10, 15. Ama aynı zamanda sembolik kırabilir mola main söyleyerek. Ve bir mola ayarlamak için gidiyor nokta, görünüşe göre, ana hat 16 de. Ve nerede hat 16? Koduyla kadar gidelim ve noswap kadar gidin. Ve gerçekten de, satır 16 ilk programda. Peki şimdi, ben devam eğer ve tipi Bu zaman çalıştırmak girin, o durakladı. Yani etrafında kurcalamak edelim. Neden x'in sıfır x-- Yazdır? Ve dolar işaretini görmezden. Bu meraklısı için sadece var Programın kullanımı. Neden şu anda x sıfır mı? Evet. İZLEYİCİ: Bu hemen önce durakladı hat 16, aslında hat 16. DAVID J. MALAN: Kesinlikle. GDB, varsayılan olarak, duraklatılmış etti Sadece hat 16 öncesi yürütme. Yani, idam değil hangi Bazı bilinmeyen değer olduğu x anlamına gelir. Ve biz bu kadar şanslı var sıfır gibi temiz bir şey. Yani şimdi ben önümüzdeki yazarsanız, şimdi 16 idam. Bana 17 yürütmek için bu bekliyor. Beni öncesinde ve baskı x gidelim. Bu biri. Beni öncesinde ve baskı y gidelim. Şimdi ne görmelisiniz? İZLEYİCİ: [Duyulmaz] DAVID J. MALAN: Biraz daha yüksek sesle. İZLEYİCİ: [Duyulmaz] DAVID J. MALAN: Değil oldukça uzlaşma. Yani evet, bazı çöp değerini görmek. Şimdi, y orada 134514064 olup. Peki, sadece bazı çöp değer. Benim program RAM kullanır Farklı amaçlar için. Diğer işlevleri var. Diğer insanlar benim bilgisayarın içinde yazdı. Yani bu bit kullanılmaktadır diğer değerler, ve ne görüyorum Bazı kalıntıları olduğunu bellek önceden kullanımı. Yani hayır büyük dağıtmak, en kısa sürede, çünkü Ben yanında yazın ve sonra y yazdırmak gibi, o başlatıldı oluyor Ben istiyorum değer. Yani şimdi, en biraz daha hızlı devam edelim. Gelecek N. Tekrar yapalım. Tekrar yapalım. Ama ben vurmak istemiyorum Burada, çünkü eğer ben içeride neler olup bittiğini görmek istiyorum swap, komut nedir? İZLEYİCİ: adımlar. DAVID J. MALAN: adımlar. Yani bu beni adımları yerine üzerinde çok fonksiyonu. Ve şimdi, biraz şifreli var dürüst, ama bu sadece bir Ben şimdi hat 33 olduğumu söylüyorsun. Ve yine bu yapalım. Baskı sıcaklığı. Çöp değeri, negatif bu sefer, ama bu sadece hala çöp değer. Yani sonraki yazdırma sıcaklığı yapalım. Bu, 1 başlatıldı var olan Bir aka x değeri oldu. Şimdi, nerede bizim bir ve gelen x? Peki, biz ana fark bu değerler, x ve y olarak adlandırılır. Daha sonra aşağıdaki gibi onları takas geçti. X virgül y birinci oldu. Ve sonra, takas onlara x ve y diyebiliriz. Ancak netlik sağlamak için, bu kadar a ve b onları çağıran. Ama a ve b şimdi olacak sırasıyla x ve y, kopyaları. Yani GDB geri dönersek, geçici Şimdi biridir ve hemen biridir. Ben şimdi bir sonraki yapmak ve eğer ancak baskı yapmak Bir, bir zaten üzerinde taşındı. süt, eski dökülmüş Portakal Suyu cam, ya da tam tersi. Ve şimdi yanında tekrar yapmak ve eğer Ben bir aklı kontrol olarak yazdırmak, hala iki, ama b şimdi biridir. Açıkçası, hala var. Ben ne geçici umurumda değil. Ama en kısa sürede ben şimdi yazarken, diyelim Şimdi ben sonunda değilim, geri gitmeye devam programı. Ve ne yazık ki, x Hala bir ve y hala iki. Yani orada GDB yarar neydi? Bana düzeltmek yardımcı olmadı Sorun başına, ama umarım bana yardım gerçekleştirerek bunu anlamak evet, benim mantık doğru, ama benim kod sonuçta sahip değil kalıcı bir etki. Yani biz konum bir sorun var Şimdi bugün çözeceğiz. Ama bu arada oraya verelim. Dize bir yalandır. Bu, çok değil, bir veri türü Bu It C var Bazı eşanlamlı oldu başka bir şey için zaman, ve biz takip ettiği ortaya çıkarabilir. Beni go ahead ve açalım Bir program Karşılaştırma-0 denilen. Ve bu bir tip dışarı ziyade, Biz kodu ile yürümeye başlayacağız Ben zaten yazdım, ama sadece bir kaç satır var. Yani bu karşılaştırma-0 edilmektedir. Ve ilk şey yapıyorum metin satırı oluyor. Ama ben ne fark İlk defa yapıyorum. Ne açıkça hat yaklaşık 21 farklı? Aslında, bir dakika bekleyin. Bu kopya ikidir. Bu bile doğru program değildir. Pekala, spoiler uyarısı. Pekala, böylece aldırma. Bu bir gelecekte sorunun cevabı var. İşte 0-karşılaştırmak ve ben bir metin satırı almak için yaklaşık. Programın çok basit. Yani bu basittir. Bu Hafta One, Hafta İki şeyler gibi Şu anda. string s = GetString. Şimdi, ben buraya tekrar söylemek. dize t = GetString. Bu ve daha sonra, son şey Program, isminden de anlaşılacağı gibi, Ben bunları karşılaştırmak için denemek için gidiyorum edilir. Peki s eğer, ilk dize, = t, sonra ben eşittir Aynı şeyi yazın diyecek. Else, söylemek için gidiyorum Eğer farklı şeyler yazın. Yani derlemek ve bu programı çalıştırın. Yani sıfır karşılaştırma yapmak. İyi görünüyor. Hiçbir derleme hataları. Beni şimdi devam edelim ve ./compare-0 yazın. Beni go ahead ve bir şey diyelim : Daven ve bir şey: Rob. Ve ben farklı şeyler yazın. Şimdiye kadar, çok iyi. Program doğru gibi görünüyor. Ama tekrar çalıştırın. Bir şey söyle: Gabe. Bir şey söyle: Gabe. Tamam. Belki boşluk çubuğuna vurmak ya korkak bir şey. Tekrar yapalım. Zamyla Yani. Zamyla. Farklı şeyler. Peki ne oluyor? Bu yüzden bu iki satır var kod, GetString iki defa çağrıldığını. Ve sonra, ben sadece kulüpler s ve t karşılaştırmak için çalışıyor. Ama oluyor, sonra gerçekten ne? Eh, benim el yazısı en hakkında biraz bu örneği kasap. Ve en doğrusu atmak izin Bu kadar buraya, hem de. Yani bir çizgi gibi var string s = GetString. Yani sadece ilk değil Bu programdan ilginç satır. Ama bütün bu zaman oldu ne kaputun altında oluyor? Peki, sol-el yan dize, hangi değişkenin bazı türüdür, ve s denir. Yani bu bellek kullandığını biliyoruz, ya da RAM, nasılsa benim bilgisayar. Yani soyut gidiyorum Bir kare olarak çizebilir. 32 bit, çıkıyor, ama Gelecekte bu konuda daha fazla. Ve sonra, ne burada oluyor? Peki, açıkçası getString kullanıcıdan bir dize alır. Ve GetString var Zamyla veya Gabe veya Daven. Yani ilk tercih edelim Bunların, Daven olan. Peki etkili ne GetString var Bana şekilde birinci durumda, D-A-V-E-N oldu. Ve sonra, başka ne yaptım bana gizlice ver? HEDEF KİTLE: [Duyulmaz] DAVID J. MALAN: Evet, / 0 veya boş karakter. Bu yüzden etkili bir bana bir dize verdi. Ama biz zaten Önceki biliyorum Bir dize sadece bir dizi olduğunu görünüyor karakter ve sona erdirildi var Bu özel Sentinel karakter, / 0. Ama bu doğruysa ve bu bir kare, Bu açıkça bir daha büyük dikdörtgen. Ve gerçekten de, bu, Ben, sadece 32 bit iddia. Ve bu açıkça fazla 32 olduğunu bit, bu muhtemelen çünkü Sekiz artı sekiz artı sekiz artı sekiz artı sekiz, Sadece ASCII bayt çünkü. Nasıl halt biz uygun gidiyoruz Burada bu küçük kutuya Daven? Peki, ne gerçekte getString yapıyor? Peki, bu ızgara burada temsil Benim bilgisayarınızın bellek veya RAM. Yani keyfi eğer diyelim bunların her biri, bir bayt temsil eder Daha sonra her düşünebilirsiniz bayt bir adrese sahip olan, 33 Oxford Street, ya da 34 gibi Oxford Caddesi, ya da 35 Oxford Caddesi. Peki evleri adresleri gibi ve binalar adresleri var, yani bireysel bayt do Bellek adreslerini veya numaraları Bu benzersiz onları tanımlamak. Şimdi, bu keyfi. Ama ben gidiyorum, basit tutmak için Sadece kongre tarafından onaltılık kullanmak, ama 0x başka bir şey ifade daha "Bu onaltılık olduğunu." ve ben iddia gidiyorum "D" bellekte Byte Bir de biter. Ben başka bir şey oluyor var Bellek, yani DAV ilk nokta var Byte Bir de. Bu, daha sonra, 0x2 olacak. Bu 0x3 gidiyor. Bu 0x4 olacak. Bu 0x5 gidiyor. Bu 0x6 olacak. Ama senin bir kez düşünmeye başlayın ne bilgisayarın suçum hakkında Kaputun altında, Eğer anlaması başlayabilirsiniz nasıl, birkaç yıl önce, olur kendisi C hayata geçirdik. Muhtemelen GetString nedir returning-- çünkü o o değil gibi hissediyor dönen DAV, per se olarak, o kesinlikle gitmiyor çünkü Bu küçük box-- sığacak şekilde yani ne GetString muhtemelen dönüyor? İZLEYİCİ: [Duyulmaz] DAVID J. MALAN: Daven yeri. Ve bu yapıyor var Hiç Hafta Bir beri. Ne GetString gerçekten dönen bir dize, başına değil. O küçük beyaz yalanlar biri. Bu adresi dönen ediyor bellekte dize, benzersiz adres. Daven 33 Oxford Street'te yaşıyor. Ama daha özlü, Gavin yaşıyor 0x1 de, Number One Adresi. Peki bu koymak alır küçük kutu, sonra açık olmak Bu dize sadece adresidir. Peki tüm bu zaman, bu vardır devam. Ama bu ipuçları ne Şimdi hepsi eğer olmasıdır Bunun içinde bir dizi, var olan sizi durdurmak için, programcı, herhangi bir sayı koyarak Herhangi bir değişken ve sadece atlama belleğin o yığın? Ve gerçekten de, biz göreceğiz Bu bir tehdit dahaki sefere bu. Ama şimdi, bu yetersiz hissediyor. Ben derseniz, bana bir olsun Dize, bana Daven ver. Ama gerçekten bana Daven vermeyin. Bana ver Tüm Daven adresidir. Sonra Emin nasıl burada DAV başlar ve ends-- Hikaye weird-- alıyorum Daven başlar ve nerede biter, ve sonraki ardından bellekte dize başlar? Peki, teslim eğer Bana Daven başlangıcı, aslında, nasıl biliyor musunuz Onun adının sonu nerede? Bu özel boş karakter, hangi daha da önem şimdi altında dizeleri ise Kaput sadece tanımlanır benzersiz bellekte konumlarına göre. Peki tüm bu zaman, işte ne devam ediyor. Peki şimdi baktığımızda Burada kod, açıklamak Eğer hat 26 hata olur eğer. Neden Zamyla ve Zamyla farklı? Neden Gabe ve Gabe farklı? Evet, arka. İZLEYİCİ: Farklı adresleri var. DAVID J. MALAN: Sadece çünkü onlar farklı adresler var. Eğer GetString çağırdığınızda Çünkü Yine, ben burada hızlı bir şekilde yapacağım, hangi Bu ikinci hat, dize ise t, o programda olduğu gibi, getString başka bir çağrı eşittir. Ben çağrı dahaki sefere GetString, ben gidiyorum belleğin farklı bir yığın almak için. GetString bırakılır işletim sormak için Daha fazla ve daha fazla bellek için sistem. Aynı yeniden gitmiyor Altı bayt her zaman. Bu yeni almak için gidiyor bellek yığın, hangi t almak için gidiyor demektir Burada bazı diğer değer. Ben ne zaman Böylece s = eşittir t, sen karşılaştırarak değil Bu ve bir karşı karşı D Bu ve buna karşı V. Bunu karşılaştırarak konum , burada buna karşı Açıkçası oldukça useful-- useless-- olduğunu oldukça yararsız gerçekten kim çünkü dizeleri bellekte nerede umurunda? Ve gerçekten, biz değil. Ve biz gitmiyoruz Özellikle sevecen başlar. Sadece hata ortaya çıkabilir ölçüde ve güvenlik tehditleri iradesini ortaya çıkabilir biz aslında bu umurumda başlar. Yani bu sorunu çözmek edelim. Süper sadece bunu düzeltmek, çıkıyor. Ve aslında diyelim, I önce Yine ortaya koyuyor, ne olur Bir CS50 sınıfında eğer, yapmak ve uygulamak zorunda İki dizeleri karşı bir karşılaştırma. Sen açıkça sadece s = t eşittir kullanamazsınız. Ama sadece mantıksal, nasıl Bu dize karşılaştırmak istiyorsunuz C kodu kullanarak bu dize karşı? Evet. İZLEYİCİ: Just do döngüsü için [duyulamaz] DAVID J. MALAN: Mükemmel. HEDEF KİTLE: [Duyulmaz] DAVID J. MALAN: Evet. Sadece döngü veya a bir kullanın döngü ya da her neyse ise. Ama sadece temel fikir uygularsanız o Bu bellek veya bir dizinin bir yığınıdır ve bu, üzerinde yineleme her ikisi de aynı anda. Ve sadece harfleri karşılaştırın. Ve bir olmak zorundasın Biraz dikkatli, size, çünkü bir parmak istemiyorum Diğer geçmişte gitmek bir dize olduğundan diğerinden daha uzun. Yani kontrol etmek istiyorum gidiyoruz sonunda bu özel değeri null. Ama gerçekten, bir sonunda, bu kadar basit. Ve açıkçası, biz ihtiyacımız yok Bu tekerleği yeniden icat etmek. İşte Sürüm İki. Ve ne ben burada söylemek için gidiyorum olduğunu yerine s karşılaştırarak, = t eşittir Dize eğer bunun yerine, söylemek için gidiyorum s virgül t karşılaştırılması = 0 eşittir. Şimdi, dize ne karşılaştırmak nedir? Bu, çıkıyor bir işlev olduğunu Amacı hayatında C ile geliyor İki dizeleri karşılaştırmak için. Okuduğumuz Ve eğer, karşılaştırın karıştırın onun Adam sayfası veya belgeleri veya CS50 Referans, o olacak sadece sana o heyecan söylemek negatif ya döner karşılaştırmak numara veya pozitif bir sayı veya sıfır, sıfır anlamına nerede eşitiz. Yani sadece varsayım. Ne olursa anlamına gelebilir Karşılaştırma döner karıştırın Negatif bir değer veya pozitif değer? HEDEF KİTLE: Büyüktür veya daha az. DAVID J. MALAN: Evet, daha büyük ya da daha azdır. Yani bir bütün sıralamak istedim Bir dictionary-- dizeleri demet biz sonunda road-- aşağı olacak gibi Mükemmel işlevi potansiyel kullanımı, o yapacak çünkü Sizin için dizeleri karşılaştırılması, ve söyle Eğer bir b önce gelir yapar, ya da yok b alfabetik önce gelir. Biz tam bunu yapabilirsiniz. Ve ben diğerini yaptım fark Bu örnekte bir şey. Başka ne yüksek değişti Bu ana işlevi kadar? Char *. Ve bu diğer beyaz yalandır. Tüm bu zaman, ne zaman var dize yazıyor, Biz gizlice yeniden edilmiş karakter olarak dize * yani aslında o clang sizi anlıyor. Diğer bir deyişle, CS50.h bölgesindeki ve biz sonunda göreceğimiz gibi, Biz eşanlamlı olarak adlandırılan dize yapılan O char * aynı şey. Ve şimdi, sadece biliyorum * Bu bağlamda, en azından, adresi anlamına gelir. Neyin adresi? Eh, aslında dedim ki char *, ve, * int veya float * değil char * demektir Bir karakter adresi. Yani burada bu küçük kutu, aka dize, gerçekten tipi char * biridir, hangi söyleyerek basitçe bir fantezi yoludur, Bu kutuya bir adres gidecek. Ve ne adres bakın mu? Görünüşe göre, bir karakter. Ama biz kesinlikle olabilir int * ve diğer şeyler var. Ama şimdi, char * gerçekten en çok basit ve ilgi biri. Yani bu sorun gidiyor Yine olsa, yükselmeye. Ben bu programı açmak varsayalım. Şimdi biz tahmin edebilir Bakalım ne bu kod ile yanlış. Bu programda Yani, kopya 0, ben değilim go ahead ve tekrar arayacağım GetString ve s değeri saklamak. Ve sonra, neden bu yapıyorum, Sadece hafta geçmişten gelen bir hatırlatma olarak? Biz GetString dedin bazen null döndürür. Ne olursa demek GetString null döndürür? Bir şeyler yanlış gitti. Muhtemelen dizesi çok demektir Büyük, bellek bilgisayarın dışında. Süper, süper, süper olur nadiren, ama olabilirdi. Biz bunun için kontrol etmek istediğiniz, ve biz yapıyoruz hepsi bu. Eğer yapmazsan biz şimdi göreceğiz Çünkü şeyler için alışkanlıkla kontrol başlayın boş gibi, sen olabilir Aslında gitmek başlar bellekte adreslere geçersiz olduğunu vardır. Ve uyaran başlatmak için gidiyoruz daha fazla segmentasyon hataları. Ya da bir Mac veya PC, sadece Bir bilgisayar neden asmak için ya da bir program potansiyel, dondurma. Peki şimdi, ben, kopya 0.c iddiasına ki ben Bu arada bu dizeleri kopyalamak için gidiyorum 28 satır. Ve sonra, ben gidiyorum alt İstem Burada ben gidiyorum Bunlardan birini değiştirmek için. Peki bu fark. Ben bizim eski dostumuz strlen arıyorum. Ve sadece İngilizce açıklamak Bu hat 34 ne yapıyor? Ne t desteğini 0 yapar Soldaki temsil eder. Evet. İZLEYİCİ: t İlk karakter? DAVID J. MALAN: t İlk karakteri. Işte bu. T İlk karakteri, ben istiyorum Büyük versiyonu atamak için t ilk karakterin. Yani bu birikiminden ilk harfi. Ve sonra, en son şey yapmam Bu program ben burada iddia Orijinal, s, ve burada kopya, t var. Ama hikaye biz sadece dayalı , dizeleri aslında ne anlattı Gerçekten hattı 28 ne yaptığını ve ne gidiş Elde hata Ekranda olmak? Yani ilk, ilk soru, 28. Dize t = s gerçekten ne yapıyor? Biz sol taraftan varsa Burada yan dize t = s; Bu bana bir kutu verir Burada ve bir kutu burada. Ve, bu adres 0x olduğunu varsayalım en keyfi, bu kez, demek 50 let. Ne dize t = s yapar kaputun altında ne? İZLEYİCİ: [Duyulmaz] DAVID J. MALAN: Bu bellek saklar Orada ele, yani 0x50 oraya gider. Şimdi eğer öyleyse, ben ilk gitmek t karakteri ve büyük harfe, Ben etkili bir s ne yapıyorum? Ben gerçekten doğru, aynı şeyi yapıyorum? Çünkü eğer Adres 0x50-- ve sadece ben Burada gemide çok oda yok ancak, bu buraya 0x50 olduğunu varsayalım Benim bilgisayarın belleğinde bir yerde. Ve ben, örneğin, Gabe var Bu gibi burada küçük harf içinde. Ve ben söyledim t dirsek 0 büyük harfle alır. Peki, t dirseği 0 t ilk harfi. Yani küçük g gidiyor olmak büyük G. Ama sorun ne de işaret s mu edilir? İZLEYİCİ: Aynı şekilde. DAVID J. MALAN: Aynı şey kesin. Yani belki de basit bir açıklama, sözdizimi biraz garip olsa bile. O yüzden bu yapalım. Kopya-0 ve daha sonra ./copy-0 olun. Bir şey söyle: Gabe. Ve ne yazık ki, her ikisi de Onları şimdi büyük harfle edilmiştir, ancak bunun için temel biz sadece konum nedeni Şimdi adresleri ile ilgili. Peki biz başlarım adresB hayır cinas intended-- Biz ele başlamak nasıl Bu özel bir sorun? Peki, copy1.c içinde, işler gidiyor Biraz daha karmaşık olsun. Ama iddia ediyorum kavramsal olarak basit bir çözüm. İlk bakışta almak çok zor. İlk kolay olacak değil zaman, belki de, bunu yazın ama sorun bu ise sadece t = s sadece yapıyor kopyalar adresi, ne, Tekrar sana seçebilirsiniz eğer, çözüm olacak aslında bir dize kopyalamak için? İZLEYİCİ: Biz muhtemelen olacak Yine bir döngü kullanmak. DAVID J. MALAN: Evet. Yani biz tekrar bir döngü ihtiyacımız olacak. Ve biz kopyalamak istiyorsanız, çünkü Başka bir dizeye bir dize s, biz muhtemelen bunu yapmak istiyorum karakter karakter. Ama sorun varsa, bir Bu, ilk olarak s şimdi açıkça başlamak gerekir t için bellek ayırma. Diğer bir deyişle, diyelim Bu son bir kez yeniden çizmek. Bu string s = GetString ise. Ve en de, burada bu kadar koyalım. Bu GetString olduğunu. Bir şey için Ve sonra, resim Bu gibi daha önce olacak, G-A-B-e / 0. Yani böyle bir şeyler arar. Ve s nedenle, biz, bu 0x50 çağrı ve bu 51, 52 olacak. Peki bu 0x50 olduğunu. Ve sonra, ben dize t yapmak. Anısına, sadece gidiyor Bana böyle bir küçük kare verin. Yani önemli bir adım şimdi ne? Ben t içine s kopyalamak istiyorsanız, ne Boş burada doldurmanız gerekiyor? Ya biz ne gerekiyor yüksek bir düzeyde mi? Evet? Birisi? Evet. İZLEYİCİ: Biz [duyulamaz] gerekir. DAVID J. MALAN: Evet, biz Bu boş doldurmanız gerekir. Ben kopyalayıp ve olamaz Gabe adını yararlanmak Ben işletim sistemi sormak kadar belleğin bir başka parça için Bu orijinal olarak en azından büyük. Yani bu bir soru ile bize bırakıyor. Ben işletim sistemi değil sormak nasıl Sadece basit bir küçük işaretçi için Bu olarak adlandırılan, bir adresi, bir işaretçi değil basit bir küçük kutu Böyle bir dize denir? Nasıl işletim soruyorlar belleğin büyük bir yığın sistem? Bugüne kadar, sadece o geri kazanılmış ettik dolaylı GetString arayarak. Peki nasıl getString olduğunu onun bellek almak bile? Peki, orada çıkıyor Burada bu diğer işlevi biz şimdi kullanmaya başlayacağız. Şimdi, bu şekilde daha şifreli edemememden görünüyor ve ben bu-- görebilirsiniz tek ben Bu çizgi yolu daha şifreli görünüyor o zaman ilk bakışta gerekir. Ama bunu dışında kızdırmak edelim. Sol tarafta, ben Char * t var. İngilizce Yani, formüle başlayalım teknik jargon uygun cümleler. Yani bu tahsis edilir bir char türünde değişken t denir *. Şimdi, bu gerçekten ne anlama geliyor? Peki, anlamı, ne gidiyorum t denen bu değişken koymak için? Bir char bir adres. Böylece, sadece basit var daha makul bir yol sol tarafını anlatan. Yani burada sadece bu kutu oluşturur. Yani sağ taraf, muhtemelen, gidiyor büyük olduğunu tahsis etmek bellek nasıl yığın? Yani bu ayrı kızdırmak verelim. İlk bakışta ezici ediyor, ama içinde burada ne oluyor? İlk olarak, Malloc, var olan Yeni arkadaş, görünüşte "Bellek ayrılamadı." Yani bu geçirilen argümanı içine, bu yüzden oldukça büyük bir tartışma var. Yani bu ayrı kızdırmak verelim. S strlen, tabii ki, temsil Şeyin HEDEF KİTLE: karakter sayısı. DAVID J. MALAN: Sadece s karakter sayısı. Yani s uzunluğu, orijinal dize. Dolayısıyla, G-A-B-E. Yani muhtemelen dört Bu durumda bulunuyor. Neden sonra 1 yapıyorum s strlen diyorsun? HEDEF KİTLE: [Duyulmaz] DAVID J. MALAN: Bunun için özel boş karakter. Bana sorarsanız uzunluğu ne Gabe adı, ben dört söylemek için gidiyorum. Kaputun altında olsa da, ben ihtiyacım null karakteri için beşinci bayt. Ben 1 yapıyorum yüzden bu. Şimdi sadece durumda, bu çalışan başka bir bilgisayarda program, demek CS50 cihazı, Nerede bir char boyutu farklı olabilir Kendi computer-- gelen Ben bu arayabilirsiniz çıkıyor Operatör sizeof, sadece bilgisayarı sormak Bir boyutu nedir Bu bilgisayarda ateşinde? Ve bu beş çarpılarak Bir karakter boyutu ile örnek olan çoğu bilgisayarda olacak Sadece bir, malloc olacak Benim bu büyük tahsis edecek Burada sağ tarafta üzerinde bellek yığın. Ve return-- gidiyor o yüzden bu bir function-- olduğunu Ne bana geri gidiyor? HEDEF KİTLE: adresi? DAVID J. MALAN: Neyin adresi? HEDEF KİTLE: bellekte Of tahsis? DAVID J. MALAN: Of Bellek o ayırdı. Yani, açıkçası, hiçbir fikrim yok nerede bu sonuna kadar gidiyor. Bunu teklif edeceğim o 0x88 de sonuna kadar gidiyor. Tamamen keyfi, ancak 0x50 dışındaki bir yerde, işletim sistemi, çünkü ne Windows ve Mac OS benim için ne olduğunu o veriyor emin olun Beni RAM farklı parçaları. Peki bu değer bu bellek yığın sonunda olabilir. Yani bu 0x88, burada biter budur. Yani şimdi açıkça, ben anlayabiliyorum bu da aynı değildir, onlar işaret çünkü belleğin farklı parçaları. Ben şimdi aslında bu kopyalamak istiyorsanız içinde, senin önerilen çözüm yapalım. Döngü için bir oluşturmak, Sadece gidelim ve t desteğini yapmak i s i dirseğini alır. Şimdi ben kullanabilir Çünkü Bu dizi gibi notasyonu, Çünkü olsa bile malloc çok jenerik bana bellek ayırır, Bellek sadece bitişik bayt. Byte, bayt, bayt, arka arkaya arkaya. Ben bir programcı olarak kesinlikle can Bir dizi olarak tedavi hangi Ben bu nihayet tanıdık kullanabilirsiniz anlamına gelir sadece bazı köşeli parantez gösterimi. Bu yüzden bana, çünkü orada duralım Bu bile, tek seferde bir çok şey var Temel fikir tekrarlamak için olsa Bu dize, bütün bu zaman, Yeni bir veri türü başına değil. Bu, sadece bir sözde işaretçinin Bir karakterin bir adres, hangi sadece anlamına gelir, bir numara insan kongre tarafından Biz 0x şey olarak yazma eğilimindedir. Ama bu sadece bir sayı var, 33 Oxford Street gibi, hangi olur CS binanın adresi. Bu ayrıntılar üzerinde Herhangi bir sorunuz? Evet? İZLEYİCİ: Neden kontrol yapmak Eşit t için null? DAVID J. MALAN: Neden biz yapmak null eşit t kontrol? Biz documentation-- okursanız Malloc büyük question--, o ince baskı söyleyecek bazen malloc, boş dönmek olabilir Sadece getString gibi. Ve gerçekten de, GetString null döndürür , sırayla, malloc null döndürür eğer, GetString malloc kullandığı için. Ve bu işletim durumunda ne olabilir, Mac OS, Windows, ne olursa olsun, basitçe Sizin için bellek yetersiz. Yani orada ne var. Ve bana bir başka şey ortaya izin sadece aklınızı başınızdan olabilir veya tamamen çok uzak hat üzerinde olması. Ama beni yukarı çekin izin Kopyalama için döngü için aynı, hangi bir an önce, geri çağırma oldu Bu. t dirsek i s i dirseğini alır. Güzel ve kullanıcı dostu. Tekrar Hafta İki gibi hissediyor. Ama bu sürüm aslında olabilir şifreli görünüyor ki bu, olarak yeniden. Bu bir teknik denilen işaretçi var aritmetik, adres aritmetiği. Ama neden bu işi yapar? Şimdi rahatsız edici, C yazarları kullanmaya karar verdi Farklı amaçlar için * sembolü. Biz, zaten bir kez kullanılan gördüm anlamına karakter *, "Bana bir değişken ver Bu içeren gidiyor Bir karakter adresi. " Bu bağlamda Yani karakter * "Bana bir değişken ver" anlamına gelir. Ne yazık ki, * olmadan kullanırsanız önünde bir kelime, karakter gibi, şimdi denir inceleyebilirsiniz operatörü. Ve biz çok önce bu daha göreceksiniz. Ama sadece "oraya gitmek" anlamına gelir. Birisi bana teslim eğer, demek gibi kağıt parçası üzerinde "33 Oxford Street," Ben "* 33 Oxford Street," eğer anlamına gelir "CS binaya yolda gitmek." Yani * sadece orada gitmek anlamına gelir Bunun önünde hiçbir kelime yoktur. Yani açık olmak, t nedir? t yığın adresi Bana geri verildi bellek. sn, açık olmak, ne adresi Örneğin biz tartışırken oldum, küçük gabe mi? adres olduğunu of-- HEDEF KİTLE: dize. DAVID J. MALAN: Gabe orijinal adı Of. Yani adresi var bellek bu yığın. Yani diyorum t + ben-- i, haber, Sadece bizim eski dostumuz. Bu sadece bir dizin değişkeni var Bu yukarı sıfırdan yineleme var dize s uzunluğuna. Yani, daha sonra sıfır, bir olacak daha sonra iki, sonra üç, sonra dört. Yani bu yeni araya izin Çizilmeye benzeri puzzle parçaları, eğer sen, olsa bile, yine, sözdizimi Scratch çok daha gizemli olduğunu. Yani t bir adres + olan Ben bana verecek bir sayı, aşağıdaki çünkü hepsi onaltılık olarak çizim oldum numaralar. Ama onlar sadece sayıları konum. T adresi dedik Yani oldu 0x88, 0x88 artı sıfır budur. Eğer rahat değilseniz bile Henüz altıgen ile, bir tahmin almak. İZLEYİCİ: Orijinal. David J. MALAN: 0x88 Yine. Peki * ne anlama 0x88 geliyor? Bu demektir "oraya gitmek" anlamına gelir etkin "Burada parmağınızı koyun." Ve şimdi sağ tarafta bu ifade, * ve Pars olarak, s ı olan, s anlamına gelir + Burada küçük g kadar ele. s + 0, tabii ki, ne olursa olsun, s, s. Peki şimdi, o * s, var olan sadece * 33 gibi Oxford Caddesi adresine gidin demektir s. Yani burada bu parmak, sağ eli. Peki ne ne kopyalamak için gidiyorum? sağdaki şey, Gabe, burada içine burada küçük g. Ve bu öylesine etkisi döngünün ilk yineleme, Eğer görünüyor olsa bile, önerildiği gibi her şeyden daha çılgın daha karmaşık Daha önce gördüğümüz sadece söyleyerek buraya gidin ve burada bu karakteri kopyalayın. Size iki konumda bir harita veriyor. Ve biz bu çok daha göreceksiniz. Ama şimdi, umut sadece etmektir Bu temel fikirlerden bazılarını tanıtmak. Ve gerçekten de, en bakalım Burada bir final programı, ve daha sonra söz claymation, her şeyin yolunda yapacaktır. Tamam. Yani beni oraya gitmek up-- açalım. Biz geri geleceğiz bana-- Yani izin uzun zaman önce bu resme. Beni burada bu son örneği açalım. Yani burada bir süper, süper başarır programı şunları yapar hayatında hiçbir şey. İlk iki değişken x bildirir ve bu sefer numaraları olmayan y, per se olarak. Onlar başına, tam sayı değiliz. Onlar * görünüşe göre int. Yani sadece herkes, bu ne anlama geliyor Veri türü ise, değişken, tipi int * yıldızı mı? Bu bir int adresi var. Bu yüzden henüz hiçbir fikrim yok. Sadece ", sonunda, koymak anlamına gelir Burada bir int adresi. " O olduğu yerde 0x50, 0x88, Bellek, bir adres oluyor. Ve bu y ne yanı sıra, olacak. Ben şimdi derseniz x = malloc (sizeof (int)), Bu söyleyerek bir fantezi yoludur, hey işletim sistemi, malloc yoluyla, boyutu için bana yeterli bellek ver muhtemelen bir int, bir 32 bit veya dört bayt olacak. Peki malloc ne dönmek? Malloc bir adres verir. Peki x saklanan almak için gidiyor? bir yığın adresi Bellek, dört bayt, bu Malloc Sadece sorarak beni bulundu işletim sistemi. Şimdi arada, çizgi Burada dört, * x = 42. Sadece, açık olmak Orada ne oluyor? Sol tarafta, .x. Bu * 33 Oxford Street gibi. Peki * x ne demek? İZLEYİCİ: gidin. DAVID J. MALAN: bu adrese gidin. Nerede o öbek Bellek ona gidiyorum. Ve tabii ki, orada ne koydu? HEDEF KİTLE: 42. DAVID J. MALAN: 42. Pekala, * y aynı fikir. Y adresine gidin. Orada numara 13 koyun, ama şu anda y nedir? HEDEF KİTLE: hafıza y vardır. DAVID J. MALAN: Orada y için hiçbir bellek. Peki muhtemelen y yapar Biz söyleyerek oldum gibi, ihtiva? İZLEYİCİ: Çöp. DAVID J. MALAN: Bazı çöp değeri. Şimdi, çöp değeri hala bir sayıdır. Hala bir adres yanlış olabilir. Birisi sanki bulunuyor aşağı bir şey karalanmış ve ben anlam olarak yanlış yorumlanabilir Caddede bazı bina. Ve sadece gitmek için deneyin sahibi olmayan bazı bina, veya hafıza bazı yığın değil var Verilen olmuştur, kötü şeyler olabilir. Bilgisayar diğer bazı çökmesine ya da olabilir belirsiz davranış ortaya çıkabilir. Peki, o zaman, Binky bu intro. Hala 20, hatırlıyorum Bazı küsur yıl sonra, Ben ne zaman nihayet nerede işaretçiler anladım. Eğer, demek Hangi Üç dakika içinde burada bırakın ve ben böyle düşünüyorum işaretçileri anlamak, fark Ben 20 için hatırladım Bazı çılgın bir nedenle yıl ne zaman ve neden nihayet battı içinde, benim öğretim oturma adam, Nishat Mehta içinde Eliot Dining Hall arka. Şimdi, ben hatırladım bu çünkü konularda Ben, içinde bir Özellikle, birlikte mücadele etti. Ve sonra, nihayet tıklandığında, gibi konularda bir sürü söylemek cesaret Sonunda olacak. Ve şimdi, tüm hissettirmek için mutlu ve daha inandırıcı, en son bir göz atalım bizim Burada Binky son üç dakika, Bizim arkadaş, Nick Stanford Parlante. [VİDEO OYNATMA] Hey, Binky. Uyanmak! Bu işaretçi eğlence zamanı. Ne o? Işaretçiler hakkında bilgi edinin? Ah, ne güzel! -Peki, Başlamak için, biz konum sanırım Birkaç işaretçileri ihtiyacımız olacak. -Tamam. Bu kod, iki işaretçileri ayırır Hangi tamsayılar işaret edebilir. -TAMAM MI. Eh, ben iki işaretçiler görmek, ama onlar bir şey işaret olmak görünmüyor. -Doğru. Başlangıçta, göstericiler bir şey işaret etmemektedir. dedikleri işaret şeyler pointees ve 's onları kurma Ayrı bir adım. Oh, doğru, doğru. Ben biliyordum. pointees ayrıdır. Er, bu yüzden nasıl bir pointee tahsis edebilirim? -Tamam. Peki, bu kod tahsis Yeni tamsayı pointee, ve bu bölüm setleri x buna işaret etmek. -Hey, O daha iyi görünüyor. Yani bir şey yapın. -Tamam. Ben işaretçi x inceleyebilirsiniz olacak onun pointee içine sayısını 42 saklamak. Bu hile için, ben gerekir benim Çözümleyecek Sihirli Değnek. Başvurusu kaldırıldığında ve -Senin Sihirli Değnek? Ki- bu harika. -Bu Kod neye benzediğini. Ben sadece numarayı ve [POP] kurmak edeceğiz Hey, bak. Orada gidiyor. -Peki X bir dereference aşağıda yapıyor ok onun pointee erişmek için. Bu durumda, orada bir mağaza 42. Hey numarayı saklamak için kullanmayı deneyin Diğer işaretçi 13 y. -Tamam. Ben sadece y buraya gidersiniz, ve sayı 13 ayar kalkmak. Ve sonra, Wand almak Kaldırma ve sadece [BUZZ] Oh! Oh, hey! Bu işe yaramadı. Binky, ben kaldırma sanmıyorum, Say Bildiğiniz çünkü y, iyi bir fikir pointee kurma Ayrı bir adımdır. Ve biz hiç yaptım sanmıyorum. -İyi Bir nokta. -Evet. Biz işaretçi y tahsis, ama biz asla bir pointee işaret olarak ayarlayın. -Çok Dikkatli. -Hey, Sen, orada Binky iyi arıyoruz. O yüzden bunu düzeltmek miyim y noktaları x aynı pointee için? -Tabii. Benim Sihirli Değnek kullanacağız Pointer Atanma. Olacak ki -Bu önce böyle bir sorun? -Hayır. Bu pointees dokunmaz. Sadece bir işaretçi değiştirir Başka aynı şeyi işaret. Oh, ben görüyorum. X aynı yere Şimdi y noktaları. Yani bekle. Şimdi, y sabittir. Bir pointee sahiptir. Yani bir Wand deneyebilirsiniz 13 over göndermek için yeniden dereferencing. Uh, tamam. İşte gidiyor. [POP] -Hey, Şuna bak. Şimdi y işleri kaldırma. Ve işaretçiler paylaşımı çünkü bir pointee ki, ikisi de 13 bkz. -Evet. Paylaşım, ne olursa olsun. Yani biz şimdi yerleri geçmek için gidiyoruz? Ah, bak. Biz zaman bitti. -Ama-- Üç sayılık kuralları hatırlamak -Sadece. Number One, temel yapısı Eğer bir işaretçi olması, ve bir pointee üzerinde işaret. Ama işaretçi ve pointee ayrıdır ve yaygın hata bir işaretçi kurmak için, ama bir pointee vermek için unutmak. Number Two, işaretçiyi kaldırma işaretçi başlar ve üzerindeki ok takip onun pointee erişmek için. Hepimizin bildiği gibi, bu varsa sadece çalışır Bir pointee, hangi tür Number One Kural geri alır. Sayı Üç, işaretçi atama bir işaretçi alır ve işaret onu değiştirir Başka bir işaretçi olarak aynı pointee. Atama sonrası Yani, İki işaretçileri Aynı pointee işaret edecektir. Bazen, bu paylaşım denir. Ve gerçekten, ona orada hepsi. Güle güle şimdi. [SON VİDEO OYNATMA] DAVID J. MALAN: Bu CS50 için var. Önümüzdeki hafta göreceksiniz.