Pointer (Gösterici) ve Diziler (Arrays)
Pointerlar ve kullanımları
Yazan : Şadi Evren ŞEKER
Pointer (gösterici) basitçe bir değişkenin bir hafıza alanını göstermesi demektir. C dilinde pointerlar:
Veritipi *pointeradi;
Şeklinde tanımlanır. Burada veritipi int, char, float gibi değişken tipleridir. Pointer adı ise bir değişken adının taşıması gereken özellikleri taşıyan ve tanımlandığı scope (geçerlilik alanında) yaşayacak olan değişken adıdır.
Bir değişkenin başına & işareti geldiğinde ise bu değişkenin adresini temsil eder. Yani değişken hafızada nereye konulduysa bu konulan yerin adresine bu işaret ile ulaşılabilir.
Örneğin,
int *p;
int a=10;
p=&a;
satırından sonra hafızada integer değer gösteren p isminde bir pointer tanımlanmış olur. Bunu hafızda temsili olarak gösterecek olursak:

Yukarıdaki temsili resimde, ilk sütun adres değerlerini temsil etmektedir, buna göre hafızanın a101 ile a120 numaralı adresleri arasındaki bilgiler gösterilmiştir ( bu değerler hexadecimal olup temsili olarak yazılmıştır)
Kodda bulunan p ve a değerlerinin hafızda hangi bölüme atanacağı çalıştırma sırasında ( execution time ) belirlenir dolayısıyla tam olarak nerede bulunacağı bilinemez ancak p tanımlnadıktan sonra a107 adresine ve a tanımlandıktan sonra a116 adresinin ayrıldığını kabul edelim. Bu durumda p’nin değeri a107 numaralı adreste olacaktır.
Kodda a değerine 10 konulmuştur bu durumda a’nın değerinin durduğu a116 numaralı adreste sayısal olarak 10 yazacaktır.
Kodda a’nın taşıdığı adres değeri, p’nin içine atılmıştır. Bu durumda p’nin değeri a’nın adresi olacaktır.
Aşağıdaki örnek kodu çalıştırınız ve yorumlayınız:
#include
int main(){
int a=10;
int *p;
p=&a;
printf(”%d\n”,*p); // p’nin gösterdiği yeri basar
printf(”%d\n”,p); // p’nin değerini yani, p’nin gösterdiği yerin adresini basar
printf(”%d\n”,a); // a’nın değerini basar
printf(”%d\n”,&a); //a’nın adresini basar
printf(”%d\n”,&p); //p’nin adresini basar
}
C dilinde her dizi bir pointer her pointer da doğal bir dizidir.
char str[80], *p1;
p1 = str;
Burada p1, str dizisinin – stringinin – ilk elamaninin adresinin degerini alir. Yani string adi, aslinda o stringin hafizadaki baslangiç adresini = stringin ilk karakterinin adresini tutmaktadir. str dizisinin 5. elemanina erismek için ise;
str[4] veya *(p1+4)
ifadelerini kullaniriz. Her ikisinin de anlami aynidir.
C’de dizi elemanlarina 2 sekilde ulasilir: pointer kullanimi ile ve indis kullanimi ile. Indis kullanimi gelistirme ve anlama bakimindan bir kolaylik saglasa da, hiz önemli bir konu oldugundan C programcilari genelde dizi erisimini pointer kullanarak yaparlar. Asagida ayni isi yapan iki fonksiyon yeralmaktadir:
void putstr(char *s)
{
int t;
for (t=0; s[t]; ++t) putchar(s[t]);
}
void putstr(char *s)
{
while (*s) putchar(*s++);
}
C dilinde bir pointer’ı array gibi kullanmak için:
int *p = (int *) malloc ( sizeof(int)*10);
şeklinde bir satır yazmak yeterlidir. Burada klasik dizi tanımından farksız bir işlem yapılmış, hafızada 10’luk bir alan açılmış ve tipi integer olarak tanımlanmıştır.
Pointer’ın farkı bu alana erişim şeklindedir. Yani dizi tanımlarında olduğu gibi köşeli parantezle (a[3] gibi) erişmek yerine pointer üzerinde işlem yapmak gereki ancak yöntem bir önceki örnekte olduğu gibi
printf(“%d\n”,*(p+4)) şeklinde işleyebilmektedir.
« Stack (Yığın) | Disk Yönetimi (Disk Management) »
Yorumlar
Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'Pointer (Gösterici) ve Diziler (Arrays)' isimli yazı 16 Oct 2007 tarihinde, saat: 22:17 'de �adi Evren �EKER tarafından gönderilmiş, toplam 1382 defa okunmuştur.
Benzer yazıları Automata (otomatlar, özdevinirler), Bilgisayar Kavramları, C/C++, Derleyiciler, Programlama Dilleri, Temel Bilimler, veri yapıları kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.
Yazarın Kitabı
Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
- Visual Basic ile Gösterici (Pointer) Kullanımı
- Hasse Çizgeleri (Hasse Diagrams)
- Zeki Vekiller (Akıllı Ajanlar, Intelligent Agents, Zeki Etmenler )
- Integral Kriptoanalizi ( Toplam Tecessüsü , Integral Cryptoanalysis)
- Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis)
- Sierpinski Üçgeni (Sierpinski Triangle)
- C ile programlamaya giriş final sınavı çözümleri
- Çok Seviyeli Sıralar (Multi Level Queues)
- Çift Özetleme (Double Hashing)
- İkinci Dereceden Sondalama (Quadratic Probing)
Yapılan Son Yorumlar
- Şadi Evren ŞEKER: Sıralama işleminiz poligonu...
- Şadi Evren ŞEKER: bahsettiğiniz sıralama algoritması...
- Abdurrahman ulusoy: merhaba hocam. gelişigüzel...
- Oguz Okutan: Merhaba hocam.. Fonksiyonlarda degere göre...
- Şadi Evren ŞEKER: Null, NULL, nil veya null olarak...
- Fatih Kabakci: hocam merhabalar,...
- kara: Çok güzel anlatılmış gerçekten teşekkürler...
- Şadi Evren ŞEKER: Bahsettiğiniz şekil dönüşümü...
- Caner: Kullanıcıdan açı girdisi almıyorsanız...
- Furkan Yediyildiz: Algoritmanin mantigi cok güzel...
- havva: çok sağolun çok güzel açıklamalar var tşk...
- Şadi Evren ŞEKER: typedef komutu, bir yapıdan yeni bir...
- fatih kabakci: hocam ben structures ile ilgili bir sorum...
- Şadi Evren ŞEKER: evet, yukarıda açıklanan, herhangi...
- Abdurrahman ulusoy: fi açısından teta kadar döndürme...
- Şadi Evren ŞEKER: Hayır yok, bir noktanın, herhangi...
- Abdurrahman ulusoy: Bu durumda yukarıdaki formüllerin...
- Abdurrahman ulusoy: Merhaba hocam Üstteki mesajımda...
- mustafa ekmekcioğlu: merhaba şadi bey ben hacettepe...
- Şadi Evren ŞEKER: Talebiniz üzerine...
Yakın Yazılar
Pointer (Gösterici) ve Diziler (Arrays)
Atıf ile Çağırma (Call by Reference)
Dolaylı sıralama (Indirect Sort, Gayrimüstakim sıralama)
Birliktelik, Münasebet ve Oluşum (Association, Aggregation and Composition)
Linked List (Linkli Liste veya Bağlı Liste)
Visual Basic ile Gösterici (Pointer) Kullanımı
Tavşan Kaplumbağa Algoritması (Hare and Tortoise Algorithm)
Paralel Diziler (Parallel Arrays)
referans ile çağırma (call by reference)
Brent Algoritması (Brent's Algorithm)
fonksiyon göstericileri (function pointer)
Bağlantılar
[...] liste sonuna kadar gider. Bir bağlı listede arama yapan kod Arama sonucunda bulunna düğümün işaretcisini döndürür. Circular (dairesel) Bağlı liste Dairesel bağlı listeye 10 sayı ekleyerek ekrana [...]
[...] tanımlanmıştır. Buna göre düğümün sağındaki ve solundaki çocukları gösteren birer gösterici (pointer) ve düğümün içindeki veriyi tutan bir veri değişkeni [...]
printf(”%d\n”,&p); hocam bu sonuc hep 2293568 cıktısını veriyor.bu sabit bi degermi yoksa farklı varyasyonlarda sonuc farklı cıkar mi?
int *p;
printf(”%d”,&p);
kullanımı, p göstericisinin adresini basar. Bu gösterici her seferinde farklı bir adreste bulunabileceği için adres değeri değişebilir. Ancak aslında adres değerleri integer olarak gösterilirken problem olabilir. Bu yüzden bu kullanım sadece temsili bir kullanım olup fikir vermesi için yazıda bulunmaktadır.
Sorunuzun cevabı, evet her çalıştırmada farklı bir adres alması mümkündür.
hocam bunun bir örneginide Visual Basic diliyle verbilir misiniz?
Talebiniz üzerine http://www.bilgisayarkavramlari.com/2010/02/23/visual-basic-ile-gosterici-pointer-kullanimi/ adresine yeni bir yazı ekledim. Bu yazıda bulunan kodları kullanarak visual basic üzerinde gösterici kullanabilirsiniz. Ancak visual basic dilinde gerçek anlamda gösterici kullanılması ve veri yapıları kodlanması, yazıda da bahsettiğim üzere, .net sonrasında nesne atıfları ile yapılmaktadır.