330 likes | 541 Views
BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 . Sunu ) ( Yrd . Do ç . Dr. Deniz Dal). İş aret ç iler ( Pointers) (Adres Saklayan Değişkenler). “ Pointer”lar ço k g üç l ü d ü rler ama onlar ı do ğ ru kullanabilmeyi öğ renmek zaman al ı r.
E N D
BM-104 Nesneye Yönelik Programlama Bahar2013 (7. Sunu) (Yrd. Doç. Dr. Deniz Dal)
İşaretçiler (Pointers)(Adres Saklayan Değişkenler) • “Pointer”larçok güçlüdürleramaonları doğrukullanabilmeyiöğrenmekzaman alır. • “Pointer”larfonksiyonlarareferanslaparametreaktarma amaçlıkullanılabilirler. • Dahaöncekiderslerimizde gördüğümüz diziler (arrays) statikveri yapılarındandı. “Pointer”lardinamikveri yapılarıoluşturmakvemanipuleetmekiçin kullanılabilirler. • “Pointer”larsonraki slidelarımızda göreceğimizüzeredizilervestringlerle yakın birilişkiyesahiptirler.
Pointer DeğişkeniDeklare Etmeveİlk DeğerAtama • “Pointer”larda değişkenlerdiramadeğerolarakbellekadreslerinisaklarlar. • Şimdiyekadar gördüğümüz değişkenler belli değerleridepoluyorlardı. (Doğrudan Referans-DirectReference) • “Pointer”larise belli bir değeridepolayan değişkenlerinadreslerinisaklarlar. (Dolaylı Referans-Indirect reference) • Dolaylama (indirection)dediğimizşey yardımıyla“pointer”larıkullanarakbir değişkeni refereedebiliriz.
inty=5; int*yPtr=&y;
Pointer Değişkeni Deklare Etme ve İlk Değer Atama (Devam) • “Pointer”ların Deklare Edilmesi: • “*”karakteri (asterisk) bir pointer değişkeniniişareteder. • Örnek : • int *myPtr; //myPtr is a pointer to an integer • char*myPtr; //myPtr is a pointer to acharacter • Birdenfazla pointer birdenfazla asterisk işaretigerektirir. • int *myPtr1, *myPtr2; • “Pointer”lara İlk Değer Atanması(initialization): • “Pointer”lar 0 (sıfır), NULL ya da biradresi ilk değerolarak alırlar. • 0 veya NULL hiçbirşeyiişaretetmez.
ProgramlamaPratiği • Belkibirzorunluluk değildirama, bir pointer değişkeni tanımlarken değişken adının içinde“Ptr”karakterlerinikullanmakprogramcıya büyük kolaylıklarsağlar. (Neden?) (Daha önceki derslerimizde gördüğümüz notasyonları hatırlayınız.)
Pointer Operatörleri • AdresOperatörü (&) • “Operand”ının (işleneninin) bellektekiadresinigeriye döndürür. • Örnek: • int y=5;int *yPtr;yPtr=&y; • Son deyim, y değişkenininbellektekiadresini pointer değişkeniolanyPtryeatar. • Artık yPtrbellekteki y değişkeniniişareteder. (yPtr “points to” y)
Pointer Operatörleri (Devam) • “*” Operatorü • int y=5;int *yPtr;yPtr=&y; • Dolaylama (indirectionveya dereferencing)operatörüolarak da adlandırılır. • (*yPtr), y değişkeninin değerini yani 5 sayısınıgeriyedöndürür. (Çünkü yPtryyiişareteder.)
FonksiyonlaraParametreAktarılması • Fonksiyonlara 3 farklışekildeparametreaktarılabilir: • Değerle (pass-by-value) • Referansla (pass-by-reference with reference arguments) • Pointer referansıyla (pass-by-reference with pointer arguments) • Birfonksiyonsadece ve sadecebir değeri return deyimiilegeri döndürebilir. • Birfonksiyonareferanslaparametregöndererek orijinal değerlerifonksiyoniçinde değiştirmeimkanımız olurve böylecefonksiyondançıktığımızdafonksiyonuçağıranabirdenfazla değeri return etmişoluruz.
Pointer Referansıyla Fonksiyonlara Parametre Aktarılması • Fonksiyonlara referansla parametre iletilmesine benzer. • Parametre, adresiilebirlikte (&operatörü yardımıyla) fonksiyondakullanılır. • Diziler, fonksiyonargümanıolarakadresoperatörü (&) ilebirlikte gönderilmezler. (Çünküdizi adlarızatenbellek adresleridir.)
int n=sayi ataması gerçekleştirilir arka planda ve sayinin kopyası kullanılır.
int &n=sayi ataması gerçekleştirilir arka planda ve sayinin takma isimli orijinali kullanılır.
int *nPtr=&sayi ataması gerçekleştirilir arka planda ve sayinin adresi (orijinali) kullanılır.
Pointer Aritmetiği • Pointer değişkenleriüzerinde artırma/azaltmaoperatörlerinikullanabiliriz. (++veya--) • Bir pointer değişkeninebir integer değeriekleyipçıkarabiliriz. (+veya+=,-veya-=) • İki pointer değişkeninibirbirindençıkarabiliriz. Pointer aritmetiğinisadecebirdiziyiişaretedenpointerlarüzerindeuygulayabiliriz.
Pointer Aritmetiği • Örnek: • 5 elemanlı, integer değerlersaklayanbirdizive integer değişkenlerini4 byteüzerindensaklayanbirbilgisayar düşünelim. • Kabul edelimkivPtr pointerıbellekte 3000 adresindedizinin ilk elemanıolan v[0] ıişaretediyor. vPtr=v;veyavPtr=&v[0]; • vPtr+=2işlemivPtr pointer değişkenine 3008 değeriniatar. (3008=3000+2*4) • vPtr artık v[2]yiişareteder. • Örnek: (Pointer larüzerindeçıkarma işlemi) • EğervPtr2=&v[2];vevPtr1=&v[0];isevPtr2–vPtr1çıkarma işlemi2sonucunuverirvebusonuç bize, buikiadresarasındakaçelemansaklandığını gösterir. (vPtr2=vPtr1+2)
Pointer Aritmetiği • Pointerlaratamaoperatörü (=) ilebirliktekullanılabilirlerancakbu durum iki pointer değişkeninin de aynıveritipinesahipolmasıdurumundageçerlidir. Eğerveritiplerifarklıiseçevirmeişlemiiçin cast operatorükullanılmakzorundadır.
PointerlarveDiziler Arasındakiİlişki • Dizilervepointerlarbirbirleriyleçok yakındanilişkilidirler. • Birdizinin adısabit (constant) bir pointer gibi düşünülebilir. • Pointerlardizilerüzerindeindisoperasyonlarıiçin kullanılabilirler.
PointerlarveDiziler Arasındakiİlişki • Birdizininelemanlarına pointer yardımıylaulaşma: • Örnek: int b[5];int *bPtr;bPtr=b; • b[n]elemanına*( bPtr+n)ile de ulaşılabilir. Buna pointer/offset notasyonudenir. • Bellektekiadresleranlamında&b[3]ilebPtr+3aynışeyiifadeeder.
Pointerlar kare parantezler ve indislerle, benzer şekilde dizi değişkenleri de pointer/offsetnotasyonu ile kullanılabilirler.
“const”ın PointerlarlaBirlikteKullanımı • Birfonksiyona pointer değişkenliargüman göndermekiçin 4 yolvardır: • Non-constant pointer to non-constant data (Sabit olmayan pointer, sabit olmayan veri) • Data (veri) dereferenced pointer yardımıylamodifiyeedilebilir. • Pointer başkabirveriyiişaretedebilmeküzere değiştirilebilir. • Pointer deklarasyonu “const” içermez. karPtr = ; char *karPtr; (*karPtr) = ;
Sorular, Sorular, Sorular..... Soru1: Herhangi bir karakterin küçük mü veya büyük mü olduğunu nasıl test edersiniz? <cctype> include edilerek if(islower) if(isupper) if(isalpha(c)&&(c==tolower(c))) if(isalpha(c)&&(c==toupper(c)))
Sorular, Sorular, Sorular..... Soru2: Herhangi bir sayının tamsayı mı veya ondalıklı sayı mı olduğunu nasıl test edersiniz? ceil veya floor gibi herhangi bir yuvarlama fonksiyonu kullanılarak if(x==ceil(x)) if(x!=floor(x))
“const”ın PointerlarlaBirlikteKullanımı • Non-constant pointer to constant data (Sabit olmayan pointer, sabit veri) • Pointer değişkeni değerini değiştirebilir. • Amabu pointerın işaretettiği değişkenin değeribu pointer yardımıyla değiştirilemez. • Pass-by-reference ilesağlananperformansve pass-by-value ilesağlanan güvenlikbukullanımın artılarıdır. karPtr = ; const char *karPtr; X (*karPtr) = ;
“const”ın PointerlarlaBirlikteKullanımı • Constant pointer to non-constant data (Sabit pointer, sabit olmayan veri) • Pointer değişkenidaimaaynıbellekadresiniişareteder. Yani pointer değişkeninin değeri değiştirilemez. • Ama pointerın işaretettiği değişkenin değeri pointer yardımıyla değiştirilebilir. • Böyle bir pointerdeğişkeninine başlangıçta bir değeratanmalıdır. karPtr = ; X char*const karPtr = &x; (*karPtr) = ;
“const”ın PointerlarlaBirlikteKullanımı • Constant pointer to constant data (Sabit pointer, sabit veri) • Pointer değişkenidaimaaynıbellekadresiniişareteder. Yani pointer değişkeninin değeri değiştirilemez. • Benzerşekilde pointerınişaretettiği değişkenin değeri de pointer yardımıyla değiştirilemez. X karPtr = ; const char*const karPtr = &x; X (*karPtr) = ;
Neler Oluyor??? a bPtr cPtr dPtr 003CFC40 003CFC4C 003CFC40 003CFC34 7 003CFC34 003CFC4C