Pointers Java haric, cogu programming languages memory address lerine ait abstract data type destigine sahiptirler C++ da buna pointer denir Pointers lar data structures ve parameter passing in karmasikligini artirirlar Avantaj, dezavantaj Gozlem: C ve C++ la yazili programlardaki bug larin cogu pointer hatalarindan kaynaklanmaktadir 10/21/2004 Nesneye Yonelik Programlama 5.1 Pros and Cons of Pointers Avantajlar List, queue, tree, gibi extensible ve flexible data structure larinin olusturulmasi Buyuk ve degisken buyuklu object lerin fonksiyonlara parameter passing i Dezavantajlar Bir cok programlama hatalarinin kaynagi Machine-dependent kodlara yol acabilir 10/21/2004 Nesneye Yonelik Programlama 5.2 10/21/2004 Nesneye Yonelik Programlama 5.3 10/21/2004 Nesneye Yonelik Programlama 5.4
Pointer Declaration icin Iki Farkli Style int *counterptr, counter; // a pointer to an int variable and an int variable int * counterptr1, counterptr2; // a pointer to an int variable and an int variable int *counterptr1, *counterptr2; // two pointers to int variables Pointer Initialization Pointer larin numerical degerleri genelde kullaniciya acik degildir. Degerler calisan program icinde saklidir Pointer ler nasil baslatilir Eger ozel integer degeri 0 atanirsa, belirlenmemis bir pointer degeri atanir (NULL) Address operator & kullanilarak bir object e pointer elde edilir Memory allocation operator new kullanilarak, yeni create edilen object e iliskin pointer elde edilir 10/21/2004 Nesneye Yonelik Programlama 5.5 10/21/2004 Nesneye Yonelik Programlama 5.6 Pointer Operators Address operator & Operand in address ini geri dondurur Indirection (dereferencing operator) * Pointer (address) bilgisini ilgili object in ismine donusturur Ornek: *counterptr = *counterptr + 1; CounterPtr nin icerigi degismez 0a dereference yapmak run-time error a sebep olur Pointers lere devam & ve * birbirinin inverse idir (*&identifier = = identifier ) is true (&*identifier = = identifier ) is true (*&identifier == &*identifier) is true C++ da unary operator ler (++, --, -, &, *) right associative dir. 10/21/2004 Nesneye Yonelik Programlama 5.7 10/21/2004 Nesneye Yonelik Programlama 5.8
Passing parameters to Functions Call-by-value: int square ( int value); int square ( int a[0]); Call-by-reference: void square ( int &value); int bublesort (int a[ ], int asize); Call-by-reference using pointers: void square ( int *valueptr); int bublesort ( int *a, int asize); Pointers ve Array Notation sortarray ( int array[ ], int arraysize); sortarray (int *const array, int arraysize); Yukaridaki iki decleration C++ compiler i tarafindan ayni algilanir Array in ismi arrayin ilk element ine point eden constant pointer olarak kabul edilir &array[0] ile array ayni seydir 10/21/2004 Nesneye Yonelik Programlama 5.9 10/21/2004 Nesneye Yonelik Programlama 5.10 Passing const pointers Nonconstant pointer to constant data ornek: void converttouppercase (char *); called function pointer i ve pointer in point ettigi data yi degistirebilir Nonconstant pointer to constant data ornek: void printcharacters (const char *); array a pointer gecirilerek, array in icerigi degistirilemez fakat pointer in degeri degistirilerek array taranabilir 10/21/2004 Nesneye Yonelik Programlama 5.11 Passing const pointers Constant pointer to nonconstant data Ornek: int array[100]; int *const baseptr = &array[0]; void processarray( int * const baseptr); pointer degistirilemez, fakat array in element leri pointer araci ligiyle degistirilebilir Constant pointer to constant data Ornek: int x = 5; const int *const ptr = &x; void useconstant ( const int * const ptr); function ne pointer i nede pointer in point ettigi data yi degistirebilir 10/21/2004 Nesneye Yonelik Programlama 5.12
Ornek: non-const Pointer to const Data #include <iostream.h> using namespace std; void printcharacters (const char *); int main() { char string[ ] = Print characters of a string ; printcharacters(string); return 0; } void printcharacters (const char *sptr) { for (; *sptr!= \0 ; sptr++) cout << *sptr; } 10/21/2004 Nesneye Yonelik Programlama 5.13 BubbleSort Using Call-by- Reference #include <iostream> #include <iomanip> using namespace std; void bublesort (int *, const int); void swap (int *, int *); int main( ) { const int arraysize = 10; int a[arraysize] = { 2, 6, 4, 10, 12, 89, 68, 45, 37}; bublesort (a, arraysize); for (int i=0; i < arraysize; i++) cout << setw(4) << a[i]; cout << endl; return 0; } 10/21/2004 Nesneye Yonelik Programlama 5.14 void bublesort ( int *array, const int size) { for (int pass=0; pass < size; pass++) for (int j=0; j <size-1; j++) if (array[j] > array[j+1]) swap (&array[j], &array[j+1] ); } void swap ( int *element1ptr, int *element2ptr) { int hold = *element1ptr; *element1ptr = *element2ptr; *element2ptr = hold; } sizeof Operator sizeofoperator kullanilarak variable, array ve diger object lerin byte cinsinden kapladiklari alanlar bulunur Ornek: int count; cout << sizeof count << endl; // parantheses optional sizeofoperator kullanilarak herhangi bir type ait olan object lerin kapladiklari alanlar bulunabilir Ornek: cout << sizeof (int) << endl; // parantheses required 10/21/2004 Nesneye Yonelik Programlama 5.15 10/21/2004 Nesneye Yonelik Programlama 5.16
float *ptrfloat; int *ptrint; double *ptrdouble; sizeof operator sizeof ptrfloat = sizof ptrint = sizeof ptrdouble Pointerin refer ettigi object in type i ne olursa olsun pointerin size i aynidir. Pointer Arithmetic operators Operator Semantic ++ Increment pointer by object size -- Decrement pointer by object size +, += Add multiple of object size to pointer -, -= Subtract multiple of object size from pointer - Subtract two pointers and give the difference in multiplies of the object size 10/21/2004 Nesneye Yonelik Programlama 5.17 10/21/2004 Nesneye Yonelik Programlama 5.18 Pointer Arithmetic // assume 4-byte (32-bit) integers int a[5] = { 3, 1, 8, 4, 2}; int *aptr1 = &a[0]; // point to first int *aptr2; // array element // assume aptr1 has value 3000 aptr1++; // aptr1 now has value 3004 aptr2 = aptr1 + 3; // aptr2 is now 3016 aptr1 += 2; aptr2 -= 1; cout << The pointer difference is << aptr1 aptr2 << endl; Pointer lar kullanilarak Array lere erisim int b[5]; const int *bptr; bptr = b; // same as bptr = &b[0]; Array Notation Pointer Semantic b[0] *bptr First element b[3] *(bptr+3) Fourth element &b[2] bptr+2 Address of 3 rd element b[4] bptr[4] Fifth element b[1] *(b+1) Second element 10/21/2004 Nesneye Yonelik Programlama 5.19 10/21/2004 Nesneye Yonelik Programlama 5.20
Arrays of Pointers /String Arrays char *suit[4] = { Hearts, Diamonds, Clubs, Spades }; [4] array in 4 elemeti oldugunu gosterir Her bir element char a pointer suit[0] suit[1] suit[2] suit[3] H e a r t s \0 D i a m o n d s \0 C u l u b s \0 S p a d e s \0 Strings Character constants Ornek: a, Z, \n, \0, character ler tek tirnak icinde gosterilirler character ler memory de integer lar olarak saklanirlar String constants Ornek: University of California, a, bir dizi character string ler cift tirnakla gosterilirler bellekte character dizisi seklinde saklanirlar string ismi gercekte string in ilk characterine isaret eden const pointer olarak algilanir string in son character i \0 dir 10/21/2004 Nesneye Yonelik Programlama 5.21 10/21/2004 Nesneye Yonelik Programlama 5.22 String Declaration Function lara pointer char color[]= blue ; blue ile initialize edilen array of char char color[] = { b, l, u, e, \0 }; Yukaridaki ile ayni char *colorptr = blue ; string blue yu iceren array a isaret edilen pointer olusturulur 10/21/2004 Nesneye Yonelik Programlama 5.23 Function a pointer, bir function a fuction lari parameter olarak gecirmek icin kullanilir Pointer e dereference edilerek ilgili function cagrilir Syntax: int (*compare ) (int, int) Semantics: compare isminde function a pointer tanimlanir, ilgili function type I int olan iki parametreye sahip ve geriye int cevirir int * compare (int, int) ile int (*compare ) (int, int) ayni sey degil 10/21/2004 Nesneye Yonelik Programlama 5.24
Ornek Ya ascending ya da descending order da siralama yapan bublesort functionu tanimlanacak Function pointer i kullanilarak, muhtemel iki function (ascending,descending) dan biri cagrilacak 10/21/2004 Nesneye Yonelik Programlama 5.25 10/21/2004 Nesneye Yonelik Programlama 5.26 10/21/2004 Nesneye Yonelik Programlama 5.27 10/21/2004 Nesneye Yonelik Programlama 5.28
10/21/2004 Nesneye Yonelik Programlama 5.29 10/21/2004 Nesneye Yonelik Programlama 5.30 int a[5] Array Pointers ve Function pointers arasindaki analogy // 5 elementli bir dizi tanimlanir // a ilk elemente point edwer int (*functionptr) (int) // integer geri donduren ve bir integer // parameter I olan function a pointer // tanimlanir 10/21/2004 Nesneye Yonelik Programlama 5.31 Array in ismi array in ilk element ine poin eder Array i call-by-reference ile function a gecirmek istedigimizde sadece ismine ihtiyac var Array a dereference edilerek element lere erisim saglanir Analogy (devam) Function pointer in ismi function un ilk instruction a isret eder Call-by-reference le function u baska function a parameter olarak gecirmek istedigimizde sadece ismine gerek duyulur Dereferencing function a pointer function u execute sebep olur 10/21/2004 Nesneye Yonelik Programlama 5.32
10/21/2004 Nesneye Yonelik Programlama 5.33