Teknoloji ve  Webmaster Platformu
 

Geri git   Teknoloji ve Webmaster Platformu > Programlama > C# & C++ & Delphi

C# & C++ & Delphi Windows tabanlı uygulamalar...

Cevapla
 
LinkBack Seçenekler Stil
  #1 (permalink)  
Alt 19-07-2008, 06:46
By_uLKeN - ait Kullanıcı Resmi (Avatar)
Arabesk saatler
 
Üyelik Tarihi: Feb 2008
Bulunduğu yer: Ankara
İletiler: 778
Tecrübe Puanı: 10
By_uLKeN has a spectacular aura aboutBy_uLKeN has a spectacular aura about
iTrader: (0)
Thumbs up C++ pointer kavramı

Merhaba bu makalemde C++ dilini öğrenen bir çok kişinin, belkide öğrenmek için diğer kısımlara göre biraz daha fazla çaba sarfettiği
pointers(işaretçiler) konusuna değinmeye çalışacağım. Lafı fazla uzatmadan direk temel bilgilere başlamak istiyorum.

Öncelikle bildirmek isterimki bir işaretçi asla normal değişkenler gibi bir değer tutmaz.Herhangi bir değişkenin hafızadaki adresini barındırır. Örneğin sinema salonlarında 27 No lu koltuğun bileti hep 27 No lu bilettir.Ama değişen nokta ise
koltuğa oturan kişidir. Normal bir değişken burada koltuğa oturan kişiyi tutar. İşaretçi ise koltuğu.

İşaretçileri tanımlarken başlarına * operatörü koymamız yeterlidir.

Örnek:

int *a,*b;

Burada a ve b isimli 2 adet int türünden işaretçiyi tanımlamış olduk. Fakat aşağıdaki şekilde bir kodlamada;

int *a, b;

Burada sadece a isimli değişken işaretçi b ise int türünden bir değişkendir.

İşaretçiler konusunda bilmeniz gereken 2 adet önemli operatör vardır. Bunlar Reference ( & ) ve Dereference ( * ) operatörleridir.
İşaretçiler tek başlarına çalışamazlar ve değer alamazlar bunun için başka bir değişkeni referans almak zorundadırlar.

örnek:

1: int main()
2: {
3: int *a;
4: int b=25;
5: a = &b;
6: return 0;
7: }

Burada a isimli işaretçi b isimli değişkeni referans olarak almaktadır. & operatörünü bu kod satırı üzerinde tam Türkçe'ye
çevirecek olursak "a eşittir b nin adresi" olarak elde edebiliriz.Bu kod parçacığında zaten bizi ilgilendiren tek nokta 5. satırdaki kod.Referans
operatörü şimdilik bu kadar. İlerki örneklerimizde zaten konuyu daha iyi kavrayacaksınız.

Dereference operatörünü bir örnek üzerinde açıklayacak olursak;

Örnek:

1: #include <iostream>
2: using namespace std;
3: int main()
4: {
5: int *a, b=25;
6: a = &b;
7: cout << a << endl;
8: cout << b << endl;
9: *a=30;
10: cout << *a << endl;
11: return 0;

Tek tek inceleyecek olursak 6.satırda a isimli işaretçimiz b isimli değişkeni refrans olarak alıyor ve b'nin adresini tutuyor.
7.Satırda b değişkeninin belleğin hangi adresinde bulunduğunu yazdırıyoruz.(Hatırlayalım işaretçiler adres leri tutuyorlardı)
8.Satır da b isimli değişkenimiz direkt olarak yazdırıyoruz.
9.Satır sa en can alıcı nokta *a=30; satırı ile şunu diyoruz. "a işaretçisinin adresine git ve oraya 30 değerini koy".
* operatörüne dikkat edelim. eğer a=30 deseydik derleyici bize hata verecekti.Bu durumda eskiden o adreste bulunan 25 değeri silinecek
ve yerine 30 değeri yazılacaktır.
10. Satır da ise ekranda çıktı olarak gene 30 sayısını görürüz. Burada ise denilen şu; "a işaretçisinin gösterdiği adrese git ve orada bulunan
değeri ekrana yaz"

Dereference operatörünüde bu şekilde anlatmaya çalıştım. Umarım faydalı olabilmişimdir.
İncelemeniz için bir örnek vererek devam etmek istiyorum

Örnek:

#include <iostream>
using namespace std;

int main ()
{
int a, b;
int *r;

r = &a;
*r = 20;
r = &b;
*r = 23;
cout << "a is " << a << endl;
cout << "b is " << b << endl;
return 0;
}

Bu örnekteki tüm noktaları zaten incelemiştik.

Şimdi de pointer üzerinde işlem yapmayı öğrenelim.

1: int main()
2: {
3: int *a, *b;
4: int f, c=10, d=15;
5: a=&c;
6: b=&d;
7: f=*a+*b;
8: return 0;
9: }

7. Kod satırın da yapılan işleme baktığımızda f değişkenine a ve b işaretçilerinin gösterdiği adreslerdeki değerlerin ( c ve d değerleri)
atandığını görürüz. Görüldüğü gibi normal bir işlemden tek farkı (*) operatörü. İşaretçilerle işlem yapmak bize hız kazandırır. Şöyle bir şey düşünün
sizi 50 odalı bir daire ye sokuyorlar ve diyorlarki odalardan birinde kırmızı gömlekli bir adam var o adamı tut getir. Birde 17 numaralı odada kırmızı
gömlekli bir adam olduğunu söylüyorlar sizce hangisi ?


Birazda pointer ların aritmetiği üzerinde duralım. Mesela biz a isimli bir integer değişkene a++ şeklinde bir işlem gerçekleştirsek a nın değeri her işlemden sonra 1 artardı. Fakat short türünden a isimli bir işaretçiye a++ desek ? Biz susalım resimler konuşsun.




Son olarak işaretçilerin işaretçileri nasıl işaret ettiğine bakalım. (Biraz tekerleme gibi oldu)
İlk başta söylediğimiz gibi işaretçiler adres değerlerini tutuyorlardı. Fakat bu değerler ile onlarda hafızada bir yerdeler.Peki oraya nasıl ulaşırız?
Bu işte imdadımız (**) operatörü koşuyor. Aşağıdaki örneğe bakalım.

char a;
char * b;
char ** c;
a = 'z';
b = &a;
c = &b;

Gördüğünüz gibi b değişkeni zaten bir işaretçi ve a değişkeninin adresini tutmakta. C değişkeninin ise durumu belli

Kaynak
Alıntı ile Cevapla
Yeni Konu aç Cevapla


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 
Seçenekler
Stil

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık
Hizli Erisim


Şuan Saat: 21:30.

Powered by vBulletin® Version 3.7.5
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
Hosting Sunucu Yönetimi


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204