C++ İşaretçiler

C++ programlamada pointer kavramını anlamak ve kullanabilmek, kritik bir öneme sahiptir. Belki de biliyorsunuzdur, tüm tanımlanan değişkenlerin bir adresi vardır. Bu adres içinde o değişkenlerin değerleri depolanır. Örneğin, int sayi; değişkeninin adresi şuna benzer 0x60ff1c. Tabi bu bellek adresleri bilgisayara göre değişiklik gösterir.
Peki pointer nedir? Pointer, başka değişkenin adresini taşıyan değişkendir. Kısacası bir pointer değer olarak değişkenin adresini tutar. Kafanız karışmış olabilir ama aşağıdaki örneklerle iyi şekilde anlayacağınızı düşünüyorum. Nerelerde kullanılır? Belleğe erişmede ve adres değiştirmede kullanılır.

Pointer Tanımlama

Pointer tanımını yukarıda yaptık. Pointer tanımlarken değişken isminin başına dereferans(*) operatörü konulur. Aşağıdaki örnekte olduğu gibi:
int *p;  //p işaretçisi tanımlandı
int* m; //m işaretçisi tanımlandı

//Bu iki tanımlama arasında herhangi bir fark yoktur.
int *p ifadesinde *p'nin bir integer değer taşıyacak değişken olduğunu tanımladık. Burada önemli olan dereferans operatörünün(*) ne yaptığıdır? dereferans operatörü(*) sayesinde p'nin bir integer dağişkene işaret ettiği anlaşılır. Yani p değer olarak integer değişkenlerin adresini saklayacaktır.
Bir değişkenin adresini öğrenmek için &(ampersant) işareti kullanılır. & işaretine adres operatörü denir. Örneğin:
int a;  
cout << &a; //0x60ff1c
Aşağıdaki örneği inceleyelim:
#include <ltiostream>

using namespace std;

int main(){
    int *p;
    int wi = 12;

    cout << "*p degiskeninin adresi: " << p << endl; 

    cout << "wi degiskeninin adresi: "<< &wi << endl;
    
    // wi değişkeninin adresi p göstericisine atanır.
    p = &wi;

    cout << "*p degiskeninin adresi: " << p << endl; 
    cout << "*p degiskeninin degeri: " << *p << endl;

    return 0;
}

Pointer Kullanımında Yapılan Hatalar

int main(){
    int *p = 6;
    
    return 0;
}
Yukarıdaki gibi pointer türünde bir değişkene integer tipinde bir değer atanmaya çalışılırsa derleyici şu hatayı verecektir:
error: invalid conversion from 'int' to 'int*' [-fpermissive]
Ancak aşağıdaki gibi yapılırsa program başarı ile derlenecek ve atama işlemi gerçekleşecektir.
int main(){
    int *p;
    *p = 6;

    return 0;
}
Peki neden böyle oldu? Hatalı örnekte atama yaptığımız *p ifadesi ile çalışan örnekte atama yaptığımız *p ifadesi aynı şeyi temsil etmiyor da ondan. *p ifadesi tanımlama sırasında p ifadesinin işaretçi olduğunu bildirir. Tanımlama sonrası *p ifadesi ise integer değer alabilen bir değişkendir. Kısacası pointer bildirirken değer ataması yapılamaz.
int main(){
    int *p;
    int wi;

    wi = p; // bu kullanım yalnıştır. wi tam sayı alan bir değişkendir, p ise adrestir.
    *p = &wi; // bu kullanım yalnıştır. *p adresin işaret ettiği değerdir. &wi ise adrestir.

    return 0;
}
Umarım açıklayıcı olmuştur. Herhangi takıldığınız bir sorun, sorularınız, yazı içerisinde hata olması durumunda yorum kısmından bildirebilirsiniz.

Hiç yorum yok:

Yorum Gönderme