C
Struct ve fonksiyon
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
İşaretçi parametre imzası
void printPerson(struct Person ____) { printf("%d
", p->age); }
Cevabı göster
void printPerson(struct Person *p) { printf("%d
", p->age); }
-
Çağrı biçimlerini eşle
- 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
-
Büyük struct'ı fonksiyona geçmenin en verimli yolu?
- Değer ile
- İşaretçi ile
- Dizi ile
- Global değişken ile
Cevabı göster
İşaretçi ile — İşaretçi yalnızca adresi kopyalar; büyük struct'larda en verimli seçimdir.
Sıradaki ders: İç içe struct