
Michael Cain
0
751
147
Bunu fark etseniz de etmeseniz de, kullandığınız programların büyük çoğunluğu bir şekilde işaretçilerden yararlanır. Belki de bir NullPointerException bir noktada. Bir programcı olarak yazdığınız kod, kendiniz uygulamamış olsanız bile, işaretçileri kullanma olasılığından fazla olacaktır..
Bugün size işaretçilerin nasıl çalıştığını göstereceğim, bu yüzden dizilerin ve listelerin nasıl çalıştığını kontrol etmek isteyebilirsiniz. Diziler ve Listeler Python'da Nasıl Çalışır? Diziler ve Listeler Python'da Nasıl Çalışır? Diziler ve listeler programlamadaki en yararlı veri yapılarından bazılarıdır - - az sayıda insan bunları tam potansiyelleriyle kullanmasına rağmen. programlama astarı için. Bu makale her zamankinden daha teori olacak, ama onunla sadık, işaretçiler çok karmaşık!
Derleme Kodu
İşaretçilere bakmadan önce, kodun nasıl oluşturulduğunu ve çalıştırıldığını anlamanız gerekir - belki bunu zaten biliyorsunuzdur. Bu bölüm oldukça genel ifadelere sahip olacaktır; çoğunluk Dilleri, ancak hepsini mutlaka değil.
İşleri tekrar başlayalım. Her bilgisayar ikili kullanır. İkili Nedir? [Teknoloji Açıklaması] İkili Nedir? [Teknoloji Açıklaması] İkili bilgisayarların varlığı için kesinlikle çok önemli olduğu göz önüne alındığında, daha önce konuyla hiç ilgilenmemiş olmamız garip görünüyor - bu yüzden bugün hangi ikili hakkında kısa bir genel bakış ... Bildiğimiz gibi modern teknolojiyi oluşturanların ve sıfırların. İkili bir şey kodlamak için son derece zor (dosyalar çok kafa karıştırıcı olurdu), çünkü bunlar sizin için gerekli ham talimatlardır. Merkezi işlem birimi veya CPU'nun çalışması için CPU Nedir ve Ne Yapar? CPU Nedir ve Ne Yapar? Bilgisayar kısaltmaları kafa karıştırıcı. Zaten bir CPU nedir? Dört çekirdekli veya çift çekirdekli işlemciye ihtiyacım var mı? AMD veya Intel nasıl? Farkı açıklamaya yardımcı olmak için buradayız! . Bu bilinir Makine kodu.
Makine kodundan sonraki adım montaj. Bu biraz insan tarafından okunabilen bir formattır. Programlamak hala karmaşık olsa da mümkündür. Montaj, görevleri yerine getirmek için bir dizi basit komuttan oluşur ve düşük seviye Programlama dili. Karmaşık programlar yazmak mümkündür, ancak soyut kavramları ifade etmek zordur ve çok fazla dikkate alınması gerekir..
Pek çok video oyunu ve yüksek performans uygulaması, ne yaptığınızı biliyorsanız, bazı gerçek hız artışları görülebildiğinden montajda yazılmış bir mantık vardır. Ancak, programlama projelerinin büyük çoğunluğu için, herhangi bir montajı bilmeniz gerekmez..
Eğer makine kodunu yazmak çok zorsa ve montaj programlamak çok zorsa, kodu ne ile yazıyorsunuz? İşte nerede yüksek seviye diller gelir. Yüksek seviyeli diller programların yazılmasını kolaylaştırır. Anadilinize benzeyen bir programda programlayabilirsiniz ve karmaşık algoritmaları ifade etmek kolaydır. Birçok yüksek seviyeli dil duymuş olabilirsiniz (ve kesinlikle kendilerinde yazılmış bir program kullanmış olacaksınız):
- TEMEL
- C++
- yanlış telaffuz
Bu diller şu anda çok eski ve birçokları 1950'lerin başlarında geliştirildi! Neredeyse her modern programlama dili, PHP ve Python dahil olmak üzere üst seviye bir dildir. Her gün icat edilen daha fazla dil var (şu anda yeterli olmasına rağmen), ancak bilgisayarların makine kodu gerektirmesi durumunda kodunuz tam olarak nasıl çalışıyor??
İşte derlemenin girdiği yer. Derleyici, üst seviye kodunuzu çalıştırılabilecek bir formata dönüştüren bir programdır. Bu, başka bir üst düzey dil olabilir, ancak genellikle derlemedir. Bazı diller (Python veya Java gibi) kodunuzu, adı verilen bir ara aşamaya dönüştürür. baytkodu. Bunun daha sonraki bir tarihte tekrar derlenmesi gerekir; bu, genellikle program çalıştığında olduğu gibi, genellikle talep üzerine yapılır. Bu bilinir tam zamanında derleme ve oldukça popüler.
Bellek yönetimi
Artık programlama dillerinin nasıl çalıştığını bildiğinize göre, üst düzey dillerdeki bellek yönetimine bakalım. Bu örnekler için, sözde kod kullanacağım - herhangi bir dilde yazılmayan ancak tam sözdizimi yerine kavramları göstermek için kullanılan kod. Bugün, bu çoğunlukla C ++ 'a benzeyecek, çünkü en iyi üst seviye dil (bence).
Bu bölüm için, RAM'in nasıl çalıştığını anlarsanız, RAM'e Hızlı ve Kirli Bir Rehber: Bilmeniz Gerekenler RAM'e Hızlı ve Kirli Bir Rehber: Bilmeniz Gerekenler RAM her bilgisayarın çok önemli bir bileşenidir. , ama kafa karıştırıcı olabilir. Anlayacağınız kolay anlaşılır terimlerle parçalara ayırıyoruz. .
Çoğu dilde değişkenler vardır - bazı verileri depolayan kaplar. Veri tipini açıkça tanımlamanız gerekir. Python veya PHP gibi dinamik olarak yazılmış bazı diller bunu sizin için halleder ama yine de yapmak zorundalar..
Bir değişkeniniz olduğunu söyleyin:
int myNumber;
Bu kod denilen bir değişken bildirir. numaram, ve ona bir veri türü verir tamsayı. Derlendikten sonra, bilgisayar bu komutu şöyle yorumlar:
“Boş bir hafıza bulun ve bir tamsayı saklamak için yeterince büyük bir alan ayırın.”
Bu komut çalıştırıldıktan sonra, bu bellek biti başka bir program tarafından kullanılamaz. Henüz veri içermiyor, ancak myNumber değişkeniniz için ayrıldı.
Şimdi değişkeninize bir değer atayın:
myNumber = 10;
Bu görevi tamamlamak için bilgisayarınız ayrılmış bellek konumuna erişir ve burada depolanan değeri bu yeni değere değiştirir.
Şimdi, her şey yolunda ve güzel, ama hafıza yerleri nasıl korunuyor? Programlar sevdikleri tüm hafızayı saklarsa, RAM derhal doldurur - bu bir çok yavaş sistem.
Bu olası sorunu önlemek için birçok dilde Çöp toplayıcı, giden değişkenleri yok etmek (ve dolayısıyla ayrılmış bellek konumlarını bırakmak) için kullanılır kapsam dışında.
Hangi kapsamın ne olduğunu ve neden bu kadar önemli olduğunu merak ediyor olabilirsiniz. Kapsam, değişkenlerin sınırlarını ve ömrünü veya bir program tarafından kullanılan herhangi bir hafızayı tanımlar. Bir değişken “kapsam dışında” artık herhangi bir kodla erişilemediğinde (çöp toplayıcı devreye girdiğinde). İşte bir örnek:
maths () işlevi int firstNumber = 1; int secondNumber = 2; print (firstNumber + secondNumber); // çalışmayacak
Bu örnek derlenmeyecek. Değişken firstNumber içinde Matematik işlevi, bu nedenle kapsamıdır. Bildirildiği işlevin dışından erişilemiyor. Bu önemli bir programlama konseptidir., ve işaretçilerle çalışmak için çok önemlidir.
Bu hafızayı ele almanın yolu yığın. Programların büyük çoğunluğunun çalışması budur. Bunu kullanmak için işaretçileri anlamak zorunda değilsiniz ve oldukça iyi yapılandırılmış. Yığının dezavantajı hızdır. Bilgisayarın bellek vermesi, değişkenleri takip etmesi ve çöp toplaması yapması gerektiğinden, küçük bir ek yükü vardır. Bu, daha küçük programlar için iyidir, ancak yüksek performanslı görevler veya yoğun veri uygulamaları hakkında?
Girin: işaretçiler.
İşaretçiler
Yüzeyde, işaretçiler basit geliyor. Referans veriyorlar (işaret etmek) bellekte bir yer. Bu farklı görünmeyebilir “düzenli” Yığındaki değişkenler ama güven bana, çok büyük bir fark var. İşaretçiler üzerinde saklanır yığın. Bu yığının tam tersi - daha az organize, ancak çok daha hızlı.
Değişkenlere yığında nasıl atandığına bakalım:
int numberOne = 1; int numberTwo = numberOne;
Bu basit bir sözdizimidir; Değişken iki numaralı bir numara içeriyor. Atama sırasında değeri arasında kopyalanır. bir numara değişken.
Eğer almak istiyorsan hafıza adresi Bir değişkenin değeri yerine, işareti ve işareti (&) kullanmanız gerekir. Bu denir Adresi operatöre ve işaretçi araç kitinizin önemli bir parçasıdır.
int numberOne = 1; int numberTwo = & numberOne;
Şimdi iki numaralı değişken makas Bir numaralı hafızaya kopyalanmak yerine, yeni hafıza alanına. Bu değişkenin çıktısını alsaydınız, bir numara olmaz (bellek konumunda olmasına rağmen). Bellek konumunu (muhtemelen sisteme ve mevcut RAM'e bağlı olarak değişmesine rağmen, 2167 gibi bir şey) çıkarır. Bir işaretçi içinde saklanan değere erişmek için, hafıza yerine KQUEUE İşaretçi Bu, bu durumda bir numara olacak olan doğrudan değere erişir. Bir işaretçiyi nasıl kullanacağınızı aşağıda bulabilirsiniz:
int numberTwo = * numberOne;
hakaret operatörü yıldız (*).
Bu anlaşılması zor bir kavram olabilir, o yüzden tekrar gözden geçirelim:
- Adresi operatör (&) hafıza adresini saklar..
- hakaret operatörü (*) değere erişir.
İşaretçiler bildirilirken sözdizimi biraz değişir:
int * myPointer;
Veri türü int Burada işaretçi veri türü ifade eder. makas işaretçinin türüne değil.
Şimdi, işaretçilerin ne olduğunu bildiğinize göre, onlarla gerçekten güzel hileler yapabilirsiniz! Bellek kullanıldığında, işletim sisteminiz başlar. sırayla. RAM'i güvercin delikleri olarak düşünebilirsiniz. Bir şeyi saklamak için birçok delik, sadece bir kerede kullanılabilir. Buradaki fark, bu güvercin deliklerinin hepsi numaralı. Bellek atarken, işletim sisteminiz en düşük sayıdan başlar ve çalışır. Asla rastgele sayılar arasında atlayamaz.
İşaretçilerle çalışırken, bir dizi atadıysanız, işaretçinizi basit bir şekilde artırarak bir sonraki öğeye kolayca gidebilirsiniz..
İşte ilginçleştiği yer. Değerleri bir işleve ilettiğinizde (yığında depolanan değişkenleri kullanarak), bu değerler işleve kopyalanır. Eğer bunlar büyük değişkenlerse, program şimdi bunları iki kere kaydeder. İşleviniz bittiğinde, bu değerleri döndürmek için bir yol gerekebilir. İşlevler genellikle yalnızca bir şeyi döndürür - yani iki, üç veya dört şeyi geri döndürmek istiyorsanız?
İşlevinize bir işaretçi iletirseniz, sadece bellek adresi kopyalanır (ki bu küçük). Bu işlemcinizi çok fazla işten kurtarır! Belki işaretçiniz çok büyük bir görüntü dizisine işaret eder - işleviniz sadece aynı bellek konumunda saklanan aynı veriler üzerinde çalışamaz, ancak bir kez yapıldığında hiçbir şey döndürmeye gerek kalmaz. temiz!
Yine de çok dikkatli olmalısın. İşaretçiler hala kapsam dışına çıkabilir ve çöp toplayıcı tarafından toplanabilir. Ancak bellekte saklanan değerler toplanmaz. Buna bellek sızıntısı denir. Verilere artık erişemezsiniz (işaretçiler yok edildiğinden dolayı), ancak yine de belleği kullanıyor. Bu, birçok programın çökmesine neden olan yaygın bir nedendir ve çok miktarda veri varsa olağanüstü şekilde başarısız olabilir. Büyük bir sızıntınız varsa (sistemin sahip olduğundan daha fazla RAM kullanarak), işletim sisteminiz programınızı öldürür, ancak bu istenmez.
Hata ayıklama işaretçileri, özellikle büyük miktarda veriyle çalışıyorsanız veya döngüler halinde çalışıyorsanız, kabus olabilir. Dezavantajları ve anlama güçlüğü, performansta kazandığınız takaslara gerçekten değer. Her ne kadar unutmayın, her zaman gerekli olmayabilir.
Bugünlük bu kadar. Umarım karmaşık bir konu hakkında faydalı bir şeyler öğrenmişsinizdir. Tabii ki, bilinmesi gereken her şeyi kapsamadık - bu çok karmaşık bir konu. Daha fazla bilgi edinmek istiyorsanız, 24 Saat İçinde C ++ 'ı tavsiye ederim..
Bu biraz karmaşıksa, en kolay programlama dilleri rehberimize bakın. 6 Yeni Başlayanlar İçin Öğrenilecek En Kolay Programlama Dilleri 6 Yeni Başlayanlar İçin Öğrenilecek En Kolay Programlama Dilleri Programlamayı öğrenmek, en doğru dil bulma hakkında olduğu kadar düzenleme işlemi. İşte yeni başlayanlar için ilk altı en kolay programlama dili.. .
İşaretçilerin bugün nasıl çalıştığını öğrendin mi? Diğer programcılarla paylaşmak istediğiniz ipuçlarınız ve püf noktalarınız var mı? Yorumlara atla ve düşüncelerini aşağıda paylaş!