Şimdi Ara

C - Pointer & Array & Fonksiyon

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
7
Cevap
0
Favori
1.024
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhabalar,
    http://www.tutorialspoint.com/cprogramming/c_pointer_to_an_array.htm
    adresindeki örneği kendimce değiştirmek istedim ve şöyle bir kod yazdım;
    #include <stdio.h> 

    double* getP(double arr[], int sz)
    {
    double *p;
    int i;
    for(i = 0; i < sz; i++)
    {
    *(p + i) = arr[i];
    }
    return p;
    }
    int main ()
    {
    double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
    double *p;
    int i;

    for ( i = 0; i < 5; i++ )
    {
    //printf("*(balance + %d) : %f\n", i, *(balance + i) );
    }

    double *p2 = getP(balance, 5);
    for ( i = 0; i < 5; i++ )
    {
    printf("*(p2 + %d) : %lf\n", i, *(p2 + i) );
    }

    return 0;
    }

    getP fonksiyonunun amacı şu: Parametreye girilen arrayi pointera eleman eleman çevirip geri döndürüyor.
    Ama bu kod şu haliyle çalışmıyor, yorum satırının da çalışır koda eklenmesi lazım. Ama neden? printf'e gönderilen 2. değer *(balance + i) bir işlem mi yapıyor? Cevaplarınız için teşekkür ederim, iyi forumlar.







  • getP fonksiyonunda bir allocation yok ama sen yine de sana ait olmayan bir adresin üzerinde işlem yapmaya calisiyorsun

    Buradaki davranisin bi tanımı yok tamamen rastgele sonuç aliyorsun

    < Bu ileti mini sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: Fatih513

    getP fonksiyonunda bir allocation yok ama sen yine de sana ait olmayan bir adresin üzerinde işlem yapmaya calisiyorsun

    Buradaki davranisin bi tanımı yok tamamen rastgele sonuç aliyorsun

    getP'ye arr, pointer olarak gelmiyor mu?

    yorum işaretçilerini kaldırdığımda tam net sonuç alıyorum, ve her seferinde aynısını alıyorum o nasıl rastgele denk gelebilir ki?

    Hatta bu da getP2;
    double* getP2(double *arr, int sz) 
    {
    double *p;
    int i;
    for(i = 0; i < sz; i++)
    {
    *(p + i) = arr[i];
    }
    return p;
    }


    main fonksiyonum için de tanımladığım herhangi bir arrayi, getp ve getp2 ile bir pointera attığımda *(p + i) olarak print ettiğimde array ile tamamen aynı sonuçları alıyorum.

    Aslında sorunumun tam yerini yazarsam belki neyi yanlış yaptığım daha net anlaşılır;

    int* arrayTrial(int *retSz) 
    {
    int n = 10;
    *retSz = 10;
    int myArray[n];
    int i;
    for(i = 0; i < n; i++)
    {
    myArray[i] = i + 1;
    }
    return myArray;
    }


    Şöyle bir fonksiyon yazdım, ve mainde şu şekilde kullanıyorum;
    int sz;
    int* ptr = arrayTrial(&sz);
    Ve şu şekilde yazdırmaya çalışıyorum;
    int i;
    for(i = 0; i < sz; i++)
    {
    printf("%d \n", *(ptr + 1));
    }

    Alt alta 10 tane 0 basıyor ama neden olduğunu anlayamadım?
    Fonksiyonda oluşturduğum array, fonksiyon bitince hafızadan falan mı siliniyor ve dolayısıyla adressinde birşey bulamıyorum?



    < Bu mesaj bu kişi tarafından değiştirildi welrocken -- 5 Aralık 2014; 14:27:37 >




  • quote:

    Orijinalden alıntı: seyfi84

    hiç adam gibi kitap alıp okumayacaksınız, de mi? azimle yapan betonu deler hesabı, onu dene, bunu dene, belki tesadüfen biri tutar, sonra kara kaplıya not al, hani fıkrası var ya: "bacakları koparılan örümcek sağır olur".



    D&R'a gelse alıcam kitabını (Deitel&Deitel), şuanda adam akıllı ayıracak vaktim yok C'ye, sadece birşeyi merak etmiştim deneyerek belki öğrenirim mantığıyla giriştim, ne kadar saçma olduğu umrumda değil deneme yanılma yönteminin, denerken geçirdiğim zamanı da kayıp olarak görmüyorum.
    Edit:
    Ödev falan sandınız sanırım, ödev değil, bırakın ödev olmasını okulda C öğrenmiyoruz bile, tek python var. Kişisel merak yani not falan almıycam bundan.



    < Bu mesaj bu kişi tarafından değiştirildi welrocken -- 5 Aralık 2014; 14:32:39 >
  • void arrayTrial(int *arr, int sz, int *retSz, int *retArr) 
    {
    int n = sz;
    *retSz = n;
    int i;
    for(i = 0; i < n; i++)
    {
    retArr[i] = *(arr + i);
    }
    }


    Yukarıdaki fonksiyonu şu şekilde kullanınca;
    int sz = 5; 
    int arr1[sz];
    arr1[0] = 10;
    arr1[1] = 20;
    arr1[2] = 35;
    arr1[3] = 40;
    arr1[4] = 50;
    int arr[sz];
    arrayTrial(arr1, sz, &sz, arr);

    Doğru sonuç alabiliyorum, yanlış olan bir kısmı var mı?
  • baya bir hatan var gördüğüm kadarıyla:

    göstericiyi bir adresi işeret etmeden(eşitlemedn) o göstericinin gösterdiği rastegele bir bellek adresinden başlayarak o bellek adreslerine değer atamaya çalışmışssın yani sana ait olmayan yerleri değiştirmişsin.
    diziye sabit olmayan bir değişkenle uzunluğunu vermeye çalışmıssın
    // ya böyle yapacaksın
    int dizi[10];

    // ya da böyle
    #define BOYUT 10
    // . . .
    int dizi[BOYUT];

    yada senin yaptığın tarzda istiyorsan heap bellekte bir alan alman gerek.

    Ayrıca var olan konuları öğren varolmayanları(ilaki vardır ama) deneyerek öğrenmeye çalış(daha zevkli olur)

    < Bu ileti mini sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: lavara123

    baya bir hatan var gördüğüm kadarıyla:

    göstericiyi bir adresi işeret etmeden(eşitlemedn) o göstericinin gösterdiği rastegele bir bellek adresinden başlayarak o bellek adreslerine değer atamaya çalışmışssın yani sana ait olmayan yerleri değiştirmişsin.
    diziye sabit olmayan bir değişkenle uzunluğunu vermeye çalışmıssın
    // ya böyle yapacaksın
    int dizi[10];

    // ya da böyle
    #define BOYUT 10
    // . . .
    int dizi[BOYUT];

    yada senin yaptığın tarzda istiyorsan heap bellekte bir alan alman gerek.

    Ayrıca var olan konuları öğren varolmayanları(ilaki vardır ama) deneyerek öğrenmeye çalış(daha zevkli olur)

    Ben en iyisi Pdf'den deitel yardırayım, varolan konulardan kastınız internette orda burda anlatımı bulunan konular mı? Pointerla ilgili o tarz 5-10 tane kısa tutorial'a bakmışımdır şimdiye kadar, hala gördüğünüz üzere eksikler var. Umarım deitel'de daha temiz bir anlatım bulabilirim. İyi forumlar, teşekkürler.




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.