C Programlama

Ek Bilgiler

C'de Fonksiyonlar

► Detaylı anlatım

C'de fonksiyon bir veya daha fazla işlem satırından oluşan kodların bir kod bloğu şeklinde yapılandırılması ile oluşturulur. Fonksiyonlar oluşturulduktan sonra programın herhangi bir yerinden sadece fonksiyon adı kullanılarak çağrılabilir. Bu sayede, çok fazla sayıda işlem satırı tek bir isim kullanılarak çalıştırılmış olur.

Fonksiyon Yapısı

veri-türü fonksiyon-adı (parametreler)
{
  işlem satırı
  .
  .
  işlem satırı
 
  return veri-türü;
}

Fonksiyon yapısında 5 temel eleman vardır. Bu elemanlardan fonksiyon-adı ve işlem satırı mutlaka bulunmalıdır. Ancak, veri-türü, parametreler ve return ifadelerinin tanımlanması programcının ihtiyaçları doğrultusunda isteğe bağlıdır. Parametre yerine argüman ifadesi de kullanılmaktadır.

veri-türü : Fonksiyonun geri verdiği veri türünü gösterir.
 
fonksiyon-adı : Fonksiyon adını gösterir.

parametreler : Fonksiyona geçirilen verileri gösterir. Sayısı birden fazla olabilir.

işlem satırı : Fonksiyon içindeki işlem satırlarını gösterir.

return : Verileri geri döndürmeye yarar. Son satırda kullanılması şart değildir. 

Bir fonksiyon için geri dönen veri türü ve parametre tanımlanmadığında, bu ifadelerin yerine void ifadesini kullanarak bu durumu derleyiciye bildirebiliriz. main() fonksiyonundan önce de void ifadesini kullanılabilir.

void fonksiyon-adı (void)
{
  işlem satırları
}

veri-türü ifadesi Eğer bir fonksiyonun adının başında veri türü tanımlanmazsa, fonksiyon int bir değer geri verir. Eğer bir fonksiyonun int değer dışında bir veri türü geri vermesi isteniyorsa, fonksiyon adının başında mutlaka bir veri türü tanımlanması gerekir.

Fonksiyon Bildirimi

int bir değer dışında veri türü geri veren bir fonksiyon kullanılacağı zaman, bu fonksiyonu kullanmadan önce, fonksiyonun geri vereceği veri türü ile fonksiyona geçirilecek argümanların sayısını ve türlerini programın başında belirlenmesi gerekir. Bu işleme Fonksiyon bildirimi adı verilir. Fonksiyon bildirimi yapılmadığı takdirde, derleyici bu fonksiyonun geri vereceği değeri int olarak kabul eder.

char bir değer geri veren bir fonksiyon için fonksiyon bildirimini yapmasanız bile, program normal olarak çalışır. Bunun nedeni, C'nin int ve char verileri aynı şekilde değerlendirmesidir.

Fonksiyon bildiriminin genel yapısı aşağıdaki şekildedir:

veri-türü fonksiyon-adı (veri-türü parametre1, ...);

Fonksiyon bildirimi yapıldığında, eğer fonksiyonu çağırırken kullandığınız argümanların sayısı ve argüman veri türü, bildirim yaparken tanımladığınızdan farklı olursa, derleyici bir hata mesajı verir. Program, fonksiyonların her çağrılmasında tanımlanan argüman sayısının ve argüman veri türlerinin fonksiyon bildirimine uygun olup olmadığını kontrol eder. Fonksiyon çağrısı ile fonksiyon bildirimi arasında uyuşmazlık olduğunda, derleyici programı derlemez. Örneğin, 3 parametreli olarak bildirimi yapılmış bir fonksiyonu 4 parametre ile çağırırsanız derleyici bir hata mesajı vererek çalışmasını sona erdirir.

Fonksiyon bildirimini bir örnek üzerinde incelemeye çalışalım:

#include <stdio.h>

float fonk1 (float fd1);  /* 1 */

void main()
{
  float fd1;

  fd1 = 12.75;
  
  printf("%f", fonk1 (fd1));
}

float fonk1 (float fd1)
{
  return 10*fd1;
}

Yukarıdaki örnekte, program aşağıdaki satırı ekrana yazar:

127.500000

Yukarıdaki örnekte, program float bir sayının 10 katını ekrana yazar. Hemen başlangıçta 1 sayısı ile gösterilen işlem satırındaki fonksiyon bildirimini prototip olarak yapar. Program yaptığı fonksiyon bildirimi ile fonk1() fonksiyonunun geri verdiği veri türünün float olacağını ve fonk1() fonksiyonu için 1 adet float değişkenin parametre olarak tanımlandığını derleyiciye bildirir.

Fonksiyon Parametrelerine Argüman Geçirme

Bir fonksiyona argüman geçirmenin 2 farklı yöntemi vardır:

1. Değer yoluyla
2. Referans yoluyla

Değer Yoluyla Argüman Geçirme

Değer yoluyla argüman geçirme yöntemi kullanıldığında, argüman olarak kullanılan değerler çağrılan fonksiyonun parametrelerine geçirilir. Bu durumda, çağrılan fonksiyon içindeki işlem satırları tarafından değerleri değiştirilen parametreler, fonksiyon çağırırken argüman olarak kullanılan değişken değerlerini etkilemez.

Bu özelliği bir örnek üzerinde incelemeye çalışalım:

#include <stdio.h>

void fonk1 (int id1);

void main (void)
{
  int id1;
  id1 = 34;

  fonk1 (id1);

  printf("main() fonksiyonu içinde id1 değişken değeri: %d", id1);
}

void fonk1 (int id1)
{
  id1 = id1 + 27;
  printf("Fonksiyon içinde id1 değişken değeri: %d\n", id1);
}

Yukarıdaki örnekte, program aşağıdaki satırı ekrana yazar:

Fonksiyon içinde id1 değişken değeri: 61
main() fonksiyonu içinde değişken değeri: 34

Program, önce id1 adlı int bir değişken parametresi olan fonk1() adlı bir fonksiyon bildirimi yapar. Sonra, 34 değerini atadığı id1 değişkenini argüman olarak kullanıp, fonk1() fonksiyonunu çağırır. fonk1() fonksiyon parametresine argüman olarak geçirilen id1 değişkenine, fonksiyon 27 sayısını ekleyerek ekrana yazar. Fonksiyondan çıktıktan sonra, program id1 değişken değerini ekrana yazar. Bu değer, fonksiyon çağrıldığında id1 değişkeninin sahip olduğu değer ile aynı olduğundan, fonksiyon içinde id1 değişkenine yapılan değişiklik, id1 değişkeninin program içindeki değerini etkilememiş olur.

Referans Yoluyla Argüman Geçirme

Referans yoluyla argüman geçirme metodunu kullanıldığında, argüman olarak kullanılan değerlerin bellek adresleri çağrılan fonksiyonun parametrelerine geçirilir. Bu durumda, çağrılan fonksiyon içinde değeri değiştirilen parametreler, fonksiyonu çağırırken argüman olarak kullanılan değişken değerlerini değiştirir. Çünkü, fonksiyon parametrelerine geçirilen değerler argümanların bellek adresleridir.

Bu özelliği bir önceki örneği değiştirerek incelemeye çalışalım:

#include <stdio.h>

void fonk1 (int *ip1);

void main (void)
{
  int id1;
  id1 = 34;

  fonk1 (&id1); /* 1 */
  printf("main() fonksiyonu içinde id1 değişken değeri: %d", id1);
}

void fonk1 (int *ip1)
{
  *ip1 = (*ip1) + 27;
  printf("Fonksiyon içinde id1 değişken değeri: %d\n", *ip1);
}

Yukarıdaki örnekte, program aşağıdaki satırı ekrana yazar:

Fonksiyon içinde id1 değişken değeri: 61
main() fonksiyonu içinde değişken değeri: 61

Programda, fonk1() fonksiyonuna argüman olarak geçirilen id1 değişken değerinin değişmesinin tek nedeni, 1 sayısı ile gösterilen işlem satırında değişken adresinin fonksiyona geçirilmiş olmasıdır. Bu durumda, fonk1() fonksiyonu içinde değeri değiştirilen id1 değişken değeri, fonksiyondan çıkıldıktan sonra da, program içinde aynı değeri korumaktadır.

Kısaca özetlemek gerekirse, bir fonksiyona argüman olarak geçirilen değerlere, fonksiyon içinde yapılan değişikliklerin, fonksiyonun çalışması sona erdikten sonra, program içinde de geçerli olması istendiğinde Referans Yoluyla Argüman Geçirme yöntemi, aksi takdirde Değer Yoluyla Argüman Geçirme yöntemi kullanılmalıdır.