Il linguaggio C. Puntatori e dintorni
|
|
|
- Federico Antonella
- 8 anni fa
- Visualizzazioni
Transcript
1 Il linguaggio C Puntatori e dintorni 1
2 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
3 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
4 Puntatori : idea di base (3) nometype * è il tipo degli indirizzi delle variabili di tipo nometype es : int a = 50; int * b; b = &a; b è memorizzata nella cella 450 (&b) tipo dei puntatori a intero 4
5 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; Dopo questo assegnamento in b è memorizzato l indirizzo di a 5
6 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; Denota la variabile a indirizzo b Dopo questo assegnamento in a è memorizzato il valore
7 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
8 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
9 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
10 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
11 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
12 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
13 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
14 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
15 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
16 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
17 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
18 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
19 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
20 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
21 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
22 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
Il linguaggio C. Puntatori e dintorni
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;
Perché il linguaggio C?
Il linguaggio C 7 Perché il linguaggio C? Larga diffusione nel software applicativo Standard di fatto per lo sviluppo di software di sistema Visione a basso livello della memoria Capacità di manipolare
Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0
STRINGHE: ARRAY DI CARATTERI Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più N-1
Programmazione I - Laboratorio
Programmazione I - Laboratorio Esercitazione 4 - Puntatori, vettori e stringhe Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti
char* titolo= Libreria sulle stringhe Esempi: (strcpy) (strstr)... Laboratorio di Informatica L-A 1
char* titolo= l, e,, s, t, r, i, n, g, h, e, \0 ; 1 Libreria sulle stringhe La libreria string.h contiene una ricca serie di funzioni per operare sulle stringhe Esempi: copiare una stringa in un altra
Esercizio 1: funzione con valore di ritorno di tipo puntatore
Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 7 Esercitazione: 14 dicembre 2005 Esercizi su ricorsione, manipolazione stringhe, strutture dinamiche Problema: Esercizio
Caratteri e stringhe
Caratteri e stringhe Caratteri Dato che un computer può memorizzare esclusivamente sequenze di bit, per memorizzare un carattere (e quindi testi) è necessario stabilire una convenzione che associa a un
Lezione 19 e Allocazione dinamica della memoria - Direttive al preprocessore - Libreria standard - Gestione delle stringhe
Lezione 19 e 20 - Allocazione dinamica della memoria - Direttive al preprocessore - Libreria standard - Gestione delle stringhe Valentina Ciriani (2005-2008) Laboratorio di programmazione Valentina Ciriani
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 \ };
char* titolo= l, e,, s, t, r, i, n, g, h, e, \0 ; Libreria sulle stringhe libreria i string.h contiene una ricca serie di funzioni per operare sulle stringhe Esempi: copiare una stringa in un altra (strcpy
Uso avanzato dei puntatori Allocazione dinamica della memoria
Uso avanzato dei puntatori Allocazione dinamica della memoria Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica
STRINGHE: ARRAY DI CARATTERI! a p e \0
STRINGHE: ARRAY DI CARATTERI! Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più
Il linguaggio C. Notate che...
Il linguaggio C Notate che... 1 Il C è un linguaggio a blocchi int main (void) { blocco } 2 Il C è un linguaggio a blocchi (2) Non è possibile mischiare dichiarazioni e comandi! int main (void) { } Dichiarazione
Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella
Corso di Informatica Tipi strutturati: Stringhe Anno Accademico 2010/2011 Francesco Tortorella Stringhe di caratteri La stringa è il tipo strutturato con cui vengono rappresentati gruppi di caratteri quali
Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata
Puntatori int i = 10; int * pi = &i; pi i = 10 116 int * pi = pi contiene un informazione che mi permette di accedere ( puntare ) ad una variabile intera Un puntatore contiene un numero che indica la locazione
Stringhe e allocazione dinamica della memoria
Stringhe e allocazione dinamica della memoria Esercizio Scrivere un programma strings.c che legge da standard input una sequenza di parole separate da uno o più spazi, e stampa le parole lette, una per
INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica
Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione
C: panoramica. Violetta Lonati
C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati
Strutture Dati Dinamiche
Strutture Dati Dinamiche Motivazioni Le variabili considerate fino a questo punto devono essere dichiarate staticamente, ossia la loro esistenza, il loro nome e la loro dimensione devono essere previsti
4 GLI ARRAY E LE STRINGHE
13 4 GLI ARRAY E LE STRINGHE 4.1 Gli array monodimensionali Un array è un insieme di variabili dello stesso tipo, cui si fa riferimento mediante uno stesso nome. L accesso ad un determinato elemento si
Librerie C. Corso di Linguaggi e Traduttori 1 AA Corso di Linguaggi e Traduttori 1 AA stdio.h
Corso di Linguaggi e Traduttori 1 AA 2004-05 1 Corso di Linguaggi e Traduttori 1 AA 2004-05 stdio.h 2 Funzioni comuni di I/O? Le piu' comuni funzioni che permettono I/O sono getchar() e putchar():? int
Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.
Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo. int a = 5; a 5 α=&a Esistono in C particolari variabili dette puntatori che possono
Linguaggio C: puntatori
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica A - GES Prof. Plebani A.A. 2006/2007 Linguaggio C: puntatori La presente dispensa e da utilizzarsi ai soli fini didattici previa
Gestione dinamica della memoria
Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 Gestione dinamica della memoria Pietro Di Lena - [email protected] A pessimistic programmer sees the array as half empty.
La gestione della memoria dinamica Heap
Laboratorio di Algoritmi e Strutture Dati La gestione della memoria dinamica Heap Prof. Luigi Lamberti 2005 Cenni sui Processi Un Programma è un insieme di Istruzioni memorizzato in un file con le costanti
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: malloc() In C è possibile allocare dinamicamente un area di memoria (ossia, durante l esecuzione di un programma) tramite le funzioni malloc() e calloc() (occorre includere
Allocazione Dinamica della Memoria
Allocazione Dinamica della Memoria Elisa Marengo Università degli Studi di Torino Dipartimento di Informatica Elisa Marengo (UNITO) Allocazione Dinamica della Memoria 1 / 10 Scelta delle variabili Quando
Dati aggregati. Violetta Lonati
Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica - in breve: Definizione di tipi Array Stringhe Strutture
Stringhe e tipi di dati strutturati
Stringhe e tipi di dati strutturati Marco D. Santambrogio [email protected] Ver. aggiornata al 21 Marzo 2013 Info sui Labs http://tinyurl.com/ieimlabextra Ricordate di portare un adattatore!
Costanti e Variabili
Parte 3 Costanti e Variabili Identificatori Un identificatore è un nome che viene associato a diverse entità (costanti, tipi, variabili, funzioni, ecc.) e serve ad identificare la particolare entità Gli
Gestione di stringhe. Le stringhe in C/C++
Alessio Bechini - Corso di - Gestione di stringhe Parte del materiale proposto è stato gentilmente fornito da G. Lipari Le stringhe in C/C++ In C e in C++ non esiste un vero e proprio tipo stringa. Una
Linguaggio C: PUNTATORI
Linguaggio C: PUNTATORI I puntatori sono una delle più importanti caratteristiche del linguaggio C. Permettono di lavorare a basso livello, mantenendo flessibilità e praticità. Il C utilizza molto i puntatori
Il linguaggio C. Puntatori e Array
Il linguaggio C Puntatori e Array Puntatori I puntatori sono variabili i cui valori sono indirizzi di locazioni in cui sono memorizzate altre variabili architettura a 32 bit: 232-1 indirizzi, ma non si
Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.
Unità Didattica 4 Linguaggio C Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. 1 Vettori Struttura astratta: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice;
Lezione 8 Struct e qsort
Lezione 8 Struct e qsort Rossano Venturini [email protected] Pagina web del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start Esercizio 3 QuickSort strambo Modificare il Quicksort
I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore
I puntatori Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore...... L operatore & fornisce l indirizzo di un oggetto: p = &c; assegna a p l indirizzo di c, i.e., p
Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi
Informatica 1 Corso di Laurea Triennale in Matematica Gianluca Rossi [email protected] Dipartimento di Matematica Università di Roma Tor Vergata 11: Stringhe (www.informatica-uno.blogspot.com)
Esercitazione 11. Liste semplici
Esercitazione 11 Liste semplici Liste semplici (o lineari) Una lista semplice (o lineare) è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ciascun elemento contiene
9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
9 - Array Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di Laurea
Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori
Gli array Array e puntatori Laboratorio di Informatica I un array è un insieme di elementi (valori) avente le seguenti caratteristiche: - un array è ordinato: agli elementi dell array è assegnato un ordine
Esercizi. Stringhe. Stringhe Ricerca binaria
Politecnico di Milano Esercizi Stringhe Stringhe Array di caratteri Funzioni: strcpy() strcmp() strlen() char stringaa[10], stringab[10]; strcpy(stringaa, stringab); Copia if (strcmp(stringaa, stringab)
Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 11 luglio 2014 TEMPO DISPONIBILE: 2 ore Negli esercizi
Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre 2014. Negli esercizi proposti si utilizzano le seguenti classi:
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 22 settembre 2014 TEMPO DISPONIBILE: 2 ore Negli
stringhe array monodimensionali char. libreria < string.h>
Le stringhe Le stringhe sono array monodimensionali il cui tipo base è char. Il nucleo del linguaggio non prevede particolari istruzioni per il trattamento delle stringhe che potrebbero essere gestite
Le basi del linguaggio Java
Le basi del linguaggio Java Compilazione e interpretazione Quando si compila il codice sorgente scritto in Java, il compilatore genera il codice compilato, chiamato bytecode. È un codice generato per una
ESERCIZIO 1 ESERCIZIO 2
ESERCIZIO 1 Scrivere una funzione che data una stringa A calcoli la sua lunghezza. int lunghezza(char A[]); Scrivere una funzione che date due stringhe A e B copi il contenuto di A in B e restituisca il
Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);
Fondamenti di Informatica L-A (A.A. 004/005) - Ingegneria Informatica Prof.ssa Mello & Prof. Bellavista I Prova Intermedia del 11/11/004 - durata h - COMPITO B Esercizio 1 (punti 1) Una associazione di
Cos è una stringa (1) Stringhe. Leggere e scrivere stringhe (1) Cos è una stringa (2) DD Cap. 8 pp. 305-341 KP Cap. 6 pp. 241-247
Cos è una stringa (1) Stringhe DD Cap. 8 pp. 305-341 KP Cap. 6 pp. 241-247 Una stringa è una serie di caratteri trattati come una singola unità. Essa potrà includere lettere, cifre, simboli e caratteri
I files in C. A cura del prof. Ghezzi
I files in C A cura del prof. Ghezzi 1 Perchè i files? Realizzano la persistenza dei dati dati che sopravvivono all esecuzione del programma Sono delle strutture di dati sequenziali 2 Files e S.O. I files
Fondamenti di Informatica T. Linguaggio C: i puntatori
Linguaggio C: i puntatori Il puntatore E` un tipo di dato, che consente di rappresentare gli indirizzi delle variabili allocate in memoria. Dominio: Il dominio di una variabile di tipo puntatore è un insieme
Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE
Input/output da file Il linguaggio C non contiene istruzioni di I/O, in quanto tali operazioni vengono eseguite tramite funzioni di libreria standard. Questo approccio rende estremamente flessibile e potente
Inside C : Puntatori. Indirizzo: operatore & p = &v; x = a; Puntatori Referenziazione e Dereferenziazione Arrays
Pointers: Puntatori (I) Le variabili finora incontrate sono caratterizzate da un nome (o identificativo), un tipo, ed occupano un area di memoria di dimensione dipendente dal tipo. Per accedere ad una
Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di
ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori Ad esempio: char * stringhe[4]; definisce un vettore di 4 puntatori a carattere
Array multidimensionali e stringhe
Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Array uni-dimensionali (richiami) Dichiarazione: int vet[100]; float x[50]; Gli elementi
Programmazione con Java
Programmazione con Java Classi e istanze in Java Definizione di classe in Java A meno che non si usino classi già scritte da altri, prima di poter creare un qualsiasi oggetto devo creare la sua rappresentazione:
