2 - Fonksiyonlar, Diziler ve İşaretçiler
2025
#include <stdio.h>
int ciftMi(int sayi) {
if (sayi % 2 == 0) {
return 1; // 1, "doğru" anlamına gelir
} else {
return 0; // 0, "yanlış" anlamına gelir
}
}
int main() {
int sayi = 6;
if (ciftMi(sayi)) { // ciftMi fonksiyonu 1 (doğru) döndürürse
printf("%d çift bir sayıdır.\n", sayi);
} else {
printf("%d tek bir sayıdır.\n", sayi);
}
return 0;
}
Sözdizimi:
#include <stdio.h>
// Fonksiyon prototipi
int usAl(int taban, int us);
int main() {
int x = 2, y = 3;
int sonuc = usAl(x, y); // Fonksiyon prototipi sayesinde derleyici bu çağrıyı anlayabilir.
printf("%d üssü %d = %d\n", x, y, sonuc);
return 0;
}
// Fonksiyon tanımı
int usAl(int taban, int us) {
int sonuc = 1;
for (int i = 0; i < us; i++) {
sonuc *= taban;
}
return sonuc;
}
Sözdizimi:
Dikkat!
Bir dizinin boyutu ve türü, tanımlandıktan sonra değiştirilemez!
int sayilar[5] = { 1, 2, 3, 4, 5 };
// ucuncu elemanın degerini -1 yap
sayilar[2] = -1;// besinci elemanın degerini 0 yap
sayilar[4] = 0;
Dizi elemanlarının indislerini kullanarak yukarıdaki gibi değiştirebiliriz.
sizeof
Operatörü: Dizilerin Boyutunu Hesaplamasizeof
operatörü, bir değişkenin veya veri tipinin bellekte kapladığı bayt sayısını döndürür.dizi_boyutu = sizeof(dizi) / sizeof(dizi[0])
#include <stdio.h>
int main() {
int sayilar[] = {10,20,30,40,50};
int dizi_boyutu = sizeof(sayilar) / sizeof(sayilar[0]);
printf("Dizinin boyutu: %d\n", dizi_boyutu);
}
sayilar
bellekte 20 baytlık bir alanda saklansın. Bu dizi içerisindeki ilk eleman yani 10
sayısı 4 bayt’lık yer kaplıyorsa. 20 / 4 = 5
sonucunu verecektir. Yani sayilar
dizisi 5
elemanlıdır diyebileceğiz.
+------------+------------+------------+------------+
| Adres | 0x1000 | 0x1004 | 0x1008 | ...
+------------+------------+------------+------------+
| Değer | 10 | 0x1000 | 'A' | ...
+------------+------------+------------+------------+
^ ^
| |
int sayi int *ptr
sayi
değişkeni 0x1000 adresinde saklanıyor ve değeri 10.ptr
işaretçisi 0x1004 adresinde saklanıyor ve değeri sayi
değişkeninin adresi olan 0x1000.*ptr
ifadesi, ptr
’nin tuttuğu adresteki değeri verir (burada, 10). *
operatörüne, bu bağlamda, dereference operatörü denir.Sözdizimi:
veri_tipi
: İşaretçinin işaret edeceği değişkenin veri tipi.*
: İşaretçi olduğunu belirtir.isaretci_adi
: İşaretçiye verilen isim.İlklendirme:
#include <stdio.h>
int main() {
int sayi = 10;
int *ptr; // int türünde bir işaretçi tanımlama
ptr = &sayi; // ptr'ye sayi'nin adresi atanır
printf("sayi'nin değeri: %d\n", sayi);
printf("sayi'nin adresi: %p\n", &sayi);
printf("ptr'nin değeri: %p\n", ptr); // ptr, sayi'nin adresini tutar
printf("ptr'nin gösterdiği adresteki değer: %d\n", *ptr); // *ptr, sayi'nin değerini verir
return 0;
}
#include <stdio.h>
int main() {
int sayilar[5] = {10, 20, 30, 40, 50};
int *ptr = sayilar; // ptr, sayilar dizisinin ilk elemanının adresini gösterir
printf("İlk eleman: %d\n", *ptr); // Çıktı: 10
printf("İkinci eleman: %d\n", *(ptr + 1)); // Çıktı: 20
printf("Üçüncü eleman: %d\n", *(ptr + 2));// Çıktı: 30
return 0;
}
NULL
, bir işaretçinin hiçbir adresi işaret etmediğini belirtmek için kullanılan özel bir değerdir.stdio.h
başlık dosyasında tanımlıdır.#include <stdio.h>
int main() {
int x, *p1, *p2, *p3;
x = 123;
p2 = NULL;
p3 = &x;
printf("Değer atanmamış p1 pointer'ının değeri: %p\n", p1);
printf("p2 = NULL atanmış pointer'ın değeri: %p\n", p2);
printf("p3 = &x atanmış pointer'ının değeri: %p\n", p3);
printf("&x adresinin değeri: %p\n", &x);
return 0;
}
NULL
değeri atamak önemlidir.free()
fonksiyonu ile). (İlerleyen bölümlerde detaylı olarak işlenecek.)int sayilar[5] = { 11,22,33,44,55 };
şeklindeki sayilar dizisindeki tek sayıların toplamını hesaplayan, sayılardan en büyüğünü, en küçüğünü ve sayların ortalamasını hesaplayan kodu yazın.