Yapıları Değer ile Aktarma
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 46 / 63.
Artık struct'lar ve struct pointer'ları ile nasıl çalışacağınızı bildiğinize göre, tüm struct'ları fonksiyonlara nasıl aktaracağınızı öğrenmenin zamanı geldi. Bir struct'ı bir fonksiyona parametre olarak geçirdiğinizde, C pass-by-value yöntemini kullanır; bu da fonksiyonun struct'ın tam bir kopyasını aldığı anlamına gelir.
Bir struct parametresi kabul eden bir fonksiyonun sözdizimi şöyledir:
void functionName(struct StructureName parameterName) {
// Fonksiyon gövdesi
}Tanıdık Point struct'ımızı bir örnek olarak kullanırsak:
void printPoint(struct Point p) {
printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}Anlaşılması gereken temel kavram, fonksiyonun içindeki struct üzerinde yaptığınız herhangi bir değişikliğin çağıran fonksiyondaki orijinal struct'ı etkilemeyeceğidir. Bunun nedeni, fonksiyonun verinin kendi kopyasıyla çalışmasıdır.
Bu yaklaşım, orijinalinde yanlışlıkla değişiklik yapma riski olmadan struct verilerini okumak veya görüntülemek istediğinizde kullanışlıdır. Ancak, büyük struct'ları kopyalamanın bellek ve performans açısından verimsiz olabileceğini unutmayın.
Görev
KolayStruct'ların fonksiyonlara değer ile (pass-by-value) aktarılmasını gösteren bir C programı oluşturun. Programınız şunları yapmalıdır:
- Aşağıdaki üyelere sahip
Rectangleadında birstructtanımlayın:- Dikdörtgenin genişliğini saklamak için bir tam sayı
width - Dikdörtgenin yüksekliğini saklamak için bir tam sayı
height - Dikdörtgenin rengini saklamak için 15 boyutunda bir karakter dizisi
color
- Dikdörtgenin genişliğini saklamak için bir tam sayı
- Aşağıdaki özelliklere sahip
displayRectangleadında bir fonksiyon yazın:- Parametre olarak bir
Rectanglestruct'ı alır (değer ile aktarım - pass-by-value) - Dikdörtgen bilgilerini tam olarak şu formatta yazdırır:
Rectangle Details:Width: [width]Height: [height]Color: [color]Area: [area]
- Alanı (genişlik × yükseklik) hesaplar ve yazdırır
- Parametre olarak bir
- Aşağıdaki özelliklere sahip
modifyRectangleadında bir fonksiyon yazın:- Parametre olarak bir
Rectanglestruct'ı alır (değer ile aktarım - pass-by-value) - Dikdörtgenin hem genişliğini hem de yüksekliğini iki katına çıkarır
- Rengi "Modified" olarak değiştirir
Inside modifyRectangle function:yazdırır- Değiştirilmiş dikdörtgeni göstermek için
displayRectanglefonksiyonunu çağırır
- Parametre olarak bir
- Main fonksiyonu içinde:
rectadında birRectangledeğişkeni oluşturun- Girişten genişlik, yükseklik ve renk değerlerini okuyun ve bunları struct üyelerine atayın
Original rectangle:yazdırır- Orijinal dikdörtgeni göstermek için
displayRectanglefonksiyonunu çağırın - Dikdörtgen ile
modifyRectanglefonksiyonunu çağırın After modifyRectangle call:yazdırır- Orijinal dikdörtgenin değişmediğini göstermek için
displayRectanglefonksiyonunu tekrar çağırın
Bu meydan okuma, struct'larda değer ile aktarımın (pass-by-value) temel kavramını gösterir: Bir struct'ı bir fonksiyona aktardığınızda, fonksiyon struct'ın tam bir kopyasını alır. Fonksiyon içinde yapılan herhangi bir değişiklik yalnızca kopyayı etkiler, çağıran fonksiyondaki orijinal struct'ı etkilemez.
Kopya kağıdı
Yapıları (structs) fonksiyonlara aktarırken, C değer ile geçme (pass-by-value) yöntemini kullanır; bu, fonksiyonun yapının tam bir kopyasını aldığı anlamına gelir.
Bir yapı parametresini kabul etmek için fonksiyon sözdizimi:
void functionName(struct StructureName parameterName) {
// Fonksiyon gövdesi
}Bir Point yapısı ile örnek:
void printPoint(struct Point p) {
printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}Temel kavram: Fonksiyon içinde yapıda yapılan değişiklikler, çağıran fonksiyondaki orijinal yapıyı etkilemez, çünkü fonksiyon verinin kendi kopyasıyla çalışır.
Bu yaklaşım, orijinalinde değişiklik yapma riski olmadan yapı verilerini okumak veya görüntülemek için kullanışlıdır, ancak büyük yapıları kopyalamak verimsiz olabilir.
Kendin dene
#include <stdio.h>
#include <string.h>
// TODO: Rectangle yapısını burada tanımlayın
// TODO: displayRectangle fonksiyonunu burada yazın
// TODO: modifyRectangle fonksiyonunu burada yazın
int main() {
// Girdiyi oku
int width, height;
char color[15];
scanf("%d", &width);
scanf("%d", &height);
scanf("%s", color);
// TODO: Rectangle değişkenini oluşturun ve girdi değerlerini atayın
// TODO: "Original rectangle:" yazdırın ve displayRectangle fonksiyonunu çağırın
// TODO: modifyRectangle fonksiyonunu çağırın
// TODO: "After modifyRectangle call:" yazdırın ve displayRectangle fonksiyonunu tekrar çağırın
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow bölümündeki tüm dersler
1Pointer Temelleri
Pointer Nedir?Pointer TanımlamaAdres Operatörü (&)Dereference Operatörü (*)NULL Pointer'larÖzet: Pointer Temelleri4Proje: Basit Metin Aracı
Projeye Genel BakışKarakter Sayma2İşaretçiler ve Diziler
İşaretçi Olarak Dizi İsimleriDizi Elemanları - İşaretçilerİşaretçi Aritmetiğiİşaretçilerin KarşılaştırılmasıÖzet: İşaretçi ile Dizi Gezinme5İşaretçiler ve Fonksiyonlar
Değer ile GeçmeFonksiyonlara İşaretçi Göndermeİşaretçiler ile Değişkenleri DeğiştirmeKlasik Bir Örnek: SwapFonksiyonlara Dizi GöndermeÖzet: Fonksiyon İşaretçi Argümanları8Yapılar ve İşaretçiler
Yapılara İşaretçilerOk Operatörü (->)Yapıları Değer ile AktarmaYapı İşaretçilerini AktarmaYapıların Dinamik TahsisiÖzet: Yapıyı Değiştirme - Ptr11Son Tekrar Görevleri
Tekrar: Dinamik String BirleştirmeTekrar: Struct DizisiTekrar: Kelime Frekans Sayacı3Karakter Dizileri ve Stringler
char Dizisi Olarak StringlerNull Sonlandırıcıscanf ile String Girişistrlen() Kullanımıstrcpy() Kullanımıstrcat() Kullanımıstrcmp() KullanımıÖzet: Temel String Fonksiyonları