Ciao e bentornato.
Siamo in una nuova sezione. Questa sezione è denominata puntatori.
Questa è probabilmente la sezione più importante del corso.
Probabilmente è anche la parte più difficile del corso. Il concetto
di puntatori ec è un concetto complicato.
Ma lo affronteremo molto lentamente.
Forniremo molte lezioni e andremo passo dopo passo.
Inizieremo dal livello più alto e andremo sempre più in dettaglio.
Devi capire i puntatori se vuoi sfruttare appieno il
linguaggio c. Quindi è molto importante.
Quindi iniziamo dall'inizio e parliamo di questo concetto di riferimento indiretto, che
è essenzialmente lo stesso concetto di un puntatore.
Quindi i puntatori sono molto simili al concetto di riferimento indiretto.
Impieghi l'indirizzamento nella vita di tutti i giorni. Quindi, ad esempio, se
sto descrivendo cosa significa indiretto, sarebbe come se
dovessi acquistare qualcosa di nuovo, un nuovo prodotto nella tua azienda.
Quindi, ad esempio, supponi di dover acquistare una nuova cartuccia di inchiostro per la tua stampante.
Se lavori in una grande azienda, quello che faresti
probabilmente è passare attraverso un certo dipartimento
per acquistare nuovi acquisti. Quindi probabilmente andresti all'ufficio acquisti.
Probabilmente chiameresti qualcuno per l'acquisto e chiederesti
loro di ordinare la nuova cartuccia per te.
Sarebbe il loro lavoro trovare un negozio
locale che fornisca l'articolo effettivo che desideri ordinare.
E questo significa che non andrai a ordinare quell'articolo direttamente da solo.
Stai chiedendo a qualcuno di farlo per te.
E poi, attraverso la loro esperienza e la loro conoscenza
di chi ha quel prodotto in inventario, te
lo restituiscono.
Quindi questo è un livello di indiretto che ti riguarda. Non vai avanti e
vai al negozio e lo compri. Vai all'ufficio acquisti, l'ufficio della
persona sa che va e fa tutto per te.
Questo è lo stesso concetto di puntatore nella programmazione.
Nei linguaggi di programmazione, l'indirizzamento è la capacità di fare riferimento a qualcosa utilizzando un
nome o un riferimento o un contenitore invece del valore stesso.
Usiamo una forma di interazione utilizzando nomi di variabili.
Non usiamo l'indirizzo di memoria per accedere ai dati.
Usiamo un nome di variabile.
La forma più comune di riferimento indiretto è l'atto di manipolare un valore tramite
il suo indirizzo di memoria.
Quindi, oltre a una descrizione molto
piccola di riferimento indiretto che utilizza un nome di variabile per rappresentare un indirizzo di memoria,
si manipola anche un valore tramite il suo indirizzo di memoria utilizzando l'indirizzo stesso.
l'indirizzo stesso.
Quindi un puntatore fornisce un mezzo indiretto per accedere al valore di un particolare elemento di dati.
È una variabile il cui valore è un indirizzo di memoria,
e questo è fondamentale da capire.
Fino a questo punto abbiamo appreso variabili che contengono
determinati tipi di dati,
numeri, caratteri, doppi, float con numeri razionali.
Ora avremo una variabile che non
memorizza nessuno di questo tipo di dati.
Il tipo di archivi dati è un indirizzo di memoria.
L'indirizzo di memoria verrà rappresentato come un numero intero, un
numero esadecimale, ma
sarà comunque un indirizzo di memoria.
Quindi sarà il valore di un
indirizzo e di un'altra posizione di memoria se si tratta di una variabile
esistente o di una nuova posizione che allochi dinamicamente.
Quindi, proprio come ci sono ragioni per cui ha senso rivolgersi
al reparto acquisti per ordinare nuove cartucce,
non è necessario sapere da quale particolare negozio le cartucce vengono ordinate, ad esempio.
Ci sono anche buone ragioni per cui ha senso usare
puntatori ec Per usare queste variabili che rappresentano un indirizzo, un indirizzo di memoria.
Abbiamo parlato di indirizzi di memoria all'inizio del corso.
E come ogni volta che esegui un programma e crei variabili, queste vengono archiviate in memoria.
E quella memoria ha un indirizzo particolare. Devi conoscere l'indirizzo per recuperare quei dati,
proprio come devi conoscere l'indirizzo di una casa se stai andando in macchina da qualche parte o
l'indirizzo di un luogo.
Quindi usare i puntatori nel tuo programma è uno degli strumenti più potenti disponibili nel linguaggio c.
Ecco perché è importante capire.
Qualsiasi programma in c che sia sostanziale utilizzerà i puntatori.
Quindi devi capire questo concetto.
E per i programmatori là fuori che hanno programmato linguaggi
più moderni come java o oc sharp, non devi
necessariamente preoccuparti di questo perché
tutta l'allocazione della memoria e non c'è un
vero concetto di puntatori.
Anche se sotto il
cofano, java usa i puntatori perché hanno copie di riferimenti.
È lo stesso tipo di concetto. Ma in c hai
esplicitamente una variabile che rappresenta un indirizzo.
I puntatori sono anche uno dei concetti più confusi del linguaggio c.
Tendono ad essere maltrattati
e tendono a non essere completamente compresi, soprattutto dai nuovi programmatori.
Quindi è importante che tu abbia capito questo concetto all'inizio
e abbia un'idea chiara di ciò che sta accadendo
mentre entri in un concetto di puntatori sempre più avanzato c e sempre più avanzato.
Quindi, se all'inizio non lo capisci,
studia, studia, studia, esercitati a scrivere codice con i puntatori.
Il compilatore deve conoscere il tipo di dati memorizzati
nella variabile a cui punta. Quindi è proprio come una variabile
normale e devi specificare il tipo di dati quando crei il puntatore.
Il motivo per cui il compilatore deve sapere che questo è lo stesso
motivo per le variabili, deve sapere quanti dati allocare anche se stai puntando ad alcuni dati.
Ogni puntatore sarà associato a un tipo di variabile specifico.
Può essere utilizzato solo per puntare a variabili di
quel tipo, ne faremo un esempio quando parliamo della definizione di un puntatore.
Quindi, ad esempio, i puntatori di tipo
pointer to it possono puntare solo a variabili di tipo int.
Ancora una volta, una variabile ha
il valore di un indirizzo, che è un puntatore.
Quell'indirizzo può contenere un valore da qualche parte nella memoria.
I puntatori di tipo pointer to float possono puntare solo a variabili di tipo float.
Quindi ecco un'idea illustrativa che
ti dà il concetto di un puntatore.
Non preoccuparti per la sintassi qui.
Ne abbiamo discusso brevemente nelle lezioni precedenti di questa e commerciale e di questo asterisco
non devi necessariamente preoccuparti di questo. Quello che voglio che tu
presti attenzione qui è come un puntatore ha un indirizzo e quell'indirizzo
può contenere un valore ma essere da qualche altra parte nella memoria.
Quindi in questo esempio, stiamo creando un numero normale,
abbiamo creato un milione di volte, quindi vedi questa sintassi con l'asterisco che
significa che è un puntatore. Lo esamineremo nei dettagli.
Vedi anche la e commerciale, che significa che è un indirizzo.
Quindi in questo esempio, quando creiamo questo puntatore di tipo int p
numero, stiamo assegnando un indirizzo. Perché ricorda, i puntatori possono memorizzare solo indirizzi.
E il modo in cui questo è effettivamente disposto in
memoria è che hai un nome di
variabile numero e numero ha un valore di 99.
Anche il numero ha un indirizzo in memoria.
Quell'indirizzo in memoria è il valore del puntatore.
Quindi il numero p è un puntatore che punta all'indirizzo 1008.
1008 ha un valore di 99, contiene anche
il numero della variabile.
Quindi questo è davvero ciò a cui stiamo arrivando. Se questo non è chiaro, devi
guardarlo per un'ora e assicurarti di capirlo.
Di nuovo, il punto è che un puntatore ha un valore a
un indirizzo, questo è ciò che memorizza.
E poi puoi effettivamente accedere al valore in quell'indirizzo usando una certa sintassi.
Allora perché usare i puntatori, perché anche affrontare questo concetto, perché non possiamo
semplicemente usare i tipi di dati
esistenti che usiamo e usare l'array di caratteri quando vogliamo usare le stringhe.
Ebbene, l'accesso ai dati per mezzo di sole variabili è molto limitante.
Con i puntatori, puoi accedere a qualsiasi posizione, puoi trattare qualsiasi posizione della memoria come
una variabile per esempio e quindi puoi eseguire anche operazioni aritmetiche con i
puntatori, il che rende le cose più facili.
I puntatori in c semplificano l'uso di array e
stringhe, e lo esamineremo anche noi, questo è un altro vantaggio nell'usare i puntatori.
I puntatori consentono di fare riferimento allo stesso spazio e memoria con più posizioni.
Quindi questo significa che puoi aggiornare la memoria in una
posizione e quindi la modifica può essere vista da un'altra posizione nel tuo programma.
È un modo per utilizzare i dati globali ma avere ancora funzioni incapsulate all'interno.
È inoltre possibile risparmiare molto spazio di memoria condividendo i componenti
nelle strutture dati.
Quindi ricorda, quando c è stato inventato, c è stato inventato negli anni '70.
L'idea di c era quella di essere molto efficiente e di essere di basso livello.
L'idea di accedere alla memoria direttamente tramite i puntatori è
molto efficiente
ed è anche molto veloce.
I puntatori consentono inoltre alle funzioni di modificare i dati passati su
di esse come variabili. Questo viene passato per riferimento. Faremo una conferenza su questo.
Qui è dove puoi passare argomenti a una funzione con i tuoi puntatori.
E poi all'interno della funzione, quando modifichi quei dati,
la modifica si rifletterà all'esterno di quella funzione.
Quindi non dobbiamo più utilizzare dati globali.
Possiamo usare i dati all'interno di una funzione, passare quei dati
come un puntatore e poi quei dati al di fuori
di quella funzione verranno allocati. Quindi non ha lo svantaggio di
utilizzare variabili globali in cui tutto è strettamente accoppiato, puoi limitarlo
solo ai dati che hanno bisogno solo delle funzioni che hanno bisogno di conoscere quei dati.
Come ho già detto, può anche essere utilizzato per ottimizzare il programma in modo che
venga eseguito più velocemente e utilizzi meno memoria
di quanto farebbe altrimenti, il che
è un concetto importante, specialmente nei programmi incorporati in tempo reale.
I puntatori ci consentono anche di ottenere più valori da una funzione.
Abbiamo parlato delle funzioni su come passare le funzioni dati.
Abbiamo anche parlato di come puoi restituire i dati.
Sappiamo che in questo momento puoi restituire solo un valore da una funzione.
Ma se usi i puntatori, puoi effettivamente restituire più valori da una funzione.
E ne parleremo. Questo è un grande vantaggio.
Parleremo anche dell'allocazione dinamica della memoria.
In questo momento, quando creiamo memoria per un programma, viene
fatto implicitamente dal compilatore quando dichiari una variabile.
Se dichiari una variabile int, ad esempio, crea automaticamente 4 byte per quella variabile.
Quando si utilizzano array e si specifica la dimensione di
un array, tale dimensione viene allocata in fase di compilazione.
Quindi, se stai cercando di memorizzare più dati di così, sei fottuto,
il tuo programma non funzionerà.
Ma se avessi la capacità di creare effettivamente
tutta la memoria di cui hai bisogno in fase di
esecuzione, sarebbe enorme. E i puntatori ti permettono di farlo.
Consentono di creare memoria in fase di runtime dinamica, allocazione della memoria.
Parleremo anche di questo.
I puntatori ci consentono di progettare e sviluppare strutture di dati più complesse.
E la struttura dei dati è qualcosa che memorizza i dati.
Esempi di strutture dati sono stack a cue o un elenco collegato.
E possiamo crearli molto più facilmente usando i puntatori.
I puntatori forniscono un accesso diretto alla memoria, ancora una volta, efficiente e veloce.
Quindi le indicazioni saranno un grande concetto. Avremo molte lezioni sui suggerimenti.
Voglio che voi ragazzi vi concentriate, e voglio che prestiate attenzione quando parlo di tutti
questi concetti perché è importante e vitale per comprendere il linguaggio di programmazione c.
Quindi buona fortuna e iniziamo. Grazie.