Beruflich Dokumente
Kultur Dokumente
1
Allocazione dinamica: vantaggi
Come accedo
2
Tempo di vita
malloc / calloc
void *malloc(size_t n)
Restituisce un puntatore a n byte di memoria (non
inizializzata), NULL se non è possibile allocare memoria
3
Esempi
realloc
4
Realloc: esempio
#include<stdio.h>
main()
{
int x;
int *st=(int*) malloc(10*sizeof(int)); /* alloca spazio per 10
interi */
for(x=0;x<10;x++)
{
*(st+x)=x; /* inserisce dei valori nelle 10 locazioni */
}
st=(int*)realloc(st,20*sizeof(int)); /* realloca */
for(x=10;x<19;x++)
{
*(st+x)=0; /* inserisce valori nelle restanti locazioni */
}
for(x=0;x<20;x++)
printf("%d ",*(st+x));
printf("\n");
}
free
5
Tipici errori
Tipici errori
6
Semplice esempio
Leggiamo da uno stream una sequenza di n interi e poi
stampiamoli al contrario
Il primo intero che inseriamo è il numero di successivi
interi da considerare
Ad esempio se inserisco:
4
2
3
2
1
Stampo:
1
2
3
2
Implementazione
#include<stdio.h>
#include<stdlib.h>
main()
{
int i,x;
int *a;
if(scanf("%d",&i)==1)
{
a=(int *) malloc(i*sizeof(int));
for(x=0;x<i && scanf("%d",a+x)==1;x++);
x--;
for(;x>=0;x--)
printf("%d\n",a[x]);
free(a);
}
}
7
Esercizio
Vettori di puntatori
8
Vettore di puntatori a stringhe…
char *v[];
Hello
Ciao
Hola
Hello
Ciao
Hola
Esercizio
Realizziamo un programma che:
Legge linee da stdin, finché non trova EOF
Ordina le linee
Stampa le linee ordinate
9
Soluzione: declarations…
#include <stdio.h>
#include <string.h>
#define MAXLINES 5000 /* max #lines to be sorted */
int readlines(char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);
void qsort(char *lineptr[], int left, int right);
void swap(char *v[], int i, int j);
int partition(char *v[], int left, int right);
void cleanup(char *lineptr[], int nlines);
int getline(char *s,int maxlen);
… il main
main()
{
char *lineptr[MAXLINES];
int nlines;
if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
qsort(lineptr, 0, nlines-1);
writelines(lineptr, nlines);
cleanup(lineptr, nlines);
return 0;
} else {
printf("error: input too big to sort\n");
return 1;}
}
10
Funzione readlines
int readlines(char *lineptr[], int maxlines)
{
int len, nlines;
char *p, line[MAXLEN];
nlines = 0;
while(getLine(line,MAXLEN)!=EOF)
if(nlines >= maxlines ||
(p=(char*)malloc(strlen(line)*sizeof(char)))==NULL)
return -1;
else {
strcpy(p, line);
lineptr[nlines++] = p;
}
return nlines;
}
Discussione
11
getline
12
Come funziona?
QuickSort (A,p,q)
if p < q then
i ← Partition(A,p,q)
QuickSort(A,p,i-1)
QuickSort(A,i+1,q)
1 2 3 4 5 6 7 8 9 10 11 12
015 1365 2301 3458 4 423 57 754 853 7 615 9
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
13
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 5 6 0 8 4 2 7 4 3 7 1 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 5 6 0 8 4 2 7 4 3 7 1 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
14
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 5 6 0 8 4 2 7 4 3 7 1 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 6 0 8 4 2 7 4 3 7 5 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
15
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 6 0 8 4 2 7 4 3 7 5 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 6 0 8 4 2 7 4 3 7 5 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
16
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 6 0 8 4 2 7 4 3 7 5 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 5 0 8 4 2 7 4 3 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
17
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 5 0 8 4 2 7 4 3 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 5 0 8 4 2 7 4 3 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
18
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 5 0 8 4 2 7 4 3 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 5 0 8 4 2 7 4 3 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
19
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 8 4 2 7 4 5 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 8 4 2 7 4 5 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
20
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 8 4 2 7 4 5 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 8 4 2 7 4 5 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
21
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 8 4 2 7 4 5 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 5 4 2 7 4 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
22
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 5 4 2 7 4 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 5 4 2 7 4 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
23
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 5 4 2 7 4 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 5 4 2 7 4 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
24
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 4 4 2 7 5 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 4 4 2 7 5 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
25
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 4 4 2 7 5 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 4 4 2 7 5 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
26
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 4 4 2 7 5 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 4 4 2 7 5 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
27
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 4 4 2 7 5 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 4 4 2 5 7 8 7 6 9
x i j
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
28
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 4 4 2 5 7 8 7 6 9
x ij
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 4 4 2 5 7 8 7 6 9
x ij
Partition(A,p,q)
i ← p, j ← q, x ← A[p]
while i < j do
while A[j] > x do
j ← j-1
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
29
Partition(A, 1, 12)
1 2 3 4 5 6 7 8 9 10 11 12
5 1 3 0 4 4 2 5 7 8 7 6 9
x ij
Partition(A,p,q)
i ← p, j ← q, x ← A[p] A questo punto i=7
while i < j do Tutti gli elementi prima
di tale posizione sono minori di 5
while A[j] > x do Tutti gli elementi dopo
j ← j-1 sono maggiori o uguali di 5
if i < j then
swap(A[i], A[j]), i ← i+1
while A[i] < x do
i ← i+1
if i < j then
swap(A[i], A[j]), j ← j-1
return i
qsort
30
partition
int partition(char *v[], int left, int right)
{
int i=left;
int j=right;
char x[MAXLEN];
strcpy(x,v[left]);
while(i<j)
{
while(strcmp(v[j],x)>0)j--;
if(i<j){
swap(v,i++,j);
while(strcmp(v[i],x)<0)i++;
if(i<j)
swap(v,i,j--);
}
}
return i;
}
31
writelines e cleanup
32
Vettori multidimensionali
Rappresentazione in memoria
Gli elementi sono rappresentati in memoria in maniera
contigua
In realtà in C un vettore bi-dimensionale è trattato come un
vettore di vettori
v[1] punta al vettore relativo alla seconda riga del mio vettore
int v[][2]={{2,3},{4,5}};
int *i=&v[0][0]; /*indirizzo primo elemento */
printf("%d\n",*(i+2)); /* ottengo v[1][0] ovvero 4*/
int *i2=v[1];
printf(“%d\n”,i2[1]) /* ottengo v[1][1] ovvero 5 */
33
Esempio:
day_of_year
int day_of_year(int year, int month, int day)
{
int i, leap;
leap = year%4 == 0 && year%100 != 0
|| year%400 == 0;
for (i = 1; i < month; i++)
day += daytab[leap][i];
return day;
}
34
month_day
void month_day(int year, int yearday,
int *pmonth, int *pday)
{
int i, leap;
leap = year%4 == 0 && year%100 != 0
|| year%400 == 0;
for (i = 1; yearday > daytab[leap][i]; i++)
yearday -= daytab[leap][i];
*pmonth = i;
*pday = yearday;
}
35
Esercizio
36
Array multidimensionale vs. puntatori
char *pname[]={“Jan”,Feb”, “Mar”, “Apr”};
char aname[][10]={“Jan”,Feb”, “Mar”, “Apr”};
pname
Jan\0
Feb\0
Mar\0
Apr\0
char *month_name(int n)
{
static char *name[] = {
"Illegal month",
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"
};
return (n < 1 || n > 12) ? name[0] :
name[n];
}
Name è un vettore di puntatori a stringhe costanti
Dimensione non precisata → Il compilatore determina la dimensione del
vettore automaticamente
37
Puntatori a puntatori
int **a;
char **stringhe;
Utilissimi quando:
38
Esempio: Inizializzazione dinamica matrice
bidimensionale
for(x=0;x<rows;x++)
for(y=0;y<columns;y++)
{
printf("Inserisci l'elemento riga %d colonna %d:",
x,y);
scanf("%d", *(matrix+x)+y);
/* oppure scanf("%d",&matrix[x][y]); */
}
for(x=0;x<rows;x++){
for(y=0;y<columns;y++)
printf("%d ",matrix[x][y]);
/* oppure printf("%d ",*(*(matrix+x)+y)); */
printf("\n");
}
}
39
Funzioni che allocano spazio
Se una funzione alloca una serie di oggetti interi (int *) allora devo
passargli l’indirizzo di memoria in cui è contenuto il puntatore
Come la invoco…
Se ho una variabile int *arr devo passare &arr, ovvero l’indirizzo di
memoria in cui è memorizzato il puntatore
#include<stdio.h>
void readArray(int **parray, int *items);
main()
{
int *arr;
int x,items;
readArray(&arr,&items);
for(x=0;x<items;x++)
printf(" %d",arr[x]);
printf("\n");
}
Nota: per le funzioni che hanno come parametri puntatori a puntatori,
o array multidimensionali, è necessaria la dichiarazione anche se la
definizione è contenuta nello stesso file
40
Lettura matrice…
Il main…
#include<stdio.h>
main()
{
int rows,columns;
int **matrix;
readMatrix(&matrix,&rows, &columns);
printMatrix(matrix,rows,columns);
}
41
Esercizi
42
In C…
argc -rf\0
3
*\0
0
43
Esempio
Esempio (revised)
#include <stdio.h>
44
Mini grep
minigrep
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
int getline(char *line, int max);
if (argc != 2)
printf("Usage: find pattern\n");
else
while (getline(line, MAXLINE) > 0)
if (strstr(line, argv[1]) != NULL) {
printf("%s", line);
found++;
}
return found;
}
45
Discussione
46
Minigrep con opzioni
main(int argc, char *argv[])
{
char line[MAXLINE];
long lineno = 0;
int c, except = 0, number = 0, found = 0;
if (argc != 1)
printf("Sintassi: minigrep -v -n pattern\n");
else
while (getline(line, MAXLINE) > 0) {
lineno++;
if ((strstr(line, *argv) != NULL) != except) {
if (number)
printf("%ld:", lineno);
printf("%s", line);
found++;
}
}
return found;
}
47
Esercizio
Aggiungete a minigrep:
–i
Rende il matching case-insensitive
-c
Non produce in output le righe matchate, ma le
conta e al termine stampa il numero di match
effettuati
head –n <file.txt
Stampa le prime n righe di file.txt
Se ometto –n stampa le prime 10 righe
tail –n <file.txt
Stampa le ultime n righe di file.txt
wc <fiile.txt
Stampa il numero di caratteri, righe e parole
wc –l <fiile.txt
Solo il numero di righe
wc –c <fiile.txt
Solo il numero di caratteri
wc –w <fiile.txt
Solo il numero di parole
.. Chiaramente posso combinare le varie opzioni
Esercizi: … ovvio, no?
48
Curiosità … combinare comandi con pipe
And now…
49
Esempi
50
Binding dinamico
Linguaggi come Java consentono il binding dinamico
Possibilità di decidere a runtime quale metodo invocare
Supponiamo di avere 2 classi Java, A e B
B estende A
entrambe hanno un metodo m()
Consideriamo il seguente frammento di codice:
A a1=null;
if(condizione)
a1=new A();
else
a1=new B();
a1.m();
51
Esempio giocattolo…
#include <stdio.h>
int sum(int a, int b);
int product(int a, int b);
main()
{
int (*fun)(int, int); Dichiaro una variabile di tipo
puntatore a funzione di nome
char op; fun, che ritorna un int e accetta
int num1,num2; come parametri 2 int
scanf("%d",&num1);
scanf("%d",&num2);
scanf("%c",&op);
Esempio giocattolo…
Assegno a fun il puntatore alla funzione product
(int (*) (int, int)) fa il cast del puntatore al tipo
della funzione
Notare le parentesi attorno a *
N.B. per prendere l’indirizzo di product basta il
switch(op) nome product e non &product
{ come per gli array
case '*':
fun=(int (*)(int,int)) product;
break;
case '+':
fun=(int (*)(int,int)) sum;
break;
default:
printf("Operatore non supportato\n");
}
printf("Risultato: %d\n",
(* fun)(num1,num2)); Invocazione dereferenziando il puntatore
} a funzione
52
Le funzioni….
53
Dichiarazione di funzioni…
#include <stdio.h>
#include <string.h>
Nuova quicksort
54
Il main…
Chiamata a qsort
55
Funzione qsort
(*comp)(v[i], v[left])
Dereferenzia il puntatore a funzione comp e
chiama la funzione passata come parametro
strcmp o numcmp
passandole come parametro i puntatori a void v[i] e
v[left]
56
numcmp
swap su void *
57
Esercizio
58