folder Tahribat.com Forumları
linefolder C - C++
linefolder C De Küçük Bir Programcık Daha



C De Küçük Bir Programcık Daha

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    frt
    frt's avatar
    Kayıt Tarihi: 19/Nisan/2008
    Erkek

    Tugberk bunu yazdı:
    -----------------------------

    Derleyicide sorun olduğunu sanmam. söylenenlerden birini yapmamışsındır. bende sıkıntısız çalıştı.

    #include
    
    void derece (int (*)[4]);
    
    int main( void )
    {
        int tablo[4][4] = { {4, 3, 2, 1},
                            {1, 2, 3, 4},
                            {5, 6, 7, 8},
                            {2, 5, 7, 9}};
    
        derece(tablo);
        return 0;
    }
    
    void derece (int (*x)[4])
    {
        int i,y;
    
        for(i=0;i=0;y--)
            {
                printf("%d\t",x[y][i]);
            }
            printf("\n");
        }
    }
    


    -----------------------------

    haklıymışın hocam atlamışım bi yeri yalnız bu  (*x) ne alaka anlayamadım 

    hocam bi de bazen dizileri const dizi [] şeklinde tanımlıyolar bu const un görevi nedir ne işe yarar örenemedim bi türlü 


    son bitlisli
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tugberk
    Tugberk's avatar
    Kayıt Tarihi: 04/Ekim/2009
    Erkek

    frt bunu yazdı:
    -----------------------------

    haklıymışın hocam atlamışım bi yeri yalnız bu  (*x) ne alaka anlayamadım 

    hocam bi de bazen dizileri const dizi [] şeklinde tanımlıyolar bu const un görevi nedir ne işe yarar örenemedim bi türlü 


    -----------------------------

    O dizinin türünü belirtir. Mesela int a; nın türü int dir. int *a nın türü int* dir. int a[4][4] ün türü de int (*)[4] dir. Fonksiyonların türleride vardır, mesela int topla(int,int) in türü int (*)(int,int) dir. Başlangıç seviyesinde iki boyutlu dizilerin, fonksiyonların vs türlerine takılmasan daha iyi. 

    const char dizi[10] dediğin zaman oradaki const dizinin read only olduğunu belirtiyor. Yani türü tanımlarken ilklersin ve birdaha o dizi değiştirilemez (normal yollarla). 

    Göstericilerde iki çeşit kullanımı var. const char *ptr; dersen ptr nin gösterdiği adres read only dir. Mesela *ptr = 55; diyemezsin. char* const ptr; dersen, göstericinin kendisi readonly olur, ptr = & degisken; gibi bir adres ataması yapılamaz, sadece ilk atandığı adres için kullanılabilir.

    Daha çok fonksiyon parametresi geçerken kullanışlıdır, fonksiyonun o diziyi değiştirmeyeceğini sadece okuma yapılacağını belirtir. Örneğin printf gibi fonksiyonlar, zorunlu olmasa bile, char *string; değil const char *string şeklinde parametre kullanır. printf in verilen stringi değiştirmeyeceğini sadece prototipine bakarak anlayabiliriz.

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    frt
    frt's avatar
    Kayıt Tarihi: 19/Nisan/2008
    Erkek

    Tugberk bunu yazdı:
    -----------------------------

    frt bunu yazdı:
    -----------------------------

    haklıymışın hocam atlamışım bi yeri yalnız bu  (*x) ne alaka anlayamadım 

    hocam bi de bazen dizileri const dizi [] şeklinde tanımlıyolar bu const un görevi nedir ne işe yarar örenemedim bi türlü 


    -----------------------------

    O dizinin türünü belirtir. Mesela int a; nın türü int dir. int *a nın türü int* dir. int a[4][4] ün türü de int (*)[4] dir. Fonksiyonların türleride vardır, mesela int topla(int,int) in türü int (*)(int,int) dir. Başlangıç seviyesinde iki boyutlu dizilerin, fonksiyonların vs türlerine takılmasan daha iyi. 

    const char dizi[10] dediğin zaman oradaki const dizinin read only olduğunu belirtiyor. Yani türü tanımlarken ilklersin ve birdaha o dizi değiştirilemez (normal yollarla). 

    Göstericilerde iki çeşit kullanımı var. const char *ptr; dersen ptr nin gösterdiği adres read only dir. Mesela *ptr = 55; diyemezsin. char* const ptr; dersen, göstericinin kendisi readonly olur, ptr = & degisken; gibi bir adres ataması yapılamaz, sadece ilk atandığı adres için kullanılabilir.

    Daha çok fonksiyon parametresi geçerken kullanışlıdır, fonksiyonun o diziyi değiştirmeyeceğini sadece okuma yapılacağını belirtir. Örneğin printf gibi fonksiyonlar, zorunlu olmasa bile, char *string; değil const char *string şeklinde parametre kullanır. printf in verilen stringi değiştirmeyeceğini sadece prototipine bakarak anlayabiliriz.


    -----------------------------

    hocam mesela biz main içindeki bi diziyi fonksiyona argüman olaraka yolladımızda fonksiyonda dizi üzerinde yaptımız değişiklikler main fonksiyonu içindeki diziyide etkiler const olarak tanımladığımızda diziyi bu etkileşim ortadan kalkıyo doru anlamışım dime hocam yarın C den sınavım var ondan soruyom bu kadar yardımlarınız için çok teşekkür ederim hocam herkese


    son bitlisli
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tugberk
    Tugberk's avatar
    Kayıt Tarihi: 04/Ekim/2009
    Erkek

    frt bunu yazdı:
    -----------------------------

    Tugberk bunu yazdı:
    -----------------------------

    frt bunu yazdı:
    -----------------------------

    haklıymışın hocam atlamışım bi yeri yalnız bu  (*x) ne alaka anlayamadım 

    hocam bi de bazen dizileri const dizi [] şeklinde tanımlıyolar bu const un görevi nedir ne işe yarar örenemedim bi türlü 


    -----------------------------

    O dizinin türünü belirtir. Mesela int a; nın türü int dir. int *a nın türü int* dir. int a[4][4] ün türü de int (*)[4] dir. Fonksiyonların türleride vardır, mesela int topla(int,int) in türü int (*)(int,int) dir. Başlangıç seviyesinde iki boyutlu dizilerin, fonksiyonların vs türlerine takılmasan daha iyi. 

    const char dizi[10] dediğin zaman oradaki const dizinin read only olduğunu belirtiyor. Yani türü tanımlarken ilklersin ve birdaha o dizi değiştirilemez (normal yollarla). 

    Göstericilerde iki çeşit kullanımı var. const char *ptr; dersen ptr nin gösterdiği adres read only dir. Mesela *ptr = 55; diyemezsin. char* const ptr; dersen, göstericinin kendisi readonly olur, ptr = & degisken; gibi bir adres ataması yapılamaz, sadece ilk atandığı adres için kullanılabilir.

    Daha çok fonksiyon parametresi geçerken kullanışlıdır, fonksiyonun o diziyi değiştirmeyeceğini sadece okuma yapılacağını belirtir. Örneğin printf gibi fonksiyonlar, zorunlu olmasa bile, char *string; değil const char *string şeklinde parametre kullanır. printf in verilen stringi değiştirmeyeceğini sadece prototipine bakarak anlayabiliriz.


    -----------------------------

    hocam mesela biz main içindeki bi diziyi fonksiyona argüman olaraka yolladımızda fonksiyonda dizi üzerinde yaptımız değişiklikler main fonksiyonu içindeki diziyide etkiler const olarak tanımladığımızda diziyi bu etkileşim ortadan kalkıyo doru anlamışım dime hocam yarın C den sınavım var ondan soruyom bu kadar yardımlarınız için çok teşekkür ederim hocam herkese


    -----------------------------

    Tam olarak öyle denemez. Yukarıda normal yollarla derken, bir özel durumu belirttim, eğer const diziye dizinin kendi adı üzerinden değil de başka bir gösterici üzerinden (adresi yoluyla) erişirsen, o zaman içeriğini değiştirebilirsin.

    const sadece o dizi adını kullanarak o adrese atama yapamayacağını garantiler. Sen aynı adrese const olmayan bir gösterici yoluyla da erişebilirdin. Sen main içinde bir nesne yaratır ve bunun adresini fonksiyona verirsen, aslında direkt o diziyi vermiş olmazsın. Sadece adresini vermiş olursun, tabi o adres üzerinde yapılan işlemler dizinin kendisini de etkileyecektir, ancak tekrarlıyorum, fonksiyona giden dizinin kendisi değildir. Tamamen farklı bir değişken (pointer) dir. 

    Örneğin, main içinde bir const char dizi[] oluşturdun, ancak yolladığın fonksiyon char dizi[] şeklinde parametre alıyor. O halde fonksiyon içinde, dizi rahatlıkla değiştirilebilir.

    Ancak eğer, fonksiyon parametresi de const char dizi[] şeklinde olsaydı, main içindeki dizi ile fonksiyon parametresi aynı adresi gösteren farklı nesneler olduğu halde, yine de dizi fonksiyon içinde değiştirilemezdi. Çünkü fonksiyon parametresi de const. Özetle fonksiyon senin main içindeki nesnenin const olup olmamasını tanımaz, kendi prototipinde ne yazıyorsa onu tanır.

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    frt
    frt's avatar
    Kayıt Tarihi: 19/Nisan/2008
    Erkek

    Tugberk bunu yazdı:
    -----------------------------

    frt bunu yazdı:
    -----------------------------

    Tugberk bunu yazdı:
    -----------------------------

    frt bunu yazdı:
    -----------------------------

    haklıymışın hocam atlamışım bi yeri yalnız bu  (*x) ne alaka anlayamadım 

    hocam bi de bazen dizileri const dizi [] şeklinde tanımlıyolar bu const un görevi nedir ne işe yarar örenemedim bi türlü 


    -----------------------------

    O dizinin türünü belirtir. Mesela int a; nın türü int dir. int *a nın türü int* dir. int a[4][4] ün türü de int (*)[4] dir. Fonksiyonların türleride vardır, mesela int topla(int,int) in türü int (*)(int,int) dir. Başlangıç seviyesinde iki boyutlu dizilerin, fonksiyonların vs türlerine takılmasan daha iyi. 

    const char dizi[10] dediğin zaman oradaki const dizinin read only olduğunu belirtiyor. Yani türü tanımlarken ilklersin ve birdaha o dizi değiştirilemez (normal yollarla). 

    Göstericilerde iki çeşit kullanımı var. const char *ptr; dersen ptr nin gösterdiği adres read only dir. Mesela *ptr = 55; diyemezsin. char* const ptr; dersen, göstericinin kendisi readonly olur, ptr = & degisken; gibi bir adres ataması yapılamaz, sadece ilk atandığı adres için kullanılabilir.

    Daha çok fonksiyon parametresi geçerken kullanışlıdır, fonksiyonun o diziyi değiştirmeyeceğini sadece okuma yapılacağını belirtir. Örneğin printf gibi fonksiyonlar, zorunlu olmasa bile, char *string; değil const char *string şeklinde parametre kullanır. printf in verilen stringi değiştirmeyeceğini sadece prototipine bakarak anlayabiliriz.


    -----------------------------

    hocam mesela biz main içindeki bi diziyi fonksiyona argüman olaraka yolladımızda fonksiyonda dizi üzerinde yaptımız değişiklikler main fonksiyonu içindeki diziyide etkiler const olarak tanımladığımızda diziyi bu etkileşim ortadan kalkıyo doru anlamışım dime hocam yarın C den sınavım var ondan soruyom bu kadar yardımlarınız için çok teşekkür ederim hocam herkese


    -----------------------------

    Tam olarak öyle denemez. Yukarıda normal yollarla derken, bir özel durumu belirttim, eğer const diziye dizinin kendi adı üzerinden değil de başka bir gösterici üzerinden (adresi yoluyla) erişirsen, o zaman içeriğini değiştirebilirsin.

    const sadece o dizi adını kullanarak o adrese atama yapamayacağını garantiler. Sen aynı adrese const olmayan bir gösterici yoluyla da erişebilirdin. Sen main içinde bir nesne yaratır ve bunun adresini fonksiyona verirsen, aslında direkt o diziyi vermiş olmazsın. Sadece adresini vermiş olursun, tabi o adres üzerinde yapılan işlemler dizinin kendisini de etkileyecektir, ancak tekrarlıyorum, fonksiyona giden dizinin kendisi değildir. Tamamen farklı bir değişken (pointer) dir. 

    Örneğin, main içinde bir const char dizi[] oluşturdun, ancak yolladığın fonksiyon char dizi[] şeklinde parametre alıyor. O halde fonksiyon içinde, dizi rahatlıkla değiştirilebilir.

    Ancak eğer, fonksiyon parametresi de const char dizi[] şeklinde olsaydı, main içindeki dizi ile fonksiyon parametresi aynı adresi gösteren farklı nesneler olduğu halde, yine de dizi fonksiyon içinde değiştirilemezdi. Çünkü fonksiyon parametresi de const. Özetle fonksiyon senin main içindeki nesnenin const olup olmamasını tanımaz, kendi prototipinde ne yazıyorsa onu tanır.


    -----------------------------

    hocam anlamaya çalışırken bi kaç devreyi yaktım sanırım ama anladım yani öle umuyorum baya karışık işlermiş yav bu işler eyvallah hocam tekrardan


    son bitlisli
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tugberk
    Tugberk's avatar
    Kayıt Tarihi: 04/Ekim/2009
    Erkek

    frt bunu yazdı:
    -----------------------------

    hocam anlamaya çalışırken bi kaç devreyi yaktım sanırım ama anladım yani öle umuyorum baya karışık işlermiş yav bu işler eyvallah hocam tekrardan


    -----------------------------

    Bunlar çok sonraları tecrübe ettikçe öğrenilmesi gereken şeyler, bu şekilde anlatınca karışık gelmesi normal. Tek bilmen gereken şu, adresler ramde tektir, ancak aynı adresi gösteren birden fazla gösterici olabilir ve bunların adrese erişim yetkisi farklı olabilir. Sen adresin yetkisini değil sadece o adrese erişen nesnenin yetkisini belirleyebilirsin.

    Bu durumda senin yarattığın dizi ve fonksiyonun parametresi olan gösterici aynı adresi gösteren farklı nesneler olduğuna göre erişim yetkileri farklı olabilir. Dizi, senin tanımladığın yetkide, fonksiyon ise prototipindeki parametrenin yetkisi ile erişir adrese.

Toplam Hit: 2372 Toplam Mesaj: 17