Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] Chiarimento sull' uso dei puntatori

    Copio da una pagina web:

    codice:
    void funzione_stupida( int *x ) {
        *x++;
    }
    ...
    mail() {
        int y = 10;
        ...
        funzione_stupida( &y );
        ...
    }
    L'esempio mostra la dichiarazione e descrizione di una funzione che non restituisce alcun valore, e riceve un parametro puntatore a un intero. Il lavoro della funzione č solo quello di incrementare il valore contenuto nell'area di memoria a cui si riferisce tale puntatore.

    Poco dopo, nella funzione main() inizia il programma vero e proprio; viene dichiarata la variabile y, un intero normale inizializzato a 10, e a un certo punto viene chiamata la funzione vista prima, passando il puntatore a y.

    Il risultato č che dopo la chiamata, la variabile y contiene il valore precedente incrementato di un'unitą.
    Il mio dubbio č, perchč se il metodo usa puntatori non li uso nel main? Quando passo &y quella locazione contiene 10, ma non punta ad un' altra cella di memoria......accade forse perchč non essendo un puntatore viene modificato il valore medesimo della locazione che passo come parametro?

  2. #2
    Occhio, non stai passando y, ma &y. L'operatore & ottiene l'indirizzo della variabile su cui viene applicato, "creando" un puntatore che punta ad essa.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ah...gią cambia qualcosa. Quindi se avessi passato come parametro "y" credo che avrei avuto errore di compilazione. In quel modo in sostanza per come č definito il metodo passando &y č come fare: int *pn = &y, cioč viene creato un puntatore che non vedo e quindi il metodo funziona. Giusto?

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Aggiungo che nella funzione_stupida ti sei dimenticato le parentesi,
    dovevi scrivere:
    (*x)++;
    invece di
    *x++; // in questo modo se stampassi "y" nella main varrebbe ancora 10

    Lascio a te capire la differenza, perché č abbastanza basilare.

  5. #5
    Originariamente inviato da Darčios89
    Ah...gią cambia qualcosa. Quindi se avessi passato come parametro "y" credo che avrei avuto errore di compilazione.
    Esattamente.
    In quel modo in sostanza per come č definito il metodo passando &y č come fare: int *pn = &y, cioč viene creato un puntatore che non vedo e quindi il metodo funziona. Giusto?
    Sģ; in generale comunque il fatto che "nascano" oggetti temporanei all'interno delle espressioni (senza che siano esplicitamente assegnati a variabili) č una cosa normale, ti ci devi fare l'abitudine.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Lascio a te capire la differenza, perché č abbastanza basilare.
    Mh....credo che con le parentesi incremento il valore contenuto nella locazione di memoria puntata, nel secondo caso, incremento il valore del puntatore? Cioč della locazione di memoria che punta? Non mi torna chiarissimo...

    Facevo questa domanda per un dubbio studiando le socket, ho la chiamata:

    codice:
    int bind(int sockfd, struct sockaddr *my_addr,
    int addrlen);
    E poi leggo:

    nella chiamata, l’argomento ha un tipo specifico struct
    sockaddr xxx *, reso legale via type casting; p.es.:

    struct sockaddr in thisAddr; // da inizializzare
    ...
    bind(sd, (struct sockaddr * ) &thisAddr, alen);
    Ma perchč devo fare cast? Nell' esempio precedente (stupido) non ho fatto alcun cast, non č simile?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Fai attenzione ... la struttura passata č di tipo

    sockaddr_in

    mentre la funzione si aspetta il puntatore ad una generica struttura

    sockaddr

    Ecco perché č necessario il cast.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Originariamente inviato da Darčios89
    Mh....credo che con le parentesi incremento il valore contenuto nella locazione di memoria puntata, nel secondo caso, incremento il valore del puntatore? Cioč della locazione di memoria che punta?
    Sģ.
    Non mi torna chiarissimo...
    Se stesse puntando ad un elemento di un array, incrementare il puntatore lo farebbe puntare all'elemento successivo.
    Originariamente inviato da oregon
    Fai attenzione ... la struttura passata č di tipo

    sockaddr_in

    mentre la funzione si aspetta il puntatore ad una generica struttura

    sockaddr

    Ecco perché č necessario il cast.
    Aggiungo: in questo caso č lecito (perché la sockaddr č di fatto l'"inizio" della sockaddr_in), ma un cast da un tipo di puntatore ad un altro incompatibile dą in generale risultati senza senso.

    Perņ se ancora stai imparando i puntatori lascerei momentaneamente da parte socket & co. (e in generale funzioni che usano "trucchi strani" con i puntatori).
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Aaaah ok grazie mille!!!

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