Ciao e bentornato. Ora che comprendiamo i puntatori un po 'più
in dettaglio, voglio parlare dei puntatori ai caratteri, principalmente
di come puoi usare i puntatori dei caratteri per rappresentare le stringhe.
Le stringhe sono matrici di caratteri, più caratteri, parole.
Quindi ora sappiamo come gli array si relazionano ai puntatori nel concetto di aritmetica dei puntatori.
Concetto molto, molto utile.
Questi concetti possono essere molto utili quando applicati a
stringhe di matrici di caratteri perché ora possiamo facilmente attraversare una stringa carattere per carattere.
Una delle applicazioni più comuni dell'utilizzo di un puntatore a un array è
come puntatore a una stringa di caratteri.
Le ragioni sono di convenienza ed efficienza notazionale.
Quindi l'utilizzo di una variabile di tipo pointer a char per
fare riferimento a una stringa offre molta flessibilità.
Quindi proverai a utilizzare i puntatori
ai caratteri il più possibile sugli array
di caratteri, in particolare utilizzando i puntatori ai caratteri per passare i dati a una funzione.
Tutti i tipi di cose carine del genere.
Quindi diamo un'occhiata a un esempio che utilizza un array per copiare una stringa.
In questo esempio, il nostro parametro array sarà un array di caratteri.
Lo vedrai proprio nella dichiarazione della funzione.
Voglio confrontarlo con una funzione che accetta un puntatore di caratteri
e mostrarti come la funzione di puntatore di caratteri è molto più efficiente.
Quindi, in questo esempio, abbiamo due funzioni, una
che accetta un array e una che
accetta i puntatori.
Nella prima stringa di copia della funzione,
possiamo passare attraverso l'intero array usando un ciclo for I è uguale a zero dal sub
I e andiamo fino in fondo finché non vediamo la stringa di caratteri null e
quindi incrementiamo la nostra variabile di controllo del loop.
E poi tutto quello che devi fare è dire 2 sub I è uguale al sub I. Stiamo svolgendo un incarico
diretto lì.
E poi alla fine, dopo che siamo andati fino in fondo finché non
vediamo un carattere nullo, aggiungiamo un carattere nullo alla fine del
nostro to array, piuttosto semplice. Ora vediamo come lo facciamo quando usiamo i puntatori.
Innanzitutto, dichiariamo ai puntatori come dichiarazione di funzione nella stringa di
copia semplicemente dicendo char star da cui char inizia.
Nel nostro ciclo for, non dobbiamo dichiarare effettivamente alcuna
variabile perché abbiamo puntatori e vogliamo solo
iterare fino a quando from non raggiunge il terminatore nullo.
Quindi possiamo incrementare sia i puntatori da che quelli a.
Perché qui stiamo facendo l'aritmetica dei punti.
Stiamo solo aggiungendo uno al puntatore che sta aumentando il suo indirizzo di uno, che sta
ottenendo il carattere successivo.
E la prossima riga del ciclo for dobbiamo
solo dereferenziare sia a che a da perché
vogliamo assegnare il valore effettivo a cui punta il puntatore,
il carattere effettivo al puntatore a.
E poi alla fine, aggiungiamo il carattere
nullo al punto in cui punta il puntatore
a, che sarebbe alla fine dell'ultimo indirizzo della stringa per da ma
ora punta nell'indirizzo a.
Non sembra poi così male. Voglio dire, hai un ciclo for.
Fondamentalmente hai la stessa quantità di righe di codice.
Ma vedi la differenza nella sintassi.
Non usi pedici e usi puntatori, usa l'asterisco.
Ancora una volta, davvero una questione di convenienza notazionale.
Non vedi un grande vantaggio qui.
Ma puoi effettivamente ottimizzarlo di più per ridurre
anche a meno codice quando usi i puntatori.
Quindi, se hai un array di
caratteri come puntatore, se hai un array di caratteri chiamato testo, potresti allo stesso
modo definire un puntatore ad esso e usare gli elementi nel testo.
Quindi qui potremmo dire puntatore di testo
a stella, è così che si definisce un puntatore a carattere.
Se il puntatore di testo è impostato che punta all'inizio
dell'array di caratteri chiamato testo, puoi
semplicemente incrementarlo di uno utilizzando questi operatori di pre e post implementazione e decremento.
Quindi questo sopra, questo puntatore di testo più più imposterà il puntatore di testo che
punta al carattere successivo nel testo, che è testo sub 1.
Quindi, se vogliamo guardare nel raggio successivo proprio come per gli
interi, tutto ciò che dobbiamo fare è aggiungere 1 2 e possiamo ottenere il carattere successivo.
È molto più utile anche se negli
array di caratteri perché puoi facilmente manipolare i caratteri uno per uno.
Se si esegue un puntatore di testo meno meno, che è l'operatore di
decremento, questo imposterà il puntatore al carattere precedente nel testo presumendo
che il puntatore di testo non puntasse all'inizio del testo.
Perché se lo fosse, avrai questi questi errori sotto i limiti.
Se stesse facendo un più più alla fine della stringa, avresti un errore di fuori limite.
Devi sempre stare attento, proprio come un'aritmetica di interi, a non andare oltre i limiti di un array.
Ma molto semplice, si riferisce molto da vicino a quando fai aritmetica
del puntatore intero.
L'aritmetica dei puntatori di caratteri è la stessa cosa.
È solo ancora più utile perché ora puoi effettivamente guardare i singoli caratteri senza usare un pedice.
Quindi, se guardiamo all'esempio precedente e
possiamo effettivamente ottimizzarlo un po 'di più usando i puntatori per renderlo
ancora meno righe di codice.
Quindi ora nella nostra stringa di copia, facciamo questa dichiarazione di funzione come prima,
creiamo un paio di puntatori usando l'asterisco.
Ma non usiamo più un ciclo for perché era un po 'inutile
usare un ciclo for nell'esempio precedente perché
in realtà non avevamo bisogno di inizializzare la variabile di controllo del ciclo.
Tutto quello che dovevamo fare era uscire da un
ciclo in una condizione e quindi stiamo effettivamente usando gli operatori di incremento e
decremento nel ciclo for, ma non abbiamo nemmeno bisogno di farlo.
In realtà diventa ancora molto più semplice qui perché se usiamo un ciclo while,
tutto ciò che dobbiamo fare è guardare il ciclo while e
salterà fuori se punta a un carattere nullo perché il carattere nullo è
effettivamente uguale a zero.
E il ciclo while ricorda che i booleani in
c sono rappresentati da numeri interi, uno è vero e quindi zero
è falso o in realtà zero è falso e quindi qualsiasi altra cosa è vera.
In questo caso, il carattere nullo 0 che è falso, salterà fuori.
Quindi tutto ciò che devi fare per la condizione di uscita nel ciclo while è mettere un asterisco da.
Cosa sta facendo da cui si deseleziona per vedere qual è il valore di quel personaggio.
Quindi, quando siamo alla fine della stringa da cui vogliamo copiare, saltiamo fuori.
Altrimenti mettiamo semplicemente la nostra modifica dei
nostri puntatori proprio lì, due più più da più più.
Ora questo è un operatore di post incremento.
Quindi ciò significa che il plus plus si trova sul lato destro della variabile.
E quando lo fai, significa che non ne
aggiungi uno fino a quando l'istruzione non è stata completata.
Quindi cosa farà, dirà che la stella 2 è uguale a partire da.
E poi, dopo che l'istruzione è stata completata, aggiungerà a 2 1 e aggiungerà da 1.
Se avessi il più più prima del nome della
variabile, si aggiungerebbe a quella variabile prima che esegua quell'istruzione e questo sarebbe
un problema perché ci mancherebbe essenzialmente il primo elemento che viene
copiato nella stringa.
Ma non abbiamo bisogno di altre righe di codice. Stiamo eseguendo un'effettiva aritmetica e assegnazione
del puntatore di incremento nella stessa istruzione, quindi riduciamo
il codice di uno.
Anche in questo caso, la notazione è molto semplice.
Stiamo eseguendo un'assegnazione aritmetica di interi molto facilmente.
E poi alla fine, dopo che abbiamo finito, copiando
tutte le stringhe, aggiungiamo semplicemente alla
fine il carattere nullo al puntatore che dereferenziamo perché i due è in realtà
il motivo per cui passa attraverso il ciclo che punta all'ultimo personaggio.
Quindi è solo un po 'ripulito un po' qui.
Ti mostra la potenza dei puntatori e
come puoi usare puntatori e aritmetica nelle stesse linee e con
questi operatori di incremento e decremento, questi più più e meno, lo rende
ancora più veloce e più facile, quindi è anche più efficiente.
Se volessimo utilizzare queste funzioni di stringa di copia, potremmo semplicemente creare due array di caratteri.
Possiamo passare gli array di caratteri direttamente alla stringa di copia perché gli array di
caratteri 0 sono puntatori.
Sono puntatori, quindi non dobbiamo effettivamente de-referenziarli o
aggiungere indirizzi o altro. Potremmo semplicemente dire string2, string1.
Quindi quello che farà è copiare una
stringa da copiare nell'array di caratteri stringa2 e
poi stamparla usando printf.
Volevo passare attraverso un esempio di come puoi usare i puntatori
di caratteri invece degli array di caratteri e perché a volte sono preferiti.
Abbiamo detto che a volte è la preferenza del programmatore in
cui se hai programmato in lingue precedenti come Fortran,
potresti essere abituato a rilanciare. Ma se ce l'hai,
vedrai i vantaggi dell'utilizzo dei puntatori.
Spero che questo sia stato utile. Grazie.