Capitolo 7 I puntatori in C

Documenti analoghi
Capitolo 7 I puntatori in C

Capitolo 6 - Array. Copyright by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

POINTERS. Una variabile pointer è una variabile che ha come valore un indirizzo di memoria.

Capitolo 5 - Funzioni

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Puntatori (in C) Emilio Di Giacomo

Introduzione al linguaggio C Puntatori

Verso i puntatori: Cosa è una variabile?

Il linguaggio C. Puntatori e dintorni

Puntatori. Fondamenti di Programmazione

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

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

Linguaggio C I puntatori

Puntatori. Unità 6. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

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

Capitolo 3 Sviluppo di Programmi Strutturati

Puntatori in C Lucidi della Pof.ssa Pazienza

Puntatori. Unità 6. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Linguaggio C: PUNTATORI

Introduzione al linguaggio C

Capitolo 8 - Caratteri e Stringhe

Array k-dimensionali

Laboratorio di Programmazione: Linguaggio C Lezione 21 del 19 maggio 2014

Lezione 8 Struct e qsort

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Scrittura formattata - printf

Ottenere una modifica del parametro attuale

Introduzione al linguaggio C

Capitolo 9 - Input/Output formattato

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

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

I puntatori (richiamo)

Utilizza i tipi di dati comuni a tutto il framework.net Accesso nativo ai tipi.net (C# è nato con.net) Concetti fondamentali:

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Programmazione I - Laboratorio

Il linguaggio C Strutture

Introduzione al C++ (continua)

Uso avanzato dei puntatori Allocazione dinamica della memoria

Se vogliamo cambiarlo: i dati vengono sovrascritti. 300 White Jones (vecchio valore) 300 Worthington 0.00

Sintassi: Per la dichiarazione di variabili dei tipi fondamentali:

Operatore di indirizzo

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

Funzioni, puntatori, strutture. Lab. Calc. AA 2006/07

Introduzione ai puntatori in C Definizione

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

La gestione della memoria dinamica Heap

ESERCIZIO: Lettura/Scrittura Array

I file Laboratorio di Linguaggi di Programmazione a.a. 2001/2002

I puntatori e l allocazione dinamica di memoria. Esercizi risolti

Gestione dinamica della memoria

Il linguaggio C Puntatori

La formattazione dell input/output in C

Struct, enum, Puntatori e Array dinamici

puntatori Lab. Calc. AA 2007/08 1

A.A. 2006/2007 Laurea di Ingegneria Informatica. Fondamenti di C++ Horstmann Capitolo 3: Oggetti Revisione Prof. M. Angelaccio

Aritmetica dei puntatori

18/01/16. Soluzione degli esercizi svolti in aula alla lavagna. Seconda lezione. Cast

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

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

Linguaggio C - sezione dichiarativa: costanti e variabili

Laboratorio di Informatica Ingegneria Clinica Lezione 9/11/2011. Prof. Raffaele Nicolussi

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

Introduzione al linguaggio C Gli array

Fondamenti di Informatica

Array e puntatori in C

Laboratorio di informatica Ingegneria meccanica

Stringhe e allocazione dinamica della memoria

Tempo di vita e scope delle variabili

Mini-dispensa sui puntatori in C

Laboratorio di Informatica Ingegneria Clinica Lezione 12/12/2011. Prof. Raffaele Nicolussi

Array multidimensionali e stringhe

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Indice. Ordine di valutazione. Espressioni in C++ Le espressioni in C++ (CAP 4) Alberto Garfagnini e Marco Mazzocco A.A. 2014/ * 20 / 2

Programmazione in Java (I modulo)

Applicando lo stesso meccanismo al tipo puntatore, possiamo dichiarare un array di puntatori:

Le basi del linguaggio Java

Allocazione dinamica della memoria

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

Il linguaggio C. Puntatori e Array

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Il linguaggio C. Puntatori e dintorni

Lezione 4. Costruttori

La classe std::vector della Standard Template Library del C++

Fondamenti di Informatica T. Linguaggio C: i puntatori

Corso sul linguaggio C Modulo Tipi di dato

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica

Fondamenti di Programmazione

Esercizi Programmazione I

Anche se due variabili vettore sono dello stesso tipo, NON è possibile l assegnamento diretto:

Strategie di programmazione

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

Alla variabile pi verrà assegnato come valore l'indirizzo di una variabile di tipo int:

Transcript:

1 Capitolo 7 I puntatori in C 7.2 Dichiarazione e inizializzazione di puntatori Variabili puntatore Contengono gli indirizzi di memoria come valore Le normali variabili contengono uno specifico valore (riferimento diretto) count 7 I puntatori contengono gli indirizzi di una variabile che ha uno specifico valore (riferimento indiretto) Referenziare far riferimento al valore di un puntatore 2 countptr count 7 1

7.2 Dichiarazione e inizializzazione di puntatori Dichiarazione di puntatori * utilizzato con le variabili puntatore int *myptr; Definisce un puntatore ad un int (puntatore di tipo int * ) Puntatori multipli richiedono l uso di un * prima di ogni definizione di variabile int *myptr1, *myptr2; Si possono definire puntatori ad ogni tipo di dato Il tipo del pointer dipende dal tipo della variabile a cui punta Parliamo quindi di pointer a int, pointer a double, e così via long k; long *py = &k; /*Sì*/ int *py = &k; /*NO!*/ Inizializzare un puntatore a 0, NULL, o ad un indirizzo 0o NULL puntano a niente (NULL è preferito) 3 7.2 Dichiarazione e inizializzazione di puntatori E' lecito fare assegnazioni tra pointer dello stesso tipo: 4 int n; int *px = &n; int *pz; pz = px; /*normale variabile int*/ /*pointer a n*/ /*altro pointer a int*/ /*anche pz punta a n*/ Ora anche pz contiene l'indirizzo di n, per cui si può accedere ad n attraverso pz: *pz = 1; /*come dire: n = 1*/ 2

7.3 Operatori su puntatori &(operatore di indirizzo) Restituisce l indirizzo dell operando (deve essere una variabile; & non si applica a costanti, espressioni o variabili register) int y = ; int *yptr; yptr = &y; /* yptr gets address of y */ yptr points to y yptr y yptr 00000 600000 y 600000 Address of y is value of yptr 7.3 Operatori su puntatori *(operatore di deriferimento o operatore di risoluzione del riferimento) Restituisce il valore dell'oggetto puntato dal suo operando *yptr restituisce y (poiché yptr punta a y) Printf( %d, *yptr); /*stampa il valore di y*/ (risoluzione del riferimento di un puntatore) 6 *può essere utilizzato per l assegnamento Restituisce l alias ad un oggetto *yptr = 7; /* changes y to 7 */ *e & sono l'uno il complemento dell'altro 3

1 /* Fig. 7.4: fig07_04.c 2 Using the & and * operators */ 3 #include <stdio.h> 4 6 aptr. 7 int a; /* a is an integer */ 8 int *aptr; /* aptr is a pointer to an integer */ 9 10 a = 7; 11 aptr = &a; /* aptr set to address of a */ 12 13 printf( "The address of a is %p" 14 "\nthe value of aptr is %p", &a, aptr ); 1 16 printf( "\n\nthe value of a is %d" 17 "\nthe value of *aptr is %d", a, *aptr ); 18 19 printf( "\n\nshowing that * and & are complements of " 20 "each other\n&*aptr = %p" 21 "\n*&aptr = %p\n", &*aptr, *&aptr ); 22 23 return 0; /* indicates successful termination */ 24 2 /* end main */ L indirizzo di a è il valore di fig07_04.c L operatore * restituisce un alias a cui l operando punta. aptr punta ad a, quindi *aptr restituisce a. Si noti come * e & sono inversi 7 The address of a is 0012FF7C The value of aptr is 0012FF7C The value of a is 7 The value of *aptr is 7 Showing that * and & are complements of each other. &*aptr = 0012FF7C *&aptr = 0012FF7C Program Output 8 4

7.4 Chiamata di funzioni per riferimento La chiamata per riferimento con argomenti puntatore Si passa l indirizzo dell argomento utilizzando l operatore & Permette di modificare la reale locazione di memoria Gli array non sono passati con & poiché il nome di un array è già un puntatore operatore * Utilizzato come alias/nickname per la variabile in una funzione void double( int * ) * = 2 * ( * ); * usato come nickname per la variabile passata 9 1 /* Fig. 7.6: fig07_06.c 2 Cube a variable using call-by-value */ 3 #include <stdio.h> 4 int cubebyvalue( int n ); /* prototype */ 6 7 8 9 int = ; /* initialize */ 10 11 printf( "The original value of is %d", ); 12 13 /* pass by value to cubebyvalue */ 14 = cubebyvalue( ); 1 16 printf( "\nthe new value of is %d\n", ); 17 18 return 0; /* indicates successful termination */ 19 20 /* end main */ 21 22 /* calculate and return cube of integer argument */ 23 int cubebyvalue( int n ) 24 2 return n * n * n; /* cube local variable n and return result */ 26 27 /* end function cubebyvalue */ fig07_06.c 10

The original value of is The new value of is 12 11 Program Output 1 /* Fig. 7.7: fig07_07.c 2 Cube a variable using call-by-reference with a pointer argument */ 3 4 #include <stdio.h> Notice that the function prototype takes a pointer to an integer. 6 void cubebyreference( int *nptr ); /* prototype */ 7 8 9 10 int = ; /* initialize */ 11 12 printf( "The original value of is %d", ); 13 14 /* pass address of to cubebyreference */ 1 cubebyreference( & ); 16 17 printf( "\nthe new value of is %d\n", ); 18 19 return 0; /* indicates successful termination */ 20 21 /* end main */ 22 23 /* calculate cube of *nptr; modifies variable in main */ 24 void cubebyreference( int *nptr ) 2 26 *nptr = *nptr * *nptr * *nptr; /* cube *nptr */ 27 /* end function cubebyreference */ fig07_07.c Notice how the address of is given - cubebyreference expects a pointer (an address of a variable). 12 Inside cubebyreference, *nptr is used (*nptr is ). 6

The original value of is The new value of is 12 13 Program Output Before main calls cubebyvalue : int = ; =cubebyvalue(); int cubebyvalue( int n ) return n * n * n; n undefined 14 After cubebyvalue receives the call: int = ; = cubebyvalue( ); int cubebyvalue( int n ) return n * n * n; n After cubebyvalue cubes parameter n and before cubebyvalue returns to main : int = ; = cubebyvalue( ); int cubebyvalue( int n ) 12 return n * n * n; n Fig. 7.8 Analysis of a typical call-by-value. (Part 1 of 2.) 7

1 After cubebyvalue returns to main and before assigning the result to : int = ; 12 = cubebyvalue( ); int cubebyvalue( int n ) return n * n * n; n undefined After main completes the assignment to : int = ; 12 12 12 = cubebyvalue( ); int cubebyvalue( int n ) return n * n * n; n undefined Fig. 7.8 Analysis of a typical call-by-value. (Part 2 of 2.) 16 Before main calls cubebyreference : int = ; cubebyreference( & ); void cubebyreference( int *nptr ) *nptr = *nptr * *nptr * *nptr; nptr undefined After cubebyreference receives the call and before *nptr int = ; cubebyreference( & ); is cubed: void cubebyreference( int *nptr ) *nptr = *nptr * *nptr * *nptr; nptr call establishes this pointer After *nptr is cubed and before program control returns to main : int = ; 12 cubebyreference( & ); void cubebyreference( int *nptr ) 12 *nptr = *nptr * *nptr * *nptr; called function modifies nptr caller s variable Fig. 7.9 Analysis of a typical call-by-reference with a pointer argument. 8

7. Usare il qualificatore const con i puntatori il qualificatore const La varibile non può essere cambiata Usare const se la funzione non necessita di modificare una variabile Cercare di modificare una variabile const provoca un errore puntatori const Puntano ad una locazione di memoria costante Devono essere inizializzati quando definiti int *const myptr = &x; Puntatore costante ad un int const int *myptr = &x; Puntatore generico a un const int const int *const Ptr = &x; const punta a const int xpuò essere cambiato, ma non *Ptr 17 1 /* Fig. 7.10: fig07_10.c 2 Converting lowercase letters to uppercase letters 3 using a non-constant pointer to non-constant data */ 4 #include <stdio.h> 6 #include <ctype.h> 7 8 void converttouppercase( char *sptr ); /* prototype */ 9 10 11 12 char string[] = "characters and $32.98"; /* initialize char array */ 13 14 printf( "The string before conversion is: %s", string ); 1 converttouppercase( string ); 16 printf( "\nthe string after conversion is: %s\n", string ); 17 18 return 0; /* indicates successful termination */ 19 20 /* end main */ 21 fig07_10.c (Part 1 of 2) 18 9

22 /* convert string to uppercase letters */ 23 void converttouppercase( char *sptr ) 24 2 while ( *sptr!= '\0' ) /* current character is not '\0' */ 26 27 if ( islower( *sptr ) ) /* if character is lowercase, */ 28 *sptr = toupper( *sptr ); /* convert to uppercase */ 29 /* end if */ 30 31 ++sptr; /* move sptr to the next character */ 32 /* end while */ 33 34 /* end function converttouppercase */ fig07_10.c (Part 2 of 2) 19 Program Output The string before conversion is: characters and $32.98 The string after conversion is: CHARACTERS AND $32.98 1 /* Fig. 7.11: fig07_11.c 2 Printing a string one character at a time using 3 a non-constant pointer to constant data */ 4 #include <stdio.h> 6 7 void printcharacters( const char *sptr ); 8 9 10 11 /* initialize char array */ 12 char string[] = "print characters of a string"; 13 14 printf( "The string is:\n" ); 1 printcharacters( string ); 16 printf( "\n" ); 17 18 return 0; /* indicates successful termination */ 19 20 /* end main */ 21 20 fig07_11.c (Part 1 of 2) 10

22 /* sptr cannot modify the character to which it points, 23 i.e., sptr is a "read-only" pointer */ 24 void printcharacters( const char *sptr ) 2 26 /* loop through entire string */ 27 for ( ; *sptr!= '\0'; sptr++ ) /* no initialization */ 28 printf( "%c", *sptr ); 29 /* end for */ 30 31 /* end function printcharacters */ fig07_11.c (Part 2 of 2) 21 Program Output The string is: print characters of a string 7.7 Espressioni puntatore e puntatori aritmetici Si possono effettuare delle operazioni aritmetiche sui puntatori Incremento/decremento di puntatore (++ o --) Aggiungere un intero ad un puntatore ( + o +=, - o -=) Un puntatore può essere sottratto da un altro Si possono fare operazioni di confronto tra due puntatori 22 11

7.7 Espressioni puntatore e puntatori aritmetici elementi di un array di int su una macchina a 4 byte ints vptr punta al primo elemento v[ 0 ] Alla locazione 3000 (vptr = 3000) vptr += 2; setta vptr a 3008 vptr punta a v[ 2 ] (incrementato di 2), ma la macchina ha 4 byte ints, quindi punta all indirizzo 3008 23 location 3000 3004 3008 3012 3016 v[0] v[1] v[2] v[3] v[4] pointer variable vptr 7.7 Espressioni puntatore e puntatori aritmetici Sottrarre i puntatori Restituisce il numero di elementi. Se vptr2 = v[ 2 ]; vptr = v[ 0 ]; vptr2 - vptr dovrebbe produrre 2 Confronto di puntatori ( <, ==, > ) Controlla quale puntatore punta all elemento più alto dell array 24 12

7.7 Espressioni puntatore e puntatori aritmetici Puntatori dello stesso tipo possono essere assegnati l uno all altro Se non sono dello stesso tipo bisogna usare un operatore di cast Eccezione: puntatore a void (type void *) Puntatore generico, rappresenta qualsiasi tipo Non c è bisogno di casting per convertire un puntatore a un puntatore a void I puntatori void non possono essere dereferenziati 2 Esercizi Esercizio 1 Scrivere una funzione con prototipo void somma(double *sum, double x, double y); che assegna la somma fra il secondo e il terzo argomento (passati per valore) al primo argomento (passato per riferimento) Esercizio 2 Dichiarare il vettore di tipo float chiamato s contenente 10 elementi e inizializzateli con i valori 0.0, 1.1, 2.2,..., 9.9 dichiarare un puntatore nptr che faccia riferimento a un oggetto di tipo float visualizzare gli elementi del vettore utilizzando la notazione con gli indici di vettore assegnare al puntatore nptr l'indirizzo di partenza del vettore s visualizzare gli elementi del vettore utilizzando la notazione con puntatore Esercizio 3 Scrivere una funzione che restituisca il puntatore alla prima occorrenza di un numero in un array di interi int * cerca(int a[], int size) Esercizio 4 Scrivere una funzione che ha in input due array di interi (entrambi della stessa dimensione), ed un intero rappresentante la loro dimensione, e restituisce 1 se gli array sono uguali e 0 altrimenti. Utilizzare i puntatori per scorrere gli array. int confronta(int a1[], int a2[], int size) 26 13