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
#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
#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ı
void printPerson(struct Person ____) { printf("%d
", p->age); }
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.