Unità Didattica 3 Linguaggio C

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Introduzione al linguaggio C++
Puntatori e gestione dinamica della RAM
Uso avanzato di C.
Puntatori in C e C++.
Array multidimensionali
PUNTATORI Introduzione
Introduzione al linguaggio C
INFORMATICA Strutture iterative
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Caratteri e stringhe di caratteri
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Ambito delle variabili
Funzioni definite dall’utente
Corso di Fondamenti di programmazione a.a.2009/2010
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
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 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 Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Process synchronization
Allocazione dinamica della memoria
Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione III Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione V Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione VII: puntatori 3/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
nome: sequenza di caratteri usata per denotare un oggetto
memoria gestita staticamente:
1 Strutture Dinamiche Corso di Informatica A Vito Perrone.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Dichiarazioni e tipi predefiniti nel linguaggio C
I File.
Le funzioni.
Espressioni condizionali
Fondamenti di informatica Linguaggio C Main Program: Architettura di un PC Diagrammi di flusso Linguaggio C.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 6 (Deitel) I vettori Sommario Introduzione Vettori Dichiarazione di vettori 6.4.
Programmazione di Calcolatori
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
CODIFICA Da flow-chart a C++.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.
Passaggio di parametri per indirizzo
Programmazione di Calcolatori
C. Gaibisso Programmazione di Calcolatori Lezione XVI Allocazione dinamica della memoria Programmazione di Calcolatori: allocazione dinamica della memoria.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 7 (Deitel) I puntatori Sommario Introduzione Dichiarare e inizializzare i puntatori.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Approfondimenti sulle Classi.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Puntatori e Stringhe.
Il linguaggio C Puntatori e dintorni.
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.
1. 2 Variabili statiche e dinamiche Un programma è un processo in esecuzione a cui il sistema operativo assegna una certa zona di memoria. Tale zona può.
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
Vettori (a una dimensione)
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 Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Operatori di incremento e decremento
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.
Puntatori in C Un puntatore è una variabile che contiene un indirizzo di memoria. Quando una variabile contiene l’indirizzo di un’altra variabile, si dice.
30/10/01Array 1  Un array e’ una struttura dati che contiene piu’ valori del medesimo tipo.  La lunghezza di un array e’ stabilita quando l’array viene.
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Transcript della presentazione:

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

Vettori Struttura astratta: Struttura concreta in C: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice; Struttura concreta in C: Struttura di elementi dello stesso nome e tipo, allocati in locazioni di memoria contigue; Nella loro definizione statica hanno la medesima dimensione per tutta l’esecuzione del programma; Per fare riferimento ad un elemento si specifica: Nome del vettore; Numero di posizione all’interno del vettore stesso;

Dichiarazione e accesso ad un vettore Dichiarazione: tipo nomeVettore[dimensione]; Es: int a[10]; La dichiarazione di variabili vettoriali segue le stesse regole di scope e di ciclo di vita delle variabili scalari; Gli elementi sono inizializzati a 0 se il vettore è globale, non sono inizializzati se è locale; Dichiarazione e inizializzazione contestuali: Es: int b[] = {7, 3, -2}; Accesso: Dato un vettore v di n elementi, il primo elemento di v ha indice 0, gli altri elementi hanno indici interi crescenti: V[0], v[1], …, v[n-1]

Esempio di uso di vettori: Somma elementi di un vettore #include <stdio.h> #include <stdlib.h> void main(void) { float v[]={3.2,4.3,-7.8,5,-3.14}; int i; float somma = 0; for (i = 0; i < 5; i++) somma = somma + v[i]; printf("somma %f\n", somma); }

Vettori multidimensionali Struttura dati di elementi individuati da più indici (per es. un vettore bidimensionale: struttura dati a 2 indici, matrice); Dichiarazione: float a[2][3]; Esempio di inizializzazioni: float a[][] ={{-1.2, 3, 0},{7, -2.3, 8}}; oppure: for (i = 0; i < 2; i++) for(j = 0; j < 3; j++) scanf(“%f”, &(a[i][j]));

Vettori bidimensionali In C un vettore bidimensionale è un vettore ad una dimensione in cui ogni elemento è un vettore; float a[2][3]; a[0] a[0][0] a[0][1] a[0][2] a[1] a[1][0] a[1][1] a[1][2] Accesso agli elementi (visualizzazione per righe): for (i = 0; i < 2; i++) { for(j = 0; j < 3; j++) printf(“%2.3f ”, a[i][j]); printf(“\n”); }

Puntatori Un puntatore è una variabile che contiene l’indirizzo di un’altra variabile; A differenza delle variabili normali, che contengono valori di un insieme numerico, le variabili puntatore contengono indirizzi (riferimenti) a variabili contenenti dati; Sono utilizzati per: Passaggio di parametri per indirizzo alle funzioni; Riferimento a strutture dati.

Dichiarazione di puntatori Viene utilizzato il carattere * Es: int *p; dichiara una variabile puntatore, di nome p, ad una variabile di tipo int (si legge da destra a sinistra); Dichiarazioni multiple: è sufficiente usare un * prima della dichiarazione di ogni variabile; Es: int *a, *b; E’ possibile dichiarare puntatori a qualsiasi tipo di dato; E’ possibile inizializzare i puntatori ad un indirizzo oppure a NULL.

Operatori unari “&” e “*” & (operatore indirizzo): applicato ad una variabile, restituisce l’indirizzo della variabile Es: int y = 5; int *p; p = &y; /*assegna a p l’indirizzo di y,“p punta ad y”*/ * (operatore indirezione): applicato ad un puntatore, restituisce il contenuto della variabile da esso puntata Es: int z; z = *p; p 5 y p 5 y 5 z = *p

Vettori e Puntatori Il nome di un vettore è una costante e rappresenta l’indirizzo della prima cella di memoria del vettore stesso; int a[8]; a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a Tale indirizzo può essere assegnato ad una variabile puntatore, poiché essa può contenere un indirizzo; int *p; p = a; a a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] p

Aritmetica dei Puntatori int a[10], *p, x, y; x = 1; p = &x; //p punta a x y = *p; //y vale 1 *p = 0; //x viene posto a 0 p = &a[0]; //p punta ad a[0] p = &a[1]; //p punta ad a[1] *p = *p + 10; //si somma 10 al contenuto di ciò che è //puntato da p (*p)++; //Corrisponde a (++*p) incremento di 1 //del contenuto di ciò che è puntato da p p = a; //p punta ad a[0] *(p+5); //Corrisponde a a[5] se p punta ad a

Aritmetica dei Puntatori int b[2][3]; int *p; p = b+1; //In p c’e’ l’indirizzo della riga di indice 1 *(p+2); //Visualiz contenuto elem b[1][2]

Passaggio di parametri alle funzioni: Passaggio per indirizzo In C i parametri sono passati solo per valore; Se il valore passato è un indirizzo si ottiene il passaggio di parametri per indirizzo; Il passaggio per indirizzo consente alla funzione di operare sulla stessa locazione di memoria del parametro che le viene passato al momento della chiamata; Tale modalità consente: di alterare il valore di una variabile anche nella funzione chiamante; di avere un altro modo per la restituire il risultato di una funzione.

Esempio di passaggio parametri: Passaggio per valore #include <stdio.h> void main(void) { int a; a = 5; esempio_funz(a); printf(“%d\n”, a); } void esempio_funz(int b) b = b + 1; Quando il controllo ritorna al main a == 5 5 a 5 b b = b + 1 6 b Al termine della funzione la variabile b scompare

Esempi di passaggio parametri: Passaggio per indirizzo #include <stdio.h> void main(void) { int a; a = 5; esempio_funz(&a); printf(“%d\n”, a); } void esempio_funz(int *b) *b = *b + 1; Quando il controllo ritorna al main: a == 6 5 a b 6 a b *b = *b + 1; Al termine della funzione b scompare

Esempio di passaggio parametri void main(void) { int a=3, b=7; scambia1(a,b); //Al termine di scambia1 a 3 b 7 scambia2(&a,&b); //Al termine di scambia2 a 7 b 3 } void scambia1(int x, int y) int temp; temp = x; x = y; y = temp; void scambia2(int *x, int *y) temp = *x; *x = *y; *y = temp;

Allocazioni statiche e dinamiche Allocare una struttura dati significa riservarle spazio (byte) in memoria centrale; Con l’allocazione statica, il compilatore, al momento della dichiarazione e per tutto il loro ciclo di vita, riserva uno spazio in byte sufficiente a contenere le variabili allocate (scalari o vettoriali) di un determinato tipo; Es: int a; //si riservano byte necessari per un int float v[10]; //byte necessari per 10 float Con l’allocazione dinamica è possibile: Decidere il momento in cui allocare e deallocare la struttura dati; Decidere la quantità di memoria strettamente necessaria da riservare alla struttura dati;

Allocazioni dinamiche Si possono ottenere mediante la funzione di libreria contenuta in <stdlib.h> void *malloc(n° byte della struttura dati da allocare); malloc restituisce l’indirizzo di base della struttura dati allocata; Per ottenere la dimensione in byte della struttura dati da allocare esiste la funzione: n° byte = sizeof(tipo di dato); Per liberare la memoria allocata si usa la funzione: free(puntatore alla struttura dati);

Esempio di allocazione e deallocazione dinamica di un vettore //Alloc. dinamica di un vettore di 10 interi int *v; v = (int *)malloc(10 * sizeof(int)); … //Deallocazione della memoria associata a v free(v);

Passaggio di un vettore ad una funzione Si può ottenere passando alla funzione l’indirizzo della prima locazione di memoria; Es: void main(void) { int a[10]; //Allocazione statica float *v; … v = (float *)malloc(sizeof(float) * 20); //Allocaz. //dinamica funz(a, v); } void funz(int *b, float *w) { //Usando “b” e “w” si accede rispettivamente alle aree //di memoria di “a” e “v”;

Allocazione dinamica di un vettore bidimensionale 2x3 int **a; //“a” è un puntatore ad un puntatore a int int i; a = (int **)malloc(sizeof(int *) * 2); for (i = 0; i < 2; i++) { a[i] = (int *)malloc(sizeof(int) * 3); }

Passaggio di una matrice ad una funzione void main(void) { int a[2][3]; … funz(a); } void funz(int **b) { printf(“%d\n”, b[1][2]); //Visual. contenuto elem. b[1][2]