BİLGİSAYAR PROGRAMLAMA Ders 11: İşaretçi (Pointer) Kullanımı

Slides:



Advertisements
Benzer bir sunumlar
Diziler (Arrays).
Advertisements

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 6: Diziler Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
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.
BİLGİSAYAR PROGRAMLAMA Ders 11: İşaretçi (Pointer) Kullanımı Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
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İ
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
C Programlama Dili Çağdaş Hakan Aladağ.
Algoritma ve Programlamaya Giriş
KDV BEYANNAMESİ / MUHTASAR BEYANNAME / KURUMLAR VERGİSİ BEYANNAMESİ / GEÇİCİ VERGİ BEYANNAMESİ’NDE ORTAK ÖZELLİKLER F5 PENCERESİ Beyannamelerde yer alacak.
Ayrık Zaman Hopfield Ağı ile Çağrışımlı Bellek Tasarımı
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler
BİLGİSAYAR PROGRAMLAMA Ders 3: C ile Programlamaya Giriş
Veri Yapıları ve Algoritmalar
C Programlama Yrd.Doç.Dr. Ziynet PAMUK BMM211-H03
C Programlama Yrd.Doç.Dr. Ziynet PAMUK BMM211-H05
BİLGİSAYAR PROGRAMLAMA Ders 5: Döngüler
İleri Algoritma Analizi
Algoritma ve Programlamaya Giriş
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 6: Sınıflar
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.
Bilgisayar Programlamasına ve Veri Analizine Giriş
BİLGİSAYAR programlama II
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İ
Doğrusal Mantık Yapısı İle Problem Çözme
NİŞANTAŞI ÜNİVERSİTESİ
Bilgisayar Bilimi Koşullu Durumlar.
Sonlu Özdevinirlere Giriş
?: 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İ
WHILE DÖNGÜSÜ while (şart) { ifade 1; ifade 2; }
NİŞANTAŞI ÜNİVERSİTESİ
SDCC kullanarak C Programlama
Bilgisayar Bilimi Programlama Yapısı.
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
Algoritmalar ve Programlama II Ders 11: Kalıtım
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. 6031280 6031284 6031288 6031292 6031296 adres (ptr) 5 4 -1 8 değer (*ptr)

#include <stdio.h> İş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)); } #include <stdio.h> NOT: Önceki slaytta adreslerin 4'er 4'er arttığına dikkat (int değer saklandığı için)

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; 4 NOT: malloc fonksiyonu stdlib.h kütüphanesinde yer almaktadır.

i = adres, *i = adresin içeriği, &*i = adresin içeriğinin adresi malloc örneği (1) #include <stdio.h> #include <stdlib.h> main(){ int a; printf("%d adresi icin deger gir : ", &a); scanf("%d", &a); printf("%d adresindeki deger : %d\n", &a, a); int *i = (int*)malloc(4); // int *i = new int; printf("%d adresi icin deger gir : ", i); scanf("%d", i); printf("%d adresindeki deger : %d\n", i, *i); } NOT: scanf’te &*i yazmak yerine sadece i yazdık. Çünkü önceki örnekte gördüğümüz gibi & ve * yan yana kullanıldığında birbirini götürür. i = adres, *i = adresin içeriği, &*i = adresin içeriğinin adresi

malloc örneği (2) #include <stdio.h> #include <stdlib.h> 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.

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]; Doğru Dizinin boyutu program çalışırken (run-time) değiştirilemez. Dinamik boyutlu dizi tanımlanamayacağı için işaretçi kullanmalıyız.

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 #include <stdio.h> #include <stdlib.h> 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"); dizi--; printf ("%d\n", *dizi); İş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.

Önceki örnekte dizinin tersten sıralanışı kısmı aşağıdaki gibiydi: printf("dizinin tersten siralanisi : \n"); for(i = 1; i <= n; i++) { dizi--; printf ("%d\n", *dizi); } Aşağıdaki yazımlar da aynı işi yapacaktır: dizi = dizi - n; for(i = n-1; i >= 0; i--) { printf ("%d\n", dizi[i]); for(i = -1; i >= -n; i--) { Değer girereken n defa dizi++ yaptığımız için şimdi n adres geriye gidiyoruz Döngü öncesinde n adres geri gitmeyi sildik, döngüyü -1’den başlattık. Dizi indisleri negatif olmasına rağmen program çalışır

Örnek

İşaretçi kullanmanın avantajları ve dezavantajları 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