RISOLTO Esercizio con stringhe in C

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
char *p = "pippo";
o
char p[] = "pippo";
@Hero467
La differenza sostanziale tra le due dichiarazioni e' che il "puntatore" (prima dichiarazione) lo puoi "scorrere" (ossia modificare l'indirizzo del primo carattere a cui punta: e.g. incrementandolo... p++, p+=3 ), l'array di caratteri NO (il compilatore da' errore).

Non nel caso in questione... che dovrebbe essere inteso come:
const char *p = "pippo";

ma qualcosa del tipo:
const char *nome = "pippo";
char *p = nome;
p++;
printf("%s",p);
// risultato:
ippo
 
Ultima modifica:
Ah ok. E perche un puntatore invece di un array di caratteri?
Questa è una domanda molto complessa, la ragione per cui in C puntatori e vettori sono allo stesso tempo cosi simili e così diversi viene dal fatto che il linguaggio C venne creato per scrivere un sistema operativo (Unix) e non come linguaggio multi scopo. Nei linguaggi moderni questa ambiguità è sparita, i puntatori non esistono più, stringhe non sono più memorizzate in vettori di caratteri bensì in un tipo di dati specializzato.
un array di caratteri si definisce con un puntatore, al primo carattere.

char *p = "pippo";
o
char p[] = "pippo";

sono la stessa cosa.

Questo a grandi linee.
Assolutamente no, sono due cose diverse che solo in particolari circostanze per combinazione si “possono” considerare le stesse. Era una domanda classica durante i colloqui di lavoro negli anni ottanta e novanta, la migliore risposta era data nel testo “deep secrets in C” (come veniva chiamato) che era la Bibbia del tempo, ogni programmatore ne aveva una copia sulla scrivania, ben usata, i bordi ben arricciati (la mia copia dovrebbe essere in uno dei scatoloni in garage)
 
Approfondire va sempre bene, ma io non si spenderei troppo tempo, specie per i vettori di caratteri usati come stringhe alfanumeriche.
Tieni conto che ormai il C è non più un linguaggio multi scopo, è diventato altamente specializzato ed è utilizzato in ben pochi casi, per esempio nei piccoli sistemi embedded (dove lo spazio è limitato), nei driver, nelle parti a basso livello dei sistemi operativi (Linux è scritto in C solo perché così vuole Trovalds) e in genere dove è importante l’efficienza. In nessuno di questi casi stringhe alfanumeriche hanno importanza.
 
La differenza sostanziale tra le due dichiarazioni e' che il "puntatore" (prima dichiarazione) lo puoi "scorrere" (ossia modificare l'indirizzo del primo carattere a cui punta: e.g. incrementandolo... p++, p+=3 ), l'array di caratteri NO (il compilatore da' errore).
Anche il char p[] lo scorri, come dicevo, in questo esercizo si possono usare allo stesso modo.

Codice:
 const char str[] = "giove";
 int i, q, len = strlen(str);

putchar(*(str+3));

....

almeno in gcc, che e' piuttosto vicino agli standard.


Assolutamente no, sono due cose diverse che solo in particolari circostanze per combinazione si “possono” considerare le stesse. Era una domanda classica durante i colloqui di lavoro negli anni ottanta e novanta, la migliore risposta era data nel testo “deep secrets in C” (come veniva chiamato) che era la Bibbia del tempo, ogni programmatore ne aveva una copia sulla scrivania, ben usata, i bordi ben arricciati (la mia copia dovrebbe essere in uno dei scatoloni in garage)
Infatti ho scritto: "per questo esercizio" sono praticamente la stessa cosa :)
Cercavo di fare in modo che capisca cosa accade in memoria senza entrare nei dettagli dell'implementazione dei compilatori.

PS :) : non servono per forza le pile di libri nella scrivania, io non ne ho, eppure ho 51 lavori accettati nel kernel linux, il che certifica che anche senza la pila di libri, o i quesitonarietti d'ufficio che fanno sentire grandi i "senior" gia assunti, si sappia lavorare lo stesso.
 
Anche il char p[] lo scorri, come dicevo, in questo esercizo si possono usare allo stesso modo.

Codice:
const char str[] = "giove";
 int i, q, len = strlen(str);

putchar(*(str+3));

....

almeno in gcc, che e' piuttosto vicino agli standard.

Usare la stessa simbologia, si'... ma non la possibilita' di modificare il valore del puntatore (ossia la modifica dell'indirizzo al primo elemento, che avviene solo coi puntatori, appunto):

Codice:
 char str[] = "giove";
 char *s = "giove";

//OK
putchar(*(str+3));
putchar(*(s+3));

// questo da' errore
str+=3;
// questo no
s+=3;

putchar(*s);
 
Qualche giorno fa ho letto da qualche parte che anche un Array utilizza un puntatore, e che l'indice di un elemento è solo un intero da aggiungere al puntatore.

Per esempio
Codice:
char string[] = "stringa";

printf(string[2]);
// Dove 2 sarebbe *(string + 2)

Quindi alla fine un Array è solo un puntatore con qualche feature in più
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top