bm-104 nesneye yönelik programlama bahar 201 3 ( 7 . sunu ) ( yrd . do ç . dr. deniz dal)

33
BM-104 Nesneye Yönelik Programlama Bahar 2013 (7. Sunu) (Yrd. Doç. Dr. Deniz Dal)

Upload: camden-britt

Post on 30-Dec-2015

56 views

Category:

Documents


3 download

DESCRIPTION

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. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

BM-104

Nesneye Yönelik Programlama

Bahar 2013

(7. Sunu)

(Yrd. Doç. Dr. Deniz Dal)

Page 2: 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 çok güçlüdürler ama onları doğru kullanabilmeyi öğrenmek zaman alır.

“Pointer”lar fonksiyonlara referansla parametre aktarma amaçlı kullanılabilirler.

Daha önceki derslerimizde gördüğümüz diziler (arrays) statik veri yapılarındandı. “Pointer”lar dinamik veri yapıları oluşturmak ve manipule etmek için kullanılabilirler.

“Pointer”lar sonraki slide larımızda göreceğimiz üzere diziler ve stringlerle yakın bir ilişkiye sahiptirler.

Page 3: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Pointer Değişkeni Deklare Etme ve İlk Değer Atama

“Pointer”lar da değişkenlerdir ama değer olarak bellek adreslerini saklarlar.

Şimdiye kadar gördüğümüz değişkenler belli değerleri depoluyorlardı. (Doğrudan Referans-Direct Reference)

“Pointer”lar ise belli bir değeri depolayan değişkenlerin adreslerini saklarlar. (Dolaylı Referans-Indirect reference)

Dolaylama (indirection) dediğimiz şey yardımıyla “pointer” ları kullanarak bir değişkeni refere edebiliriz.

Page 4: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

int y=5;

int *yPtr=&y;

Page 5: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Pointer Değişkeni Deklare Etme ve İlk Değer Atama (Devam)

“Pointer”ların Deklare Edilmesi: “*” karakteri (asterisk) bir pointer değişkenini işaret

eder. Örnek :

• int *myPtr; //myPtr is a pointer to an integer• char *myPtr; //myPtr is a pointer to a character

Birden fazla pointer birden fazla asterisk işareti gerektirir.• int *myPtr1, *myPtr2;

“Pointer”lara İlk Değer Atanması (initialization):“Pointer”lar 0 (sıfır), NULL ya da bir adresi ilk değer

olarak alırlar. 0 veya NULL hiçbirşeyi işaret etmez.

Page 6: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Programlama Pratiği

Belki bir zorunluluk değildir ama, bir pointer değişkeni tanımlarken değişken adının içinde “Ptr” karakterlerini kullanmak programcıya büyük kolaylıklar sağlar. (Neden?) (Daha önceki derslerimizde gördüğümüz notasyonları hatırlayınız.)

Page 7: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Pointer Operatörleri

Adres Operatörü (&)“Operand”ının (işleneninin) bellekteki adresini geriye döndürür. Örnek:

int y=5;int *yPtr;yPtr=&y;

Son deyim, y değişkeninin bellekteki adresini pointer değişkeni olan yPtr ye atar.

Artık yPtr bellekteki y değişkenini işaret eder. (yPtr “points to” y)

Page 8: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Pointer Operatörleri (Devam)

“*” Operatorüint y=5;

int *yPtr;yPtr=&y;

Dolaylama (indirection veya dereferencing) operatörü olarak da adlandırılır.

(*yPtr), y değişkeninin değerini yani 5 sayısını geriye döndürür. (Çünkü yPtr y yi işaret eder.)

Page 9: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 10: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Fonksiyonlara Parametre Aktarılması

Fonksiyonlara 3 farklı şekilde parametre aktarılabilir:Değerle (pass-by-value)Referansla (pass-by-reference with reference arguments)Pointer referansıyla (pass-by-reference with pointer arguments)

Bir fonksiyon sadece ve sadece bir değeri return deyimi ile geri döndürebilir.

Bir fonksiyona referansla parametre göndererek orijinal değerleri fonksiyon içinde değiştirme imkanımız olur ve böylece fonksiyondan çıktığımızda fonksiyonu çağırana birden fazla değeri return etmiş oluruz.

Page 11: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Pointer Referansıyla Fonksiyonlara Parametre Aktarılması

Fonksiyonlara referansla parametre iletilmesine benzer.

Parametre, adresi ile birlikte (& operatörü yardımıyla) fonksiyonda kullanılır.

Diziler, fonksiyon argümanı olarak adres operatörü (&) ile birlikte gönderilmezler. (Çünkü dizi adları zaten bellek adresleridir.)

Page 12: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

int n=sayi

ataması gerçekleştirilir arka planda ve sayi nin kopyası kullanılır.

Page 13: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

int &n=sayi

ataması gerçekleştirilir arka planda ve sayi nin takma isimli orijinali kullanılır.

Page 14: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

int *nPtr=&sayi

ataması gerçekleştirilir arka planda ve sayi nin adresi (orijinali) kullanılır.

Page 15: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Toplu Halde

PROTOTİP KULLANIM TANIM

DEĞER İLE int Fonk(int); int sayi=5;sayi=Fonk(sayi);

int Fonk(int n){}

REFERANS İLE void Fonk(int&); int sayi=5;Fonk(sayi);

void Fonk(int &n){}

POİNTER REFERANSI İLE

void Fonk(int*); int sayi=5;Fonk(&sayi);

void Fonk(int *nPtr){}

Page 16: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Pointer Aritmetiği

Pointer değişkenleri üzerinde artırma/azaltma operatörlerini kullanabiliriz. (++ veya --)

Bir pointer değişkenine bir integer değeri ekleyip çıkarabiliriz. (+ veya +=,- veya -=)

İki pointer değişkenini birbirinden çıkarabiliriz.

Pointer aritmetiğini sadece bir diziyi işaret eden pointerlar üzerinde uygulayabiliriz.

Page 17: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Pointer AritmetiğiÖrnek:

5 elemanlı, integer değerler saklayan bir dizi ve integer değişkenlerini 4 byte üzerinden saklayan bir bilgisayar düşünelim.

Kabul edelim ki vPtr pointerı bellekte 3000 adresinde dizinin ilk elemanı olan v[0] ı işaret ediyor.

vPtr=v; veya vPtr=&v[0]; vPtr+=2 işlemi vPtr pointer değişkenine 3008 değerini atar.

(3008=3000+2*4)vPtr artık v[2] yi işaret eder.

Örnek: (Pointer lar üzerinde çıkarma işlemi) Eğer vPtr2=&v[2]; ve vPtr1=&v[0]; ise vPtr2–vPtr1 çıkarma işlemi 2 sonucunu verir ve bu sonuç bize, bu iki adres arasında kaç eleman saklandığını gösterir. (vPtr2=vPtr1+2)

Page 18: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 19: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Pointer Aritmetiği

Pointerlar atama operatörü (=) ile birlikte kullanılabilirler ancak bu durum iki pointer değişkeninin de aynı veri tipine sahip olması durumunda geçerlidir. Eğer veri tipleri farklı ise çevirme işlemi için cast operatorü kullanılmak zorundadır.

Page 20: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Pointerlar ve Diziler Arasındaki İlişki

Diziler ve pointerlar birbirleriyle çok yakından ilişkilidirler. Bir dizinin adı sabit (constant) bir pointer gibi

düşünülebilir. Pointerlar diziler üzerinde indis operasyonları için

kullanılabilirler.

Page 21: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Pointerlar ve Diziler Arasındaki İlişki

Bir dizinin elemanlarına pointer yardımıyla ulaşma:Örnek:

int b[5]; int *bPtr; bPtr=b;

b[n] elemanına *( bPtr+n) ile de ulaşılabilir. Buna pointer/offset notasyonu denir.

Bellekteki adresler anlamında &b[3] ile bPtr+3 aynı şeyi ifade eder.

Page 22: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 23: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Pointerlar kare parantezler ve indislerle, benzer şekilde dizi değişkenleri de pointer/offset notasyonu ile kullanılabilirler.

Page 24: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

“const”ın Pointerlarla Birlikte Kullanımı

Bir fonksiyona pointer değişkenli argüman göndermek için 4 yol vardır:

Non-constant pointer to non-constant data

(Sabit olmayan pointer, sabit olmayan veri)Data (veri) dereferenced pointer yardımıyla modifiye

edilebilir.Pointer başka bir veriyi işaret edebilmek üzere

değiştirilebilir.Pointer deklarasyonu “const” içermez.

char *karPtr;karPtr = ;

(*karPtr) = ;

Page 25: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 26: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Soru1: Herhangi bir karakterin küçük mü veya büyük mü olduğunu nasıl test edersiniz?

Sorular, Sorular, Sorular.....

<cctype> include edilerek

if(islower)

if(isupper)

if(isalpha(c)&&(c==tolower(c)))

if(isalpha(c)&&(c==toupper(c)))

Page 27: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Soru2: Herhangi bir sayının tamsayı mı veya ondalıklı sayı mı olduğunu nasıl test edersiniz?

Sorular, Sorular, Sorular.....

ceil veya floor gibi herhangi bir yuvarlama fonksiyonu

kullanılarak

if(x==ceil(x))

if(x!=floor(x))

Page 28: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

“const”ın Pointerlarla Birlikte Kullanımı

Non-constant pointer to constant data

(Sabit olmayan pointer, sabit veri)Pointer değişkeni değerini değiştirebilir. Ama bu pointerın işaret ettiği değişkenin değeri bu

pointer yardımıyla değiştirilemez. Pass-by-reference ile sağlanan performans ve pass-

by-value ile sağlanan güvenlik bu kullanımın artılarıdır.

const char *karPtr;karPtr = ;

(*karPtr) = ; X

Page 29: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 30: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 31: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

“const”ın Pointerlarla Birlikte Kullanımı

Constant pointer to non-constant data

(Sabit pointer, sabit olmayan veri)Pointer değişkeni daima aynı bellek adresini işaret

eder. Yani pointer değişkeninin değeri değiştirilemez.Ama pointerın işaret ettiği değişkenin değeri pointer

yardımıyla değiştirilebilir. Böyle bir pointer değişkeninine başlangıçta bir değer

atanmalıdır.

char *const karPtr = &x;karPtr = ;

(*karPtr) = ;

X

Page 32: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

“const”ın Pointerlarla Birlikte Kullanımı

Constant pointer to constant data

(Sabit pointer, sabit veri)Pointer değişkeni daima aynı bellek adresini işaret

eder. Yani pointer değişkeninin değeri değiştirilemez.Benzer şekilde pointerın işaret ettiği değişkenin

değeri de pointer yardımıyla değiştirilemez.

const char *const karPtr = &x;karPtr = ;

(*karPtr) = ; X

X

Page 33: BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 7 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Neler Oluyor???

7

a

003CFC4C003CFC4C

bPtr

003CFC40003CFC40

cPtr

003CFC34003CFC34

dPtr