Şimdi Ara

KONU Silinebilir

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
8
Cevap
0
Favori
1.089
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



    < Bu mesaj bu kişi tarafından değiştirildi ceminec -- 7 Ocak 2018; 14:32:15 >



  • 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.




  • quote:

    Orijinalden alıntı: elektro_gadget

    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ı




  • Aynen.
  • Değişkenler için

    Java -> final
    C/C++ -> const

    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.
  • quote:

    Orijinalden alıntı: ceminec

    fonksiyonlarda mesela :
    void kabarcikSirala(int *,const int) dediğinde ne anlamam gerekıyor ?

    Integer tipinden alınan ikinci parametrenin, fonksiyon içerisinde kesinlikle değişmeyeceğini, aynı kalacağını belirtmekte.

    void kabarcikSirala(int *a,const int b)
    {
    //fonksiyon içeriği
    }

    olarak düşünürsen, fonksiyon içerisinde

    b = 1;
    b = x;

    gibi yapacağın işlemler hatadır. Derleyici programın bu şekilde derlenmesine izin vermez.
  • quote:

    Orijinalden alıntı: ceminec

    fonksiyonlarda mesela :
    void kabarcikSirala(int *,const int) dediğinde ne anlamam gerekıyor ?

    int *: sıralanacak verilerin saklandığı dizinin ilk elemanının adresi,
    const int: dizinin boyutu

    şeklinde olduğunu tahmin ediyorum.elbette fonksiyonun devamını görmeden kesin birşey söyleyemeyiz.

    pointer mantığının tam oturması için mutlaka assembly ve cpu çalışması hakkında bilgi gerekir.referans,adres gibi basit tanımlarla havada kalır.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.