İşaretçi dizisi — her bir elemanın genellikle aynı türde bir işaretçi olduğu bir yapıdır. Örneğin, metin listelerini saklamak için kullanılır (char *arr[];).
Dizinin işaretçisi — tüm dizinin başlangıç adresini saklayan bir değişkendir (örneğin, int (*ptr)[10]; 10 elemanlı bir int dizisine işaret eder).
Örnekler:
// char işaretçi dizisi (metin dizisi) char *days[] = {"Sun", "Mon", "Tue"}; // 10 tamsayı içeren bir diziye işaretçi int arr[10]; int (*p)[10] = &arr; // Erişim: printf("%s", days[1]); // "Mon" printf("%d", (*p)[0]); // arr[0]
"
char *arr[3];ilechar (*arr)[3];arasında ne fark var ve her durumda metinlere nasıl erişilir?"
Birçok kişi bunun arasında fark olmadığını ya da bunun yalnızca eşanlamlı olduğunu düşünür.
Doğru cevap:
char *arr[3]; — 3 char için işaretçilerden oluşan bir dizi (genellikle metin dizisi).char (*arr)[3]; — 3 char içeren bir diziye işaretçi (3 uzunlukta bir blok metin için işaretçi).char *arr1[3] = {"a", "bb", "ccc"}; printf("%s", arr1[1]); // bb char str[3] = {'x', 'y', 'z'}; char (*arr2)[3] = &str; printf("%c ", (*arr2)[2]); // z
Hikaye 1
Menü için diziler oluşturulurken char menu[5][30]; yazıldı. Yanlışlıkla bunu fonksiyona char *menu olarak aktardılar, bu nedenle fonksiyon sadece ilk satırla çalıştı ve diğerleri bozuldu ya da program çöktü.
Hikaye 2
Dizi işaretçileri oluşturmayı denediler: int *arr[10]; döngülerle başlattılar, ancak aslında yerel dizilerin işaretçilerini sakladılar, bu da erişimde UB’ye yol açtı.
Hikaye 3
FIFO kuyruğu için tamponların uygulanmasında, tüm kuyruğun adresini nereden alacakları (dizi işaretçisi) ve elemanı nereden alacakları (bloklar için işaretçi dizisi) karıştırdılar. Bu nedenle işaretçilerdeki kaymalar yanlış oldu — veriler kayboldu.