puntatori Lab. Calc. AA 2007/08 1



Documenti analoghi
puntatori Lab. Calc. AA 2006/07 1

Allocazione dinamica della memoria - riepilogo

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Gestione dei File in C

I puntatori e l allocazione dinamica di memoria

Funzioni in C. Violetta Lonati

Concetto di Funzione e Procedura METODI in Java

Introduzione al Linguaggio C

Gestione dei File. dischi nastri cd

Introduzione al linguaggio C Gli array

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Fondamenti di Informatica T. Linguaggio C: i puntatori

Linguaggio C - Funzioni

La gestione della memoria

Corso di Fondamenti di Informatica

Breve riepilogo della puntata precedente:

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Variabili e tipi di dato

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( )

Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Matlab: Gestione avanzata dei file

dall argomento argomento della malloc()

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

costruttori e distruttori

LINGUAGGI DI PROGRAMMAZIONE

Funzioni. Il modello console. Interfaccia in modalità console

Programmazione I / Informatica generale Prova scritta 11 Giugno 2008

Fondamenti di Informatica e Laboratorio T-AB Ingengeria dell Automazione a.a. 2008/2009. Lab 02 Tipi semplici in C

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

Funzioni matlab per la gestione dei file. Informatica B Prof. Morzenti

Laboratorio di programmazione

Inizializzazione, Assegnamento e Distruzione di Classi

Fondamenti di Informatica 2

Introduzione alla programmazione in C

Capitolo Quarto...2 Le direttive di assemblaggio di ASM Premessa Program Location Counter e direttiva ORG

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Arduino: Programmazione

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Struttura a record. File ad accesso diretto. Modalità di apertura. Modalità di apertura

Connessione ad internet

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Le stringhe. Le stringhe

Convertitori numerici in Excel

Corso di Informatica

Codifica: dal diagramma a blocchi al linguaggio C++

Le variabili. Olga Scotti

La selezione binaria

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Le funzioni. Funzioni. Funzioni. Funzioni. Funzioni. Funzioni

FUNZIONI. La libreria standard del C fornisce una ricca collezione di funzioni, come le funzioni:

INFORMATICA - I puntatori Roberta Gerboni

Sistema operativo: Gestione della memoria

Gestione delle stringhe in C

Il memory manager. Gestione della memoria centrale

Cos è una stringa (1) Stringhe. Leggere e scrivere stringhe (1) Cos è una stringa (2) DD Cap. 8 pp KP Cap. 6 pp

INFORMATICA 1 L. Mezzalira

GESTIONE INFORMATICA DEI DATI AZIENDALI

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Sottoprogrammi: astrazione procedurale

I file di dati. Unità didattica D1 1


Puntatori Passaggio di parametri per indirizzo

Esercizio 1. Esercizio 1

Lezione 9: Strutture e allocazione dinamica della memoria

La struttura dati ad albero binario

Informatica Medica C++ Informatica Medica I semestre Docenti: Fabio Solari e Manuela Chessa. Sviluppo di un applicazione eseguibile

Politecnico di Torino

Linguaggio C - Stringhe

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Fondamenti di Informatica T. Linguaggio C: File

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

Parte 1. Vettori di bit - AA. 2012/13 1.1

Esercizio: gestione di un conto corrente

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO XI.2015

Grammatica di base: Pointers

VARIABILI LOCALI E GLOBALI (ESTERNE)

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Struttura di un programma Java

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Aritmetica dei Calcolatori 2

Makefile. Un target in generale e' un file. Usando.PHONY: target specifichiamo a make che il target non e' un file

MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Il tipo di dato astratto Pila

Generalizzazione di funzioni e di classi. Macro come funzioni generiche

Transcript:

puntatori Lab. Calc. AA 2007/08 1

parametri delle funzioni (dalla lezione scorsa) gli argomenti in C vengono passati by value dalla funzione chiamante alla funzione chiamata la lista degli argomenti viene vista come una lista di espressioni valutate al momento della chiamata, convertite nei tipi dichiarati nel prototipo. I valori risultanti vengono passati come input alla funzione chiamata la funzione chiamata ha quindi accesso ai valori dei parametri di ingresso, che vengono copiati in un'altra area di memoria, e non ai loro indirizzi (passaggio by reference). Lab. Calc. AA 2007/08 2

parametri delle funzioni NB non esiste alcun legame tra i nomi delle variabili usati nella definizione della funzione (parametri formali) ed i nomi usati nella chiamata alla funzione stessa E' possibile passare dati by reference fornendo alla funzione chiamata la posizione di memoria in cui il dato si trova al momento della chiamata. L'indirizzo verra' passato by value ma permettera' l'accesso by reference al dato in esso contenuto. una funzione ritorna un unico risultato, mediante l'istruzione return. Vedremo che si possono definire dei nuovi tipi (strutture) e ritornare variabili strutturate contenenti un maggior umero di informazioni. Lab. Calc. AA 2007/08 3

Attributi di un oggetto nome o identificatore; tipo; valore (o valori); indirizzo; Lab. Calc. AA 2007/08 4

Indirizzo Consideriamo la dichiarazione con inizializzazione: int numero=10; Questa definisce una variabile con attributi identificatore: numero tipo: int valore: 10 indirizzo: &numero, noto solo dopo che il codice compilato sia stato caricato in memoria Lab. Calc. AA 2007/08 5

Puntatori I puntatori sono variabili di tipo int usate per memorizzare gli indirizzi di altre variabili o strutture dati (che possono essere a loro volta interi ma anche char, double...). I puntatori vengono utilizzati per velocizzare l'accesso ai dati in memoria (ad esempio la gestione di array di grandi dimensioni) per allocare e liberare memoria durante la fase di esecuzione del programma, ovvero dinamicamente per condividere informazioni tra diversi blocchi (funzioni) di un programma senza duplicare in memoria strutture dati di grandi dimensioni. Lab. Calc. AA 2007/08 6

Dichiarazione di un puntatore E' necessario specificare il tipo cui punta la variabile puntatore. Un puntatore p_int ad una locazione di memoria contenente una variabile intera si definisce con: int *p_int; Un puntatore p_double ad una locazione di memoria contenente una variabile double si definisce con: double *p_double; etc... La posizione di * è irrilevante, posso scrivere anche tipo * p; tipo* p; attenzione: finche' non viene inizializzato ad un indirizzo valido il puntatore non deve essere usato! Lab. Calc. AA 2007/08 7

Uso dei puntatori int numero; /* il compilatore riserva spazio in memoria per un intero ad un certo indirizzo, ad esempio 0x09050 */ numero = 82485; /* un intero a 32 bit che in binario si scrive 00000000 00000001 01000010 00110101 */ int *puntatore; /* puntatore ad un oggetto intero non precisato */ puntatore = &numero; /* puntatore a numero (posto uguale all'indirizzo di numero) mediante l'operatore unario di indirizzamento & */ printf( %p\n,puntatore); /* stampa il contenuto di puntatore in formato esadecimale, ovvero l'indirizzo di numero */ Lab. Calc. AA 2007/08 8

. 0x09053 0x09050 00110101 01000010 00000001 00000000 numero 01010000 10010000 puntatore.. Lab. Calc. AA 2007/08 9

se ora poniamo numero=0; e stampiamo nuovamente il valore di puntatore questo non sara' cambiato. Per accedere o modificare il valore della variabile puntata si utilizza l'operatore unario di indirezione *: *puntatore=0; e' equivalente a numero=0; Porre una variabile uguale a *puntatore o a numero fornisce lo stesso risultato. Lab. Calc. AA 2007/08 10

. 0x09053 0x09050 00000000 00000000 00000000 00000000 numero 01010000 10010000 puntatore.. Lab. Calc. AA 2007/08 11

printf/scanf ora che sappiamo che &v rappresenta l'indirizzo di memoria della variabile v possiamo notare che printf deve solo leggere il valore della variabile e mandarla in stampa, gli basta conoscerne l'identificatore v scanf deve poter modificare il contenuto di una locazione di memoria per caricarvi il dato immesso da tastiera, ha bisogno di conoscerne l'indirizzo &v Lab. Calc. AA 2007/08 12

Vettori e puntatori In C il nome di un array e' proprio il puntatore all'indirizzo di memoria che contiene il primo elemento dell'array stesso. int a[25]; double x[25]; char ch[25]; a è un puntatore a interi x è un puntatore a double ch è un puntatore a char mentre a[0], x[5] o ch[10] sono rispettivamente un intero, un double ed un char. Lab. Calc. AA 2007/08 13

Poiche' gli elementi di un array occupano locazioni di memoria consecutive, le dichiarazioni char st[] = "A string"; char *st="a string"; sono equivalenti. Infatti: st[0] ha valore 'A', *st ha valore 'A' st[7] ha valore 'g', *(st+7) ha valore 'g' st[8] ha valore '\0', *(st+8) ha valore '\0' se proviamo a stampare i valori dei puntatori st e st+1 troviamo due indirizzi che distano tra loro 1 byte: infatti i char occupano 8 bit. In un vettore di int i gli indirizzi distano 4 byte, in un vettore di double distano 8 byte... Lab. Calc. AA 2007/08 14

Indirizzamento &st[0] è l'indirizzo di st[0], ovvero è la stessa cosa di st &st[1] è l'indirizzo di st[1], ovvero la voce successiva a quella cui punta st, è la stessa cosa di st + 1 &st[k] è la stessa cosa di st + k per ogni k valido Lab. Calc. AA 2007/08 15

Inizializzazione Sappiamo di poter dimensionare e inizializzare un vettore di numeri con la dichiarazione int list[] = {2,3,4,5}; Va però osservato che non è possibile farlo mediante l'istruzione int * plist ={2,3,4,5}; Infatti plist è un puntatore all'indirizzo da cui si iniziano a memorizzare uno o più numeri interi (nel nostro caso 2,3,4 e 5) e non un vettore di interi! list[3] è equivalente a *(plist+3) Lab. Calc. AA 2007/08 16

esempi e errori (Q6.1 del testo Barone et al.) int a; double b, *pd; pd=&a; questo codice produce un errore di compilazione: cannot convert 'int*' to 'double*' in assignment double b, c, *pd; b=3.14; c=&(*pd); questo codice produce un errore di compilazione: cannot convert 'double*' to 'double' in assignment double b,*pd; pd=&b; *pd=3.14; printf("%lf\n",b); questo codice funziona e stampa 3.140000 Lab. Calc. AA 2007/08 17

double b, c,*pd; b=3.14; pd=&c; *pd=&b; questo codice produce un errore di compilazione: cannot convert 'double*' to 'double' in assignment int a; double b=3.14,*pd; pd=&b; a=*pd; questo codice genera un warning: warning: assignment to `int' from `double' double b, c,*pd; b=3.14; pd=&c; *pd=b; questo codice funziona e stampa 3.140000 Lab. Calc. AA 2007/08 18

double b, *pd; *pd=3.14; b=*pd; printf("%lf\n",b); questo codice funziona e stampa 3.140000 double b, *pd; *pd=3.14; &b=pd; questo codice produce un errore di compilazione: non lvalue in assignment &b non e' una variabile cui si possa assegnare un valore (lvalue) ma un indirizzo definito dal sistema int a; a=&2; questo codice produce un errore di compilazione: non lvalue in unary `&' ovvero non si puo' applicare l'operatore unario di indirizzamento & ad un argomento che non sia una variabile (lvalue = valore che puo' trovarsi a sinistra del segno = in un'assegnazione) Lab. Calc. AA 2007/08 19

I/O da file (C) Per file formattati si usano fprintf e fscanf, come nel seguente esempio (6.11 del testo): #include <stdio.h> #include <stdlib.h> #define LEN 100 main () { FILE * fp; int i, k; double x, data[len]; if ((fp = fopen("random.dat", "w")) == NULL ) { printf("errore nell'apertura del file random.dat\n"); exit(exit_failure); } for (i = 1; i <= LEN; i++) { x = (double)rand() / (double)rand_max; fprintf(fp, "%d %f\n", i, x); } fclose(fp); Lab. Calc. AA 2007/08 20

} fp = fopen("random.dat", "r+"); for (i = 1; i <= LEN; i++) { fscanf(fp, "%d %lf", &k, &x); *(data + LEN k) = x; } fprintf(fp, "\n INVERSIONE \n"); for (i = 1; i <= LEN; i++) { fprintf(fp, "%d %f\n", i, *(data + i 1)); } fclose(fp); per file binari (da aprire con fopen e le opzioni wb o rb ) si usano invece le funzioni fwrite e fread che agiscono copiando una sequenza di locazioni di memoria (vedere testo per maggiori dettagli). Lab. Calc. AA 2007/08 21

I/O da file (C++) #include <fstream> // oggetti C++ per I/O da file main(){ double a; // dichiarazione e inizializzazione dell'oggetto // input per leggere da pippo.dat std::ifstream input("pippo.dat"); // dichiarazione e inizializzazione dell'oggetto // output per scrivere su pippo2.dat std::ofstream output("pippo2.dat"); // input e output si usano come cin e cout input >> a; output << a; } Lab. Calc. AA 2007/08 22

prenotazione dinamica della memoria (testo par. 10.2.2) la memoria riservata puo' essere riservata staticamente: in fase di compilazione dinamicamente: in fase di esecuzione del programma vantaggi dell'allocazione dinamica scelta della dimensione degli array in fase di esecuzione lo spazio riservato non si libera automaticamente svantaggi lentezza responsabilita' del programmatore nel verificare che la memoria richiesta sia effettivamente disponibile nel liberare la memoria non piu' necessaria Lab. Calc. AA 2007/08 23

sintassi void *malloc(size_t n); restituisce un puntatore a n byte di spazio di memoria on inizializzato oppure NULL se lo spazio non e' disponibile il puntatore e' a un void (nessun tipo) e non puo' essere usato se non si specifica il tipo di dati che vogliamo salvare nella memoria riservata mediante un cast esplicito float *xfloat; xfloat = (float *)malloc(100*sizeof(float)); nota: size_t e' un tipo di intero senza segno definito in <stdef.h> Lab. Calc. AA 2007/08 24

sintassi per inizializzare a zero la memoria riservata usare calloc invece di malloc xfloat = (float *)calloc(100, sizeof(float)); per liberare la memoria usare la funzione free con argomento il puntatore all'area di memoria interessata free(xfloat); per ampliare uno spazio di memoria gia' riservato (ottenendo delle locazioni contigue alle precedenti fino al raggiungimento di n byte) xfloat2=realloc(xfloat, n); attenzione, in questo caso la memoria aggiuntiva non e' inizializzata a 0 Lab. Calc. AA 2007/08 25

Regole Il programma deve contenere una chiamata alla funzione free per ogni puntatore inizializzato ad aree di memoria ottenute dinamicamente. free va chiamata alla fine del blocco di codice che ha allocato la memoria, in un punto ben visibile, per essere sicuri di non utilizzare più quel puntatore. Lab. Calc. AA 2007/08 26