Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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 ?
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++
int suit[4] = {1, 2, 3, 4};
Questa
Codice sorgente - presumibilmente C/C++
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++
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
()
Newbie
Messaggi: Iscritto:
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 ... Ti sei soffermato nel dire:
suit è un vettore di puntatori a valori interi grazie ma questo lo sapevo
un altro dubbio che mi è sorto:
Codice sorgente - presumibilmente C/C++
char *string = "ciao"
sarebbe in realtà così giusto ? c i a o \0
lo stesso sarebbe di questo:
Codice sorgente - presumibilmente C/C++
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
*(string + 1)
sarebbe uguale a i giusto ?
Ultima modifica effettuata da il 12/06/2010 alle 12:54
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
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 ?
Sì
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
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++
char suit[4] = {'a', 'b', 'c', 'd'}
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
()
Newbie
Messaggi: Iscritto:
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++
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
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
()
Newbie
Messaggi: Iscritto:
Postato alle 14:18
Sabato, 12/06/2010
ho capito:
per capire meglio ho fatto un programmino
Codice sorgente - presumibilmente C++
#include <stdio.h>
int main (void){
char*a[4]={"ciao", "nonna", "cavolo", "barba"};
char b[4]={"ciao", "nonna", "cavolo", "barba"};/* mi da errore */
printf("%c\n", *a[2]);/* mi stampa la lettera c di cavolo */
printf("%c\n", b[2]);/* non verrà mai stampata */
return0;
}
ho notato che con i vettori di puntatori posso inserire quanti valori (stringhe) voglio;
quando vado a stampare un elemento del vettore *pPtr si avrà il seguente caso:
Codice sorgente - presumibilmente Plain Text
printf("%c\n", *pPtr[2]);
output: $ c
quindi mi stamperà le iniziali di ogni valore (stinga) che io chiamerò.
in questo caso:
Codice sorgente - presumibilmente C/C++
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++
char a[4] = { 'c', 'i', 'a', 'o', '\0'};
oppure posso fare così
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