/*
* 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
Leave a Reply