Sunuyu indir
Sunum yükleniyor. Lütfen bekleyiniz
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.7 Gö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
Bu Bölümde Öğreneceklerimiz:
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
Göstericiler hakkında yorumlar:
7.1 Giriş Göstericiler hakkında yorumlar: Güçlü, fakat yö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
Gösterici Değişkenleri
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 count 7 count 7 countPtr
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
Gösterici tanımlamaları
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ımlar int (gösterici tipi int *) Ç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 0 veya NULL – gösterici hiçbir şey referans etmez
7
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 yPtr y 5 yptr 500000 600000 Y değişkeninin adresi yptr göstericisinin değeridir
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. *yptr geriye y 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
Program Output 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
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; vPtr olarak değiştirir vPtr ,v[ 2 ]’yi gösterir (2 artırılmış), fakat makina 4 byte tamsayılara sahiptir, öyleyse vPtr 3008 adresini gösterir konum 3000 3004 3008 3012 3016 v[0] v[1] v[2] v[3] v[4] pointer variable vPtr
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 void gö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
Gösterici argümanları ile referansa göre çağırma
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 ); } *number geç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, *nPtr kullanıldı (*nPtr bir sayıdır).
19
Sayının esas degeri 5 Sayının yeni degeri 125 Program Output
20
Sayının esas degeri 5 Sayının yeni degeri 125 Program Output
21
main, değer fonksiyonunu çağırmadan önce
: int main() sayi int degereGoreKup( int n ) { { int sayi = 5 ; 5 return n * n * n; } sayi =degereGoreKup(sayi ); n } tanımlanmamış degereGoreKup fonksiyonu çağrıldığında int main() sayi int degereGoreKup ( int n) { { int sayi = 5 ; 5 return n * n * n; } sayi = degereGoreKup( sayi ); n } 5 degereGoreKup fonksiyonunu n parametresinin küpünü aldıktan sonra : int main() sayi int degereGoreKup( int n ) { { 125 int sayi = 5 ; 5 return n * n * n; } sayi = degereGoreKup(sayi ); n } 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() sayi int degereGoreKup( int n ) { { int sayi = 5 ; 5 return n * n * n; 125 } sayi = degereGoreKup( number ); n } tanımlanmamış Main sayi değişkenine atanma işlemini bitirdiği zaman : int main() sayi int degereGoreKup( int n ) { { int number = 5 ; 125 return n * n * n; 125 125 } sayi = degereGoreKup(sayi ); n } tanımlanmamış Fig tipik bir değere göre çağırma işleminin analizi. (Part 2 of 2.)
23
*nPtr’nin küpü alındıktan sonra
referansaGoreKup fonksiyonunu referansa göre çağrılmadan önce : int main() sayi void referansaGoreKup( int *nPtr ) { { 5 int sayi = 5 ; *nPtr = *nPtr * *nPtr * *nPtr; } referansaGoreKup( & sayi); nPtr } tanımlanmamış referansaGoreKup fonksiyonu referansa göre çağrıldıktan sonra ve *nPtr nin küpü int main() sayi void referansaGoreKup( int *nPtr ) { { 5 int sayi = 5 ; *nPtr = *nPtr * *nPtr * *nPtr; } referansaGoreKup( & sayi); nPtr } *nPtr’nin küpü alındıktan sonra int main() sayi void referansaGoreKup( int *nPtr ) { { 125 125 int sayi = 5 ; *nPtr = *nPtr * *nPtr * *nPtr; } referansaGoreKup( & sayi); nPtr } 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 ve bir göstericiyi bPtr tanı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
Eleman b[ 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
Program Output 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 *( bPtr + 0 ) = 10 *( bPtr + 1 ) = 20 *( bPtr + 2 ) = 30 *( bPtr + 3 ) = 40 Program Output
29
7.5 const Belirtecini Göstericilerle Kullanmak
Değişkenler değiştirilemez Eğer fonksiyonun bir değişkeni değiştirmeye ihtiyacı yok ise const kullanılır Bir const değişkeni değiştirmeyi denemek bir hata üretir const göstericileri Bir sabit hafıza pozisyonunu gösterme Tanımlanırken ilk değer atanmalıdır int *const myPtr = &x; Tipi int *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 x değ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 : karakter ve $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
Program Output 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
Program Output 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 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şit 4 byte ise, int myArray[ 10 ]; printf( "%d", sizeof( myArray ) ); 40 yazılacak sizeof aş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 Veriler artan sırada
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 = sizeof(char) = 1 sizeof s = sizeof(short) = 2 sizeof i = sizeof(int) = 4 sizeof l = sizeof(long) = 4 sizeof f = sizeof(float) = 4 sizeof d = sizeof(double) = 8 sizeof ld = sizeof(long double) = 8 sizeof dizi = 80 sizeof ptr = 4
49
7.9 Gösterici Dizileri Diziler göstericiler içerebilir.
Örnek: karakterler dizisi char *suit[ 4 ] = { "Hearts", "Diamonds", "Clubs", "Spades" }; Stringler ilk 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 takim[3] takim[2] takim[1] takim[0] ’H’ ’e’ ’a’ ’r’ ’t’ ’s’ ’\0’ ’D’ ’i’ ’m’ ’o’ ’n’ ’d’ ’C’ ’l’ ’u’ ’b’ ’S’ ’p’
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 1 2 3 4 5 6 7 8 9 10 11 12 Kupa Karo 1 2 Sinek Maça 3 deste[ 2 ][ 12 ] sinek papazı gösterir sinek papaz
51
7.10 Örnek: Kart Karma ve Dağıtma
Pseudocode (Sahte kodlar) İlk olarak: 52 kartı kar ve dağıt İlk iyileştirme: takım dizisine ilk değer atama Taraf dizisine değerler ata Deste dizisine değerler ata Desteyi kar 52 kartı dağıt
52
7.10 Örnek: Kart Karma ve Dağıtma
İkinci iyileştirme desteyi karma şu şekilde genişletilebilir 52 kartın her biri için (for) Destenin rasgele seçilmiş boş bir alanına kart sayısını yerleştir 52 kartı dağıtma şu şekilde genişletilebilir 52 kartın her biri için (for) Deste dizisinde kart sayısını bul ve kartın hangi desteye ait olduğunu ve değerini yazdır
53
7.10 Örnek: Kart Karma ve Dağıtma
Üçüncü iyileştirme desteyi karma şu şekilde genişletilebilir Destedeki alanı rasgele seç Destedeki bu alan daha önceden seçildiği sürece (While) Destedeki alanı rasgele seçmeye devam et Destede seçilen alana kart sayısını yerleştir 52 kartı dağıtma şu şekilde genişletilebilir Deste dizisindeki her alan için (For) Eğer alan kart sayısı içeriyorsa (if) Kartın hangi desteye ait olduğunu ve değerini yazdır
54
fig07_24.c (Part 1 of 4)
55
fig07_24.c (Part 2 of 4)
56
fig07_24.c (Part 3 of 4)
57
fig07_24.c (Part 4 of 4)
58
Program Output Karo Sekiz Kupa AS Sinek Sekiz Sinek Beş
Kupa Yedi Karo iki Sienk As Karo on Maça iki Karo altı Maça yedi Sinek iki Sinek vale Maça on Kupa papaz Karo Vale Kupa üç Karo üç Sinek üç Sinek dokuz Kupa on Kupa iki Sinek on Karo yedi Sinek altı Maça kız Kupa altı Maça üç Karo dokuz Karo as Maça vale Sinek beş Karo papaz Sinek yedi Maça dokuz Kupa dört Maça altı Maça sekiz Karo kız Karo beş Maça as Kupa dokuz Sinek papaz Kupa beş Maça papaz Karo dört Kupa kız Kupa sekiz Maça dört Kupa vale Sinek dört Sinek kız Program Output
59
7.11 Fonksiyonları Gösteren Göstericiler
Fonksiyonların adreslerini tutarlar Dizi adının dizinin ilk elemanın adresi olmasına benzer Fonksiyon ismi, fonksiyonun görevini yapan kodun hafızadaki başlangıç adresidir Fonksiyon göstericileri Fonksiyonlara geçirilebilir Dizilerde saklanabilir Başka fonksiyon göstericilerine atanabilir
60
7.11 Fonksiyonları Gösteren Göstericiler
Örnek: kabarcık sıralama Kabarcık fonksiyonu bir fonksiyon göstericisi alır Kabarcık bu yardım fonksiyonu cağırır azalan veya artan sıralamayı belirler Fonksiyon göstericisi için kabarcıksıralama’daki argüman: int ( *karsilastir)( int, int ) tells bubblesort to expect a pointer to a function that takes two ints and returns an int Kabarcık fonksiyonuna iki tamsayı parametresi alan ve bir tamsayı sonucunu döndüren bir fonksiyonu gösteren bir gösterici alacağını söyler Eğer parantezleri dahil etmeseydik: int * karsilastir( int, int ) İki tamsayıyı alan ve bir tamsayıyı gösteren bir gösterici döndüren bir fonksiyon bildirir
61
fig07_26.c (Part 1 of 4)
62
fig07_26.c (Part 2 of 4)
63
fig07_26.c (Part 3 of 4)
64
fig07_26.c (Part 4 of 4)
65
Program Output Artan sıralama için 1 girin,
Azalan sıralama için 2 girin: 1 Veriler orijinal sırasında Veriler artan sırada Program Output Artan sıralama için 1 girin, Azalan sıralama için 2 girin:2 Veriler orijinal sırasında Veriler azalan sırada
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.