Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    46

    [c/c++] chiarimenti puntatori e funzioni

    Allora, ci sono un paio di cose su cui vorrei dei chiarimenti ma non riesco a trovare niente in giro per internet.

    Prima cosa, quando io ho una funzione del tipo:

    void (char s[]);

    è equivalente a scrivere:

    void (char *s);

    ?

    E se sì, se una funzione ha come argomento un vettore, questo è sempre un puntatore al vettore che gli è stato passato oppure può essere una variabile automatica?

    poi...

    Ho trovato in un testo una cosa del genere (faccio il programma più breve possibile):

    void inc(int &x) {x++;}

    int main() {

    int i=0;
    inc(i);
    cout<<i;
    }

    ho provato questo programma e il suo output è 1. In pratica ho capito come funziona, ma teoricamente qual'è il significato di scrivere int &x come arogomento della funzione?


    un'ultimissima cosa

    perché quando faccio un programma mi considera il carattere '\0' uguale a " " (spazio). Funziona così o è il mio compilatore/set di caratteri che non funziona? (kdevelop c++/ubuntu feisty).

    grazie in anticipo per l'aiuto e scusate l'ignoranza

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,246

    Re: [c/c++] chiarimenti puntatori e funzioni

    Originariamente inviato da gianpa
    Prima cosa, quando io ho una funzione del tipo:

    void (char s[]);

    è equivalente a scrivere:

    void (char *s);


    E se sì, se una funzione ha come argomento un vettore, questo è sempre un puntatore al vettore che gli è stato passato oppure può essere una variabile automatica?
    Se l'argomento e' un vettore, e' il puntatore al vettore ma non capisco cosa intendi con "può essere una variabile automatica ..." ...


    Ho trovato in un testo una cosa del genere (faccio il programma più breve possibile):

    void inc(int &x) {x++;}

    int main() {

    int i=0;
    inc(i);
    cout<<i;
    }

    ho provato questo programma e il suo output è 1. In pratica ho capito come funziona, ma teoricamente qual'è il significato di scrivere int &x come arogomento della funzione?
    E' una caratteristica del C++, quella di passare gli argomenti per riferimento (&x)
    Gli argomenti passati in questo modo possono essere modificati dalla funzione perche' e' il compilatore che si occupa, automaticamente, di passare il loro puntatore. Ma sia all'interno della funzione che nella chiamata, il puntatore non compare mai esplicitamente.

    un'ultimissima cosa

    perché quando faccio un programma mi considera il carattere '\0' uguale a " " (spazio). Funziona così o è il mio compilatore/set di caratteri che non funziona? (kdevelop c++/ubuntu feisty).

    grazie in anticipo per l'aiuto e scusate l'ignoranza
    Non ho capito cosa intendi. Il carattere '\0' non e' uguale allo spazio e non comprendo come il tuo programma lo consideri "uguale" ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    46
    Innanzitutto grazie per le risposte

    poi hai ragione non sono stato chiarissimo.

    Quello che volevo dire è:

    se io ho una funzione del tipo:

    void funzione(int c);

    se richiamo la funzione scrivendo:

    funzione(x);

    la variabile c della funzione è una copia di x e quindi se la modifico x non cambia.

    diversamente se la mia funzione è del tipo:

    void funzione(int c[]);

    se scrivo:

    int x[100];

    funzione(x);

    ovviamente alla funzione ho passato l'indirizzo di memoria del primo elemento di x quindi c non è più una copia del vettore x ma semplicemente un puntatore a x e non si può fare in modo che c sia una copia di x, ho capito bene? (spero almeno, altrimenti mi spiego ancora meglio )


    per la seconda domanda che non hai capito, faccio prima a fare un esempio:

    int main() {

    char s[100];
    int i;

    cin>>s;

    for(i=0;s[i]!='\0';i++) ;

    cout<<s;

    }
    inserendo come input:

    stringa prova

    L'output di questo programma è:

    6

    invece dovrebbe essere 12... Da cosa dipende?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,246
    Originariamente inviato da gianpa
    ...
    non si può fare in modo che c sia una copia di x
    ...
    No ... gli array sono passati per riferimento e non per copia ...

    ...
    un esempio:
    ...

    inserendo come input:

    stringa prova

    L'output di questo programma è:

    6

    invece dovrebbe essere 12...
    Intanto, per ottenere il valore, devi scrivere

    cout<<i;

    e otterresti 7 e non 6.

    In ogni caso, il problema e' determinato dalla

    cin>>s;

    che assegna alla stringa solamente la parte dell'input fino al primo terminatore che e' lo spazio. Quindi alla variabile s sara' assegnata la parola

    stringa

    e sara' terminata prima dello spazio (ecco perche' trovi il null al posto dello spazio).
    Devi usare la getline per prelevare tutta la linea, cioe'

    cin.getline(s, 100);

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    46
    grazie!!

    Ora è tutto chiaro, ti spiego...

    Io un paio di anni fa avevo studiato il c per conto mio da: "Linguaggio C" di Kernighan e Ritchie.

    Un paio di mesi fa ho saputo che una mia amica doveva fare un esame all'università sul c++. Quando ho visto il programma d'esame mi sono reso conto che l'unica "cosa" di c++ e che quindi io non conoscevo erano le due funzioni cin e cout, una volta imparato empiricamente il loro funzionamento mi sono offerto di aiutarla...

    Dove posso leggere qualcosa di più sulla funzione cin e cout? così magari sapendo bene come funziona non cado più n questi errori visto che per me è abbastanza incomprensibile il fatto che qualsiasi cosa dai in pasto a cout viene stampata a prescindere da cosa è

    comunque grazie ancora

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,246
    cout e cin non sono funzioni ma oggetti.

    Gli oggetti cout/cerr/cin/clog sono predefiniti e resi disponibili (istanziati automaticamente) dal runtime. Sono di classe ostream e istream.

    Trovi info a partire da

    http://www.cplusplus.com/reference/iostream/

    in cui ci sono anche i link per gli oggetti in questione.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    46
    ok, grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.