İşaretçi Aritmetiği
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 9 / 63.
Dizi öğelerine *(array + i) gibi işaretçi notasyonu kullanarak nasıl erişeceğinizi öğrendiniz. Şimdi daha da güçlü bir teknik keşfedeceksiniz: işaretçi aritmetiği; bu teknik, işaretçileri basit artırma ve eksiltme işlemleri kullanarak bellek üzerinde hareket ettirmenize olanak tanır.
Bir işaretçiyi ++ ile artırdığınızda veya -- ile azalttığınızda, işaretçi sadece bir bayt hareket etmez. Bunun yerine, işaret ettiği veri tipinin boyutu kadar hareket eder. Bir tamsayı işaretçisi için, ptr++ ifadesi sizeof(int) bayt kadar ileri gider ve bellekte tam olarak bir sonraki tamsayının üzerine gelir.
int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers; // İlk elemanı işaret eder (10)
ptr++; // Şimdi ikinci elemanı işaret ediyor (20)
ptr++; // Şimdi üçüncü elemanı işaret ediyor (30)Bu otomatik boyut hesaplaması, işaretçi aritmetiğini bu kadar güçlü ve kullanışlı kılan şeydir. Bayt hesaplamaları konusunda endişelenmenize gerek yoktur; C, işaretçinin veri türüne bağlı olarak bellek adreslemesini sizin için halleder.
İşaretçi aritmetiği, diziler üzerinde döngülerle gezinmek için özellikle yararlıdır. Dizi indekslerini kullanmak yerine, her bir eleman üzerinden sırayla geçmek için bir işaretçiyi artırabilirsiniz; bu da genellikle daha verimli kodla sonuçlanır.
Görev
KolayBir diziyi dolaşmak ve işlemek için işaretçi artırma (pointer increment) işlemlerini kullanarak işaretçi aritmetiğini gösteren bir C programı yazın. Programınız şunları yapmalıdır:
- 5 elemanlı
dataadında bir tam sayı dizisi tanımlayın ve bunu {12, 24, 36, 48, 60} değerleriyle başlatın ptradında bir tam sayı işaretçisi tanımlayın ve bunu dizinin ilk elemanını gösterecek şekilde başlatın- Yalnızca işaretçi aritmetiği kullanarak tüm diziyi dolaşmak için 5 kez çalışan bir for döngüsü kullanın
- Döngü içinde:
- Dereference operatörünü kullanarak
ptrişaretçisinin gösterdiği mevcut değeri yazdırın %pformat belirleyicisini kullanarakptriçinde saklanan bellek adresini yazdırın- Bir sonraki elemana geçmek için
ptr++kullanarak işaretçiyi artırın
- Dereference operatörünü kullanarak
- Döngüden sonra,
ptrişaretçisini dizinin ilk elemanını gösterecek şekilde sıfırlayın *(ptr + 2)kullanarak üçüncü elemana (indeks 2) doğrudan erişmek ve yazdırmak için işaretçi aritmetiğini kullanın*(ptr + 4)kullanarak son elemana (indeks 4) doğrudan erişmek ve yazdırmak için işaretçi aritmetiğini kullanın
Çıktınız sonuçları aşağıdaki formatta görüntülemelidir:
Value: 12, Address: [address]
Value: 24, Address: [address]
Value: 36, Address: [address]
Value: 48, Address: [address]
Value: 60, Address: [address]
Third element: 36
Last element: 60Bu meydan okuma, işaretçi artırma işlemlerinin veri tipinin boyutuna göre otomatik olarak nasıl hareket ettiğini ve bir temel işaretçi konumundan belirli ofsetlerdeki dizi elemanlarına erişmek için işaretçi aritmetiğini nasıl kullanabileceğinizi anlama yeteneğinizi test eder.
Kopya kağıdı
İşaretçi aritmetiği, artırma ve eksiltme işlemlerini kullanarak işaretçileri bellek içinde hareket ettirmenize olanak tanır. Bir işaretçiyi artırdığınızda, bir bayt değil, işaret ettiği veri tipinin boyutu kadar hareket eder.
Temel işaretçi aritmetiği işlemleri:
int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers; // Points to first element (10)
ptr++; // Now points to second element (20)
ptr++; // Now points to third element (30)Belirli ofsetlerdeki öğelere erişmek için de işaretçi aritmetiğini kullanabilirsiniz:
*(ptr + 2) // Access element at offset 2 from current positionİşaretçi aritmetiği, dizileri döngüler içinde taramak için kullanışlıdır ve genellikle dizi indekslerini kullanmaktan daha verimli kodlar ortaya çıkarır.
Kendin dene
#include <stdio.h>
int main() {
// TODO: Kodunuzu buraya yazın
// 'data' dizisini bildirin ve {12, 24, 36, 48, 60} değerleriyle başlatın
// 'ptr' işaretçisini bildirin ve ilk elemanı gösterecek şekilde başlatın
// Diziyi dolaşmak için işaretçi aritmetiği ile bir for döngüsü kullanın
// Her bir değeri ve adresi yazdırın, ardından işaretçiyi artırın
// İşaretçiyi sıfırlayın ve belirli elemanlara erişmek için işaretçi aritmetiği kullanı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ı