C Programlama Pointer Mekanizması

c_programlama-134Bir deÄŸiÅŸkene deÄŸer atadığımızda, aslında bellek hücrelerini deÄŸiÅŸtirdiÄŸimizi söylemiÅŸtik. Bu doÄŸru bir tanım ama eksik bir noktası var. Bellek hücrelerini deÄŸiÅŸtermemize raÄŸmen, bunu direkt yapamaz; deÄŸiÅŸkenleri kullanırız. Bellek hücrelerine direkt müdahâle Pointer’lar sayesinde gerçekleÅŸir.

Pointer, birçok Türkçe kaynakta ‘iÅŸaretçi’ olarak geçiyor. Direkt çevirirseniz mantıklı. Ancak terimlerin özünde olduÄŸu gibi öğrenilmesinin daha yararlı olduÄŸunu düşünüyorum ve ben Pointer olarak anlatacağım. Bazı yerlerde iÅŸaretçi tanımı görürseniz, bunun pointer ile aynı olduÄŸunu bilin. Åžimdi gelelim Pointer’in ne olduÄŸuna…

DeÄŸiÅŸkenler bildiÄŸiniz gibi deÄŸer (sayı, karakter, vs…) tutar. Pointer’lar ise adres tutan deÄŸiÅŸkenlerdir. Bellekten bahsetmiÅŸtik; küçük hücrelerin oluÅŸturduÄŸu hafıza bloÄŸunun adreslere ayrıldığını ve deÄŸiÅŸkenlerin bellek hücrelerine yerleÅŸtiÄŸini gördük. İşte pointer’lar bu bellek adreslerini tutarlar.

Pointer tanımlamak oldukça basittir. Sadece deÄŸiÅŸken adının önüne ‘*’ iÅŸareti getiririz. Dikkat edilmesi gereken tek nokta; pointer’ı iÅŸaret edeceÄŸi deÄŸiÅŸken tipine uygun tanımlamaktır. Yani float bir deÄŸiÅŸkeni, int bir pointer ile iÅŸaretlemeÄŸe çalışmak yanlıştır! AÅŸağıdaki örneÄŸe bakalım:

#include<stdio.h>
int main( void )
{
	// int tipinde deÄŸiÅŸken
	// tanımlıyoruz:
	int xyz = 10, k;
	// int tipinde pointer
	// tanımlıyoruz:
	int *p;

	// xyz deÄŸiÅŸkeninin adresini
	// pointer'a atıyoruz.
	// Bir deÄŸiÅŸken adresini '&'
	// işaretiyle alırız.
	p = &xyz;

	// k deÄŸiÅŸkenine xyz'nin deÄŸeri
	// atanır. Pointer'lar değer tutmaz.
	// deÄŸer tutan deÄŸiÅŸkenleri iÅŸaret
	// eder. Başına '*' koyulduğunda,
	// iÅŸaret ettiÄŸi deÄŸiÅŸkenin deÄŸerini
	// gösterir.
	k = *p;

	return 0;
}

Kod parçasındaki yorumları okuduÄŸunuzda, pointer ile ilgili fikriniz olacaktır. Pointer adres tutan deÄŸiÅŸkenlerdir. Åžimdiye kadar gördüğümüz deÄŸiÅŸkeninlerin saklayabildiÄŸi deÄŸerleri tutamazlar. Sadece deÄŸiÅŸkenleri iÅŸaret edebilirler. Herhangi bir deÄŸiÅŸkenin adresini pointer içersine atamak isterseniz, deÄŸiÅŸken adının önüne ‘&’ getirmeniz gerekir. Bundan sonra o pointer, ilgili deÄŸiÅŸkeni iÅŸaret eder. EÄŸer bahsettiÄŸimiz deÄŸiÅŸkenin sahip olduÄŸu deÄŸeri pointer ile göstermek veya deÄŸiÅŸken deÄŸerini deÄŸiÅŸtirmek isterseniz, pointer başına ‘*’ getirerek iÅŸlemlerinizi yapabilirsiniz. Pointer başına ‘*’ getirerek yapacağınız her atama iÅŸlemi, deÄŸiÅŸkeni de etkileyecektir. Daha kapsamlı bir örnek yapalım:

#include<stdio.h>
int main( void )
{
	int x, y, z;
	int *int_addr;
	x = 41;
	y = 12;
	// int_addr x degiskenini
	// isaret ediyor.
	int_addr = &x;
	// int_addr'in isaret ettigi
	// degiskenin sakladigi deger
	// aliniyor. (yani x'in degeri)
	z = *int_addr;
	printf( "z: %d\n", z );
	// int_addr, artik y degiskenini
	// isaret ediyor.
	int_addr = &y;
	// int_addr'in isaret ettigi
	// degiskenin sakladigi deger
	// aliniyor. (yani y'nin degeri)
	z = *int_addr;
	printf( "z: %d\n" ,z );

	return 0;
}

Bir pointer’in iÅŸaret ettiÄŸi deÄŸiÅŸkeni program boyunca sürekli deÄŸiÅŸtirebilirsiniz. Yukardaki örnekte, int_addr pointer’i, önce x’i ve ardından y’yi iÅŸaret etmiÅŸtir. Bu yüzden, z deÄŸiÅŸkenine int_addr kullanarak yaptığımız atamalar, her seferinde farklı sonuçlar doÄŸurmuÅŸtur. Pointer kullanarak, deÄŸiÅŸkenlerin sakladığı deÄŸerleri de deÄŸiÅŸtirebiliriz. Åžimdi bununla ilgili bir örnek inceleyelim:

#include<stdio.h>
int main( void )
{
	int x, y;
	int *int_addr;
	x = 41;
	y = 12;
	// int_addr x degiskenini
	// isaret ediyor
	int_addr = &x;
	// int_addr'in isaret ettigi
	// degiskenin degerini
	// degistiriyoruz
	*int_addr = 479;
	printf( "x: %d y: %d\n", x, y );
	int_addr = &y;

	return 0;
}

Kodu derleyip, çalıştırdığınızda, x’in deÄŸerinin deÄŸiÅŸtiÄŸini göreceksiniz. Pointer başına ‘*’ getirip, pointer’a bir deÄŸer atarsanız; aslında iÅŸaret ettiÄŸi deÄŸiÅŸkene deÄŸer atamış olursunuz. Pointer ise hiç deÄŸiÅŸmeden, aynı adres bilgisini tutmaya devam edecektir.

Kategoriler: C Programlama, Web Programlama, Yazılım

Tags: , ,

Yorumlar

Yorum Yok

Yorumunuzu Ekleyin

Yorum eklemek için giris yapmalısınız.