DOMANDA Puntatori

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

marco42

Nuovo Utente
Messaggi
55
Reazioni
5
Punteggio
22
salve a tutti sapreste dirmi cosa sono i metodi referenza e deferenza sui puntatori ?? li dovrei portare ad un esame di fondamenti di informatica ma non ci ho capito molto dal libro di testo. grazie in anticipo
 
Dereferenziare significa accedere al dato puntato, a quella locazione di memoria. Il puntatore solitamente è un puntatore ad un tipo di dato. Questo è significa che al suo interno trovi un indirizzo di memoria (virtuale) che è quello a cui il dato risiede.

Ma hai l'esame in questi giorni? Mi auguro di no, poiché in applicativi più complicati saranno alla base questi concetti e non potrai muoverti a tentoni.
 
Dereferenziare significa accedere al dato puntato, a quella locazione di memoria. Il puntatore solitamente è un puntatore ad un tipo di dato. Questo è significa che al suo interno trovi un indirizzo di memoria (virtuale) che è quello a cui il dato risiede.

Ma hai l'esame in questi giorni? Mi auguro di no, poiché in applicativi più complicati saranno alla base questi concetti e non potrai muoverti a tentoni.
Grazie per aver risposto, l’esame è la settimana prossima e vorrei cercare di capire sia in teoria che in pratica cosa vogliono dire questi due concetti, potresti dirmi una breve ma concreta spiegazione è un esempio di applicazione ??
Grazie in anticipo
 
Un puntatore è una variabile particolare che anziché contenere un valore di un certo tipo (int, float, char, ecc) contiene l'indirizzo di un'altra variabile. Per cui ad esempio, in linguaggio C, un puntatore a integer (che si dichiara con int *nome_puntatore;) è una variabile che può contenere (solo) indirizzi di variabili di tipo integer (oltre al valore speciale NULL o 0, che significa che il puntatore non punta a niente). Naturalmente, come ogni altra variabile, anche i puntatori, se non inizializzati, contengono valori casuali, e questo bisogna tenerlo presente quando li si dereferenzia, cioè quando si accede alla variabile puntata tramite il puntatore stesso. In C l'operatore di dereferenziazione è il carattere *. Quindi dereferenziare un puntatore significa accedere, tramite esso, alla variabile puntata. Per referenza penso tu intenda l'uso dell'operatore di indirizzo, & in C, che serve a ricavare l'indirizzo di una variabile per assegnarlo a un puntatore (e quindi per far puntare il puntatore a quella variabile). Si usa anche per passare un parametro a una funzione/procedura mediante riferimento (o referenza, appunto). Ti mostro degli esempi.
abc dei puntatori:
C:
    int a = 5; // dichiaro una variabile di tipo intero e la inizializzo a 5
    int *ptr; // dichiaro un puntatore a intero
    ptr = &a; /* con l'operatore di indirizzo & assegno al puntatore l'indirizzo di a,
               * cioe' faccio puntare il puntatore ad a */
    // queste due istruzioni producono lo stesso output (stampano 5):
    printf("%d\n", a); // stampo il valore di a
    printf("%d\n", *ptr); /* uso l'operatore di dereferenziazione * per stampare il valore
                           * di a, variabile puntata da ptr */
    *ptr = 8; // modifico il valore di a tramite il puntatore, equivale all'istruzione a = 8;
Passaggio di parametri per riferimento con i puntatori:
C:
    /* immagina di voler scrivere due funzioni che effettuano una somma dei due operandi,
     * nella prima usi il passaggio per valore, nella seconda, quello per riferimento con i puntatori
     */
    int x = 3;
    int y = 5;
    int s1, s2;
    s1 = somma_val(x, y); // chiamata con passaggio per valore
    s2 = somma_rif(&x, &y); /* chiamata con passaggio per riferimento, uso l'operatore &
                             * per passare gli indirizzi delle due variabili
                             */
    // funzione che prende due variabili passate per valore e restituisce la loro somma
    int somma_val(int a, int b) {
        return a + b;
    }
    // funzione che prende due variabili passate per riferimento e restituisce la loro somma
    int somma_rif(int *a, int *b) { // prende in input due puntatori, cioè due indirizzi, in pratica
        return *a + *b; /* per questa ragione uso l'operatore *, perche' se scrivessi a+b
                         * sommerei gli indirizzi, non i dati */
    }
Tentativo di dereferenziare un puntatore non inizializzato:
C:
    int *ptr; // dichiaro un puntatore a intero
    *ptr = 4;  /* modifico il valore della locazione di memoria puntata. Attenzione:
                * e' una locazione casuale, e porta a un comportamento indefinito del programma,
                * con possibili errori, perche' magari si modifica una locazione che appariene a una variabile,
                * o perche' si tenta di accedere ad aree di memoria cui non e' consentito accedere */
 
Un puntatore è una variabile particolare che anziché contenere un valore di un certo tipo (int, float, char, ecc) contiene l'indirizzo di un'altra variabile. Per cui ad esempio, in linguaggio C, un puntatore a integer (che si dichiara con int *nome_puntatore;) è una variabile che può contenere (solo) indirizzi di variabili di tipo integer. Naturalmente, come ogni altra variabile, anche i puntatori, se non inizializzati, contengono valori casuali, e questo bisogna tenerlo presente quando li si dereferenzia, cioè quando si accede alla variabile puntata tramite il puntatore stesso. In C l'operatore di dereferenziazione è il carattere *. Quindi dereferenziare un puntatore significa accedere, tramite esso, alla variabile puntata. Per referenza penso tu intenda l'uso dell'operatore di indirizzo, & in C, che serve a ricavare l'indirizzo di una variabile per assegnarlo a un puntatore (e quindi per far puntare il puntatore a quella variabile). Si usa anche per passare un parametro a una funzione/procedura mediante riferimento (o referenza, appunto). Ti mostro degli esempi.
abc dei puntatori:
C:
    int a = 5; // dichiaro una variabile di tipo intero e la inizializzo a 5
    int *ptr; // dichiaro un puntatore a intero
    ptr = &a; /* con l'operatore di indirizzo & assegno al puntatore l'indirizzo di a,
               * cioe' faccio puntare il puntatore ad a */
    // queste due istruzioni producono lo stesso output (stampano 5):
    printf("%d\n", a); // stampo il valore di a
    printf("%d\n", *ptr); /* uso l'operatore di dereferenziazione * per stampare il valore
                           * di a, variabile puntata da ptr */
    *ptr = 8; // modifico il valore di a tramite il puntatore, equivale all'istruzione a = 8;
Passaggio di parametri per riferimento con i puntatori:
C:
    /* immagina di voler scrivere due funzioni che effettuano una somma dei due operandi,
     * nella prima usi il passaggio per valore, nella seconda, quello per riferimento con i puntatori
     */
    int x = 3;
    int y = 5;
    int s1, s2;
    s1 = somma_val(x, y); // chiamata con passaggio per valore
    s2 = somma_rif(&x, &y); /* chiamata con passaggio per riferimento, uso l'operatore &
                             * per passare gli indirizzi delle due variabili
                             */
    // funzione che prende due variabili passate per valore e restituisce la loro somma
    int somma_val(int a, int b) {
        return a + b;
    }
    // funzione che prende due variabili passate per riferimento e restituisce la loro somma
    int somma_rif(int *a, int *b) { // prende in input due puntatori, cioè due indirizzi, in pratica
        return *a + *b; /* per questa ragione uso l'operatore *, perche' se scrivessi a+b
                         * sommerei gli indirizzi, non i dati */
    }
Tentativo di dereferenziare un puntatore non inizializzato:
C:
    int *ptr; // dichiaro un puntatore a intero
    *ptr = 4;  /* modifico il valore della locazione di memoria puntata. Attenzione:
                * e' una locazione casuale, e porta a un comportamento indefinito del programma,
                * con possibili errori, perche' magari si modifica una locazione che appariene a una variabile,
                * o perche' si tenta di accedere ad aree di memoria cui non e' consentito accedere */
Grazie mille Fabio, ho le idee molto più chiare ed ho capito che era 7n operazione che già sapevo eseguire solo che non avevo idea si chiamasse così. Grazie ancora
 
Grazie per aver risposto, l’esame è la settimana prossima e vorrei cercare di capire sia in teoria che in pratica cosa vogliono dire questi due concetti, potresti dirmi una breve ma concreta spiegazione è un esempio di applicazione ??
Grazie in anticipo
Mi scuso se non ti ho più risposto, ma sono tornato tardi da lavoro e mi ero scordato di dare un occhiata al forum. ;)
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità

Discussioni Simili

Indietro
Top