Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F1 Primi programmi.
Introduzione al linguaggio C++
Corso di Fondamenti di Programmazione canale E-O
INFORMATICA Altre Istruzioni di I/O
LINGUAGGIO DI PROGRAMMAZIONE C
Funzioni e procedure Ogni linguaggio di programmazione ad alto livello mette a disposizione del programmatore questi strumenti, ed il C non è da meno!
Puntatori in C e C++.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Programmazione assembler
Introduzione alla programmazione A. Ferrari. Il linguaggio C Nel 1972 Dennis Ritchie nei Bell Laboratories progettò il linguaggio C Il linguaggio possiede.
Selezione - approfondimento
PUNTATORI Introduzione
Fondamenti di Informatica Prof. Cantone
Anno accademico Le classi di memorizzazione.
FUNZIONI DI BIBLIOTECA
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Caratteri e stringhe di caratteri
Ingresso interattivo (scanf(); %lf)
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
FILE DATI 16 lunedi 26 luglio giovedi ore 9 Come sappiamo, un file dati è un gruppo di informazioni tra loro correlate, memorizzate in un dispositivo di.
Funzioni definite dall’utente
PROGRAMMI DI RICERCA E ORDINAMENTO
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.
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 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.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Assegnamento di valore a una variabile Anno Accademico 2009/2010.
Introduzione agli stream e alle classi
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
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.
Dichiarazioni e tipi predefiniti nel linguaggio C
Le funzioni.
Espressioni condizionali
File I record.
CODIFICA Da flow-chart a C++.
In molti casi è utile assegnare a degli identificatori dei valori che restino costanti durante tutto il programma e che non possano essere cambiati nemmeno.
Tipi di dati elementari
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
Passaggio di parametri per indirizzo
BIOINFO3 - Lezione 201 Come in ogni corso di introduzione ad un linguaggio di programmazione, proviamo a scrivere lormai celebre primo programma di prova.
Complessità di un algoritmo
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Ripetizione La vera potenza dei programmi per computer risiede nella capacità di ripetere lo stesso calcolo o sequenza di istruzioni più volte, ogni volta.
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.
1 Corso di Informatica (Programmazione) Lezione 8 (7 novembre 2008) Programmazione in Java: operatori aritmetici, operatori di assegnamento e cast.
Vettori (a una dimensione)
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.
Informatica Lezione 5 Scienze e tecniche psicologiche dello sviluppo e dell'educazione (laurea triennale) Anno accademico:
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.
Sottoprogrammi e funzioni
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
La codifica dei numeri.
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.
Cloud informatica V anno. Introduzione a PHP Lo scripting PHP PHP è un linguaggio di scripting lato server. Le caratteristiche di un linguaggio di scripting.
Il C `e un linguaggio di programmazione di uso generale, originariamente sviluppato per la scrittura del sistema operativo Unix, ed oggi disponibile su.
“ Pseudocodice ” Un programma per computer lavorerà su in insieme di “ variabili ” contenenti i dati del problema, soluzioni intermedie, soluzioni finali.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
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.
Transcript della presentazione:

Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il valore memorizzato in una variabile è detto anche il suo contenuto, o rvalue. Il tipo dati di appartenenza è dichiarato usando unistruzione di dicharazione. Lindirizzo, detto anche lvalue, è quello della prima locazione di memoria usata per la variabile. Come abbiamo visto, il numero delle locazioni di memoria effettivamente usate da una variabile dipende dal suo tipo dati. Quindi, quando si dichiara una variabile con una istruzione quale int numero il compilatore tiene traccia di ciò creando (o aggiornando) in memoria una tabella del tipo:

Il campo INDIRIZZO viene riempito automaticamente dal compilatore, il campo VALORE viene riempito dallutente con una istruzione di assegnazione. Come indica la figura, lindirizzo di una variabile è scritto di solito alla sua sinistra, il suo contenuto o valore alla destra.

Operatore di indirizzo &. Di solito ci si interessa più al valore assegnato a una variabile (il suo contenuto, o rvalue), e meno a dove il valore sia memorizzato (il suo indrizzo, o lvalue). Tuttavia il C consente di visualizzare in modo semplice lindirizzo di una variabile (ossia quello del primo byte che le viene riservato nella memoria del computer). Per indicare tale indirizzo si usa loperatore di indirizzo &, che si legge lindirizzo di, subito prima del nome della variabile (senza spazi intermedi). Ad es.: Loperatore & è un operatore unario, che restituisce lindirizzo del suo operando.

#include void main(void) { int numero; numero = 22; printf(numero = %d Lindirizzo di numero è %p., numero, &numero); } Esso produce la seguente uscita Sequenza di controllo di conversione %p. Per visualizzare con printf() lindirizzo di una variabile preceduta dalloperatore di indirizzo & si usa la sequenza di controllo di conversione %p, come nel programma seguente. Ogni volta che il programma viene eseguito, esso visualizza (in formato esadecimale) lindirizzo del primo byte usato per memorizzare la variabile numero. Tale indirizzo può cambiare, ovviamente, a ogni esecuzione del programma. numero = 22 Lindirizzo di numero è 0012FF7C.

La figura seguente illustra linformazione dindirizzo aggiuntiva fornita dalluscita del programma Come vedremo, usare gli indirizzi anziché semplicemente visualizzarli fornisce un potente strumento di programmazione: gli indirizzi consentono di entrare direttamente nella operatività interna del computer e di accedere alla sua struttura fondamentale di memoria. Ciò fornisce al programmatore C una possibilità e una potenza di programmazione non disponibili nella maggior parte degli altri linguaggi per computer.

Puntatori Oltre a visualizzare lindirizzo di una variabile, come fa il programma precedente, è anche possibile memorizzare tale indirizzo in una variabile precedentemente dichiarata. Ad es., listruzione di assegnazione ind_numero = № memorizza nella variabile ind_numero lindirizzo della variabile numero, come indicato in figura. La variabile ind_numero, in quanto contiene lindirizzo di unaltra variabile, è detta variabile puntatore o puntatore. Pertanto:

Lesecuzione della precedente istruzione di dichiarazione ind_numero = № aggiornerebbe la precedente tabella come indica la figura: i puntatori sono variabili usate per memorizzare gli indirizzi di altre variabili.

Analogamente, come indica la seguente tabella: Anche le variabili d, punt_tab e punt_car sono puntatori.

Operatore di indirezione *. Per usare un indirizzo memorizzato, C fornisce loperatore di indirezione * (detto anche di deriferimento o di risoluzione del riferimento). Il simbolo *, seguito immediatamente da un puntatore (senza spazi intermedi), significa la variabile il cui indirizzo è memorizzato in Così, se ind_numero è un puntatore, la scrittura Anche * è un operatore unario, che restituisce il valore delloggetto puntato dal suo operando (ossia da un puntatore). Quindi, per visualizzare il contenuto della variabile numero (ossia lintero 22), si può scrivere indifferentemente:

Usando un puntatore ( ind_numero ), il contenuto di numero si ottiene leggendo dapprima il contenuto del puntatore, che è lindirizzo di numero, quindi usando tale indirizzo per ottenere il contenuto di numero. Pertanto luso di un puntatore fa eseguire al computer un doppio passaggio: dapprima richiama lindirizzo di un dato, quindi lo usa per richiamare il dato effettivo. Questo è un modo indiretto per ottenere il valore finale, e in effetti questa procedura è detta indirizzamento indiretto. La sua utilità sarà vista più avanti. printf(%d, numero); stampa il contenuto della variabile numero che si legge oppure la coppia di istruzioni che si leggono stampa il contenuto della variabile il cui indirizzo è memorizzato nella variabile ind_numero ind_numero = № printf(%d, *ind_numero); listruzione

Dichiarazione dei puntatori. Come tutte le variabili, anche i puntatori devono essere dichiarati prima di essere usati. Nel dichiarare un puntatore, il C richiede che sia indicato il tipo dati della variabile puntata. Ad es., se lindirizzo memorizzato nel puntatore ind_numero è quello di un intero, la dichiarazione corretta del puntatore è: (quindi la dichiarazione viene letta allindietro). Si osservi che la precedente dichiarazione specifica anche che ind_numero deve essere un puntatore (dato che è usato con loperatore di indirezione *).

Consideriamo il programma seguente:

La sua uscita è: La sola utilità di questo programma è di aiutarci a capire cosa è memorizzato dove. Sarebbe stato certamente più semplice se il puntatore del programma avesse potuto essere dichiarato come point ind_num;. Tuttavia, tale dichiarazione non conterrebbe informazioni sulla memoria usata dalla variabile il cui indirizzo è memorizzato in ind_num. Questa informazione è essenziale quando il puntatore è usato con loperatore di indirezione, come avviene nella seconda chiamata a printf() nel programma precedente. Infatti Lindirizzo memorizzato in ind_num è 0012FF78 Il valore puntato da ind_num è 22 Lindirizzo ora memorizzato in ind_num è 002FF7C Il valore ora puntato da ind_num è 158

se in ind_num è memorizzato lindirizzo di un carattere, quando si usa lindirizzo viene richiamato 1 byte di memoria; se in ind_num è memorizzato lindirizzo di un intero, vengono richiamati 2 byte di memoria, mentre se in ind_num è memorizzato lindirizzo di un numero in virgola mobile, vengono richiamati 4 byte. È per questa ragione che la dichiarazione di un puntatore deve comprendere il tipo di variabile che viene puntata.

&a = 0012FF7C Prova che * e & sono complementari: &*ind_a = 0012FF7C *&ind_a = 0012FF7C I due operatori & e * sono luno il complemento dellaltro; qualora fossero applicati consecutivamente a ind_a, in qualsiasi ordine, il loro effetto si annullerebbe, come mostra il seguente programma: #include void main(void) { int a, *ind_a; a = 7; ind_a = &a; printf("\n &a = %p\n", &a); printf("Prova che * e & sono complementari:\n &*ind_a = %p\n *&ind_a = %p\n", &*ind_a, *&ind_a); } Esso produce la seguente uscita:

Come si chiamava il padre della protagonista di questa famosa tragedia?

Codice ASCII di un carattere ( %o, %x ). Dato che il C non possiede un operatore specifico che fornisca il codice ASCII di un carattere, esso si può ottenere semplicemente: memorizzando il carattere in una variabile; stampando il valore della variabile, ossia stampando la variabile tramite la sequenza di controllo di formato %d. Ciò si può ottenere con il programma seguente: #include void main(void) { char var = 'a'; printf("\nIl codice ASCII decimale di %c è %d.",var,var); } Il codice ASCII decimale di a è 97. che produce luscita

Naturalmente il codice ASCII può essere ottenuto anche in formato ottale o esadecimale, sostituendo la sequenza di controllo di formato %d rispettivamente con %o o con %x.

Ecco luscita prodotta: Il valore memorizzato in ind_var è: 0012FF7C Il valore puntato da ind_var è: a Il codice ASCII di a è 61 #include void main(void) { char *ind_var; char var = 'a'; ind_var = &var; printf("Il valore memorizzato in ind_var è: %p", ind_var); printf("\nIl valore puntato da ind_var è: %c", *ind_var); printf("\nIl codice ASCII di %c è %x", var, *ind_var); } Il programma seguente stampa lindirizzo di una variabile di tipo carattere, il valore contenuto in tale indirizzo e il codice ASCII della variabile usando un puntatore.

Il programma determina lo stato della memoria illustrato nela figura seguente