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 x 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.
#include <stdio.h> int main( ) { int b[ ] = { 10, 20, 30, 40 }; /* bPtr b dizisini göstersin */ int *bPtr = b; int i, offset; printf( "\nDizi Eleman Adresleri\n" ); for ( i = 0; i < 4; i++ ) printf("b[%d] adresi= %p \n",i,&b[i]); printf( "\nDizi belirtecleri yontemi\n" ); for ( i = 0; i < 4; i++ ) printf( "b[ %d ] = %d\n", i, b[ i ] ); printf( "\nGosterici/offset yöntemi,\n"); for ( offset = 0; offset < 4; offset++ ) printf( "*( b + %d ) = %d\n", offset, *( b + offset ) ); printf( "\nGosterici belirtec yontemi\n" ); for ( i = 0; i < 4; i++ ) printf( " bPtr[ %d ] = %d\n", i, bPtr[ i ] ); printf( "\nGosterici/offset yontemi\n" ); for ( offset = 0; offset < 4; offset++ ) printf( "*( bPtr + %d ) = %d\n", offset, *( bPtr + offset ) ); return 0; }
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.
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.
#include <stdio.h> #include <stdlib.h> #include <time.h> void kar( int [ ][ 13 ] ); void dagit( const int [ ][ 13 ], const char *[ ], const char *[ ] ); int main( ) { const char *takim[4] ={"Kupa", "Karo", "Sinek", "Maca" }; const char *taraf[13]={"As", "İki", "Uc", "Dort","Bes", "Alti", "Yedi", "Sekiz", "Dokuz", "On", "Vale", "Kiz", "Papaz" }; int deste[4][13] = { 0 }; srand ( time( 0 ) ); kar( deste ); dagit( deste, taraf, takim ); return 0; } void kar( int wDeste[ ][ 13 ] ) { int satir, sutun, kart; for ( kart = 1; kart <= 52; kart++ ) { do { satir = rand( ) % 4; sutun = rand() % 13; } while( wDeste [ satir ][ sutun ] != 0 ); wDeste[ satir ][ sutun] = kart; } } void dagit( const int wDeste[ ][ 13 ], const char *wTaraf [ ],const char *wTakim[ ] ) { int kart, satir, sutun; for ( kart = 1; kart <= 52; kart++ ) for ( satir = 0; satir <= 3; satir++ ) for ( sutun = 0; sutun <= 12; sutun++ ) if ( wDeste[ satir ][ sutun] == kart ) { if(kart==14||kart==27||kart==40) printf("\n\n"); printf( "%5s - %-8s%c\n",wTakim[ satir ], wTaraf[ sutun ] ); if(kart%13==0) printf("\n_________________"); } }

(Çıktı sizde hepsi alt alta olacaktır.Görsel amaçlı düzenledim)
deste [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.