Caricare documenti e articoli online 
INFtub.com è un sito progettato per cercare i documenti in vari tipi di file e il caricamento di articoli online.


 
Non ricordi la password?  ››  Iscriviti gratis
 

I PUNTATORI - Passaggio per valore

informatica



I PUNTATORI


Alle funzioni si possono passare parametri per valore o per reference (indirizzo).


Passaggio per valore

Il passaggio per valore consiste nel copiare i valori dei parametri attuali (della funzione chiamante) nei parametri formali (del sottoprgramma chiamato): abbiamo quindi due celle di memoria distinte per le due variabili. I parametri formali, al termine della funzione, ven 212e43c gono cancellati e il loro valore perso se non c'è nessun return e non c'è nessun cambiamento dei parametri attuali, anche se nella funzione cambiano quelli formali, perché sono situati in celle di memoria diverse.


Passaggio per reference (o indirizzo)

In questo tipo di passaggio i parametri attuali e formali fanno riferimento alla stessa cella di memoria quindi, eventuali variazioni del valore dei parametri nel sottoprogramma chiamato si ripercuotono anche nella variabile del chiamante.



Questo metodo è molto utile principalmente in due casi:


  • Se in uscita dal sottoprogramma abbiamo 2 o più variabili semplici (il return può tornare solo un valore; in questo modo posso invece modificare le variabili del chiamante e "ritornare" più valori);
  • Nel caso i parametri in ingresso siano anche di uscita

Per quanto riguarda il passaggio di array e struct questo avviene sempre per indirizzo.


Queste variabili, che contengono solo un indirizzo di memoria non un valore, vengono chiamate puntatori.



























I PUNTATORI NEL LINGUAGGIO C



Dichiarazione e inizializzazione di una variabile di tipo puntatore

Il tipo indicato in una variabile puntatore coincide con quello della variabile da puntare.

La sintassi è la seguente:

TipoVariabilePuntata *nomePuntatore;


Per inizializzare la var puntatore all'indirizzo di memoria della variabile puntata si utilizza l'operatore "&". Prima dell'inizializzazione il suo valore è NULL.

varPuntatore=&varPuntata;


Esempio:

il puntatore p è allocato all'indirizzo 00CF e contiene come valore 0ABF. 0ABF è l'indirizzo di memoria della var che p punta.



L'operatore di indirezione asterisco*

L'operatore * serve per accedere al contenuto della variabile puntata. Deve sempre precedere il nome del puntatore.


Esempio:

int var=3;

int p=*var;


printf("%d", *p); // stampa il valore di var quindi 3

printf("%d", p);  //visualizza il contenuto di p ovvero un indirizzo di memoria


Questo operatore si utilizza nella dichiarazione di un puntatore (anche per i parametri formali) e per accedere al valore della variabile puntata.



L'operatore e-commerciale &

L'operatore & serve per riferirsi ad un indirizzo di memoria.

Si utilizza:

  • Con la scanf della variabili
  • Nelle chiamate delle funzioni per passare la variabile come puntatore (si può omettere se si stanno passando array)
  • Per inizializzare la var puntatore ad un indirizzo

NB: l'operazione &var=15; è assolutamente illegale in quanto significherebbe cercare di variare un indirizzo di memoria.










PROBLEMA

Visualizzare la dimensione di uno struct, i valori dei suoi campi e l'indirizzo di memoria dove sono allocate tali variabili.


ANALISI del CODICE

Si deve innanzitutto creare lo struct ed inizializzarlo.

Per visualizzare la dimensione in byte di un elemento si utilizza l'istruzione sizeof(elemento).

Per visualizzare l'indirizzo di una cella di memoria si utilizza lo specificatore di formato "%p" perché è in esadecimale.



CODIFICA


//LIBRERIE

#include <stdio.h>

//COSTANTI

#define max 5

#define maxCHAR 10


//Nuovi tipi: RECORD

struct tipo



struct tipo variabileStruct[max]=


,

,

,




int main()




Dalla tabella si può notare che ciascun elemento dista dal precedente un numero di byte pari alla sua dimensione.






PROBLEMA

Scambiare due variabili usando i puntatori.


ANALISI

Si deve costruire una funzione scambia che, ricevendo in ingresso due variabili puntatori,  permetta di scambiare i dati.

Per la chiamata si passano come variabili i due numeri letti preceduti da & per indicare che si passa il loro indirizzo nel parametro formale.

Nel prototipo e nella riga di interfaccia i puntatori sono preceduti da *.

Durante le operazioni i puntatori sono sempre preceduti da * per indicare l'accesso diretto alla variabile da loro puntata.



CODIFICA


#include <stdio.h>


//PROTOTIPI

void scambia(int *, int *); //* parametri formali = puntatori


int main ()



void scambia(int *x, int *y)







Privacy




Articolo informazione


Hits: 2329
Apprezzato: scheda appunto

Commentare questo articolo:

Non sei registrato
Devi essere registrato per commentare

ISCRIVITI



Copiare il codice

nella pagina web del tuo sito.


Copyright InfTub.com 2024