SORU
19 AĞUSTOS 2010, PERŞEMBE


C void işaretçi işaretçi aritmetiği

Belirli bir türü için bir işaretçi (, *, floatchar, ..*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
19 AĞUSTOS 2010, PERŞEMBE


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:voidyazı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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Apple

    Apple

    22 HAZİRAN 2005
  • Fubar Protocol

    Fubar Protoc

    21 AĞUSTOS 2010
  • spectragirlz16's channel

    spectragirlz

    22 Ocak 2012