İlan

Farkında olsanız da olmasanız da, kullandığınız programların büyük çoğunluğu işaretçileri bir şekilde kullanır. Belki bir NullPointerException bir noktada. Bir programcı olarak, kendiniz uygulamasanız bile, yazdığınız kod muhtemelen işaretçiler kullanır.

Bugün size işaretçilerin nasıl çalıştığını göstereceğim, bu yüzden kontrol etmek isteyebilirsiniz Diziler ve listeler nasıl çalışır? Python'da Diziler ve Listeler Nasıl Çalışır?Diziler ve listeler, programlamada en yararlı veri yapılarından bazılarıdır - az sayıda insan bunları tam potansiyellerinde kullanır. Daha fazla oku bir programlama primeri için. Bu makale her zamankinden daha fazla teoriye dayalı olacak, ancak buna sadık kalın, işaretçiler çok karmaşık!

Derleme Kodu

İşaretçilere girmeden önce, kodun nasıl oluşturulduğunu ve yürütüldüğünü anlamanız gerekir - belki de bunu zaten biliyorsunuzdur. Bu bölüm oldukça genel ifadelere sahip olacaktır - çoğunluk ancak bunların hepsi değil.

İşaretçiler

Bir şeyleri tekrar başlayalım. Her bilgisayar ikili kullanır

instagram viewer
İkili Nedir? [Açıklanan Teknoloji]İkili bilgisayarların varlığı için kesinlikle çok temel olduğu göz önüne alındığında, konuyla daha önce hiç uğraşmamış olmamız tuhaf görünüyor - bu yüzden bugün hangi ikili program hakkında kısa bir genel bakış sunacağımı düşünmüştüm ... Daha fazla oku , bildiğimiz gibi modern teknolojiyi oluşturan bir dizi ve sıfır. İkili bir şey kodlamak son derece zordur (dosyalar çok kafa karıştırıcı olurdu), çünkü bunlar sizin ihtiyacınız olan ham talimatlardır. Merkezi işlem birimi veya İşlemci CPU CPU nedir ve ne işe yarar?Bilgi işlem kısaltmaları kafa karıştırıcıdır. Zaten CPU nedir? Ve dört veya çift çekirdekli bir işlemciye ihtiyacım var mı? AMD veya Intel'e ne dersiniz? Farkı açıklamak için buradayız! Daha fazla oku . Bu olarak bilinir Makine kodu.

Makine kodundan sonraki adım montaj. Bu biraz insan tarafından okunabilir bir formattır. Programlamak hala karmaşık olsa da mümkündür. Montaj, görevleri yürütmek 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 dikkat gerektirir.

Birçok video oyunu ve yüksek performanslı uygulama, montajda yazılan mantığın bir kısmına sahiptir, çünkü ne yaptığınızı biliyorsanız gerçek hız artışları bulunabilir. Bununla birlikte, programlama projelerinin büyük çoğunluğu için, herhangi bir montajı bilmenize gerek yoktur.

İşaretçiler

Peki, makine kodunun yazılması çok zor ve montajın programlanması çok zorsa, kodla ne yazıyorsunuz? İşte burada yüksek seviye diller geliyor. Üst düzey diller programların yazılmasını kolaylaştırır. Ana dilinize benzeyen bir şeyde programlayabilirsiniz ve karmaşık algoritmaları ifade etmek kolaydır. Birçok üst düzey dil duymuş olabilirsiniz (ve kesinlikle bunlarda yazılmış bir program kullanmış olacaksınız):

  • TEMEL
  • C ++
  • yanlış telaffuz

Bu diller şimdi çok eskidir ve çoğu 1950'lerin başında geliştirilmiştir! Neredeyse her modern programlama dili, PHP ve Python dahil olmak üzere üst düzey bir dildir. Her gün daha fazla dil icat edilmektedir (şu anda muhtemelen yeterli olmasına rağmen), ancak bilgisayarlar makine kodu gerektiriyorsa kodunuz tam olarak nasıl düzgün çalışır?

İşte derleme burada. Derleyici, üst düzey kodunuzu çalıştırılabilecek bir forma dönüştüren bir programdır. Bu başka bir üst düzey dil olabilir, ancak genellikle meclistir. Bazı diller (Python veya Java gibi) kodunuzu şu ara aşamaya dönüştürür: baytkodu. Bunun, program çalıştırıldığında olduğu gibi, genellikle talep üzerine yapılan daha sonraki bir tarihte yeniden derlenmesi gerekecektir. Bu olarak bilinir tam zamanında derleme ve oldukça popüler.

Hafıza yönetimi

Artık programlama dillerinin nasıl çalıştığını bildiğinize göre, üst düzey dillerde bellek yönetimine bakalım. Bu örnekler için şunu kullanacağım sahte kod - belirli bir dilde yazılmayan, ancak tam sözdizimi yerine kavramları göstermek için kullanılan kod. Bugün, bu en iyi üst düzey dil (bence) olduğu için çoğunlukla C ++ 'ya benzeyecektir.

Bu bölüm için, RAM nasıl çalışır RAM için Hızlı ve Kirli Bir Kılavuz: Bilmeniz GerekenlerRAM, her bilgisayarın önemli bir bileşenidir, ancak kafa karıştırıcı olabilir. Anlayacağınız kolay anlaşılır terimlerle çözüyoruz. Daha fazla oku .

Çoğu dilde değişkenler vardır - bazı verileri depolayan kapsayıcılar. Veri türünü açıkça tanımlamanız gerekir. Python veya PHP gibi dinamik olarak yazılan bazı diller bunu sizin için halleder, ancak yine de bunu yapmak zorundadırlar.

Bir değişkeniniz olduğunu varsayalım:

int myNumber;

Bu kod, numaramve ona bir veri türü verir. tamsayı. Bilgisayar derlendikten sonra bu komutu şu şekilde yorumlar:

“Boş bir bellek bulun ve bir tamsayı depolayacak kadar büyük bir alan ayırın”

Bu komut yürütüldükten sonra, bu bellek biti başka bir program tarafından kullanılamaz. Henüz herhangi bir 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, hepsi iyi ve güzel, ama bellek konumları nasıl korunur? Programlar istedikleri tüm belleği ayırırsa, RAM derhal dolar ve bu çok yavaş sistem.

İşaretçiler

Bu potansiyel sorunu önlemek için, birçok dil bir Çöp toplayıcı, değişkenleri yok etmek için kullanılır (ve bu nedenle ayrılmış bellek konumlarını serbest bırakır) kapsam dışında.

Kapsamın ne olduğunu ve neden bu kadar önemli olduğunu merak ediyor olabilirsiniz. Kapsam, değişkenlerin veya program tarafından kullanılan herhangi bir belleğin sınırlarını ve ömrünü tanımlar. Bir değişkene artık herhangi bir kodla erişilemediği zaman (kapsam dışıdır) (çöp toplayıcı devreye girdiği zamandır). İşte bir örnek:

işlev maths () {int firstNumber = 1; int ikinci Sayı = 2; print (firstNumber + secondNumber); // çalışmayacak

Bu örnek derlenmeyecektir. Değişken firstNumber içinde Matematik işlev, yani kapsamı budur. Bildirildiği işlevin dışından erişilemez. Bu önemli bir programlama konseptive işaretçilerle çalışmanın çok önemli olduğunu anlamak.

Belleği bu şekilde işlemek için yığın. Programların büyük çoğunluğu bu şekilde çalışır. 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 ataması, değişkenleri izlemesi ve çöp toplama işlemini çalıştırması 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 ağır veri uygulamaları hakkında ne düşünüyorsunuz?

Enter: işaretçiler.

İşaretçiler

Yüzeyde işaretçiler basit görünür. Onlar referans (işaret etmek) bellekteki bir konum. Bu, yığındaki “normal” değişkenlerden farklı görünmeyebilir, ancak bana güven, çok büyük bir fark var. İşaretçiler yığın. Bu, yığının tam tersi - daha az organize, ancak çok daha hızlı.

Yığında değişkenlerin nasıl atandığına bakalım:

int numberOne = 1; int numberTwo = numberOne;

Bu basit bir sözdizimidir; Değişken iki numaralı bir numarayı içerir. Değer, öğeden ödev sırasında bir numara değişken.

Eğer almak istersen hafıza adresi bir değişkenin değeri yerine, ve işareti işaretini (&) kullanmanız gerekir. Buna Adresi operatörü ve işaretçi araç setinizin önemli bir parçasıdır.

int numberOne = 1; int numberTwo = & numberOne;

Şimdi iki numaralı değişken makas bir numarayı kendi yeni bellek konumuna kopyalamak yerine bir bellek konumuna getirin. Bu değişkeni çıktılarsanız, bu bir numaralı olmazdı (bellek konumunda depolanmış olsa bile). Bellek konumunu çıkarır (muhtemelen sisteme ve kullanılabilir RAM'e bağlı olarak değişmesine rağmen 2167 gibi bir şey). Bellek konumu yerine bir işaretçide depolanan değere erişmek için, KQUEUE işaretçi. Bu, doğrudan bu değere erişir, bu da bu durumda bir numara olur. İşaretçiyi aşağıdaki şekilde kaldırmış olursunuz:

int numberTwo = * numberOne;

dereference operatörü bir yıldız işaretidir (*).

Bu anlaşılması zor bir kavram olabilir, bu yüzden tekrar gözden geçirelim:

  • Adresi operatörü (&) bellek adresini kaydeder.
  • dereference operatörü (*) değere erişir.

İşaretçiler bildirilirken sözdizimi biraz değişir:

int * myPointer;

Veri türü int burada işaretçinin veri tipini ifade eder makas İşaretçinin türünü değil.

Artık işaretçilerin ne olduğunu bildiğinize göre, onlarla gerçekten düzgün 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, aynı anda sadece bir tane kullanılabilir. Buradaki fark, bu güvercin deliklerinin hepsi numaralandırılmıştır. Bellek atarken işletim sisteminiz en düşük sayıdan başlar ve çalışır. Asla rastgele sayılar arasında atlamayacak.

İşaretçiler

İşaretçilerle çalışırken, bir dizi atadıysanız, işaretçinizi basitçe artırarak bir sonraki öğeye kolayca gidebilirsiniz.

Burada ilginç hale geliyor. Değerleri bir işleve ilettiğinizde (yığınta depolanan değişkenleri kullanarak), bu değerler işlevinize kopyalanır. Bunlar büyük değişkenler ise, program şimdi bunları iki kez saklıyor. İşleviniz bittiğinde, bu değerleri döndürmek için bir yol gerekebilir. İşlevler genellikle sadece bir şey döndürebilir - peki iki, üç veya dört şey döndürmek isteseydiniz?

İşaretçiler

İşlevinize bir işaretçi iletirseniz, yalnızca bellek adresi kopyalanır (küçüktür). Bu, CPU'nuza çok fazla iş kazandırır! İşaretçiniz büyük bir görüntü dizisine işaret ediyor olabilir - sadece işleviniz aynı şekilde çalışamaz aynı bellek konumunda depolanan veriler, ancak tamamlandığında, geri dönmeye gerek yoktur herhangi bir şey. 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), ancak yine de belleği tüketiyor. Bu, birçok programın kilitlenmesinin yaygın bir nedenidir ve büyük miktarda veri varsa muhteşem bir şekilde başarısız olabilir. Çoğu zaman, büyük bir sızıntı varsa (sistemde olduğundan daha fazla RAM kullanarak) işletim sisteminiz programınızı öldürür, ancak bu istenmez.

İşaretçiler

Hata ayıklama işaretçileri, özellikle büyük miktarda veriyle çalışıyorsanız veya döngüler halinde çalışıyorsanız bir kabus olabilir. Onların dezavantajları ve anlama güçlükleri, performansta kazandığınız değiş tokuşlara gerçekten değer. Unutmayın, her zaman gerekli olmayabilir.

Bugünlük bu kadar. Umarım karmaşık bir konu hakkında faydalı şeyler öğrenmişsinizdir. Tabii ki, bilmemiz gereken her şeyi ele almadık - bu çok karmaşık bir konu. Daha fazla bilgi edinmek istiyorsanız, kesinlikle tavsiye ederim 24 Saat İçinde C ++.

Bu biraz karmaşık olsaydı, en kolay programlama dilleri kılavuzumuz Yeni Başlayanlar İçin Öğrenmesi Gereken 6 En Kolay Programlama DiliProgramlamayı öğrenmek, eğitim süreci kadar doğru dili bulmaktır. İşte yeni başlayanlar için en kolay altı programlama dili. Daha fazla oku .

Bugün işaretçilerin nasıl çalıştığını öğrendiniz mi? Diğer programcılarla paylaşmak istediğiniz ipuçlarınız var mı? Yorumlara atlayın ve düşüncelerinizi paylaşın!

Joe, İngiltere Lincoln Üniversitesi Bilgisayar Bilimi mezunudur. Profesyonel bir yazılım geliştiricisidir ve uçağı uçurmadığı veya müzik yazmadığı zamanlarda, genellikle fotoğraf çekerken veya video üretirken bulunabilir.