introduzione al c - lezione 1 -corsi.unibo.it/laurea-matematica/documents/c_lezione_1.pdf · (slide...
TRANSCRIPT
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Introduzione al C- lezione 1 -
Elena Morotti
Attivitá professionalizzanteA.A. 2017/2018
9 marzo 2018
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Presentiamoci
Elena [email protected]
Orario del corso (da confermare!)
Ï lezione 1: aula Tonelli, venerdí 9 marzo, ore 14-17
Ï laboratorio 1: laboratori al piano terra e al primo pianoÏ A-F : giovedí 15 marzo, ore 14-17Ï G-Z : venerdí 16 marzo, ore 14-17
Ï lezione 2: aula Tonelli, venerdí 23 marzo, ore 14-17
Ï laboratorio 2: laboratori al piano terra e al primo pianoÏ G-Z : giovedí 5 aprile, ore 14-17Ï A-F : venerdí 6 aprile, ore 14-17
Materiali e maggiori informazioni alla pagina �Attivitá professionalizzante2017-2018� del corso di laurea Link
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Cosa vediamo oggi
Cosa é il CPanoramicaConfronto con Matlab
Come in Matlab...SintassiBlocchi
Diversamente da Matlab...Linguaggio �strongly-typed�Cenni di compilazione
Accedere alla memoriaAltri limiti di MatlabI puntatoriAllocazione dinamica
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Panoramica
Perché conoscere C
�Il C é un buon linguaggio.
Se sapete il C, sapete programmarein qualunque altro linguaggio.
Odierete alcune delle sue caratteristiche, ne ameretealla follia delle altre.
Imparate altri linguaggi, magari li userete piú del C:ma quando avrete un dubbio, quando una cosa
non vi sará chiara, �nirete per chiedervi:�Come lo farei in C?��
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Panoramica
Linguaggio di basso/alto livello
Gerarchia dei linguaggi:
1. binario assoluto
2. binario rilocabile
3. assembly
4. linguaggi ad alto livello(C, Fortran, Pascal, ...)
5. linguaggi interpretati(Python, Matlab, ...)
Storicamente, 1, 2 e 3 sono detti linguaggi a basso livello
Ï si �programmano� con istruzioni eseguite direttamente dal microprocessore
Ï permettono di maneggiare la memoria e i registri del microprocessore e diaccedere a molte componenti hardware
I linguaggi ad alto livello (4) trattano il computer in maniera piú astratta:
Ï assegnano i dati a delle variabili (nome simbolico e valore mnemonico)
Ï non richiedono di conoscere nel dettaglio hardware né sistema operativo
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Panoramica
Linguaggio compilato
I linguaggi 1-4 sono compilati
Giá sapete che(slide del profMartini):
Anche noi, in Linux:
1. scriveremo il codice sorgente nel linguaggio C (�le con estensione .c)2. lo compileremo da terminale con il programma GCC, ottenendone il
codice oggetto eseguibile (�le con estensione .out)3. linkeremo le librerie necessarie all'esecuzione4. lo eseguiremo da terminale: le istruzioni, giá in linguaggio macchina,
vengono caricate e istantaneamente eseguite dal processore.Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Panoramica
Linguaggio compilato vs interpretato
In un programma interpretato:
Ï si esegue direttamente il codice sorgente (non lo si compila)Ï ogni riga di codice viene tradotta (di volta in volta) in istruzioni inlinguaggio macchina, quindi l'interprete
Ï analizza le istruzioni a partire dal livello sintattico (del sorgente)Ï identi�ca le azioni da eseguire (trasforma i nomi simbolici in variabili
con precisi indirizzi di memoria)Ï esegue quelle azioni
Caratteristiche di un linguaggio interpretato:
, �essibilitá e portabilitá
, facile interazione runtime (per debugging)
M scarsa e�cienza (causa overhead dell'interprete)
Caratteristiche di un linguaggio compilato:
M scarsa �essibilitá e portabilitá
M perdita delle informazioni sulla struttura del sorgente
, grande e�cienza (esecuzione veloce e buona gestione della memoria)
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Panoramica
Varianti del C
Ï C++: sviluppato nel 1983 come un miglioramento del linguaggio C
Ï PHP: usatissimo per la programmazione web
Ï Perl: comodo principalmente per la trattazione di stringhe e �le ditesto (varie attivitá di un server)
Ï ObjectiveC: lo de�niscono �il fratello bello del C�, é molto usato persviluppare sulla piattaforma MacOS X e sui diversi dispositivi Apple.
Ï Python:Ï veloce da imparare, con codice facilmente leggibileÏ molto usato anche in ambito industrialeÏ si interfaccia con librerie C e Java
Ï Matlab:Ï veloce per la programmazione matematicaÏ molto usato per l'elaborazione delle immagini e applicazioni di
intelligenza arti�cialeÏ o�re molti strumenti a supporto di tanti campi di studio applicati.
Ï altri...
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Confronto con Matlab
Codice Matlab
Caratteristiche:
Ï poche righe di codice
Ï la punteggiatura ha unsigni�cato preciso
Ï ciclo for
Ï variabili con nomi
Ï diversi modi per�comunicare� i risultati
Ï funzioni de�nite da Matlab
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Confronto con Matlab
1 #i n c l u d e <s t d i o . h>2 #i n c l u d e <math . h>3 #i n c l u d e <t ime . h>4
5 i n t main ( )6 {7 i n t i , max i t e r ;8 doub l e a ;9 max i t e r = 1e6 ;
10 a = 0 ;11 p r i n t f ( "MAXITER = %d \n" , max i t e r ) ;12 c lock_t t ime_sta r t , t ime_d i f f ;13 i n t msec , s e c ;14
15 /* INIZIO CICLO */16 t ime_s ta r t = c l o c k ( ) ;17 f o r ( i = 1 ; i <= max i t e r ; i++)18 {19 a = a + s q r t ( i ) ;20 }21 t ime_d i f f = c l o c k ( ) − t ime_s ta r t ;22
23 // Ca l c o l o tempo e stampo24 msec = t ime_d i f f * 1000/CLOCKS_PER_SEC;25 s e c = msec / 1000 ;26 msec = msec − s e c * 1000 ;27 p r i n t f ( " Second i e m i l l i − s e c t r a s c o r s i : %
d s , %d ms \n" , sec , msec ) ;28 }
Caratteristiche del
codice C:
M molte piú righe di codice
M struttura piú articolatadel codice
, la punteggiatura ha unsigni�cato preciso
, ciclo for
, variabili con nomi
M variabili con tipi
, posso �comunicare� irisultati
, funzioni de�nite da C
M includo sempre dellelibrerie
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Confronto con Matlab
Confronto output
maxiter sec in Matlab sec in C
106 0.059 0.017107 0.457 0.174108 3.735 1.726109 37.244 16.882·109 74.067 32.51
=⇒ il codice compilato é molto piú veloce!
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Cosa vediamo adesso
Cosa é il CPanoramicaConfronto con Matlab
Come in Matlab...SintassiBlocchi
Diversamente da Matlab...Linguaggio �strongly-typed�Cenni di compilazione
Accedere alla memoriaAltri limiti di MatlabI puntatoriAllocazione dinamica
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Sintassi
Linguaggio ...
I nomi delle variabili devono seguire le regole standard del linguaggio
Ï i caratteri ammessi sono: a-z, A-Z, 0-9, _
Ï il primo carattere non puó essere un numero
Ï il nome non dovrebbe avere piú di 31 caratteri
B C é case-sensitive (maiuscole e minuscole sono lettere diverse)
Il punto e virgola �;� deve chiudere ogni comando.
I commenti
Ï per commentare piú linee di codice, si apre il commento con /* e losi chiude con */: tutto ció che sta all'interno non sará compilato
Ï per commentare poco testo, su UNA linea, usare //: solo ció chesegue diventa un commento
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Sintassi
Linguaggio dichiarativo
Operatori aritmetici binari
Operatore Operazione
+ addizione- sotrazione* moltiplicazione/ divisione% modulo (resto)
Operatori relazionali binari
Operatore Relazione
< minore di<= minore o uguale a> maggiore di>= maggiore o uguale a== uguale a!= diverso da
Operatori logici
Operatore binario Operazione Espressione di esempio
&& AND (x>=2) && (x<5)
|| OR (x<2) || (x>=5)
Operatore unario Operazione Espressione di esempio
! NOT !(x==5)
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Blocchi
Blocco IF
Sintassi:
1 i f ( cond )2 {3 // cond = t r u e4 i s t r u z i o n i ;5 }6 e l s e /* f a c o l t a t i v o */7 {8 // cond = f a l s e9 i s t r u z i o n i ;
10 }
Nota:�true� corrisponde a un valoreintero
cond != 0,mentre �false� corrisponde a
cond == 0
1 #i n c l u d e <s t d i o . h>2
3 i n t main ( )4 {5 doub l e x ;6 p r i n t f ( " I n s e r i s c i i l v a l o r e
numer ico d i x : \n" ) ;7 s c a n f ( "%f " , &x ) ;8
9 i f ( x>=3 && x<5 )10 {11 p r i n t f ( "x s t a n e l l '
i n t e r v a l l o [ 3 , 5) " ) ;12 }13 e l s e14 {15 p r i n t f ( "x f u o r i d a l l '
i n t e r v a l l o [ 3 , 5) " ) ;16 }17
18 }
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Blocchi
Blocco SWITCH
Sintassi:
1 sw i t ch ( v a r i a b i l e )2 {3 ca se va lo re_1 :4 i s t r u z i o n i ;5 break ;6 ca se va lo re_2 :7 i s t r u z i o n i ;8 break ;9 d e f a u l t :
10 i s t r u z i o n i ;11 break ;12 }
1 #i n c l u d e <s t d i o . h>2
3 i n t main ( )4 {5 cha r l e t t e r a ;6 l e t t e r a = . . . ; // i npu t7
8 sw i t ch ( l e t t e r a )9 {
10 ca se ' g ' :11 p r i n t f ( "Geometr ia ! \n" ) ;12 break ;13 /* ca se . . .14 t u t t e l e a l t r e */15 d e f a u l t :16 p r i n t f ( "We l o v e math !\ n" ) ;17 break ;18 }19 }
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Blocchi
Blocco FOR
Sintassi:
1 f o r ( da ; a ; i nc r emento )2 {3 i s t r u z i o n i ;4 }
1 #i n c l u d e <s t d i o . h>2
3 i n t main ( )4 {5 i n t N, somma = 0 ;6 i n t i ;7 p r i n t f ( "Quant i numer i devo
sommare? \n" ) ;8 s c a n f ( "%d" , &N) ;9
10 f o r ( i =1; i<=N; i++)11 {12 somma = somma + i ;13 }14 p r i n t f ( "La somma de i p r im i
%d numer i n a t u r a l i \ ' e %d\n" , N, somma) ;
15 }
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Blocchi
Blocco WHILE
Sintassi:
1 wh i l e ( cond )2 {3 i s t r u z i o n i ;4 }
1 #i n c l u d e <s t d i o . h>2
3 i n t main ( )4 {5 i n t max_somma , somma = 0 ;6 i n t i = 0 ;7 p r i n t f ( " F ino a quanto posso
sommare? \n" ) ;8 s c a n f ( "%d" , &max_somma) ;9
10 wh i l e (somma<=max_somma)11 {12 i = i + 1 ;13 somma = somma + i ;14 }15 somma = somma − i ;16 i = i − 1 ;17 p r i n t f ( "La somma d i %d numer i
n a t u r a l i \ ' e %d <= %d \n" ,i , somma , max_somma) ;
18 }
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Blocchi
Blocco DO WHILE
Sintassi:
1 do2 {3 i s t r u z i o n i ;4 } wh i l e ( cond ) ;
1 #i n c l u d e <s t d i o . h>2
3 i n t main ( )4 {5 i n t max_somma , somma = 0 ;6 i n t i = 0 ;7 p r i n t f ( " F ino a quanto posso
sommare? \n" ) ;8 s c a n f ( "%d" , &max_somma) ;9
10 do11 {12 i = i + 1 ;13 somma = somma + i ;14 } wh i l e (somma+i < max_somma) ;15
16 p r i n t f ( "La somma d i %d numer in a t u r a l i \ ' e %d <= %d \n" ,
i , somma , max_somma) ;17 }
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Cosa vediamo adesso
Cosa é il CPanoramicaConfronto con Matlab
Come in Matlab...SintassiBlocchi
Diversamente da Matlab...Linguaggio �strongly-typed�Cenni di compilazione
Accedere alla memoriaAltri limiti di MatlabI puntatoriAllocazione dinamica
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Linguaggio �strongly-typed�
Tipi di variabili
In C bisogna sempre speci�care iltipo di ciascuna variabile che sivuole usare.
I tipi piú usati sono:
char un singolo carattere di testo
int un intero con segno
float un reale in virgola mobile
double un reale in doppia precisione
ma esistono anche altri tipi comeshort, long double, unsignedint, ...
1 /* lab1_esA . c */2 #i n c l u d e <s t d i o . h>3
4 i n t main ( )5 {6 // D i c h i a r o i t i p i
d e l l e v a r i a b i l i7 cha r mio_char ;8 i n t mio_int ;9 f l o a t mio_f loat ;
10 doub l e mio_double ;11
12 // Assegno i v a l o r ia l l e v a r i a b i l i
13 mio_char = ' a ' ;14 mio_int = −19;15 mio_f loat = 19 . 0488 ;16 mio_double = 19 . 0488 ;17
18
19 // con t i nua . . .
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Linguaggio �strongly-typed�
Tipi di variabili in byte
1 // con t i nua . . .2
3 // Stampo i v a l o r i e l ' o c cupaz i one i n BYTE d e l l a memoria4 p r i n t f ( "mio char = %c \ t \ t − s i z e d e l cha r = %d \n" ,
mio_char , s i z e o f ( mio_char ) ) ;5 p r i n t f ( "mio i n t = %d \ t \ t − s i z e d e l l i n t = %d \n" ,
mio_int , s i z e o f ( mio_int ) ) ;6 p r i n t f ( "mio f l o a t = %f \ t − s i z e d e l f l o a t = %d \n" ,
mio_f loat , s i z e o f ( mio_f loat ) ) ;7 p r i n t f ( "mio doub l e = %f \ t − s i z e d e l doub l e = %d \n" ,
mio_double , s i z e o f ( mio_double ) ) ;8
9 r e t u r n (0 ) ; // pe r t e rm i n a r e i l main co r r e t t amen t e10 }
Output:
mio char = a - size del char = 1mio int = -19 - size dell int = 4mio �oat = 19.048800 - size del �oat = 4mio double = 19.048800 - size del double = 8
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Linguaggio �strongly-typed�
Stati di formattazione
Le funzioni di input/output (per stampare/acquisire variabili) come
Ï printf ( �stringa di testo %formato�, nome_variabile);
Ï scanf ( �%formato�, &nome_variabile);
esplicitano il formato delle variabili con le abbreviazioni:
tipo formato esempio
char c astring s ciao_mondoint d (oppure i) -200
unsigned int u 200notazione scienti�ca e (oppure E) -2 e2 (oppure -2E2)
�oat f 200.14double f (oppure lf) 200.14address p 0x7a�0918
Sono poi comodi:\n = newline \t = tab
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Linguaggio �strongly-typed�
Costanti
Possono servire delle variabili �non variabili�, il cui valoresia costante per tutto il programma.
1 #i n c l u d e <s t d i o . h>2 // d e f i n i s c o qu i l e c o s t a n t i3 #de f i n e k_Nmax 10004 #de f i n e k_WarningMess "ATTENZIONE − "5
6 i n t main ( )7 {8 i n t N;9 p r i n t f ( "Quant i numer i devo sommare? \n" ) ;
10 s c a n f ( "%d" , &N) ;11 i f ( N > k_Nmax )12 {13 p r i n t f ( "%s v a l o r e immesso t roppo a l t o \n" ,
k_WarningMess ) ;14 }15 e l s e16 // . . .17 r e t u r n (0 ) ;18 }
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Cenni di compilazione
Struttura di un generico programma C (1)
1 #i n c l u d e <l i b r e r i e_d i_C . h>2 #i n c l u d e " a l t r e _ l i b r e r i e . h"3 #de f i n e macro t e s t o4
5 i n t main ( i n t argc , cha r *
a rgv [ ] )6 {7 // D i c h i a r o l e v a r i a b i l i
l o c a l i8 i n t a , b ;9
10 // Corpo d e l programma11 a = 2 ;12 b = a + 5 ;13
14 // comando d i c h i u s u r a15 r e t u r n (0 ) ;16 }
# introduce direttive per ilpreprocessore, quali
Ï includere librerie di C (header�le .h, standard di C)
Ï includere librerie personali (ilcompilatore cerca nellacartella locale altri �le .h)
Ï de�nire macro (costantisimboliche), sostituendoprima della compilazione lechiamate a �macro� con�testo�
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Cenni di compilazione
Struttura di un generico programma C (2)
1 #i n c l u d e <l i b r e r i e_d i_C . h>2 #i n c l u d e " a l t r e _ l i b r e r i e . h"3 #de f i n e macro t e s t o4
5 i n t main ( i n t argc , cha r *
a rgv [ ] )6 {7 // D i c h i a r o l e v a r i a b i l i
l o c a l i8 i n t a , b ;9
10 // Corpo d e l programma11 a = 2 ;12 b = a + 5 ;13
14 // comando d i c h i u s u r a15 r e t u r n (0 ) ;16 }
La linea 5 �dichiara� il main ,come una function
Ï il cui corpo é racchiuso da {e } (righe 6 e 16)
Ï di tipo int, per cui restituisceun valore intero (per esempio0, riga 15)
Ï che accetta eventuali dati diinput, di tipo int e char∗
Ï che usa variabili locali (comea e b)
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Cenni di compilazione
La compilazione di un programma in sorgente.c
La compilazione di un programma C avviene in due passi:
1) nel preprocessing vengono valutate le linee con #, ossia si cercano lelibrerie da includere, le si includono e si sostituiscono nel testo lemacro
2) nella compilazione vera e propria, dal programma cosí trasformato siottiene il �le eseguibile.
Concretamente
Ï apro il Terminale (saró nella mia cartella �home folder�)
Ï mi posiziono nella cartella dove ho salvato il �le sorgente.c (concd scendo nell'albero delle cartelle sull'hard disk)
poi uso il comando
$ gcc sorgente.c
che crea di default l'eseguibile chiamato a.out
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Cenni di compilazione
gcc: GNU Compiler Collection
Se voglio dare all'eseguibile un nome diverso (eseguibile1), compilocon
$ gcc -o eseguibile1 sorgente.c
poi lo eseguo con
$ ./eseguibile1
Comandi utili da Terminale
$ echo $?
mostra il valore restituito dal programma (lo zero, se usiamoreturn(0); a �ne codice)
$ ls
mostra i �le nella cartella corrente
$ gcc -Wall -o eseguibile1 sorgente.c
compila abilitando tutti i messaggi di warning che il gcc fornisce(molto utile!!!)
$ gcc -Wall -g -o eseguibile1 sorgente.c
serve per e�ettuare il debug con informazioni utili
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Cenni di compilazione
Note
Ï la dichiarazione assegna una variabile locale a un tipo di dato(fornisce attributi basilari: nome e tipo)ex: double fun(int, double);
Ï la definizione dice al compilatore DOVE creare lo storage per lavariabile (fornisce dettagli al compiler per il linker: dove salvare ecosa fa function)ex: double fun(int i, double d) {return (i+d); }
Ï l'inizializzazione é la de�nizione assieme all'associare un valoreex: int a = 5;
Ï l'assegnamento é l'attribuire un nuovo valore a una variabile giáde�nita
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Cosa vediamo adesso
Cosa é il CPanoramicaConfronto con Matlab
Come in Matlab...SintassiBlocchi
Diversamente da Matlab...Linguaggio �strongly-typed�Cenni di compilazione
Accedere alla memoriaAltri limiti di MatlabI puntatoriAllocazione dinamica
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Altri limiti di Matlab
�Consider preallocating for speed�
...
...
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Altri limiti di Matlab
�MATLAB to become unresponsive�
Out of memoryIntroduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
I puntatori
La variabile puntatore
In C possiamo vedere dove le variabili sono salvate nella memoria.L'indirizzo di una variabile si recupera col carattere speciale &, mentreuna variabile de�nita per contenere un indirizzo si dichiara con tipo* edé detta puntatore alla variabile.Nel printf si usa la �p� di pointer (ma lo si puó convertire in int usando�d�, oppure in unsigned int usando �u�).
1 cha r mio_char = ' a ' ;2 i n t mio_int = −19;3 f l o a t mio_f loat = 19 . 0488 ;4 doub l e mio_double = 19 . 0488 ;5
6 p r i n t f ( " &char = %p \n" , &mio_char ) ;7 p r i n t f ( " &i n t = %p \n" , &mio_int ) ;8 p r i n t f ( " &f l o a t = %p \n" , &mio_f loat ) ;9 p r i n t f ( " &doub l e = %p \n" , &mio_double ) ;
10
11 i n t * i nd_ in t = &mio_int ;12 p r i n t f ( " i nd_in t = %p \n" , i nd_ in t ) ;13 p r i n t f ( " i nd_in t = %u \n" , i nd_ in t ) ;14 p r i n t f ( " * i nd_ in t = %u \n" , * i nd_ in t ) ;
Output:&char = 0000000F72B4BAF4
&int = 0000000F72B4BB14
&float = 0000000F72B4BB34
&double = 0000000F72B4BB58
ind_int = 0000000F72B4BB14
ind_int = 1295824836
*ind_int = 19
↑ Quest'ultimo é l'oggetto puntato
dal puntatore ind_int, ossia il
contenuto della variabile mio_int
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
I puntatori
De�nire un vettore: allocazione statica
In C, un vettore si de�nisce tramite un puntatore a �dove� inizia l'array.Un semplice esempio:
1 i n t A [ 3 ] = { 10 , 20 , 30 } ;2
3 p r i n t f ( " A = %d \n" , A) ;4 p r i n t f ( " A [ 0 ] = %d , A [ 1 ] = %d ,
A [ 2 ] = %d \n" , A [ 0 ] , A [ 1 ] , A [ 2 ] ) ;5 p r i n t f ( " &A [ 1 ] = %d \n" , &A [ 1 ] ) ;6 p r i n t f ( " (A+2) = %d \n" , (A + 2) ) ;7 p r i n t f ( " *A = %d \n" , *A) ;8 p r i n t f ( " *(A+2) = %d \n" , *(A + 2) ) ;
Output:A = 2138043480
A[0] = 10 , A[1] = 20 ,
A[2] = 30
&A[1] = 2138043484
(A+2) = 2138043488
*A = 10
*(A+2) = 30Note:
Ï gli indici partono da 0
Ï l'oggetto A é l'indirizzo del primo elemento del vettore A[0]
Ï *A é quanto puntato dal puntatore A, ossia il contenuto.
Ï l'indirizzo del secondo elemento A[1] é esattamente 4 byte oltrequello di A[0] (perché 4 byte = sizeof(int))
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
I puntatori
De�nire un vettore: che dimensione?
Bisogna sempre esplicitare la lunghezza dell'array, nella fase didichiarazione. E se non so quanto deve essere lungo?
1 #i n c l u d e <s t d i o . h>2 #de f i n e k_NMAX 1003
4 i n t main ( )5 {6 i n t N, i ;7 p r i n t f ( " D i g i t a i l v a l o r e d i N: " ) ;8 s c a n f ( "%d" , &N) ;9 i n t A [k_NMAX] , B[k_NMAX] ; // c r eo i
p u n t a t o r i10
11 i f (N <= k_NMAX)12 {13 // Riempio s o l o N component i14 f o r ( i =0; i<N; i++)15 {16 A[ i ] = i ; B [ i ] = 3* i ;17 }18 . . .19 }20 r e t u r n (0 ) ;21 }
B int A[N], B[N];
(in riga 9) non éconsentito!Conviene de�nire unacostante e usarla pertutti i vettori delprogramma
M La dimensionepreimpostatapotrebbe esseretroppo grande opiccola
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Allocazione dinamica
Problemi con array di grandi dimensioni
Vediamo l'esempio con una matrice di double:
1 . . .2 #de f i n e k_NMAX 1003 . . .4 doub l e ma t r i c e [k_NMAX] [k_NMAX] ;5 mat r i c e [ 0 ] [ 0 ] = 4 . 3 6 ;6 mat r i c e [ 9 9 ] [ 9 9 ] = 23 . 3 21 ;7
8 p r i n t f ( "\ t ma t r i c e [ 0 ] [ 0 ] = %f \n" , ma t r i c e [ 0 ] [ 0 ] ) ;9 p r i n t f ( "\ t ma t r i c e [ 9 9 ] [ 9 9 ] = %f \n" , ma t r i c e [ 9 9 ] [ 9 9 ] ) ;
10 . . .
,→ Questo funziona!M ma usando k_NMAX = 500, ho errori in compilazione!
Per potere usare piú memoria, si utilizza l'allocazione dinamica divariabili, che permette una gestione piú manuale della memoria arun-time.
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Allocazione dinamica
L'allocazione dinamica con la libreria <stdlib.h>
La libreria <stdlib.h> mette a disposizione le 4 funzioni principali per lagestione dinamica degli array.
Ï ptr = (cast-type*) malloc(byte-size);alloca lo spazio richiesto e restituisce il puntatore al primo byteallocato (che é una variabile type*)
Ï ptr = (cast-type*) calloc(n, element-size);come malloc ma crea n blocchi contigui e della stessa dimensione,poi inizializza a zero gli elementi
Ï free(ptr);dealloca lo spazio indicato dal puntatore (non avviene in automatico)
Ï ptr = realloc(ptr, newsize);cambia la dimensione dello spazio precedentemente allocato.
Esempio:
1 i n t num ;2 doub l e * vec_e r ro r e ;3 num = 20 ;4 vec_e r ro r e = ( doub l e *) ma l l o c (num * s i z e o f ( doub l e ) ) ;5 vec_e r ro r e [ 0 ] = 1 . 0 ;6 . . .7 f r e e ( v e c_e r ro r e ) ;
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Allocazione dinamica
La malloc per una matrice
Continuiamo l'esempio con una matrice di double:
1 i n t i , N = 5000 ;2 i n t rows = N;3 i n t c o l s = N;4
5 doub l e **mat r i c eB i g = ( doub l e **) ma l l o c ( rows * s i z e o f ( doub l e *) ) ;6 f o r ( i = 0 ; i < Nmax ; i++)7 {8 mat r i c eB i g [ i ] = ( doub l e *) ma l l o c ( c o l s * s i z e o f ( doub l e ) ) ;9 }
10
11 mat r i c eB i g [ 0 ] [ 0 ] = 4 . 3 6 ;12 mat r i c eB i g [ 4 9 9 9 ] [ 4 9 9 9 ] = 292635 .24 ;13
14 p r i n t f ( "\ t ma t r i c e [ 0 ] [ 0 ] = %f \n" , ma t r i c eB i g [ 0 ] [ 0 ] ) ;15 p r i n t f ( "\ t ma t r i c e [ 4 9 9 9 ] [ 4 9 9 9 ] = %f \n" , ma t r i c eB i g [ 4 9 9 9 ] [ 4 9 9 9 ] ) ;
, questo funziona e non necessita di costanti
M serve una �doppia� mallocÏ linea 5: alloca il puntatore a un vettore di rows elementi doubleÏ linea 8: assegno a ciascun elemento matriceBig[i] l'indirizzo di un
vettore di cols numeri double
Introduzione al C - lezione 1 E. Morotti
Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria
Allocazione dinamica
malloc in memoria
Costruisco una matrice 3x3 di interi:
1 i n t **C = ( i n t **) ma l l o c (3 * s i z e o f ( i n t *) ) ;2
3 f o r ( i = 0 ; i < 3 ; i++) {4 C[ i ] = ( i n t *) ma l l o c (3 * s i z e o f ( i n t ) ) ;5 }
Ï C = 2122054544&C = 2316300024sizeof(C) = 8
Ï C+1 = 2122054552&C[1] = 2122054552
Ï C+2 = 2122054560&C[2] = 2122054560
Ï *C = 2122038656C[0] = 2122038656
Ï &C[0][0] = 2122038656&C[0][1] = 2122038660&C[0][2] = 2122038664
Ï *(C+1) = 2122037536C[1] = 2122037536
Ï *(C+2) = 2122037456C[2] = 2122037456
Introduzione al C - lezione 1 E. Morotti