Menu
Coddy logo textTech

İşaretçi vs Değer

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

Bir struct'ı bir işleve geçirdiğinizde C size iki seçenek sunar: değerle geçirin (struct'ın tamamını kopyalayın) veya işaretçiyle geçirin (yalnızca adresi kopyalayın). Seçim, performans açısından büyük önem taşır.

Değere göre geçirme, struct'ın yığında tam bir kopyasını oluşturur. Birkaç tamsayı içeren küçük bir struct için bu sorun değildir. Ancak yüzlerce baytlık bir struct düşünün: her işlev çağrısı tüm bu verileri kopyalar:

typedef struct {
    char name[100];
    int scores[50];
    double average;
} Student;

// Değerle: her çağrıda ~308 bayt kopyalar
void print_by_value(Student s) {
    printf("%s: %.2f\n", s.name, s.average);
}

// İşaretçiyle: yalnızca 8 bayt kopyalar (adres)
void print_by_pointer(const Student *s) {
    printf("%s: %.2f\n", s->name, s->average);
}

Sözdizimi de farklıdır. Değer parametresiyle nokta operatörünü (s.name) kullanırsınız. İşaretçiyle ok operatörünü (s->name) kullanırsınız.

İşaretçi sürümü daha verimlidir; çünkü yapı boyutundan bağımsız olarak genellikle yalnızca 8 baytlık bir bellek adresi geçirir.

C programcılarının yapı türlerini neredeyse her zaman işaretçiyle geçirmesinin nedeni budur. İşlevin verileri değiştirmemesi gerekiyorsa const, değiştirmesi gerekiyorsa normal bir işaretçi kullanın. Böylece hem verimlilik hem de açık bir amaç elde edersiniz.

challenge icon

Görev

Kolay

Bir yapının değere göre ve işaretçiye göre geçirilmesi arasındaki farkı gösteren bir Product modülü oluşturalım. İki görüntüleme işlevi oluşturacaksın: biri yapının tamamını kopya olarak alacak, diğeri ise yalnızca yapıya bir işaretçi alacak.

Üç dosya oluşturacaksın:

  • product.h: Üç üyeye sahip bir Product yapısı tanımla: char name[50], double price ve int quantity. Ayrıca iki işlev tanımla:
    • display_by_value: bir Product değer olarak alır ve bilgilerini yazdırır
    • display_by_pointer: bir const Product * alır ve aynı bilgileri yazdırır
    PRODUCT_H simgesiyle include guard kullan.
  • product.c: Her iki işlevi de uygula. Sözdizimi farkına dikkat et: değere göre sürüm nokta işleçini (p.name), işaretçi sürümü ise ok işleçini (p->name) kullanır. Her iki işlev de aynı biçimde yazdırmalıdır.
  • main.c: Bir Product oluştur, ardından farklı parametre stilleri kullanmalarına rağmen aynı çıktıyı ürettiklerini göstermek için her iki görüntüleme işlevini de çağır.

Üç girdi alacaksın: ürün adı (bir dize), fiyat (bir double) ve miktar (bir tamsayı).

Ana dosyanda bu değerlerle bir Product başlat, ardından display_by_value ve sonrasında display_by_pointer işlevini çağır.

Her iki işlev de şu biçimde yazdırmalıdır:

Product: {name}, Price: {price}, Qty: {quantity}

Fiyatı iki ondalık basamak göstermek için %.2f kullan.

Örneğin, girdiler Laptop, 999.99 ve 5 olduğunda çıktı şöyle olur:

Product: Laptop, Price: 999.99, Qty: 5
Product: Laptop, Price: 999.99, Qty: 5

Kendin dene

#include <stdio.h>
#include <string.h>
#include "product.h"

int main() {
    char name[50];
    double price;
    int quantity;
    
    // Girdileri oku
    scanf("%s", name);
    scanf("%lf", &price);
    scanf("%d", &quantity);
    
    // TODO: Bir Product değişkeni oluştur ve girdi değerleriyle başlat
    // İpucu: name'i struct'ın name alanına kopyalamak için strcpy kullan
    
    // TODO: Product ile display_by_value'yu çağır
    
    // TODO: Product'a bir işaretçi ile display_by_pointer'ı çağı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