Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a. 2001-2002 – 3° ciclo.

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Introduzione al linguaggio C++
INFORMATICA Tipi strutturati
Puntatori e gestione dinamica della RAM
Puntatori in C e C++.
PUNTATORI Introduzione
Universita di Camerino
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
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.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
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 Liste.
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 Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Process synchronization
Allocazione dinamica della memoria
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.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Array Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
Corso di Informatica Applicata Lezione 6
Array Struttura numerate di dati. Memorizzare molti dati In informatica cè spesso bisogno di memorizzare ed elaborare un insieme costituito da molti dati.
memoria gestita staticamente:
1 laboratorio di calcolo II AA 2003/04 seconda settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
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
File ad accesso casuale o random
2000 Prentice Hall, Inc. All rights reserved. Capitolo 6 (Deitel) I vettori Sommario Introduzione Vettori Dichiarazione di vettori 6.4.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
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.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Strutture dati elementari
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.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
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ò.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
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.
© Piero Demichelis Tipi strutturati I tipi considerati finora hanno la caratteristica comune di non essere strutturati: ogni elemento è una singola entità.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
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.
Informatica 6 Tipi di dato. Nelle celle di memoria di un calcolatore ci sono solo “0” e “1”, fisicamente realizzati tramite due diversi livelli di tensione.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
Stringhe Una stringa è un vettore di char con un carattere costante \0 che indica la fine della stringa il terminatore rende differenti gli array di char.
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.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
“ Pseudocodice ” Un programma per computer lavorerà su in insieme di “ variabili ” contenenti i dati del problema, soluzioni intermedie, soluzioni finali.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Lucidi della Pof.ssa Pazienza
Transcript della presentazione:

Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo

Loperatore di indirizzo & Indirizzi, puntatori Aritmetica dei puntatori Loperatore di dereferenziazione * Puntatori

Operatore di indirizzo & L operatore unario di indirizzo & restituisce lindirizzo della locazione di memoria dell operando Il valore restituito non va usato come l-value (in quanto lindirizzo di memoria di una variabile non può essere assegnato in unistruzione, ma è predeterminato)

Operatore di indirizzo & Es.: &a ammesso &(a+1) non ammesso &a = b non ammesso Perché? (in quanto lindirizzo di memoria di una variabile non può essere modificato in unistruzione, ma solo usato come riferimento in quanto è predeterminato e non modificabile)

Puntatori Una variabile di tipo puntatore é designata a contenere lindirizzo di memoria di unaltra variabile (detta variabile puntata ), la quale a sua volta può essere di qualunque tipo, anche non nativo (persino un altro puntatore !). reg. 1000N IndirizzoValore Variabile dato di tipo carattere reg IndirizzoValore Variabile dato di tipo puntatore reg. 8000

Dichiarazione di variabile puntatore Esistono puntatori per ogni tipo di variabile puntata Un dato puntatore può puntare solo a un determinato tipo di variabili, quello specificato nella dichiarazione Si usa il qualificatore di tipo ( suffisso ) * Es. : int * pointer; dichiara la variabile pointer, puntatore ad una qualunque variabile di tipo int Si può anche dichiarare un puntatore a puntatore. Es.: double ** pointer_to_pointer;

Puntatore void Un puntatore void è un puntatore generico che accetta come valore un indirizzo ma non punta ad un tipo dato ben determinato. Il puntatore void si riferisce ad oggetti di tipo diverso int i; int* pi=&i; char c; char* pc=&c; void* tp; tp=pi; *(int*) tp=3; tp=pc; *(char*) tp=c;

Assegnazione di valore a un puntatore NON si possono assegnare valori a un puntatore, salvo che in questi tre casi: 1.a un puntatore é assegnato il valore NULL (non punta a niente) 2.a un puntatore è assegnato l indirizzo di una variabile esistente, restituito dalloperatore & ( Es. int a; int * p ; p=&a; ) 3.é eseguita unoperazione di allocazione dinamica della memoria

Operazioni sui puntatori Operazioni fondamentali: Assegnazione di valore (indirizzo) ad un puntatore int* pi = &i p = q Riferimento alloggetto puntato *pi=3 Confronto tra puntatori (==, !=)

Operazioni sui puntatori E possibile specificare che un dato puntatore non deve essere usato per modificare loggetto puntato attraverso la parola chiave const : int i; const int* p=&i; Le istruzioni in cui si usa p per aggiornare i vengono segnalate come erronee

Operazioni sui puntatori E possibile specificare con la parola chiave const che un puntatore non deve essere modificato: int i; int* const p=&i; Le istruzioni in cui si vuole modificare il valore di p vengono segnalate come erronee

Aritmetica dei puntatori (1) Il valore assunto da un puntatore é un numero intero che rappresenta, in byte, un indirizzo di memoria le operazioni di somma fra un puntatore e un valore intero (con risultato puntatore ), oppure di sottrazione fra due puntatori (con risultato intero ) vengono eseguite tenendo conto del tipo della variabile puntata Es.: se si incrementa un puntatore- a- float di 3 unità, il suo valore viene incrementato di 12 byte.

Aritmetica dei puntatori (2) Se lespressione p rappresenta lindirizzo di un oggetto di tipo T, allora lespressione p+1 rappresenta lindirizzo di un oggetto di tipo T allocato consecutivamente in memoria. In generale : se i è un intero, se p rappresenta lindirizzo addr di T che occupa n locazioni di memoria, allora lespressione p+i ha valore addr+ n x i

Aritmetica dei puntatori (3) Le regole dell aritmetica dei puntatori assicurano che il risultato sia sempre corretto, qualsiasi sia la lunghezza in byte della variabile puntata. Es.: se p punta a un elemento di un array, p++ punterà allelemento successivo, qualunque sia il tipo (anche non nativo ) dellarray

Loperatore di dereferenziazione * L operatore unario di dereferenziazione * di un puntatore restituisce il valore della variabile puntata dall operando : come r-value, esegue unoperazione di estrazione Es.: a = * p; assegna ad a il valore della variabile puntata da p come l-value, esegue unoperazione di inserimento Es.: * p = a; assegna il valore di a alla variabile puntata da p

Loperatore di dereferenziazione * loperazione di deref. é inversa a quella di indirizzo. Se assegniamo a un puntatore p l indirizzo di una variabile a, p = &a; allora * p == a cioè la deref. di p coincide con a

Loperatore di dereferenziazione * ATTENZIONE: non é detto il contrario !!! se si assegna alla deref. di p il valore di a, * p = a ; ciò non comporta automaticamente che in p si ritrovi l indirizzo di a, ma semplicemente che il valore della variabile puntata da p coinciderà con a

Puntatori e riferimenti Un riferimento è un nome alternativo per un oggetto e va sempre inizializzato Un riferimento è un puntatore costante che viene dereferenziato ogni volta che viene utilizzato void g() int ii=0; int& rr=ii ; // inizializzazione rr++; // ii viene incrementato di 1 int *pp=&rr; // pp punta ad ii

Attenzione! la dichiarazione di un puntatore comporta allocazione di memoria per la variabile puntatore, ma non per la variabile puntata. Es.: int * lista; alloca memoria per lista ma non per la variabile puntata da lista

int a = 1; int b = 7; int* pa = &a; int* pb = &b; int temp; temp = a; a = b; b = temp; 1 a 7 b pa pb int temp; temp = *pa; *pa = *pb; *pb = temp; 7 a 1 b 1 temp pa pb Scambio dei valori di a e b Oppure, usando pa e pb Esempio

int a = 1; int b = 7; int* pa = &a; int* pb = &b; int* tempp; tempp = pa; pa = pb; pb = tempp; 1 a 7 b pa pb 1 a 7 b tempp pa pb Scambio dei puntatori di a e b Esempio

Array e puntatori Il nome di un array è in realtà un puntatore costante allindirizzo di partenza dellarray stesso, per cui non può essere modificato nelle operazioni di aritmetica dei puntatori. I puntatori possono essere utilizzati in tutte le operazioni di indicizzazione di un array

Array e puntatori La dichiarazione di un array comporta allocazione di memoria di una variabile puntatore (il nome dell array ), e dell area puntata, di lunghezza predefinita il puntatore é dichiarato const e inizializzato con l indirizzo dell area puntata (cioè del primo elemento dell array ) Es.: int lista[5]; alloca memoria per il puntatore costante lista ; alloca memoria per 5 valori di tipo int ; inizializza lista con &lista[0]

Array e puntatori (1) Il nome (usato da solo) di un array ha il significato di puntatore al primo elemento dellarray Ogni altro elemento é accessibile tramite la deref. del puntatore-array incrementato di una quantità pari all indice/offset dell elemento ovvero le espressioni (dato un array A ): A[i] e * (A+i) conducono ad identico risultato anche se sono due formalismi diversi.

Array e puntatori (2) Se A[N] è un array di indirizzo ind, A[i] il suo elemento i-esimo (i intero), l.indirizzo di A[i] sarà dato dallespressione *(ind+i)

Array di puntatori I puntatori, come qualsiasi altra variabile, possono essere raggruppati in array e dichiarati come: Es.: int * A[10] ; dichiara un array di 10 puntatori a int Come il nome di un array equivale a un puntatore, così un array di puntatori equivale a un puntatore a puntatore (con in più lallocazione della memoria puntata, come nel caso di array generico)

Array di Stringhe Il caso più frequente di array di puntatori é quello dellarray di stringhe, che consente anche linizializzazione (atipicamente) delle stringhe che costituiscono larray Es.: char* colori[3] = {Blu, Rosso, Verde} ; Le stringhe possono essere di differente lunghezza; in memoria sono allocate consecutivamente e, sono riservati tanti bytes quantè la rispettiva lunghezza (terminatore compreso).

Array di puntatori suit [4] indica un array di 4 elementi char* suit[4] = {Heart, Diamond, Clubs, Spades} Ogni elemento dellarray è un puntatore ad un char, larray contiene in realtà soltanto i puntatori al primo carattere di ogni stringa. Pur avendo larray suit dimensione fissa, si può accedere a stringhe di qualsiasi lunghezza.

Stringhe In memoria le stringhe sono degli array di tipo char, con una particolarità in più, che le fa riconoscere da operatori e funzioni come stringhe e non come normali array: lelemento dellarray che segue lultimo carattere della stringa deve contenere il carattere NULL o \0 (detto in questo caso terminatore); si dice pertanto che una stringa é un array di tipo char null terminated.

Dichiarazione di stringhe Es.: char MiaVar[30]; Dichiara la variabile MiaVar come array di tipo char con massimo 30 elementi. Affinché MiaVar sia identificata (in lettura) da operatori e funzioni come stringa, dobbiamo inserire nellarray una serie di caratteri terminati da un NULL. Se vogliamo che MiaVar presenti a operatori e funzioni la stringa Ciao, dobbiamo scrivere invece le istruzioni: MiaVar[0]=C;MiaVar[1]=i; MiaVar[2]=a;MiaVar[3]=o; MiaVar[4]=\0; impegnando così 5 elementi dellarray dei 30 disponibili (i rimanenti 25 saranno ignorati).

Inizializzazione di variabili stringa Se nella dichiarazione-inizializzazione si omette la dimensione dellarray, questa viene automaticamente definita dalla lunghezza della costante stringa aumentata di uno, per far posto al terminatore (in questo caso la stringa non può più essere allungata!): char Saluto[] = Ciao; allocato in memoria array con 5 elementi

Considerazioni ATTENZIONE: In caso che si creino delle stringhe con un numero di caratteri (compreso il terminatore) maggiore di quello dichiarato, il programma non produce direttamente messaggi di errore, ma invade zone di memoria non di sua pertinenza, con conseguenze imprevedibili (spesso si verifica un errore fatale a livello di sistema operativo).