Bu kapsamlı kurs, C++ programlama dilinde temel veri yapılarını öğretir ve öğrencilerin algoritma oluşturma ve problem çözme becerilerini arttırır Diziler, yapılar, işaretçiler ve bağlı listeler gibi konuları kapsayan bu derste, C++ kodlama için gerekli olan tüm temel becerileri edineceksiniz Başlangıç seviyesinden ileri seviyeye kadar ilerleyin ve daha iyi bir programcı olun!

C++ programlama dilini kullanırken, temel veri yapılarını anlamak oldukça önemlidir. Veri yapıları, bilgisayar programlama dilinde en temel kavramlardır. Programcılar, değişkenlerin, fonksiyonların ve diğer program bileşenlerinin data türlerini yönetmek için veri yapılarını kullanırlar. C++ programlama dilinde, veri yapıları birçok farklı öğe içerir ve bunların hepsini iyi anlamak, kodlama sürecinde büyük bir artı sağlar.
C++ ile kodlama yaparken, temel veri yapısı olan diziler üzerinde çalışmak çok yaygındır. Diziler, aynı türden öğelerin bir koleksiyonunu saklamak için kullanılır. Örneğin, bir dizi sayılar içerebilir. Bu sayılar, belirli bir sırayla saklanır ve farklı zamanlarda okunabilir veya değiştirilebilir. Diziler, programlama dilinin en temel veri yapılarından biridir ve C++'ta oldukça sık kullanılırlar.
- Diziler: Aynı türdeki verilerin depolanması için kullanılır. İndeksleri kullanarak erişilebilirler ve verilerin her biri aynı türdedir.
- Pointerlar: Dizi elemanlarına işaret ederek onlara işlem yapmak için kullanılır. Bellek adreslerini tutarlar.
- Göstericiler: İşaretçilerin tiplerini tutarlar ve bellekteki yerleşimleriyle işaret ederler.
- Struct yapısı: Aynı veya farklı tipte birden fazla elemanı saklamak için kullanılır.
- Yığın bellek yönetimi: Programın çalışması için dinamik olarak bellek yönetiminin yapılmasını sağlar.
Bu temel veri yapıları, C++ kodlama süreci için oldukça önemlidir ve programcıların dikkatli bir şekilde kullanmaları gereken farklı öğeler içerir. Diziler, pointerlar, göstericiler, struct yapısı ve yığın bellek yönetimi gibi farklı veri yapıları, C++ programlama dilinin başarılı bir şekilde kullanımı için vazgeçilmezdir.
Diziler
C++ programlama dili veri yapısına sahip olduğu için, temel veri yapılarının önemini bilmek son derece önemlidir. Diziler, C++ programlama dili için temel bir veri yapısıdır. Dizi, aynı türdeki öğelerin sıralı bir koleksiyonu olarak tanımlanabilir.
Diziler, programcıların genellikle aynı türdeki birden fazla öğeyi düzenlemelerine ve yönetmelerine olanak tanır. Bu veri yapısı programlama dilinin temel bir yapı taşıdır. Bir dizi, bir anahtar kelime ve bir dizi adı kullanılarak tanımlanır.
- Dizi adı: Dizi öğelerine erişmenin temel yoludur ve aynı zamanda diziyi tanımlayan bir isimdir.
- Boyut: Dizi öğelerinin sayısıdır. Bu sayı sabit olmalıdır ve yalnızca diziyi tanımlarken belirlenmelidir.
- Elemanlar: Dizideki her bir öğedir. Dizi elemanları 0'dan başlayarak numaralandırılır ve parantez içindeki sayı, belirli bir öğeye erişmek için kullanılır.
C++ programlama dili, dizilerin kullanımını kolaylaştıran bir dizi işlemci sağlar. Bunlar arasında dizinin uzunluğunu, sıralama ve arama işlemlerini gerçekleştiren bazı fonksiyonlar yer alır. Diziler, belirli bir maksimum boyuta sahip olacak şekilde tanımlanabilir ve değişebilir veya değişemez olabilirler. Buna rağmen, dizilerin dinamik bir şekilde genişletilmesi için çeşitli yöntemler mevcuttur.Örneğin, bir diziye yeni bir öğe eklemek istediğinizde, dizinin yeni bir kopyasını oluşturmalısınız. Bu işlem zaman alıcı ve kaynak yoğun olduğundan, modern C++ dilinde vector'ler gibi alternatif veri yapıları mevcuttur.
Pointerlar
Pointerlar, bellek adreslerinin tutulduğu bir değişken türüdür. Bellekte depolanan değişkenlerin yerlerini göstererek işaret ederler. Bu sayede yerel değişkenlerle global değişkenlerin bellekteki konumlarını değiştirebileceğiz.
Bu veri türü, dinamik bellek tahsisini ve deallocation işlemlerini yönetmek için oldukça önemlidir. Bellek açısından verimli ve esnek bir yapıdadır. Pointerlar, veri yapısı oluştururken ve fonksiyonları uygularken yaygın bir şekilde kullanılır.
Pointerların kullanım örneklerinden biri, bir dizi içinde arama işlemdir. Bazı durumlarda programcıların, dizilerdeki işleyişi hızlı bir şekilde ihtiyaçlarına uygun hale getirmek isteyeceklerdir. Bu noktada, dizi elemanlarına pointerlar kullanarak işaret ederler ve dizileri hızlı bir şekilde hızlandırabilirler.
Pointerlar, adres aritmetiği yaparak dizilerdeki işleyişi hızlandırmak için kullanılabilir. Ayrıca, pointerlar bellek yönetiminde de kullanılır. Yığın bellekteki nesnelere pointerlar aracılığıyla erişilebilir. Pointerlar, ayrıca dinamik bellek ayırma ve çözme işlemlerinde de kullanılır.
Dangling Pointer Nedir?
Pointerlar C++ programlama dilinde oldukça önemli bir yer tutar. Ancak kontrolsüz kullanımları bazı problemler oluşturabilir. Dangling pointerlar bu problemlerden biridir.
Dangling pointer, geçersiz bir bellek adresine sahip olan bir pointerdır. Bu pointerlar, bellek alanlarındaki değerlerin değiştirilmesine neden olabilir ve programın çökmesine sebep olabilir. Bu durum, genellikle bir nesne yok edildikten sonra o nesneye ait pointerların kullanılmasıyla oluşur.
Dangling pointerlarla başa çıkmak için öncelikle, pointerların kullanılmadan önce NULL değeriyle initialized edilmesi gereklidir. Programlama yaparken, pointerların kontrolsüz kullanımından kaçınmak için hata ayıklama araçlarından yararlanılabilir.
Ayrıca programlama yaparken, bir nesneyi yok etmek yerine, nesnenin kullanımını sonlandırmak daha doğru bir yöntem olacaktır. Böylece, o nesneye ait pointerların başka bir bellek adresine yönlendirilmesi mümkün olacaktır.
Dangling pointerlar, programlama hatalarının önemli bir kaynağı olabilir. Bu nedenle, C++ programlama dilinde bu konuyla ilgili olarak yapılan hatalardan kaçınmak, başarılı bir programlama süreci için oldukça önemlidir.
Null Pointer'lar
Null Pointerlar, bir işaret noktasının herhangi bir bellek konumuna işaret etmediği durumlarda kullanılır. Bu, bir işaretleyicinin değerinin sıfır olması anlamına gelir. Null Pointerlar, bir işlemin çalışmaması durumuna bağlı olarak bellek alanını açığa çıkarır. Bunun yanında, bir işaretleyicinin başvurduğu bellek adresinin başka bir amaçla kullanılmasına da engel olur.
Null Pointerlar, kullanıldığından emin olmak için özellikle fonksiyonlarda yaygın olarak kullanılır. Ayrıca, yanlış bir bellek adresiyle işlem yapmak yerine Null Pointer kullanarak bellek hatalarından korunulabilir. Diğer kullanım alanları arasında bir dizi belirli işletim sistemi arayüzü bulunur. Bu arayüzler, bir Null Pointer'ın, sistem çağrısını çağırmak için bir işaretleyici olmadığında kullanılmasını gerektirir.
- Null Pointerlar, bellek hatalarına karşı koruma sağlar.
- Fonksiyonlarda yaygın olarak kullanılır.
- Bazı işletim sistemi arayüzleri için gereklidir.
Örnek: | Açıklama: |
int *ptr = NULL; | Bir integer Null Pointer tanımlanması. |
if(ptr != NULL) { cout << "Pointer işaret ediyor."; } | Eğer işaretleyici bir bellek konumuna işaret etmiyorsa, kod satırı çalıştırılmaz. |
Wild Pointer'lar
C++ programlama dilinde kullanılan en önemli veri yapılarından biri de pointer'dır. Pointerlar, bir değişkenin bellekteki adresini tutan ve o adresin içeriğine ulaşmak için kullanılan bir veri yapısıdır. Ancak pointerlar bazen kontrolsüz bir şekilde kullanıldığında hatalara sebep olabilirler. Bu hatalardan biri de 'wild pointer' denilen durumdur.
Wild pointerlar, bellekteki herhangi bir yere işaret eden ve geçersiz bir bellek adresini tutan pointerlardır. Bu tip bir pointer, kodun farklı bir noktasında kullanılmak üzere belirlenmemiş bir bellek bölgesine işaret ettiği için, programda istenmeyen sonuçlara sebep olabilir. Bunun nedeni, pointerların işaret ettiği alanlarda tutulan verilerin, başka bir değişken için kullanılabilmesidir.
Örneğin, bir program içinde bellekte oluşturulan bir değişkenin adresi başka bir fonksiyonda kullanıldığında, o değişkenin adresi artık başka bir bellek bölgesini gösterebilir. Bu durumda, wild pointerlar kullanılıyorsa, programın tamamen farklı bir yerinde değişiklik yapabilirler. Bu nedenle, programlama yaparken wild pointerların kullanımından kaçınılmalı ve her zaman geçerli bir bellek adresi tutulmalıdır.
Pointer Aritmetiği
Pointerlar, bellekteki belirli bir konumu işaret eden özel değişkenlerdir. C++ programlama dilinde, pointerlarla aritmetik işlemler yapmak mümkündür. Bu işlemler pointer'ın gösterdiği bellek adresi üzerinde gerçekleştirilir.
Pointer aritmetiği yaparken dikkat edilmesi gereken en önemli konulardan biri işlemin sonucunda pointer'ın bellek adresinin geçersiz hale gelmemesi ve bellekte herhangi bir yerde değer değiştirmemesi için uygulamaların belirli kurallar dahilinde gerçekleştirilmesidir.
Pointerlarla gerçekleştirilebilecek aritmetik işlemleri aşağıdaki tablodan inceleyebilirsiniz:
Operator | İşlevi | Örnek |
---|---|---|
++ | Pointer'ın gösterdiği bellek adresini bir sonraki bellek adresine kaydırır. | p++; |
-- | Pointer'ın gösterdiği bellek adresini bir önceki bellek adresine kaydırır. | p--; |
+ | Pointer'ın gösterdiği bellek adresine belirtilen sayıda bellek adresi ekler. | p = p + 2; |
- | Pointer'ın gösterdiği bellek adresinden belirtilen sayıda bellek adresi çıkarır. | p = p - 2; |
[] | Dizi elemanlarına erişim sağlar. | p[i]; |
Pointer aritmetiği, kod yazarken birçok farklı senaryoda kullanılabilir. Örneğin, bir dizi üzerinde işlem yaparken veya bellekte önceden tahsis edilmiş bölümler üzerinde işlem yaparken kullanılabilir. Ancak, pointer aritmetiği yaparken dikkatli olmak ve bellek adresleri üzerinde kontrolsüz işlemler yapmaktan kaçınmak önemlidir.
Göstericiler
C++ programlama dili kullanılırken, veri yapıları oldukça önemlidir. Bunlardan biri de göstericilerdir. Göstericiler, seçim yapılarında, fonksiyonlarda ve dizilerde kullanılabilir.
Bir gösterici tipi, işaret edilen veri tipine göre tanımlanır. Göstericiler, dinamik bellek yönetimini sağlamak için önemlidir. Örneğin, dinamik olarak oluşturulan bir diziden erişmek için göstericiler kullanılabilir.
Fonksiyonlarda da göstericiler kullanılır. Fonksiyon parametreleri olarak göstericiler tanımlanabilir veya bir işlevden değer döndürmek için kullanılabilirler.
Göstericiler, belirli bir adrese işaret eden tutucular olarak düşünülebilir. Bu adresler, veri, kod veya işaretçi değerleri gibi birçok veri yapısı için geçerlidir.
Göstericilerin dizilerdeki kullanımı oldukça yaygındır. Diziler, söz konusu verilerin birbirine bağlı bir koleksiyonudur. Dizi öğelerine erişmek için göstericiler kullanılabilir.
- Bir gösterici, bir dizi öğesine işaret edebilir.
- Bir diziyi bir işlev çevresinde kullanmak için bir gösterici de kullanılabilir.
- Bir dizi göstericinin tutulduğu bir yapıyı (dizi adını) tanımlamak için gösterici kullanılabilir.
Göstericilerin kullanımı oldukça esnektir ve programcıların bellek yönetimini kodlama sırasında doğru bir şekilde korumasına olanak tanır. Dolayısıyla, değerli bir programlama aracıdır.
Referanslar
C++ programlama dili kullanılarak yazılan kodların, veri yapılarının kullanımı kadar doğru kullanımı da bir o kadar önemlidir. Bu doğrultuda, referanslar program yazımında önemli bir yere sahip veri yapılarıdır. Referanslar değişkenlerin (yer değiştirilemeyen tipler hariç olmak üzere) bir isim yardımı ile tutulmasıdır. Yani bir adres değişkeni olarak adlandırılabilirler.
Referanslar, değişkenlerin hem tanımlanması hem de kullanımı sırasında & sembolünün kullanılması ile yapılır. Örneğin, int tipinde bir sayı için "int sayi1 = 5;" tanımı yapılabilir. Bu tanımın ardından referans tanımı da "int &sayi2 = sayi1;" şeklinde yapılabilir. Bu sayede sayi2, sayi1'in referansı ve sayi1 değişkeni ne kadar değiştirilirse sayi2 de aynı şekilde değişir. Ancak referans değişkenleri bireysel olarak adreslenemeyecekleri için bir dizi referans değişkeni tanımlanması mümkün değildir.
Referanslar, özellikle fonksiyonlar içinde kullanıldığında fark yaratırlar. Fonksiyon, argümanlarına referans veriler üzerinden eriştiğinde, değişkenlerin özellikleri kalıcı olur ve fonksiyonun işleyişi tamamlandığında bile bu değişkenler hala erişilebilir olur. Bu sayede çalışma zamanında bellek yönetimi çalışmaları azaltılarak zaman ve bellek tasarrufu sağlanır. Ayrıca referansların kullanımı, çok büyük veri yapıları üzerinde yapılan işlemler sırasında, bellek kullanımını azalmasını sağlar ve bu da performansı artırır.
Yığın Bellek Yönetimi
C++ programlama dili, bellek yönetimi konusunda özelleştirilmiş dinamik bellek tahsisi özelliği ile ün kazanır. Yığın bellek yönetimi, programın çalışma süresi boyunca değişen boyutlarda bellek tahsisi gerektiren uygulamalar için hayati bir önem taşır. Ancak yanlış kullanımı ciddi zararlar doğurabilir.
Programcılar, özellikle yetersiz bellek yönetimi seviyesi olanlar, dinamik bellek tahsisi işlemlerinde yanlışlıkla hafıza alanlarını tahsis edebilir, fazla bellek tahsis edebilir veya tahsis edilen bellek alanını iade etmeyi unutabilirler. Bu durumda, programın bellek yönetimi önceki bellek salındığında kırılır ve program çöker. Özellikle büyük uygulamalarda, bellek yönetimi doğru bir şekilde yapılmazsa önemli veri kaybı meydana gelebilir.
- Bellek yönetimi konusunda gereken en önemli hususlar programcıların doğru bellek aracının seçilmesi ve doğru yığına büyük boyutlu bellek tahsis edilmesidir.
- Bellek tahsis ederken önceden tanımlanmış bellek boyutları yerine, belirli verilere göre yığına bellek tahsis etmek çok daha doğru bir yaklaşım olabilir.
- Bellek alanlarını aşırı tahsis etmek, bellek yöneticisinin kapasitesini zorlayabilir ve önemli bellek bozulmalarına neden olabilir.
Bellek yönetimi iyi yapılmazsa, programda önemli belirsizlikler meydana gelebilir. Bunun sonucunda, program hatası düzeltmek çok zor olabilir ve hatta programı komple çökertecek kadar büyük bir hataya neden olabilir.
new ve delete Operatörleri
C++ programlama dili, dinamik bellek yönetimini sağlamak adına "new" ve "delete" operatörlerini kullanır. "new" operatörü ile bellek tahsis edilirken "delete" operatörü ile tahsis edilen bellek geri alınır. Ancak, bu operatörlerin yanlış kullanımı, kodun çalışmasını durdurmak ve hatta programın çökmesine sebep olabilir.
Bellek tahsis ederken olası tehlikelerden kaçınmak için, "new" operatörü kullanıldığında "delete" operatörünün de aynı şekilde kullanılması gerekir. "new" operatörü ile bellek tahsis edildikten sonra, işlem tamamlandığında "delete" operatörü ile bellek geri alınmalıdır.
Ayrıca, programcı tipik olarak bellek tahsisinin mümkün olduğunca kısa sürmesini ve gereksiz bellek kullanımından kaçınmasını sağlamak için bellek yönetimini optimize etmelidir. "new" operatörü ile bellek tahsisi yapan programcılar, bellek tüketimine daha fazla dikkat etmeli ve gereksiz tahsisat yapmaktan kaçınmalıdır.
Operatör | Kullanımı | Riskleri |
---|---|---|
new | Bellekte yeni bir alan tahsis etmek için kullanılır. | Olası kötü kullanımı, bellek sızıntısı ve hafıza tüketimi. |
delete | Tahsis edilen belleği geri almaya yarar. | Olası kötü kullanımı, yanlış bellek tahsisi ve çökmelere sebep olabilir. |
Bütün bu riskleri göz önünde bulundurarak, programcılar bellek tahsisi yaparken çok dikkatli ve düzenli olmalıdır. Bellek yönetimi onların sorumluluğunda olduğundan, gerekli önlemler alınmalı ve riskler en aza indirilmelidir.
Smart Pointerlar
Yığın bellek yönetimi, C++ programlama dilinin en önemli konularından biridir. Bellek yönetimi ile dinamik bellek tahsisi yapılır ve bellek kullanımı verimli hale getirilir. Ancak, bu iyi bir yönetim olmadan programların çalışmasını olumsuz etkileyebilir. Bu nedenle, Smart Pointerlar gibi hafıza yönetimi teknikleri geliştirilmiştir.
Smart Pointerlar, bellek yönetimi için yeni bir yaklaşım sunar. Bu yöntem, bellek tahsisi ve bellek boşaltma gibi işlemleri kendi kendine yapabilen bir bellek yönetimi nesnesi kullanır. Bu sayede, programcıların bellek kullanımını daha güvenli ve korumalı hale getirmeleri sağlanır. Smart Pointer kullanıldığında, bellek sızıntılarına veya bellek sorunlarına neden olan hataların sayısı azalır.
Smart Pointerlar, birçok konuda kullanılabilir. Pointerlar gibi kullanıcı tarafından bellek yönetimi yapılması gereken durumlarda Smart Pointer kullanılması önerilir. Özellikle, bellek yönetimi gerektiren karmaşık projelerde bu yöntemin kullanımı oldukça faydalıdır. Ayrıca, çok sayıda bellek işlemi yapacak uygulamalar için kullanımı oldukça faydalıdır.
Smart Pointerlar birçok avantaja sahiptir. Özellikle, bellek yönetimi konusunda yaşanan problemleri önleyebilirler. Ayrıca, bellek sızıntılarını önleme, bellek alanlarının tutarlılığını koruma, bellek yönetimi konusunda ve bellek tahsisinde kullanım kolaylığı sağlarlar. Ancak, her yöntem gibi Smart Pointerlar da kullanım esnasında dikkatli olunmasını gerektirir.
Struct Yapısı
C++ programlama dilinde struct yapısı, farklı veri tiplerini bir arada tutan kullanışlı bir veri yapısıdır. Struct, değişken ve fonksiyonları bir arada saklar ve bu sayede belirli bir düzende verilerin ilişkilendirilmesini sağlar. Sadece fonksiyonların değil, C++ programlama dilinde struct içinde fonksiyon işlevleri de yer alır. Struct'ın en büyük özelliği, farklı tipteki verileri bir arada tutabilme özelliğidir.
Struct yapısı, programlamada sık sık kullanılır ve özellikle büyük projelerin yönetimi için yardımcı bir araç olarak işlev görür. Örneğin, bir programda kullanıcılara ait çeşitli bilgilerin depolanması gerekiyorsa, struct yapısı ile bu veri tipleri bir arada tutulabilir. Bu sayede, verilerin daha düzenli ve okunaklı bir şekilde saklanması ve yönetilmesi sağlanır. Öte yandan, struct yapısı alan tasarrufu sağlar.
Struct yapısı ayrıca, sınıfların kullanılamadığı durumlarda bir alternatif olarak kullanılabilir. Programlamada sınıfların kullanımı bazı durumlarda gereksiz ve zorlayıcı olabilir, bu nedenle struct yapısı daha basit ve işlevsel bir araç olarak tercih edilebilir.