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++ - I vettori di puntatori
Forum - C/C++ - I vettori di puntatori

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Sul mio libro sono spiegati ma non troppo bene (o meglio forse non capisco io !) e quindi sono venuto per farmi chiarire un po l'idee ... Dei puntatori ho capito quasi tutto tranne una cosa: i vettori di puntatori.

Che differenza ci sono in questi pezzi di codice ?


Codice sorgente - presumibilmente C/C++

  1. char *suit[4] = {"cuori", "quadri", "fiori", "picche"}


con questo
Codice sorgente - presumibilmente C/C++

  1. char suit[4] = {"cuori", "quadri", "fiori", "picche"}



altri due:

Codice sorgente - presumibilmente C/C++

  1. char string[] = {"ciao"}


con questo
Codice sorgente - presumibilmente C/C++

  1. char *string = "ciao"



Ultima domanda: c'è differenza tra gli apici ' e i doppi apici " ?

Edit: Ho corretto gli errori di distrazione :om:

Ultima modifica effettuata da il 12/06/2010 alle 13:08
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5461
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:58
Sabato, 12/06/2010
Postato originariamente da Pitagora:
Che differenza ci sono in questi pezzi di codice ?


Codice sorgente - presumibilmente C/C++

  1. int *suit[4] = {"cuori", "quadri", "fiori", "picche"}



suit è un vettore di puntatori a valori interi. L'inizializzazione è sbagliata in quanto dovrebbe essere un vettore di puntatori a char, ovvero

Codice sorgente - presumibilmente C/C++

  1. char *suit[4] = {"cuori", "quadri", "fiori", "picche"};



In questo caso

Codice sorgente - presumibilmente C/C++

  1. int suit[4] = {"cuori", "quadri", "fiori", "picche"}



hai solamente un vettori di valori interi. Anche questa inizializzazione, a maggior ragione, è sbagliata ... potrebbe essere

Codice sorgente - presumibilmente C/C++

  1. int suit[4] = {1, 2, 3, 4};




Questa

Codice sorgente - presumibilmente C/C++

  1. char string[] = {'ciao']



è tutta sbagliata ... sia per la ] finale, sia per il fatto che utilizzi i singoli apici ' per racchiudere una stringa costante (dovresti usare le virgolette "  ...  " )
Se fosse stata scritta

char string[] = {"ciao"};

o anche così

char string[] = "ciao";

avresti avuto un vettore in memoria inizializzato con il dato tra virgolette.

con questo
Codice sorgente - presumibilmente C/C++

  1. char *string = "ciao"



In questo modo, dichiari un puntatore ad una stringa costante. L'area della stringa non è modificabile (in quanto costante).

Ultima domanda: c'è differenza tra gli apici ' e i doppi apici " ?

Ovviamente ... il singolo apice è usato per racchiudere un dato di tipo char, ad esempio

'A'

rappresenta solamente un byte con il codice ASCII del carattere indicato, mentre le virgolette sono usate per racchiudere delle costanti di tipo vettore di char, ad esempio

"ciao"

indica che esiste in memoria un vettore di caratteri terminati da zero binario ovvero una zona di memoria che contiene

c i a o \0

Comunque, dalle domande che hai fatto, penso che le tue lacune non si fermino solamente ai puntatori ... dovresti rivedere *bene* i tipi di dati trattati dal C.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 12:39
Sabato, 12/06/2010
grazie. Scusa per gli errori (int - char e ] - }) ma andavo di fretta. Oltre alla correzione non mi hai spiegato la differenza tra i primi 2 esempi ... :_doubt: Ti sei soffermato nel dire:
suit è un vettore di puntatori a valori interi grazie ma questo lo sapevo :heehee:

un altro dubbio che mi è sorto:
Codice sorgente - presumibilmente C/C++

  1. char *string = "ciao"

sarebbe in realtà così giusto ? c i a o \0
lo stesso sarebbe di questo:
Codice sorgente - presumibilmente C/C++

  1. char string[] = {"ciao"}

sarebbe in realtà così giusto ? c i a o \0

La differenza tra i due sarebbe che il primo è costante e non può essere modificato. Il secondo invece è variabile e può essere modificato. (quello che è stato scritto da nessuno^)

quindi
Codice sorgente - presumibilmente Plain Text

  1. *(string + 1)

sarebbe uguale a i giusto ?

Ultima modifica effettuata da il 12/06/2010 alle 12:54
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5461
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:55
Sabato, 12/06/2010
Testo quotato

Postato originariamente da Pitagora:
non mi hai spiegato la differenza tra i 4 esempi



Forse non l'hai letta o capita ...

Testo quotato

Ti sei soffermato nel dire:
suit è un vettore di puntatori a valori interi grazie ma questo lo sapevo :heehee:



Scusa ma se veramente lo sapevi, come mai l'hai inizializzato con una lista di costanti stringa? Forse non sai esattamente cosa sia un vettore di puntatore ad interi, ecco perché te l'ho ricordato ...

Testo quotato

sarebbe in realtà così giusto ? c i a o \0



In memoria sì ... come ti ho detto già, il primo è un vettore che potrai modificare, il secondo è un puntatore ad un vettore di dati costanti.

Testo quotato

quindi
Codice sorgente
*(string + 1)
sarebbe uguale a i giusto ?





In tutte queste tue domande, comunque, non sono quasi mai entrati i

vettori di puntatori

che avevi messo come titolo del thread ...

Ultima modifica effettuata da nessuno il 12/06/2010 alle 13:06


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 13:08
Sabato, 12/06/2010
l'unico mio dubbio sono questi adesso:

Codice sorgente - presumibilmente C/C++

  1. char *suit[4] = {"cuori", "quadri", "fiori", "picche"}



Codice sorgente - presumibilmente C/C++

  1. char suit[4] = {"cuori", "quadri", "fiori", "picche"}



PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5461
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:15
Sabato, 12/06/2010
Testo quotato

Postato originariamente da Pitagora:

l'unico mio dubbio sono questi adesso:

Codice sorgente - presumibilmente C/C++

  1. char *suit[4] = {"cuori", "quadri", "fiori", "picche"}



Codice sorgente - presumibilmente C/C++

  1. char suit[4] = {"cuori", "quadri", "fiori", "picche"}





Solo la prima è una dichiarazione di un vettore di puntatori a char (precisamente 4 puntatori a quelle stringhe indicate nell'inizializzazione).

La seconda è la dichiarazione di un semplice vettore di char e dovrebbe essere inizializzato così

Codice sorgente - presumibilmente C/C++

  1. char suit[4] = {'a', 'b', 'c', 'd'}




Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:02
Sabato, 12/06/2010
Testo quotato

Postato originariamente da nessuno:


Solo la prima è una dichiarazione di un vettore di puntatori a char (precisamente 4 puntatori a quelle stringhe indicate nell'inizializzazione).

La seconda è la dichiarazione di un semplice vettore di char e dovrebbe essere inizializzato così

Codice sorgente - presumibilmente C/C++

  1. char suit[4] = {'a', 'b', 'c', 'd'}





potresti farmi l'esempio con i valori che ti ho dato ?

Ultima modifica effettuata da il 12/06/2010 alle 14:06
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5461
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:07
Sabato, 12/06/2010
Di quali valori parli? Che esempio?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:18
Sabato, 12/06/2010
ho capito:

per capire meglio ho fatto un programmino

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int main (void) {
  4.         char *a[4] = { "ciao", "nonna", "cavolo", "barba" };
  5.         char  b[4] = { "ciao", "nonna", "cavolo", "barba" }; /* mi da errore */
  6.         printf("%c\n", *a[2]); /* mi stampa la lettera c di cavolo */
  7.         printf("%c\n", b[2]); /* non verrà mai stampata */
  8.         return 0;
  9. }



ho notato che con i vettori di puntatori posso inserire quanti valori (stringhe) voglio;

Codice sorgente - presumibilmente C/C++

  1. char *pPtr[7] = {"ciao", "b", "cavolo", "pitagora", "nessuno", "piero"};


quando vado a stampare un elemento del vettore *pPtr si avrà il seguente caso:
Codice sorgente - presumibilmente Plain Text

  1. printf("%c\n", *pPtr[2]);
  2. output: $ c


quindi mi stamperà le iniziali di ogni valore (stinga) che io chiamerò.

in questo caso:
Codice sorgente - presumibilmente C/C++

  1. char  b[4] = { "ciao", "nonna", "cavolo", "barba" }; /* mi da errore */


mi da errore per il semplice motivo che non posso inserire più stringhe all'interno di un semplice vettore;
con un vettore (non puntatore) posso fare solo cosi:
Codice sorgente - presumibilmente C/C++

  1. char a[4] = { 'c', 'i', 'a', 'o', '\0'};
  2. oppure posso fare così
  3. char a[4] = {"ciao"};


il risultato è sempre lo stesso ..

Per riepilogare:
char *String2 = {"ciao"}; /* è costante e non puo essere modificato */
char String2[4] = {"ciao"}; /* questo vettore invece lo posso modificare */

"..." i doppi apici gli uso per racchiudere più caratteri
'.' i singoli apici gli uso per racchiudere un solo carattere

Grazie Nessuno !

Ultima modifica effettuata da il 12/06/2010 alle 14:24
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo