Dizi Fonksiyon İlişkisi

Dizi Fonksiyon İlişkisi

Dizi Fonksiyon İlişkisi Başlık Görseli

     Bildiğimiz üzere oluşturduğumuz fonksiyonları çağırdığımız zaman içlerinde bulunan değişkenler ilk değerlerini her zaman koruyorlardı, değişkenler üzerinde yapılan işlemler fonksiyonların içinde kayboluyordu bu sorunda static değişken tanımlayarak çözüm üretmiştik. Daha sonra göstergeler(pointers) ile bu konuya açıklık getireceğiz.

Yerel dizi bildirimlerinde static (bakınız)kullanarak, dizinin fonksiyon her çağrıldığında yeniden yaratılmasını ve fonksiyondan her çıkıldığında dizinin yok edilmesini engelleye biliriz.

     static olarak bildirilen diziler derleme zamanında yalnızca bir kere otomatik olarak atanır ilk değerleri atanır. Eğer static  bir dizi programcı tarafından ilk değeri atanmamışsa, derleyici tarafından sıfır atanır.

  1. #include <stdio.h>
  2.  
  3. void statikDiziIlk ( void );
  4. void otomatikDiziIlk( void );
  5.  
  6. int main( )
  7. {
  8. printf( "Her fonksiyona ilk cagri:\n" );
  9.  
  10. statikDiziIlk ( );
  11. otomatikDiziIlk ( );
  12. printf( "\nHer fonksiyona ikinci cagrı:\n" );
  13. statikDiziIlk ( );
  14. otomatikDiziIlk ( );
  15. return 0;
  16. }
  17.  
  18. /* a statik yerel diziyi kanıtlayan fonksiyon */
  19. void statikDiziIlk ( void )
  20. {
  21. static int a[ 3 ];
  22. int i;
  23. printf( "\n statikDizilik'e girerken degerler:\n" );
  24. for ( i = 0; i <= 2; i++ )
  25. printf( " dizi1[%d] = %d \n", i, a[ i ] );
  26. printf( "\nstatikDizilik'den cikarken degerler:\n" );
  27. for ( i = 0; i <= 2; i++ )
  28. printf( " dizi1[%d] = %d\n ", i, a[ i ] += 5 );
  29. }
  30. /* otomatik yerel diziyi kanıtlayacak fonksiyon */
  31. void otomatikDiziIlk ( void )
  32. {
  33. int a[ 3 ] = { 1, 2, 3 }, i;
  34. printf( "\n\notomatikDizilik'e girerken degerler:\n" );
  35. for ( i = 0; i <= 2; i++ )
  36. printf(" dizi1 [ %d ] = %d \n", i, a[ i ] );
  37. printf( "\notomatikDizilik'den cikarken degerler:\n" );
  38. for ( i = 0; i <= 2; i++ )
  39. printf( " dizi1[ %d ] = %d \n", i, a[ i ] += 5 );
  40. }
  41.  

Programda anlatılan daha öncede kullanmış olduğumuz static  ile değişken tanımlamada dizi tanımlanmış ve dizi ikinci defa çağrıldığında ilk çarıdaki değerlerini korumuş ve üzerine ekleme yapılmıştır. Bu konu göstergeler konusu ile pekiştirilmiş olacaktır.

Dizileri Fonksiyonlara Gönderme

    Çok elemanlı bir dizi diyelim ki 5 elemandan oluşuyor biz bunu fonksiyona göndermek istediğimizde nasıl yaparız? Daha önceki bilgilerimizle fonksiyona tek değişkenli bir değer gönderip veya ayrı ayrı iki üç değer göndere biliyorduk ve sonucu bize geri döndürüyordu bu aşamada bir dizinin nasıl gönderileceğine ve dizinin diğer elemanlarına nasıl erişeceğimizi göreceğiz.

     Dizi argümanını fonksiyona geçirebilmek için dizinin ismini parantez kullanmadan belirtmeliyiz.

int dizi [12] ;

olarak bildirilen bir dizi

diziGönder ( dizi, 12);

şeklinde dizinin ismi ve boyutunu fonksiyona geçirir. Dizi fonksiyona geçirildiği zaman, fonksiyonun dizinin belirli sayıdaki elemanını işleyebilmesi için dizinin boyutuda gönderilir.

      Diziler fonksiyonlara referansa göre çağırma yöntemiyle geçirilir; çağrılan fonksiyonlar, çağrıcının orijinal dizideki elemanlarını değiştirebilir. Bir yeri gerçekte dizinin ilk elemanın yeridir.

Aşağıda bir dizinin pointer ( bakınız) kullanarak adresine erişilmiştir, fark edileceği üzere  dizi ilk elemanı adresi aslında dizinin kendisinin adresidir.

  1. #include <stdio.h>
  2. int main( )
  3. {
  4. char dizi[ 5 ];
  5.  
  6. printf(" dizi=%p\n",dizi);
  7.  
  8. printf(" &dizi[0]]=%p\n",&dizi[0]);
  9.  
  10. printf(" &dizi=%p\n",&dizi);
  11.  
  12. return 0;
  13. }

     Fonksiyonun, çağrılma esnasında diziyi alabilmesi için fonksiyonun parametre listesinin alınacak diziyi belirtmesi gerekir.

void diziayarla(int b[], int boyut)

biçiminde tanımlanması uygundur. Bu şekilde tanımlandığında diziayarla fonksiyonunun parametresinde tamsayılardan oluşan bir dizi ve boyut parametresinde de dizi elemanlarının sayısını almayı beklediğini gösterir. Dizinin büyüklüğünü köşeli parantez içinde belirtmeye gerek yoktur. Belirtilirse derleyici bu sayının sıfırdan büyük olup olmadığına bakar ve sonra ihmal eder.

Fonksiyonun dizi değişkenli prototipi.

void diziayarla (int [], int);

veya 

void diziyiayarla ( int herhangiBirDiziIsmi [ ] , int herhangiBirDegisken);

C derleyicisi prototipler içindeki değişken isimlerini ihmal eder.

  1. #include <stdio.h>
  2. #define BOYUT 5
  3.  
  4. void diziyiAyarla( int [], int ); /* garip gözükür */
  5. void elemaniAyarla( int );
  6.  
  7. int main( )
  8. {
  9. int a[ BOYUT ] = { 0, 1, 2, 3, 4 }, i;
  10. printf( "Butun dizinin referansa gore cagrilarak gecmesinin "
  11. "etkileri:\n\nOrijinal dizinin "
  12. "degerleri:\n" );
  13. for ( i = 0; i <= BOYUT - 1; i++ )
  14. printf( "%3d", a[ i ] );
  15. printf( "\n" );
  16. diziyiAyarla ( a, BOYUT); /* referansa göre çağrılarak geçti */
  17. printf( "Ayarlanan dizinin degerleri:\n" );
  18. for ( i = 0; i <= BOYUT - 1; i++ )
  19. printf( "%3d", a[ i ] );
  20. printf( "\n\n\nDizi elemaninin degere gore cagrilarak "
  21. "gecmesinin etkileri:\n\na[3] degeri %d\n", a[ 3 ] );
  22. elemaniAyarla ( a[ 3 ] );
  23. printf( "a[ 3 ] degeri %d\n", a[ 3 ] );
  24. return 0;
  25. }
  26. void diziyiAyarla ( int b[], int boyut)
  27. {
  28. int j;
  29. for ( j = 0; j <= boyut - 1; j++ )
  30. b[ j ] *= 2;
  31. }
  32. void elemaniAyarla ( int e )
  33. {
  34. printf( "elemaniAyarla da ki deger %d\n", e *= 2 );
  35. }

void diziyiAyarla ( int b[], int boyut)
{
 int j;
 for ( j = 0; j <= boyut – 1; j++ )
 b[ j ] *= 2;
}

     Alt fonksiyonunda dizinin değerleri değişmiş ve ilk değerleri korunmamıştır . Bu şekilde dizide yapılan değişiklik main fonksiyonunda ve daha sonraki çağrımlardada dizinin yeni değerinden işlem yapılmasını sağlamıştır.

Daha sonraki çağırımdada değişimler aşağıdaki alt fonksiyonda görülmektedir.

void elemaniAyarla ( int e )
 {
printf( “elemaniAyarla da ki değer %d\n”, e *= 2 );
 }

a dizisi ilk halindeki değerleri korumamıştır.

Kimler Neler Demiş?

  Abone ol  
Bildir