Title: Presentazione%20di%20PowerPoint
1 Corso di Algoritmi e Strutture Dati
APPUNTI SUL LINGUAGGIO C Introduzione al
C Lezione I
2Ing. Roberto De Virgilio
e-mail
rde79_at_yahoo.com
sito Web
http//mais.dia.uniroma3.it/rodevirg
3Perché scriviamo programmi
- Abbiamo un problema da risolvere
- Dobbiamo progettare una soluzione progettiamo un
algoritmo - Vogliamo far eseguire tale algoritmo dal nostro
elaboratore scriviamo un programma
4Linguaggi macchina, assembley e di alto livello
- Linguaggi macchina lingua naturale di un
particolare computer, esso consiste di sequenze
di numeri (1 o 0) e dipende dalla macchina - 0000111101
- 1111110001
- 0011001111
- Linguaggi assembly abbreviazioni simili
allinglese, per rappresentare le operazioni
elementari del computer - LOAD N
- ADD X
- Linguaggi ad alto livello singole istruzioni
contenenti notazioni matematiche utilizzate
comunemente - x n 2
5Il linguaggio C
- Il C fu progettato ed implementato da Dennis
Ritchie ed è un linguaggio imperativo ad alto
livello, sviluppato nei laboratori della ATT
Bell Laboratories, adatto per lo sviluppo dei
sistemi operativi. -
- Benché implementato su un sistema operativo UNIX,
questo linguaggio non fu scritto per un
particolare sistema operativo ma può essere
utilizzato sotto sistemi operativi diversi come
UNIX, DOS, OS, POWER PC, ecc
- Sistema operativo?
- Linguaggio imperativo?
6Sistema operativo
- è un programma di controllo che svolge operazioni
fondamentali al funzionamento dellelaboratore - risiede in una memoria interna permanente e
interpreta i comandi di utente che richiedono
diversi servizi (es. la visualizzazione, la
stampa o la copiatura di un file, il
raggruppamento logico dei file in una directory o
l'esecuzione di un programma). - si occupa di gestire tutte le periferiche del
nostro pc, tutti i processi, e tutti i dati di
input/output.
7Paradigmi di programmazione
Esistono diversi approcci alla programmazione,
chiamati paradigmi di programmazione Programmazi
one imperativa un programma specifica le azioni
che devono essere eseguite in sequenza per
calcolare i risultati a partire dai dati in
ingresso. Programmazione orientata agli
oggetti un programma modella una realtà di
interesse come una collezione di oggetti software
che cooperano
8Programma Java
Oggetto Software
Oggetto Software
Classe Principale
Oggetto Software
Oggetto Software
9Il linguaggio C
Il C è un linguaggio di programmazione di tipo
imperativo
un programma è una lista di istruzioni, di imperi
che il calcolatore deve eseguire.
Versione standard del C ANSI/ISO 9899
10Le librerie in C
- I programmi scritti in C consistono in moduli
chiamati funzioni esiste una ricca collezione di
funzioni già esistenti chiamata libreria standard
del C. - Obiettivo riusabilità del software approccio di
costruzione a blocchi per creare programmi
inutile ricostruire funzioni già esistenti, ma
riusare ciò che già esiste fondendolo con ciò che
viene costruito ex-novo. - Obiettivo efficienza utilizzare le funzioni
della libreria ANSI potrà migliorare lefficienza
del programma. - Obiettivo portabilità utilizzare le funzioni
ANSI invece di scrivere le proprie versioni.
11Il linguaggio C
- Il C è un tipico linguaggio di programmazione
strutturata scrittura di programmi chiari, dalla
correttezza dimostrabile e semplici da
modificare. - Il linguaggio C permette di scrivere programmi
molto compatti - Il linguaggio C permette di accedere e gestire
direttamente le risorse hardware dellelaboratore
(in maniera indipendente dallarchitettura)
12Lambiente C
Programma creato con leditor
Editor
Disk
Fase 1
13Un semplice programma C
/ Programma che stampa un saluto / include
ltstdio.hgt main() printf(Hello
World!\n)
14Un semplice programma C
/ Programma che stampa un saluto / include
ltstdio.hgt main() printf(Hello
World!\n)
Listruzione è chiamata direttiva di
compilazione e serve ad includere informazioni
relative a una libreria predefinita del C che
contiene le funzioni di input/output.
15Un semplice programma C
/ Programma che stampa un saluto / include
ltstdio.hgt main() printf(Hello
World!\n)
La parola main() identifica il programma
principale e rappresenta il punto di ingresso del
programma allinizio della sua esecuzione
16Un semplice programma C
/ Programma che stampa un saluto / include
ltstdio.hgt main() printf(Hello
World!\n)
Si possono specificare commenti racchiudendoli
tra i simboli / e /
Ogni istruzione è conclusa dal simbolo ltltgtgt
Le parentesi graffe delimitano un blocco
17Un semplice programma C
/ Programma che stampa un saluto / include
ltstdio.hgt main() printf(Hello
World!\n)
Per la stampa su video printf e tra apici la
stringa costante
Esistono sequenze nelle stringhe che indicano
caratteri speciali per esempio \n indica il
carattere di new line che quando viene incontrato
sposta il carattere successivo alla riga seguente
18Caratteri speciali
19Variabili in C
/ Programma per il calcolo del fattoriale
/ include ltstdio.hgt main() int n,fat
printf(Calcolo del fattoriale di)
scanf(d,n) fat 1 while (ngt1)
fat fat n n n-1
printf(Risultato d\n,fat)
20Variabili in C
/ Programma per il calcolo del fattoriale
/ include ltstdio.hgt main() int n,fat
printf(Calcolo del fattoriale di)
scanf(d,n) fat 1
Una variabile viene dichiarata scrivendo il tipo
seguito dal nome della variabile. Una variabile
può essere inizializzata allatto della sua
dichiarazione (int a1).
21Tipi di dato elementari
In C non esiste il tipo boolean Si usa la
convenzione che lo zero rappresenta il valore
falso e luno il valore vero (tutti i valori
diversi da zero rappresentano il vero)
22Input/Output
/ Programma per il calcolo del fattoriale
/ include ltstdio.hgt main() int n,fat
printf(Calcolo del fattoriale di)
scanf(d,n) fat 1
La lettura e la stampa di variabili richiede
spesso la specifica del loro formato le
istruzioni printf, scanf hanno in genere più
argomenti.
23Argomenti di printf e scanf
printf ( "ltstringagt" , ltelenco argomentigt )
scanf ( "ltstringagt" , ltelenco argomentigt )
24Input/Output
La lettura e la stampa di variabili richiede
spesso la specifica del loro formato le
istruzioni printf, scanf hanno in genere più
argomenti.
/ Programma per il calcolo del fattoriale
/ include ltstdio.hgt main() int n,fat
printf(Calcolo del fattoriale di)
scanf(d,n) fat 1 ----
printf(Risultato d\n,fat)
25Argomenti di printf e scanf
- Il primo è una stringa di caratteri (da stampare
per la printf) nella quale ogni indica il punto
in cui vanno sostituiti, nellordine, gli
argomenti che seguono - Il carattere che segue il simbolo indica il
tipo dellargomento (d indica un valore intero) - Gli altri argomenti specificano le variabili di
input/output (quelle di input sono precedute dal
simbolo speciale ).
26scanf ( d , n )
Assegna alla variabile n largomento inserito
Tipo di argomento da inserire
Stampa nel punto indicato il valore contenuto
dalla variabile fat
Tipo di argomento da stampare
printf ( Risultato d \n , fat )
27Argomenti di printf e scanf
28Assegnazione in C
/ Programma per il calcolo del fattoriale
/ include ltstdio.hgt main() int n,fat
printf(Calcolo del fattoriale di)
scanf(d,n) fat 1
Listruzione di assegnazione si indica con il
simbolo
29Blocchi in C
while (ngt1) fat fat n n n-1
printf(Risultato d\n,fat)
Unistruzione composta è delimitata da un blocco
30Operatori ed espressioni in C
31Operatori ed espressioni in C
32Operatori ed espressioni in C
33Operatori ed espressioni in C
34Istruzioni di controllo condizionali
- Istruzione condizionale if
- if ( ltesprgt ) ltistr1gt
- else ltistr2gt
- Se ltesprgt è vera viene eseguito ltistr1gt
altrimenti verrà - eseguito ltistr2gt
- Es. if (agtb)
- printf(il maggiore è d, a)
- else
- printf(il maggiore è d, b)
-
35Istruzioni di controllo condizionali
- Istruzione condizionale switch
- switch ( ltesprgt )
- case ltcostante1gt ltistr1gt break
- case ltcostante2gt ltistr2gt break
- .
- default ltistrgt
-
- Se ltesprgt vale ltcostante ngt vera viene eseguito
ltistr ngt in tutti gli altri casi (caso di
default) verrà eseguito ltistrgt. - Per convenzione dopo listruzione che si vuole
eseguire si usa il comando break per uscire
dallistruzione condizionale. -
-
36Istruzioni di controllo condizionali
- Es.
- Vogliamo impostare il numero di giorni n di cui
è fatto ogni mese - switch ( mese )
- case 2 n28 break
- case 4 case 6
- case 9 case 11 n30 break
- default n31
-
-
-
37Istruzioni di controllo iterative
- Istruzione while
- while ( ltesprgt )
- ltistrgt
- oppure
- do ltistrgt
- while ( ltesprgt )
- Fino a che ltesprgt è vera viene eseguito ltistrgt.
-
Prima valuta espr e poi esegue istr
Prima esegue istr poi valuta espr
38Istruzioni di controllo iterative
- Es.
- Calcoliamo il fattoriale di un numero i
-
-
39Istruzioni di controllo iterative
- Istruzione for
- for ( ltespr_initgt ltespr_testgt ltespr_incrgt
) - ltistrgt
- corrisponde a
- ltespr_initgt
- while ( ltespr_testgt )
- ltistrgt
- ltespr_incrgt
-
- Es. for ( in igt1 i-- ) fat i
-
40Costanti simboliche in C
- define ltnomegt ltvaloregt
- Si definiscono facendo uso della direttiva
define che va messa nellintestazione del
programma. - Es.
-
- define PIGRECO 3.14
- define N 100
- define TRUE 1
- define FALSE 0
- main()
- .
-
-
41Esempio di programma C
- Lettura ed analisi del problema deduzione dei
dati di input - Costruzione di un procedimento risolutivo
algoritmo - Traduzione delle istruzioni dellalgoritmo in
- linguaggio C
42Esempio di programma C
- Lettura ed analisi del problema deduzione dei
dati di input
Scrivere un programma C che calcoli le quattro
operazioni sui numeri interi. Input a op b ,
in cui a e b sono due interi e op è una
delle quattro operazioni ,-,,/
Oss. La divisione sui numeri interi emette anche
il resto
43Esempio di programma C
- Costruzione di un procedimento risolutivo
algoritmo
a,b op
op ?
-
/
ab
a-b
ab
a/b,ab
44Esempio di programma C
- Traduzione delle istruzioni dellalgoritmo in
- linguaggio C
Un programma C consta di tre parti
fondamentali Intestazione spazio dedicato agli
include per includere librerie Dichiarazioni
funzioni, costanti, Blocco principale il
main() in cui elencare le istruzioni
45Esempio di programma C
- Traduzione delle istruzioni dellalgoritmo in
- linguaggio C
/ Programma che calcola le quattro operazioni
sui numeri interi / include ltstdio.hgt
main () int a,b char op
printf(Operazione su interi) scanf(d c
d, a,op,b) printf(Risultato\t)
46Esempio di programma C
- Traduzione delle istruzioni dellalgoritmo in
- linguaggio C
/ Calcolo e stampa / switch (op)
case printf(d,ab) break
case - printf(d,a-b) break
case printf(d,ab)
break case / printf(d con resto di
d,a/b,ab) break default
printf(Operatore sconosciuto)
47 / Programma che calcola le quattro
operazioni sui numeri interi / include
ltstdio.hgt main () int a,b char op
printf(Operazione su interi) scanf(d c
d, a,op,b) printf(Risultato\t) /
Calcolo e stampa / switch (op) case
printf(d,ab) break case
- printf(d,a-b) break
case printf(d,ab) break
case / printf(d con resto di d,a/b,ab)
break default printf(Operatore
sconosciuto)
48Funzioni in C
- Una funzione è un blocco di istruzioni, che ha
parametri in ingresso (parametri formali) e
restituisce un risultato. - lttipogt ltNome funzionegt (lista parametri)
-
- blocco istruzioni
-
- return ltrisultatogt
-
- Lista parametri (lttipogt ltnomegt, lttipogt
ltnomegt, )
49Funzioni in C
- Es.
-
- int Fatt(int n)
- int ris
- ris 1
- while (ngt1)
- ris risn
- n--
-
- return ris
-
-
Una funzione viene attivata mediante una chiamata
nella quale vengono passati i parametri attuali
che devono corrispondere in numero, ordine e tipo
ai parametri formali.
50Funzioni in C
- ATTENZIONE
- non è possibile nidificare funzioni
- int Fatt(int n)
- int Fatt2(int n2)
- non è possibile passare parametri per
riferimento - int Fatt(int n)
- non esistono procedure (solo funzioni)
-
- Fatt(int n)
51Visibilità delle variabili
Tutte le variabili sono visibili solo allinterno
del blocco in cui sono dichiarate. Una variabile
definita nellintestazione è visibile in tutto il
file variabile globale. Si può far riferimento
anche a variabili (globali) definite in altri
file tramite la parola chiave extern. /
file p1.c / int i / file p2.c /
include p1.c extern int i
52Puntatori
Permettono la gestione di strutture dinamiche
(create e distrutte sotto il controllo
dellutente). Un puntatore è una variabile che
contiene lindirizzo di memoria di unaltra
variabile. Dichiarazione in C un puntatore si
dichiara anteponendo al nome di una variabile il
simbolo . int i char
c float n
53Operazioni sui Puntatori
- loperatore applicato ad una variabile
restituisce il puntatore ad - essa
- loperatore applicato a un puntatore
restituisce la variabile - puntata
- int i,j
- int k,l
-
- k i / k punta alla variabile i
/ - l j / nella variabile puntata da
l - va il contenuto di j /
- k l / nella variabile puntata
da k - va il contenuto della
variabile - puntata da l /
- k l / k e l puntano alla stessa
- variabile /
54Operazioni sui Puntatori
55Come ovviare ai limiti delle funzioni
Procedure le definiamo come funzioni che
restituiscono il tipo void void
PariDispari(int i) if ((i2) 0)
printf(d è un numero pari,i) else
printf(d è un numero dispari,i)
Passaggi per riferimento non passiamo la
variabile da modificare ma il suo puntatore.
void SommaProd(int i, int j, int s, int p)
s ij p ij
56Gestione della memoria
- Durante lesecuzione di un programma C la memoria
viene gestita in due maniere. - Gestione statica viene allocata dal sistema
operativo unarea di - memoria fissa per tutta lesecuzione del
programma. - Gestione dinamica vengono allocate due aree di
memoria che - vengono usate quando necessario e rese
disponibili per succesivi - usi
- 1) lo stack quando una funzione viene
invocata vengono allocate automaticamente tutte
le variabili locali e i parametri attuali sullo
stack in un record di attivazione
successivamente, quando lesecuzione della
funzione termina, il record di attivazione viene
cancellato e lo stack viene riportato nella
situazione in cui era prima dellinvocazione - 2) lo heap la gestione viene lasciata al
programmatore mediante creazione e distruzione
dinamica di variabili (tramite puntatori).
57Gestito (dinamicamente) dallutente
heap
Gestito (dinamicamente) dallelaboratore
stack
58heap
void Esempio (int x) int y main()
float f -12,3 Esempio(90)
stack
59heap
void Esempio (int x) int y main()
float f -12,3 Esempio(90)
stack
-12,3
60heap
void Esempio (int x) int y main()
float f -12,3 Esempio(90)
stack
90
-12,3
61heap
lo scopriremo piu avanti
stack
62Ricorsione
E possibile definire funzioni in C in maniera
ricorsiva. int Fatt(int n) if
(n0) return 1 else return
(nFatt(n-1)) main()
int fat,n0
scanf(d,n) fat Fatt(a)
La ricorsione viene gestita attraverso luso
opportuno dello stack ogni chiamata della
funzione ricorsiva genera un nuovo record di
attivazione (con memorizzazione dei parametri
attuali e allocazione di memoria delle variabili
locali) che maschera la precedente invocazione.
63Array
- Un array è una sequenza di elementi omogenei.
- Un array viene dichiarato in C scrivendo,
nellordine, il - tipo degli elementi, il nome dellarray, e le sue
- dimensioni.
- int c12 /vettore/
64Array
- Un vettore è un gruppo di posizioni (o locazioni)
di memoria correlate dal fatto che tutte hanno lo
stesso nome e tipo di dato.
Numero di posizione dellelemento allinterno del
vettore c
Nome del puntatore (da notare che tutti gli
elementi del puntatore hanno lo stesso nome, c)
65Regole generali su gli Array
- Il primo elemento di ogni vettore è lelemento
zero. - Il numero di posizione contenuto allinterno
delle parentesi quadre è detto indice. - non cè controllo sullaccesso a elementi non
esistenti.
66Dichiarazione e inizializzazione dei vettori
- I vettori occupano dello spazio in memoria. Il
programmatore specificherà il tipo di ogni
elemento e il numero di quelli richiesti da
ognuno dei vettori, così che il computer possa
riservare lappropriata quantità di memoria.
lt tipo gt lt nome dellarray gt dimensione
Uso lt nome dellarray gt indice
Oss. E importante notare la differenza tra
sesto elemento del vettore e lelemento sei
del vettore
c5 / il sesto elemento / c6 / elemento
sei del vettore /
67Dichiarazione e inizializzazione dei vettori
- I vettori occupano dello spazio in memoria. Il
programmatore specificherà il tipo di ogni
elemento e il numero di quelli richiesti da
ognuno dei vettori, così che il computer possa
riservare lappropriata quantità di memoria.
È possibile inizializzare un array in fase di
dichiarazione. In questo caso, per un vettore, la
specifica delle dimensioni è opzionale.
define M 3 define N 2 ... int cM int
lN int vet5 1, 2, 3, 4, 5 float r
1.4, 3.2, 5.4 / viene allocato un vettore di
tre elementi /
68Array come parametri di funzioni
- E possibile passare un array come parametro
formale di una funzione.
void leggiVettore(int aMAX, int n) void
scriviVettore(int aMAX, int n) void copia(int
a, int b, int n)
69Programma sui vettori
include ltstdio.hgt define MAX 10 define TRUE
1 define FALSE 0 void leggiVettore(int aMAX,
int n) int i for (i 0i lt ni)
scanf("d",ai) void scriviVettore(int
aMAX, int n) int i for (i 0i lt ni)
printf("d\t",ai) printf("\n")
70Programma sui vettori
void copia(int a, int b, int n) int
i for (i 0 i lt n i) ai bi int
cerca(int x, int aMAX, int n) int i0,
trovatoFALSE while ((i lt n) (!trovato)) if
(x ai) trovatoTRUE else i return
trovato
71Programma sui vettori
main() int n,x int aMAX,bMAX printf("dim.
vettore") scanf("i", n) leggiVettore(a,n)
copia(b,a,n) scriviVettore(b,n) printf("el. da
cercare") scanf("i",x) if
(cerca(x,a,n)TRUE) printf("trovato nel
vettore\n") else printf("non trovato\n")
72Utilizzo degli Array
- Ordinamento di vettori lordinamento dei dati è
una delle applicazioni più importanti nel campo
dellelaborazione si richiede la sistemazione
dei dati in un ordine particolare. -
- 1) Insertion sort
- 2) Quick sort
- 3) Merge sort
- 4) Bubble sort
- Ricerca nei vettori i programmatori lavoreranno
spesso con grandi quantità di dati immagazzinati
in vettori. A volte potrà essere necessario
determinare se un vettore contenga un elemento
che corrisponda a un dato valore chiave.
73I vettori multidimensionali
- E possibile definire strutture dati complesse
array multimensionali, che si muovono su più
indici. - lt tipo gt lt nome dellarray gt
Colonna 0
Colonna 1
a00
a01
Riga 0
a10
a11
int c22 int a 1, 2, 7, 12
Riga 1
1
2
7
12
74Linguaggio C Puntatori
- I puntatori sono il segreto della potenza e la
flessibilita' del C, perchè - - sono l'unico modo per effettuare alcune
operazioni - - servono a produrre codici sorgenti compatti ed
efficienti, anche se a volte difficili da
leggere. - In compenso, la maggior parte degli errori che
i programmatori - commettono in linguaggio C sono legati ai
puntatori. - In C ogni variabile è caratterizzata da due
valori - - un indirizzo della locazione di memoria in cui
sta la variabile, - - ed il valore contenuto in quella locazione di
memoria, che è il valore - della variabile.
- Un puntatore e' un tipo di dato, è una
variabile che contiene l'indirizzo in memoria di
un'altra variabile, cioè un numero che indica in
quale cella di memoria comincia la variabile
puntata.
75Dinamica dei puntatori
y
int y5 int yPunt
5
yPunt
Memoria
y
yPunt
5
600000
700000
76Dinamica dei puntatori
y
int y5 int yPunt yPunt y
5
yPunt
Memoria
y
yPunt
700000
5
600000
700000
77Linguaggio C Puntatori
int a2, y int pa
paa
78Linguaggio C Puntatori
ypa
Assegna ad y il contenuto della locazione
di memoria a cui punta pa
pa4 Assegna alla cella di memoria a cui punta
pa il valore 4
79Linguaggio C Puntatori
int Value(int n) return nnn / eleva
al cubo la variabile locale n /
void Reference(int nP) nP nP nP
nP / eleva al cubo la variabile
puntata /
80Linguaggio C Puntatori
81Linguaggio C Puntatori
82Linguaggio C Puntatori
int number 5 printf(d,Value(number))
int Value(int n) return nnn
Stampa 125
83Linguaggio C Puntatori
84Linguaggio C Puntatori
int number 5 Reference(number)
void Reference(int nP) nP nP nP
nP
Number rimane con valore 125
85Puntatori avvertenze
- Quando si usano i puntatori, è molto facile fare
confusione fra oggetti puntati e i loro
puntatori. - Un puntatore è un indirizzo di memoria, mentre
l'oggetto puntato è la zona di memoria che inizia
con questo l'indirizzo, ed è grande quanto basta
per contenere il tipo corrispondente. - le variabili di tipo puntatore sono anche esse
variabili, ossia zone di memoria. - Ad esempio la differenza fra una variabile int e
una variabile di tipo puntatore a intero è che la
prima contiene un valore intero, mentre la
seconda contiene un indirizzo, e in particolare
l'indirizzo iniziale della zona di memoria
associata a un intero. - Quando un puntatore viene dichiarato non punta a
nulla. Per poterlo utilizzare deve puntare a
qualcosa. - Es. int p p123 /errore/
- Usare
- int pint a
- pa p123 /corretto/
86Aritmetica degli indirizzi
Si possono fare operazioni aritmetiche intere con
i puntatori, ottenendo come risultato di far
avanzare o riportare indietro il puntatore nella
memoria, cioè di farlo puntare ad una locazione
di memoria diversa. Ovvero con i puntatori è
possibile utilizzare due operatori aritmetici e
- , ed ovviamente anche e --.
Il risultato numerico di un'operazione aritmetica
su un puntatore è diverso a seconda del tipo di
puntatore, o meglio a seconda delle dimensioni
del tipo di dato a cui il puntatore punta.
il compilatore interpreta diversamente la stessa
istruzione p a seconda del tipo di dato, in
modo da ottenere il comportamento seguente
Sommare un'unità ad un puntatore significa
spostare in avanti in memoria il puntatore di un
numero di byte corrispondenti alle dimensioni del
dato puntato dal puntatore.
87Aritmetica degli indirizzi
se p è un puntatore di tipo puntatore a char,
char p, poichè il char ha dimensione 1,
l'istruzione p aumenta effettivamente di
un'unita il valore del puntatore p, che punterà
al successivo byte.
Invece se p è un puntatore di tipo puntatore a
short int, short int p, poiché lo short int ha
dimensione 2 byte, l'istruzione p aumenterà
effettivamente di 2 il valore del puntatore p,
che punterà allo short int successivo a quello
attuale.
88Aritmetica degli indirizzi
In definitiva, ogni volta che un puntatore viene
incrementato passa a puntare alla variabile
successiva che appartiene al suo tipo base,
mentre un decremento lo fa puntare alla variabile
precedente. Quindi incrementi e decrementi di
puntatori a char fanno avanzare o indietreggiare
i puntatori a passi di un byte, mentre incrementi
e decrementi di puntatori a dati di dimensione K
fanno avanzare o indietreggiare i puntatori a
passi di K bytes.
89Array e Puntatori
Esiste un legame forte tra array e puntatori
dovuta al fatto che gli elementi di un array
vengono allocati in locazioni contigue della
memoria principale se si incrementa di uno un
puntatore p a un tipo T, il valore di p viene
incrementato di una quantità di byte pari alle
dimensioni di T (aritmetica dei puntatori).
Regole che legano gli array con i puntatori
il nome di un array coincide con lindirizzo
della prima componente del vettore il
puntatore ad un elemento dellarray si ottiene
incrementando di uno il puntatore allelemento
precedente.
90Array e Puntatori
Quindi, avendo definito int a5 abbiamo
che a e a0 sono la stessa cosa, a e a0
sono la stessa cosa, (a 3) e a3 sono la
stessa cosa (a 2) e a2 sono la stessa cosa.
91Array e Puntatori
Per i vettori (gli array monodimensionali di dati
di tipo tipo) l'accesso ai dati avviene secondo
queste modalità vetk, perchè in C, il nome di
un array è TRATTATO dal compilatore come un
puntatore COSTANTE alla prima locazione di
memoria dell'array stesso .
A differenza dei vettori però, l'area di memoria
a cui il puntatore punta non viene allocata
staticamente ma può essere allocata dinamicamente
mediante alcune funzioni che richiedono al
sistema operativo di riservare memoria e
restituire un indirizzo a quell'area di memoria
allocata, oppure può non essere allocata affatto.
92Array e Puntatori
char st10 char p p st
- Con questo assegnamento viene assegnato al
puntatore p l'indirizzo - della prima locazione di memoria del vettore. Da
questo momento in - avanti potremo accedere ai dati del vettore sia
tramite str, sia tramite - p esattamente negli stessi modi,
- - o tramite l'indicizzazione tra parentesi
quadre, - o tramite l'aritmetica dei puntatori.
- str10 (str10) p10 (p10) sono tutti modi
uguali per - accedere alla 11-esima posizione del vettore str
puntato anche da p.
93Array e Puntatori
char st10 char s a char p p s
st p
ERRORE NON E POSSIBILE REINDIRIZZARE IL
PUNTATORE DI UN ARRAY
st
NO
s
p
a
94I vettori multidimensionali
95Strumenti per la compilazione
- Ambiente Linux istallazione di una versione
quale Mandrake o Red Hat ci sono due ambienti di
sviluppo per C. - 1) Kdevelop ambiente di sviluppo per KDE
- http//www.kdevelop.org/index.html
- 2) Anjuta 0.1.9 ambiente di sviluppo per
Gnome - http//download.html.it/
-
- Ambiente Windows esiste il borland cBuilder o il
Devc, ambienti di sviluppo per linguaggi C/C. - http//www.borland.com/products/downloads/down
load_cbuilder.html - http//www.bloodshed.net/
- http//mais.dia.uniroma3.it/rodevirg
96Pseudo-Codifica di Algoritmi
- Pseudo-codifica strutturazione dellalgoritmo
astratto, facente uso di alcune convenzioni
proprie del linguaggio di programmazione - 1) indentazione rientro verso destra delle
righe, utile per indicare la struttura a blocchi
dello pseudocodice (per evitare luso di
parentesi). -
- 2) costrutti di chiusura delimitare
lalgoritmo con begin-end -
- 3) costrutti di controllo è possibile
impiegare i costrutti di controllo if-then-else - 4) costrutti iterativi è possibile impiegare
i costrutti iterativi while-do, for-to-do,
repeat-until
97Pseudo-Codifica di Algoritmi
- 5) assegnazioni vengono indicate con il
simbolo ? come ad esempio x ?4 -
- 6) commenti si usa a inizio riga il simbolo
? -
- 7) utilizzo di procedure si possono scrivere
procedure da utilizzare nellalgoritmo (i
parametri sono sempre passati per valore) - 8) utilizzo di array è possibile impiegare
array - 9) utilizzo di oggetti è possibile impiegare
oggetti (visti quindi come strutture complesse
con attributi o campi)
98 Corso di Algoritmi e Strutture Dati
APPUNTI SUL LINGUAGGIO C Introduzione al
C FINE