2013-03-01 16 views
7

Qual è la differenza tra le seguenti tre dichiarazioni puntatore in C:posizione di parola chiave const

void * const myPointer1; 
void const *myPointer2; 
const void *myPointer3; 

e quale è usato per prevenire:

myPointer = somethingElse; 
+6

Non dirmi che hai provato a cercarlo e non hai trovato nulla. – LihO

+0

Da non perdere 'const void * const myPointer;' :) – elmigranto

+0

@LihO Non ho trovato nulla che fosse puro C (non C++ o ObjC) e che fosse per semplici tipi di puntatore senza funzioni di mixaggio. – lms

risposta

7

leggere le regole da destra a sinistra:

void * const myPointer1; 

myPointer1 è un puntatore const-void.

void const *myPointer2; 

myPointer2 è un puntatore ad un constvoid.

const void *myPointer3; 

myPointer3 è un puntatore ad un voidconst.

Conclusioni:

  • myPointer1 è quello che stai cercando - è un puntatore const, quindi il suo valore non può essere modificato
  • myPointer2 e myPointer3 sono la stessa cosa
  • myPointer2 e myPointer3 sono tipo di senza senso - dereferenziamento a void* non ha senso
0
  • myPointer1 è un puntatore const-void .
  • mypointer2 e myPointer3 sono entrambi puntatori a const void.

La differenza tra le dichiarazioni myPointer2 e myPointer3 è solo una questione di stile.

NB: const void significa che i dati puntati sono const. Per esempio, non ha nulla a che vedere con void da int main(void).

+0

Quale sarebbe il significato del tipo 'void' (o' const void' per quella materia)? Ad esempio, che cosa può essere assegnato all'indirizzo indicato da tale puntatore ('* mypointer2 =?') – SomeWittyUsername

+0

@icepack: A 'void *' è un "puntatore generico", cioè un "puntatore a qualunque". Assegnare un altro valore del puntatore ad esso, come 'mypointer = otherpointer'. Non assegneresti valore al puntatore * dereferenziato, però. – DevSolar

+0

@DevSolar Sì, ne sono consapevole. Mi stavo chiedendo il significato semantico di "pointer to void". Mi sembra che una descrizione del genere sia logicamente scorretta. 'void' qui è un alias per" qualsiasi cosa "in contrasto con un normale significato di' void'. – SomeWittyUsername

1

In alcuni luoghi, si può mettere la const di fronte a tutto ciò che è dichiarato const:

const int * x; // pointer to constant int 

È possibile sempre mettere la constdopo tutto ciò che è dichiarato const:

int const * x;  // pointer to constant int 
int * const x;  // constant pointer to int 
int const * const x; // constant pointer to constant int 

Quindi, la mia raccomandazione personale, sempre ha il const trailing, perché questa è l'unica "regola" che può essere rispettata coerentemente.

0
  1. void * const myPointer1; = dichiarare myPointer1 come puntatore const a void
  2. void const *myPointer2; = dichiarare myPointer3 come puntatore a void const
  3. const void *myPointer3; = dichiarare myPointer3 come puntatore a const vuoto

Ogni volta in questo tipo di dubbi, è possibile utilizzare: cdecl.org

Si dovrebbe provare myPointer1 per evitare la condizione che si è spiegato in quanto è un const pointer.

+0

BTW. http://cdecl.org/ non supporta "void const * myPointer2;". È per questo che sono atterrato su questa pagina, cercando su google per confermare quello che ricordavo, in questo modo 2 è uguale al modo 3. – domen