Dizi Elemanları - İşaretçiler
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 8 / 63.
Dizi adlarının işaretçi olarak nasıl çalıştığını anladığınıza göre, bu bilgiyi dizi öğelerine tamamen farklı bir şekilde erişmek için kullanabilirsiniz. array[i] gibi tanıdık köşeli ayraç notasyonunu kullanmak yerine, aynı sonucu elde etmek için işaretçi notasyonunu kullanabilirsiniz.
Temel içgörü, array[i] ifadesinin tam olarak *(array + i) ifadesine eşdeğer olmasıdır. array + i yazdığınızda, C'ye dizinin başlangıcından i konum ileri gitmesini söylersiniz. Dereferans operatörü * ise ardından o konumdaki değeri alır.
int numbers[5] = {10, 20, 30, 40, 50};
// Bu iki satır tam olarak aynı şeyi yapar:
printf("%d", numbers[2]); // 30 yazdırır
printf("%d", *(numbers + 2)); // Ayrıca 30 yazdırırBu işaretçi gösterimi çalışır çünkü C, veri tipi boyutuna bağlı olarak doğru bellek adresini otomatik olarak hesaplar. Bir tamsayı dizi işaretçisine 2 eklediğinizde, C 2 × sizeof(int) bayt kadar ileri gider ve tam olarak üçüncü elemana ulaşır.
Bu denkliği anlamak, dizilerle çalışma şeklinizde size esneklik sağlar ve C öğrenmeye devam ettikçe karşılaşacağınız daha gelişmiş işaretçi tekniklerine sizi hazırlar.
Görev
KolayGeleneksel dizi indeksleme yerine işaretçi gösterimini kullanarak dizi öğelerine erişimi gösteren bir C programı yazın. Programınız şunları yapmalıdır:
- 6 öğeli
valuesadında bir tam sayı dizisi tanımlayın ve bunu {5, 15, 25, 35, 45, 55} değerleriyle başlatın - Dizinin tüm öğeleri üzerinde gezinmek için bir for döngüsü kullanın
- Döngü içinde, her bir öğeye erişmek için işaretçi gösterimini
*(values + i)kullanın (values[i]gibi köşeli parantez gösterimini kullanmayın) - İşaretçi gösterimi erişim yöntemini kullanarak her bir öğeyi yazdırın
- Döngüden sonra, her iki yöntemi de kullanarak üçüncü öğeyi (indeks 2) yazdırarak eşdeğerliği gösterin:
- Önce işaretçi gösterimini kullanarak:
*(values + 2) - Ardından geleneksel dizi gösterimini kullanarak:
values[2]
- Önce işaretçi gösterimini kullanarak:
Çıktınız sonuçları aşağıdaki formatta görüntülemelidir:
Element 0: 5
Element 1: 15
Element 2: 25
Element 3: 35
Element 4: 45
Element 5: 55
Third element via pointer: 25
Third element via array: 25Bu meydan okuma, array[i] ile *(array + i) arasındaki eşdeğerlik anlayışınızı test eder ve işaretçi aritmetiğinin, geleneksel indeksleme yerine bellek adresi hesaplamalarını kullanarak dizi öğelerine erişmenize nasıl olanak tanıdığını gösterir.
Kopya kağıdı
Dizi öğelerine köşeli parantez notasyonu yerine işaretçi notasyonu kullanılarak erişilebilir. array[i] ifadesi *(array + i) ifadesine eşdeğerdir.
array + i yazdığınızda, C dizinin başlangıcından i konum ileri gider. Dereference (adresteki değere erişme) operatörü * o konumdaki değeri alır.
int numbers[5] = {10, 20, 30, 40, 50};
// Bu iki satır tam olarak aynı şeyi yapar:
printf("%d", numbers[2]); // 30 yazdırır
printf("%d", *(numbers + 2)); // Ayrıca 30 yazdırırC, veri tipi boyutuna göre doğru bellek adresini otomatik olarak hesaplar. Bir tam sayı dizi işaretçisine 2 eklemek, 2 × sizeof(int) bayt kadar ileri gider.
Kendin dene
#include <stdio.h>
int main() {
// TODO: Kodunuzu buraya yazın
// 6 elemanlı 'values' dizisini tanımlayın ve başlatın
// Her bir elemanı işaretçi notasyonu *(values + i) kullanarak yazdırmak için bir for döngüsü kullanın
// Döngüden sonra, üçüncü elemanı hem işaretçi hem de dizi notasyonu kullanarak yazdırı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ı