DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Puntatori Linguaggio C.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array, matrici Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
Puntatori in C e C++.
Array multidimensionali
Procedure e funzioni A. Ferrari.
PUNTATORI Introduzione
Un nuovo tipo di dati Gli array.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Funzioni definite dall’utente
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 4 Aprile 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Process synchronization
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 15 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Tipi di dati strutturati Marco D. Santambrogio – Ver. aggiornata al 4 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 18 Aprile 2012.
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
memoria gestita staticamente:
A.A. 2010/2011Ambienti di Programmazione per il Software di Base1 (Es. – 6) Ambienti di Programmazione per il Software di Base Le Stringhe in C Input.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Le funzioni.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Unità Didattica 3 Linguaggio C
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
2000 Prentice Hall, Inc. All rights reserved. Attivazione di funzioni La chiamata/attivazione di funzione viene indicata citando il nome della funzione.
Complessità di un algoritmo
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 4: 10 Aprile 2014 Marco D. Santambrogio – Gianluca Durelli –
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 3 Aprile 2015.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
1 Il linguaggio C Puntatori e dintorni. 2 Puntatori : idea di base In C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 4: 7 Aprile 2014 Marco D. Santambrogio – Gianluca Durelli –
Algoritmi e basi del C Struttura di un programma
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA Lab 2: 20 Aprile 2015 Marco D. Santambrogio – Gianluca Durelli –
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
Algoritmi e basi del C Struttura di un programma
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 L Aprile 2015 Marco D. Santambrogio – Gianluca Durelli -
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 26 Marzo 2014.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Il linguaggio C Puntatori e dintorni.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 3 L Aprile 2015 Marco D. Santambrogio – Gianluca Durelli -
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2014.
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA Lab 3: 27 Aprile 2015 Marco D. Santambrogio – Gianluca Durelli –
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 5: 14 Aprile 2014 Marco D. Santambrogio – Gianluca Durelli –
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array n-dimensionali e tipi di dati strutturati Marco D. Santambrogio – Ver. aggiornata.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 4 Aprile 2016.
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Process synchronization
Process synchronization
Process synchronization
Process synchronization
Process synchronization
Transcript della presentazione:

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Logistica… 1ma prova 22 Aprile  NECST Lab 24 Aprile  CG1 2

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Fine corso… 26 Giugno 2015 Visita al Centro di Supercomputing Svizzero (CSCS) 3

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEImmagini 4 typedef struct{ int R; int G; int B; } pixel pixel img[30][24]; Struttura dati: Ma quanto è grossa immagine? pixel=(int*3) img= pixel*30*24 1 immagine= 2160 interi

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Manipoliamo immagine Problema: mettiamo a 0, tutti i pixel con rosso minore di 50 (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? 5 void TagliaRossi(pixel immagine[30][24], int soglia);

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

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

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 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 8

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

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEObiettivi Puntatori 10

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Variabili e indirizzi 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 11 int var; var &var

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 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

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEPuntatore È 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; 13

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONESignificato 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 int *p; p &p

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEDeferenziazione 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

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEOperazioni A una variabile di tipo puntatore posso assegnare un indirizzo di memoria int x; int *p; x=5; p=&x; /* *p vale 5 */ p punterà alla zona di memoria in cui è memorizzato il valore di x Ad una variabile puntatore non viene mai assegnato una costante x &p &x p

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Pointer Fun with Binky 17 This is document 104 in the Stanford CS Education Library. Please see for this and other free educational materials. Copyright Nick Parlante 1999.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 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 18

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: passaggio per indirizzo float circonferenza(float *raggio) { float circ; circ = *raggio * 3.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; c=circonferenza(&r); /*attenzione! D’ora in poi r vale 7 */ 19 Ambiente della funzione circonferenza raggio circ Ambiente della funzione main r c Quando invoco la funzione in raggio viene copiato l’indirizzo di r. Quindi *raggio e r sono la stessa cosa Quando la funzione termina il valore di circ in circonferenza viene copiato in c nel main

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio valori Si scriva una funzione in C che, dati due valori interi, gli restituisce scambiati 20

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

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

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 23 a b 3 7 p q temp 7 7 3

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 24 a b 3 7 p q temp 7 3 3

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 25 a b 3 7 p q temp Al termine dell’esecuzione di swap le variabili nel main restano inalterate!

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

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

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

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) 29 a b 7 3 p q temp 3

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

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Particolarità delle stringhe Il nome dell’array rappresenta l’indirizzo del suo primo elemento, perciò quando ci si vuole riferire all’intero array nella scanf non si mette il simbolo &! scanf("%s", stringa); Questa scanf legge in input i caratteri fino a quando trova il carattere “ blank ” (lo spazio), o l’invio  NOTA: se nel buffer si trova una stringa “troppo lunga”, essa è memorizzata oltre la fine dell ’ array !!! Ed è un errore grave !!! Attenzione! Gli array (TUTTI) sono sempre passati per indirizzo. Una variabile di tipo array, infatti, è per definizione un puntatore 31

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: copia stringhe Si scriva un programma in C che, data una stringa, la copia in una seconda stringa 32

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: dati e inserimento 33

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: dati e inserimento 34

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: dati e inserimento 35 Attenzione! Gli array (TUTTI) sono sempre passati per indirizzo. Una variabile di tipo array, infatti, è per definizione un puntatore

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: dati e inserimento 36 #define DIM 5 […] char stringa1[DIM];

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: lunghezza 37

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: lunghezza 38

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: lunghezza v2 39

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: copia elementi 40

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: copia elementi 41

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: tutto insieme 42

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E se usassimo le librerie? 43

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: copia stringhe 44

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Ecco perché string.h!!! 45

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: copia stringhe 46

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 47 char str1[32]; /  str1 ha spazio per 32 char.  / char str2[64]; /  str2 ha spazio per 64 char.  / /  inizializza str1 con la stringa "alfa"  / strcpy(str1, "alfa"); /  str1 contiene "alfa"  / /  copia str1 in str2  / strcpy(str2, str1); /  str2 contiene "alfa"  / /  lunghezza di str1  / x = strlen(str1); /  x assume valore 4  / /  scrivi str1 su standard output  / printf("%s", str1); /  scrive str1 su stdout  / /  leggi str1 da standard input  / scanf("%s", str1); /  str1 “ riceve ” da stdin  / Operazioni su stringhe

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 48 char str1[32]; char str2[64]; scanf("%s", str1); > ciao  /  ora str1 contiene "ciao"  / strcpy(str2, str1);/  str2 riceve "ciao"  / val = strlen(str2); /  val = 4  / printf("%s\n", str2); > ciao/  stampa "ciao"  / Attenzione: strlen("") vale 0 ! Operazioni su stringhe

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Fonti per lo studio + Credits Fonti per lo studio  Binky Pointer Fun Video: Credits  Gianluca Palermo 49