introduzione al c - lezione 1 -corsi.unibo.it/laurea-matematica/documents/c_lezione_1.pdf · (slide...

40

Upload: dinhnhan

Post on 15-Feb-2019

217 views

Category:

Documents


0 download

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

Cosa é il C Come in Matlab... Diversamente da Matlab... Accedere alla memoria

Fine!

Ci vediamo la prossima settimana,buon weekend ,

Introduzione al C - lezione 1 E. Morotti