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

Hata
  • XML Parsing Error at 1:82. Error 9: Invalid character


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 )  
404 Not Found

404

Not Found

The resource requested could not be found on this server!


Proudly powered by LiteSpeed Web Server

Please be advised that LiteSpeed Technologies Inc. is not a web hosting company and, as such, has no control over content found on this site.