DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Puntatori. Marco D. Santambrogio Ver. aggiornata al 4 Aprile 2013

Documenti analoghi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Puntatori. Marco D. Santambrogio Ver. aggiornata al 11 Marzo 2014

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Puntatori. Marco D. Santambrogio Ver. aggiornata al 20 Aprile 2016

Linguaggio C: puntatori

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Linguaggio C: PUNTATORI

Ottenere una modifica del parametro attuale

Introduzione al C Lez. 3. Puntatori

Introduzione al linguaggio C Puntatori

Introduzione al linguaggio C Puntatori

Parametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

C: panoramica. Violetta Lonati

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Funzioni e Procedure. Marco D. Santambrogio Ver. aggiornata al 11 Marzo 2014

Introduzione al linguaggio C Puntatori

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Il linguaggio C. Puntatori e dintorni

Informatica ed Elementi di Informatica Medica

Puntatori in C. Fondamenti di Informatica. Daniele Loiacono

Stringhe e tipi di dati strutturati

Le funzioni: la dichiarazione

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

Prof. G. Ascia. I puntatori. Fondamenti di Informatica

Indirizzi e tipi puntatore a

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Array e stringhe. Marco D. Santambrogio Ver. aggiornata al 6 Aprile 2016

Array n-dimensionali e tipi di dati strutturati

Corso di Programmazione I

Strutture, Unioni, Enumerazioni in C. Emilio Di Giacomo

Associazione Variabile-Indirizzo

Fondamenti di Informatica 12. Linguaggio C -4

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Funzioni e Procedure. Marco D. Santambrogio Ver. aggiornata al 21 Marzo 2014

PROGRAMMAZIONE AVANZATA JAVA E C

Il linguaggio C funzioni e puntatori

Programmazione C. Puntatori Array come puntatori

Introduzione al C. Lez. 2. Funzioni e Puntatori

Aritmetica dei puntatori

C++ funzioni Alberto Ferrari. Alberto Ferrari Programmazione di applicazioni SW

Esercizi. La funzione swapint() primo tentativo

Passaggio dei parametri

Array. Unità 7. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Tutorato Elementi di Informatica 2018

Fondamenti di Informatica

Capitolo 10 - Strutture

Introduzione al C. Lez. 2 Funzioni e Puntatori

POINTERS. Una variabile pointer è una variabile che ha come valore un indirizzo di memoria.

Array n-dimensionali e tipi di dati strutturati

Puntatori : idea di base

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Puntatori. Fondamenti di Programmazione

in alternativa Quanto spazio occupa in memoria una variabile di tipo struct? dipende...

Indirizzi e puntatori

Passaggio dei parametri. Passaggio dei parametri

Corso di Informatica A.A

Verso i puntatori: Cosa è una variabile?

Il passaggio parametri per indirizzo

Laboratorio di Informatica I

Fondamenti di Informatica Ing. Biomedica

parametri attuali ricopiati parametri formali

Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei paramet

Elementi di Informatica

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Puntatori (in C) Emilio Di Giacomo

Lezione 6: Array e puntatori

Laboratorio di programmazione

Esercitazione di Reti degli elaboratori

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

cout << "Inserisci un numero:" << endl; cin >> n; ris = n*2; cout << "Il doppio di " << n << " e " << ris << endl;

ARRAY DI PUNTATORI. ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori

Puntatori e array. Violetta Lonati

Corso di Informatica A.A

Il costruttore struct

Introduzione ai puntatori in C Definizione

Linguaggio C - sezione dichiarativa: costanti e variabili

Linguaggio C I puntatori

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Recap sul C. Marco D. Santambrogio Ver. aggiornata al 11 Aprile 2013

Lezione 8. Sottoprogrammi

Lezione 12: Allocazione Dinamica della Memoria

Puntatore. Ritorniamo sul problema dell accesso alle variabili

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

Gli Array. Dichiarazione di un array

Mini-dispensa sui puntatori in C

Fondamenti di Programmazione

Puntatori : idea di base

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

INFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 4 Dott. Michele Zanella Ing. Gian Enrico Conti

Array k-dimensionali

Qualsiasi programma in C++ segue lo schema: Variabili

Le funzioni. Funzioni. Funzioni. Funzioni

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 19 14/04/2014

PUNTATORI. Introduzione. puntatore. L operatore

Programmazione I - Laboratorio

Informatica (A-K) 14. Linguaggio C -4

Puntatori in C Lucidi della Pof.ssa Pazienza

Laboratorio di Informatica

Transcript:

Puntatori Marco D. Santambrogio marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 201

WAT? WAT Lab Troppi exe, ne volevo di meno Vacanze W A Giovedì 28, Venerdì 29 e Lunedì 1 ma anche Martedì 2 e Mercoledì T Homework @ DEIB Giovedì 4 Aprile dalle 5.0pm alle 7.0pm 2

Immagini Struttura dati: typedef struct{ int R; int G; int B; } pixel pixel img[0][24]; Ma quanto è grossa immagine? pixel=(int*) img= pixel*0*24 1 immagine= 2160 interi

Manipoliamo immagine Problema: mettiamo a 0, tutti i pixel con rosso minore di 50 (soglia) void TagliaRossi(pixel immagine[0][24], int soglia); Se volessimo scrivere una funzione che risolve il problema dato? Cosa ritorna? NB: una immagine è un insieme di pixel, non un solo dato! Quali sono i parametri di ingresso? 4

RICORDIAMO: passaggio per valore Ambiente della funzione somma d1, d2 risultato } /* nel main */ float valore1, valore2; float risultato; Quando invoco la funzione in d1 e d2 vengono copiati i valori di valore1 e valore 2 valore1, valore2 Quando la funzione termina il valore di risultato in somma viene copiato il risultato nel main risultato risultato=somma(valore1,valore2); Ambiente della funzione main 5

Quindi. void TagliaRossi(pixel immagine[0][24], int soglia); /* nel main */ pixel img[0][24]; int val_soglia; Ambiente della funzione TagliaRossi TagliaRossi(img[0][24], val_soglia); immagine[0][24] soglia Quando invoco la funzione in immagine[0][24] vengono copiati i valori di img[0][24] Perchè? Spreco di memoria: 2160 interi *2 array1=array2 : VIETATO in C img[0][24] val_soglia Ambiente della funzione main 6

Cosa ci piacerebbe? Avere una sola copia del dato Non vogliamo sprecare spazio Poter accedere a quella copia in maniera sicura Non vogliamo usare variabili globali! Sarebbe troppo alto il rischio di commettere errori! Invece che per copia, ci piacerebbe accedere tramite indirizzo 7

E quindi (veramente) Sapendo dove si trova il primo punto aka: indirizzo primo pixel img[0][0] pixel img[0][24]; Con le dimensione della matrice: Righe: 0 Colonne: 24 Possiamo arrivare ad ogni punto (r,c)!!! Indirizzo di img[0][0] + r*colonne + c &img[0][0] + r*colonne + c 8

Obiettivi Puntatori 9

Variabili e indirizzi int var; &var 2 var 1 0 Supponiamo che la dichiarazione riservi la zona di memoria all indirizzo 1 var indica il contenuto della cella di memoria &var indica l indirizzo della cella di memoria 10

11 Puntatori premessa Dichiarare una variabile significa riservare una zona di memoria composta da diverse celle Il numero di celle dipende dal tipo di dato Ogni cella di memoria ha un indirizzo fisico e: il nome della variabile indica il contenuto della cella di memoria l operatore & permette di ottenere l indirizzo di memoria della cella associata alla variabile cui l operatore è applicato

12 Puntatore È un tipo di dato che ammette tra i suoi valori un indirizzo di memoria La zona di memoria viene detta puntata dalla variabile puntatore La variabile puntatore viene detto che punta ad una cella di memoria Quando dichiaro un puntatore si deve anche specificare che tipo di dato viene ospitato nella cella puntata Sintassi: int *p;

1 Significato int *p; &p 2 1 p 0 p è una variabile come tutte le altre quindi p indica il contenuto della cella di memoria &p indica l indirizzo di memoria Quello che caratterizza una variabile di tipo puntatore è il fatto che il suo valore è esso stesso un indirizzo di memoria

14 Deferenziazione Ad una variabile di tipo puntatore posso applicare l operatore di deferenziazione * *p indica il contenuto della cella puntata da p Se p è un puntatore ad un intero allora *p è una semplice variabile intera int *p; *p=5; /* OK. *p è un intero */ p=5; /* errore. p è un puntatore */ Attenzione! Il simbolo * lo uso sia nella dichiarazione che nella deferenziazione

15 Operazioni A una variabile di tipo puntatore posso assegnare un indirizzo di memoria int x; int *p; &p &x x=5; p=&x; /* *p vale 5 */ 2 1 0 1 5 p x p punterà alla zona di memoria in cui è memorizzato il valore di x Ad una variabile puntatore non viene mai assegnato una costante

Pointer Fun with Binky This is document 104 in the Stanford CS Education Library. Please see http://cslibrary.stanford.edu/ for this and other free educational materials. Copyright Nick Parlante 1999. 16

17 Passaggio per INDIRIZZO All atto della chiamata l indirizzo dei parametri attuali viene associato ai parametri formali il parametro attuale e il parametro formale si riferiscono alla stessa cella di memoria Il sottoprogramma in esecuzione lavora nel suo ambiente sui parametri formali (e di conseguenza anche sui parametri attuali) ogni modifica sul parametro formale è una modifica del corrispondente parametro attuale Gli effetti del sottoprogramma si manifestano nel chiamante con modifiche al suo ambiente locale di esecuzione

Passaggio parametri per indirizzo 18 Si utilizza: il costruttore di tipo puntatore per la definizione dei parametri formali della funzione float circonferenza(float *raggio) l operatore di dereferenziazione all interno della funzione circ = *raggio *.14; alla chiamata della funzione, si passa un indirizzo di variabile come parametro attuale c=circonferenza(&r); Attenzione! Gli array sono SEMPRE passati per indirizzo. Una variabile di tipo array, infatti, è per definizione un puntatore

19 Esempio: passaggio per indirizzo float circonferenza(float *raggio) { float circ; circ = *raggio *.14; *raggio = 7; /*istruzione senza senso, voglio solo vedere cosa succede modificando il valore di un paramentro formale*/ return circ; } /* nel main */ float c,r=5; Ambiente della funzione circonferenza raggio Quando invoco la funzione in raggio viene copiato l indirizzo di r. Quindi *raggio e r sono la stessa cosa circ Quando la funzione termina il valore di circ in circonferenza viene copiato in c nel main c=circonferenza(&r); /*attenzione! D ora in poi r vale 7 */ r c Ambiente della funzione main

20 Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } a b 7 p q 7 temp Nel main: swap(a,b)

21 Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } a b 7 p q 7 temp Nel main: swap(a,b)

22 Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } a b 7 p 7 q 7 temp Nel main: swap(a,b)

2 Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } a b 7 p 7 q temp Nel main: swap(a,b)

24 Esempio: scambio di 2 valori interi void swap (int p, int q) { } int temp; temp = p; p = q; q = temp; Al termine dell esecuzione di swap le variabili nel main restano inalterate! Nel main: swap(a,b) a b 7 p 7 q temp

25 Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } a b 7 p q temp Nel main: swap(&a, &b)

26 Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } a b 7 p q temp Nel main: swap(&a, &b)

27 Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } a 7 b 7 p q temp Nel main: swap(&a, &b)

28 Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } a 7 b p q temp Nel main: swap(&a, &b)

29 Esempio: scambio di 2 valori interi void swap (int *p, int *q){ } int temp; temp = *p; *p = *q; *q = temp; Al termine dell esecuzione di swap le variabili nel main vengono modificate a 7 Nel main: swap(&a, &b) b p q temp

scanf: stringhe Vs char 0

Parametri di tipo array Per usare in una funzione una variabile di tipo array occorre passare il suo indirizzo di base, perciò di fatto l array è passato per locazione (indirizzo) Una funzione C non restituirà un array (come contenuto), ma solo un puntatore a un array (cioè il suo nome come suo indirizzo)!! 1

Somma degli elementi di un array di int 2

Somma degli elementi di un array di int: funzioni

Somma degli elementi di un array di int: funzioni con int *valori 4

Parametri di tipo array Due testate equivalenti: double mul(double *a, int n) double mul(double a[], int n) N.B.: non c è la dimensione, e n è la porzione occupata dell'array Supponiamo di avere un array V[50]. Possibili chiamate: mul(v,50) restituisce V[0]*V[1]* V[49] mul(v,0) restituisce V[0]*V[1]* V[29] mul(&v[5],7) restituisce V[5]*V[6]* V[11] mul(v+5,7) restituisce V[5]*V[6]* V[11] 5

Fonti per lo studio + Credits Fonti per lo studio Binky Pointer Fun Video: http://cslibrary.stanford.edu/104/ Credits Gianluca Palermo 6