12 MAYIS 2017
PAZARTESİ
18.21
C++ İşaretçiler ile Diziler

Oluşturulan diziler ile işaretçiler arasındaki bağlantılar oldukça basittir. Normal işaretçi oluşturur gibi dizilere atamalar yapılabilir.

 

Elimizde aşağıdaki yapıda bir dizimiz ve pointerımız olsun.

int dizi[10];
int * ptr;

Oluşturduğumuz dizi elemanını ptr isimli pointera atamak istediğimizde;

ptr = dizi;

ibaresi yeterli olacaktır.

Dizi ve Pointer İlişkisi

Öncelikle yukarıda oluşturduğumuz dizi elemanını ele alalım. Dizi elemanımızın aşağıdaki gibi güncelleyelim;

int dizi[10] = {5,10,15,20,25,30,35,40,45,50};

Oluşturduğumuz bu dizimiz üzerinde biraz kafa yoralım. Pointerları işlerken demiştik ki her değişken için bellekte bir adres vardır. Bu durum diziler içinde geçerlidir. Ve dizilerin adresleri tam olarak ilk elemanlarından başlar. Öyleyse biz atama işlemimizi şöyle yaparsak;

ptr = dizi;

Ve bu atama işleminden sonra ptr isimli pointerımın değerini ekrana döndürürsem bana ne çıktısı verir?

  1. "dizi" adı ile bir integer dizi oluşturdum.
  2. dizi isimli dizime 10 adet veri yükledim.
  3. dizi isimli diziyi ptr isimli pointera eşitledim.
  4. *ptr ile ekrana çıktı verdirdim.

Öyleyse * işareti ile ptr isimli değişkene kayıtlı adresin verisini döndürüyorduk. Sonuçta çıktımız dizinin ilk değerinden başka bir şey olmayacak. Yani "5".

Olayı aşağıdaki örnekle pekiştirelim;

int main() {
	int dizi[10] = {5,10,15,20,25,30,35,40,45,50};
	int * ptr;
	ptr = dizi;
	
	for(int i=0; i<10; i++) {
		cout << *(ptr+i) << "\t";
	}
}

Örneğimizde farkettiğimiz üzere aynı dizimizi kullandık. Fakat bir for döngüsü içerisinde işlemler gerçekleştirdik. İşlemleri inceleyelim.

for döngüsü içerisinde tanımlanan i değişkeni 0'dan başlıyor ve i değişkeni her tekrarda 1 arttırılıyor. i değişkeni 10'dan küçük olduğu süre zarfında işlem tekrar ediyor.

for döngüsü içerisinde *(ptr+i) ifadesine yer verilmiş. * pointer olduğunu göstermekte ve görevi gereği önündeki nesnenin içeriği ekrana çıktı verecek. Öyleyse aşağıdaki tabloya bakabiliriz;

i *(ptr+i)
0 5
1 10
2 15
3 20
4 25
5 30
6 35
7 40
8 45
9 50

dizi isimli diziyi ptr isimli pointera atadığımız için *ptr bize dizinin ilk değerini veriyordu. Öyleyse biz *(ptr+1) yaparak dizinin birinci değerini de alabiliriz. Pointer konusunda dediğimiz gibi dizilerde adresler sırasıyla gelmektedir. Bu sebeple *ptr 'dan sonra *(ptr+1) gelecektir. Fakat bunu şöyle düşünmemeliyiz;

  • ptr adresi 3482
  • ptr+1 adresi 3483

Bu kesinlikle yanlıştır. Burada yer eden +1 değeri öncelikle dizi değişkeninin veri tipine bakar. Veri tipi integer. O halde 4 bayt. Bu sebeple;

  • ptr adresi 3482
  • ptr+1 adresi 3486

gibi bir söylem doğru olacaktır.

İsterseniz kontrol edelim.

Önceki kodda yer alan * ibaresini kaldırıp şöyle güncelleyebiliriz;

int main() {
	int dizi[10] = {5,10,15,20,25,30,35,40,45,50};
	int * ptr;
	ptr = dizi;
	
	for(int i=0; i<10; i++) {
		cout << (ptr+i) << "\n";
	}
}

Ve çıktımız;

Çıktımıza dikkat edersek 16'lık sayı tabanında 4'er 4'er arttığını gözlemleyeceğiz.

Sonuç olarak;

*(ptr+1) == dizi[1]

diyebiliriz.

YORUMLAR 0
Bu konuya henüz kimse yorum yapmadı.
İlk yorumu sen yapmak ister misin?
YORUM BIRAK
Şuanda bu yoruma cevap yazıyorsunuz:
İptal Et