Yapı dizileri — C dilinde benzer türdeki verilerin saklanması ve işlenmesi için popüler yöntemlerden biridir, örneğin veri tablosu, nokta dizisi, çalışanlar vb.
Konunun Tarihi:
Diziler ve yapılar, verilerin düzenlenmesi için ilk C sürümlerinde desteklenmeye başlamıştır. Ancak, yapı dizileri ile çalışma, dilin özelliklerini, bellek yönetimini ve veri iletimi ilkelerini anlamayı gerektirir.
Sorun:
Hatalar, yapı dizisinin yanlış başlatılması, bellek karışıklığı, dizinin işlevlere geçişi (işlevlere işaretçi olarak geçebilir) ve yapıların alanlarına yanlış indeksleme ile erişim sırasında ortaya çıkabilmektedir.
Çözüm:
. ve -> ile erişilir.Kod örneği:
#include <stdio.h> struct Point { int x; int y; }; void print_points(struct Point *arr, int size) { for(int i = 0; i < size; ++i) { printf("(%d, %d)\n", arr[i].x, arr[i].y); } } int main() { struct Point points[3] = { {1,2}, {3,4}, {5,6} }; print_points(points, 3); return 0; }
Anahtar özellikler:
Dizideki yapıların alanlarına erişim ile erişim ok ve nokta sembolü ile nasıl farklıdır?
arr[i].field kullanılırsa, arr[i] kendisi yapıdır.
ptr->field kullanılırsa, ptr yapı işaretçisidir.
struct Point *p = &points[0]; printf("%d", p->x); // doğru // points[0].x — bu da doğrudur
Yapı dizisinin kısmi başlatılması durumunda diğer alanların değerleri ne olur?
Kısmi başlatmada belirtilmeyen alanlar, statik olarak tahsis edilen dizilerde sıfırlarla doldurulur, ancak otomatik (yığın) değişkenler için bu geçerli değildir.
struct Point arr[2] = { {10} }; // arr[0].x = 10, arr[0].y = 0, arr[1].x ve arr[1].y = 0
Yapı dizisini işlevde geçerken yapıların kopyaları mı iletilir?
Hayır, ilk elemanına işaretçi gönderilir ve bu işlemde işlev, orijinal bellek ile çalıştığı için elemanı değiştirebilir.
Programcı, yapı dizisini kullanmadan önce alanları başlatmadan tanımladı ve doldurulması için bir işleve geçirdi. Bir işaretçi ile çalışırken . yerine -> operatörünü kullandı. Sonuç olarak, tür hatası ve çöp değerlerin kullanımıyla sonuçlandı.
Artıları:
Eksileri:
Tüm dizi için {0} şeklinde belirgin bir sıfır başlatıcısı kullanıldı, işlev bir işaretçi ve boyut aldı, alanlara erişim kesinlikle ve türüne uygun olarak yapıldı (arr[i].x).
Artıları:
Eksileri: