PDA

View Full Version : [C++] quali sono le differenze tra char e char *?


AngeL)
14-06-2006, 13:24
non riesco a capire... a volte il compilatore mi dice che devo aggiungere questo asterisco prima della variabile ma non ho la minima idea del perche.
che differenza passa tra char e char *?

andbin
14-06-2006, 13:30
non riesco a capire... a volte il compilatore mi dice che devo aggiungere questo asterisco prima della variabile ma non ho la minima idea del perche.
che differenza passa tra char e char *?Sono 2 cose diverse. char è un singolo carattere mentre char* è un puntatore a carattere. Che poi il puntatore punti ad un singolo carattere o ad una stringa (un array di char) ... questo è il programmatore a doverlo sapere/gestire.

PGI-Bis
14-06-2006, 15:44
Scrivo C ma intendilo come C e altri.

Nel codice sorgente di un programma, una variabile è l'etichetta di un indirizzo e l'indirizzo è quello di una cella di memoria (o della prima di una serie di celle) che contiene un valore.

x <- etichetta ad uso umano dell'indirizzo immaginario 234234
10 <- valore contenuto nella cella di memoria di indirizzo 234234

Esiste un tipo particolare di variabile che in verità è convenzionalmente particolare. La convenzione sta nel significato del valore contenuto nella cella di memoria di indirizzo "x". La convenzione stabilisce che accanto al significato "diretto", il 10 contenuto nella "cella di indirizzo x", se ne possa dare uno "indiretto": il 10 contenuto nella cella di indirizzo x non è una mera quantità ma è interpretabile anche come l'indirizzo di un'altra cella.

A questo punto hai in mano un'etichetta, x, ed un valore 10 con l'inghippo che "10" può significare due cose: o è una quantità pura e semplice, come per ogni altra variabile, o è interpretabile come il valore di un indirizzo di memoria (la cella 10, qualsiasi cosa possa significare).

Avendo una sola quantità ma due significati ecco che emerge la necessità di distinguere in qualche modo quale significato sia richiesto dal programmatore quando il codice sorgente proponga una variabile il cui valore sia passibile di questa duplice interpretazione.

In C, quando una variabile sia dichiarata "bìfida" (e infìda :D):

char* pippo;

ogni volta che usi l'etichetta "pippo" devi specificare quale significato vuoi attribuire al valore contenuto in "pippo".

Se vuoi che il valore contenuto in "pippo" sia considerato come mera quantità (unica quantità, significato diretto), usi:

pippo

Se vuoi che il valore di "pippo" sia considerato come indirizzo di memoria (unica quantità, significato indiretto), usi:

*pippo

In C le istruzioni che coinvolgono variabili, cioè indirizzi (una variabile è l'etichetta umanamente comprensibile apposta ad un indirizzo di memoria), hanno effetto sulle quantità conservate nella regione di memoria indirizzata.

Così quando dichiari di voler usare il significato indiretto della quantità indirizzata dalla variabile:

*pippo

C si trova davanti una quantità, esattamente come capita per ogni variabile, che deve tuttavia interpretare come indirizzo.

*pippo >> variabile, prendi la quantità indirizzata
>> *, quella quantità è un indirizzo!
>> prendi la quantità indirizzata dalla quantità indirizzata da pippo.

Il (pessimo :D) gioco di parole dovrebbe sottlineare la ragione per cui si parla di "operatore di indirezione" e "significato indiretto".

Circa la necessità di usare i puntatori è eminentemente pratica. Permettono ad un sistema di condividere dinamicamente informazioni tra parti altrimenti irrelate. Di riflesso, consentono lo scambio di informazioni attraverso la condivisione di una minima parte di queste, il che è vantaggioso se lo scambio deva essere particolarmente frequente o se le dimensioni dell'informazione siano corpose.