C void işaretçi işaretçi aritmetiği
Belirli bir türü için bir işaretçi (, *, float
char
, ..*0 demek) artırılır, değeri ve veri türü boyutu artar. Eğer boyutta veri x
gösteren void
bir işaretçi artırılır, nasıl x
bayt durma noktasına ulaşmak mı? Nasıl derleyici işaretçisinin değeri x
eklemek için biliyor mu?
CEVAP
Nihai sonuç: void*
aritmetikyasadışıC ve C hem de .
GCC bir uzantısı olarak, Arithmetic on void
- and Function-Pointers bu bölümün bir parçası olan (not "C" el ile bölüm) Uzantıları. bakın sağlar Çınlama ve ICC muhtemelen GCC ile uyumluluk amaçları için void*
aritmetik izin verir. Diğer derleyicileri (örneğin MSVC) vermemek aritmetik void*
, GCC izin vermiyor ise, -pedantic-errors
bayrak, belirtilen veya -Werror-pointer-arith
bayrak belirtilir (bu bayrak yararlı eğer kod tabanı gerekir Ayrıca derleme ile MSVC).
C Standart Konuşuyor
Tırnak n1256 taslak alınır.
Standart ayrıca operasyon açıklaması Birleşik Devletleri:
6.5.6-2: ek İçin, ya da her ikisi de işlenen aritmetik türü vardır,olacaktır ya da bir işlenen gösterici olacaktır nesne türü ve diğer olacaktır tamsayı türü var.
Yani, soru şu: void*
bir işaretçisi olup olmadığı "", veya benzer şekilde olup void
"". nesne türü nesne türü Tanımı"": . nesne türü için
6.2.5.1: Tip olarak bölümlenmişnesne türleri(tam nesneleri açıklayan türleri) ,fonksiyon türleri(fonksiyonlar açıklayan türleri), veeksik türleri(nesneleri tarif ama bilgi boyutlarını belirlemek için gerekli olmayan türleri).
Ve standart void
olarak tanımlar:
6.2.5-19:
void
yazın oluşmaktadır değerleri boş; olamaz tamamlanmamış bir türüdür tamamlanacak.
void
tamamlanmamış bir tür olduğundan, nesne türü değildir. Bu nedenle toplama işlemi için geçerli bir işlenen değildir.
Bu nedenle void
bir işaretçi işaretçi aritmetiği gerçekleştiremiyor.
Notlar
Aslında, void*
aritmetik izin verildi, C standardı bu bölümler yüzünden düşünüldü:
6.2.5-27: void gösterici olacaktıraynı temsil ve uyum bir işaretçi olarak gereksinimleri karakter yazın.
Ancak
Aynı temsil ve uyum gereksinimleri ima etmek içindir değiştirilebilirlik bağımsız olarak fonksiyonların geri dönüş değerleri fonksiyonlar ve sendika üyeleri.
Yani bu demek oluyor ki printf("%s", x)
aynı anlamı olsun x
yazın char*
void*
ama o demek değil yapabilirsin aritmetiği void*
.
Editörün notu:Bu cevap kesin sonuç yansıtacak şekilde düzenlenmiştir.
Dinamik döküm void işaretçi için prati...
İşaretçi Aritmetiği...
C 0 kaldırma bir işaretçi...
Ne bir işaretçi değişkeni ve C bir ref...
Ayar gıt üst farklı bir ana işaretçi...