bilgisayar programlama 1hbahtiyar/dersler/icerik/cplusplus-ders11.pdfpointerlar pointerları,...
Post on 04-Mar-2020
16 Views
Preview:
TRANSCRIPT
Pointer Nedir
❖ İşaretçiler (pointerlar) C++ dilinin en temel yapı taşlarından biridir.
❖ İşaretçiler konusu C++’ı diğer dillerden ayıran en önemli özelliklerinden biridir.
❖ C++’ta işaretçiler değişkenlerin bellekteki adreslerini tutabilme ve onlarla işlem yapabilme olanağı sağlar.
Pointerlar❖ Pointerları, verilerin bilgisayar hafızasında tutulduğu fiziki adresi
olarak tanımlayabiliriz.
❖ Donanımsal açıdan bakıldığında bu adres bellekte yer gösteren bir sayıdır.
❖ İşlemci, bellekteki bir yere o bölgenin adres bilgisiyle erişebilir.
❖ Değişkenlerin adresleri, genelde, derleyici ve işletim sistemi tarafından ortaklaşa olarak belirlenir.
❖ Değişken adresleri program çalışmadan önce kesin olarak bilinemez ve önceden tespit edilemez.
❖ Programcı adresleri ancak programın çalışması sırasında görebilir.
Pointerlar
❖ Belli bir tipte değişken tanımlanıp ve bir değer atandığı zaman, o değişkene dört temel özellik eşlik eder:
❖ değişkenin adı
❖ değişkenin tipi
❖ değişkenin sahip olduğu değer (içerik)
❖ değişkenin bellekteki adresi
❖ Pointerlara, veriler değil, ilgili verilerin bellekte saklı olduğu bellek alanlarının başlangıç adresleri atanır.
❖ Pointer, diğer değişkenler gibi, sayısal bir değişkendir.
❖ Bu sebeple kullanılmadan önde program içinde bildirilmelidir.
Pointerlar
Referans Operatörü
❖ Pointerlar konusunda bilmemiz gereken 2 adet önemli operatör vardır. Bunlar;
❖ Referans Operatörü &
❖ De Referans ( Referanstan ayırma) Operatörü *
❖ Pointerlar tek başlarına değer alamazlar bunun için başka bir değişkeni referans almak zorundadırlar.
❖ Referans (Adres) operatörü değişkenin hafızada saklandığı yeri (adresini) gösterir
Referans (Adres) Operatörü
foo = &myvar;myvar = 25;
foo = &myvar;bar = myvar;
Pointer Tanımlamak❖ Pointerı aşağıdaki gibi tanımlayabiliriz.
❖ Eğer * işaretini değişkeni tanıtırken kullanırsak, o değişkeni pointer olarak tanımlarız.
❖ Eğer program içerisinde bir değişkenin önüne eklersek, kayıtlı adres üzerindeki değeri gösterir.
<Değişken Türü> *<Değişken Adı>
Referans Operatörü Örnek
❖ isaret isimli işaretçi okul_no isimli değişkeni referans olarak alıyor, böylece isaret = okul_no adresi diyebiliriz.
❖ Genel açıdan bakarsak isaret isimli işaretçi int tipindeki herhangi bir değişkenin adresini tutabilir.
❖ isaret değişkenine okul_no nun adresini atayabilmek için pointer şeklinde tanımlamamız gerekiyor.
❖ isaret=&okul_no; işleminde okul_no değişkeninin referansının atanması için * işaretini koymuyoruz.
int *isaret;int okul_no=453; isaret=&okul_no;
Pointer Örneği#include <iostream>using namespace std;int main (){ int ilksayi, ikincisayi; int * mypointer; mypointer = &ilksayi; *mypointer = 10; mypointer = &ikincisayi; *mypointer = 20; cout << "İlk Sayi = " << ilksayi << '\n'; cout << "İkinci Sayi = " << ikincisayi << '\n'; return 0;}
Pointer Örneği#include <iostream>using namespace std;int main (){ int ilksayi, ikincisayi; int * mypointer; mypointer = &ilksayi; *mypointer = 10; mypointer = &ikincisayi; *mypointer = 20; cout << "İlk Sayi = " << ilksayi << '\n'; cout << "İkinci Sayi = " << ikincisayi << '\n'; return 0;}
int değişkenlerini tanımladım
Pointer Örneği#include <iostream>using namespace std;int main (){ int ilksayi, ikincisayi; int * mypointer; mypointer = &ilksayi; *mypointer = 10; mypointer = &ikincisayi; *mypointer = 20; cout << "İlk Sayi = " << ilksayi << '\n'; cout << "İkinci Sayi = " << ikincisayi << '\n'; return 0;}
int tipinde pointer tanımladım
Pointer Örneği#include <iostream>using namespace std;int main (){ int ilksayi, ikincisayi; int * mypointer; mypointer = &ilksayi; *mypointer = 10; mypointer = &ikincisayi; *mypointer = 20; cout << "İlk Sayi = " << ilksayi << '\n'; cout << "İkinci Sayi = " << ikincisayi << '\n'; return 0;}
ilksayı değişkeninin adresinimypointer değişkenine atadım
Pointer Örneği#include <iostream>using namespace std;int main (){ int ilksayi, ikincisayi; int * mypointer; mypointer = &ilksayi; *mypointer = 10; mypointer = &ikincisayi; *mypointer = 20; cout << "İlk Sayi = " << ilksayi << '\n'; cout << "İkinci Sayi = " << ikincisayi << '\n'; return 0;}
mypointer değerini 10 olarak atadım
Pointer Örneği#include <iostream>using namespace std;int main (){ int ilksayi, ikincisayi; int * mypointer; mypointer = &ilksayi; *mypointer = 10; mypointer = &ikincisayi; *mypointer = 20; cout << "İlk Sayi = " << ilksayi << '\n'; cout << "İkinci Sayi = " << ikincisayi << '\n'; return 0;}
ikincisayi değişkeninin adresinimypointer değişkenine atadım
Pointer Örneği#include <iostream>using namespace std;int main (){ int ilksayi, ikincisayi; int * mypointer; mypointer = &ilksayi; *mypointer = 10; mypointer = &ikincisayi; *mypointer = 20; cout << "İlk Sayi = " << ilksayi << '\n'; cout << "İkinci Sayi = " << ikincisayi << '\n'; return 0;}
mypointer değerini 2 olarak değiştirdim
Pointer Örneği#include <iostream>using namespace std;int main (){ int ilksayi, ikincisayi; int * mypointer; mypointer = &ilksayi; *mypointer = 10; mypointer = &ikincisayi; *mypointer = 20; cout << "İlk Sayi = " << ilksayi << '\n'; cout << "İkinci Sayi = " << ikincisayi << '\n'; return 0;}
cout lar nasıl çıktı verecek?
Pointer Örneği#include <iostream>using namespace std;int main (){ int ilksayi, ikincisayi; int * mypointer; mypointer = &ilksayi; *mypointer = 10; mypointer = &ikincisayi; *mypointer = 20; cout << "İlk Sayi = " << ilksayi << '\n'; cout << "İkinci Sayi = " << ikincisayi << '\n'; return 0;}
1020
Pointer Örneği#include <iostream>using namespace std;int main (){ int ilksayi, ikincisayi; int * mypointer; mypointer = &ilksayi; *mypointer = 10; mypointer = &ikincisayi; *mypointer = 20; cout << "İlk Sayi = " << ilksayi << '\n'; cout << "İkinci Sayi = " << ikincisayi << '\n'; return 0;}
1020
Peki neden?
Pointer Örneği 2#include <iostream>using namespace std;int main (){ int ilksayi = 5, ikincisayi = 15; int * p1, * p2; p1 = &ilksayi; p2 = &ikincisayi; *p1 = 10; *p2 = *p1; p1 = p2; *p1 = 20;
cout << "İlk sayi :: " << ilksayi << '\n'; cout << "İkinci Sayi :: " << ikincisayi << '\n'; return 0;}
Programın çıktısı nedir?Tartışalım
Pointer ve Diziler
❖ Diziler uygun tipteki işaretçilere dönüştürülebilir.
❖ Statik değişkenler ve diziler için programın ilk çalışma anında bellekte yer ayrılır ve bu yer program bitine kadar tutulur.
❖ Pointerlar da ise bellek ayrımı derleme aşamasında değil çalışma sırasında olur. Bu şekilde kullanılan değişkenlere dinamik değişken denir.
Pointerlar ve Diziler Örnek#include <iostream>using namespace std;int main (){ int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0;}
numbers isimli 5 elemanlı bir dizi oluşturduk.p isimli pointer oluşturduk
Pointerlar ve Diziler Örnek#include <iostream>using namespace std;int main (){ int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0;}
numbers dizisi p pointerını birbirine eşitledik
Pointerlar ve Diziler Örnek#include <iostream>using namespace std;int main (){ int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0;}
ilk elemanı 10 yaptık
Pointerlar ve Diziler Örnek#include <iostream>using namespace std;int main (){ int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0;}
p yi 1 arttırdık
Pointerlar ve Diziler Örnek#include <iostream>using namespace std;int main (){ int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0;}
ikinci elemanı 20 olarak atadık
Pointerlar ve Diziler Örnek#include <iostream>using namespace std;int main (){ int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0;}
numbers dizisinin 3. elemanının adresini aldık
Pointerlar ve Diziler Örnek#include <iostream>using namespace std;int main (){ int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0;}
40 olarak atadık
Pointerlar ve Diziler Örnek#include <iostream>using namespace std;int main (){ int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0;}
Dizinin 3. elemanına eriştik
Pointerlar ve Diziler Örnek#include <iostream>using namespace std;int main (){ int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0;}
Dizinin 4. elemanını 50 olarak atadık
Pointer ile Dizi içinde dolaşmak#include <iostream>using namespace std;int main (){ int dizi[5]={11,22,33,44,55}; int * p = dizi;for(int i =0; i<5; i++){ cout<<“dizi elemanı ”<< dizi[i]<<endl; cout<<“pointer ile ”<<*(p+i)<<endl; cout<<“dizinin adresi “<<&dizi[i]<<endl; cout<<“pointer’in adresi “<<&p[i]<<endl; }}
Pointer ile Dizi içinde dolaşmak#include <iostream>using namespace std;int main (){ int dizi[5]={11,22,33,44,55}; int * p = dizi;for(int i =0; i<5; i++){ cout<<“dizi elemanı ”<< dizi[i]<<endl; cout<<“pointer ile ”<<*(p+i)<<endl; cout<<“dizinin adresi “<<&dizi[i]<<endl; cout<<“pointer’in adresi “<<&p[i]<<endl; }}
Dinamik diziler❖ Pointerlar da ise bellek ayrımı derleme aşamasında değil
çalışma sırasında olur. Bu şekilde kullanılan değişkenlere dinamik değişken denir.
❖ new ve delete komutları ile C++ da dinamik dizi oluşturabiliriz.
❖ new komutu ile dinamik dizi oluşturur.
❖ delete komutu ile oluşturulan diziyi silebiliriz
degisken_adi = new veritipi [eleman_sayısı];
delete degisken_adi;
Dinamik Diziler Örnek#include <iostream>using namespace std;int main (){ int * p; p = new int [3]; p[0] =11; p[1] =22; p[2] =33; p[3] =44; cout <<p[3]<<endl; delete p; return 0;}
İşaretçinin işaretçisi
❖ Şu ana dek incelediğimiz tüm işaretçiler bir değişkene yada bir sabite işaret ediyordu (adresini içeriyordu).
❖ Bir pointer’ın bir başka pointer’a işaret etmesi mümkündür. Bu durumdaki pointerların başında ** işleci getirilir.
Fonksiyonda İşaretçiler
❖ Fonksiyonları tanımlarken parametreleri istediğimiz gibi tanımlayabiliriz.
❖ Bu parametreler işaretçi de olabilir. İki tip parametre kullanabiliriz
❖ Değer göndererek kullanılan fonksiyonlar (Call by value)
❖ Referans göndererek kullanılan fonksiyon (Call by reference)
Kaynaklar!http://www.cplusplus.com/doc/tutorial/ !www.py4e.com !C++ How to program (Deitel) !Ferhat Özok Bilgisayar Programlama I ders notları
40
top related