Il linguaggio C. Puntatori e dintorni

Documenti analoghi
Il linguaggio C. Puntatori e dintorni

Perché il linguaggio C?

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Programmazione I - Laboratorio

char* titolo= Libreria sulle stringhe Esempi: (strcpy) (strstr)... Laboratorio di Informatica L-A 1

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Caratteri e stringhe

Lezione 19 e Allocazione dinamica della memoria - Direttive al preprocessore - Libreria standard - Gestione delle stringhe

string.h strcpy strc strcat strcmp strcmp strchr strstr strstr i t r ; s r \0 int strlen(char* str) char pippo[]={ p, i, p, p, o, \0 \ };

Uso avanzato dei puntatori Allocazione dinamica della memoria

STRINGHE: ARRAY DI CARATTERI! a p e \0

Il linguaggio C. Notate che...

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Stringhe e allocazione dinamica della memoria

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

C: panoramica. Violetta Lonati

Strutture Dati Dinamiche

4 GLI ARRAY E LE STRINGHE

Librerie C. Corso di Linguaggi e Traduttori 1 AA Corso di Linguaggi e Traduttori 1 AA stdio.h

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Linguaggio C: puntatori

Gestione dinamica della memoria

La gestione della memoria dinamica Heap

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))

Allocazione Dinamica della Memoria

Dati aggregati. Violetta Lonati

Stringhe e tipi di dati strutturati

Costanti e Variabili

Gestione di stringhe. Le stringhe in C/C++

Linguaggio C: PUNTATORI

Il linguaggio C. Puntatori e Array

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Lezione 8 Struct e qsort

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

Esercitazione 11. Liste semplici

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Esercizi. Stringhe. Stringhe Ricerca binaria

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

stringhe array monodimensionali char. libreria < string.h>

Le basi del linguaggio Java

ESERCIZIO 1 ESERCIZIO 2

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Cos è una stringa (1) Stringhe. Leggere e scrivere stringhe (1) Cos è una stringa (2) DD Cap. 8 pp KP Cap. 6 pp

I files in C. A cura del prof. Ghezzi

Fondamenti di Informatica T. Linguaggio C: i puntatori

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Inside C : Puntatori. Indirizzo: operatore & p = &v; x = a; Puntatori Referenziazione e Dereferenziazione Arrays

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Array multidimensionali e stringhe

Programmazione con Java

Transcript:

Il linguaggio C Puntatori e dintorni 1

Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50; /* una var intera */ int * b; /* una var puntatore a interi */... b = &a; /* assegna a b l indirizzo della cella in cui è memorizzata a */ 2

Puntatori : idea di base (2) In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50; int *b; b = &a; a è memorizzata nella cella 350 350 450 50... 3

Puntatori : idea di base (3) nometype * è il tipo degli indirizzi delle variabili di tipo nometype es : int a = 50; int * b; b = &a; 350 450 50... b è memorizzata nella cella 450 (&b) tipo dei puntatori a intero 4

Puntatori : idea di base (4) Operatore & denota l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50; int *b; b = &a; 350 450 50 350 Dopo questo assegnamento in b è memorizzato l indirizzo di a 5

Puntatori : idea di base (5) Operatore di dereferenziazione * è possibile conoscere e/o modificare il contenuto di una variabile manipolando direttemente il suo puntatore es : int a = 50; int *b = &a; *b = *b + 4; 350 450 54 350 Denota la variabile a indirizzo b Dopo questo assegnamento in a è memorizzato il valore 50 + 4 6

Puntatori : idea di base (6) NULL costante predefinita (in stdio.h) che denota il puntatore nullo È possibile definire puntatori per tutti itipi base e le strutture con (*) double *a, *b; /* ripetere * */ int *a, b, c[4], **d; struct studente * t1; Segnaposto ( %p ) stampa il valore dell indirizzo in notazione esadecimale 7

Aritmetica dei puntatori È possibile scrivere espressioni puntatore usando alcuni degli usuali operatori aritmetici (+, -, --, ++) int a[3],*p=&a[0]; IN+12 IN+8 IN+4 IN p contiene l indirizzo IN (es. IN=200) a[2] a[1] a[0] 8

Aritmetica dei puntatori (2) È possibile scrivere espressioni puntatore usando alcuni degli usuali operatori aritmetici int a[3],*p=&a[0]; p = p+1; p contiene l indirizzo IN + 4 IN+12 IN+8 IN+4 IN a[2] a[1] a[0] 9

Aritmetica dei puntatori (3) È possibile scrivere espressioni puntatore usando alcuni degli usuali operatori aritmetici int a[3],*p=&a[0]; p = p+1; p--; p contiene l indirizzo IN IN+12 IN+8 IN+4 IN a[2] a[1] a[0] 10

Aritmetica dei puntatori (4) È possibile scrivere espressioni puntatore usando alcuni degli usuali operatori aritmetici (+, -, --, ++) int a[3],*p=&a[0]; p = p+1; p--; p+=3; p contiene l indirizzo IN + 12 (sizeof(int)==4..) IN+12 IN+8 IN+4 IN a[2] a[1] a[0] 11

Aritmetica dei puntatori (5) È possibile scrivere espressioni puntatore usando alcuni degli usuali operatori aritmetici (+, -, --, ++) int a[3],*p=&a[0],*q; p = p+1; p--; q = p; p+=3; a[0] = p-q; IN+12 IN+8 IN+4 IN a[2] a[1] 3 a[0] contiene 3, numero di int memorizzabili fra p e q 12

Puntatori e array. Il nome di un array, è il puntatore (costante) al primo elemento dell array int a[3],*p=&a[0],*q; q = a; IN+12 IN+8 IN+4 IN a[2] a[1] a[0] q contiene l indirizzo IN a == IN 13

Puntatori e array. (2) L operatore [-] è una abbreviazione. int a[3],*p=&a[0],*q, tmp; /* i due stm che seguono sono equivalenti */ tmp = a[2]; tmp = *(a+2); a+3 a+2 a+1 a a[2] a[1] a[0] 14

Puntatori e array. (3) L operatore [ ] è una abbreviazione. e può essere usato con una qualsiasi variabile puntatore int a[3],*p=a,*q, tmp; tmp = a[2]; tmp = p[2]; a+3 a+2 a+1 a a[2] a[1] a[0] 15

Puntatori e array. (4) I seguenti frammenti di codice sono equivalenti : int a[n],*p=a,*q, i; int sum = 0; /* versione 1 */ for(i=0;i<n;i++) sum+= a[i]; /* versione 2 */ for(i=0;i<n;i++) sum+= *(a+i); 16

Puntatori e array. (5) I seguenti frammenti di codice sono equivalenti (segue) : int a[n],*p=&a[0],*q, i; int sum = 0; /* versione 3 */ for(i=0;i<n;i++) sum+= p[i]; /* versione 4 */ for(p=a;p<(a+n);p++) sum+= *p; 17

Stringhe Una riflessione sulle stringhe in C le stringhe sono array di caratteri terminate dal carattere nullo'\0, ad esempio char a[5]= ciao ; dichiara una stringa notate che la lunghezza dell array deve comprendere anche l invisibile terminatore. La libreria string.h mette a disposizione varie funzioni per lavorare sulle stringhe La funzione strlen() da la lunghezza di una stringa in caratteri, escludendo il terminatore strlen(a)=strlen( ciao )=4 18

Stringhe (2) Altre funzioni interessanti: strcpy(char* s,char*p) che copia la stringa p nella stringa s strcmp(char* s,char*p)che confronta lessicograficamente p ed s strcat(char* s,char*p)che concatena p ed s (modifica s) strstr(char* s, char*p) che cerca la prima occorrenza della stringa p in s e restituisce il puntatore a tale occorrenza 19

Stringhe (3) Se non gestite bene le stringhe sono pericolose e generano errori difficili da rilevare e catastrofici Le funzioni di libreria si aspettano sempre di lavorare con stringhe correttamente terminate dal carattere nullo'\0', Es: implementazione di strcpy da K&R void strcpy (char*s, char*t){ } while ( ( *s++ = *t++ )!= '\0'); 20

Stringhe (4) void strcpy (char*s, char*t){ } while ( ( *s++ = *t++ )!= '\0'); Se la stringa non è terminata (o se s non ha abbastanza spazio) si continuano ad incrementare i puntatori andando avanti a leggere (e scrivere!) valori in memoria (buffer overrun) Si può sovrascrivere e danneggiare lo spazio di memoria di altre variabili, i frame sullo stack o la tabella di allocazione dello heap Si può raggiungere memoria non allocata ricevendo segnali di violazione di Segmento con conseguente terminazione del processo in esecuzione 21

Morale : Stringhe (5) Assicuratevi sempre che le stringhe siano terminate e che ci sia abbastanza spazio nei buffer Se non siete sicuri usate funzioni che non permettano l overrun, perchè è possibile dire quanto è grande il buffer Es: strncpy(char* s,char*p, size_t n) in cui il terzo parametro serve per dire quanto è lungo il buffer In questo caso dopo la copia bisogna controllare che il risultato contenga effettivamente il terminatore perchè la fine del buffer può essere stata raggiunta prima Usate valgrind se avete dubbi sul comportamento del vostro programma (segnala scritture e letture fuori dai buffer sullo heap) 22