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



Похожие документы
Funzioni in C. Violetta Lonati

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

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

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

Introduzione al linguaggio C Gli array

INFORMATICA - I puntatori Roberta Gerboni

Allocazione dinamica della memoria - riepilogo

puntatori Lab. Calc. AA 2007/08 1

GESTIONE INFORMATICA DEI DATI AZIENDALI

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

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

Breve riepilogo della puntata precedente:

Concetto di Funzione e Procedura METODI in Java

I puntatori e l allocazione dinamica di memoria

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

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

Le stringhe. Le stringhe

LINGUAGGI DI PROGRAMMAZIONE

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

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Corso di Fondamenti di Informatica

Introduzione al Linguaggio C

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Le variabili. Olga Scotti

Introduzione alla programmazione in C

Puntatori Passaggio di parametri per indirizzo

La gestione della memoria

Corso di Informatica

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

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

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

Laboratorio di programmazione

Fondamenti di Informatica T. Linguaggio C: i puntatori

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

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

Gestione dei File in C

Programmazione in Java Parte I: Fondamenti

La selezione binaria

Variabili e tipi di dato

Struttura di un programma Java

Record in C: il costruttore struct.

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Linguaggio C - Stringhe

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:

RICERCA DI UN ELEMENTO

Funzioni. Il modello console. Interfaccia in modalità console

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

Linguaggio C. Fondamenti. Struttura di un programma.

Appello di Informatica B

costruttori e distruttori

Linguaggio C - Funzioni

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

10 - Programmare con gli Array

Fondamenti di Informatica 2

Inizializzazione, Assegnamento e Distruzione di Classi

Sottoprogrammi: astrazione procedurale

Grammatica di base: Pointers

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

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

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

3) Il seguente numerale A1F0 in base 16 a quale numero in base 10 corrisponde?

La struttura dati ad albero binario

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

LABORATORIO DI SISTEMI

dall argomento argomento della malloc()

Esercizio: gestione di un conto corrente

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

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

VARIABILI LOCALI E GLOBALI (ESTERNE)

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Oggetti Lezione 3. aspetti generali e definizione di classi I

I file di dati. Unità didattica D1 1

Il tipo di dato astratto Pila

Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2006/7. Il trattamento dei dati

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Codifica: dal diagramma a blocchi al linguaggio C++

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

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

Gestione della memoria. Paginazione Segmentazione Segmentazione con paginazione

Elementi di Architettura e Sistemi Operativi

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

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

Richiesta pagina PHP (es: index.php)

Caratteri e stringhe Esercizi risolti

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Appunti sulla Macchina di Turing. Macchina di Turing

Arduino: Programmazione

Esercitazione 7. Procedure e Funzioni

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};

Visibilità dei Membri di una Classe

Sistema operativo: Gestione della memoria

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Architettura dei calcolatori e sistemi operativi. Assemblatore e Collegatore (Linker) Capitolo 2 P&H Appendice 2 P&H

Compito di Fondamenti di Informatica

PROVA INTRACORSO TRACCIA A Pagina 1 di 6


Транскрипт:

Gli array Array e puntatori Laboratorio di Informatica I un array è un insieme di elementi (valori) avente le seguenti caratteristiche: - un array è ordinato: agli elementi dell array è assegnato un ordine (c è un primo elemento, un secondo elemento, e così via - un array è omogeneo: tutti i valori immagazzinati nell array sono dello stesso tipo proprietà di un array: Gli array 1 Tipo degli elementi: tipo dei valori che possono essere immagazzinati nell array 2 Dimensione dell array: numero di elementi che possono essere immagazzinati nell array dichiarazione di un array: - nome dell array - tipo degli elementi - dimensione dell array Esempio: int a[10]; dichiara un array di nome a con 10 elementi di tipo int Gli array Ciascun elemento dell array è identificato da un intero detto indice - gli indici partono da 0 - gli indici di un array di 5 elementi sono: 0,1,2,3,4 0 1 2 3 4 L identificazione di un elemento di un array è detta selezione Per selezionare un elemento di un array bisogna specificare il nome dell array e l indice dell elemento a cui si vuole accedere - Esempio: l espressione a[4] permette di accedere all elemento con indice 4 dell array a extern static auto Classi di memorizzazione per array tutti gli elementi dell array inizializzati per default a zero tutti gli elementi dell array inizializzati per default a zero gli elementi non sono necessariamente inizializzati a zero Inizializzazione esplicita degli array Avviene elencando gli inizializzatori per ciascun elemento esempio: int a[4]= 2, 5, 3, 1; pone a[0]=2, a[1]=5, a[2]=3, a[3]=1 Se gli inizializzatori elencati sono in numero inferiore a quello degli elementi dell array allora i restanti elementi vengono inizializzati a zero esempio: float b[3]=40, 25; pone b[0]=40, b[1]=25, b[2]=0 1

Dimensionamento dell array tramite l inizializzazione Se un array viene dichiarato senza specificarne la dimensione, allora si assume come dimensione il numero dei valori di inizializzazione esempio: int a[ ]= 2, 5, 3, 1; è equivalente a int a[4]= 2, 5, 3, 1; Nel caso di array di caratteri è possibile utilizzare le costanti stringhe come valori di inizialiazzazione esempio: char s[ ]= ciao ; è equivalente a char s[ ]= c, i, a, o, \0 ; (\0 è il marcatore di fine stringa ) Gli array come parametri di funzione Gli array possono essere passati come parametri ad una funzione Ogni array ha un indirizzo di memoria a partire dal quale è memorizzato (indirizzo di base) L indirizzo a partire dal quale è memorizzato un array è specificato dal nome dell array Se ad una funzione viene passato un array come argomento viene passato per valore l indirizzo di base dell array le modifiche effettuate nella funzione sono effettuate sull array e non su una copia I puntatori L operatore * Sono variabili che assumono indirizzi come valori dichiarazione tipica: int *p; p è un puntatore a int e quindi può contenere indirizzi di variabili di tipo int Esempio: int *p; /*p è un puntatore a int*/ int a; /* a p viene assegnato l indirizzo di a */ operatore di indirizzamento indiretto *p; rappresenta il valore della locazione di memoria il cui indirizzo è contenuto in p esempio: int *p; int a=35,b; b= *p; /* assegna a b il valore di a (35) */ ha la stessa priorità e associatività da destra degli altri operatori unari esempio: se q è un puntatore ad una variabile puntatore allora **q è equivalente a *(*q), ovvero rappresenta il valore della variabile il cui indirizzo è nella variabile puntata da q Rappresentazione dei puntatori int *p; int a= 35; La variabile puntatore p è memorizzata a partire dal byte La variabile int a è memorizzata in 2 byte: il primo ha indirizzo e il secondo ha indirizzo La variabile p punta ad a (contiene che è l indirizzo a partire dal quale a è memorizzata) 35 p a Esempio : Inizializzazione in dichiarazioni int i, *p = &i; p è un puntatore ad una variabile di tipo int e il suo valore iniziale è l indirizzo di i Attenzione! *p = &i; inizializza p e non *p i deve essere dichiarata prima di p 2

Assegnamenti a puntatori Assegnamenti illegali I valori assegnabili ad un puntatore includono l indirizzo speciale 0 e un insieme di interi che rappresentano indirizzi della macchina esempi: p = 0; p = NULL; /* stessa cosa di p = 0 ;*/ p = &i; p = (int *) 1123 /* p contiene l indirizzo 1123 */ non tutti i valori vengono memorizzati in locazioni accessibili attraverso i puntatori esempi: p = &5; p = &(k * 10); register int i; p = &i; Alcuni esempi di espressioni con puntatori int i = 3, j = 5, *p = &i, *q = &j, *r; float x; espressione espressione equivalente valore p == &i p == (&i) 1 *&p * (&p) &i **&p * (* (&p) ) 3 r = &x r = (& x) illegale 7 * * p / * q + 7 ( (7 * (*p) )/ (* q) ) + 7 11 Chiamata per indirizzo In altri linguaggi alle funzioni vengono passati gli indirizzi delle variabili passate come argomento in questo modo una funzione modificherà le variabili passate come parametri In C il programmatore può effettuare una chiamata per indirizzo usando come parametri della funzione gli indirizzi delle variabili i parametri devono essere indicati come puntatori esempio di prototipo: double f ( double *p ); esempio di chiamata: f(&p); Esempio di chiamata per indirizzo vogliamo costruire una funzione che scambia il valore di due variabili prima vedremo una soluzione sbagliata che fa uso della chiamata per valore successivamente vedremo la soluzione corretta che fa uso della chiamata per indirizzo una soluzione sbagliata void swap (int, int); int i=3, j=5; swap (i, j); void swap (int a, int b) temp = a; a = b; b = temp; stampa i = 3, j = 5 stampa di nuovo i = 3, j = 5 3

swap (i, j); una soluzione sbagliata Quando swap viene chiamata all interno della funzione main i valori degli argomenti i e j vengono copiati nei parametri formali a e b, rispettivamente void swap (int a, int b) temp = a; a = b; b = temp; La funzione swap scambia i valori di a e b e non quelli di i e j void swap (int *, int *); int i=3, j=5; swap (&i, &j); void swap (int *a, int *b) temp : = *a; *a = *b; *b = temp; una soluzione corretta i parametri sono puntatori ad interi stampa i= 3, j=5 a swap vengono passati gli indirizzi di i e j stampa i = 5, j =3 mette in temp il valore puntato da a mette nella variabile puntata da a il valore puntato da b mette nella variabile puntata da b il valore di temp una soluzione corretta swap (&i, &j); Quando si passano &i e &j a swap, gli indirizzi di i e j vengono copiati in a e b void swap (int *a, int *b) temp = *a; *a = *b; *b = temp; La funzione swap effettua quindi lo scambio su *a e *b Ciò corrisponde ad effettuare lo scambio su i e j Rappresentazione di un array Un array è memorizzato in locazioni consecutive a partire da un indirizzo di partenza Esempio: int a[5]; Il compilatore ottiene l indirizzo di a[2] () sommando l indirizzo di partenza al numero di byte necessari per rappresentare a[0] e a[1]: + 2 * sizeof (int) a[0] a[1] a[2] a[3] a[4] 1019 1020 Relazioni tra array e puntatori Il nome di un array è di per sé un indirizzo di memoria Array e puntatori sono di fatto equivalenti a parte alcune differenze sottili: un array rappresenta un indirizzo fissato (a differenza dei puntatori che possono cambiare) con un array si alloca anche della memoria, mentre con i puntatori no Equivalenza di espressioni con array e puntatori Consideriamo un array a e un intero i a[i]; è equivalente a *(a + i); Consideriamo un puntatore p e un intero i *(p + i); è equivalente a p[i]; float a[7]; int i; int *p; int i; 4

Motivo dell equivalenza Il compilatore ottiene l indirizzo di a[i] sommando l indirizzo di partenza di a al numero di byte necessari per rappresentare a[0], a[1],,a[i-1]: + i * sizeof (int) Per accedere a *(a+i) ci si sposta di i posizioni intere rispetto all indirizzo contenuto nel puntatore a spostato + i * sizeof(int) a[0] a[1] a[2] a[3] a[4] a[5] a[6] 1019 1020 1031 1032 1033 1034 Aritmetica dei puntatori Se p è un puntatore ad un dato con un certo tipo: allora l espressione p+i rappresenta l indirizzo di memoria per memorizzare la successiva i-esima variabile dello stesso tipo Anche le seguenti espressioni sono significative: p += i; p--; Se q e p sono due puntatori che puntano ad elementi dello stesso array allora p-q rappresenta il numero di elementi dell array tra p e q Esempio dell aritmetica dei puntatori #include <stdioh> double a[2], *p, *q; p=a; q= p+1; printf( %d\n, q-p); printf( %d\n, (int) q (int) p); /* stampa 1 (differenza in termini di elementi dell array) */ /* stampa 8 ( differenza in termini di byte) */ Esercizi Scrivere una funzione GetArray( ) che prende in input al più 15 interi e li mette in un array dichiarato esternamente La funzione restituisce il numero degli elementi presi in input Scrivere un programma che: Prende in input mediante GetArray( ) un array di al più 15 interi Chiama una funzione che restituisce il numero di interi nell array che sono la somma di due interi inseriti nell array Suggerimento: la funzione deve scorrere tutte le terne di indici dell array (tre for innestati) Esercizi Scrivere una funzione GetString(a[],n) che prende in input una stringa di al più n caratteri e li mette nell array a[] dichiarato esternamente La funzione restituisce il numero degli elementi presi in input Scrivere un programma che: Prende in input mediante GetArray(a[],n) due stringhe di lunghezze al più 50 e 10, rispettivamente, e le mette in due array str1 e str2 dichiarati esternamente Il programma utilizza una funzione Find(str2[],n2,str1[],n1) per contare quante volte str2 compare in str1 Esempio: str1[] = abcddabcbadabc str2 = abc Output = 3 5