pointer hakkında?

Endorfin35+

Kayıtsız Üye
Katılım
1 Mayıs 2020
Mesajlar
4,236
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...
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,141
Mesajlar
104,842
Üyeler
2,553
Son üye
trojann

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top