Ciao e bentornato.
In questa lezione, voglio parlare dell'accesso al valore a cui
punta un puntatore Quindi
ricorda i puntatori, memorizzano gli indirizzi di memoria.
Quell'indirizzo di memoria contiene effettivamente un valore da qualche parte.
E così i puntatori puntano a quell'indirizzo di memoria. Voglio ottenere il valore di
ciò a cui punta.
Perché vorrei solo stampare il valore di un puntatore che sarebbe un indirizzo, ma voglio ottenere l'indirizzo,
voglio ottenere il valore dell'indirizzo.
Quindi puoi accedere al valore di un indirizzo a cui punta un
puntatore utilizzando l'operatore di riferimento indiretto. L'operatore di riferimento indiretto è l'asterisco.
Quindi abbiamo imparato come usare l'asterisco per dichiarare un
puntatore, useremo anche l'asterisco per trovare il valore a cui punta un puntatore.
Quindi viene anche definito operatore di dereferenziazione perché
lo usi per dereferenziare un puntatore.
Quindi, ad esempio, se hai un numero è uguale a 15, dichiari il
puntatore di tipo int, che punta a un int e gli assegni l'indirizzo del numero usando la e commerciale.
Ora come si ottiene il valore di ciò a cui punta il puntatore.
Puoi de-referenziare.
È possibile fondamentalmente quale sia il valore a cui
punta il puntatore è 15 perché punta all'indirizzo del numero che è 15.
Quindi la variabile pointer contiene l'indirizzo del numero di variabile.
È possibile utilizzarlo in un'espressione per calcolare un nuovo valore per il risultato.
Quindi supponiamo che il risultato sia uguale al valore a
cui punta il puntatore più cinque. Dovresti usare l'asterisco
prima del nome del puntatore.
E quindi ciò che questo farebbe è fondamentalmente dire a cosa
punta la variabile puntatore, punta a 15 aggiungere cinque ad esso.
È l'indirizzo che
il puntatore punta a qual è il valore di quell'indirizzo.
Quindi l'asterisco dell'operatore di riferimento
indiretto che dovresti notare è anche il simbolo utilizzato per la moltiplicazione e viene utilizzato
anche quando dichiari i tipi di puntatore. Quindi questo può creare confusione.
Come fai a sapere necessariamente cosa sta succedendo o come funziona il compilatore.
Bene, è tutta una questione di contesto. Dipende da quando usi quell'asterisco e da dove lo usi.
Se usi l'asterisco quando dichiari un puntatore subito dopo il
tipo del
puntatore, allora sta ovviamente usando una dichiarazione.
Se utilizzi l'asterisco tra due numeri,
viene utilizzato per la moltiplicazione. E se viene utilizzato
subito prima del nome del puntatore sul lato destro, ad esempio, o sul
lato sinistro, assegnerà un valore o accederà a un valore.
Quindi è tutta una questione di contesto quando usi questi questo operatore
di riferimento indiretto.
Ed è così che funziona.
Quindi è così che il compilatore lo interpreterà.
Ogni volta che lo vedi in questo esempio, puntatore
a stella e non hai un tipo di dati prima o non
hai due numeri su ciascun lato, allora sai che è un puntatore indiretto, dereferenziato.
Quindi facciamo un esempio. Ecco un altro
esempio in cui creeremo un numero
intero uguale a 10. Creeremo anche un numero intero di tipo chiamato x un'altra variabile.
Stiamo inizializzando count a 10, x non è inizializzato a nulla.
Creiamo quindi un puntatore int. Sappiamo che è un puntatore
int perché abbiamo l'asterisco dopo il tipo di
dati e quindi lo chiamiamo puntatore int.
Ora assegneremo a quel puntatore int l'indirizzo di count.
Perché ricorda, i puntatori contengono solo indirizzi come valori,
ma indicano anche qualcosa.
Quindi possiamo quindi assegnare alla variabile x qualunque sia il puntatore a
int, qual è il valore dell'indirizzo contenuto nel puntatore.
Quindi x mostrerà effettivamente 10.
10. Quindi, se andiamo avanti e mostriamo che
dicendo count percent d ird x percent ird, count è uguale a 10, x sarà uguale a 10.
È così che puoi dereferenziare un puntatore e ottenere il valore che. Punta a se vuoi visualizzare
i valori del puntatore perché ricorda che un puntatore
ha un valore in memoria, è
solo un indirizzo. Quindi cosa succede se
si desidera visualizzare il valore dei puntatori, rappresentato da
un numero intero esadecimale e da un indirizzo?
Bene, puoi usare l'identificatore di formato percentuale p. Ne abbiamo già parlato.
Questo produrrà un valore del puntatore come un indirizzo di memoria in forma esadecimale.
Quindi, se dovessimo fare qualcosa del
genere in cui, dichiariamo il
nostro numero, dichiariamo il nostro puntatore lo inizializziamo a null perché è una buona pratica che vogliamo farlo
sempre ogni volta che non si assegna qualcosa in una dichiarazione al puntatore, fare assicurati di
inizializzarlo su null.
Quindi assegniamo la nostra variabile numerica 10.
E poi assegniamo il nostro puntatore all'indirizzo del numero.
Quindi il valore del numero p sarà effettivamente un indirizzo.
un indirizzo. Quindi, se dovessimo provare a stamparlo, useremmo la percentuale pe quello sarebbe il valore dell'indirizzo.
Se volessimo stampare ciò a cui punta, dovremmo
de-referenziarlo utilizzando l'operatore di riferimento indiretto.
Ma quando si stampa l'indirizzo, quello che fa è stamparlo in
esadecimale e i puntatori occupano 8 byte in
memoria e gli indirizzi hanno
16 cifre esadecimali. Allora come funziona?
Bene, dipende dal fatto che la tua macchina supporti o meno indirizzi a 64 bit o 32 bit.
Se la tua macchina ha un sistema operativo a
64 bit, vedrai 16 cifre esadecimali.
Se la tua macchina o il tuo sistema operativo
ha solo l'indirizzamento a 32 bit, vedrai l'esadecimale rappresentato come 8 cifre esadecimali.
Ora cosa succede se si desidera visualizzare un indirizzo.
Puoi dire qual è la differenza perché il puntatore ha un valore.
Ma puoi anche visualizzare l'indirizzo con l'indirizzo dell'operatore.
Quindi in questo esempio, vogliamo visualizzare l'indirizzo del numero.
Il numero non è un puntatore. Il numero è solo un numero intero.
Se vogliamo ottenere l'indirizzo di quello, usiamo la e commerciale.
Se vogliamo visualizzarne l'indirizzo, basta usare di nuovo la percentuale p.
Devi solo applicare la e commerciale.
Quindi, se forniamo la e commerciale con la variabile del puntatore,
visualizzeremo effettivamente l'indirizzo di quel puntatore,
non il valore del punto. Ricorda che l'indirizzo del puntatore è un indirizzo in memoria.
Il valore del puntatore è un indirizzo a cui punta.
E il valore a cui punta è da qualche altra parte nella memoria.
Quindi ricorda l'illustrazione in cui
abbiamo mostrato come funzionano i puntatori.
Un puntatore, quando lo dichiari, crea memoria per quel puntatore,
8 byte.
Il valore di quel puntatore è un indirizzo.
E poi qualunque cosa quel puntatore
stia puntando è un valore, di solito del tipo che hai fornito.
Ma ricorda che ci sono davvero tre parti.
Se vuoi stampare l'indirizzo dei numeri p, useresti di nuovo la e commerciale.
Quello sarebbe l'indirizzo del puntatore effettivo.
E dovresti usare la stella del vuoto per aggirare un avvertimento.
Quindi ricorda, un puntatore stesso ha un indirizzo, proprio come qualsiasi altra
variabile, viene allocato quando lo dichiari.
Si utilizza la percentuale p come specificatore di conversione per visualizzare gli indirizzi.
Utilizzare la e commerciale l'indirizzo dell'operatore per fare riferimento all'indirizzo che
occupa la variabile del numero p.
Questo è l'indirizzo del puntatore. Poi di nuovo, il puntatore ha
un valore di un indirizzo.
Il cast di un void serve a impedire un avviso dal compilatore, in
particolare la specifica di percent p si aspetta che il valore sia una sorta di tipo di puntatore.
Ma il tipo di numero e commerciale è un puntatore a un puntatore di esso.
E quindi devi lanciarlo.
Visualizzazione del numero di byte utilizzati da un puntatore.
Un altro modo per ottenere informazioni su un puntatore.
Qui puoi usare l'operatore sizeof. Abbiamo imparato a conoscere l'operatore
sizeof per visualizzare diversi tipi di dati byte. Puoi fare la stessa cosa con un puntatore.
Su una macchina che sto eseguendo, questo occuperà 8 byte.
E l'indirizzo della macchina ha 64 bit perché
è un sistema operativo a 64 bit.
E potresti ricevere un avviso del compilatore quando usi sizeof in questo modo,
sizet è un tipo intero definito dall'implementazione.
Per evitare l'avviso, è possibile eseguire il cast dell'argomento a un tipo int come questo.
Quindi quello che faresti è dire dimensione del numero p, percentuale d byte.
E diresti int, lancialo a un numero di p di dimensioni in pollici.
Questo ti darà la dimensione del puntatore in memoria, la dimensione del puntatore di quell'indirizzo, che,
ancora una volta, è di otto byte sulla maggior parte dei sistemi.
Perché contiene solo un indirizzo.
Un altro esempio qui. Questo mostrerà una serie di cose.
E eseguiremo questo esempio per mostrare l'output.
Ma appena prima di eseguirlo, voglio descrivere un po 'cosa sta succedendo qui. Abbiamo un numero dichiarato.
Abbiamo un puntatore che ha inizializzato il null.
Impostiamo il valore del numero su 10.
E poi quello che vogliamo fare è
stampare l'indirizzo del numero intero, e vogliamo stampare il valore del numero, molto
semplice, usando l'indirizzo dell'operatore e poi solo la variabile.
Quando facciamo l'indirizzo dell'operatore, facciamo la percentuale p.
Quindi assegneremo l'indirizzo del numero al nostro puntatore.
Stamperemo quindi alcune informazioni sui puntatori.
Vogliamo restituire l'indirizzo del puntatore stesso.
Possiamo solo usare la percentuale p, la e commerciale vuota della stella.
Vogliamo vedere quanti byte ha in memoria quel puntatore. Possiamo dire sizeof.
Vogliamo vedere il valore effettivo del puntatore, che
è un indirizzo. Possiamo semplicemente dire numero p senza
alcuna informazione aggiuntiva e quindi usiamo la percentuale p.
Se vogliamo vedere il valore a cui
punta il puntatore, il valore all'indirizzo, allora facciamo il
numero p della stella, usiamo l'operatore di riferimento indiretto.
E sappiamo che il numero p punta a un in, quindi possiamo dire percentuale d.
Quindi diamo un'occhiata a questo esempio nei blocchi di codice per vedere come viene effettivamente visualizzato.
Quello che vedremo sono alcuni numeri esadecimali
per gli indirizzi ogni volta che visualizziamo indirizzi e vedremo valori in altri casi.
Quindi questo dovrebbe sembrare familiare. Questo è solo un programma
che ti mostra come accedere a diverse parti di un puntatore.
Quindi, di nuovo, abbiamo un normale tipo di dati numerico int e abbiamo
il nostro puntatore. Lo inizializziamo su null.
Per prima cosa visualizzeremo il nostro numero, che è 10. Quindi questo mostrerà l'indirizzo del numero,
quindi mostrerà il valore del numero sulle righe 10 e 11.
Quindi assegneremo il nostro puntatore, l'indirizzo del numero.
Se vogliamo vedere l'indirizzo effettivo del nostro puntatore, usiamo semplicemente la e commerciale,
l'indirizzo dell'operatore, e lo lanciamo a void star.
Usiamo la percentuale p.
Se vogliamo vedere quanti byte il puntatore è in memoria, facciamo percent d sizeof.
Se vogliamo vedere l'indirizzo il valore dell'arachide il puntatore, facciamo la percentuale pe
diciamo solo p numero, perché p numero è un indirizzo.
Se vogliamo vedere a cosa punta il puntatore con il valore
dell'indirizzo che è nel valore del puntatore, diciamo solo numero
p di asterisco, lo dereferenziamo, l'operatore di riferimento indiretto.
Quindi eseguiamo questo.
Quando lo eseguo, vedrai le prime due cose che vengono
stampate, l'indirizzo dei numeri che è
sulla riga sei, e questo è un numero esadecimale, 0060ff0c.
E questo in realtà sta eseguendo un programma a 32 bit, quindi vedi che sono solo
8 bit.
la variabile numerica che è 10.
Quindi stampiamo l'indirizzo del puntatore effettivo alla memoria allocata.
È un indirizzo diverso dal numero.
Perché questo è l'indirizzo assegnato per il puntatore.
La dimensione del numero del puntatore è di 4 byte e
ciò significa che è un indirizzamento a 32 bit.
Il valore del puntatore, che
è l'indirizzo del numero, dovrebbe essere lo stesso, ed è 0060ff0c.
E vedi che puoi effettivamente ottenere l'indirizzo del numero
usando semplicemente il nome, il puntatore con la percentuale p.
Abbiamo visto la dimensione dell'operatore 4 byte.
Se vuoi ottenere il valore a cui punta il numero p
che è 10, devi de-referenziarlo usando l'operatore di riferimento indiretto e vedi che è stampato 10.
Ma vedi che usi la percentuale p ogni volta che stai
visualizzando gli indirizzi, usa la percentuale e quando stai visualizzando i valori del puntatore intero
o il numero di byte.
Quindi questa è la sintassi di base per accedere ai valori del puntatore.
Indirizzo del puntatore, e commerciale, valore a
cui punta il punto, solo il nome della variabile
e il valore del puntatore stesso è solo il nome della variabile, quindi il
valore a cui punta il puntatore per utilizzare l'operatore di riferimento indiretto.
Grazie. Spero questo sia di aiuto. Studia questo, fallo scorrere.