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 diziler içinde 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ü 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ü, ptr1 < ptr2 ifadesinin size ptr1'in, ptr2'nin işaret ettiği öğeden dizide daha önce gelen bir öğeye işaret ettiğini söylemesidir. Bu ilişki, dizileri sıralı olarak işleyen döngüleri kontrol etmek için işaretçi karşılaştırmasını 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 bunu 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 arasında (dahil) 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 işaretçisini artırın
  8. Döngüden sonra, current_ptr > end_ptr kontrolünü yaparak current_ptr işaretçisinin artık dizinin sonunun ötesinde olduğunu doğrulamak için işaretçi karşılaştırması 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 görev, 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.

Kopya kağıdı

İşaretçiler (pointers), ilişkisel operatörler kullanılarak karşılaştırılabilir: ==, !=, <, ve >.

İşaretçileri karşılaştırırken, onların bellek adreslerini karşılaştırırsınız. Bu, aynı dizi içindeki öğelerin göreceli konumlarını belirlemek için kullanışlıdır.

int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers;        // İlk öğeyi işaret eder
int *end = numbers + 4;      // Son öğeyi 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üdür ve sayaç değişkenleri kullanmak yerine işaretçi konumlarını karşılaştırarak döngüleri kontrol etmenize olanak tanır:

int *current_ptr = numbers;
int *end_ptr = numbers + 4;

while (current_ptr <= end_ptr) {
    // Mevcut öğeyi işle
    current_ptr++;  // Bir sonraki öğeye geç
}

ptr1 < ptr2 ifadesi, ptr1'in dizide ptr2'nin işaret ettiği öğeden daha önce gelen bir öğeyi işaret ettiği anlamına gelir.

Kendin dene

#include <stdio.h>

int main() {
    // YAPILACAK: 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