2016-05-20 18 views
6

C'deki işaretçilerle uğraşıyorum ve bazı temel bilgilerden hala emin değilim.C: Erişim (int) * (void *) 'ye (void *) işaret ederek, (int)' ye işaret ederek ve ötelemeye işaret ederek (0)

scheme

tamsayı erişmek için bir alternatifi var mı: hafıza bu gibi görünmelidir

#include <stdio.h> 

int main(void) 
{ 
    int num = 42;    // we want to access this integer 
    void *vptrB = &num;  // pointer B points to the integer 
    void *vptrA = &vptrB;  // pointer A points to pointer B 
    printf("%d\n", * (int *) * (void **) vptrA); 
    return 0; 
} 

: Aşağıdaki örnek kod ile geldi? Örnekle kötü/güvensiz bir şey var mı? * (int *) * (void **) vptrA, num ürününe vptrA ve vptrB aracılığıyla erişmenin tek yolu var mı?

+3

İşaretçilerinizi neden doğru türleri kullanmak yerine "void *" olarak tutuyorsunuz? * Sistemiyle * çalışmayı denemelisiniz, mücadele etmeyin. –

+1

Ouch; Gelecekte kodunuzu okumam gerektiğini hatırlatır mısınız lütfen? Anlamak acı verici. Eğer vptrB'ye başvurabilirseniz, bunu daha basit yapabilirsiniz, ancak sadece vptrA'ya erişebilirseniz, yazdıklarınız doğru görünüyor - ama ben bunu kontrol etmek için bir derleyiciden geçmem. ve bir derleyici ile aynı şekilde yorumladı. –

+0

Genel olarak 'void *' işlevini kullanmanın kötü bir tarz olduğunu söyleyebilirim (özellikle de yazılan bir işaretçiyi kolayca kullanabileceğiniz yerlerde) ve dolaylı olarak da dolaylılık düzeyini gizlemek için çok kötü bir stil (yani bir void * adresini saklamak) '' void ** 'yerine. Ve normalde, hata dermelemenin ortasında döküm yapmaktan kaçınıyorum, bu yüzden '' ((int **) vptrA) 'olacaktır. – Zastai

cevap

2

Tam sayıya erişmek için alternatifler var mı? örnekle güvensiz kötü

int num = 42; 
int *vptrB = &num; 
int **vptrA = &vptrB; 
// All print 42 
printf("%d\n", num); 
printf("%d\n", *vptrB); 
printf("%d\n", **vptrA); 

şey /? veri türü, hizalama, const ve volatile bilgi kaybeder için void* arasında

Kullanım adresini temsil etmek. void* referans verilen verileri daha sonra yorumlamak için döküm kullanımını zorunlu kılar - bu hataya açıktır. Kod, dökümde doğru olmasına rağmen, bakım hataları ve kod gözden geçirme yanlış anlamalarına tabidir.

+1

, "void *" kullanarak, cast olmadan "const" ve "volatile" bilgilerini korur. Tabii ki bu şeyleri uzaklaştırabilirsin ama bu int * için de geçerli. –

İlgili konular