Yrd. Doç. Dr. Caner ÖZCAN
malloc Malloc fonksiyonu bir değişken için hafızadan bir blok yer ayrılması için kullanılır. Eğer hafızada yeterli alan yoksa fonksiyon NULL döndürür. int *ptr; ptr = (int *) malloc(n*sizeof(int)); 2
calloc Calloc fonksiyonu da hafıza bloğu almak için kullanılabilir. Eğer hafızada yeterli alan yoksa fonksiyon NULL döndürür. Malloc fonksiyonundan farklı olarak ilk değer ataması yapar char *ptr; ptr = (char *)calloc(10, sizeof(char)); 3
realloc Realloc fonksiyonu hafızadan ayrılan bir alanı yeniden boyutlandırmak için kullanılır. Tekrar ayarlanacak hafıza alanının başlangıcını işaret edecek bir pointer ve yeni boyut bilgisini parametre olarak alır. void *realloc(void *ptr, size_t size); Realloc fonksiyonu daha önce tahsis edilen bloğun hemen altında sürekliliği bozmayacak şekilde tahsisat yapar. Eğer daha önce tahsis edilen bloğun altında yeterli alan yoksa bellekte bloğun tamamı için yer arar. Yeterli hafıza alanı bulursa bloğun tamamını hafızada o bölgeye taşır. Eskisini siler. Yeterli alan bulamaz ise NULL döndürür. 4
realloc(!) Eğer realloc fonksiyonu yeterli yer bulamayıp bloğu başka yere taşırsa bu durumda geri dönüş değerini aynı işaretçiye atamak gerekir. Çünkü bu durumda bloğun başlangıç adresi değişmektedir. char *ptr; ptr = (char *)calloc(10, sizeof(char)); ptr = realloc (ptr, 20*sizeof(char)); 5
free Büyük boyutta ve kapsamlı bir program söz konusuysa, efektif bellek yönetiminin ne kadar önemli olduğunu daha iyi anlarsınız. Gereksiz tüketilen bellekten kaçınmak gerekmektedir. alloc ve malloc fonksiyonlarıyla her hafızadan ayrılan alanın tekrar heap alanına serbest bırakılması için free fonksiyonu çağırılır. int *ptr; ptr = (int *) malloc(n*sizeof(int)); free(ptr); 6
Dizilerde Dinamik Bellek Kullanımı 7
Dizilerde Dinamik Bellek Kullanımı 8
Fonksiyon Pointer lar Pointer lar bir fonksiyonun tutulduğu adresi gösterebilir. Normal pointer gibi fonksiyonun adresini içeren değişken tanımı yapılmalıdır. int (*fptr) (int,int) Bu tanımda fptr değişkeni iki tane int tipinde parametre alan ve geriye int tipinde değer döndüren bir fonksiyonun adresini içerir. int *fptr (int,int) Bu tanımda ise iki tane int tipinde parametre alan ve geriye int pointer döndüren bir fonksiyon tanımlanmıştır. 9
Fonksiyon Pointer lar 10
Fonksiyon Pointer lar 11
Void Pointer lar Pointer lar void olarak tanımlanabilir. Bu şekilde tanımlanan pointerların gösterdiği adresteki değere erişmek için veri tipi belirtilmelidir. 12
Örnek-3 ENTER tuşuna basılana kadar sürekli olarak klavyeden girilen karakterleri alan ve her bir karakter için ekrana * basan bir program yazınız. Kullanıcı ENTER tuşuna bastığı zaman girilen karakterleri girildiği sırada ekrana yazdırınız. ENTER için karakter kodu 13 tür. 13
Örnek-3 14
Örnek-3 15
Örnek-4 Aşağıda verilen prototipi kullanarak iki değişkenin değerini yer değiştiren bir fonksiyon yazınız. void swap (int *, int *) 16
Örnek-4 17
Örnek-5 Aşağıda verilen prototipi kullanarak bir dikdörtgenin çevresi ve alanını hesaplayan bir fonksiyon yazınız. void rectangle(int a,int b, int *area, int *perimeter) 18
Örnek-5 19
Örnek-6 Aşağıda verilen prototipi kullanarak strlen fonksiyonuna benzer bir fonksiyon yazınız. int uzunluk(char *) 20
Örnek-7 Aşağıda verilen prototipi kullanarak verilen bir katarda bir karakter arayan bir fonksiyon yazınız. char * ara (char *, char) 21
Örnek-7 Aşağıda verilen prototipi kullanarak verilen bir katarda bir karakter arayan bir fonksiyon yazınız. char * ara (char *, int) 22
Örnek-8 Unsigned interger değeri binary değere çeviren bir fonksiyon yazınız. 23
Örnek-8 24
Örnek-8 25
26
Dip not.. 27
28
Kaynaklar Doç. Dr. Fahri Vatansever, Algoritma Geliştirme ve Programlamaya Giriş, Seçkin Yayıncılık, 12. Baskı, 2015. J. G. Brookshear, Computer Science: An Overview 10th Ed., Addison Wisley, 2009. Kaan Aslan, A dan Z ye C Klavuzu 8. Basım, Pusula Yayıncılık, 2002. Paul J. Deitel, C How to Program, Harvey Deitel. google.com for all images. 29