08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

GÖSTERİCİYİ GÖSTEREN GÖSTERİCİLER<br />

Gösterici değişkenler içlerinde adres bilgisi tutan nesnelerdir.<br />

int *p;<br />

gibi bir tanımlamayla ismi p olan, bellekte 2 ya da 4 byte yer kaplayacak olan bir nesne<br />

yaratılmış olur. Bu nesne int * türündendir.<br />

p bir nesne olduğuna göre, p değişkeninin de adresinden söz edilebilir.<br />

p değişkeni adres işlecinin terimi olabilir:<br />

&p<br />

ifadesinin türü nedir? Bu ifade int * türünden bir nesnenin adresi olabilecek bir türdendir.<br />

Bu tür C dilinde<br />

(int **)<br />

türü olarak gösterilir. O zaman p gibi bir değişkenin adresi bir başka nesnede tutulmak<br />

istenirse, p'nin adresini tutacak nesne int ** türünden olmalıdır. Aşağıdaki kod parçasını<br />

inceleyin:<br />

void func()<br />

{<br />

int x = 10;<br />

int *p = &x;<br />

int **ptr = &p;<br />

/******/<br />

}<br />

Yukarıdaki programda int ** türünden olan ptr isimli değişkene, int * türünden olan p<br />

değişkeninin adresi atanıyor. Bunun anlamı şudur: ptr değişkeninin değeri, p değişkeninin<br />

adresidir. Başka bir deyişle, ptr göstericisi p göstericisini gösterir. Bu durumda<br />

*ptr<br />

ifadesi ptr nesnesinin gösterdiği nesnedir. Yani *ptr ifadesi p nesnesinin kendisidir.<br />

*ptr ifadesine yapılan atama aslında p nesnesini değiştirir. Aşağıdaki programı inceleyin:<br />

#include <br />

int main()<br />

{<br />

int x = 10;<br />

int y = 20;<br />

int *p;<br />

int **pp;<br />

printf("x = %d\n", x);<br />

printf("y = %d\n", y);<br />

p = &x;<br />

*p = 100;<br />

pp = &p;<br />

*pp = &y;<br />

*p = 200;<br />

printf("x = %d\n", x);<br />

printf("y = %d\n", y);<br />

307

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!