>> [MÜZİK OYUN]
>> Doug LLOYD: Göstericiler, işte buradayız.
Bu muhtemelen gidiyor en zor konu olacak
Biz CS50 hakkında konuşmak.
Ve sen okudum eğer işaretçiler şey hakkında
Eğer biraz olabilir önce korkutucu Bu video girecek.
Bu işaretçileri doğru Size yeteneği izin veririm
belki berbat Oldukça kötü bir şekilde olduğunuzda
değişkenler ve veri ile çalışan, ve program çökmesine neden olur.
Ama aslında gerçekten yararlı konum ve onlar bize gerçekten harika bir yoldur izin
geri veri aktarmak için ve ileri fonksiyonları arasındaki,
biz başka türlü yapmak edemiyoruz.
>> Ve ne yani biz gerçekten Tren burada yapmak istiyorum
Eğer iyi işaretçi disiplinine sahip, öylesine etkili işaretçileri kullanabilirsiniz
Programlarınızı çok daha iyi hale getirmek için.
Dediğim gibi işaretçileri bize farklı bir ver yol fonksiyonları arasında veri aktarmak için.
Şimdi gelen çağırmak durumunda daha önceki bir video ne
konuştuğumuz Değişken kapsamı, bahsettiğim
biz arasında geçmesine tüm veri C fonksiyonları değeriyle geçirilir.
Ve ben bunu kullanmış olabilir terim Orada demek ne
Biz verilerin kopyalarını geçiyoruz oldu.
Biz bir işlev için bir değişken geçirdiğinizde, biz aslında değişken geçirmeden değil
işlevine, değil mi?
Biz bir kopyasını geçiyoruz fonksiyon için bu verileri.
Işlevi ne olacak yapar ve bazı değerini hesaplar,
ve belki de biz bu değeri kullanın onu geri verdiğinde.
>> Bunun tek istisnası için vardı değeriyle geçirmeden bu kural,
ve biz ne anlama come back Bu video daha sonra biraz.
Yerine işaretçileri kullanıyorsanız değişkenleri kullanarak,
veya değişkenleri kullanarak yerine kendileri veya değişkenlerin kopyaları,
Şimdi etrafında değişkenleri iletebilirsiniz Farklı bir şekilde işlevler arasında.
Bu bizim yaparsanız demektir Bir fonksiyonda bir değişiklik,
bu değişiklik aslında alacak Farklı bir fonksiyonu etkisi.
Yine, bu bir şey olduğunu Biz daha önce yapamadık
ve hiç takas denedim eğer bir işlevi iki değişkenin değeri,
Eğer bu sorunu fark ettik sürünen tür, değil mi?
>> Biz X ve Y, ve biz takas istiyorsanız takas olarak adlandırılan bir işleve onları geçmek,
işlev içinde takas değişkenler değişim değerlerini yok.
Bir iki olur, iki olur biri, ama aslında yok
orijinal şeyi değiştirmez işlevi, arayanı.
Çünkü biz değil, biz sadece konum Bunların kopyaları ile çalışıyor.
Olsa işaretçileri ile, biz aslında bir işleve X ve Y geçmektedir.
Bu işlev yapabilir Onlarla bir şey.
Ve bu değişkenler değerler Aslında değişebilir.
Yani bu oldukça değişiklik var verilerle çalışmak için yeteneği.
>> Biz dalmak önce işaretçiler, ben buna değer olduğunu düşünüyorum
Bir kaç dakika alarak Buraya temelleri gidin.
Ve nasıl bir göz var bilgisayar bellek çalışmaları
Bu iki konu gidiyoruz çünkü aslında oldukça birbiriyle olmak.
Muhtemelen bildiğiniz gibi, Bilgisayar sisteminizde
Eğer bir sabit disk ya da belki bir katı hal sürücüsü,
dosya depolama konumu çeşit.
Bu bir yerde, genellikle var 250 gigabayt mahalle
Şimdi terabayt belki bir çift.
Ve bunun nerede hepsi senin Dosyaları sonuçta canlı
Bilgisayarınız kapatmak bile kapalı, sen tekrar açabilirsiniz
ve size dosyaları vardır bulacaksınız tekrar sisteminizi yeniden başlattığınızda.
Ama bir sabit disk sürücüsü gibi disk sürücüleri, Bir HDD ya da bir katı hal sürücüsü, bir SSD,
Sadece depolama alanı bulunmaktadır.
>> Biz aslında bir şey yapamaz Sabit diskte olan veriler,
veya bir katı hal sürücü.
Aslında değiştirmek için veri veya hareket,
Biz bunu taşımak zorunda RAM, rastgele erişimli bellek.
Şimdi RAM, bir sürü var Bilgisayarınızda daha az.
Siz de bir yere sahip olabilir 512 megabayt mahalle
Eğer eski bir bilgisayarınız varsa, belki iki, dört, sekiz, 16,
belki hatta biraz Daha fazla RAM gigabayt.
Yani çok daha küçük, ama işte nerede uçucu tüm verileri var.
Bir şeyleri değiştirmek orasıdır.
Ama bizim bilgisayarı kapatın zaman, RAM içinde tüm verilerin imha edilir.
>> Biz sabit disk olması gerekir İşte bu yüzden bunun daha kalıcı bir yer için,
o exists- böylece olur gerçekten kötü olması halinde her zaman biz
Bizim bilgisayar kapalıyken her Bizim sistemde dosya ortadan kalktı.
Bu yüzden RAM içinde çalışır.
Ve her zaman biz bahsediyoruz Bellek, hemen hemen, CS50 içinde,
Biz RAM, sabit disk değil bahsediyoruz.
>> Bu yüzden belleğe şeyler taşıdığınızda, Uzayda belirli bir miktarda alır.
Veri türleri Tüm bu biz çalışıyoruz
kadar farklı sürebilir RAM uzay miktarları.
Yani her zaman bir tamsayı oluşturmak bellek, değişken, dört bayt
Senin bu yüzden RAM kenara ayarlanır Bu tamsayı ile çalışabilir.
Sen tamsayı bildirebilirsiniz, değiştirmek, atayın
artırılır değeri 10 tek, böylece ve böylece tarafından.
Gerçekleşmesi gerektiğini tüm RAM ve dört bayt olsun
Her için çalışmak Oluşturduğunuz tamsayı.
>> Her karakter size oluşturmak bir bayt alır.
O boşluk ne kadar çok var Bir karakteri saklamak için gerekli.
Her şamandıra, gerçek sayı, dört bayt alır
Bir çift olmadıkça hassasiyetli kayar nokta
yapmanıza olanak sağlar numarası, Daha kesin ya da daha fazla basamak var
ondalık noktadan sonra kesinlik kaybetmeden,
hangi bellek sekiz bayt sürebilir.
Uzun uzun ürünler, gerçekten büyük tamsayılar, Ayrıca bellek sekiz bayt sürebilir.
Kaç bellek bayt dizeleri almak mı?
Peki en bu soru bir iğne koyalım Şimdilik, ama biz geri geleceğiz.
>> Böylece geri bellek bu fikri olarak byte büyüklüğünde hücrelere büyük bir dizi.
Gerçekten öyle, hepsi bu kadar Hücrelerin sadece büyük bir dizidir
tıpkı diğer dizi gibi o Eğer aşina ve görmek,
Her elemanın dışında bir bayt genişliğindedir.
Ve sadece bir dizi gibi, her eleman bir adresi vardır.
Bir dizinin her eleman bir dizin ve biz var
Sözde yapmak için bu dizin kullanabilirsiniz dizide rasgele erişim.
Biz başlamak zorunda değilsiniz Dizinin başında,
Her yinelemenize tek eleman bunların
biz aradığınızı bulmak için.
Biz sadece ben almak istiyorum, söyleyebilirim 15 öğe veya 100 eleman.
Ve sadece bu sayı iletebilirsiniz ve aradığınız değeri olsun.
>> Benzer her yeri bellekteki bir adresi var.
Yani bellek olabilir Bu gibi bir şey.
İşte çok küçük bir yığın var hafıza, bu bellek 20 bayt.
İlk 20 bayt çünkü benim altta orada adresleri
3, 2, 1, 0, ve bu yüzden 19 kadar tüm yol.
Ve ben değişkenleri bildirmek ve ne zaman Ben onlarla çalışmak başladığınızda,
Sistem ayarlamak için gidiyor Benim için bir kenara biraz boşluk
Bu bellek çalışmak Benim değişkenlerle.
Yani Char c sermaye eşittir, diyebilirsiniz H. Ve ne olacak?
Peki sistem gidiyor Bana bir bayt için kenara koyun.
Bu durumda, tercih bayt sayısının Dört, dört adresinde bayt,
ve saklamak için gidiyor Benim için orada mektup sermaye H.
Sonra int hızı derseniz Sınır bu, 65 eşittir
kenara dört set olacak Benim için hafıza bayt.
Ve o tedavi için gidiyor tek bir birim olarak dört bayt
ne çalışıyoruz, çünkü burada bir tamsayıdır.
Ve orada 65 saklamak için gidiyor.
>> Şimdi zaten ben biraz Sana yalan biraz söylüyorum,
Doğru, bunu biliyoruz çünkü Bilgisayarlar ikili çalışma.
Onlar anlamıyorum mutlaka bir sermaye H nedir
ya da 65 onlar sadece, ne İkili, sıfırları ve olanları anlıyorum.
Ve böylece aslında ne biz orada saklıyoruz
H harfi ve sayı 65, değil ama oldukça ikili temsilleri
bunların hangi bakmak Böyle küçük bir şey.
Ve özellikle de tamsayı değişken bağlam,
o, sadece içine tükürmek için gitmiyor o bir dört gibi davranın gitmiyor
bayt yığın mutlaka aslında gidiyor
Dört bir byte parçalar gibi davranın, hangi böyle bir şey görünebilir.
Ve hatta bu değildir tamamen doğru ya,
denilen şey, çünkü değiliz, bir endian,
Şimdi içine almak için gidiyoruz ama Eğer merak iseniz,
küçük kadar okuyabilirsiniz ve büyük endian.
Ama bu tartışmanın uğruna, Bu videonun uğruna,
Sadece ki, olduğunu varsayalım Aslında, nasıl sayı 65 olur
temsil edilebilir Her sistemde bellek,
tamamen doğru olmasa.
>> Ama aslında sadece başlayalım Tamamen bütün ikili kurtulmak,
ve sadece H olarak düşünmek ve 65, bu çok daha kolay
gibi düşünmeye bir insan olarak söyledi.
Pekala, o da görünüyor böylece belki Biraz rasgele olduğunu Ben- benim sistem
bayt 5, 6, 7, bana vermediler, 8 tamsayı saklamak için.
Bunun bir nedeni de var, hangi şu anda içine almak, ama yeterli olmayacaktır
o ne olduğunu söylemek Bilgisayar burada yapıyor
muhtemelen onun parçası iyi bir hamledir.
Bana bu bellek vermek için mutlaka geri geri.
Şimdi bunu yapmak için gidiyor olsa da Başka bir dize almak istiyorsanız,
soyadı denir ve ben istiyorum Orada Lloyd koymak.
Bir tane sığacak gerekir gidiyorum karakteri, bu her mektubu
bir ihtiyaç olacak karakter, belleğin bir bayt.
Ben diziye Lloyd koymak olabilir Yani eğer Bu gibi sağa gitmek için oldukça iyi değil mi?
Ne kayıp?
>> Her dize Çalıştığımız unutmayın C tersbölü sıfır ile biten de birlikte,
ve biz ya, burada geçemeyeceğim.
Biz kenara bir bayt ayarlamanız gerekir bellek yüzden biz tutun
Bizim dize sona erdiğinde biliyorum.
Yani yine bu düzenleme yol şeyler
Hafıza kudreti görünür biraz rastgele
ama aslında nasıl çoğu sistem dizayn edilmiştir.
Katları onları hizaya getirmek dört, nedenlerle daha
biz gerekmez hemen içine almak.
Ama bu, böylece söylemekle yetinelim Bu kod üç satır sonra,
Bu bellek neye benzeyeceğini olduğunu.
Ben bellek konumlarını gerekiyorsa 4, 8, ve 12, benim verileri tutmak için
Bu benim hafıza neye benzeyeceğini olduğunu.
>> Ve sadece özellikle olacak Burada zaman bilgiçlik
biz bellek bahsediyoruz adresleri genellikle biz
yani onaltılık gösterimler kullanılarak yok.
Peki neden tüm bu convert yok onaltılık gösterimde kadar ondalık
sadece genel çünkü nasıl belleğe bakın.
Peki yerine 0 ile olmanın 19, ne var sıfır
Sıfır x1 üç boyunca x sıfır.
Bu bellek 20 byte biz ya da biz bu görüntüde bakıyoruz var
tam burada.
>> Yani bu söyleniyor hepsi edelim Bir saniye bellekten uzaklaşın
ve geri işaretçileri.
İşte en önemli şey hatırlamak
Biz işaretçileri ile çalışmaya başlamak olarak.
Bir gösterici bir şey değildir bir adres daha fazla.
Tekrar çünkü söyleyeceğim o, bu önemli
bir işaretçi başka bir şey değildir bir adres daha fazla.
Göstericiler yerlere adresleri bellekte değişkenler yaşadığı.
Umarım bir hale bilerek kolay biraz onlarla çalışmak için.
Sevdiğim başka bir şey yapmak sıralamak sahip olmaktır
görsel ne temsil diyagramları kod çeşitli hatları ile oluyor.
Ve biz bu bir çift yapacağız işaretçileri kez,
ve biz dinamik hakkında konuşmak bellek ayırma de.
Ben bu diyagramlar düşünüyorum çünkü özellikle yararlı olabilir.
>> Ben mesela söylemek eğer öyleyse, int k benim kod, ne oluyor?
Peki temelde ne olduğunu oluyor Ben, benim için bir kenara bellek alıyorum
ama ben bile sevmiyorum Ben, böyle düşünmek
Bir kutu gibi düşünmek istiyorum.
Bir kutu var ve bu kadar yeşil renkli çünkü ben
Yeşil kutulara tamsayılar koyabilirsiniz.
Bir karakter I olsaydım mavi kutu olabilir.
Ben oluşturma Ama ben her zaman diyorum tamsayıları tutabilir bir kutu
Bu kutu yeşil renklidir.
Ve ben kalıcı bir kalem almak ve bunu tarafında k yazın.
Yani, k adında bir kutu var içine ben tamsayılar koyabilirsiniz.
Ben int k derken Yani, işte Ne kafamın içinde olur.
Ben k beş eşittir derseniz, ben ne yapıyorum?
Eh, ben beş atıyorum kutuda, doğru.
Bu ise, oldukça basittir Ben int k, k denilen bir kutu oluşturmak söylüyorlar.
Eğer ben, k 5 eşittir demek kutunun içine beş koyun.
Umarım bu bir sıçrama çok fazla değil.
Şeyler nereye İşte gerçi ilginç küçük.
Ben int * pk derseniz, iyi bilmiyorum bile bu mutlaka ne demek biliyor,
açıkça bir şey var bir tamsayı ile yapmak.
Yani renk gidiyorum Yeşil-imsi Bu kutu,
Ben bir şey var biliyorum bir tamsayı ile yapmak,
ancak bir tamsayı kendisi değil, bir int yıldızı çünkü.
Bir şey biraz var Bu konuda farklı.
Yani bir tamsayı işin içinde, ama aksi var:
çok farklı değildir ne hakkında konuşuyorduk.
Bu bir kutu, onun, bir etiket var Bir etiket pk giyiyor,
ve holdingin yetenekli Bu ne olursa olsun, int yıldızlı.
Onlar bir şey var tamsayılar ile açıkça.
İşte son satırı olsa var.
Ben dersem pk = & k, dur, Ne sadece doğru, ne oldu?
Yani bu rasgele sayı, rastgele sayı, orada kutunun içine atılan.
Olduğunu Tüm pk olduğunu k adresini alır.
K bellekte yaşadığı Yani yapışmasını ediyorum onun adresini kendi bayt adresi.
Ben yapıyorum Tüm diyorum olduğunu bu değer ben gidiyorum ne
Benim kutu olarak adlandırılan pk içine koymak için.
Ve bunlar, çünkü işaretçiler ve seyir çünkü
Sıfır x gibi bir dizge Sekiz sıfır c yedi dört ila sekiz
İki sıfır muhtemelen çok anlamlı değil.
Biz genellikle işaretçiler görselleştirmek zaman, biz aslında işaretçiler olarak bunu.
Tr bize bilgi verir Biz bellekte k bulmalıyız.
Yani temelde pk içinde bir ok vardır.
Ve biz uzunluğu yürümek O ok, hayal
Eğer üzerinde yürüyebilir şey, biz ise ok uzunluğu boyunca yürümek,
Bu okun çok ucunda, biz bellekte yer bulacaksınız
Nerede k yaşıyor.
Ve bu gerçekten önemli k nerede yaşadığını bildiğimiz çünkü bir kez,
Biz verilerle çalışmak başlayabilirsiniz bellek konumu içinde.
Biz ufacık alıyoruz rağmen Şimdilik öncesinde kendimizi ısırdı.
>> Yani bir işaretçi nedir?
Bir gösterici olan bir veri öğesi olduğunu değer bir bellek adresidir.
That was sıfır x sekiz sıfır şeyler olduğunu oluyor, bu bir bellek adresi oldu.
Bu bellekte bir yer oldu.
Ve bir işaretçi türü tür açıklar
Verilerin en bulacaksınız bellek adresi.
Yani int yıldız kısmı sağ var.
O oku takip ederse, bu kadar bir yerde bana yol gidiyor.
Ve bu konum, ne Benim örnekte orada bulacaksınız,
yeşil renkli kutu.
O ne var, bir tamsayı var ben Ben o adrese giderseniz bulacaksınız.
Bir veri türü pointer ne anlatır
O bellek adresinde bulabilirsiniz.
Yani burada olsa gerçekten harika bir şey.
Göstericiler bizi geçmesine izin fonksiyonlar arasındaki değişkenleri.
Ve aslında değişkenleri geçmesi ve bunların kopyalarını geçemiyor.
Bildiğimiz Çünkü eğer tam olarak nerede bellekte bir değişkeni bulmak için,
Biz bir kopyasını yapmak gerekmez o, biz sadece bu konuma gidebilir
ve bu değişken ile çalışmak.
Özü işaretçileri Yani sıralama Bir bilgisayar ortamı yapmak
çok daha gerçek dünya gibi, doğru.
>> Yani burada bir benzetme var.
Diyelim ki bir defter var diyelim, Doğru ve notlar dolu.
Ve ben bunu güncellemek istiyorum.
Sen bir fonksiyonu olduğunu güncellemeler notlar, doğru.
Bu arada biz oldum Şimdiye kadar çalışan ne
sen benim dizüstü alacak olan olur, Eğer kopya mağazaya gidersiniz
Eğer bir Xerox kopyasını yapacağız Defterin her sayfası.
Sen geri dizüstü bırakacağım masamın üzerinde işiniz bittiğinde,
Gidip bir şeyler dışarı çapraz olacak benim tarih ya da yanlış dışında notebook,
ve sonra geri geçeceğiz Bana Xerox sayfalarının yığını
bu benim dizüstü bir kopyası ile bunu yaptığınız değişiklikler.
Ve bu noktada, bu bana kalmış Çağıran fonksiyon, arayan olarak,
notlarınızı almaya karar ve Benim notebook içine geri entegre.
Yani adımlar bir çok şey var Burada yer alan, doğru.
Gibi daha iyi olmaz Ben sadece derseniz, hey, sen can
benim dizüstü güncelleme Bana, sen benim dizüstü el
ve şeyler almak ve kelimenin tam anlamıyla onları geçmek
ve benim dizüstü benim notları güncelleyin.
Ve sonra bana dizüstü geri ver.
Bu tür ne işaretçileri, yapmamızı sağlayacak
bu ortamda çok yapmak biz gerçekte nasıl işlediği gibi daha fazla.
>> Böylece Pekala ne var Bir gösterici, konuşalım olduğunu
işaretçileri C çalışmak ve nasıl nasıl onlarla çalışmak başlayabilirsiniz.
Yani çok basit bir işaretçi var C null işaretçi çağırdı.
Hiçbir şey boş gösterici noktaları.
Bu gibi bu muhtemelen görünüyor aslında çok yararlı bir şey,
ama biz göreceğimiz gibi Daha sonra küçük, aslında
Bu boş göstericidir varolduğunu aslında gerçekten kullanışlı gelebilir.
Ve bir işaretçi oluşturmak zaman ve Eğer değeri immediately- set yok
ayarları için bir örnek değeri hemen
Geri birkaç slaytlar olacak I, pk ve k eşittir, burada bahsedilen
pk olarak, k adresini alır Biz bunun ne anlama geldiğini görürsünüz
biz kod nasıl göreceksiniz shortly- Biz bir şey onun değerini ayarlayın yoksa
Hemen anlamlı, Her zaman gerekir
null noktasına işaretçinizi ayarlayın.
Sen hiçbir şey işaret etmek ayarlamanız gerekir.
>> Bu çok farklı olduğunu olduğu gibi, sadece değeri bırakarak
ve daha sonra bir ilan işaretçi ve sadece varsayarak
Bu nadiren doğru çünkü boş olduğunu.
Yani hep ayarlamanız gerekir bir işaretçi değeri
onun değerini yoksa null Hemen anlamlı bir şey.
Sen kontrol edebilirsiniz işaretçinin değeri olup olmadığını eşitlik operatörü kullanılarak null
(==), Sadece herhangi bir tamsayı karşılaştırmak gibi değerler veya karakter değerleri kullanarak (==)
de.
Bu sabit özel bir tür olduğunu Eğer test etmek için kullanabileceğiniz bir değer.
Yani çok basit oldu pointer null işaretçi.
Başka bir yol oluşturmak için Bir gösterici ayıklamak için
Bir değişkenin adresi Zaten yarattık,
ve & bu kullanarak bunu Operatör adres çıkarma.
Hangi biz zaten daha önce gördüm İlk diyagram örnekte ben gösterdi.
X biz ettik değişken Yani eğer Zaten tipi tamsayı oluşturulan
Daha sonra ve x bir tamsayı bir göstericidir.
& x iskemik, & ayıklamak için gidiyor hatırlıyorum Sağdaki şey adresi.
Ve bir işaretçi sadece bir adres olduğundan, daha & x bir tamsayı bir göstericidir
kimin değeri nerede hafıza x hayatımızda olduğunu.
Bu x adresi.
Yani & x x adresidir.
Şimdi bu bir adım atalım Daha fazla ve bir şey bağlanın
Ben bir önceki video ima.
Arr çiftler bir dizi daha sonra ise & arr köşeli ayraç i göstericidir
Bir çift için.
TAMAM.
Ben, eğer köşeli ayraç arr arr, çiftler bir dizidir
Daha sonra i köşeli ayraç arr bu dizi i'nci elementi,
ve & köşeli ayraç arr i nerede olduğunu Hafıza arr i-inci elemanı vardır.
>> Yani ima burada ne var?
Bir diziler isim, ima Bütün bu şey,
Bir dizinin adı olduğunu Aslında kendisi bir işaretçi.
Sen çalışıyoruz boyunca işaretçiler
Bir dizi kullandım her zaman.
Örnekten Ol Değişken kapsamı,
Ben sunmak videonun sonuna doğru bir işlevi vardır bir örnek
denilen set int ve fonksiyon seti dizi denir.
Ve meydan belirlemek için olup olmadığını, ya da ne
biz baskılı değerler fonksiyon sonunda,
Ana programın sonunda.
>> O örnekte hatırlayacak olursak veya video izledim eğer,
Eğer çağrısını sen- zaman olduğunu biliyorum set int etkin bir şey yapmaz.
Ama çağrı dizisi yapar ayarlamak için.
Ve ben bir çeşit neden geçiştirilmiştir o zaman böyleydi.
Ben sadece iyi o, bir dizi olduğunu var, dedi Özel, bilirsin, bir sebebi var.
Bunun nedeni bir dizi en olduğunu isim, gerçekten sadece bir işaretçi
ve bu özel var köşeli ayraç sözdizimi o
çalışmak şeyler çok güzel yapmak.
Ve onlar fikrini yapmak çok daha az korkutucu işaretçisi,
onlar sıralama olmamızın sebebi ve işte bu şekilde sundu.
Ama gerçekten diziler sadece değineği vardır.
Ve bu yüzden ne zaman biz , diziye bir değişiklik yaptı
Biz parametre olarak bir dizi geçtiğinde bir işleve veya bir argüman olarak
dizinin bir fonksiyonu, içeriği Aslında her iki Aranan değişti
ve arayanı.
Diğer her türlü için hangi Gördüğümüz değişken durum böyle değildi.
Böylece tutmak için sadece bir şey var Eğer işaretçileri ile çalışırken mind,
olduğu bir ismi Dizi aslında bir işaretçi
Bu dizinin ilk elemana.
>> Tamam şimdi biz bütün bu var gerçekler, haklı, devam edelim.
Neden umurumda mı nerede bir şey yaşıyor.
Dediğim Şey gibi, oldukça var bir şey nerede yaşadığını bilmek yararlıdır
bu yüzden oraya gitmek ve değiştirebilirsiniz.
Onunla çalışmak ve aslında şey var sizi
Bu değişken almak etkisi yapmak istiyorum, ve bunun bazı kopyası üzerinde etkili değildir.
Bu dereferencing olarak adlandırılır.
Biz referans gidip Biz orada değeri değiştirin.
Biz bir işaretçi varsa ve bu yüzden denir pc ve bir karaktere işaret,
o zaman biz * pc ve pc * olduğunu söyleyebiliriz Biz gidersek biz ne bulacaksınız adı
adres pc.
Ne var bulacaksınız bir karakterdir ve * pc biz de verilere bakın nasıl
Konumu.
Yani biz gibi bir şey diyebiliriz * pc = D veya böyle bir şey,
ve o ne demekse bellek adresi pc oldu
ne olursa olsun karakter önce oldu Biz pc = D * söylüyorlar eğer orada, şimdi D.
>> Yani burada biz tekrar gitmek Bazı garip şeyler C, doğru.
Yani biz olarak önceden * gördüm nasılsa veri türünün bir parçası,
ve şimdi kullanılan ediliyor biraz daha farklı bir içerik
bir yerde verilere erişmek için.
Ben biraz kafa karıştırıcı olduğunu biliyorum ve aslında bu bütünün parçası
gibi, neden işaretçiler bu mitoloji var çevrelerindeki çok karmaşık olarak,
dürüst, bir sözdizimi sorunu türüdür.
Ama * Her iki bağlamlarda kullanılır Her iki tip adının bir parçası olarak,
ve biz biraz görürsünüz Çok başka bir şey daha sonra.
Ve şu anda dereference operatörü.
Yani referans gider, bu verilere erişen
işaretçi konumu, at ve irade bunu değiştirmenize olanak verir.
>> Şimdi, bu çok benzer Komşunu ziyaret, doğru.
Eğer biliyorsanız ne Komşu sen, yaşıyor
Komşunuz ile asılı değil.
Sen ne biliyorsun için Yaşadıkları nerede olduğunu biliyor,
ama bu kadar anlamına gelmez Bu bilgiye sahip erdemi
Eğer onlarla etkileşim vardır.
Eğer onlarla etkileşim istiyorsanız, Eğer, evlerine gitmek zorunda
Onların yaşadıkları yere gitmek zorunda.
Ve bunu bir kez, o zaman etkileşime girebilir
Onlarla sadece isterdi gibi.
Ve benzer değişkenlerle, onların adrese gitmek gerekir
Bunları etkileşim istiyorsanız, Sadece adresini bilmiyor olabilir.
Ve adrese gitmek yoludur *, inceleyebilirsiniz operatörünü kullanın.
Sen olur ne düşünüyorsunuz biz denemek ve eğer inceleyebilirsiniz
, değeri bir işaretçi null?
Boş olduğunu hatırlayın işaretçi hiçbir işaret eder.
Denemek ve inceleyebilirsiniz eğer öyleyse hiçbir şey bir adres şey gitmek veya
Eğer olur ne düşünüyorsunuz?
Peki tahmin edersem segmentasyon Fay, haklı olurdunuz.
Eğer denemek ve inceleyebilirsiniz Eğer bir boş gösterici,
Bir segmentasyon acı arıza. Ama bekle,
Ben, sana söylemedim Eğer gidiyoruz değil
sizin değerini ayarlamak için sizin Anlamlı bir şey işaretçisi,
null ayarlamanız gerekir?
Ben yaptım ve aslında segmentasyon Arıza iyi davranış türüdür.
>> Hiç bir değişken ilan ve var Hemen değerini atanmamış?
Yani sadece int x söylüyorlar; Bunu yapmazsanız Aslında bir şey atamak
ve daha sonra da kodunuzu, Eğer, x değerini yazdırmak
hala sahip bir şey onu atadı.
Sık alırsınız sıfır, ama bazen
bazı rasgele numara almak ve belki Eğer gelen hiçbir fikrim yok.
Benzer şeyler yapabilirsiniz işaretçileri ile olur.
Bir işaretçi bildirdiğinizde int * Örneğin pk,
ve sen bir değere atamak yok Eğer bellek için dört bayt olsun.
Ne olursa olsun dört bayt Sistem belleği can
bazı anlamlı değere sahip olduğunu bulmak.
Ve orada olabilirdi zaten orada bir şeyin
Başka gerekli artık bir fonksiyon, sadece var ve bu yüzden
ne veri yoktu.
>> Ne dereference yapmaya çalıştım eğer Sen orada don't- bazı adres
Zaten bayt ve bilgiler Orada, o senin işaretçi artık var.
, Sen çalışırsanız ve bu işaretçi inceleyebilirsiniz Bazı bellek ile karıştırmasını olabilir
Eğer niyetinde olmadığını hepsi ile karışıklık.
Ve aslında sen yapabilirsin Gerçekten yıkıcı bir şey,
gibi başka bir programı kırmak, ya da başka bir işlev kırmak
ya da kötü niyetli bir şey yapmak Eğer hiç yapmak niyetinde değildi.
O yüzden Ve böylece var aslında iyi bir fikir
eğer null olarak sizin işaretçiler ayarlamak için Anlamlı bir şey bunları ayarlamanız gerekmez.
Bu muhtemelen daha iyi Programınızın için günün sonu
bunu yapmak için daha sonra çökmesine şey bu kadar vida
Başka bir program veya başka bir işlev.
Bu davranış, hatta muhtemelen Sadece çökmesini daha az ideal bir.
O yüzden Ve böylece var Aslında iyi bir alışkanlıktır
senin işaretçileri ayarlamak için içine almak için Eğer bunları yapmazsanız null
anlamlı bir değere Bildiğiniz hemen bir değer
ve size inceleyebilirsiniz güvenle yapabilirsiniz.
>> Yani şimdi geri gelmesine izin ve bir göz atın durumun genel sözdizimi de.
Ben int * p diyorsanız ;, ben sadece ne yaptım?
Ne yaptık bu.
Ben p değeri bir adres olduğunu biliyorum tüm işaretçiler sadece çünkü
adresleri.
I can dereference p * operatörü kullanılarak.
Çok burada Bu bağlamda, Üst * Çeşidi parçasıdır hatırlamak.
Int * veri türüdür.
Ama ben inceleyebilirsiniz can * operatörü kullanılarak p
ve ben bunu yaparsanız, o adrese gitmek, Ben bu adreste bulacaksınız olacak?
Ben bir tamsayı bulacaksınız.
Yani int * p temelde diyerek, p bir adres.
I can p inceleyebilirsiniz ve eğer Yapmam, ben bir tamsayı bulabilirsiniz
bellek konumunda.
>> Tamam bu yüzden başka olduğunu söyledi yıldız ile can sıkıcı şey
ve burada orası yıldız ile can sıkıcı bir şeydir.
Hiç beyan denediniz Aynı türden birden çok değişken
kod aynı satırda?
Yani bir saniye, bu hat iddia Aslında yeşil orada var kod
yok ve sadece int x, y, z der ;.
Bu ne yapardı aslında oluşturmak olduğunu sizin için üç tamsayı değişkenler,
biri olarak adlandırılan x tek adlandırılan y ve z adı, bir.
Bu olmadan bunu yapmak için bir yol var üç satır üzerine bölmek zorunda.
>> Yıldız nereden İşte Tekrar olsa can sıkıcı,
* aslında bir parçası olduğu için hem tip adı ve parçanın
değişken adı.
Ve bu yüzden diyorum eğer int * px, py, pz, ne Aslında olsun bir tamsayı bir göstericidir
px ve iki tamsayılar, py ve pz denir.
Ve muhtemelen değil ne var biz bu iyi değil, istiyorum.
>> Birden işaretçiler oluşturmak istiyorsanız Yani Aynı hat üzerinde, aynı tipte,
Aslında ne gerek ve yıldız, yapmak * pb, * pc, int * pa söylüyorlar.
Şimdi sadece söyledikten ve şimdi, sana söylüyorum
muhtemelen bunu asla.
Ve, dürüstçe muhtemelen iyi bir şey var Eğer yanlışlıkla olabilir çünkü
Bir yıldız, böyle bir şey yok sayın.
Belki beyan muhtemelen en iyi Bireysel hatlarda işaretçileri,
ama sadece bir tane var bu can sıkıcı sözdizimi
yapmak yıldızlarla şeyler çalışmak çok zor işaretçileri.
Sadece bu sözdizimsel Çünkü karışıklık Üzerinden çalışmak zorunda.
Uygulama ile öyle Gerçekten ikinci doğa haline gelir.
Hala hala onunla hata yapabilir 10 yıl programlamadan sonra,
bir şey olursa çok üzgün olmayın Size, dürüst oldukça yaygındır.
Bu tür gerçekten sözdizimi bir kusur.
>> Tamam ben tür söz biz tekrar olacağını
ne kadar büyük kavramı bir dizedir.
Peki ben bir söyleseydim Dize, biz tür gerçekten ettik
Size bütün zaman yalan.
Diye bir veri tipi var dizisi, ve aslında
birinde bu sözü bizim veri türleri üzerinde erken videolar,
Bu dize veri türü olduğunu CS50.h. sizin için yaratıldı
Sen #include zorunda Kullanmak amacıyla CS50.h.
>> Peki dize sadece gerçekten bir şey için bir takma ad
char * olarak adlandırılan Bir karaktere işaretçisi.
Peki göstericiler, hatırlama, Sadece adresleri vardır.
Yani boyutu nedir bir dize bayt?
Peki dört veya sekiz.
Ve neden diyorum dört veya Sekiz bunun nedeni aslında
Eğer kullanıyorsanız, sisteme bağlıdır CS50 ide, char * char büyüklüğünde
* Bir 64-bit sistem var, sekiz.
Bellekteki her adres 64 bit uzunluğundadır.
Eğer CS50 cihazı kullanırken ediyorsanız veya herhangi bir 32-bit makine kullanarak,
ve o dönem 32-bit duydum Makine, 32-bit makine nedir?
Peki bu sadece her demektir bellek adres 32 bit uzunluğundadır.
Ve böylece 32 bit dört bayt.
Yani bir char * dört veya sekiz sisteminize bağlı olarak bayt.
Ve gerçekten herhangi bir veri tipleri, ve herhangi bir veri işaretçisi
tüm işaretçiler sadece beri yazın adresleri, dört veya sekiz bayt.
Yani bu dönelim şeması ve en sonuçlandırmak edelim
Burada küçük bir egzersiz ile bu videonun.
Yani burada biz bıraktığımız diyagram Videonun başında.
Ben * pk = 35 derseniz Peki şimdi ne olacak?
Bu yüzden * pk = 35, dediğim zaman ne demek?
Bir saniye sürer.
* pk.
Burada kapsamda, * bir dereference operatörü.
Peki ne zaman inceleyebilirsiniz Operatör, kullanılan
Adres işaret biz gitmek pk tarafından ve biz ne bulmak değiştirin.
Yani * pk = 35 etkin bir resim yapar.
Yani sözdizimsel temelde ve aynı k = 35 söyledikten.
>> Bir tane daha.
Ben int m dersem, ben oluşturmak m adlı yeni bir değişken.
Yeni bir kutu, yeşil bir kutu nedeni var bir tamsayı tutmak için gidiyor,
ve m etiketli oluyor.
Ben m = 4 derseniz, ben bir koyun O kutunun içine tamsayı.
Diyelim ki pk = & m, nasıl yaparsa Bu diyagram değişikliği?
Tr = & m, ne hatırlamak yapmak & Operatör yapar veya denir?
Bu ve bazı değişken adı hatırla bir değişken adı adresidir.
Peki ne söylüyorsun olduğunu pk m adresini alır.
Ve o kadar etkili ne olur şeması bu artık noktaları PK
m, ama puan k.
>> Yine işaretçiler çok vardır çalışmak zor
ve onlar bir sürü almak uygulama, ancak çünkü
için izin vermek için yetenekleri fonksiyonlar arasında veri aktarmak için
ve aslında bu var Değişikliklerin etkili,
etrafında başını almak gerçekten çok önemli.
Muhtemelen en karmaşık Biz CS50 tartışmak konu,
ancak değer olduğunu işaretçiler kullanarak elde
çok komplikasyon outweighs onları öğrenmeye geliyor.
O yüzden sana diliyorum şans işaretçileri hakkında öğrenme.
Ben Doug Lloyd değilim, bu CS50 olduğunu.