İş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 ilerleyeceğinizi öğrendiniz. Şimdi işaretçilerin, normal değişkenlerle kullandığınız aynı karşılaştırma işleçleriyle karşılaştırılabileceğini de keşfedeceksiniz: ==, !=, < ve >.
İki işaretçiyi karşılaştırdığında, bellek adreslerini karşılaştırmış olursun. Bu, özellikle her iki işaretçi de aynı dizideki öğeleri gösterdiğinde kullanışlıdır; çünkü bellek içindeki göreli konumlarını belirlemeni sağlar.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // İlk öğeyi gösterir
int *end = numbers + 4; // Son öğeyi gösterir
if (start < end) {
printf("start comes before end in memory");
}İşaretçi karşılaştırması, döngü koşullarında özellikle güçlü hâle gelir. Bir sayaç değişkeni kullanmak yerine, döngünün ne zaman durması gerektiğini kontrol etmek için mevcut işaretçi konumunuzu hedef işaretçiyle karşılaştırabilirsiniz. Bu, dizilerde gezinmek için zarif ve verimli bir kod oluşturur.
Temel çıkarım şudur: ptr1 < ptr2, ptr1 öğesinin dizide ptr2 öğesinin gösterdiği öğeden daha önce yer alan bir öğeyi gösterdiğini söyler. Bu ilişki, işaretçi karşılaştırmasını dizileri sıralı olarak işleyen döngüleri kontrol etmek için doğal bir seçenek hâline 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 bildirin ve {45, 78, 92, 63, 87, 34, 91, 56} değerleriyle başlatın - İki tamsayı işaretçisi bildirin:
start_ptrveend_ptr start_ptrişaretçisini dizinin ilk öğesini gösterecek şekilde ayarlayınend_ptrişaretçisini işaretçi aritmetiği kullanarak dizinin son öğesini gösterecek şekilde ayarlayıncurrent_ptradlı bir işaretçi bildirin 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 (dahil) olup olmadığını kontrol edin
- Değer aralıktaysa, tam olarak
Value [value] is in rangeyazdırın - Değer aralıkta değilse, tam olarak
Value [value] is out of rangeyazdırın - Bir sonraki öğeye geçmek için
current_ptrişaretçisini artırın
- Döngüden sonra,
current_ptr > end_ptrkoşulunu kontrol ederekcurrent_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, tam olarak
Traversal completeyazdırın
Çıktınız sonuçları aşağıdaki biçimde göstermelidir:
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 işleçlerini, sınır işaretçilerini ayarlamak için işaretçi aritmetiği kullanmayı 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 kontrol edebileceğini anladığını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