13 Ocak 2015 Salı

C Programlama Gösterge (Pointer) Kavramı

Değişkenlerin kapladıkları hücrelerin adreslerini saklamak için başka değişkenler de kullanabiliriz. Bu değişkenlere gösterge adı verilir. Göstergeler, diğer değişkenler gibi, sayısal bir değişkenlerdir. Bu sebeple kullanılmadan önce program içinde bildirilmelidir. 

Sözdizimi :   tip_adı *gösterge_adı;

int *bayraktar;
float *x, *y, *z

Gösterge Operatörleri ( & ve *) : "&" değer atama operatörüdür. Örneğin bayraktar = &y; ifadesinde y değişkenini gösteren bayraktar göstergesidir. "*"  yönlendirme operatörünün göstergeyi tanımlamanın dışında bir görevi daha vardır. Örneğin *bayraktar ifadesi, bayraktar'ın gösterdiği hücrenin içeriğine ulaşmak içinde kullanılabilir. *bayraktar = 66; gibi...

Bir göstergenin bellekte herhangi bir hücreyi göstermesini istemediğimiz zaman NULL isimli sabit kullanılır. NULL göstergenin bellekte hiç bir yeri göstermediğini belirten 0 değeridir.
int *bozok = NULL;

Dinamik Bellek Kullanımı: Programın çalışması esnasında özel komutlar kullanarak bellekten yer alınıp kullanılmasına dinamik bellek kullanımı adı verilir. Dinamik değişkenler için bellekte ayrılan yere yığın (heap) adı verilir. Dinamik bellek kullanımını new ve delete komutları ile gerçekleştiririz..

new komutu ile bellekten istediğimiz veri Npi boyutunda bir yer alabiliriz.
int *ornek; //ornek adlı tamsayı gösterecek bir gösterge tanımlıyoruz.
ornek = new int; //bellekten tamsayı kadar yer ayrılır, bu yerin adresi burada ornek'e aktarılır.
*ornek = 9; //bellekten alınan yeni yere 9 atanır.

int *bozok=new int(9); //değişken tanımlanması esnasındada ilk ataması yapılabilir.

Dinamik bir Dizi Oluşturalım ve tekrar bellekten Silelim :
int *ornekdizi; //ornekdizimiz tamsayı gösterecek şekilde tanımlanır. 
ornekdizi=new int[10]; //bellekten 10 tamsayı dizisi için yer tahsis edilir ve dizinin adresi ornekdizi'ye atanır.
ornekdizi[2]=16; //bellekten alınan dizinin 1.indeksteki elemanına 15 atanır.
Bellekten new ile aldığımız yerler, kullanımları sona erdiğinde yeniden kullanılamazlar. Bu nedenle bellekten aldığımız hücreleri program bitmeden delete komutu ile silmemiz gerekir.

int *bozok=new int; //bozok göstergesine tamsayı boyutunda yerin adresi atanır.
*bozok=16; //bozok göstergesinin gösterdiği yere 16 atanır.
cout<<*bozok; //atanan 16 değeri yazdırılır.
delete bozok; //ayrılan yer belleğe geri döndürülür.

int *ornekdizi; //ornekdizi adında tamsayı gösterecek bir gösterge tanımlanır.
ornekdizi=new int[8]; //bellekten 8 tamsayı dizisi için yer ayrılır ve dizinin adresi ornekdizi'e atanır.

ornekdizi[1]= 13; //bellekten alınan dizinin 1.indeksteki elemanına 13 atanır.
delete [] ornekdizi; //oluşturulan dizinin tüm elemanları belleğe geri döndürülür.

Örnek:
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;

void oku(int[],int);
int main(int argc, char *argv[])
{
   int mevcut, toplam=0;
   int max=0;
   int *notlar;
   cout<<"Sinif mevcudunu Giriniz: ";
   cin>>mevcut; //Sınıf mevcudunu okuyoruz
   notlar=new int[mevcut]; //Sınıf mevcudu kadar dinamik dizi yaratıyoruz
   oku(notlar,mevcut); 
   
   for(int i=0; i<mevcut;i++) 
   {
           toplam+=notlar[i];
           if (notlar[i]>max)
           max=notlar[i];
   }
   cout<<"Sinif Ortalamasi= "<<toplam/mevcut<<endl;
   cout<<"En yuksek not = "<<max<<endl;
   delete [] notlar;
   getch();
}
void oku(int notDizi[], int boyut) //Notları okuduğumuz fonksiyon
{
     cout<<"Notlari Giriniz:";
     for(int i=0; i<boyut;i++)
             cin>>notDizi[i];
}

Hiç yorum yok:

Yorum Gönderme

Copyright 2013-2017 | İbrahim BAYRAKTAR /dev/null Web Günlüğü