pointer hakkında?

Endorfin35+

Kayıtsız Üye
Katılım
1 Mayıs 2020
Mesajlar
4,200
Pointer konusunu öğrenmeye çalışıyorum ve sanırım değişkenler ile pointerların ilişkisini anlayabildim. Takıldığım konu ise fonksiyonlar ile pointarların ilişkisi...

C:
fonk_a(int *sayi)
{
    *sayi=2021;
}

Şimdi burada ne yaptım. argüman olarak pointer adresi alan bir fonksiyonum var ve fonksiyona gönderdiğim değer bir pointer adresi olmak zorunda. fonksiyon içinde ise ilgili adrese sahip değişkene atama yaptım. Doğrumu?

C:
int f_ekle_1(int s1)
{
  return s1 + 1;
}

int f_ekle_2(int s1)
{
  return s1 + 2;
}

int main(){

   int (*fonksiyon)(int);

  fonksiyon = &f_ekle_1;
  printf("%d \n", fonksiyon(1));

  fonksiyon = f_ekle_2;
  printf("%d \n",(*fonksiyon)(1));

  fonksiyon = f_ekle_1;
  printf("%d \n",(fonksiyon)(5));

  return 0;
}

peki burada ne yaptım ?

int (*fonksiyon)(int);

ifadesi ile tek parametre alan bir fonksiyon pointerı tanımladım(böyle mi denir bilmiyorum). sonra,

fonksiyon = &f_ekle_1;

ifadesi ile bu pointer a f_ekle_1 fonksiyonunun adresini atadım. ve sonrasında

fonksiyon(1);

ifadesi ile fonksiyona 1 göndererek fonksiyonu çağırdım.

Kafamı karıştıran konular;

1. int (*fonksiyon)(int); bu tanımlama daha farklı karşıma çıkar mı? bu ifade (parantezler vs.) standart mıdır?

2. Yukarıdaki kodda 3 defa fonksiyon çağırıyorum. her çağırma biçiminde yazım farklı ve hepsi de çalışıyor. hangi kullanım daha doğrudur?

Şimdi tekrar düşünüyorum.

fonksiyon için pointer ım var. pointerları *ile tanımlıyorduk öyle ise,

int (*fonksiyon)(int); bu ifade aklıma yatıyor. fonksiyonumun nerde olduğunu gösterir adres.

&ile adres bilgisini alıyorduk. öyle ise,

fonksiyon = &f_ekle_1; buda aklıma yattı. pointera fonksiyonun adresini atadık, sonra elimizde adres var adres çağırmalıyız... öyle ise,

fonksiyon(1); şeklinde kullanım mantıklı...

diğer kullanımlar nedir o zaman. Kafa karıştırıcı... :cheeky2: :(
 
& operatörü ile ilgili olarak şöyle bir kural mı geçerli;

int dizi[] = {11, 22, 333, 4, 505, 69696};
int *ptr = dizi; // &dizi[0];

değişken yada fonksiyon tek bir değere sahip değil ise adres ataması için "&" kullanılmayabilir...?
 
Şimdide bellek olayı kafamı karıştırdı. Çok ileri gitmeden basitçe ifade edersem;

Bir program yazdım. Program çalıştı ve kapandı. Program verileri bellekte yer tutmaya devammı ediyor?
 
Şimdide bellek olayı kafamı karıştırdı. Çok ileri gitmeden basitçe ifade edersem;

Bir program yazdım. Program çalıştı ve kapandı. Program verileri bellekte yer tutmaya devammı ediyor?
Program kapandıktan sonra bellekte yer tutmaması lazım. Ama ben kesin bilmiyorum tabi. Sadece mantıken olması gereken o.
Düşünsene grafikersin, çok büyük verilerle photoshopta çizim yaptın, Sonra işin bitti kapadın photoshop'u. İnternette sörf yapacaksın ama makine hala kasılıyor.
 
İşletim sistemleri programlar kapandıktan sonra programın bütün kaynaklarını (bellek, soket, dosya, vs.) serbest bırakır.

Kaynak yönetiminin en tembelce yolu kaynakları hiç serbest bırakmamak, iş bitince programı kapatmaktır :)
 
Bir kaynakta yıkıcı fonksiyon altında program kapanınca yer tutmaya devam eder yazıyor. Bu kafamı karıştırdı..
 
Son düzenleme:
Orada anlatılanlar farklı. İşletim sistemi yazılan sınıfa da, derleyiciye de güvenmez. Kendi temizler.
 
Normal değişkenler için pointer ile pointer adresi farklı şeyler. Pointer, hafızadaki bir adresi saklayan bir değişken. Pointer'in adresi ise hafızadaki bir adresi saklayan bir değişkenin kendi adresi :)

Dizilerde ise dizinin adı ile dizinin adresi aynı şeyi temsil ediyor. Aşağıdaki programı derleyelim:

C:
#include <stdio.h>

static int dizi[10] = {1, 2, 3};

typedef int (*funcp)(int);

funcp a;

int somefunc(int a)
{
   return 0;
}

int main()
{
   printf(" dizi = %p\n", dizi);
   printf("&dizi = %p\n", &dizi);

   a = somefunc;
   printf(" a = %p\n", a);

   a = somefunc;
   printf("&a = %p\n", &a);
}

Aldığımız sonuç şu:

Bash:
[ta@bonsai ~]$ gcc -Wall -Werror a.c
[ta@bonsai ~]$ ./a.out
 dizi = 0x55846ced5040
&dizi = 0x55846ced5040
 a = 0x55846ced2135
&a = 0x55846ced5070
[ta@bonsai ~]$
 
Değil, program çıktısından da görünüyor bu.
 
Ama sen ikinci (son) çıktıda fonksiyon pointerinin kendi adresini atamışşın :cheeky2:

Dur ben bunu bir deneyim kafam karıştı.
 
C:
#include <stdio.h>

typedef int (*funcp)(int);

funcp a;

int somefunc(int a)
{
   return 0;
}

int main()
{
   a = somefunc;
   printf(" a = %x\n", a);

   a = &somefunc;
   printf(" a = %x\n", a);

}

çıktısı ;

Kod:
 a = 401550
 a = 401550

aynı sonucu veriyor. demekki hem dizilerde hemde fonksiyonlarda & kullanılmasa da oluyormu? sormak istediğim buydu. Aşağı yukarı anladım konuyu.
 
Burada da fonksiyonu çağırırken 3 farklı yazım var ama hepsi çalışıyor hangi yazım türü daha doğru/yaygın?
C:
#include <stdio.h>

typedef int (*funcp)(int);

funcp a;

int somefunc(int a)
{
   return a+5;
}

int main()
{
   a = somefunc;
   printf(" a = %d\n", a(5));

   a = somefunc;
   printf(" a = %d\n", (a)(5));

   a = somefunc;
   printf(" a = %d\n", (*a)(5));
}

çıktı;
Kod:
 a = 10
 a = 10
 a = 10
 
C:
#include <stdio.h>

int main()
{
    int a=5;
    int *p1,*p2;
    p1=&a;
    p2=&p1;
    printf("%p \n",p1);
    printf("%p \n",p2);
}


iki adet pointer var. ikinci pointerda birinci pointerın adresini tutumak istiyorum ama hata alıyorum. Nerede yanlış yapıyorum?

1622297453073.png
 
C:
#include <stdio.h>

int main()
{
    int a=5;
    int *p1,*p2;
    p1=&a;
    p2=&p1;
    printf("%p \n",p1);
    printf("%p \n",p2);
}


iki adet pointer var. ikinci pointerda birinci pointerın adresini tutumak istiyorum ama hata alıyorum. Nerede yanlış yapıyorum?

10794 eklentisine bak
a değişkenini p2 ye aktarsan olmaz mı?
 
Şu & işareti ne anlama geliyor bilmiyorum ama hata kodundan anladığım,
P1 =&a yapınca int * oluyor.
P2 =&P1 yapınca aslında P2 =&&5 oluyor. Buda sanki int ** olarak tanımlanıyor.
(en mantıklı böyle atabildim, kod ile alakam yok :D )
 
Gökhan gel senide bulaştıralım bu C işine... iki acemi takılırız. :)

& işareti a nın saklandığı adresi veriyor. bu adresi p1 de saklıyoruz. p1 de de bir şey sakladığımız için p1 de ayrıca kendi adresi var. bu p1 in adresini p2 de saklamak istiyorum o zaman p2 = &p1 (p1 in adresini ver bana..) dediğimde hata veriyor.

Bu olayı @taydin aydınlatır...
 

Forum istatistikleri

Konular
5,841
Mesajlar
99,635
Üyeler
2,480
Son üye
mozcelikors

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top