Değer ile Geçme
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 25 / 63.
C'de bir fonksiyona bir değişken geçirdiğinizde, fonksiyon değişkenin kendisini değil, o değişkenin değerinin bir kopyasını alır. Bu temel kavram pass-by-value (değer ile çağırma) olarak adlandırılır.
İşte olan şudur: Değeri 10 olan bir x değişkenine sahipseniz ve bunu bir fonksiyona geçirirseniz, fonksiyon bu değerin kendi ayrı kopyasını alır. Fonksiyonun bu kopya üzerinde yaptığı herhangi bir değişiklik, çağıran fonksiyondaki orijinal değişkeni etkilemez.
void tryToChange(int num) {
num = 99; // Bu sadece kopyayı değiştirir
}
int main() {
int x = 10;
tryToChange(x);
// x hala 10'dur, 99 değil
return 0;
}Bu davranış, orijinal verilerinizin fonksiyonlar tarafından yanlışlıkla değiştirilmesini önler. Ancak bu, bir fonksiyonun bir değişkenin değerini gerçekten değiştirmesini istiyorsanız, değer ile geçme (pass-by-value) yönteminin işe yaramayacağı anlamına da gelir. İşaretçiler (pointers) ve bu sorunu nasıl çözebilecekleri hakkında bilgi edinmeye devam ederken bu sınırlamayı anlamak çok önemlidir.
Görev
KolayBir fonksiyonun içinde bir değişkeni değiştirmeye çalışarak ve orijinal değişkenin değişmeden kaldığını gözlemleyerek değerle çağırma (pass-by-value) kavramını gösteren bir C programı yazın.
Programınız şunları yapmalıdır:
numberadında bir tam sayı parametresi alantryToModifyadında bir fonksiyon oluşturuntryToModifyfonksiyonunun içinde,numberparametresine 50 ekleyintryToModifyfonksiyonunun içinde, değiştirilmiş değeri şu formatta yazdırın:Inside function: [value]mainfonksiyonunda,originaladında bir tam sayı değişkeni tanımlayın ve ona 25 değerini atayın- Fonksiyonu çağırmadan önce orijinal değeri şu formatta yazdırın:
Before function call: [value] tryToModifyfonksiyonunu çağırın veoriginaldeğişkenini argüman olarak geçirin- Fonksiyon çağrısından sonra,
originaldeğerini tekrar şu formatta yazdırın:After function call: [value]
Çıktınız, fonksiyon içindeki değişikliğe rağmen orijinal değişkenin değerinin değişmeden kaldığını göstermelidir:
Before function call: 25
Inside function: 75
After function call: 25Bu meydan okuma, C'deki değerle çağırma (pass-by-value) temel kavramını gösterir; burada fonksiyonlar değişkenlerin kendilerini değil, kopyalarını alırlar. Fonksiyon içindeki parametre üzerinde yapılan herhangi bir değişiklik, çağıran fonksiyondaki orijinal değişkeni etkilemez.
Kopya kağıdı
C'de fonksiyonlar, değişkenlerin kendilerini değil, değişken değerlerinin bir kopyasını alırlar. Buna değer ile geçme (pass-by-value) denir.
Bir değişkeni bir fonksiyona aktardığınızda, fonksiyon içinde yapılan herhangi bir değişiklik yalnızca kopyayı etkiler ve orijinal değişkeni değiştirmeden bırakır:
void tryToChange(int num) {
num = 99; // Bu sadece kopyayı değiştirir
}
int main() {
int x = 10;
tryToChange(x);
// x hala 10'dur, 99 değil
return 0;
}Bu davranış, orijinal verilerinizin fonksiyonlar tarafından yanlışlıkla değiştirilmesini önler, ancak bir fonksiyonun bir değişkenin değerini gerçekten değiştirmesini istiyorsanız değer ile geçmenin (pass-by-value) işe yaramayacağı anlamına gelir.
Kendin dene
#include <stdio.h>
// YAPILACAK: tryToModify fonksiyonunuzu buraya yazın
int main() {
// YAPILACAK: Kodunuzu buraya yazın
// 1. Orijinal değişkeni tanımlayın ve başlatın
// 2. Fonksiyon çağrısından önceki değeri yazdırın
// 3. tryToModify fonksiyonunu çağırın
// 4. Fonksiyon çağrısından sonraki değeri yazdı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ı