2012-03-16 13 views
5

Nella seguente riga di codice, qual è lo scopo delle parole chiave const?volatile unsigned int * const

volatile unsigned int * const UART0DR = (unsigned int *)0x10009000; 

Capisco il bit volatile unsigned int *, ma perché è const lì?

risposta

12

const e volatile sono chiamati "tipo di qualificazione". La loro sintassi è una delle cose più confuse in C.

Prima di tutto abbiamo il caso con una variabile ordinaria. Di solito scrivi il qualificatore di tipo prima del nome della variabile: const int x;, ma è anche corretto scriverlo dopo il nome della variabile: int const x;. Il significato è lo stesso, la seconda sintassi è solo lì per confondere.

Quando si dichiara un puntatore, sono interessati due tipi: il tipo di puntatore stesso e il tipo puntato su. Con puntatori ordinari, questo è banale: int* x significa che il tipo di puntatore è puntatore-a-int e il puntatore-a-tipo è int.

Se il puntatore di tipo è const int, il puntatore viene dichiarato come const int* x. Il puntatore è di tipo pointer-to-const-int e il tipo puntato è const int. Se vuoi confondere tutti, puoi anche scrivere int const* x, è equivalente.

Diciamo che vogliamo che anche il puntatore stesso sia costante. Per qualche ragione, vogliamo impedire al programmatore di cambiare l'indirizzo indicato. Ad esempio, forse il puntatore deve essere memorizzato nella memoria di sola lettura di un sistema incorporato. Un puntatore costante ai dati, viene dichiarato come int*const x; con la parola chiave const dopo *. Il tipo di punta in questo caso è int e nonconst int.(Provo a scrivere il const insieme al *, senza spazio intermedio, per dare enfasi al fatto che il puntatore è costante)

Se vogliamo che anche il puntatore sia costante, vorremmo combinare le due dichiarazioni precedenti: const int*const x; significa un puntatore costante che punta a una costante int.

const int x;   // x is a constant data variable 
int const x;   // x is a constant data variable 

const int* x;   // x is a non-constant pointer to constant data 
int const* x;   // x is a non-constant pointer to constant data 

int*const x;   // x is a constant pointer to non-constant data 

const int*const x; // x is a constant pointer to constant data 

Negli esempi sopra ho usato il tipo qualificatore const. Ma volatile è anche un qualificatore di tipo e si comporta esattamente allo stesso modo! È possibile dichiarare puntatori non volatili a dati volatili, ecc.

Infine, è possibile combinare diversi tipi di qualificatori. Ad esempio un volatile const int* è un puntatore non costante e non volatile ai dati const volatili. Ancora una volta abbiamo la meravigliosa possibilità di mescolare l'ordine di questi per confondere, quindi possiamo anche scrivere volatile int const * o int volatile const * ecc. Tutto questo significa lo stesso.

+0

+1, buona spiegazione dei qualificatori di tipo, ma l'OP chiede perché è usato nel suo codice – jeb

+0

Grazie. Una domanda veloce. 'Int * x' è equivalente a' int * int x'? – Randomblue

+0

'volatile const int * ptr *' -> puntatore a un dato a cui è stata data solo l'autorizzazione di lettura dal codice, ma può essere modificato da eventi esterni (interrupt, ecc.) –

6

Capisco il volatile unsigned int * bit, ma perché è const lì?

Significa che il puntatore è costante, il che significa che il puntatore non può (piuttosto non dovrebbe) puntare a nessun altro indirizzo.

notare quanto segue, costruisce:

volatile unsigned int * const UART0DR = 

Pointer è costante qui.


volatile unsigned int const * UART0DR = 

L'indirizzo aguzzo è costante qui.


volatile unsigned int const * const UART0DR = 

L'indirizzo aguzzo nonché il puntatore è costante in questo caso.

+0

Grazie. Quindi è il 'const' per una sorta di ottimizzazione del compilatore? – Randomblue

+0

@Randomblue: È un qualificatore che dice al compilatore che questa particolare entità è costante e non cambierà. Questo aiuta il compilatore a segnalare errori negli stessi casi mentre * può * consentire al compilatore di applicare le ottimizzazioni. gli utenti del codice sorgente sono informazioni vitali sulla particolare variabile semplicemente leggendo la sua dichiarazione. –

+1

"L'indirizzo puntato è costante qui." Piuttosto, il contenuto dell'indirizzo puntato. – Lundin

Problemi correlati