Presentazione%20di%20PowerPoint - PowerPoint PPT Presentation

About This Presentation
Title:

Presentazione%20di%20PowerPoint

Description:

Title: Presentazione di PowerPoint Author: roberto De Virgilio Last modified by: Cabibbo Luca Created Date: 2/6/2003 1:33:33 PM Document presentation format – PowerPoint PPT presentation

Number of Views:140
Avg rating:3.0/5.0
Slides: 99
Provided by: roberto307
Category:

less

Transcript and Presenter's Notes

Title: Presentazione%20di%20PowerPoint


1
Corso di Algoritmi e Strutture Dati
APPUNTI SUL LINGUAGGIO C Introduzione al
C Lezione I
2
Ing. Roberto De Virgilio
e-mail
rde79_at_yahoo.com
sito Web
http//mais.dia.uniroma3.it/rodevirg
3
Perché 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

4
Linguaggi 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

5
Il 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?

6
Sistema 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.

7
Paradigmi 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
8
Programma Java
Oggetto Software
Oggetto Software
Classe Principale
Oggetto Software
Oggetto Software
9
Il 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
10
Le 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.

11
Il 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)

12
Lambiente C
Programma creato con leditor
Editor
Disk
Fase 1
13
Un semplice programma C
/ Programma che stampa un saluto / include
ltstdio.hgt main() printf(Hello
World!\n)
14
Un 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.
15
Un 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
16
Un 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
17
Un 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
18
Caratteri speciali
 
   
19
Variabili 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)
20
Variabili 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).
21
Tipi 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)
22
Input/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.
23
Argomenti di printf e scanf
printf ( "ltstringagt" , ltelenco argomentigt )
scanf ( "ltstringagt" , ltelenco argomentigt )
24
Input/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)
25
Argomenti 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 ).

26
scanf ( 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 )
27
Argomenti di printf e scanf
28
Assegnazione 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
29
Blocchi in C
while (ngt1) fat fat n n n-1
printf(Risultato d\n,fat)
Unistruzione composta è delimitata da un blocco
30
Operatori ed espressioni in C
31
Operatori ed espressioni in C
32
Operatori ed espressioni in C
33
Operatori ed espressioni in C
34
Istruzioni 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)

35
Istruzioni 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.

36
Istruzioni 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

37
Istruzioni 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
38
Istruzioni di controllo iterative
  • Es.
  • Calcoliamo il fattoriale di un numero i

39
Istruzioni 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

40
Costanti 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()
  • .

41
Esempio 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

42
Esempio 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
43
Esempio di programma C
  • Costruzione di un procedimento risolutivo
    algoritmo

a,b op
op ?

-

/
ab
a-b
ab
a/b,ab
44
Esempio 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
45
Esempio 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)
46
Esempio 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)
48
Funzioni 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, )

49
Funzioni 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.
50
Funzioni 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)

51
Visibilità 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
52
Puntatori
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
53
Operazioni 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 /

54
Operazioni sui Puntatori
55
Come 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
56
Gestione 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).

57
Gestito (dinamicamente) dallutente
heap

Gestito (dinamicamente) dallelaboratore
stack
58
heap

void Esempio (int x) int y main()
float f -12,3 Esempio(90)
stack
59
heap

void Esempio (int x) int y main()
float f -12,3 Esempio(90)
stack
-12,3
60
heap

void Esempio (int x) int y main()
float f -12,3 Esempio(90)
stack
90
-12,3
61
heap
lo scopriremo piu avanti

stack
62
Ricorsione
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.
63
Array
  • 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/

64
Array
  • 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)
65
Regole 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.

66
Dichiarazione 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 /
67
Dichiarazione 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 /
68
Array 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)
69
Programma 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")
70
Programma 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
71
Programma 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")
72
Utilizzo 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.

73
I 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
74
Linguaggio 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.

75
Dinamica dei puntatori
y
int y5 int yPunt
5
yPunt
Memoria
y
yPunt
5
600000
700000
76
Dinamica dei puntatori
y
int y5 int yPunt yPunt y
5
yPunt
Memoria
y
yPunt
700000
5
600000
700000
77
Linguaggio C Puntatori
int a2, y int pa
paa
78
Linguaggio 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
79
Linguaggio 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 /
80
Linguaggio C Puntatori
81
Linguaggio C Puntatori
82
Linguaggio C Puntatori
int number 5 printf(d,Value(number))
int Value(int n) return nnn
Stampa 125
83
Linguaggio C Puntatori
84
Linguaggio C Puntatori
int number 5 Reference(number)
void Reference(int nP) nP nP nP
nP
Number rimane con valore 125
85
Puntatori 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/

86
Aritmetica 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.
87
Aritmetica 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.
88
Aritmetica 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.
89
Array 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.
90
Array 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.
91
Array 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.
92
Array 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.

93
Array 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
94
I vettori multidimensionali
95
Strumenti 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

96
Pseudo-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

97
Pseudo-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
Write a Comment
User Comments (0)
About PowerShow.com