Yapılara İşaretçiler
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 44 / 63.
Artık struct'larla çalışmaya alıştığınıza göre, onları bir başka güçlü C kavramıyla birleştirmenin zamanı geldi: pointer'lar. Tıpkı int veya char gibi temel veri türlerine işaret eden pointer'lar oluşturabildiğiniz gibi, bir struct değişkeninin adresini tutan pointer'lar da oluşturabilirsiniz.
Bir yapıya (struct) yönelik bir işaretçi (pointer) tanımlama sözdizimi, diğer işaretçi tanımlamalarıyla aynı kalıbı izler:
struct StructureName *pointerName;Örneğin, aşina olduğumuz Point struct yapısını kullanarak:
struct Point p1 = {10, 20};
struct Point *ptr;Bu, bir Point yapısının (struct) adresini saklayabilen ptr adında bir işaretçi oluşturur. İşaretçinin gerçekten struct değişkenimizi göstermesini sağlamak için adres operatörünü kullanırsınız:
ptr = &p1;Artık ptr, p1 struct değişkeninin bellek adresini tutar. Bu, özellikle struct'ları fonksiyonlara aktarırken veya belleği dinamik olarak yönetirken struct'larla çalışmak için yeni olanaklar sunar. Struct işaretçileri (pointers), daha karmaşık veri yapıları oluşturmak ve verimli C programları yazmak için gereklidir.
Görev
KolayYapı (struct) işaretçileri ile çalışmayı gösteren bir C programı oluşturun. Programınız şunları yapmalıdır:
- Aşağıdaki üyelere sahip
Productadında birstructtanımlayın:- Ürün kimliğini saklamak için bir tam sayı
id - Ürün adını saklamak için 25 boyutunda bir karakter dizisi
name - Ürün fiyatını saklamak için bir float
price - Mevcut miktarı saklamak için bir tam sayı
quantity
- Ürün kimliğini saklamak için bir tam sayı
- Ana fonksiyonda,
itemadında birProductdeğişkeni oluşturun ve onu aşağıdaki değerlerle başlatın:- ID: 501
- Name: "Laptop"
- Price: 899.99
- Quantity: 15
itemPtradında birProductyapısı işaretçisi bildirin- Adres operatörünü kullanarak
itemdeğişkeninin adresiniitemPtrdeğişkenine atayın - Orijinal ürün bilgilerini, yapı üyelerine doğrudan erişerek (nokta operatörünü kullanarak) tam olarak şu formatta yazdırın:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Aynı ürün bilgilerini, yapı üyelerine işaretçi aracılığıyla erişerek (dereference operatörü ve nokta notasyonunu kullanarak:
(*itemPtr).member) tam olarak şu formatta yazdırın:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Bellek adreslerini tam olarak şu formatta yazdırarak işaretçinin yapıyı doğru şekilde gösterdiğini doğrulayın:
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ın.
Bu görev; yapı işaretçisi bildirimi, adres operatörü kullanarak adres atama ve dereference operatörü ile nokta notasyonunu birleştirerek işaretçiler üzerinden yapı üyelerine erişim konusundaki anlayışınızı test eder. Ayrıca işaretçinin yapı değişkeninin adresini doğru şekilde tutup tutmadığını da doğrulayacaksınız.
Kopya kağıdı
Yapı (struct) işaretçilerini, diğer işaretçi bildirimleriyle aynı sözdizimini kullanarak oluşturabilirsiniz:
struct StructureName *pointerName;Bir işaretçinin bir yapı değişkenini göstermesini sağlamak için adres operatörünü kullanın:
struct Point p1 = {10, 20};
struct Point *ptr;
ptr = &p1;Yapı üyelerine bir işaretçi aracılığıyla erişmek için dolaylı başvuru (dereference) operatörünü ve nokta notasyonunu kullanın:
(*ptr).memberKendin dene
#include <stdio.h>
#include <string.h>
// YAPILACAK: Product yapısını (struct) burada tanımlayın
int main() {
// YAPILACAK: Kodunuzu buraya yazın
// 1. 'item' adlı Product değişkenini oluşturun ve başlatın
// 2. 'itemPtr' adında Product türünde bir işaretçi (pointer) tanımlayın
// 3. 'item' değişkeninin adresini 'itemPtr' işaretçisine atayın
// 4. Nokta operatörünü kullanarak orijinal ürün bilgilerini yazdırın
// 5. (*itemPtr).member kullanarak işaretçi üzerinden ürün bilgilerini 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.
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ı