C pointer mantığı

  • Konuyu başlatan soon
  • Başlangıç Tarihi
  • Mesaj 5
  • Görüntüleme 1.578

soon

Hectopat
Katılım
16 Şubat 2021
Mesajlar
581
Çözümler
3
Merhabalar, iyi forumlar.

Pointerlar ile ilgili bir şey kafamı karıştırdı, pointerlar adres bilgisi tutuyor burada sorun yok ama bir pointeri dizi olarak tanımlayıp içini adres bilgisi vermeden direkt değerler ile dolduramıyoruz (öyle biliyorum) adres bilgisi vermemiz gerekiyor. Fakat bir pointer oluşturup, malloc ya da calloc fonksiyonlarıyla bellekten onun için yer alıp içini adres vermeden direkt değerler ile doldurabiliyoruz, sonuçta bir dizi değil mi? Nasıl oluyor bu? Açıklayamadım sanırım, görsel bırakıyorum. Kodda tanımlanan pointer için bellekten yer alıp dizi haline getiriyor ve ptr[0] ve ptr[1] in içine adres bilgisi vermeden direkt değer atanıyor nasıl olabiliyor anlamadım.

Adsız.jpg
 
ptr malloc'un bellekten ayırdığı 40*4 Byte'lık alanın ilk elemanının adresini tutuyor.

Array dediğimiz şey zaten ilk elemanın adresidir.

Kod üzerinden daha iyi anlaşılıyor.
C:
#include <stdio.h>

int main()
{
  int arr[10];
  printf("arr adr %p\n", &arr);
  printf("arr[0] adr %p\n", &arr[0]);
  return 0;
}

arr adr 0x7ffee2ef76e0 arr[0] adr 0x7ffee2ef76e0
 
Son düzenleme:
Şöyle söyleyeyim; malloc() fonksiyonu, sizin belirlediğiniz boyutta olacak şekilde belleğin heap kısmında yer açıyor. Bu heap kısmı ise düzensiz bir bellek, stack gibi üst üste olmadığından dolayı ve adres sadece işletim sistemi ve o pointer tarafından ulaşılabilinir.

Farklı bir adresteki veriye yazıp/silmek amacıyla tanımlanır pointer'lar. Eğer farklı adres ile işiniz yoksa stack kullanabilirsiniz. Umarım anlatabilmişimdir.
 
Ptr Malloc'un bellekten ayırdığı 40*4 Byte'lık alanın ilk elemanının adresini tutuyor.

Array dediğimiz şey zaten ilk elemanın adresidir.

Kod üzerinden daha iyi anlaşılıyor.
C:
#include <stdio.h>

int main()
{
int arr[10];
printf("arr adr %p\n", &arr);
printf("arr[0] adr %p\n", &arr[0]);
return 0;
}

arr adr 0x7ffee2ef76e0. arr[0] adr 0x7ffee2ef76e0.

Yani diziler ve pointerlar aynı şeyi yapıyor, ikisi de ilk bloğun adresini tutuyor. Anladığım kadarıyla diziler statik, pointerlar dinamik olmuş oluyor bu durumda? Yani pointerları kullanmak daha avantajlı.

Şöyle söyleyeyim; malloc() fonksiyonu, sizin belirlediğiniz boyutta olacak şekilde belleğin heap kısmında yer açıyor. Bu heap kısmı ise düzensiz bir bellek, stack gibi üst üste olmadığından dolayı ve adres sadece işletim sistemi ve o pointer tarafından ulaşılabilinir.

Farklı bir adresteki veriye yazıp/silmek amacıyla tanımlanır Pointer'lar. Eğer farklı adres ile işiniz yoksa stack kullanabilirsiniz. Umarım anlatabilmişimdir.

Hocam pointerlar stack de bulunuyor ve heap de ayrılan alanın adresini tutuyor. Doğru mu anladım?
 
Son düzenleme:
Yani diziler ve pointerlar aynı şeyi yapıyor, ikisi de ilk bloğun adresini tutuyor. Anladığım kadarıyla diziler statik, pointerlar dinamik olmuş oluyor bu durumda? Yani pointerları kullanmak daha avantajlı.
Evet, pointer'a tahsis edilen alanı realloc() ile büyütebilirsiniz. C++'taki std::vector yapısı da böyle çalışır.
Hocam pointerlar stack de bulunuyor ve heap de ayrılan alanın adresini tutuyor. Doğru mu anladım?
Aynen öyle.
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı