Şimdi Ara

pointerlarla alakalı çok önemli

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
18
Cevap
0
Favori
444
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Arkadaşlar yapmaya çalıştığım şey kullanıcı bir sayı girecek , biz bu sayının adresini pointera aktarcaz sonra pointeri 1 arttırarak(ptr++) sayının adresini arttırmış olacağız
    *ptr = sayi; dediğimizde sayi yeni adrese yazılmış olacak sonra yeniden pointeri bir artıracağız böylece adreslere sayıları yazmış olacağız.Adreslere sonra pointerı azaltarak ulaşmaya çalışcağız.
    örneğin : int sayi,*ptr; olsun,

    kullanıcı klavyeden sayı ya 5 değerini girsin: sayi= 5 olur, adreside 1000 olsun.

    ptr=&sayi; dediğimizde ptr de sayının adresini saklamış olacağız yani ptr = 1000 olur.

    sonra ptr yi 1 arttırıyoruz , ptr ++ ; böylece ptr = 1002 oluyor ( ptr int olduğundan 2byte artıyor)

    sonra yeni adrese yani 1002 ye sayının değerini saklıyoruz yani *ptr = sayı; böylece * ptr 1002 yi işaretliyor sayi da 5 oldugundan 1002. adrese 5 kaydedilmiş oluyor.

    sonra scanf ile yeni sayı değeri alıyoruz, 10 olsun. scanf("%d",%sayi) (Bu değer yine 1000 adresine kaydoluyor ancak 5 sayısı 1002 de kaydoldugundan veri kaybı olmuyor)

    ptr arttırıyoruz, ptr++; böylece ptr = 1004 oluyor.

    sonra yeni adese 10 u yazıyoruz . *ptr=sayi; böylece * ptr 1004 yi işaretliyor sayi da 10 oldugundan 1004. adrese 10 kaydedilmiş oluyor.

    şimdi özet geçicek olursak son durumda :

    1000 adresinde 10
    1002 adresinde 5
    1004 adresinde 10

    kaydolmuş oluyor ve ptr de sondurumda 1004 . adresi işaret ediyor.

    o halde ben printf("%d",*ptr); dediğimde bana 10 u göstermeli
    ptr yi 1 azalttıgımda yani ptr--; olduğun da adres 1002 olacağından
    printf("%d",*ptr); dediğimde bana 5 i göstermeli

    ANCAK DERLEYİCİ BİR HATA VERİYOR VE DEDİĞİM OLMUYOR SİZCE NEREDE YANLIŞ DÜŞÜNÜYORUM ???

    İŞTE KODLAR:

    #include <stdio.h>
    #include <conio.h>

    int main(){
    int *ptr,sayi;

    scanf("%d",&sayi);
    ptr=&sayi;
    ptr++;
    *ptr=sayi;
    scanf("%d",&sayi);
    ptr++;
    *ptr=sayi;

    printf("%d/n",*ptr);
    ptr--;
    printf("%d/n",*ptr);

    getch();
    return 0;
    }



    < Bu mesaj bu kişi tarafından değiştirildi hellbas -- 18 Şubat 2015; 23:01:31 >







  • kodunuzu etkilemez ama int 4 byte'tır.

    kodunuza gelince siz kendinize ayırmadığınız sularda yüzmek istiyorsunuz. O adreslerde ne var ne yok bilemezsiniz. belki başka değişkenlerinizi bozacaksınız belki kodu bozacaksınız belki işletim sistemi üzerindeki başka programların çalışmasını etkileyeceksiniz. Ama mantığınız doğrudur.

    Edit: başta sayınızın adresini pointer'a yazmayı unutmuşsunuz



    < Bu mesaj bu kişi tarafından değiştirildi fishkopf -- 18 Şubat 2015; 22:56:34 >
  • fishkopf F kullanıcısına yanıt
    Yorumunuz için teşekkürler anca hala aradığım cevabı bulamadım . Program derlenemiyor bir türlü .
  • quote:

    Orijinalden alıntı: hellbas

    Yorumunuz için teşekkürler anca hala aradığım cevabı bulamadım . Program derlenemiyor bir türlü .

    ben derleyebiliyorum.
  • fishkopf F kullanıcısına yanıt
    hangi programla derliyosunuz bir de programda 2 değer girdikten sonraki ekran çıktısını paylaşırmısınız ?
  • quote:

    Orijinalden alıntı: hellbas

    hangi programla derliyosunuz bir de programda 2 değer girdikten sonraki ekran çıktısını paylaşırmısınız ?

    Program derleniyor dedim sağlıklı çalışıyor demedim. İki sayı girdikten sonra hata veriyor çünkü ikinci sayıyı düzgünce yazamıyor. Yani yazıyor belki ama başka değeri bozuyor. Bunun sebebi de bilinmeyen bölgeye giriş yapmış olmamız. Yeteri kadar boyutlu bir dizi tanımlarsanız ram'de at koşturacak kadar alan ayırmış olursunuz. O zaman örneğiniz üzerinde daha sağlıklı çalışabilirsiniz.



    < Bu mesaj bu kişi tarafından değiştirildi fishkopf -- 18 Şubat 2015; 23:58:20 >
  • fishkopf F kullanıcısına yanıt
    Yapmak istediğim şeyde sınır olmamalı dizi tanımlarsam sınır koymak zorunda kalırım bu yüzden pointer kullanıyorum
  • calloc veya malloc kullanarak neden hafıza açmadığınızı sorabilirmiyim acaba?
  • linuxtayım.

    #include <conio.h>
    ve
    getch();
    satırlarını kaldırınca derleniyor. conio zaten linuxta yok.
    ayrıca hatayı burada sormadan önce derleyiciye sor. sana muhakkak neden derlemediğini söylüyordur.
    tabi derlendikten sonra kod çalışmayacak (segmentation fault verecek) çünkü pointera malloc ile yer ayırmamışsın.
  • quote:

    Orijinalden alıntı: hellbas

    Yapmak istediğim şeyde sınır olmamalı dizi tanımlarsam sınır koymak zorunda kalırım bu yüzden pointer kullanıyorum

    Üzgünüm ama programınızı belli sınırlar dahilinde yazmalısınız. Rezervasyon yaptırmadığınız masada yemek yemek istiyorsunuz üstelik o masa dolu.
  • Üniversite hocam bu soruyu sorduğunda mallocları islememişti o yüzden henüz mallocları bilmiyorum , araştırıp yeniden yazmaya çalışcam teşekkürler
  • Arkadaşlar malloc ve realloc kullanarak yapmaya çalıştım programda 0 girilene kadar sayıları kaydetmesi 0 girilince sayıları ilk kaydedilen sayıdan itibaren yazması ama yine bir yanlışlık var çalışmıyor.

    Açıklama= int *ptr, sayi,sayac=1,i=0,n=5,fo;

    ptr - pointer
    sayi- kaydedilecek olan değer
    sayac - ilk değere ulaşmak için ptr den çıkarılacak sayı
    i - malloc değeri int * 5 yani 20 byte eğer 20 byte aşarsa realloc ile ptr ye yer ayırmak için kullandım. Yani her i=5 de ptr ye daha fazla yer ayıracak
    n - i her 5 oldugunda n de 5 artacak ve realloc a yazılacak böylece sınırsız bir değer girişi olacak (sınırsız derken lafın gelisi bellek ne kadar ise :) )
    fo - for döngüsündeki başlangıç değeri

    İşte Kodlar =

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>

    int main(){
    int *ptr, sayi,sayac=1,i=0,n=5,fo;

    scanf_s("%d", &sayi);
    ptr = &sayi;
    ptr = (int*)malloc(sizeof(int)* 5);
    if (sayi != 0){
    while (sayi != 0){
    ptr++;
    sayac++;
    i++;
    *ptr = sayi;
    if (i == 5){
    i = 0;
    n += 5;
    ptr = (int*)realloc(ptr, sizeof(int)*n);
    }
    ptr = ptr - sayac;
    }
    }
    else{
    printf("Ilk deger 0 olarak girildi.");
    }

    for (fo = 0; fo <= sayac; fo++){
    ptr++;
    printf("%d", *ptr);
    }


    }


    Nerde Hata yaptığımı söylermisiniz ?




  • hellbas H kullanıcısına yanıt
    gözüme ilk çarpan şey ptr++ yaptığınızda ptr değeri 4 artar (int olduğu için) ama sayac++ dediğinizde sayac 1 artar
  • malloc'a falan gerek yok. Sayıları elle gireceksin, en fazla kaç tane girebilirsin ki? 10, 100, 1000? Aşağıdaki kodu incele.

    int sayi, sayilar[1000];
    int *ptr = sayilar;

    scanf("%d", &sayi);
    *ptr = sayi;
    ++ptr;
    ...

    ya da sadece

    scanf("%d", ptr++);
  • fishkopf F kullanıcısına yanıt
    sayac ptr den cıkarmak ıcın yani örneğin sayac 1 olsun ptr=ptr-sayac; dediğimizde 4 byte azalcak yani bir önceki adrese geçecek
  • Kardeşim bende biliyorum kullanıcının 1000 değer girmeyeceğini ancak mesele bu programı yapabilmek.
  • Yazdım ya işte görmüyormusun? malloc yerine dizi kullanacaksın. Bu gibi durumlarda zaten malloc kullanılmaz, hatadır.
  • dizi kullanırsam sınır belirtmek zorunda kalırım
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.