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;
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;
leggere le regole da destra a sinistra:
void * const myPointer1;
myPointer1 è un puntatore const
-void
.
void const *myPointer2;
myPointer2 è un puntatore ad un const
void
.
const void *myPointer3;
myPointer3 è un puntatore ad un void
const
.
Conclusioni:
myPointer1
è quello che stai cercando - è un puntatore const
, quindi il suo valore non può essere modificatomyPointer2
e myPointer3
sono la stessa cosamyPointer2
e myPointer3
sono tipo di senza senso - dereferenziamento a void*
non ha sensomyPointer1
è 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)
.
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
@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
@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
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 const
dopo 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.
void * const myPointer1;
= dichiarare myPointer1 come puntatore const a voidvoid const *myPointer2;
= dichiarare myPointer3 come puntatore a void constconst void *myPointer3;
= dichiarare myPointer3 come puntatore a const vuotoOgni 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
.
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
Non dirmi che hai provato a cercarlo e non hai trovato nulla. – LihO
Da non perdere 'const void * const myPointer;' :) – elmigranto
@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