Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Domanda teorica (vettori / puntatori)
Forum - C/C++ - Domanda teorica (vettori / puntatori)

Avatar
Astaroth (Normal User)
Newbie


Messaggi: 19
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:56
Mercoledì, 06/01/2010
Ciao!

Nella dispensa di informatica che sto studiando è proposto il seguente esercizio.

Un programma contiene la seguente dichiarazione:

Codice sorgente - presumibilmente C/C++

  1. char *color[6] = {"rosso", "verde", "blu", "bianco", "nero", "giallo"};



a) Qual è il significato di color?
b) Qual è il valore di *color?
c) Qual è la differenza tra color[5] e *(color+5)?

Io risponderei così:

a) color è l'indirizzo del primo elemento del vettore ???
b) il valore di *color è "rosso"
c) sono entrambe la stessa cosa... (penso)

Sono corrette le miei risposte? Grazie in anticipo.

Ultima modifica effettuata da Astaroth il 07/01/2010 alle 0:46
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 0:40
Giovedì, 07/01/2010
Ciao!

Con char *color[6] = {"rosso", "verde", "blu", "bianco", "nero", "giallo"};
si definisce un vettore formato da 6 stringhe.
(Una stringha a sua volta è molto simile ad un vettore di caratteri.)

Rispondo alle tue domande:

a: color è il mome per identificare il puntatore, non il suo indirizzo.

b: *color è il puntatore alla prima stringha.
( Es.: se provi a scrivere cout<<*color; stamperà rosso)

c: Non c'e alcuna differenza tra color[5] e *(color+5).
Ma stai attento a scrivere *color+5: in questo caso, prima viene presa in considerazione la prima stringha, quindi ( +5 ) il sesto carattere...



Ultima modifica effettuata da Poggi Marco il 07/01/2010 alle 10:58


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 0:44
Giovedì, 07/01/2010
Tutto ruota intorno il carattere *, è il carattere di dereferenzazione.
Tramite esso guardi cosa c'è dentro la variabile a cui il puntatore punta, quando non c'è guardi direttamente dentro il puntatore (e vedi quindi l'indirizzo).

In questa situazione specifica che hai postato però, ti ritrovi in realtà in un puntatore a puntatore, infatti l'array è di stringhe (che in C non esistono, bisogna inventarle come array di char, tempi bui :D ).

Questo significa che quando dereferenzi ti ritrovi nuovamente in un puntatore e quindi nuovamente ottieni un indirizzo, e per leggere anch'esso dovrai dereferenziare ancora una volta.

Quindi color è il puntatore al puntatore di 'r'.
Nel momento in cui dereferenzi color con *color vai a guardare cosa c'è dentro la zona di memoria puntata, e dentro c'è il puntatore ad 'r'. Quindi il valore di *color è di nuovo un indirizzo che punta da qualche parte, e cosa contiene? Per saperlo devi dereferenziare ancora una volta e quindi **color vale 'r'.

color[5] è ovviamente il 6 elemento, ma il sesto elemento è anche in questo caso sempre un char*, quindi il 6° elemento è un puntatore a 'g'. Per tirarti fuori proprio un char contenente 'g' dovrai dereferenziare e fare *color[5].

La scrittura *(color + 5) fa la stessa cosa di color[5] ma usando l'aritmetica dei puntatori, quindi in questo modo con color + 5 vai a puntare 5 posizioni più in la rispetto al primo elemento, e con * dereferenzi guardandoci dentro.

Per dire se fai (color + 1) vai alla seconda posizione, che è un puntatore a carattere, quindi una stringa; per leggere il secondo carattere della seconda stringa dovrai fare:

*(*(color + 1) + 1)

Sempre usando l'aritmetica dei puntatori.
Usando l'operatore [] puoi fare la più snella color[1][1] e ottieni la stessa cosa: il secondo carattere della seconda stringa.

Salvo errori ed omissioni.
Il C, per fortuna, non lo uso da tanto :D



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote
Avatar
Astaroth (Normal User)
Newbie


Messaggi: 19
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 0:58
Giovedì, 07/01/2010
Grazie ad entrambi!

P.S: Nessuna omissione! ;)

Ultima modifica effettuata da Astaroth il 07/01/2010 alle 1:00
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 1:10
Giovedì, 07/01/2010
Gli elementi del vettore sono char*. Quindi la tua situazione, dalla prospettiva puntatore, sarebbe un char**, un puntatore a puntatore, dereferenziare una volta porta ad un puntatore, che dereferenziato ancora porta al valore.

Quindi nel momento in cui fai *color stai ancora trattando un puntatore, infatti una stringa è un char*, poi ci si può mettere c'accordo e dire "una stringa è un puntatore a carattere", ma nel momento in cui lavori con "le stringhe" devi essere consapevole che in realtà è solo un'invenzione, sotto in realtà tratti sempre con stramaledetti puntatori :D

Chiaramente poi nel momento in cui dai printf su *color e specifichi %s come format stampa "rosso", ma perchè passandogli %s gli bisbigli "ti sto passando 'una stringa' ", così la funzione printf capisce e farà il lavoro di scorrere il puntatore e stampare i caratteri.




Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote