CodeBlanks Logo Icon CodeBlanks

Struct ve fonksiyon

  • C kursu
  • Orta seviye
  • Ders 32/116
  • 5 dk

Struct'ı fonksiyona değerle ve işaretçiyle geçmeyi öğrenirsin.

Değerle ve işaretçiyle geçme

Bir struct'ı fonksiyona iki şekilde geçebilirsin: değerle ya da işaretçiyle. Değerle geçmek tüm struct'ı kopyalar; büyük struct'larda pahalıdır. İşaretçiyle geçmek yalnızca adresi kopyalar; bu yüzden verimlidir.

Örnek: void printPerson(struct Person *p) { printf("%d\n", p->age); }. Çağrı: printPerson(&p1);. İşaretçi alan fonksiyonlar struct'ı değiştirebilir; bu yüzden yan etkisi olduğunu bilmek gerekir. Eğer fonksiyon struct'ı değiştirmeyecekse const struct Person *p kullanmak niyeti açıkça belirtir.

const struct işaretçi

Bir fonksiyonun struct'ı değiştirmeyeceğini belirtmek için const struct Person *p kullanırsın. Derleyici, fonksiyon içinde p->age = ... gibi atamaları reddeder.

Örnek: int getAge(const struct Person *p) { return p->age; }. Bu fonksiyon struct'ı yalnızca okur; yan etkisi yoktur. Çağıran taraf, struct'ının değişmeyeceğini garanti altına almış olur. Bu, büyük C projelerinde önemli bir güvenlik desenidir; API sözleşmelerini netleştirir. const yazımı hem derleyiciyi hem de insan okuyucuyu uyarır.

Uygulama birthday fonksiyonu yaz

struct Person tanımla: char name[32]; ve int age;. void birthday(struct Person *p) yaz; gövdede p->age++; ile yaşı bir artır. main içinde struct Person p1 = {"Ali", 25}; tanımla, birthday(&p1); çağır, printf("%d\n", p1.age); ile yazdır.

Başlangıç kodu

main.c
#include <stdio.h>

// struct Person tanımla (name[32] ve age)
// void birthday(struct Person *p) yaz, p üzerinden age'i bir artır
// main'de p1 tanımla, birthday çağır, sonucu yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>

struct Person {
    char name[32];
    int age;
};

void birthday(struct Person *p) {
    p->age++;
}

int main(void) {
    struct Person p1 = {"Ali", 25};
    birthday(&p1);
    printf("%d\n", p1.age);
    return 0;
}

Beklenen çıktı

26

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İşaretçi parametre imzası

Soru
void printPerson(struct Person ____) { printf("%d
", p->age); }
Cevap
void printPerson(struct Person *p) { printf("%d
", p->age); }

Açıklama: *p, struct Person işaretçisi parametresidir.

2 Çağrı biçimlerini eşle

Kavram Anlamı
printPerson(&p1) İşaretçi ile çağrı
printPerson(p1) Değer ile çağrı
void f(struct Person*) İşaretçi parametre
void f(struct Person) Değer parametre

3 Büyük struct'ı fonksiyona geçmenin en verimli yolu?

  • Değer ile
  • İşaretçi ile Doğru cevap
  • Dizi ile
  • Global değişken ile

Açıklama: İşaretçi yalnızca adresi kopyalar; büyük struct'larda en verimli seçimdir.

Orta seviye bölümündeki tüm dersler