Göstericilerin Dizlerle İlişkisi

Göstericilerin Dizilerle İlişkisi

     Bir dizi ismi, sabit bir gösterici olarak düşünülebilir. Göstericiler, dizilerin belirteçlerle gösterimi de dahil olmak üzere her işlemde kullanılabilir.

x[5] tamsayı dizisi ve xPtr tamsayı göstericisi tanımlansın. Bir belirteç kullanmayan dizi isminin kullanmayan dizi isminin, dizinin ilk elemanını gösteren gösterici olduğunu bildiğimize göre, xPtr’yi dizisinin ilk elemanı

xPtr=x;  // ilk elemanın adresi atanmıştır  xPtr=&x[0]; ifadesi ile eşdeğerdir

*(xPtr+3) // dizinin üçüncü elemanına x[3] erişir. offset gösterimidir.

&b[3];  // adresi xPtr+3 adresi ile eşdeğerdir.

xPtr[1]; // ifadesi x[1] elemanını belirtir. gösterici gösterimi.

  1. #include <stdio.h>
  2.  
  3. int main( )
  4. {
  5. int b[ ] = { 10, 20, 30, 40 };
  6. /* bPtr b dizisini göstersin */
  7. int *bPtr = b;
  8. int i, offset;
  9.  
  10. printf( "\nDizi Eleman Adresleri\n" );
  11. for ( i = 0; i < 4; i++ )
  12. printf("b[%d] adresi= %p \n",i,&b[i]);
  13. printf( "\nDizi belirtecleri yontemi\n" );
  14. for ( i = 0; i < 4; i++ )
  15. printf( "b[ %d ] = %d\n", i, b[ i ] );
  16. printf( "\nGosterici/offset yöntemi,\n");
  17. for ( offset = 0; offset < 4; offset++ )
  18. printf( "*( b + %d ) = %d\n", offset, *( b + offset ) );
  19. printf( "\nGosterici belirtec yontemi\n" );
  20. for ( i = 0; i < 4; i++ )
  21. printf( " bPtr[ %d ] = %d\n", i, bPtr[ i ] );
  22. printf( "\nGosterici/offset yontemi\n" );
  23. for ( offset = 0; offset < 4; offset++ )
  24. printf( "*( bPtr + %d ) = %d\n", offset, *( bPtr + offset ) );
  25.  
  26. return 0;
  27. }

Gösterici Dizileri

     Diziler göstericiler içerebilir. Bu tipte veri yapılarının genel kullanımı, stringlerden oluşan bir dizi oluşturmaktır. string dizilerindeki her girdi, aslında stringin ilk karakterini gösteren bir göstericidir.

const char *takim[4]={“kupa”,”karo”,”sinek”,” maça”};

  • takim[4] kısmı, 4 elemanlı bir diziyi belirtmektedir.
  • char* kısmı, takim dizisi her elemanını char gösteren  gösterici belirtmektedir.
  • const , gösterici tarafından gösterilen stringlerin değiştirilemeyeceğini belirtir.
  • Diziye yerleştirilecek 4 değer “kupa”,”karo”,”sinek” ve “maça” olarak verilmiştir

Her gösterici, ilgili stringin ilk karakterini göstermektedir.

Göstericiler Dizi İlişkisi

Kart Karma Oyunu

     Aşağıdaki programda kağıt dağıtma programı gözükmektedir.  Yukarıdan aşağıya, adımsal iyileştirme yaklaşımını kullanarak 52 kartlık bir desteyi karan ve her kartı dağıtan bir program geliştireceğiz.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. void kar( int [ ][ 13 ] );
  6. void dagit( const int [ ][ 13 ], const char *[ ], const char *[ ] );
  7.  
  8. int main( )
  9. {
  10. const char *takim[4] ={"Kupa", "Karo", "Sinek", "Maca" };
  11. const char *taraf[13]={"As", "İki", "Uc", "Dort","Bes", "Alti", "Yedi",
  12. "Sekiz", "Dokuz", "On", "Vale", "Kiz", "Papaz" };
  13.  
  14. int deste[4][13] = { 0 };
  15.  
  16. srand ( time( 0 ) );
  17. kar( deste );
  18. dagit( deste, taraf, takim );
  19.  
  20. return 0;
  21. }
  22. void kar( int wDeste[ ][ 13 ] )
  23. {
  24. int satir, sutun, kart;
  25. for ( kart = 1; kart <= 52; kart++ )
  26. {
  27. do {
  28. satir = rand( ) % 4;
  29. sutun = rand() % 13;
  30. } while( wDeste [ satir ][ sutun ] != 0 );
  31. wDeste[ satir ][ sutun] = kart;
  32. }
  33. }
  34. void dagit( const int wDeste[ ][ 13 ], const char *wTaraf [ ],const char *wTakim[ ] )
  35. {
  36. int kart, satir, sutun;
  37. for ( kart = 1; kart <= 52; kart++ )
  38. for ( satir = 0; satir <= 3; satir++ )
  39. for ( sutun = 0; sutun <= 12; sutun++ )
  40. if ( wDeste[ satir ][ sutun] == kart )
  41. {
  42. if(kart==14||kart==27||kart==40)
  43. printf("\n\n");
  44. printf( "%5s - %-8s%c\n",wTakim[ satir ], wTaraf[ sutun ] );
  45. if(kart%13==0)
  46. printf("\n_________________");
  47. }
  48. }

(Çıktı sizde hepsi alt alta olacaktır.Görsel amaçlı düzenledim)

Kartkarma Oyunu Tablosudeste [2] [13] sinek papazı gösterir. 2 sinek 13 papaz

     Kart karma ve dağıtma programı  ve bu programın örnek bir çıktısı gösterilmiştir. printf çağrıları içinde karakter stringlerini yazdırmak için %s dönüşüm belirtecinin kullanıldığına dikkat ediniz. printf çağrısındaki ilgili argüman, char gösteren bir gösterici (ya da karakter dizisi) olmalıdır. dagıtma fonksiyonunda “%5s-%8s” biçim tarifi (46.satır) sağa dayalı olarak 5 karakterlik bir alana karakter stringi ve sola dayalı olarak 8 karakterlik bir alana diğer karakter stringini yazdırmak için kullanılmıştır.%-8s içindeki eksi işareti, stringin 8 alan genişliği içinde sola dayalı olacağını belirtir.

Kimler Neler Demiş?

  Abone ol  
Bildir