"Çürüme", bir ifadenin dizi türünden işaretçi türüne örtük dönüştürülmesini ifade eder. Çoğu bağlamda, derleyici bir dizi ifadesi gördüğünde, ifade türünü "T öğesinin N öğesi dizisinden" "işaretçiye T" ye dönüştürür ve ifadenin değerini dizinin ilk öğesinin adresine ayarlar. . Bu kuralın istisnaları, bir dizi ya sizeof
da &
işleçlerin işleneni olduğunda ya da dizi, bir bildirimde başlatıcı olarak kullanılan bir dize değişmezidir.
Aşağıdaki kodu varsayalım:
char a[80];
strcpy(a, "This is a test");
İfade a
"80 elemanlı char dizisi" türünde ve "Bu bir testtir" ifadesi "16 elemanlı char dizisi" türündedir (C'de; C ++ dize değişmezleri sabit karakter dizileridir). Bununla birlikte, çağrısında strcpy()
, hiçbir ifade bir işlenen değildir sizeof
veya &
bu nedenle türleri dolaylı olarak "işaretçi karakterine" dönüştürülür ve değerleri her birindeki ilk öğenin adresine ayarlanır. Nestrcpy()
alır diziler değil, prototipinde görüldüğü gibi işaretçiler:
char *strcpy(char *dest, const char *src);
Bu, bir dizi işaretçisi ile aynı şey değildir. Örneğin:
char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;
Hem ptr_to_first_element
ve ptr_to_array
aynısından değeri ; a'nın temel adresi. Bununla birlikte, bunlar farklı tiplerdir ve aşağıda gösterildiği gibi farklı muamele görürler:
a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]
Sentezleme unutmayın a[i]
olarak yorumlanır *(a+i)
(dizi türü bir işaretçi türüne dönüştürülür yalnızca çalışır), her ikisi de çok a[i]
ve ptr_to_first_element[i]
çalışma aynı. İfade (*ptr_to_array)[i]
olarak yorumlanır *(*a+i)
. İfadeler *ptr_to_array[i]
ve ptr_to_array[i]
bağlama bağlı olarak derleyici uyarılarına veya hatalarına yol açabilir; değerlendirmelerini bekliyorsanız kesinlikle yanlış bir şey yapacaklara[i]
.
sizeof a == sizeof *ptr_to_array == 80
Yine, bir dizi işlenen olduğunda sizeof
, bir işaretçi türüne dönüştürülmez.
sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
is on your platform
ptr_to_first_element
char için basit bir işaretçi.
int a[10]; int b(void);
, o+a
zaman bir int işaretçi ve+b
bir işlev işaretçi. Referans kabul eden bir şablona iletmek istiyorsanız kullanışlıdır.