İşaretçi Aritmetiği
Coddy'nin C Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 9 / 63.
Dizi öğelerine *(array + i) gibi işaretçi notasyonu kullanarak nasıl erişeceğinizi öğrendiniz. Şimdi daha da güçlü bir teknik keşfedeceksiniz: işaretçi aritmetiği; bu teknik, işaretçileri basit artırma ve eksiltme işlemleri kullanarak bellek üzerinde hareket ettirmenize olanak tanır.
Bir işaretçiyi ++ ile artırdığınızda veya -- ile azalttığınızda, işaretçi sadece bir bayt hareket etmez. Bunun yerine, işaret ettiği veri tipinin boyutu kadar hareket eder. Bir tamsayı işaretçisi için, ptr++ ifadesi sizeof(int) bayt kadar ileri gider ve bellekte tam olarak bir sonraki tamsayının üzerine gelir.
int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers; // İlk elemanı işaret eder (10)
ptr++; // Şimdi ikinci elemanı işaret ediyor (20)
ptr++; // Şimdi üçüncü elemanı işaret ediyor (30)Bu otomatik boyut hesaplaması, işaretçi aritmetiğini bu kadar güçlü ve kullanışlı kılan şeydir. Bayt hesaplamaları konusunda endişelenmenize gerek yoktur; C, işaretçinin veri türüne bağlı olarak bellek adreslemesini sizin için halleder.
İşaretçi aritmetiği, diziler üzerinde döngülerle gezinmek için özellikle yararlıdır. Dizi indekslerini kullanmak yerine, her bir eleman üzerinden sırayla geçmek için bir işaretçiyi artırabilirsiniz; bu da genellikle daha verimli kodla sonuçlanır.
Görev
KolayDizi üzerinde gezinmek ve işlem yapmak için işaretçi artırma işlemlerini kullanarak işaretçi aritmetiğini gösteren bir C programı yazın. Programınız şunları yapmalıdır:
- 5 öğeli,
dataadlı bir tamsayı dizisi tanımlayın ve onu {12, 24, 36, 48, 60} değerleriyle başlatın ptradlı bir tamsayı işaretçisi tanımlayın ve dizinin ilk öğesini gösterecek şekilde başlatın- Yalnızca işaretçi aritmetiğini kullanarak dizinin tamamında gezinmek için 5 kez çalışan bir for döngüsü kullanın
- Döngünün içinde:
- Dereference operatörünü kullanarak
ptr'nin gösterdiği mevcut değeri yazdırın ptrbiçim belirtecini kullanarak%p'de depolanan bellek adresini yazdırın- Sonraki öğeye geçmek için
ptr++kullanarak işaretçiyi artırın
- Dereference operatörünü kullanarak
- Döngüden sonra,
ptr'yi dizinin ilk öğesini yeniden gösterecek şekilde ayarlayın - Üçüncü öğeye (indeks 2) doğrudan erişmek ve onu yazdırmak için işaretçi aritmetiğini ve
*(ptr + 2)ifadesini kullanın - Son öğeye (indeks 4) doğrudan erişmek ve onu yazdırmak için işaretçi aritmetiğini ve
*(ptr + 4)ifadesini kullanın
Çıktınız aşağıdaki biçimde sonuçları göstermelidir:
Value: 12, Address: [address]
Value: 24, Address: [address]
Value: 36, Address: [address]
Value: 48, Address: [address]
Value: 60, Address: [address]
Third element: 36
Last element: 60Bu alıştırma, işaretçi artırma işlemlerinin veri türünün boyutuna göre otomatik olarak ilerlemeyi nasıl sağladığını ve bir temel işaretçi konumundan belirli uzaklıklardaki dizi öğelerine erişmek için işaretçi aritmetiğini nasıl kullanabileceğinizi anlamanızı ölçer.
Kendin dene
#include <stdio.h>
int main() {
// TODO: Kodunuzu buraya yazın
// 'data' dizisini bildirin ve {12, 24, 36, 48, 60} değerleriyle başlatın
// 'ptr' işaretçisini bildirin ve ilk elemanı gösterecek şekilde başlatın
// Diziyi dolaşmak için işaretçi aritmetiği ile bir for döngüsü kullanın
// Her bir değeri ve adresi yazdırın, ardından işaretçiyi artırın
// İşaretçiyi sıfırlayın ve belirli elemanlara erişmek için işaretçi aritmetiği kullanı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