İş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.
Görev
KolayBir 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 birProductyapısı tanımla:char name[50],double priceveint quantity. Ayrıca iki işlev tanımla:display_by_value: birProductdeğer olarak alır ve bilgilerini yazdırırdisplay_by_pointer: birconst Product *alır ve aynı bilgileri yazdırır
PRODUCT_Hsimgesiyle 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: 5Kendin 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;
}
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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi