İşaretçilerin Karşılaştırılması
Coddy'nin C Journey'sinin Mantık & Akış 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.
Görev
KolayBir diziyi dolaşmak ve belirli bir aralıktaki öğeleri bulmak için işaretçi karşılaştırması kullanan bir C programı yazın. Programınız şunları yapmalıdır:
- 8 öğeli
scoresadlı bir tamsayı dizisi tanımlayın ve diziyi {45, 78, 92, 63, 87, 34, 91, 56} değerleriyle başlatın - İki tamsayı işaretçisi tanımlayın:
start_ptrveend_ptr start_ptrişaretçisini dizinin ilk öğesini gösterecek şekilde ayarlayınend_ptrişaretçisini işaretçi aritmetiğini kullanarak dizinin son öğesini gösterecek şekilde ayarlayıncurrent_ptradlı bir işaretçi tanımlayın ve bunu ilk öğeyi gösterecek şekilde başlatın- Diziyi dolaşmak için işaretçi karşılaştırması (
current_ptr <= end_ptr) kullanan bir while döngüsü kullanın - Döngünün içinde:
- Geçerli değerin 60 ile 90 arasında (bu değerler dahil) olup olmadığını kontrol edin
- Değer aralıktaysa, "Değer [value] aralıkta" yazdırın
- Değer aralıkta değilse, "Değer [value] aralık dışında" yazdırın
- Sonraki öğeye geçmek için
current_ptrdeğerini artırın
- Döngüden sonra,
current_ptrkoşulunu kontrol ederekcurrent_ptr > end_ptrişaretçisinin artık dizinin sonunu geçtiğini doğrulamak için işaretçi karşılaştırması kullanın - Koşul doğruysa, "Dolaşma tamamlandı" yazdırın
Çıktınız aşağıdaki biçimdeki sonuçları 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 alıştırma, döngü koşullarında işaretçi karşılaştırma işleçlerini, sınır işaretçilerini ayarlamak için işaretçi aritmetiğini ve işaretçi karşılaştırmasının dizi dolaşımını geleneksel sayaç tabanlı döngülerden daha zarif bir şekilde nasıl denetleyebileceğini anlamanızı sınar.
Kendin dene
#include <stdio.h>
int main() {
// TODO: 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.
Mantık & Akış 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ıKendi başına pratik yap: Online C derleyicisi