C pointer mantığı

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.

 
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.
 

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


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.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…