CPP Pointerlar

/*
* Pointerlar adres tutan degiskenlerdir
* Normalde her degiskenin bellekte tutuldugu bir adres vardir
* Atiyorum int a=5; degiskeni bellegin 100. byte'inda tutuluyor.
* a degiskeninin degeri 5
* 
* biz cout<<a; dedigimizde 100,101,102,103. bytelarda bulunan 
* a integer'inin degeri(5) konsola yaziliyor. 
* 
* Pointerlar da tipki bir int gibi sayi tutar ama bu sayi 
* siradan bir sayi degil bir bellek adresidir. Pointerlar ile 
* diger degiskenlerin adresini tutuyoruz.
* 
* Her pointerin belli bir turu vardir. Eger isaret ettigi adres
* bir int degiskenine aitse integer turunde tanimlamamiz lazim. 
* eger isaret ettigi adres float ise float turunde tanimlamamiz 
* gerekli...
* 
* pointer tanimlamak icin 
* Tur_adi* pointer_adi;
* 
* ornek:
* int* iptr;
* 
* pointera deger atarken degiskenin adresini & ile aliyoruz. 
* 
* int a=5;
* &a -> a'nin adresi
* 
* iptr = &a; -> a nin adresini iptr ye atadik
*
*/

#include <iostream>
using namespace std;

//structimizi olusturduk
struct Point{
	int x{}, y{}, z{};

	//asagidaki friend fonksiyonuna kafanizi takmayin
	//cout da kullanabilmek icin yazdik
	friend std::ostream& operator<<(std::ostream& os,const Point& p) {
		os << "x: " << p.x << "  y: " << p.y << "  z: " << p.z;
		return os;
	}

};


int main() {
	Point p; // bir adet nesne olusturduk
	cout << "p nin degeri: " << p << endl;
	cout << "p nin adresi: " << &p << endl;
	cout << endl;

	Point* p_pointer{};
	cout << "p_pointer'in degeri: " << p_pointer << endl;
	cout << "p_pointer'in adresi: " << &p_pointer << endl;
	cout << endl;

	p_pointer = &p;
	cout << "p_pointer = &p;" << endl;
	cout << "p_pointer'in degeri: " << p_pointer << endl;
	cout << "p_pointer'in adresi: " << &p_pointer << endl;
	cout << endl;

	cout << "pointer'in icerigini * ile aliyoruz:" << endl;
	cout << "*p_pointer: " << *p_pointer << endl;
	cout << endl;

	// Pointerla farkli isler yapabiliriz. 
	// Oncelikle structimizda int'lerin adresini ogrenelim 
	cout << "p nesnesinin ve icindeki integerlarin adresleri:" << endl;
	cout << "&p   :  " << &p << endl;
	cout << "&p.x :  " << &p.x << endl;
	cout << "&p.y :  " << &p.y << endl;
	cout << "&p.z :  " << &p.z << endl;
	cout << endl;

	//nesnemizin degerlerini degistirdik
	p.x = 3; p.y = 4; p.z = 5;
	cout << "p: " << p << endl;

	// int turunde bir pointer olusturduk
	// daha sonra nesnenin adresini ona atamak icin cast islemi yaptik
	// (burasi biraz karmasik gelebilir gayet normal)
	int* int_ptr = (int*)&p;
	cout << *int_ptr << endl;
	int_ptr++; // bir sonraki int adresine gidiyor (yani 4 byte atliyor) 
	cout << *int_ptr << endl;
	int_ptr++;
	cout << *int_ptr << endl;

}
p nin degeri: x: 0  y: 0  z: 0
p nin adresi: 0000002F8CB7F7A8

p_pointer'in degeri: 0000000000000000
p_pointer'in adresi: 0000002F8CB7F7A0

p_pointer = &p;
p_pointer'in degeri: 0000002F8CB7F7A8
p_pointer'in adresi: 0000002F8CB7F7A0

pointer'in icerigini * ile aliyoruz:
*p_pointer: x: 0  y: 0  z: 0

p nesnesinin ve icindeki integerlarin adresleri:
&p   :  0000002F8CB7F7A8
&p.x :  0000002F8CB7F7A8
&p.y :  0000002F8CB7F7AC
&p.z :  0000002F8CB7F7B0

p: x: 3  y: 4  z: 5
3
4
5

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *