C++ Pointer Kavramı

31 Mart 2011 by B.Selçuk ÖKSÜZ
Leave a reply »
WP Greet Box icon
Merhaba! Selcukoksuz.com adresine hoş geldiniz. Eğer yeni iseniz ve içeriğimizi takip etmek isterseniz RSS Abonesi Olabilirsiniz.
Mailinize onay mesajı gönderilecektir. Cevaplamayı unutmayınız.

C derslerinde pointerlar (işaretçiler) ile artık bir adım daha ileri gitmiş bulunmaktayız. Kısaca işaretçiler nedir? Ne anlam taşır bunlar hakkında bilgi veren ve bir kaç uygulama ile konuyu anlatmaya çalışacağım.

Kavramı Nedir?

  • Pointer = İşaretçi = Gösterici anlamlarını taşır.
  • İşaretçiler bir çok dilinde mevcuttur. Ama C++ dilinin en önemli kısmını temsil eder.
  • C++ programlama dilini etkin kullanabilmek için işaretçiler konusunda etkili olunması gerekmektedir.

Pointer Tanımlaması

  • C++ ta hazırladığımız programların verileri, bilgisayarımızın RAM belleğinde sıralı kaydetme bölgelerinde saklanmaktadır. Bu değer sıfır ile RAM belleğimizin boyutu arasında değişir.
  • Şimdiye kadar tanımladığımız değişkenlerimizin değerleri RAM bellekte saklandı. Ama bunlar RAM üzerinden hangi bölgedeydi bunları bilmiyorduk.
  • İşaretçiler ile verilerimizin bellek üzerinden nerede saklandığını kontrol etme imkanına erişiyoruz.
  • Tanımlaması aşağıda ki gibi yapılmaktadır;
Tipadı *ptradi

//Örnekler
char *kr1;  //Karakter için işaretleyici
int *x;     //Tam sayı için
float *deger,sonuc 
//float tipinde işaretleyici deger değişkeni ve normal float tipinde sonuc değişkeni
  • Yukarıda ki işaretçilerin önlerinde belirten tipler bellekte ki yerlerin adreslerini depolarlar.
  • * işaretinin anlamı (indirection) tip adı verilen değişkenin bellekteki yerini tutması gerektiğini ifade eder.
  • İşaretçiye değişkenin adresini atamak istersek & ifadesini(adres operatörü) kullanırız. Bu sayede her hangi bir değişkenin bellekte ki yerini direk işaretçiye atayabiliriz.
//Örnek;
char rate;     //char tipinde rate değişkeni
char *p_rate;  //char tipinde p_rate işaretçisi
p_rate = &rate //rate in adresi işaretçiye atanıyor
  • Yukarı da gördüğünüz gibi char tipinde ki değişkenimiz tanımlandı ve bunun bellekte ki adresi & işareti kullanılarak p_rate işaretçisine atandı. Bu atamalar da değişkenin sahip olduğu değer değil, bellekteki adresi atanmaktadır.( ffaa00 )

Uygulama: Pointer giriş uygulaması

Amaç: Pointer ile değişken ifadeleri arasında ki kullanım farklılıkları

Dil: C++

Program: DevC++

Kodlar:

#include <stdio.h>
#include <conio.h>

int main()
{
    int x, *isaret;
    x = 888;
    isaret = &x;
    printf("x in değeri = %d\n",x);
    printf("x in adresi = %x\n",isaret);//Pointer için %x kullanılmıştır.
    printf("x in değeri = %d\n",*isaret);
    printf("x in adresi = %x\n",&x);
    printf("blog.selcukoksuz.com");

    getch();    
}

Yukarıda ki programın çıktısı aşağıda ki gibi olacaktır;

x in de­ğeri = 888
x in adresi = 22ff44
x in de­ğeri = 888
x in adresi = 22ff44

    • *isaret ve x değerleri değişkenin içeriğini ifade etmektedir.
    • (888)isaret ve &x değişkenleri ise bellekte ki adresleri ifade etmektedir.(22ff44)
    • * indirection operatörü olarak kullanıldı.
    • & adres operatörü olarak kullanıldı.
  • İşaretçiler mantığı yukarıda ki ifadelerden oluşmaktadır. Bu ifadeleri bir biri ile karıştırmazsanız, daha rahat bir kodlama yapabilirsiniz.

İşaretçiler ve Diziler

Dinamik Diziler

  • Önceden dizileri oluştururken, program çalışmadan önce boyutunu veriyorduk. Programda o boyut kadar alanı bellek üzerinden kendine ayırıyordu.
  • Dinamik diziler ise programın çalışma esnasında boyutun belirlenip iş bittikten sonra ayrılan belleğin işletim sistemine geri iade edilmesi sistemine dayanmaktadır.
  • Bunun için malloc(), calloc(), realloc() ve free() fonksiyonları gerekli yerlerde kullanılmaktadır.

Uygulama: Pointer ile dinamik dizi oluşturmak

Amaç: İşaretçiler, malloc(), free() fonksiyonları kullanımı

Dil: C++

Program: DevC++

Kodlar:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main()
{   int *x,i,N,toplam = 0;
    float ortalama;

    printf("Eleman Sayisi "); scanf("%d",&N);
    x = (int *)malloc(N*sizeof(int)); //N tane int gözü isteniyor(Nx2 byte)   
    printf("Elemanlari Giriniz\n");

    for(i=0;i<N;i++)
    {
        printf("%d. eleman = ",i+1);
        scanf("%d",&x[i]);
        toplam += x[i];
    } 

    free(x); //Ayrılan bellek alanı geri bırakılıyor
    ortalama = (float) toplam/N;
    printf("\nBu %d sayisinin ortalamasi %0.2f dir.\n",N,ortalama);
    printf("\nblog.selcukoksuz.com");

    getch();    
}

Yukarıda ki programın çıktısı aşağıda ki gibi olmalıdır;

Eleman Sayisi 2
Elemanlari Giriniz
1. eleman = 4
2. eleman = 8

Bu 2 sayisinin ortalamasi 6.00 dir.
  • 9. satırda x işaretçisi için malloc() fonksiyonu ile bellekten N tane int tipinde bellek gözü istenmiştir.
  • malloc() fonksiyonu bellekten istenen yerin başlangıç adresini x değişkenine aktarır.
  • N tane yer istendiğine göre, x, artık N elemanlı bir dizidir. Buna göre x[0] ayrılan bölgenin ilk adresinde ki değişkeni temsil eder.
  • Programın sonra ki kısımlarında x değişkenine diziymiş gibi davranırız.
  • 19. satırda free(x) fonksiyonu ile program için bellekten ayrılan alan geri teslim edilmiştir.

İşaretçiler ve Fonksiyonlar

  • Bir fonksiyon tanımlanırken, parametreleri işaretçi olabileceği gibi, tipi de işaretçi olabilir. Bu, o fonksiyonun kendisini çağırana bir adres göndereceği anlamına gelir.
  • Bu kullanım genelde string ifadeler ile çalışırken kullanışlıdır.
  • Bir örnek ile bu durumu izah edelim.

Uygulama: Pointer ile fonksiyonların birlikte kullanımı

Amaç: İşaretçi tipinde fonksiyonlar ve işaretçi parametreli fonksiyonlar

Dil: C++

Program: DevC++

Kodlar:

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

int *topla(int,int);//Pointer tipinde fonksiyon tanımı
int main()
{
   int a = 2, b = 4;
   int *p;

   printf("\na = %d ,  b = %d ==>",a,b);
   p = topla(a,b);
   printf("Toplam = %d (adresi %p )\n",*p,p); 
   printf("\nblog.selcukoksuz.com");
   getch();     
}
int *topla(int x,int y)
{
    int *ptr, toplam;    
    toplam = x+y;
    ptr = &toplam;//Toplam değişkeninin bellek adresi ptr işaretçisine atandı    
    return ptr;
}

Yukarıda ki programın çıktısı şu şekilde olmaktadır;

a = 2 ,  b = 4 ==>Toplam = 6 (adresi 0022FF00 )

Evet arkadaşlar dersimizin sonuna geldik. Umarım bu ders ile pointer kavramları biraz olsun anlaşılmıştır. Konu ile alakalı sunuyu aşağıdan indirebilirsiniz. Başarılar ve iyi çalışmalar dilerim.

Pointerler dersi sunusu için sağ tuşla tıklayınız.


 

Yazar Hakkında

Bilgisayarla yaşamayı bir tarz olarak benimsemiş, teknoloji ile tamamen içli dışlı bir; web tasarımcı, yazılımcı, donanımcı, blog yazarı ve bilgisayar mühendisidir.
B.Selçuk ÖKSÜZ
B.Selçuk ÖKSÜZ kullanıcısının tüm yazıları.

Arama Sorguları

  • c pointer (20)
  • c pointer nedir (20)
  • pointer neden kullanılır (11)
  • adres operatörü işareti (10)
  • dev-c kullanımı (10)
Advertisement

Bu Yazıyı Beğendiniz Mi?

1

Bir Cevap Yazın

Sizin Yorumunuz Nedir?

%d blogcu bunu beğendi:
Gizlilik Hakları