Programlama | Programlama Dilleri | C Programlama Dili |C++

Anasayfa Programlama C / C++ Pointer Nedir Nasıl Çalışır? Pointer Örnek Program Üzerinde Anlatım


Pointer Nedir Nasıl Çalışır? Pointer Örnek Program Üzerinde Anlatım

AÇIKLAMA

Bu projemizde pointerlerin ne olduğunu ve nasıl çalıştığını anlatıp , c/c++ dillerinde pointerlerin nasıl kullanıldığı birkaç çeşitli örnekle anlatılacaktır.

int main(int argc, char* argv[])
{
int a;      // a bir tamsayidir
int *aptr;   // aptr bir tamsayıyı gösteren bir göstericidir
int b[10];
a=7;
aptr=&a;   // aptr'ye a'nın adresi atandı
printf("a'nin adresi %p \n aptr degiskeninin degeri %p\n",&a,aptr);
printf("a'nin degeri %d\n *aptr'nin degeri %d\n",a,*aptr);
printf("b dizisinin adresi %p \n b'nin ilk elemanin adresi %p\n",b,&b[0]);
printf("b nin ikinci elemanin adresi %p\n",&b[2]);
printf("&*ptr= %p &a=%p  \n *&ptr=%p \n",&*aptr,&a,*&aptr);
printf("&aptr degeri %p",&aptr);
getche();
return 0;
}
 

Programımızda başlangıçta int tipinden bir adet a değişkeni , int tipinden bir adet aptr pointeri değişkeni ve yine int tipinden 10 elemanlı bir b dizisi tanımlanmıştır. Daha sonra a değişkenine 7 değeri atanmıştır.

Hemen bir uyarı geçersek bir pointer değişkeni * işareti ile kullanıldığında (*aptr olarak) barındırdığı adresin gösterdiği bellek hücresi içerisinde bulunan sayısal değeri ifade ederken, * olmadan kullanıldığında (aptr olarak) barındırdığı adresi ifade eder. 5.Satırda Görüleceği üzere aptr değişkenine a değişkenin adresi atanmıştır. Pointer değişkenini aptr olarak(yıldız olmadan) kullanmak içerisine adres konulabileceği anlamına gelir ve bizde a değişkeninin adresini atadığımızdan sorun yoktur. %p işareti adres tipinden verileri göstermek amacıyla kullanılır.

1. printf ifadesine bakarsak a'nın adresi için %p  ifadesi kullanılmış ve gösterilecek olan &a argüman olarak verilmiştir.

printf("a'nin adresi %p \n aptr degiskeninin degeri %p\n",&a,aptr);

Burada gelecek olan (bastırılacak veri) veriyi bilemeyiz; çünkü o anda a değişkenine ayrılan bellek bölgesini derleyici işletim sistemi yardımıyla belirlediğinden bilgisayardan bilgisayara çalışma zamanına kadar bir çok nedenden dolayı farklılık gösterir. Dolayısıyla bu adres bilgisi şudur demek yanlış olur ama printf ifadesinin adres bilgisi bastıracağı açıktır.

printf("a'nin adresi %p \n aptr degiskeninin degeri %p\n",&a,aptr); 

Aynı satırdaki aptr pointer değişkenin ise ne göstereceği de bellidir çünkü pointer değişkeninin * olmadan kullanımının adres bilgisi bastıracağını daha önce belirtmiştik. Bu printf ifadesinin hemen üzerinde olan

aptr=&a;

ifadesine dikkat ettiğimizde aptr değişkenine a değişkenin adresinin atandığını daha önce görebiliriz. Peki ama ne gösterecektir? Cevap şudur ki; yine aynı sebeplerden tam olarak şudur diyemeyiz fakat a'nın adresi ne ise aynı değer tekrar bastırılacaktır. Yani a'nın adresi olan &a ile aptr ifadeleri aynı adres değerini göstereceklerdir.

2. printf ifadesine bakarsak;

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

a ve *aptr değişkenleri bastırılmıştır. a bir düz değişken olduğundan açıktır ki 7 değeri bastırılacaktır. *aptr değişkeninin ise gerçek veriye işaret ettiğini daha önce belirtmiştik ve bu pointer değişkeninin içerisinde barındırdığı adresin a değişkeninin adresiyle aynı olduğunu (5.Satırda) belirttiğimizden dolayı *ptr ifadesi 7 değerini gösterecektir.

3. printf ifadesine bakarsak;

printf("b dizisinin adresi %p \n b'nin ilk elemanin adresi %p\n",b,&b[0]);

Bir dizinin isminin tek başına kullanıldığında (b) dizi başlangıç adresini ifade ettiğini aynı zamanda dizinin başlangıç adresinin de dizinin ilk elemanının adresi ( &b[0] ) olduğunu diziler konusundan biliyoruz. Bu durumda bu iki ifade de aynı sayısal adresi gösterecektir.

4. printf ifadesine bakarsak;

printf("b nin ikinci elemanin adresi %p\n",&b[2]);

Burada dizinin 2. elemanının adresi bastırılacaktır. Dizinin başlangıç adresinin değeri ne ise buradaki değerde onun 8 fazlası olacaktır. Neden 8 olduğunun yanıtını ise şu şekilde açıklayalım; int tipinde bir değişken 4 byte bellek bölgesi kapladığından 2. elemanın adresi dizinin başlangıç adresinden 8 byte ilerde olmalıdır. Burada dikkat edilmesi gereken husus bellek adresi hexadecimal tabanda olduğundan toplama işlemide hexadecimal olarak tabana uygun olarak hesaplanmalıdır.

5. printf ifadesine bakarsak;

printf("&*ptr= %p &a=%p  \n *&ptr=%p ",&*aptr,&a,*&aptr);       

İlk bastırılacak olan ifade pointer değişkenin gösterdiği gerçek veririn (a’nın) adresidir. İkinci ifade a değişkenin adresini bastırır. Üçüncü ifade ise pointer değişkenin adresinin içinde bulunan veriyi ki oda a’nın adresi olmaktadır. Sonuç olarak bu üç ifade de a’nın adresini gösterecektir.

6. printf ifadesine bakarsak;

printf("&aptr degeri %p",&aptr);

Bu ifadesi ise pointer değişkenin adresini bastıracaktır.

 

 

 

Yorumlar (0)
Sadece kayıtlı kullanıcılar yorum yazabilir!
Son Güncelleme ( Salı, 30 Ağustos 2011 05:02 )  
amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım