İşaretçiler ile Değişkenleri Değiştirme
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 27 / 63.
Artık pointer'ların gerçek gücünden yararlanabilirsiniz: orijinal değişkeni bir fonksiyon aracılığıyla değiştirmek. Bir fonksiyona bir pointer geçirdiğinizde, fonksiyon o bellek adresinde saklanan değeri değiştirmek için dereference operatörünü kullanabilir.
Fonksiyonun içinde, orijinal değişkenin değerine erişmek ve onu değiştirmek için * operatörünü kullanarak işaretçinin başvurusunu çözersiniz (dereference). Bu teknik, değişkenin bellekteki konumuna bir referans aktardığınız için pass-by-reference olarak adlandırılır.
void doubleValue(int *ptr) {
*ptr = *ptr * 2; // Orijinal değeri değiştirmek için işaretçiyi çözün (dereference)
}
int main() {
int x = 5;
doubleValue(&x); // x'in adresini geçirin
// x artık 10!
return 0;
}İşin püf noktası, işaretçinin tuttuğu bellek adresindeki değeri değiştirmek için atamanın sol tarafında *ptr kullanmaktır. Bu, fonksiyonların çağıran fonksiyondaki değişkenleri kalıcı olarak değiştirmesine olanak tanıyarak, değerle geçme (pass-by-value) yönteminin tek başına başaramayacağı güçlü programlama olanaklarının önünü açar.
Görev
KolayBir tam sayının değerini üç katına çıkaran bir fonksiyon oluşturarak, işaretçiler (pointers) aracılığıyla değişkenlerin nasıl değiştirildiğini gösteren bir C programı yazın.
Programınız şunları yapmalıdır:
- Parametre olarak bir tam sayı işaretçisi alan
tripleValueadında bir fonksiyon oluşturun tripleValuefonksiyonu içinde, bellek adresindeki değeri 3 ile çarpmak için dereference (adresteki değere erişim) operatörünü kullanıntripleValuefonksiyonu içinde, yeni değeri şu formatta yazdırın:Value tripled to: [value]mainfonksiyonunda,numberadında bir tam sayı değişkeni tanımlayın ve ona 8 değerini atayın- Orijinal değeri şu formatta yazdırın:
Original value: [value] tripleValuefonksiyonunu çağırın ve adres-of operatörünü kullanaraknumberdeğişkeninin adresini geçirin- Fonksiyon çağrısından sonra,
numberdeğişkeninin son değerini şu formatta yazdırın:Final value: [value]
Çıktınız, fonksiyonun işaretçi aracılığıyla orijinal değişkeni başarıyla değiştirdiğini göstermelidir:
Original value: 8
Value tripled to: 24
Final value: 24Bu meydan okuma, işaretçiler kullanarak referansla geçişin (pass-by-reference) gücünü gösterir; burada fonksiyon, işaretçiyi dereference ederek ve o bellek konumundaki değeri değiştirerek orijinal değişkeni kalıcı olarak değiştirebilir.
Kopya kağıdı
İşaretçileri kullanarak bir fonksiyon aracılığıyla orijinal değişkeni değiştirebilirsiniz. Bu teknik, değişkenin bellekteki konumuna bir referans ilettiğiniz için referansla geçme (pass-by-reference) olarak adlandırılır.
Fonksiyonun içinde, orijinal değişkenin değerine erişmek ve onu değiştirmek için * operatörünü kullanarak işaretçinin referansını çözün (dereference):
void doubleValue(int *ptr) {
*ptr = *ptr * 2; // Orijinal değeri değiştirmek için referansı çözün
}
int main() {
int x = 5;
doubleValue(&x); // x'in adresini geçirin
// x artık 10!
return 0;
}İşaretçinin tuttuğu bellek adresindeki değeri değiştirmek için atamanın sol tarafında *ptr kullanın. Bu, fonksiyonların çağıran fonksiyondaki değişkenleri kalıcı olarak değiştirmesine olanak tanır.
Kendin dene
#include <stdio.h>
// YAPILACAK: tripleValue fonksiyonunuzu buraya yazın
int main() {
// YAPILACAK: Kodunuzu buraya yazın
// number değişkenini tanımlayın ve başlatın
// Orijinal değeri yazdırın
// tripleValue fonksiyonunu çağırın
// Son 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ı