Menu
CoddyTech

İşaretçiler ve Referanslar

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 13 / 104.

Artık stack ve heap belleğini anladığına göre, bellek konumlarıyla doğrudan çalışmanı sağlayan araçları inceleyelim: işaretçiler ve referanslar.

Bir işaretçi, başka bir değişkenin bellek adresini saklar. Onu * ile tanımlarsın ve & kullanarak bir adres alırsın.

int value = 42;
int* ptr = &value;    // ptr, value değişkeninin adresini tutar

std::cout << ptr;     // Bellek adresini yazdırır
std::cout << *ptr;    // İşaretçinin gösterdiği değere erişir: 42 değerini yazdırır

Referans, mevcut bir değişkenin takma adıdır. Bağlandıktan sonra her zaman o değişkeni gösterir. Onu & ile tanımlarsın.

int value = 42;
int& ref = value;     // ref, value için bir takma addır

ref = 100;            // value değerini 100 olarak değiştirir
std::cout << value;   // 100 yazdırır

Temel farklar:

İşaretçilerBaşvurular
null olabilirBaşlatılmaları gerekir
Yeniden atanabilirBaşka bir şeye bağlanamaz
Değere erişmek için * kullanılırDeğere doğrudan erişilir
Hiçbir şeyi göstermeyebilirHer zaman geçerlidir

Her ikisi de nesneleri kopyalamadan işlevlere verimli bir şekilde aktarmak ve heap belleğinde ayrılmış bellekle çalışmak için gereklidir. Referanslar daha güvenli ve basittir; işaretçiler ise yeniden atama yapmanız veya null olup olmadığını kontrol etmeniz gerektiğinde daha fazla esneklik sunar.

challenge icon

Görev

Kolay

Verileri değiştirirken işaretçilerin ve başvuruların nasıl farklı çalıştığını gösteren basit bir değer değiştirme sistemi oluşturalım.

Kodunu düzenlemek için iki dosya oluşturacaksın:

  • ValueOps.h: Tamsayı değerlerini farklı şekillerde değiştiren üç işlev tanımla:
    • doubleByPointer(int* ptr): Bir işaretçi alır ve işaret ettiği değeri ikiyle çarpar
    • tripleByReference(int& ref): Bir başvuru alır ve değeri üçle çarpar
    • swapValues(int* a, int* b): İki işaretçi alır ve işaret ettikleri değerleri takas eder
  • main.cpp: Girdiden iki tamsayı oku, ardından hem işaretçileri hem de başvuruları kullanarak örnek göster:
    • Başlangıç değerlerini yazdır: "Original: <first> <second>"
    • İlk değerde doubleByPointer kullan, ardından şunu yazdır: "After double: <first>"
    • İkinci değerde tripleByReference kullan, ardından şunu yazdır: "After triple: <second>"
    • İki değeri takas etmek için swapValues kullan, ardından şunu yazdır: "After swap: <first> <second>"

İşaretçilerle işlev çağırırken değişkenin adresini geçirmek için adres operatörünü (&) kullanmayı unutma. Başvurular daha doğal çalışır; değişkeni doğrudan geçirmen yeterlidir.

Başlık dosyanı main.cpp dosyasına #include "ValueOps.h" kullanarak ekle.

Kendin dene

#include <iostream>
#include "ValueOps.h"
using namespace std;

int main() {
    // Girdiden iki tamsayı oku
    int first, second;
    cin >> first;
    cin >> second;
    
    // Orijinal değerleri yazdır
    cout << "Original: " << first << " " << second << endl;
    
    // TODO: İlk değer üzerinde doubleByPointer kullan (adresi & ile geçir)
    
    // TODO: İkiye katladıktan sonra yazdır
    
    // TODO: İkinci değer üzerinde tripleByReference kullan (değişkeni doğrudan geçir)
    
    // TODO: Üçe katladıktan sonra yazdır
    
    // TODO: Her iki değerin yerini değiştirmek için swapValues kullan (adresleri & ile geçir)
    
    // TODO: Yerlerini değiştirdikten sonra yazdır
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C++ derleyicisi