Introduzione al linguaggio C Puntatori
|
|
|
- Silvestro Visconti
- 8 anni fa
- Visualizzazioni
Transcript
1 Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2016 Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
2 Argomenti Puntatori Operatori & e * Puntatori come argomento di funzione Puntatori come valori restituiti Puntatori a strutture Puntatori e array Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
3 Variabili di tipo puntatore Indirizzi di memoria La memoria è divisa in byte, ognuno dei quali ha un indirizzo. Ogni variabile occupa uno o più byte a seconda del suo tipo. Variabili puntatore Sono variabili che hanno come valore un indirizzo di memoria. Se p contiene l indirizzo di memoria in cui si trova la variabile i, diciamo che p punta a i. Dichiarazione di variabili puntatore Dato che due variabili di tipo diverso occupano quantità di memoria diversa, è importante specificare che tipo di variabile può puntare un puntatore: int * p; / p punta a variabili di tipo int / int a, b, *p, n [10]; / dichiarazione composta / Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
4 Operatori di indirizzo (&) e indirezione (*) L operatore & consente di ottenere l indirizzo di memoria di una variabile: int i, * p; / dichiaro il puntatore a intero p / p = & i; / assegno a p l indirizzo di i / E possibile inizializzare una variabile puntatore in fase di dichiarazione: int i; int *p = &i; L operatore * consente di accedere alla variabile puntata dal puntatore: int i = 3, *p = &i; printf ( "%d", *p ); / stampa 3 / Cambiando il valore di *p si cambia il valore della variabile puntata! Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
5 Esempio Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
6 Assegnamento di puntatori Attenzione! Se un puntatore p non è inizializzato, il suo valore non è definito, quindi non è definito nemmeno *p; p potrebbe puntare ad uno spazio di memoria qualsiasi, anche riservato al sistema operativo segmentation fault! La seguente porzione di programma copia il valore di p (cioè l indirizzo di i) dentro q, ovvero dopo la copia anche q punterà alla variabile i. int i, j, *p, *q; p = &i; q = p; / copia di puntatori / Cambiando il valore di *p si cambia automaticamente anche il valore di *q. Fate attenzione a non confondere q = p; con *q = *p: nel secondo caso, il valore della variabile puntata da p viene assegnato alla variabile puntata da q. Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
7 Esempio Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
8 Puntatori come argomento di funzione Passando ad una funzione un puntatore ad una variabile, si può fare in modo che la funzione modifichi il valore della variabile stessa. Invece di passare la variabile x dovremo passare come argomento il suo indirizzo, ovvero &x. Al momento della chiamata il parametro p (di tipo puntatore) corrispondente a &x verrà inizializzato col valore di &x ovvero con l indirizzo di x. Esempio: l uso di scanf Passo alla funzione scanf l indirizzo della variabile i di cui voglio cambiare il valore attraverso la chiamata della funzione scanf stessa: int i; scanf ( "%d", &i ); L operatore & nella scanf non è richiesto se come argomento uso un punt.: int i, *p = &i; scanf ( "%d", p ); Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
9 Esempio void decompose ( float x, int * int_ part, float * frac_ part ) { * int_part = ( int ) x; * frac_part = x - * int_part ; } Se i e f sono rispettivamente di tipo int e float, possiamo effettuare la chiamata decompose ( , &i, &f); Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
10 Esempio void split_time ( long int tot_sec, int *h, int *m, int *s ) { * h = tot_sec / 3600; tot_sec %= 3600; * m = tot_sec / 60; * s = tot_sec % 60; } int main ( void ) { long int time = 1800; int h=0, m=0, s =0; split_time ( time, &h, &m, &s ); printf ( " h = %d, m = %d, s = % d\ n", h, m, s ); return 0; } Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
11 Puntatori come valori restituiti E possibile scrivere funzioni che restituiscono puntatori. Ad esempio: int * max ( int *a, int *b) { if ( *a > *b ) return a; else return b; } Per invocare la funzione max, le passiamo due puntatori a variabili int e salviamo il risultato in una variabile puntatore: int *p, i, j;... p = max ( &i, &j); Attenzione: non restituite mai un puntatore ad una variabile locale (a meno di averla dichiarata static)! Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
12 Puntatori a strutture Accedere ai membri di una struttura usando un puntatore è un operazione molto frequente, tanto che il linguaggio C fornisce l operatore -> specifico per questo scopo: typedef struct { float x, y; } punto ; typedef struct { punto p1, p2; } rettangolo ; / stampa i vertici che def. il rett. puntato da r / void stampa ( rettangolo * r ) { printf ( " Rett. di vertici (%f, %f) e (%f, %f ).\ n", r -> p1.x, r -> p1.y, r -> p2.x, r -> p2.y ); } Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
13 Aritmetica dei puntatori Dichiarati int a [10], *p; possiamo fare in modo che un puntatore p punti ad a[0]: Usando i puntatori, possiamo anche accedere agli altri elementi di a usando l aritmetica dei puntatori che prevede 3 operazioni: sommare un intero a un puntatore; sottrarre un intero a un puntatore; sottrarre da un puntatore un altro puntatore. Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
14 Sommare un intero a un puntatore Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
15 Sottrarre un intero a un puntatore Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
16 Sottrarre da un puntatore un altro puntatore Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
17 Puntatori e array Uso di puntatori per scorrere array int a[n], *p, sum = 0; for ( p = &a [0]; p < &a[n]; p++ ) sum += *p; Combinazione tra * e ++ *p++ equivale a *(p++): prende il valore dell oggetto puntato da p, poi incrementa il puntatore; (*p)++: prende il valore dell oggetto puntato da p, poi incrementa tale valore; *++p: incrementa p, poi prende il valore dell oggetto puntato; ++*p: incrementa il valore dell oggetto puntato e prende il valore incrementato Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
18 Nomi di array come puntatori costanti Il nome di un array può essere usato come puntatore costante al primo elemento dell array. a[i] corrisponde a *(a + i). int a[n]; * a = 7; / salva 7 in a [0] / *( a + 1) = 12 / salva 12 in a [1] / Uso di puntatori per scorrere array (rivisitato) int a[n], *p, sum = 0; for ( p = a; p < a + N; p++ ) sum += *p; Attenzione: non posso cambiare il valore di un array! a ++; / SBAGLIATO! / a = p; / SBAGLIATO! / Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
19 Array come argomenti di funzioni Il nome di un array argomento di funzione è sempre considerato come un puntatore. l array non viene copiato (maggiore efficienza); l array non è protetto da cambiamento (usare const); non c è modo di sapere quanto è lungo l array; è possibile passare porzioni di array: somma ( a, n ); somma ( &a[5], n ); il parametro può essere definito indifferentemente come array int a[] o come puntatore int *a Attenzione: nelle dichiarazioni di variabili invece c è differenza tra queste due dichiarazioni: int a[ N]; / alloca lo spazio per N interi / int * a; / alloca lo spazio solo per un puntatore a intero / Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
20 Esempio void azzera ( int a[], int n) { int i; for ( i = 0; i < n; i ++ ) a[ i] = 0; } Il vettore a viene trattato come puntatore, quindi non viene copiato, ma viene passato alla funzione l indirizzo del suo primo elemento &a[0]. La funzione azzera quindi direttamente gli elementi di a e non di una copia locale! Violetta Lonati Introduzione al linguaggio C Puntatori 19 ottobre /20
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
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;
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 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;
L'Allocazione Dinamica della Memoria nel linguaggio C
L'Allocazione Dinamica della Memoria nel linguaggio C Prof. Rio Chierego [email protected] http://www.riochierego.it/informatica.htm Sommario Questo documento tratta l'allocazione dinamica della memoria
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
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
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
Esercizi. La funzione swapint() primo tentativo
Politecnico di Milano Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio di array. #include
Puntatori (in C) Emilio Di Giacomo
Puntatori (in C) Emilio Di Giacomo Puntatori In questa lezione parleremo di uno dei costrutti più potenti del C: i puntatori I puntatori vengono utilizzati per realizzare il passaggio di parametri per
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
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
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
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.
Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C
Tipi di dati strutturati e Linguaggio C Record o strutture Il costruttore struct in C Dati strutturati Record Un record o struttura è una struttura dati ottenuta aggregando elementi di tipo diverso che
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
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
Array e puntatori in C
Array e puntatori in C Diapositive adattate dalle omonime create dalla Dottoressa di Ricerca Giovanna Melideo per il corso di Laboratorio di Algoritmi e Strutture Dati 10/05/2005 LP2-04/05 - Appunti di
Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)
Funzioni Il concetto di funzione Parametri formali e attuali Il valore di ritorno Definizione e chiamata di funzioni Passaggio dei parametri Corpo della funzione 2 Strategie di programmazione Riuso di
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
Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I
Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave
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
Anche se due variabili vettore sono dello stesso tipo, NON è possibile l assegnamento diretto:
ESERCIZIO: Lettura/Scrittura Array Non è possibile leggere/scrivere un intero vettore con un unica operazione (a parte il caso particolare delle stringhe); occorre leggere/scrivere ognuno dei suoi componenti
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
7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari
7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa
Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit
Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit Vittorio Scarano Laboratorio di Informatica I Corso di Laurea in Informatica Università degli Studi di Salerno Struttura della lezione
Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.
Cicli e array Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7 Lez. 8 - Introduzione all ambiente
ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }
ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il
ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.
3 ITI - a.s. 2007-2008 Compiti di Informatica ESTATE 2008 ARRAY E STRINGHE Scrivere una funzione che carica da tastiera un array di n elementi e lo stampa invertendo il primo elemento con l'ultimo, il
Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori
Università degli Studi di Cagliari Corso di Laurea in Ingegneria Biomedica (Industriale), Chimica, Meccanica, Elettrica FONDAMENTI DI INFORMATICA 1 http://www.diee.unica.it/~marcialis/fi1 A.A. 2010/2011
Programmazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Tipi Strutturati Parte 1 Introduzione G. Mecca M. Samela Università della Basilicata Tipi Strutturati: Introduzione >> Sommario Sommario Panoramica Alcuni Esempi
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
Fondamenti di Informatica 2
Fondamenti di Informatica 2 della prova scritta del 28 Febbraio 2006 Esercizio 1 (4 punti) Date le seguenti variabili int A[] = 2,3,7,-2,5,8,-4; int N = 7; int min = 3; int i; Scrivere la porzione di codice
2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.
1 Esercizio 1 1. Immaginate di avere una calcolatore che invece che poter rappresentare i classici due valori per ogni bit (0/1) possa rappresentare 7 valori per ogni bit. (a) Quanti bit gli occorreranno
L Allocazione Dinamica della Memoria
L Allocazione Dinamica della Memoria Maurizio Palesi DIIT Università di Catania Viale Andrea Doria 6, 95125 Catania [email protected] http://www.diit.unict.it/users/mpalesi Sommario Questo documento
Linguaggio C - sezione dichiarativa: costanti e variabili
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C - sezione dichiarativa: costanti e variabili La presente
I puntatori e l allocazione dinamica di memoria
I puntatori e l allocazione dinamica di memoria L allocazione delle variabili Allocazione e rilascio espliciti di memoria Le funzioni malloc e free 2 2006 Politecnico di Torino 1 Allocare = collocare in
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
Istruzioni iterative (o cicliche)
Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Istruzioni iterative (o cicliche) Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria
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 Struct e union
FONDAMENTI DI INFORMATICA Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI Facoltà di Ingegneria Università degli Studi di Udine Linguaggio C Struct e union 2001 Pier Luca Montessoro - Davide Pierattoni
Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN
Breve Manuale di Riferimento sulla Sintassi Linguaggi e versione aggiornata al 05/02/2004 Sommario Elementi di Base... 2 Dati, Tipi e Dichiarazioni... 2 Tipi di Dato di Base... 2 Tipi di Dato Strutturati...
Esercizi Programmazione I
Esercizi Programmazione I 9 Novembre 201 Esercizio 1 Valutare e dare il tipo delle seguenti espressioni condizionali. 1 char a= a, b= b ; // a ha v a l o r e decimale 97 2 i n t i= 1, j= 2 ; 3 double x=
