Menu
Coddy logo textTech

İşaretçilerin Karşılaştırılması

Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 10 / 63.

İşaretçi aritmetiğini kullanarak dizilerde nasıl hareket edeceğinizi öğrendiniz. Şimdi, işaretçilerin de normal değişkenlerle kullandığınız aynı ilişkisel operatörler kullanılarak karşılaştırılabileceğini keşfedeceksiniz: ==, !=, < ve >.

İki işaretçiyi (pointer) karşılaştırdığınızda, onların bellek adreslerini karşılaştırmış olursunuz. Bu, her iki işaretçi de aynı dizi içindeki öğeleri gösterdiğinde özellikle yararlıdır, çünkü bu, onların bellekteki göreceli konumlarını belirlemenize olanak tanır.

int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers;        // İlk elemanı işaret eder
int *end = numbers + 4;      // Son elemanı işaret eder

if (start < end) {
    printf("start comes before end in memory");
}

İşaretçi karşılaştırması, döngü koşullarında özellikle güçlü hale gelir. Bir sayaç değişkeni kullanmak yerine, döngünün ne zaman duracağını kontrol etmek için mevcut işaretçi konumunuzu bir hedef işaretçi ile karşılaştırabilirsiniz. Bu, dizi gezintisi için zarif ve verimli bir kod oluşturur.

Temel içgörü şudur ki; ptr1 < ptr2 ifadesi, ptr1'in dizide ptr2'nin işaret ettiği öğeden daha önce gelen bir öğeye işaret ettiğini söyler. Bu ilişki, işaretçi karşılaştırmasını, dizileri ardışık olarak işleyen döngüleri kontrol etmek için doğal bir yöntem haline getirir.

challenge icon

Görev

Kolay

Bir diziyi taramak ve belirli bir aralıktaki öğeleri bulmak için işaretçi karşılaştırmasını (pointer comparison) kullanan bir C programı yazın. Programınız şunları yapmalıdır:

  1. 8 öğeli scores adında bir tam sayı dizisi tanımlayın ve bunu {45, 78, 92, 63, 87, 34, 91, 56} değerleriyle başlatın
  2. Tam sayılara işaret eden iki işaretçi tanımlayın: start_ptr ve end_ptr
  3. start_ptr işaretçisini dizinin ilk öğesini gösterecek şekilde ayarlayın
  4. İşaretçi aritmetiği kullanarak end_ptr işaretçisini dizinin son öğesini gösterecek şekilde ayarlayın
  5. current_ptr adında bir işaretçi tanımlayın ve onu ilk öğeyi gösterecek şekilde başlatın
  6. Diziyi taramak için işaretçi karşılaştırması (current_ptr <= end_ptr) içeren bir while döngüsü kullanın
  7. Döngü içinde:
    • Mevcut değerin 60 ile 90 (dahil) arasında olup olmadığını kontrol edin
    • Eğer değer aralıktaysa, "Value [value] is in range" yazdırın
    • Eğer değer aralıkta değilse, "Value [value] is out of range" yazdırın
    • Bir sonraki öğeye geçmek için current_ptr değerini artırın
  8. Döngüden sonra, current_ptr > end_ptr olup olmadığını kontrol ederek current_ptr işaretçisinin artık dizinin sonunun ötesinde olduğunu doğrulamak için işaretçi karşılaştırmasını kullanın
  9. Eğer koşul doğruysa, "Traversal complete" yazdırın

Çıktınız sonuçları aşağıdaki formatta görüntülemelidir:

Value 45 is out of range
Value 78 is in range
Value 92 is out of range
Value 63 is in range
Value 87 is in range
Value 34 is out of range
Value 91 is out of range
Value 56 is out of range
Traversal complete

Bu zorluk, döngü koşullarında işaretçi karşılaştırma operatörlerini anlama, sınır işaretçilerini ayarlamak için işaretçi aritmetiğini kullanma ve işaretçi karşılaştırmasının dizi taramasını geleneksel sayaç tabanlı döngülerden nasıl daha zarif bir şekilde kontrol edebileceğini test eder.

Kendin dene

#include <stdio.h>

int main() {
    // TODO: Kodunuzu aşağıya yazı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