Ok Operatörü (->)
Coddy'nin C Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 45 / 63.
Yapılara işaretçilerle çalışırken, yapı üyelerine erişmek özel bir söz dizimi gerektirir. Dereference operatörünü ve nokta gösterimini birlikte kullanabilseniz de C, bu amaç için özel olarak daha kullanışlı bir operatör sağlar: ok operatörü (->).
Ok operatörü, bir işaretçi aracılığıyla yapı üyelerine temiz ve okunabilir bir şekilde erişmenizi sağlar:
ptr->memberBu, (*ptr).member yazmaya eşdeğerdir, ancak çok daha kısadır.
İşte pratikte nasıl çalıştığı:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// Ok operatörü kullanımı
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ü kodunuzu daha temiz ve okunması daha kolay hâle getirir; özellikle karmaşık veri yapılarıyla çalışırken. C programlamada yapı üyelerine işaretçiler aracılığıyla erişmenin standart yoludur.
Görev
Kolayİşaretçiler aracılığıyla yapı üyelerine erişmek için ok operatörünün kullanımını gösteren bir C programı oluştur. Programın şunları yapması gerekir:
- Aşağıdaki üyelere sahip
structadlı birBooktanımla:- Kitap kimliğini depolamak için bir tamsayı
id - Kitap başlığını depolamak için 40 boyutunda bir karakter dizisi
title - Yazar adını depolamak için 30 boyutunda bir karakter dizisi
author - Kitap fiyatını depolamak için bir kayan noktalı sayı
price - Sayfa sayısını depolamak için bir tamsayı
pages
- Kitap kimliğini depolamak için bir tamsayı
- main işlevinde
Bookadlı birmyBookdeğişkeni oluştur Bookadlı birbookPtryapısına işaretçi tanımlamyBookadresinibookPtr'ye ata- Aşağıdaki giriş değerlerini oku ve işaretçi üzerinden ok operatörünü kullanarak yapı üyelerine ata:
- Kimlik için bir tamsayı oku ve
bookPtr->idkullanarak ata - Başlık için bir dize oku ve
bookPtr->titlekullanarak ata - Yazar için bir dize oku ve
bookPtr->authorkullanarak ata - Fiyat için bir kayan noktalı sayı oku ve
bookPtr->pricekullanarak ata - Sayfa sayısı için bir tamsayı oku ve
bookPtr->pageskullanarak ata
- Kimlik için bir tamsayı oku ve
- Tüm değerleri okuduktan sonra ok operatörünü kullanarak aşağıdaki işlemleri gerçekleştir:
- Fiyata %10 indirim uygula:
bookPtr->price = bookPtr->price * 0.9; - 50 bonus sayfa ekle:
bookPtr->pages += 50;
- Fiyata %10 indirim uygula:
- Her üyeye erişmek için ok operatörünü kullanarak kitap bilgilerini tam olarak şu biçimde yazdır:
Book Information:ID: [id]Title: [title]Author: [author]Price: [price]Pages: [pages]
- Ok operatörünü kullanarak sayfa başına fiyatı şu biçimde hesapla ve yazdır:
Price per page: [price_per_page]
Bu alıştırma, işaretçiler aracılığıyla yapı üyelerine erişmek için ok operatörünü anladığını sınar. Yapı üyelerinden veri okumak ve yapı üyelerine veri yazmak için ptr->member söz dizimini kullanmayı; bunun (*ptr).member ile eşdeğer olduğunu, ancak çok daha kullanışlı ve okunabilir olduğunu göstererek pratik edeceksin.
Kendin dene
#include <stdio.h>
#include <string.h>
// TODO: Book struct yapısını burada tanımlayın
int main() {
// TODO: myBook adında bir Book değişkeni oluşturun
// TODO: bookPtr adında Book türünde bir işaretçi (pointer) bildirin
// TODO: myBook değişkeninin adresini bookPtr işaretçisine 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);
// TODO: Ok operatörünü kullanarak giriş değerlerini struct üyelerine atayın
// TODO: Ok operatörünü kullanarak price değerine %10 indirim uygulayın
// TODO: Ok operatörünü kullanarak 50 bonus sayfa ekleyin
// TODO: Ok operatörünü kullanarak kitap bilgilerini yazdırın
// TODO: 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.
Mantık & Akış 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ıKendi başına pratik yap: Online C derleyicisi