İşte benim görüşüm:
C Dilinin Gelişimi, C'deki dizi türünün evrimi hakkında bazı bilgiler sunar:
Dizi olayını özetlemeye çalışacağım:
C'nin öncüleri B ve BCPL'nin farklı bir dizi türü yoktu, şöyle bir bildirim:
auto V[10] (B)
or
let V = vec 10 (BCPL)
V'nin kullanılmayan 10 "word" bellek bölgesine işaret edecek şekilde başlatılan (tiplenmemiş) bir işaretçi olduğunu ilan eder. B zaten kullanılmış *işaretçiyi kaldırma ve vardı [] , kısa eli notasyonu *(V+i)demek V[i]sadece C / C ++ bugün olduğu gibi. Bununla birlikte, Vbir dizi değil, yine de bir belleğe işaret etmesi gereken bir göstericidir. Bu, Dennis Ritchie B'yi yapı türleriyle genişletmeye çalıştığında soruna neden oldu. Dizilerin bugünkü C'de olduğu gibi yapıların bir parçası olmasını istedi:
struct {
int inumber;
char name[14];
};
Ancak işaretçiler olarak B, BCPL diziler kavramı ile, bu, namealanın , çalışma zamanında yapı içinde 14 baytlık bir bellek bölgesine başlatılması gereken bir işaretçi içermesini gerektirecekti . Başlatma / düzen problemi sonunda dizilere özel bir muamele verilerek çözüldü: Derleyici, dizileri içeren ifadeler haricinde, verinin gerçeklenmesi için göstericiye gerçekten ihtiyaç duymadan yapılardaki, yığın üzerindeki vb. Dizilerin konumunu izlerdi. Bu işlem, neredeyse tüm B kodunun hala çalışmasına izin verdi ve "dizilere bakarsanız işaretçiye dönüştürün" kuralının kaynağıdır . Açık boyuttaki dizilere izin verdiği için çok kullanışlı olduğu ortaya çıkan bir uyumluluk saldırısıdır.
Ve tahminim neden dizi atanamaz: Diziler B'de işaretçiler olduğundan, basitçe yazabilirsiniz:
auto V[10];
V=V+5;
bir "diziyi" yeniden oluşturmak için. Bu artık anlamsızdı, çünkü bir dizi değişkeninin tabanı artık bir değer değildi. Dolayısıyla, bu atamaya izin verilmedi ve bu, bu yeniden düzenlemeyi yapan birkaç programın yakalanmasına yardımcı oldu da bildirilen dizilerde. Ve sonra bu fikir sıkıştı: Diziler hiçbir zaman C tipi sistemden birinci sınıf alıntılanacak şekilde tasarlanmadıkları için, çoğunlukla, onları kullanırsanız işaretçi haline gelen özel canavarlar olarak ele alındı. Ve belirli bir bakış açısına göre (bu, C-dizilerinin başarısız bir hack olduğunu göz ardı eder), dizi atamasına izin vermemek yine de bir anlam ifade eder: Açık bir dizi veya bir dizi işlevi parametresi, boyut bilgisi olmayan bir işaretçi olarak değerlendirilir. Derleyici, onlar için bir dizi ataması oluşturacak bilgiye sahip değildir ve uyumluluk nedeniyle işaretçi ataması gerekliydi.
typedef int vec[3];
void f(vec a, vec b)
{
vec x,y;
a=b;
x=y;
a=x;
x=a;
}
Bu, 1978'de bir C revizyonu yapı ataması eklediğinde değişmedi ( http://cm.bell-labs.com/cm/cs/who/dmr/cchanges.pdf ). Kayıtlar olsa idi C farklı türünün, bu kopyalamak zorunda erken K & R C You onları atamak mümkün değildi onlara üye akıllı memcpy ile ve fonksiyon parametreleri olarak onlara sadece işaretçileri geçebileceği. Atama (ve parametre geçişi) artık basitçe yapının ham belleğinin memcpy'si olarak tanımlanıyordu ve bu mevcut kodu kıramadığı için kolayca geliştirildi. Kasıtsız bir yan etki olarak, bu örtük olarak bir tür dizi atamasını başlattı, ancak bu bir yapının içinde bir yerde gerçekleşti, bu nedenle bu, dizilerin kullanılma biçimiyle gerçekten sorun yaratamaz.