C++’da Diziler ve İşaretçiler (Pointer ve Arrayler)

Bu yazıda yine derste tuttuğum notlardan, C++ ile çalışırken dizi ve işaretçilerin nasıl kullanılacağı hakkında örnek üzerinden anlatım yapalım. Gerekli açıklamalar yorum satırları içerisinde yer almaktadır. Kodları yazının devamında bulabilirsiniz. İyi çalışmalar.

#include <iostream>
#include <string.h>

using namespace std;

struct Ogrenci
{
    int num;
    char isim[20];
};

int main(int argc, char const *argv[])
{
    /* Pointer dediğin adres tutuyor işte. Ekstra bir şey yok. */
    /* Struct'a olan pointerdan ortaya linked list çıkıyor. */
    int t = 5; // Direct reference olarak geçiyor. Bu da aslında pointer.
    /* Pointerlar indirect reference olarak geçiyor. Adresine referans ediyormuş. */
    int *ptr; // adres tutacak bir pointer oluşturduk. Pointer 1 int boyunda.
    ptr = &t; // adresini aldık.

    cout << "t değişkeni adresi: " << &t << endl;
    cout << "Pointer'ın değeri(ptr): " << ptr << endl;
    cout << "t değişkeninin değeri: " << t << endl;
    cout << "Ptr'nin adresine gidilirse(*ptr): " << *ptr << endl;
    cout << "Ptr'nin kendi adresi(&ptr): " << &ptr << endl;
    cout << "ADRESLER EKSİK GÖZÜKEBİLİR ÇÜNKÜ BAŞLARINDA 00 VAR!!!" << endl;

    /* ============================================================ */
    cout << endl << endl;
    /* C++'da dinamik bellek yönetimi' */
    int *pnt; // Oluşturacağımız alanın adresini bu değişken tutacak.
    pnt = new int; // 1 integer boyutunda alan oluşturduk.
    *pnt = 10; // tuttuğu adresteki değeri 10 yaptık.
    cout << pnt << " => " << *pnt << endl;
    // Burdaki alan isimsizdir, sadece bu pointer ile erişilebilir.
    int *dizi; // Dizi ayıracağız. integer tutacak.
    dizi = new int [20]; // En sonda, aradaki boşluk önemli.

    /* ============================================================ */
    cout << endl << endl;

    /* Yapıları gösteren işaretçiler */
    // Yapı en yukarda Öğrenci olarak tanımlandı.
    Ogrenci o1 = {40100447,"Güray"}; // Bir öğrenci yapısı.
    cout << "o1.isim - " << o1.isim << endl;
    Ogrenci* oPtr; // Öğrenci yapısına işaretçi.
    oPtr = &o1; // Yapıyla işaretçi eşleşti.
    strcpy(oPtr->isim, "Güray Yıldırım");
    cout << "oPtr->isim - o1.isim son halleri: " << oPtr->isim << " - " << o1.isim << endl;
    Ogrenci *o2; // Şimdi de aynısını dinamik bellek ayırarak yapalım.
    o2 = new Ogrenci;
    strcpy(o2->isim, o1.isim); // Stringleri strcpy ile kopyaladık.
    o2->num = oPtr->num; // Numaraları direk eşleyerek kopyaladık.
    cout << "o2 dinamikle oluşturulan isim: " << o2->isim << " - " << o2->num << endl;

    int** pPtr; // İşaretçi tutacak işaretçi tanımlaması.
    int* tutulacak; // Tutulacak işaretçi de bu olsun.
    int x = 3; // Tutulacak işaretçisi bunu tutsun.
    tutulacak = &x; // İlk atama yapıldı.
    pPtr = &tutulacak; // İşaretçinin adresi pPtr'ye atandı.
    cout << "Adresler sırayla: (pPtr, *pPtr, **pPtr)" << endl;
    cout << pPtr << endl << *pPtr << endl << **pPtr << endl;

    /* ============================================================ */
    cout << endl << endl;

    // Burda * a indirection operator deniyormuş.
    // &* ile *& aynı şeylerdir.
    // ptr++ ile ptr-- 4 er bayt kaydırma sağlar. Karakter pointerı
    // ise 1 bayt kaydırır.
     char isim[10] = "Guray";
     char* isimTut = isim; // Dizi isimleri pointerdır, burda onu tuttuk.
     isimTut += 3; // İlk karakterden 3 tane kaydıralım.
     cout << isim << endl; // İsmin şu anki hali.
     *isimTut = 'm'; // O an olduğu karakteri değiştir.
     cout << isim << endl; // İsmin son hali.

     /* Bir pointer a her değer atanabilir ama int e float atarsak farklı
     değerlendirileceğinden saçma sapan sonuçlar alırız. */
     /*
     float b = 120.25; // Float b'nin adresini int tutan işaretçiye atayalım.
     int* bPtr = &b; // Derlenirken bir uyarı ya da hata alacağız.
     cout << b << " - " << *bPtr << endl;
     */

    /* ============================================================ */
    cout << endl << endl;
    /* Diziler */
    // Ard arda dizilen aynı tür verileri içeren veri yapısı.
    // Dizi isimleri sabit adres tutan işaretçilerdir.
    // Dizi indislemeyle çalışan işlemler pointerla da yapılabilir ve
    // daha hızlı çalışırlar.

    return 0;
}

Sorularınızı burdan ya da bana ulaşabildiğiniz herhangi bir iletişim kanalından sorabilirsiniz.

 
comments powered by Disqus