‫Ciao e Benvenuto.
‫In questa lezione impareremo i riferimenti e le alternative ai puntatori e vedremo perché sono
‫diversi, perché potremmo volerli usare.
‫Immergiamoci e vediamo.
‫Quindi, oltre ai puntatori, esiste un concetto correlato molto simile chiamato riferimento.
‫Ora sia i puntatori che i riferimenti sono essenzialmente solo un indirizzo di memoria.
‫Entrambi memorizzano un riferimento a dove è possibile trovare un'altra variabile e in questo modo sono incredibilmente
‫simili.
‫La differenza tra i due sta sostanzialmente nel fatto che possono essere riassegnati.
‫Fondamentalmente, possono puntare a un indirizzo diverso dopo che sono stati creati per la prima volta?
‫Nel caso di un puntatore, la risposta è sì.
‫Puoi cambiare un puntatore in modo che punti a un nuovo indirizzo di memoria, un nuovo attore, un nuovo componente ogni volta
‫che vuoi, purché abbia il tipo giusto.
‫Un riferimento, d'altra parte, può essere impostato solo una volta quando lo si crea per la prima volta per puntare a un'altra
‫variabile.
‫Non può quindi essere cambiato di nuovo.
‫E questa è una funzione di sicurezza perché il repointing delle variabili può portare a problemi in cui
‫tali variabili potrebbero scomparire o in cui si imposta quel puntatore su null.
‫Un puntatore nullo è essenzialmente un puntatore che non punta a nulla e provare a fare cose con un punto che non imposta
‫su nulla può effettivamente mandare in crash il tuo motore, il che non è un risultato ideale con i riferimenti perché devi dare loro un valore
‫quando crei per la prima volta loro.
‫Non possono essere nulli, quindi non è possibile ottenere questi arresti anomali del puntatore nullo.
‫Quindi iniziamo a dare un'occhiata ad alcune delle sintassi coinvolte.
‫Quindi, quando accedi al contenuto con un puntatore, devi usare una sintassi speciale.
‫Devi mettere questa stella davanti al puntatore per assicurarti di ottenere il valore nel puntatore, non l'indirizzo
‫di memoria con i riferimenti perché non hai mai davvero bisogno di entrare in possesso dell'indirizzo di memoria.
‫Puoi semplicemente usare la variabile come se fosse la variabile a cui punta.
‫Non è necessario utilizzare alcuna sintassi speciale.
‫Ora c'è l'accesso all'indirizzo, quindi con i puntatori si ottiene automaticamente l'indirizzo.
‫Quando usi la variabile con un riferimento, devi usare una sintassi speciale.
‫Per fare ciò, devi usare l'indirizzo dell'operatore e ti otterrà praticamente lo stesso
‫indirizzo della variabile originale.
‫E poi c'è la modifica dell'indirizzo con un puntatore.
‫Abbiamo visto che puoi assegnare l'indirizzo e utilizzare l'indirizzo di opera per farlo con i riferimenti.
‫Questo non è consentito, quindi non c'è sintassi per questo.
‫E infine, cosa succede se vogliamo cambiare il valore a cui stiamo puntando, non l'indirizzo, ma
‫il valore effettivo memorizzato a quell'indirizzo?
‫Bene, con i puntatori, devi di nuovo usare una sintassi speciale.
‫Devi mettere quella stella e poi assegnare qualcosa.
‫Quindi il puntatore dell'attore lo assegni di nuovo al puntatore dell'attore protagonista con i riferimenti, poiché non puoi modificare l'indirizzo
‫effettivo, non hai bisogno di alcuna sintassi aggiuntiva.
‫Possiamo eliminare la sintassi extra e fare in modo che il riferimento dell'attore sia uguale.
‫Attore significa che stai sovrascrivendo il valore nella posizione puntata.
‫Quindi è tutto un po' teorico.
‫Facciamo un esempio reale.
‫Quindi, se avessimo un galleggiante che forse stava immagazzinando il danno che ci è stato fatto nel gioco e in cui stiamo immagazzinando il
‫danno attuale è impostato su zero.
‫Nessuno ci ha fatto danni.
‫Ora potremmo voler creare un riferimento a questo invece di copiarlo, potremmo volerlo passare
‫in una funzione, ma senza cambiarlo effettivamente.
‫Il modo in cui possiamo farlo è avere un galleggiante e poi mettere la e commerciale dopo il galleggiante.
‫E la e commerciale dice che questo è un riferimento a un galleggiante.
‫Non è un nuovo float in sé, non alloca memoria float.
‫Alloca solo la memoria del puntatore.
‫E quindi possiamo chiamarlo l'arbitro danneggiato e possiamo impostarlo uguale a danno.
‫Non dobbiamo prendere l'indirizzo o fare qualcosa del genere.
‫Sa automaticamente, beh, questo è un riferimento e questa è una variabile.
‫Quindi quello che stai cercando di fare qui è impostare un riferimento a quella variabile.
‫E abbastanza sicuro, se andiamo e registri, allora possiamo stamparlo come se fosse solo un normale
‫float così possiamo dire danno due punti e poi percentuale F e quindi qui possiamo fare solo un danno di stampa.
‫Ref Non abbiamo bisogno di una sintassi speciale.
‫Possiamo usarlo proprio come una variabile regolare.
‫Andiamo avanti e premiamo play dopo la compilazione, diamo un'occhiata al nostro registro di output e, in effetti, il
‫danno è pari a zero, che era il valore che abbiamo impostato.
‫Ma questo non prova necessariamente che non ho fatto una copia di quella variabile originale, quindi vorrei
‫sfidarti a provare a cambiare il valore e vedere cosa succede.
‫Quindi usa il riferimento, il riferimento al danno, per impostare un nuovo valore e quindi stampa il valore
‫originale in modo che il valore originale accanto al valore di riferimento e dai un'occhiata sono uguali o sono
‫diversi?
‫Cambia solo il riferimento, ma cambia anche l'originale?
‫Perché ciò implicherebbe che sono entrambi la stessa variabile di mettere in pausa il video e provare.
‫Bene.
‫Ben tornato.
‫Quindi diamo una pugnalata.
‫Quindi, per cambiare il riferimento ora, faremo danni ref equals.
‫E questa volta dirò cosa abbiamo fatto cinque danni e questo è che non ho dovuto usare nessuna sintassi speciale
‫qui.
‫Non sta ripuntando il riferimento perché lo abbiamo già dichiarato e impostato il suo riferimento su quella prima
‫riga quando viene creato.
‫Non possiamo farlo di nuovo.
‫Quindi ora possiamo semplicemente impostare il valore.
‫Quindi quello che posso fare ora è che abbiamo il riferimento del danno è qui nel registro.
‫Mettiamo anche un danno e una percentuale f su quella stessa stringa e poi passiamo anche il danno qui.
‫E poi compileremo e daremo un'occhiata.
‫Premiamo play, entriamo nel nostro registro di output e, abbastanza sicuro, sta stampando il riferimento del danno e il danno poiché entrambi hanno
‫il nuovo valore che abbiamo impostato il valore di cinque.
‫Quindi, in sostanza, ciò che abbiamo qui sono due variabili che puntano allo stesso pezzo di memoria.
‫Si potrebbe quasi dire che sono tutte la stessa variabile, ma con nomi diversi.
‫Quindi questo ha il vantaggio di non aver bisogno di una copia, proprio come un puntatore, ma ha anche molti più vantaggi
‫perché è molto più facile da usare.
‫Non abbiamo bisogno di tutta quella sintassi extra ed è anche più sicuro da usare.
‫Quindi, fintanto che non è necessario ridipingere nulla, è generalmente preferibile utilizzare i riferimenti.
‫Ora facciamo una rapida rassegna di alcuni dei simboli che usiamo qui perché possono creare un po' di confusione.
‫Sono usati molto in C++.
‫Quindi i simboli della e commerciale e delle stelle, diamo un'occhiata al loro contesto e al loro significato.
‫Quindi, quando li utilizziamo, quindi quando li utilizziamo in un'espressione, ecco alcuni esempi di codice.
‫Potresti vedere la stella prima di una variabile.
‫Potresti vedere la e commerciale prima di una variabile.
‫Cosa significa questo?
‫Bene, con il simbolo della stella, la sintassi di metterlo prima della variabile significa che ora stiamo
‫ottenendo i contenuti al puntatore dell'attore con la e commerciale.
‫Se metti la e commerciale davanti a una variabile o davanti a un riferimento a una
‫variabile, significa che sta ottenendo l'indirizzo di quella variabile.
‫Sta ottenendo l'indirizzo dell'attore o l'indirizzo indicato dal riferimento.
‫Ora, quando dichiariamo che lo stiamo usando, termina il tipo di una variabile.
‫Le stelle e la e commerciale hanno quasi i significati opposti.
‫Quindi la stella significa che questo è un indicatore di un nuovo attore e la e commerciale significa che questo è un riferimento
‫al tuo attore.
‫Quindi ricorda solo che esiste un insieme di significati completamente diverso, sia che tu
‫li stia usando con una variabile in un'espressione, sia che tu li stia usando nel tipo che dichiara una variabile.
‫Ora, non entrerò troppo nei dettagli, ma per aggiungere la beffa al danno, questi possono effettivamente avere altri
‫significati.
‫In un altro contesto, la e commerciale può significare un po' di saggezza e la stella, come abbiamo già visto, può
‫essere usata con le stringhe nel log U.
‫Quindi questi non sono necessariamente tutti i significati di questi due simboli, ma sono praticamente
‫tutti i significati importanti che si riferiscono a puntatori e riferimenti.
‫Roba fantastica.
‫Quindi abbiamo imparato a conoscere i puntatori, i riferimenti, come si relazionano tra loro, come sono diversi
‫e perché potremmo volerli usare.
‫Ci vediamo alla prossima lezione.