Il dereferenziamento di un puntatore e il passaggio a una funzione che prende il suo argomento per riferimento crea una copia dell'oggetto?Il dereferenziamento di un puntatore ne fa una copia?
risposta
In questo caso il valore sul puntatore viene copiato (sebbene ciò non sia necessariamente il caso in cui l'ottimizzatore può ottimizzarlo).
int val = *pPtr;
In questo caso però non copia si svolgerà:
int& rVal = *pPtr;
La ragione nessuna copia avviene perché un riferimento non è un costrutto livello codice macchina. È un costrutto di livello superiore e quindi è qualcosa che il compilatore usa internamente piuttosto che generare un codice specifico per esso.
Lo stesso, ovviamente, va per i parametri di funzione.
Non è il puntatore che viene copiato nel primo caso. È il valore a cui punta che viene copiato. Nel secondo caso, il puntatore viene copiato (logicamente) e il valore non lo è. –
@Sergey: buoni punti che sono stati formulati molto male :) – Goz
Ho scritto un semplice programma di test per verificare le risposte da solo, si spera che questo aiuti alcuni http://codepad.org/XDqahndf – RishiD
Speriamo che non lo sia: sarebbe se la funzione chiamata prendesse il suo argomento in base al valore.
Inoltre, questo è il comportamento previsto di un riferimento:
void inc(int &i) { ++i; }
int main()
{
int i = 0;
int *j = &i;
inc(*j);
std::cout << i << std::endl;
}
Questo codice si prevede di stampare 1
perchéinc
prende il suo argomento per riferimento. Se una copia fosse stata effettuata sulla chiamata inc
, il codice avrebbe stampato 0
.
No. Un riferimento è più o meno proprio come un puntatore con notazione diversa e la restrizione che non vi è alcun riferimento nullo. Ma come un puntatore contiene solo l'indirizzo di un oggetto.
"Ma come un puntatore contiene solo l'indirizzo di un oggetto." Il riferimento non ha un'esistenza propria. È solo un alias dell'oggetto a cui è stato inizializzato. Quindi dire "contiene" l'indirizzo sarà sbagliato. Il riferimento punta solo allo stesso indirizzo dell'oggetto originale, non contiene quell'indirizzo. –
Perché no? Come può indicare da qualche parte e non contenere l'indirizzo? Lo contiene, solo tu non puoi accedere all'indirizzo che contiene perché viene automaticamente cancellato ogni volta che lo accedi. –
@Sergey Tachenov: Il compilatore deve creare la finzione che si tratta di un alias e può assumerlo. Ciò significa che, a seconda dell'uso, il compilatore può creare un puntatore * interno * e automaticamente dereferenziare l'uso, o in alcuni casi può semplicemente riferirsi completamente all'oggetto originale. Nella maggior parte dei casi deve ricorrere ai puntatori, ma alla fine della giornata, è meglio pensare in termini astratti: i riferimenti sono * alias * indipendentemente da come sono implementati. –
Nel caso semplice, n. Ci sono casi più complicati, però:
void foo(float const& arg);
int * p = new int(7);
foo(*p);
Qui, si crea un oggetto temporaneo, perché il tipo di puntatore Dereferenced (int
) non corrisponde al tipo di base del parametro di funzione (float
). Esiste una sequenza di conversione e il temporaneo convertito può essere associato a arg
poiché si tratta di un riferimento const.
- 1. Come avviene il dereferenziamento di un puntatore a funzione?
- 2. puntatore di dereferenziamento all'array intero
- 3. Perché il dereferenziamento di un puntatore è chiamato dereferenziazione?
- 4. Velocità di dereferenziamento puntatore di struttura C
- 5. Come funziona il dereferenziamento del puntatore in golang?
- 6. L'incremento * p ++ dopo il dereferenziamento?
- 7. Standard C++: dereferenziamento puntatore NULL per ottenere un riferimento?
- 8. Scrittura di una copia profonda - copia del valore del puntatore
- 9. Haxe passa i parametri per riferimento o ne fa una copia?
- 10. Arresto anomalo del dispositivo iOS durante il dereferenziamento di un puntatore restituito dalla decodifica di NSCoderBytesForKey
- 11. Dereferenziamento di un unique_ptr temporaneo
- 12. restituisce riferimento all'oggetto temporaneo locale sul puntatore dereferenziamento
- 13. Qual è il significato di Possibile dereferenziamento del puntatore nullo in findbug?
- 14. Copia costruttore con puntatore intelligente
- 15. Perl Valore SV dal puntatore senza copia
- 16. C++: copia profonda di un puntatore della classe Base
- 17. costruttore di copia: una copia profonda di una classe astratta
- 18. È possibile incrementare un puntatore senza dereferenziamento ancora segfault o avere altre cattive intenzioni (non definite)?
- 19. Cosa fa la copia di hg?
- 20. Un ricevitore `_` su un valore (non puntatore) copia ancora il valore?
- 21. puntatore di dereferenziamento a errore di tipo incompleto quando si utilizza typedef struct in C
- 22. Il kernel non è in grado di gestire il dereferenziamento del puntatore NULL - utilizzando kmem_cache_alloc con struct
- 23. Il puntatore statico è un puntatore forte?
- 24. Puntatore vuoto di riferimento
- 25. Buffer.BlockCopy vs byte non sicuro * copia puntatore
- 26. Cosa fa GLEW e perché ne ho bisogno?
- 27. PHP: creazione di una copia di una variabile di riferimento
- 28. Il ridimensionamento di un canvas HTML ne cancella il contenuto
- 29. Come creare una copia di uiview (non un puntatore a uiview originale)
- 30. Il puntatore dereferenziazione è atomico?
Re: il titolo. Se il dereferenziamento di un puntatore crea una copia dell'oggetto, non sarebbe impossibile usare mai l'oggetto ?! – visitor