Pointer konusu çok geniş bir konu. Neresini anlamadığını daha net belirtirsen yardımcı olmaya çalışanların sayısı artar gibime geliyor. Mantığını mı anlamadın, syntaxını mı? Yoksa neden kullanıldıklarını ne olduklarını mı?
Java daki standart yapılan işler için c de pointer gerekir.
Mesela javada dinamik olarak nesne oluşturup bunu referansa atarsın. Yani o referans nesneyi işaret eder (pointer). class A { ... } A obj = new A(); // A -> pointer
C de ise; struct A { ... } struct A* obj = (A *) malloc(sizeof(A));
Javada nesneler metodlara referansa göre aktarılır. C' de bunu yapabilmek için yine pointer lara ihtiyaç var. Eğer düz şekilde aktarırsak;
struct A obj; func(obj);
Nesne biti bitine parametreye kopyalanır. Nesne büyükse işlem uzun sürer. Bu yüzden kütüphanedeki fonksiyonlar nesnelerin kendilerini değil adreslerini alırlar (pointer ile).
Yanlız c/c++ taki pointerlar java dakine göre çok daha esnek ama hataya açıktır. C de bir pointerı arttırıp bir sonraki nesneyi göstermesini sağlayabilirsin mesela. Ama c sınır kontrolü yapmaz (bilerek yapmaz). Senin olmayan bir bölgeye ulaşmaya çalışırsan çalışma sırasında program çakılır.
Bir fonksiyon içinde yerel olarak oluşturulan nesneler fonksiyon sonlanınca yok olur. Derleyici bunlar için bellek ayırmaz. Fakat yukarıdakiler gibi pointer ile dinamik olarak alırsan bellekte ayrı olarak tutulur. Fonksiyon bitince sonlanmaz. Yani geçici olmayan nesneler için pointer kullanmak gerekir.
Ha birde çok önemli birşey daha. Java, c# gibi dillerde pointer ile aldığın bölgeyi sonra unutabilirsin. Temizliği çöp toplayıcı yapar. C' de temizlik sana aittir, unutursan program bitene kadar belleği işgal eder. Fakat bu özellik aynı zamanda belleği etkin şekilde kullanmamıza izin verir. Çöpün ne zaman toplanacağını kendimiz belirleriz. Kritik anlarda program sekteye uğramaz.
Java daki standart yapılan işler için c de pointer gerekir.
Mesela javada dinamik olarak nesne oluşturup bunu referansa atarsın. Yani o referans nesneyi işaret eder (pointer). class A { ... } A obj = new A(); // A -> pointer
C de ise; struct A { ... } struct A* obj = (A *) malloc(sizeof(A));
Javada nesneler metodlara referansa göre aktarılır. C' de bunu yapabilmek için yine pointer lara ihtiyaç var. Eğer düz şekilde aktarırsak;
struct A obj; func(obj);
Nesne biti bitine parametreye kopyalanır. Nesne büyükse işlem uzun sürer. Bu yüzden kütüphanedeki fonksiyonlar nesnelerin kendilerini değil adreslerini alırlar (pointer ile).
Yanlız c/c++ taki pointerlar java dakine göre çok daha esnek ama hataya açıktır. C de bir pointerı arttırıp bir sonraki nesneyi göstermesini sağlayabilirsin mesela. Ama c sınır kontrolü yapmaz (bilerek yapmaz). Senin olmayan bir bölgeye ulaşmaya çalışırsan çalışma sırasında program çakılır.
Bir fonksiyon içinde yerel olarak oluşturulan nesneler fonksiyon sonlanınca yok olur. Derleyici bunlar için bellek ayırmaz. Fakat yukarıdakiler gibi pointer ile dinamik olarak alırsan bellekte ayrı olarak tutulur. Fonksiyon bitince sonlanmaz. Yani geçici olmayan nesneler için pointer kullanmak gerekir.
Ha birde çok önemli birşey daha. Java, c# gibi dillerde pointer ile aldığın bölgeyi sonra unutabilirsin. Temizliği çöp toplayıcı yapar. C' de temizlik sana aittir, unutursan program bitene kadar belleği işgal eder. Fakat bu özellik aynı zamanda belleği etkin şekilde kullanmamıza izin verir. Çöpün ne zaman toplanacağını kendimiz belirleriz. Kritik anlarda program sekteye uğramaz.
Ufak bir hatayı düzelteyim,
A obj = new A(); // A -> pointer
A değil obj pointer Hızlı hızlı yazarken klavyenden kaçmış olmalı
Pointerlar konusunda işler biraz karışıyo, const'u nereye yazdığınıza göre farklı kısıtlamalar geliyor. Onları böyle gece saatinde değilde kafamın daha düzgün çalıştığı bir saatte anlatayım başka bir arkadaş anlatmamış olursa
Bir de fonksiyonlarda kullanımı var bunların dışında.
< Bu mesaj bu kişi tarafından değiştirildi ceminec -- 7 Ocak 2018; 14:32:15 >