İş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.
Görev
KolayBir 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:
- 8 öğeli
scoresadında bir tam sayı dizisi tanımlayın ve bunu {45, 78, 92, 63, 87, 34, 91, 56} değerleriyle başlatın - Tam sayılara işaret eden iki işaretçi tanımlayın:
start_ptrveend_ptr start_ptrişaretçisini dizinin ilk öğesini gösterecek şekilde ayarlayın- İşaretçi aritmetiği kullanarak
end_ptrişaretçisini dizinin son öğesini gösterecek şekilde ayarlayın current_ptradında bir işaretçi tanımlayın ve bunu ilk öğeyi gösterecek şekilde başlatın- Diziyi taramak için işaretçi karşılaştırması (
current_ptr <= end_ptr) içeren bir while döngüsü kullanın - 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_ptrişaretçisini artırın
- Döngüden sonra,
current_ptr > end_ptrkontrolünü yaparakcurrent_ptrişaretçisinin artık dizinin sonunun ötesinde olduğunu doğrulamak için işaretçi karşılaştırması kullanın - 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 completeBu 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;
}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ı