2012-11-18 3 views

risposta

3

devo essere sicuro che la funzione non modificare il contenuto

A meno che la funzione accetta un parametro const, l'unica cosa che puoi fare è espressamente passare una copia dei dati, forse creato utilizzando memcpy.

+1

Anche se si utilizza (const int * ptr) come parametro è ancora possibile modificare il valore si punta (creando un secondo puntatore all'interno della funzione, per esempio). L'unico modo per essere sicuri al 100% che non cambierà è passare una copia del valore. Destra? –

+2

@DanielS se crea un puntatore non-const e rende punto il contenuto del const puntatore è un passo nella terra undefined-comportamento. Cioè è un codice non valido – cnicutar

+0

Non posso usare const, voglio solo assicurarmi che la funzione usi una copia dei contenuti passati tramite puntatore. La memcpy sembra la soluzione migliore, puoi mostrarmi la sintassi, per favore? – Mc128k

6

È possibile utilizzare const

void foo(const char * pc)

qui pc è puntatore a const char e utilizzando pc non è possibile modificare il contenuto.

Ma non garantisce che non è possibile modificare i contenuti, perché con la creazione di un altro puntatore a stesso contenuto è possibile modificare il contenuto.

Quindi, tocca a te, come hai intenzione di attuarla.

0

Devo essere sicuro che la funzione non modifica il contenuto.

Quali contenuti? Il valore indicato dal puntatore? In questo caso, è possibile dichiarare la vostra funzione come

void function(const int *ptr); 

poi function() non può cambiare il numero intero puntato da ptr.

Se si desidera solo per fare in modo ptr sé non è cambiato, non preoccupatevi: è passato per valore (come tutto in C), quindi, anche se la funzione cambia il suo parametro ptr, che non influirà il puntatore che è stata approvata in.

+1

Anche se dichiari il modo in cui hai fatto la funzione puoi ancora cambiare il valore indicato da ptr. Si potrebbe creare un secondo puntatore all'interno della funzione, ad esempio attribuirgli l'indirizzo di memoria su ptr e quindi modificarne il valore. –

+0

@DanielS Bene, se hai la funzione 'void func (const int * ptr)', allora scrivi '* (int *) ptr = 42;' è un comportamento indefinito, quindi ti sbagli. –

4

Sì,

void function(int* const ptr){ 
    int i; 
    // ptr = &i wrong expression, will generate error ptr is constant; 
    i = *ptr; // will not error as ptr is read only 
    //*ptr=10; is correct 

} 

int main(){ 
    int i=0; 
    int *ptr =&i; 
    function(ptr); 

} 

in void function(int* const ptr) PTR è costante, ma ciò che sta puntando PTR non è costante quindi *ptr=10 è corretta espressione!


void Foo(int  *  ptr, 
      int const *  ptrToConst, 
      int  * const constPtr, 
      int const * const constPtrToConst) 
{ 
    *ptr = 0; // OK: modifies the "pointee" data 
    ptr = 0; // OK: modifies the pointer 

    *ptrToConst = 0; // Error! Cannot modify the "pointee" data 
    ptrToConst = 0; // OK: modifies the pointer 

    *constPtr = 0; // OK: modifies the "pointee" data 
    constPtr = 0; // Error! Cannot modify the pointer 

    *constPtrToConst = 0; // Error! Cannot modify the "pointee" data 
    constPtrToConst = 0; // Error! Cannot modify the pointer 
} 

Learn here!

+0

"Nella funzione void (const int * ptr) ptr è costante ma ciò che indica non è costante, quindi * ptr = 10 nella funzione void (const int * ptr) è un'espressione valida." Non penso che sia giusto. * ptr è di sola lettura in questo caso, quindi non puoi attribuirglielo. –

+0

@DanielS: Sì, sei corretto –

+0

@DanielS: Grazie, ho modificato la mia risposta. –