Menu
Coddy logo textTech

İş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.

challenge icon

Görev

Kolay

Bir 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:

  1. 5 elemanlı data adında bir tam sayı dizisi tanımlayın ve bunu {12, 24, 36, 48, 60} değerleriyle başlatın
  2. ptr adında bir tam sayı işaretçisi tanımlayın ve bunu dizinin ilk elemanını gösterecek şekilde başlatın
  3. 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
  4. Döngü içinde:
    • Dereference operatörünü kullanarak ptr işaretçisinin gösterdiği mevcut değeri yazdırın
    • %p format belirleyicisini kullanarak ptr içinde saklanan bellek adresini yazdırın
    • Bir sonraki elemana geçmek için ptr++ kullanarak işaretçiyi artırın
  5. Döngüden sonra, ptr işaretçisini dizinin ilk elemanını gösterecek şekilde sıfırlayın
  6. *(ptr + 2) kullanarak üçüncü elemana (indeks 2) doğrudan erişmek ve yazdırmak için işaretçi aritmetiğini kullanın
  7. *(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: 60

Bu 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;
}
quiz iconKendini test et

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