"Enter"a basıp içeriğe geçin

Pointer nedir? C Dili İle Pointer Gösterimi

Herkese merhaba. Bugün C dili üzerinde pointer nedir, ne işe yarar bunları konuşacağız.

Şöyle, diyelim ki a ve b diye iki adet değişkenimiz olsun. a değişkenine 5 değerini atayalım, b değişkenini sadece tanımlayalım. Sonrasında ise b = a diyerek b’nin değerini a’ya eşitleyelim ve b’nin yeni değerini ekrana bastıralım.

#include <stdio.h>
#include <stdlib.h>

int main(){
    int a = 5;
    int b;

    b = a; // b'nin değerini a'ya eşitledik.

    a++; // a değerini 1 artırdık.

    printf("%d", b);
    return (EXIT_SUCCESS);
}

Ekranda 5 değerini göreceğiz. Fakat a’nın değerini 1 artırdığımız halde b’nin değerinin değişmediğini göreceğiz. Peki neden? b a’ya eşit değil miydi?

Cevap: hayır. Aslında evet ama b’ye sadece 5 değerini atadık. b =. 5 olarak kalacak yani. a’nın değişmesi b’yi etkilemeyecek. İşte tam burada devreye pointer giriyor.

Öncelikle adres nedir onu anlayalım.

Her değişken hafızada bir adres tutar ve her değişkenin adresi farklıdır. Eğer b’nin adresi a’nın adresini gösterirse eğer işte o zaman a’nın değerinin değişmesi b’yi de etkileyecek.

Bir değişkenin adresini ekrana bastırmak için apostrof (&) işareti kullanacağız.

Bu noktada bir bilgiye daha ihtiyacımız var. Integer tipinde bir değeri ekrana bastırırken “%d” kullanırız. Adresi yazdırmak için ise “%p” kullanacağız. Şöyle bir örnekle gösterelim:

#include <stdio.h>
#include <stdlib.h>

int main(){
    int a = 5;

    printf("a'nin degeri: %d\n", a);
    printf("a'nin adresi: %p", &a);
    return (EXIT_SUCCESS);
}

Yukarıdaki programın çıktısı a’nın değerini ve hemen ardından a’nın hafızada tuttuğu adresi gösteriyor.

Şimdi gelelim asıl sorumuza. a’nın değeri değiştiğinde b’nin değeri de değişecek mi? Deneyelim.

Pointer tanımı * işareti ile yapılır.

int *b;

Bu şekilde bir pointer tanımlamış oluruz. Peki b’nin adresini nasıl a’nın adresine eşitleyeceğiz?

b’yi pointer olarak tanımlayalım ve b a’nın adresini göstersin.

#include <stdio.h>
#include <stdlib.h>

int main(){
    int a = 5;
    int *b;

    b = &a; // artık b a'nın adresini tutuyor.

    printf("a'nin degeri: %d\n", a);
    printf("b'nin degeri: %d\n", *b);

    a++;

    printf("a'nin degeri artti, a'nin degeri: %d\n", a);
    printf("b'nin degeri: %d", *b);

    return (EXIT_SUCCESS);
}

Programın çıktısına bakarsak eğer, b’nin değeri arttı. Peki ne yaptık?

Artık a ve b aynı adresi gösteriyor. a’da yapılacak değişiklik artık b’nin değerini de değiştirecek. Çünkü iki değişken de aynı adresi tutuyor.

#include <stdio.h>
#include <stdlib.h>

int main(){
    int a = 5;
    int *b;

    b = &a; // a'nın adresini b'ye eşitledik.
    printf("a'nin adresi: %p\n", &a);
    printf("b'nin adresi: %p", b); // pointer'ın değeri *b, adresi ise b ile gösterilir.

    return (EXIT_SUCCESS);
}

Bu programın çıktısında ise a’nın ve b’nin adreslerinin aynı olduğunu görüyoruz. Pekiştirmek için ise bir örnek daha gösterelim:

#include <stdio.h>
#include <stdlib.h>

void func(int *p){ // b'nin adresini fonksiyonda p pointer'ı karşılıyor.
    (*p)++; // p'nin değerini 1 artırıyoruz.
}

int main(){
    int a = 5;
    int *b;

    b = &a;

    printf("Fonksiyona gonderilmeden once a'nin degeri: %d\n", a);
    printf("Fonksiyona gonderilmeden once b'nin degeri: %d\n", *b);

    func(b); // b'yi fonksiyona gönderiyoruz.

    printf("Fonksiyona gonderildikten sonra a'nin degeri: %d\n", a);
    printf("Fonksiyona gonderildikten sonra b'nin degeri: %d", *b);
    return (EXIT_SUCCESS);
}

Basitçe pointer’ın ne olduğunu anlatmaya çalıştım. Umarım herkese faydası olur. İyi çalışmalar.

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir