Yapılara İşaretçiler
Coddy'nin C Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 44 / 63.
Artık struct'larla çalışmaya alıştığınıza göre, onları güçlü bir başka C kavramıyla birleştirmenin zamanı geldi: işaretçiler. int veya char gibi temel veri türlerine işaretçiler oluşturabildiğiniz gibi, bir struct değişkeninin adresini tutan işaretçiler de oluşturabilirsiniz.
Bir struct işaretçisi bildirme sözdizimi, diğer işaretçi bildirimleriyle aynı kalıbı izler:
struct StructureName *pointerName;Örneğin, alışık olduğumuz Point struct'ını kullanarak:
struct Point p1 = {10, 20};
struct Point *ptr;Bu, bir Point yapısının adresini saklayabilen ptr adlı bir işaretçi oluşturur. İşaretçinin gerçekten yapı değişkenimizi göstermesini sağlamak için adres operatörünü kullanırsın:
ptr = &p1;İşaretçi aracılığıyla bir üyeyi okumak için işaretçinin başvurusunu kaldırın ve ardından nokta operatörünü kullanın. Parantezler gereklidir, çünkü ., * operatöründen daha sıkı bağlanır:
printf("%d", (*ptr).x); // p1.x ile aynıArtık ptr, p1 struct değişkeninin bellek adresini tutuyor. Bu, özellikle struct'ları fonksiyonlara geçirirken veya belleği dinamik olarak yönetirken struct'larla çalışmak için yeni olanaklar sunar. Struct işaretçileri, daha karmaşık veri yapıları oluşturmak ve verimli C programları yazmak için gereklidir.
Görev
KolayC dilinde, struct işaretçileriyle çalışmayı gösteren bir program oluştur. Programın şunları yapmalı:
- Aşağıdaki üyeleri içeren
Productadlı birstructtanımla:- Ürün kimliğini saklamak için bir tamsayı
id - Ürün adını saklamak için 25 elemanlı bir karakter dizisi
name - Ürün fiyatını saklamak için bir kayan noktalı sayı
price - Mevcut miktarı saklamak için bir tamsayı
quantity
- Ürün kimliğini saklamak için bir tamsayı
- main fonksiyonunda,
itemadlı birProductdeğişkeni oluştur ve onu şu değerlerle başlat:- Kimlik: 501
- Ad: "Laptop"
- Fiyat: 899.99
- Miktar: 15
itemPtradlı birProductstruct işaretçisi tanımla- Adres alma operatörünü kullanarak
itemdeğişkeninin adresiniitemPtrdeğişkenine ata - Struct üyelerine doğrudan erişerek (nokta operatörünü kullanarak) orijinal ürün bilgilerini tam olarak şu biçimde yazdır:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Aynı ürün bilgilerini struct üyelerine işaretçi üzerinden erişerek (başvuruyu kaldırma operatörünü ve nokta gösterimini kullanarak:
(*itemPtr).member) tam olarak şu biçimde yazdır:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Bellek adreslerini tam olarak şu biçimde yazdırarak işaretçinin struct'ı doğru gösterdiğini doğrula:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
Adres doğrulaması için, adresler aynıysa Match, farklıysa No Match yazdır.
Bu alıştırma, struct işaretçisi bildirimini, adres alma operatörünü kullanarak adres atamayı ve başvuruyu kaldırma operatörü ile nokta gösterimini birlikte kullanarak işaretçiler üzerinden struct üyelerine erişmeyi anlayıp anlamadığını sınar. Ayrıca işaretçinin struct değişkeninin adresini doğru şekilde tuttuğunu doğrulayacaksın.
Kendin dene
#include <stdio.h>
#include <string.h>
// TODO: Product yapısını burada tanımlayın
int main() {
// TODO: Kodunuzu buraya yazın
// 1. 'item' adlı Product değişkenini oluşturun ve başlangıç değerlerini atayın
// 2. 'itemPtr' adlı bir Product işaretçisi tanımlayın
// 3. 'item' değişkeninin adresini 'itemPtr' değişkenine atayın
// 4. Nokta operatörünü kullanarak ürünün başlangıç bilgilerini yazdırın
// 5. (*itemPtr).member kullanarak ürün bilgilerini işaretçi üzerinden yazdırın
// 6. Adresleri yazdırın ve doğrulayı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