Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C] passare una stringa di carattere a una funzione

    Salve a tutti.

    Sto studiando le stringe di caratteri in C e in particolare come esse vengono passate a una funzione.
    Ho visto che se voglio che la funzione modifichi la stringa, nel prototipo di funzione e nell'intestazione si dovrebbe scrivere:

    function(char *stringPtr)

    dove stringPtr è il puntatore alla stringa. Perché non si può usare direttamente

    function(char string)

    dato che string, il nome della stringa, non è altro che un puntatore al primo carattere? Che cosa fa questo prototipo/intestazione?

    Da quanto ho capito, una stringa è un vettore di caratteri. Però nel caso di vettori, essi possono essere passati a funzioni direttamente con il loro nome e la funzione potrà modificarli:

    function(int vector)

    senza dover ricorrere alla sintassi function(int *vectorPtr).
    Questa differenza mi confonde ulteriormente le cose...

    Grazie anticipatamente!!

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Perchè in C i vettori sono identificati da un puntatore che punta al loro inizio.
    Dato che una stringa in C è solo un vettore di caratteri,

    function(char *stringPtr) passa un vettore di caratteri (una stringa),
    function(char stringPtr) passa un carattere, e non un vettore di caratteri.

    Per passare un vettore di interi, l'intestazione corretta è quella col puntatore:
    function(int *vectorPtr)

    function(int vectorPtr) passa solo un intero. Tra l'altro, se provi a passare il nome di un vettore a questa funzione, il compilatore ti segnalerà che stai facendo un cast da int* a int, e dovrebbe avvertirti.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  3. #3
    Originariamente inviato da Ippo343
    Per passare un vettore di interi, l'intestazione corretta è quella col puntatore:
    function(int *vectorPtr)

    function(int vectorPtr) passa solo un intero.
    Per quanto riguarda il vettore, credo che sia sufficiente passare il nome del vettore stesso, che come dici tu è l'indirizzo al suo primo elemento. Dato che gli elementi del vettore sono allocati uno di seguito all'altro all'interno della memoria, indicare il primo elemento è sufficiente per indicare l'intero vettore.
    Quindi credo l'intestazione function(int vector) passerà tutto il vettore e facendo qualche piccolo programma mi conferma quanto detto.
    La cosa che non capisco è perché questo non sia valido anche per una stringa che altro non è che un vettore di caratteri.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Originariamente inviato da ginetto79
    Dato che gli elementi del vettore sono allocati uno di seguito all'altro all'interno della memoria, indicare il primo elemento è sufficiente per indicare l'intero vettore.
    Il nome dell'array è un puntatore che punta al primo elemento. Quando dichiari un vettore di interi, è di tipo int*, e quindi non può essere passato ad una funzione il cui parametro sia int.
    Quando passi un int* ad una funzione che si aspetta un int, viene fatto un cast implicito che trasforma il puntatore ad un intero, ma questo cast produce essenzialmente solo spazzatura.

    Hai abilitato i warning del compilatore? Questo cast implicito non genera un errore in C, ma solo un warning.

    Se la funzione si aspetta un int, viene copiato un valore intero in una variabile che risiede nello stack: quindi ti perdi il resto del vettore, punto. Non si può passare un int* ad una funzione che si aspetta int.

    Questa differenza di sintassi che ti confonde non esiste: abilita i warning del compilatore e vedrai che in realtà quella che credi sia una sintassi valida è in effetti un errore logico.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  5. #5
    Trovato!

    Effettivamente se scrivo function(int vector) passa un intero, mentre function(int *vector) passa un vettore di interi.
    Ma... anche function(int vector[]) passa come vettore di interi!
    Era questa terza possibilità che mi confondeva un po' le idee!

    Cos'è "cast"?

  6. #6
    LE STRINGHE IN C VENGONO SEMPRE PASSATE PER REFERENZA ...
    OVVERO SE TU SCRIVI
    MIA FUNZIONE (CHAR STRINGA[])
    E' UGUALE NELLO SCRIVERE
    (CHAR *STRINGA)
    ANCHE IO DA POCO STO STUDIANDO QUESTO PERO' PENSO CHE SIA COSì..
    SE INVECE SCRIVI (CHAR STRINGA) TI PASSERA' UN ELEMENTO DI TIPO CHAR...

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    In C, le due sintassi
    codice:
    int* vector;
    int vector[];
    definiscono entrambe vector come int*. Le due cose sono in un certo senso comode dal punto di vista di un programmatore: a certe funzioni voglio passare un valore per riferimento, ad altre un array.
    Differenziando le due sintassi, è leggitimo aspettarsi che

    codice:
    void f(int* foo);    //si aspetti un intero per riferimento
    void g(int bar[]);  //si aspetti un vettore di interi
    Dal punto di vista del codice però le due scritture sono assolutamente identiche (anche come prestazioni). Vedere le graffe non serve al compilatore, serve a te per capire che quello è un array e non un semplice puntatore (e viceversa).

    @assente1: usare il caps su un forum equivale ad urlare.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    CONCORDO CON ASSENTE1,SOLO CHE SI DICHIARA AD ESEMPIO FUNZIONE (CHAR *POINTER).

    Cast comunque è la conversione,può essere implicita o esplicita.
    Puoi usare una funzione apposita,oppure sfruttare il fatto che alcuni tipi hanno memoria sufficente a contenere quel tipo.
    Ogni tipo ha un valore,quel valore è leggibile o no se quel tipo ha abbastanza memoria per contenere il valore.
    I valori dei caratteri in c sono quelli della tabella ascii,io per passare un puntatore non escluderei l' idea di includere cstdio.
    Un esempio di cast implicito,un trucchetto per dire,è questo:

    codice:
    char carattere='a';
    printf("%d",a);               // lo sto stampando come intero,ma non importa,il valore 96 è un intero.
    int carattere;
    int carattere = a;
    cout << carattere;        // col cout stamperà solo il valore,cioè 96.
    printf("%c,%c",a,carattere);               // stamperà due volte il carattere a.
    ...
    Oppure usare funzioni come atoi che se non sbaglio stanno in cstdio.
    Secondo me a usare il cpp dall' inizio si perdono questi concetti base.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    No, ramy: il C++ è un superset del C, e come tale, fa cast impliciti esattamente come il C.
    L'unica situazione in cui non vedi i cast all'opera in C++ è l'output, il che rimuove un sacco di problemi che si hanno con printf.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Esempio: puoi passare un int ad una funzione che si aspetta un double. Viene fatto un cast implicito a double dato che è possibile.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

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 © 2024 vBulletin Solutions, Inc. All rights reserved.