Ok Operatörü (->)
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 45 / 63.
Yapı (struct) işaretçileriyle çalışırken, yapı üyelerine erişmek özel bir sözdizimi gerektirir. Dereferans (dereference) operatörünü ve nokta notasyonunu birlikte kullanabilseniz de, C özellikle bu amaç için daha kullanışlı bir operatör sağlar: ok operatörü (->).
Ok operatörü, struct üyelerine bir işaretçi aracılığıyla temiz ve okunabilir bir şekilde erişmenizi sağlar:
ptr->memberBu, (*ptr).member yazmaya eşdeğerdir, ancak çok daha özlüdür.
İşte pratikte nasıl çalıştığı:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// Ok operatörünü kullanma
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// Bu şununla aynıdır:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);Ok operatörü, özellikle karmaşık veri yapılarıyla çalışırken kodunuzu daha temiz ve okunması daha kolay hale getirir. C programlamada pointer'lar aracılığıyla struct üyelerine erişmenin standart yoludur.
Görev
Kolayİşaretçiler aracılığıyla struct üyelerine erişmek için ok operatörünün kullanımını gösteren bir C programı oluşturun. Programınız şunları yapmalıdır:
- Aşağıdaki üyelere sahip
Bookadında birstructtanımlayın:- Kitap kimliğini saklamak için bir tam sayı
id - Kitap başlığını saklamak için 40 boyutunda bir karakter dizisi
title - Yazar adını saklamak için 30 boyutunda bir karakter dizisi
author - Kitap fiyatını saklamak için bir float
price - Sayfa sayısını saklamak için bir tam sayı
pages
- Kitap kimliğini saklamak için bir tam sayı
- Main fonksiyonu içinde,
myBookadında birBookdeğişkeni oluşturun bookPtradında birBookstruct işaretçisi bildirinmyBookdeğişkeninin adresinibookPtrişaretçisine atayın- Aşağıdaki giriş değerlerini okuyun ve işaretçi üzerinden ok operatörünü kullanarak struct üyelerine atayın:
- ID için bir tam sayı okuyun ve
bookPtr->idkullanarak atayın - Başlık için bir dize okuyun ve
bookPtr->titlekullanarak atayın - Yazar için bir dize okuyun ve
bookPtr->authorkullanarak atayın - Fiyat için bir float okuyun ve
bookPtr->pricekullanarak atayın - Sayfa sayısı için bir tam sayı okuyun ve
bookPtr->pageskullanarak atayın
- ID için bir tam sayı okuyun ve
- Tüm değerleri okuduktan sonra, ok operatörünü kullanarak aşağıdaki işlemleri gerçekleştirin:
- Fiyata %10 indirim uygulayın:
bookPtr->price = bookPtr->price * 0.9; - 50 bonus sayfa ekleyin:
bookPtr->pages += 50;
- Fiyata %10 indirim uygulayın:
- Her bir üyeye erişmek için ok operatörünü kullanarak kitap bilgilerini tam olarak şu formatta yazdırın:
Book Information:ID: [id]Title: [title]Author: [author]Price: [price]Pages: [pages]
- Ok operatörünü kullanarak sayfa başına fiyatı şu formatta hesaplayın ve yazdırın:
Price per page: [price_per_page]
Bu meydan okuma, işaretçiler aracılığıyla struct üyelerine erişmek için ok operatörünü anlama düzeyinizi test eder. Struct üyelerinden hem okuma hem de onlara yazma yapmak için ptr->member sözdizimini kullanma pratiği yapacaksınız; bu, (*ptr).member ile eşdeğer olduğunu ancak çok daha kullanışlı ve okunabilir olduğunu gösterir.
Kopya kağıdı
Ok operatörü (->), bir işaretçi aracılığıyla struct üyelerine erişmek için elverişli bir yol sağlar:
ptr->memberBu, (*ptr).member ile eşdeğerdir ancak daha kısa ve okunabilirdir.
Örnek kullanım:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// Ok operatörünü kullanma
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// Bu şununla aynıdır:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);Kendin dene
#include <stdio.h>
#include <string.h>
// YAPILACAK: Book yapısını (struct) burada tanımlayın
int main() {
// YAPILACAK: myBook adında bir Book değişkeni oluşturun
// YAPILACAK: bookPtr adında Book türünde bir işaretçi (pointer) tanımlayın
// YAPILACAK: myBook'un adresini bookPtr'ye atayın
// Giriş değerlerini oku
int id;
char title[40];
char author[30];
float price;
int pages;
scanf("%d", &id);
scanf("%s", title);
scanf("%s", author);
scanf("%f", &price);
scanf("%d", &pages);
// YAPILACAK: Ok operatörünü kullanarak giriş değerlerini yapı üyelerine atayın
// YAPILACAK: Ok operatörünü kullanarak fiyata %10 indirim uygulayın
// YAPILACAK: Ok operatörünü kullanarak 50 bonus sayfa ekleyin
// YAPILACAK: Ok operatörünü kullanarak kitap bilgilerini yazdırın
// YAPILACAK: Ok operatörünü kullanarak sayfa başına fiyatı hesaplayın ve 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ı