Arama butonu
Bu konudaki kullanıcılar: 1 misafir
7
Cevap
1048
Tıklama
0
Öne Çıkarma
KONU Silinebilir
C
12 yıl
Yüzbaşı
Konu Sahibi

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------





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

D
12 yıl
Yüzbaşı

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ı?



G
12 yıl
Yarbay

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.


Bu mesaja 1 cevap geldi.
M
12 yıl
Yarbay

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ı


Bu mesaja 1 cevap geldi.
G
12 yıl
Yarbay

Aynen.



M
12 yıl
Yarbay

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.



M
12 yıl
Yarbay

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.



S
12 yıl
Yarbay

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.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.