BİLGİSAYAR PROGRAMLAMA Ders 11: İşaretçi (Pointer) Kullanımı Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.

Slides:



Advertisements
Benzer bir sunumlar
Bölüm 8 Diziler Dizi Tanımı Dizi Elemanlarına Değer Atama
Advertisements

Göstericiler (Pointers)
Tanım Birbirleriyle ilişkili ve bitişik iki ya da daha fazla bellek hücresinden oluşan yapı Örnek dizi tanımı: int tamsayiDizi[10]; tamsayiDizi[0] /*ilk.
Bölüm 10 Yapılar ve Birleşimler
Diziler Adres Kavramı Nesnelerin Adresleri sizeof Operatörü
Diziler (Arrays).
DİZİLER Arrays.
Doç. Dr. Cemil Öz SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz.
Algoritma.  Algoritma, belirli bir görevi yerine getiren sonlu sayıdaki işlemler dizisidir.  Başka bir deyişle; bir sorunu çözebilmek için gerekli olan.
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 11: Birden Çok Form ile Çalışma ve Menü Oluşturma Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
BİLGİSAYAR PROGRAMLAMA Ders 8: Fonksiyonlar Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
Arduino nedir ? Atmega 328P Microcontroller USB ile bilgisayara bağlanır. Basit bir kullanımı olup kullanıcı dostudur. C++ tabanlı Arduino yazılımı ile.
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
İŞLETİM SİSTEMLERİ ISE 206 DR. TUĞRUL TAŞCI. Dersin Amacı Bilgisayar sistemlerinin temel organizasyonunu tanımak İşletim sistemlerinin ana bileşenlerini.
BÖLÜM 4 PROGRAMLAMA DİLLERİ. PROGRAMLAMA DİLLERİNDE KULLANILAN VERİ TİPLERİ Bilgisayarda işlenen veriler iki türdür: Sayısal Alfasayısal.
Hopfield Ağı Ayrık zamanSürekli zaman Denge noktasının kararlılığı Lyapunov Anlamında kararlılık Lineer olmayan sistemin kararlılığı Tam Kararlılık Dinamik.
TC Windows Editörü DevC++. KURULUM PROGRAMIN KURULACAĞI YER BURADA BELİRLENİYOR.
Bağlama ve Kapsam Kavramları
Örnek Sorular Bilgisayar Programlama BIL 107. Soru 1: Ekran çıktısında 66 yazması için boşlukları doldurunuz ______ i = 'A'; printf(____, i__); CEVAP:
Bölüm 5 Döngü Komutları while Komutu while Komutu Diğer Operatörler (Bileşik atama, artırma ve azaltma operatörleri ) Diğer Operatörler (Bileşik atama,
Doç. Dr. Cemil Öz SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz.
1 Bölüm 2 C Dilinin Temelleri Alıştırmalar Bu bölümdeki problemler “C Dersi Çözümlü Problem Kitabı”, N. E. Ça ğ ıltay, C. E. Selbes, G. Tokdemir, ve Ç.
Bölüm 2 C Dilinin Temelleri
BİLGİSAYAR PROGRAMLAMA DERSİ
İndeksi Niçin Kullanırız?
3. DEĞİŞKENLER Değişkenlerin kullanım ve tanımlanma şekli, o dilde program yapmayı ve programların anlaşılırlığını etkileyen önemli faktörlerden biridir.
FONKSİYONLAR.
Printf Bu komut ekrana çıktı veren komuttur. Pascalda kullanılan writeln komutuyla aynı anlamdadır.
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler
JDK(Java  Development  Kit):  Java  kodlarını  derlemek  için gerekli  geliştirme  ortamını.
C Programlama Dili Çağdaş Hakan Aladağ.
Algoritma ve Programlamaya Giriş
Ayrık Zaman Hopfield Ağı ile Çağrışımlı Bellek Tasarımı
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler
Mikroişlemciler Temel I/O Arayüzleri.
BİLGİSAYAR PROGRAMLAMA Ders 3: C ile Programlamaya Giriş
Veri Yapıları ve Algoritmalar
BİLGİSAYAR PROGRAMLAMA Ders 5: Döngüler
BİLGİSAYAR PROGRAMLAMA Ders 11: İşaretçi (Pointer) Kullanımı
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 6: Sınıflar
Mikroişlemciler Temel I/O Arayüzleri.
Algoritma ve Programlamaya Giriş
BİLGİSAYAR PROGRAMLAMA Ders 4: Koşula Göre İşlem Yapma
DOSYA BÜYÜKLÜKLERİ İkili Sistem Dosya Büyüklükleri ve Hesaplamalar
Kırınım, Girişim ve Müzik
Bölüm 3 Atama ve Girdi/Çıktı Komutları
PROBLEM ÇÖZME VE ALGORİTMALAR
3.hafta METODLAR.
BİLGİSAYAR programlama II
NİŞANTAŞI ÜNİVERSİTESİ
Arduino Programlama Dili
MİKROİŞLEMCİLER VE MİKROBİLGİSAYARLAR
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
Bilgisayar Bilimi Koşullu Durumlar.
?: KARŞILAŞTIRMA OPERATÖRÜ
NİŞANTAŞI ÜNİVERSİTESİ
Bilgisayar Bilimi Fonksiyon Yazma.
Değerler ve Değişkenler
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
BLM-111 PROGRAMLAMA DİLLERİ I Ders-10 Diziler
NİŞANTAŞI ÜNİVERSİTESİ
MTM216 GÖRSEL PROGRAMLAMA
MTM216 GÖRSEL PROGRAMLAMA
Kesikli Olay benzetimi Bileşenleri
NİŞANTAŞI ÜNİVERSİTESİ
Diziler(Arrays).
Sunum transkripti:

BİLGİSAYAR PROGRAMLAMA Ders 11: İşaretçi (Pointer) Kullanımı Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği

İşaretçi (Pointer) İçerisinde bellek adresi tutan değişkendir. Daha önce gösterilen tüm değişkenler tanımlandıkları türe göre bir değer saklıyor ve bu değere ulaşılmak istendiğinde doğrudan değişkenin ismi ile erişilebiliyordu. İşaretçiler ise değerin bulunduğu bellek hücresinin adresini tutmak sureti ile dolaylı olarak değere erişebilirler.

İşaretçi Tanımlama İşaretçiler de değişkenler gibi kullanılmadan önce tanımlanmalıdır. Değişken tanımından farkı işaretçiye verilen isimden önce * işareti yer alır: int *ptr; Burada tanımlanan ptr aslında işletim sisteminin atadığı adresin değerini saklar. O adreste saklanan değere ise *ptr yazılarak yani o adres işaret edilerek ulaşılır adres (ptr) değer (*ptr)

İşaretçinin Boyutu İşaret ettiği verinin türü ne olursa olsun işaretçiler 32-bit işletim sistemlerinde 32 bit (4 byte), 64-bit işletim sistemlerinde 64 bit (8 byte) yer kaplar. main(){ char *cptr; int *iptr; double *dptr; printf("%d\n", sizeof(cptr)); printf("%d\n", sizeof(iptr)); printf("%d\n", sizeof(dptr)); printf("%d\n", sizeof(*cptr)); printf("%d\n", sizeof(*iptr)); printf("%d\n", sizeof(*dptr)); } NOT: Önceki slaytta adreslerin 4'er 4'er arttığına dikkat (int değer saklandığı için) #include

değeri değiştirme & adresi değiştirme Eğer iptr adresindeki değeri değiştirmek istersek: *iptr = 100; gibi bir kullanım ile o adresteki değere 100 sayısını atayabiliriz. Eğer adresi değiştirmek istersek iptr = 100; gibi bir kullanım ile iptr'nin artık 100 adresini göstermesini sağlayabiliriz. – Bu kullanım hatalara neden olabileceği için tavsiye edilmez. Eğer "işletim sistemi" yada "aygıt sürücüsü" geliştirmek gibi sistem programlama alanında çalışmıyorsak, kullanacağımız adresi biz belirlememeliyiz (işletim sistemi belirlemeli)

& operatörü Bu operatör bir değişkenin önüne yazıldığında o değişkenin saklı olduğu adresi verir. Daha önce scanf içinde bu operatörü kullanmıştık: scanf("%d", &sayi); İlk parametrede "%d" ile integer yani 4 byte olarak hafızaya yazılacağı, ikinci parametrede &sayi ile hangi adrese yazılacağı verilmektedir.

Örnek

Hafızadan yer tahsisi (malloc) Önceki slaytta a değişkeninin adresi aptr'ye atanmıştı. Eğer işaretçi için yeni bir adres isteyecek isek malloc fonksiyonunu kullanmalıyız: int *iptr = (int*)malloc(sizeof(int)); Eğer tanımlama anında değil de sonradan yer tahsisi yapacak isek *iptr = … değil iptr = … şekilden kullanılır: iptr = (int*)malloc(sizeof(int)); C++ malloc yerine kullanımı daha kolay olan new operatörünü içerir: int *iptr = new int; NOT: malloc fonksiyonu stdlib.h kütüphanesinde yer almaktadır. 4

malloc örneği #include main(){ char *cptr; int *iptr; double *dptr; cptr = (char*)malloc(sizeof(char)); iptr = (int*)malloc(sizeof(int)); dptr = (double*)malloc(sizeof(double)); printf("%d - %d\n", cptr, cptr+1); printf("%d - %d\n", iptr, iptr+1); printf("%d - %d\n", dptr, dptr+1); } NOT: Görüldüğü gibi adresi 1 arttırmak, işaretçinin işaret ettiği verinin türünün boyutu kadar ileri gitmesine neden olur.

Dinamik boyutlu diziler İşaretçi kullanmanın en büyük faydalarından biri programın çalışma anında (runtime) hafızadan malloc (yada new) komutu ile istenilen büyüklükte yer tahsisi yapılabilmesidir. Bu sayede programcının belirlediği statik büyüklükte tanımlanan diziler yerine, programı kullanan kişinin ihtiyacı doğrultusunda hafızadan yer alınabilir.

Örnek main(){ int n, i, *dizi; // dizinin boyutu belli değil printf("dizinin boyutunu girin : ", n); scanf("%d", &n); dizi = (int*)malloc(sizeof(int)*n); // dizi = new int[n]; de olur for(i = 1; i <= n; i++) { printf ("%d. sayi : ", i); scanf("%d", dizi); // &*dizi yerine kısaca dizi yazdık dizi++; } printf("dizinin tersten siralanisi : \n"); for(i = 1; i <= n; i++) { dizi--; printf ("%d\n", *dizi); } #include İşaretçi kullanımı dizi kullanımından biraz farklı olsa da, temelde ikisi de hafızada ardışık adreslerde aynı türden verileri saklamak için kullanılırlar.

Dizi – String – İşaretçi Dizi ismi aslında dizinin başlangıç adresini tutar (yani bir işaretçi gibi düşünülebilir). İki hafta önce bir string tanımlanırken char dizisi yerine char * kullanılabileceğini görmüştük. Dizilerin boyutu bir sabit ile tanımlanabilir, değişken olamaz: const int a = 10; int b = 10; int dizi1[a]; int dizi2[b]; Dizinin boyutu program çalışırken (run-time) değiştirilemez. Dinamik boyutlu dizi tanımlanamayacağı için işaretçi kullanmalıyız. Doğru

Örnek

İşaretçi kullanmanın avantajları ve dezavantajları Avantajları: – Liste, kuyruk, ağaç gibi genişletilebilen esnek veri yapılarının oluşturulmasına imkan sağlar – Değişken büyüklükte dizilerin (yada nesnelerin) fonksiyonlara parametre olarak iletilmesini sağlar Dezavantajları: – Slayt 5'teki gibi hatalı kullanımlar nedeniyle programın yada bilgisayarın kilitlenmesi gibi hatalara neden olur – İşletim sistemine ve programı yürüten makineye bağımlı kodlara neden olur