MARMARA BÖTE
  C Dersleri-6
 

<<5          7>>

GÖSTERİCİLER

Adres Kavramı

Adres kavramı hem donanıma hem de yazılıma ilişkindir. Donanımsal açıdan adres bellekte yer gösteren bir sayıdan ibarettir. Mikroişlemci bellekte bir bölgeye ancak o bölgenin adres bilgisiyle erişebilir.

Göstericilerin Bildirimleri

 

Göstericiler adres bilgilerini saklamak ve adreslerle ilgili işlemler yapmak için kullanılan nesnelerdir. Göstericilerin içlerinde adres bilgileri bulunur. Bu nedenle gösterici ile adres hemen hemen eş anlamlı olarak düşünülebilir. Ancak gösterici deyince bir nesne, adres deyince bir tür akla gelmelidir.

 

Gösterici bildirimlerinin genel biçimi şöyledir:

 

<tür> *<gösterici ismi>;

 

<tür> göstericinin (içerisindeki adresin) türüdür. char, int, float... gibi herhangi bir tür olabilir.

 

Burada * göstericiyi ya da adresi temsil etmektedir.

 

Örnek gösterici bildirimleri:

 

float *f;

char *s;

int *dizi;

unsigned long *PDWORD;

 

Gösterici bildirimlerinin diğer türlere ilişkin bildirimlerden * atomu ile ayrılmaktadır.

Gösterici Operatörleri

C dilinde toplam 3 tane gösterici operatörü vardır. Bu operatörler göstericiler ve adres bilgileriyle kullanılabilirler. Gösterici operatörleri şunlardır :

 

*   İçerik Operatörü

&  Adres Operatörü

[ ]  İndex Operatörü

 

Gösterici Operatörlerinin Ayrıntılı İncelenmesi

& Adres Operatörü (adress of operator)

Adres operatörü tek operand alan önek konumunda bir operatördür. Bu operatörün ürettiği değer operandı olan nesnenin adresidir. Yani operatörün ürettiği adres bilgisinin sayısal bileşeni nesnenin bellekteki fiziksel adres numarası, tür bileşeni ise nesnenin türü ile aynı türdür.

 

int k;

 

&k

 

ifadesini ele alalım. Bu ifadenin ürettiği değer int türden bir adres bilgisidir. Adres bilgilerinin iki bileşeni olduğunu söylemiştik. Yukarıdaki ifadenin ürettiği bilginin sayısal bileşeni k nesnesinin bellekte yerleştirildiği yerin başlangıç adresi, tür bileşeni ise int türüdür. Zira k değişkeni int türden bir değişkendir.

* İçerik Operatörü (indirection operator)

İçerik operatörü de önek konumunda bulunan ve tek operand alan bir operatördür. Bir gösterici, * operatörünün operandı olursa, elde edilen ifade p göstericisinin içerisindeki RAM adresinde bulunan, nesneyi temsil eder. Dolayısıyla, * operatörü ile oluşturulan bir ifade bir nesneyi temsil etmektedir, ve sol taraf değeri olarak kullanılabilir.

 

Örneğin:

 

int *p;

 

p = (int *) 0x1FC3;

*p = 100;

 

Burada *p’nin türü int’dir. Dolayısıyla *p = 100 gibi bir işlemden yalnızca 0x1FC3 byte’ı değil, 0x1FC3 ve 0x1FC4 bytelarından her ikisi birden etkilenir.

[ ] Köseli Parantez (index) Operatörü 

Dizi elemanlarına erişmekte kullandığımız köşeli parantez aslında unary prefix bir gösterici operatörüdür.

 

[] içerisine tamsayı türünden bir ifade yazılır. (İfadenin değeri pozitif olmak zorunda değildir.)

 

[] operatörünün operandı dizi ismi olmak zorunda değildir. Bir adres bilgisi olmak zorundadır.

 

[] operatörünün operandı bir dizi ismi olabilir. Gösterici olabilir. Diğer adres belirten ifadeler olabilir.

 

p[n] ile *(p + n) tamamen eşdeğerdir.

 

#include <stdio.h>

 

int main()

{

            char s[] = "İstanbul";

            char *p;

 

            p = s + 1;

            putchar(p[2]);

return 0;

}

Fonksiyon Parametre Değişkeni Olarak Göstericilerin Kullanılması

Bir fonksiyonun parametre değişkeni herhangi bir türden gösterici olabilir.

 

void func(int *p)

{

            ...

}

 

Bir fonksiyonun parametre değişkeni bir gösterici ise fonksiyon da aynı türden bir adres bilgisi ile çağırılmalıdır.

 

Bir fonksiyonun başka bir fonksiyonun yerel değişkenini değiştirebilmesi için o fonksiyonun yerel değişkeninin adresini parametre olarak alması gerekir.

 

#include <stdio.h>

 

void func(int *p)

{

            *p = 20;

}

 

int main()

{

            int a = 10;

           

            func(&a);

            printf("%dn", a);

            return 0;

}

Dizilerin Fonksiyonlara Göstericiler Yoluyla Geçirilmesi

 

Örnek:

 

#include <stdio.h>

 

void display (int *p, int size)

{

            int i;

 

            for (i = 0; i < size; ++i)

                        printf("%d ", p[i]);

}

 

int main()

{

            int a[5] = {3, 8, 7, 6, 10};

 

            display(a, 5);

return 0;

}

 

 

 

 

 

 

<<5          7>>

 
  Bugün 1 ziyaretçi (1 klik) kişi burdaydı! @2009 Marmara üniversitesi  
 
Bu web sitesi Bedava-Sitem.com ile ücretsiz oluşturuldu. Siz de kendi web sitenizi ister misiniz?
Ücretsiz kayıt ol