Verdiginiz cevaplar icin tesekkurler. Simdi benim buradan anladigim; int x = 100; // diyelimki x degiskene 100 byte lik yer ayrildi int y = x; // y degiskenini x e esitleyerek bellekte 100 byte lik baska bir yer daha ayrildi. int z = y; // bellekte baska bir 100 byte lik alan acildi boylece tek bir deger icin bellekte bos yere 200 byte lik yer acilmis oldu. ama int x = 100; int y, z; y = &x; z = &x; seklinde yaparsak elimizde 3 ayri degisken olacak ama sadece 100 byte lik alan kaplayacagiz. Dogrumu acaba? "Yer yuzunde hic bir pislik yoktur ki; altindan bir yahudi cikmasin" Adolf Hitler... "Turkiye de hicbir pislik yokturki altindan cemaat cikmasin" SniperScope "Nerede yavşak, hırsız varsa hepsi Allahçı" Fazil Say

tamam hafiz, int x = 5; tanimida hafizada yer tutuyor. Sanirim program calisirken int x in bellekteki yeri ha bire degisip durmuyor. Yani bellekte x icin bir alan olusturuluyor ve onun uzerinden devam edip gidiyor. Yani ne diye int y = x; duruken ne diye x in bellekteki adresini cagiralim. int p; p = &x; cout << p; ile cout << x ayni degeri verecek. "Yer yuzunde hic bir pislik yoktur ki; altindan bir yahudi cikmasin" Adolf Hitler... "Turkiye de hicbir pislik yokturki altindan cemaat cikmasin" SniperScope "Nerede yavşak, hırsız varsa hepsi Allahçı" Fazil Say

Yaklasik bir haftadir lynda.com un c++ dersleri ile beraber Deitel in C++ How to program isimli kitabi ile c++ ogreniyoru m. dum diye ekledim cunku ilk baslarda gayet iyi giderken pointerlar dan oteye gidemiyorum. Simdi int i = 5; int j; int pointer; j = i; // bu sekilde j ye 5 degerini atiyoruz eeee pointer = i; // bunada 5 degerini atadik. o zaman bu pointer zimbirtisina ne gerek var? video da soyle birsey var. int x = 1; int y = x; int ip; ip = &x; int y = ip; Yukaridaki daha kolay degilmi? Ne diye sol elimizle sag kulagimizi gostermeye calisiyoruz burada? "Yer yuzunde hic bir pislik yoktur ki; altindan bir yahudi cikmasin" Adolf Hitler... "Turkiye de hicbir pislik yokturki altindan cemaat cikmasin" SniperScope "Nerede yavşak, hırsız varsa hepsi Allahçı" Fazil Say

suraya goz at.. http://stackoverflow.com/questions/5727/what-are-the-barriers-to-understanding-pointers-and-what-can-be-done-to-overcome The advantage of pointers in c are 1. Dynamic memory allocation is possible with pointers. 2. passing arrays and structures to functions. 3. passing addresses to functions. 4. creating data structures such as trees, linked lists etc. kknd tarafından 18/Eki/12 20:02 tarihinde düzenlenmiştir

Hocam şimdi otursam saatlerce açıklarım sana faydalarını. Ama sana şyle syleyeyim ki program içindeki esnetilebilirliği çok şekilde arttırabiliyor pointer denen kavram. Küçük bir iş için tüm veri değil sadece 1 byte lık adres kopyalama işlemiyle yapabiliyorsun. Yani bellekte 1 GB veri de işlem yapmak için 4 byte lık bir veri kullanman yeterli oluyor. Ayrıca verdiğin rnekte int pointer; int i; diyip pointer = i; yapamazsın. Derleyici hata verir. Çok deneme ve alıştırma yapman lazım sonra zaten mantığını kavrarsın. Bu imzayı her grdüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı smürmektir

Abi bir tane swap islemi yapan bir fonksiyon yapmayi dene anliycaksin en basitinden ne ise yaradiklarini prgoramin her yerinden o degiseknin kendisini degistirebiliyorsun Ilk verdigin ornekte int i = 5; int j; int pointer; j=i deyince evet j de 5 oluyor pointer = i deyince pointer 5 olmuyor. Sadece i nin bellekte degerini bulundugu bolumu gosteriyor EGER i degisirse j de i nin degerini gosterdigi icin degisir Fakat j i nin kopyasini aldigi icin yine 5 kalir Bak simdi sana bir ornek yazdim atayim okursan anliyacaksin #include<iostream. h> #include<conio. h> int main Ozgurluk aslinda her istedigini yapabilmek degildir, istemedigini yapmamaktir. // Verdigin degeri gormeyince, gordugun degeri ver!!! // Hayatin herkes icin bir bavulu vardir!!! // Dusmek gerekir bazen hayatta; kalkmayi ogrenebilmek icin

Hocam pointer denilen şey adres tutucudur. Yani değişkenin ram üzerindeki adresini üzerine alır. Pointer kullanmak kolay değildir, takibi zordur vs vs.. Ama belleğe direkt erişim sağladığın için çok fazla performans artışı sağlar. Ayrıca adrese müdahale etme gereksinimi duyulan uygulamalar vardır. Oyundaki hileleri vsleri düşünebilirsin. edit. anlam kargaşası sLeymN tarafından 18/Eki/12 17:27 tarihinde düzenlenmiştir Cehennemin dibine kadar yolum var daha.. || Nasılsa her yalnız kendine sürgündür Asmera unutma.

Hafiz ornek icin tesekkurler. Simdi olayi kavradim gibi. Ama surada bir sorun var ilk basta int j = i; yaptik, daha sonra asagidaki satirda int i = 12; yaptik. Yani int j degeri ilk atadigimiz deger olan 5 te sabit kaliyor ve bellekte misal 5 byte lik bir alani int j icin aciyor. int i = 12; yapinca int i nin degeri degisiyor ama int j halen int i nin eski degerini gosteriyor. pointer ise int i nerede degisirse degissin onun adresini tuttugu icin otomatikman ayni degeri aliyor. Yani pointer aslinda deger falan almiyor sadece int i nin adres bilgisini tutuyor ve bellekte pointer icin extradan yer tahsisi yapilmiyor. Dogrumudur? "Yer yuzunde hic bir pislik yoktur ki; altindan bir yahudi cikmasin" Adolf Hitler... "Turkiye de hicbir pislik yokturki altindan cemaat cikmasin" SniperScope "Nerede yavşak, hırsız varsa hepsi Allahçı" Fazil Say

Sorun verilen rnekte, operatrünün kullanımı gsterilmek istenmiş ama yoksa yle bir amaç için pointer kullanılmaz tabi. C++ da pointer kullanımı tavsiye edilmez ve zorunlu kalmadıkça kullanılmaz ama, hem C programcıları için, hem de senin anlaman açısından genele uzuuunca birşeyler yazdım :) tabi DrKill in dediği gibi tüm kullanıldığı yerleri ve faydalarını anlatsak sayfalar sürer, ama mantığını anlatmaya çalıştım. En nemli kullanım alanı fonksiyonlara parametre olarak nesneyi değil adresini yollamaktır. Mesela bir A nesnesini yarattın, bu A nesnesini fonksiyona direkt yollarsan, A nesnesinin birebir kopyası bellekte yaratılır B nesnesi olarak, fonksiyon bu B nesnesini grür ve üzerinde işlem yapar. Aşağıdaki rnekte fonksiyonun grdüğü nesne kendisine parametre olarak gelen B, fonksiyona yollanan nesne ise A, bunlar aynı nesneler değil birbirinin kopyası. void Fonksiyon Fonksiyon ; Birincisi temel türler dışında hiç bir nesne fonksiyona direkt geçilmemelidir, çünkü gereksiz bellek kopyalaması yapılmaktadır. A nesnesi 10 mb olsaydı, fonksiyon her çağırıldığında 10 mb data kopyalanması gerekecekti. İkincisi, B nesnesi tamamen farklı bir nesne olduğu için , B üzerinde yapılan değişiklikler, A yı etkilemez. Dahası, fonksiyon bittiğinde B nesnesi kullanılmaz hale gelir A ilk haliyle aynı kalır. Diğer şekilde düşünelim, A nesnesini direkt olarak fonksiyona geçmedin ve adresini verdin fonksiyona. Bu durumda, yine bir P nesnesi, fonksiyon içinde yaratılır, ancak bu sefer P sadece 4 bayt (32 bit sistemler için), ve içinde A nesnesinin adresi olan bir pointer. void Fonksiyon Fonksiyon ; Grüldüğü gibi her hangi bir bellek kopyalaması olmadığı gibi, P nesnesi üzerinden A nesnesine her an erişip bu nesneyi okuyup yazabilirsin. İşte operatrü genelde bu durumlarda işe yarıyor. Normalde direkt eriştiğin bir nesneye nesne şeklinde, yapi. eleman şeklinde eriştiğin nesneye yapi->eleman şeklinde erişiyorsun. Tabi bu durumda yaptığın her işlem orijinal nesneyi etkiliyor. Mesela GetSystemInfo fonksiyonu, SYSTEM_INFO adlı bir yapının adresini alır, içini sistemdeki işlemci ile ilgili bazı bilgilerle doldurur, sonra fonksiyon sonlanır. Ancak yapı içindeki bilgilere birşey olmaz çünkü yapı fonksiyonun içinde yaratılmadı, biz sadece ona adresini yolladık. Dizilerde nesneyi direkt yollamak gibi bir şansın zaten yok, dizinin adını yazdığında fonksiyona yine başlangıç adresi gider. C++ da pointer kullanımı zaten tavsiye edilmez ve hata ynetimi exception yntemi ile yapılır, ancak C de exception kavramı olmadığı için, fonksiyonun hata verip vermediği geri dnüş değeri ile kontrol edilir. Bazı durumlarda, dnüş değeri farklı anlamlarda kullanılmak istenir, tüm değerler (- sayilar, 0, + sayilar) normal olarak dnebilir, bu durumda, geri dnüş değerini tutacak nesne, fonksiyona parametre olarak verilebilir. int IslemYap(int p1, int sonuc); Bunlar dışında queue, linkedlist vb veri yapılarında çok sık kullanılır pointer ancak daha kısıtlı bir kullanım alanı. Biraz daha ileri seviyeye geçersek, C dilinin tasarımı tamamen pointer kavramı üzerine kuruludur. C++ da C nin nesne ynelimli versiyonu olduğu için ve mümkün olduğunca C yi kapsadığı için pointerları içerir. Ancak kullanılmasından mümkün olduğunca kaçınılır. Burdan sonrası konuyla direkt ilgili değil ve biraz daha ileri konular Şimdi C'nin tasarımı ve adres kavramı üzerine birşeyler yazayım. C de başlangıçta dizi dışında zelleştirilebilir bir veri yapısı yoktu . Dizilerin ve fonksiyonların isimleri aynı zamanda başlangıç adresleridir, Bu C nin en büyük tasarım zelliğidir. Fonksiyon çağırmak kavramının fonksiyonun adı ile ilgisi yoktur, tamamen operatrleri ile ilgilidir, diziler için de aynı şeyler geçerli, rneklere bakalım. Fonksiyon(p1, p2, p3); şeklinde fonksiyon çağırıldığında, operatrü, ncelikle p1, p2, p3 ü belleğe iteler :), ardından, geri dnüş adresini belleğe push eder ve Fonksiyon isminin belirttiği adres çağırılır . Mesela printf yazarak, fonksiyonun hangi adreste bulunduğunu grebilirsin. Veya daha iyisi, direkt adres ile 0x2070FF(p1, p2, p3); Şeklinde fonksiyon bile çağırabilirsin :) konuyla direkt ilgili olmadığı için pointer cast işlemini yazmadım. Bu durumda şu kodlar çalışır arka planda, push p3push p2push p1call 0x2070FF Grüldüğü gibi işi yapan operatrleri. Aynı şeyi diziler için düşünelim. operatrü, solundaki adresi başlangıç kabul ederek, dizi türünün boyutu içerdeki değer kadar ilerler ve oradan aldığı veriyi dndürür. rnek int dizi ; dizi ; İfadesinde, int türü boyutu 4 bayttır, dizi adresi 0x207010 adresi olsun, operatrü, 0x207010 + (4 3) yani 0x20701C adresine gider, ve ordaki 4 baytlık datayı alır dndürür. 3 içerdeki değer, 4 ise dizi türünün standart boyutu. Yine printf yazarak, dizinin başlangıç adresini grebilirsiniz. Aynı şekilde 0x207010 şeklinde bile kullanabilirsiniz, yani bu operatrler, adres alırlar ve çok esneklerdir, hatta şu iki ifade birbiri ile tamamen aynıdır. dizi ; 4 ; Nedenini anlamayı size bırakıyorum :) Shellcode kavramını duymuş olanlar için syleyim, burda mesela asm ile yazılmış 250 baytlık bir fonksiyonun kodları kopyalanır ve C de bir dizinin içine yapıştırılır. Sonra dizi ismi yani fonksiyon kodunun başlangıç adresi, cast ile fonksiyon gstericisi gibi gsterilerek, o baytların fonksiyon gibi çalıştırılması sağlanır. Bu biraz cevaptan ziyade dkümana benzedi ama birilerine faydası dokunur umarım. dipnot: yukarıda atladığım casting olayını biraz açayım, 0x207010 dediğiniz zaman, bu adresin türünü derleyici bilemez dolayısıyla kodu derleyemez, o yüzden nce o adresin ne tür bir adres olduğunu tanıtmak için cast etmemiz gerek. 0x207010) , biraz daha çirkin grünüyor dimi. Fonksiyon için gereken casting ise şyle ((int 0x2070FF)(p1, p2, p3); fonksiyon gstericilerinin yazımı biraz karmaşıktır, ancak bir kere anlarsanız çok basit yukarıdaki cast şunu sylüyor, bu adreste int fonksiyon prototipli bir fonksiyon var.