1 / 65

Bölüm 7 - Göstericiler

Bölüm 7 - Göstericiler. İndeks 7.1 Giriş 7.2 Gösterici Değişkenleri Bildirmek ve Gösterici Değişkenlerine Atama yapmak 7.3 Gösterici Operatörleri 7.4 Fonksiyonları Referansa Göre Çağırmak 7.5 const Belirtecini Göstericilerle Kullanmak

licia
Télécharger la présentation

Bölüm 7 - Göstericiler

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Bölüm 7 - Göstericiler İndeks 7.1 Giriş 7.2 Gösterici Değişkenleri Bildirmek ve Gösterici Değişkenlerine Atama yapmak 7.3 Gösterici Operatörleri 7.4 Fonksiyonları Referansa Göre Çağırmak 7.5 const Belirtecini Göstericilerle Kullanmak 7.6 Referansa Göre Çağırma Kullanan Kabarcık Sırlama 7.7Gösterici İfadeleri ve Gösterici Aritmetiği 7.8 Göstericiler ve Diziler Arasındaki İlişki 7.9 Gösterici Dizileri 7.10 Örnek: Kart Karma ve Dağıtma 7.11 Fonksiyonları Gösteren Göstericiler

  2. Amaçlar • Bu Bölümde Öğreneceklerimiz: • Göstericileri kullanabilmek. • Referansa göre çağrılan fonksiyonlara argümanları geçirmede göstericileri kullanabilme • Göstericilerin Diziler ve Karakterler (Strings) arasındaki yakın ilişkiyi anlama, • Fonksiyonlarda göstericilerin kullanımını anlama. • Karakter dizilerini tanımlayabilme ve kullanma.

  3. 7.1 Giriş • Göstericiler hakkında yorumlar: • Güçlü, fakatyönetilmesi zor • Öğrenmek zor • Göstericilerle herşey yapılır. • C bilenler ikiye ayrılır: Göstericiyi bilenler ve bilmeyenler • Göstericiler bir C klasiğidir. • Düşük seviyeli programlamaya en iyi örnektir. • Göstericiler C’ve onun uzantısı olan dillere özgü bir konudur.

  4. count countPtr count 7 7 7.2 Gösterici Değişkenleri Bildirmek ve Gösterici Değişkenlerine Atama yapmak • Gösterici Değişkenleri • İçinde , başka değişkenin bellek adresini tutar. • Normal değişkenler kesin bir değer taşır (direk referans) • Göstericiler kesin bir değişkene sahip(direk referans) bir değişkenin adresini taşır • (Dolaylama)Direkt olmayan – bir gösterici değeri referans etme

  5. Adres Operatörü: & • Değişkenin hangi adreste olacağına biz karar veremeyiz. • Ancak alınan bölgenin adresini öğrenebiliriz. int deneme printf(“%x”,&deneme); int i; &i=“240DE4F”;Yanlış atama

  6. 7.2 Gösterici Değişkenleri Bildirmek ve Gösterici Değişkenlerine Atama yapmak • Gösterici tanımlamaları • *gösterici değişkenleri ile kullanılır int *myPtr; • Bir sayısal gösterici olarak tanımlarint (gösterici tipiint *) • Çoklu gösterici tanımlarken her bir değişken tanımından önce bir *kullanılır int *myPtr1, *myPtr2; • Herhangi bir veri tipi için gösterici tanımlanabilir • Göstericilere ilk değer olarak 0,NULL veya bir adres atanabilir • 0veya NULL–gösterici hiçbir şey referans etmez

  7. yptr y y 5 yPtr Y değişkeninin adresiyptrgöstericisinin değeridir 500000 600000 600000 5 7.3 Gösterici Operatörleri • & (adres operatörleri) • Değişkenin adresini geriye döndürür int y = 5; int *yPtr; yPtr = &y; /* yPtr,y değişkeninin adresini tutar */ yPtr, “y” değişkenini gösterir denir

  8. 7.3 Gösterici Operatörleri • * (İçerik/geri referans operatorü) • Operandının (yani göstericinin) gösterdiği nesnenin değerini döndürür. • *yptrgeriyey döndürür (çünküyptr“y” yi gösterir) • *atama içinde kullanılabilir • Nesneye benzerini döndürür *yptr = 7; /* changes y to 7 */ • Geri referans edilmiş göstericiler (*’ın operandı) bir değer almak zorundadır (sabit değer değil) • *ve &birbirinin eşleniğidir. • Art arda uygulandıklarında aynı sonucu verirler.

  9. A nın adresi aPtr nin değeridir. fig07_04.c

  10. A ‘nın adresi 0012FF7C aPtr değişkeninin değeri 0012FF7C A’nın değeri 7 *aPtr’nin değeri 7 * ve & birbirinin eşleniğidir. &*aPtr = 0012FF7C *&aPtr = 0012FF7C Program Output

  11. 7.3 Gösterici Operatörleri

  12. 7.7 Gösterici İfadeleri ve Gösterici Aritmetiği • Aritmetik operatörler göstericilerde de uygulanabilir • Gösterici artırma/azaltma (++veya--) • Göstericiye bir tam sayı değer ekleme( + or += , - or -=) • Göstericiler birbirlerinden çıkarılabilirler • Operatörler bir dizi üzerinde uygulanmadıkça anlamsızdır

  13. v[0] v[1] v[2] v[4] v[3] 7.7 Gösterici İfadeleri ve Gösterici Aritmetiği • 4 byte tamsayılar (ints) kullanan bir makinada 5 elemanlıtamsayı(int)dizisi • vPtr, v[ 0 ]ilk elemanını gösterir • 3000 deki konumu (vPtr = 3000) • vPtr += 2;vPtr3008olarak değiştirir • vPtr,v[ 2 ]’yi gösterir (2 artırılmış), fakat makina 4 byte tamsayılara sahiptir, öyleyse vPtr3008adresini gösterir konum 3000 3004 3008 3012 3016 pointer variablevPtr

  14. 7.7 Gösterici İfadeleri ve Gösterici Aritmetiği • Göstericileri çıkarma • Birinden diğerine elemanların sayısını döndürür. Eğer vPtr2 = &v[ 2 ]; vPtr = &v[ 0 ]; • vPtr2 - vPtr 2 ‘yi üretir • Gösterici karşılaştırma ( <, == , > ) • Dizilerde adres değeri karşılaştırılarak dizide önceki eleman mı yoksa sonraki eleman mı olduğu tespit edilebilir. • Bir gösterici içinde adres barındırıp barındırmadığı karşılaştırılabilir.

  15. 7.7 Gösterici İfadeleri ve Gösterici Aritmetiği • Aynı tip göstericiler birbirlerine atanabilirler • Eğer aynı tip değilse, dönüşüm (casting) yapılmak zorunda • void (tipi void *)gösteren göstericiler istisnadır • Genel göstericiler herhangi biri tipi temsil edebilir • Dönüşüme ihtiyaç yoktur, bütün göstericiler void göstericiye atanabilir • voidgöstericilerin gösterdiği nesneye erişilemez. • void göstericiler üzerinde aritmetik işlemler de yapılamaz. • Tek işleri adres bilgisini tutmak ve zamanı geldiğinde bu adres bilgisini diğer uygun göstericilere atamaktır.

  16. 7.4 Göstericilerin Fonksiyonlarla Kullanımı(Fonksiyonları Referansa Göre Çağırmak) • Gösterici argümanları ile referansa göre çağırma • & operatörünü kullanarak argümanın adresini geçirme • Hafızadaki gerçek pozisyonu değiştirmenize izin verir • Diziler & operatörü ile geçirilmez çünkü dizinin adresini otomatik olarak geçirir • * operatörü • Fonksiyonun içerdiği değişken için takma ad kullanılır void double( int *number ) { *number = 2 * ( *number ); } • *numbergeçirilmiş değişken için takma ad olarak kullanılır

  17. fig07_06.c

  18. Dikkat!! Fonksiyon prototipi bir tam sayı için gösterici aldı fig07_07.c referansaGoreKup ‘ün içinde, *nPtrkullanıldı(*nPtrbirsayıdır).

  19. Sayının esas degeri 5 Sayının yeni degeri 125 Program Output

  20. Sayının esas degeri5 Sayının yeni degeri125 Program Output

  21. main, değer fonksiyonunu çağırmadan önce : int main() int degereGoreKup( int n ) sayi { { 5 int sayi = 5 ; return n * n * n; } n sayi=degereGoreKup(sayi); } tanımlanmamış degereGoreKup fonksiyonu çağrıldığında int main() int degereGoreKup ( int n) sayi { { int sayi = 5 ; 5 return n * n * n; } n sayi= degereGoreKup( sayi ); } 5 degereGoreKup fonksiyonunu n parametresinin küpünü aldıktan sonra : int main() int degereGoreKup( int n ) sayi { { 125 int sayi= 5 ; 5 return n * n * n; } n sayi= degereGoreKup(sayi); } 5 Fig. 7.8 tipik bir değere göre çağırma işleminin analizi (Part 1 of 2.)

  22. degerGoreKup fonksiyonundan main fonksiyonuna dönüldükten sonra : int main() int degereGoreKup( int n ) sayi { { 5 int sayi = 5 ; return n * n * n; 125 } n sayi= degereGoreKup( number ); } tanımlanmamış Main sayi değişkenine atanma işlemini bitirdiği zaman : int main() int degereGoreKup( int n ) sayi { { 125 int number = 5 ; return n * n * n; 125 125 } sayi= degereGoreKup(sayi); n } tanımlanmamış Fig. 7.8 tipik bir değere göre çağırma işleminin analizi. (Part 2 of 2.)

  23. referansaGoreKup fonksiyonunu referansa göre çağrılmadan önce : sayi int main() void referansaGoreKup( int *nPtr ) { { 5 int sayi= 5 ; *nPtr = *nPtr * *nPtr * *nPtr; } nPtr referansaGoreKup( & sayi); } tanımlanmamış referansaGoreKup fonksiyonu referansa göre çağrıldıktan sonra ve *nPtr nin küpü sayi int main() void referansaGoreKup( int *nPtr ) { { 5 int sayi= 5 ; *nPtr = *nPtr * *nPtr * *nPtr; } nPtr referansaGoreKup( & sayi); } *nPtr’nin küpü alındıktan sonra sayi int main() void referansaGoreKup( int *nPtr ) { { 125 125 int sayi= 5 ; *nPtr = *nPtr * *nPtr * *nPtr; } nPtr referansaGoreKup( & sayi); } Fig. 7.9 bir gösterici argümanıyla tipik bir referansa göre çağırma işleminin analizi.

  24. 7.8 Göstericiler ve Diziler Arasındaki İlişki • Diziler ve Göstericiler arasındaki yakın ilişki • Dizi adı gösterici sabitine benzer • Göstericiler her işlemde kullanılabilir • Bir 5 elemanlı b dizisi tanımlansın vebir göstericiyibPtrtanımlansın. • Dizinin ilk elemanına eşitleme: bPtr = b; • b dizisinin ilk elemanının adresini atama bPtr = &b[ 0 ] • b dizisinin ilk elemanının adresini bPtr ye atamanın diğer yolu

  25. 7.8 Göstericiler ve Diziler Arasındaki İlişki • Elemanb[ 3 ] • *( bPtr + 3 )olarak da belirtilebilir • 3 (n) göstericinin offset’idir . Bu gösterime gösterici/offset gösterimi denir. • bptr[ 3 ]olarak kullanım • Gösterici/belirteç gösterimi denir • bPtr[ 3 ] ile b[ 3 ]aynı şeyi ifade eder • Dizinin kendisinde de bir gösterici olarak kullanılabilir ve gösterici aritmetiğinde kullanılabilir *( b + 3 )

  26. fig07_20.c (Part 1 of 2)

  27. fig07_20.c (Part 2 of 2)

  28. B dizisi aşağıdaki metodla yazılmıştır: Dizi belirteçleri yöntemi b[ 0 ] = 10 b[ 1 ] = 20 b[ 2 ] = 30 b[ 3 ] = 40 Gösterici/offset yöntemi Gösterici dizinin ismidir *( b + 0 ) = 10 *( b + 1 ) = 20 *( b + 2 ) = 30 *( b + 3 ) = 40 Gösterici/belirteç yöntemi bPtr[ 0 ] = 10 bPtr[ 1 ] = 20 bPtr[ 2 ] = 30 bPtr[ 3 ] = 40 Gösterici/offset yöntemi *( bPtr + 0 ) = 10 *( bPtr + 1 ) = 20 *( bPtr + 2 ) = 30 *( bPtr + 3 ) = 40 Program Output

  29. 7.5 const Belirtecini Göstericilerle Kullanmak • constbelirteci • Değişkenler değiştirilemez • Eğer fonksiyonun bir değişkeni değiştirmeye ihtiyacı yok ise constkullanılır • Bir constdeğişkeni değiştirmeyi denemek bir hata üretir • constgöstericileri • Bir sabit hafıza pozisyonunu gösterme • Tanımlanırken ilk değer atanmalıdır • int *const myPtr = &x; • Tipiint *const–bir tamsayıyı gösteren sabit gösterici • const int *myPtr = &x; • sabit bir tamsayıyı gösteren gösterici • const int *const Ptr = &x; • Sabit bir tamsayıyı sabit gösterici • xdeğiştirilebilir, fakat*Ptr değil

  30. fig07_10.c (Part 1 of 2)

  31. fig07_10.c (Part 2 of 2) Program Output Çevrilmeden önceki string :karakter ve $32.98 Çevrildikten sonraki string: karakterve $32.98

  32. fig07_11.c (Part 1 of 2)

  33. fig07_11.c (Part 2 of 2) Program Output string: String karakterini yaz

  34. fig07_12.c

  35. Compiling... FIG07_12.c d:\books\2003\chtp4\examples\ch07\fig07_12.c(22) : error C2166: l-value specifies const object Error executing cl.exe. FIG07_12.exe - 1 error(s), 0 warning(s) Program Output

  36. fig07_13.c Program Output Compiling... FIG07_13.c D:\books\2003\chtp4\Examples\ch07\FIG07_13.c(15) : error C2166: l-value specifies­ const object Error executing cl.exe. FIG07_13.exe - 1 error(s), 0 warning(s)

  37. fig07_14.c

  38. Compiling... FIG07_14.c D:\books\2003\chtp4\Examples\ch07\FIG07_14.c(17) : error C2166: l-value specifies­ const object D:\books\2003\chtp4\Examples\ch07\FIG07_14.c(18) : error C2166: l-value specifies­ const object Error executing cl.exe. FIG07_12.exe - 2 error(s), 0 warning(s) Program Output

  39. fig07_21.c (Part 1 of 2)

  40. fig07_21.c (Part 2 of 2) Program Output string1 = Merhaba string3 = Güle güle

  41. 7.6 Referansa Göre Çağırma Kullanan Kabarcık Sıralama • Gösterici kullanarak kabarcıksıralama’yı uygulama • İki elemanı yer değiştir • Yer değiştirme fonksiyonu dizi elemanlarının adresini içermek zorundadır (& kullanarak) • Dizi elemanları varsayılan olarak değere göre çağrılmayla geçirilir • Göstericileri ve * operatörü kullanarak dizi elemanlarının yerlerini değiştirme • Psuedocode (Sahte kodlar) diziye ilk değer atama veri orijinal sırasında yazdır Kabarcık sıralama fonksiyonunu çağır sıralanmış diziyi yazdır Kabarcık sıralamayı tanımla

  42. 7.6 Referansa Göre Çağırma Kullanan Kabarcık Sıralama • sizeof • Operandın boyutunu byte cinsinden geriye döndürür • Diziler için: 1 elemanın boyutu * elemanların sayısı • Eğer sizeof( int )eşit4 byte ise, int myArray[ 10 ]; printf( "%d", sizeof( myArray ) ); • 40 yazılacak • sizeofaşağıdakiler ile birlikte kullanılabilir • Değişken adları • Tip adı • Sabit değişkenler

  43. fig07_15.c (Part 1 of 3)

  44. fig07_15.c (Part 2 of 3)

  45. fig07_15.c (Part 3 of 3) Program Output Veriler orijinal sırada 2 6 4 8 10 12 89 68 45 37 Veriler artan sırada 2 4 6 8 10 12 37 45 68 89

  46. fig07_16.c Program Output Dizinin byte büyüklüğü 80 buyukluguBul ile döndürülen byte sayısı 4

  47. fig07_17.c (Part 1 of 2)

  48. fig07_17.c (Part 2 of 2) Program Output sizeof c = 1 sizeof(char) = 1 sizeof s = 2 sizeof(short) = 2 sizeof i = 4 sizeof(int) = 4 sizeof l = 4 sizeof(long) = 4 sizeof f = 4 sizeof(float) = 4 sizeof d = 8 sizeof(double) = 8 sizeof ld = 8 sizeof(long double) = 8 sizeof dizi = 80 sizeof ptr = 4

  49. ’\0’ ’\0’ ’\0’ ’\0’ ’n’ ’d’ ’o’ ’u’ ’a’ ’s’ ’d’ ’b’ ’m’ ’H’ ’s’ ’a’ ’D’ ’i’ ’a’ ’s’ ’l’ ’C’ ’r’ ’s’ ’S’ ’p’ ’e’ ’t’ ’e’ takim[0] takim[1] takim[2] takim[3] 7.9 Gösterici Dizileri • Diziler göstericiler içerebilir. • Örnek: karakterler dizisi char *suit[ 4 ] = { "Hearts", "Diamonds", "Clubs", "Spades" }; • Stringlerilk karakteri gösteren göstericilerdir • char *–takım dizisinin her elemanının char gösteren tipte bir gösterici olduğunu belirtir • Gerçekte stringler takım dizisinde saklanmazlar, sadece stringlerin göstericileri saklanır • Takim dizisi sabit bir boyuta sahiptir,fakat stringler farklı olabilir

  50. 7.10 Örnek: Kart Karma ve Dağıtma • Kart karma ve dağıtma programı • Göstericilerin dizisini karakterleri göstermede kullanma • İki boyutlu takım dizisi kullan (satır, sütun) • 1-52 arasındaki sayılar diziye gönderilir • Bu noktada deste tamamen karılmış olur As iki üç Dört beş altı yedi sekiz dokuz on vale kız papaz 0 1 2 3 4 5 6 7 8 9 10 11 12 0 Kupa 1 Karo 2 Sinek 3 Maça deste[ 2 ][ 12 ]sinek papazı gösterir papaz sinek

More Related