Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Puntatori in C
Un puntatore è un tipo di dato, una variabile che contiene l'indirizzo in memoria di un'altra variabile. Si possono avere puntatori a qualsiasi tipo di variabile.
I puntatori possono essere stampati con una printf con operatore di formato %p
int a = 5; int *pi; pi = &a; printf("indirizzo di a = %p\n", &a); /* stampa 0xA010 */
Indirizzo della variabile: 62fe14
Valore variabile: 10
Esempio di visualizzazione del puntatore
int main(void) { int *pa, a; pa=&a; *pa=10; // è equivalente ad a=10 printf("Il valore di a è: %d ", a); return 0; }
Il valore di a è: 10
Secondo Esempio di visualizzazione del puntatore
int main(void) { int *pa, *pb, a; pa=&a; pb=pa; *pb=10; printf("Il valore di a è: %d \n", a); printf("Il valore di pa è: %x \n", pa); printf("Il valore di pb è: %x \n ", pb); return 0; }
Il valore di a è: 10
Il valore di pa è: 62fe0c
Il valore di pb è: 62fe0c
printf("valore di pi = %p\n", pi); /* stampa 0xA010 */
printf("valore di &*pi = %p\n", &*pi); /* stampa 0xA010 */
printf("valore di a = %d\n", a); /* stampa 5 */
printf("valore di *pi = %d\n", *pi); /* stampa 5 */
printf("valore di *&a = %d\n", *&a); /* stampa 5 */
I puntatori (come tutte le altre variabili) devono venire inizializzati prima di poter essere usati.
È un errore dereferenziare una variabile puntatore non inizializzata.
Tipi di Variabile Puntatore
Il tipo di una variabile puntatore è puntatore a tipo.
Il suo valore è un indirizzo.
I tipi puntatore sono indirizzi e non interi.
int a; // Dichiarazione di Variabile A
int *pi; // Dichiarazione del puntatore pi
a = pi; // Assegnazione ad a il puntatore
/* Compilando si ottiene un warning:
assignment makes integer from pointer without a cast */
La funzione Size Of
La funzione sizeof restituisce l'occupazione in memoria in byte di una variabile.
int x =
10;sizeof(int);sizeof(x);Operazioni con i PuntatoriSui puntatori si possono effettuare diversi operazioni:
Deferenziamento
<int *p, i;
i = *p;
Assegnamento
<int *p, *q;
p = q;
Di confronto
<if (p == q) ...
//oppure
if (p > q) ...
Aritmetiche
<incremento (++) o decremento (--)
somma (+=) o sottrazione (-=) di un intero
sottrazione di un puntatore da un altro
Generalità Avanzate sugli Array
<Un array può essere definito con int vet[1] ma questa scrittura è equivalente a scrivere
*(vet+1) utilizzando il puntatore.
Il fatto che il nome dell'array non indichi l'array, ma l'indirizzo iniziale dell'area di memoria ad esso associata ha
una conseguenza:
È impossibile denotare un array nella sua globalità, in qualunque contesto
Questa è la spiegazione, ad esempio, del motivo per cui
non si può assegnare un array ad un altro
#include <stdio.h>
int main (void){
int vet[10];
printf("\nStampa del Vettore con & %d", &vet);
//Stampa l'indirizzo della memoria in cui sta l'aprintf("\nStampa del Vettore senza & %d", vet); //Stampa l'indirizzo della memoria in cui sta l'}
OUTPUTStampa del Vettore con & 6487536Stampa del Vettore senza & 6487536
Le Stringhe
Una stringa di caratteri in C è un array di caratteri (array di char) terminato dal carattere '\0'
Una stringa può essere inizializzata come qualsiasi altro array elencando le singole componenti delle parole. char s[5] = {'C', 'i', 'a', 'o', '\0'};
Oppure si può utilizzare la forma compatta In quest'ultimo caso il char s[5] = "Ciao"; carattere di terminazione '\0' è automaticamente incluso in fondo
Lettura di una Stringa
Una stringa può essere letta da tastiera e può essere stampata come ogni altro array char str[4]; scanf("%s", str);
ATTENZIONE! Si utilizza lo specificatore di
formato NON bisogna usare il & per leggere la stringa
Stessa cosa si utilizza printf per la stampa della stringa a video terminale
Funzioni utili per la manipolazione di Stringhe (string.h)
La libreria che ci permette di manipolare con delle funzioni prefatte è sting.h
int tolower(int c) //restituisce c minuscola se il dato iniziale è maiuscolo
int toupper(int c) //restituisce c maiuscola se il dato iniziale è minuscolo
char *strcpy(* stringa destinazione, * stringa da copiare);
char *strcat(char *dest, const char *src);
int strcmp(*stringa2, *stringa1); //Restituisce 0 se sono uguali altrimenti 1
Le Strutture
Una struttura è una collezione finita di variabili di diverso tipo ognuna identitficata da un nome
struct <etichetta> {<definizione-di-variabili>};
Esempio di Struttura
struct persona {char nome[20];int eta;float stipendio;};
Guardando l'esempio sopra con l'etichetta si attribuisce un nome alla definizione della struttura nome , età
e stipendio sono i campi (o membri) della strutturaSe ho un puntatore ad una struct, per accedere ai suoi campi posso usare l'operatore<strong>struct data</strong>
. ATTENZIONE: La definizione della struttura non provoca allocazione di memoria, ma introduce un nuovo tipo di dato. Una variabile di tipo struttura può essere dichiarata contestualmente alla definizione della struttura. In questo caso si può anche omettere l'etichetta di struttura.<strong>struct data</strong> {int giorno; int mese; int anno;} d1, d2;
d1 e d2 sono variabili di tipo<strong>struct data</strong>
. Una volta definita una variabile struttura, si accede ai singoli campi mediante la notazione puntata.<strong>struct punto</strong> {int x, y;} p1, p2;
...<strong>p1.x = 10;
p1.y = -2;
p2.x = 5;
p2.y = 7;
->
.
Utilizzo dei Puntatori nelle Strutture E' possibile utilizzare il puntatore delle struttura in questo modo:<strong>struct data</strong> {int giorno, mese, anno;} struct data d, *p;
...<strong>p->giorno = 15;
p->mese = 8;
p->anno = 2005;
#include <stdio.h>
#include <stdlib.h>
struct data {
int giorno, mese, anno;
};
int main() {
struct data d;
struct data *p;
p = &d;
p->giorno = 15;
p->mese = 8;
p->anno = 2005;
printf("Data: %d/%d/%d\n", p->giorno, p->mese, p->anno);
return 0;
}
<malloc.h>
struct data{
int giorno, mese, anno;
}*p;
int main(void){
p = malloc(sizeof(struct data));
p->giorno = 15;
p->mese = 8;
p->anno = 2005;
printf("%d", p->giorno);
}
OUTPUT
15
Attenzione è importantissimo allocare prima la memoria dinamicamente altrimenti viene dato in output un errore di memory.
Questo è possibile farlo pure senza puntatore
#include <stdio.h>
struct data{
int giorno, mese, anno;
}p;
int main(void){
p.giorno = 15;
printf("%d", p.giorno);
}
OUTPUT
15
TypeDefin C l'utente può introdurre nuovi tipi tramite una definizione di tipo.
typedef <TipoEsistente> <NuovoTipo>;
Esempio:
typedef int MioIntero;
MioIntero X,Y,Z;
int W;
Con le nozioni arrivate fino adesso siamo in grado di definire un nuovo tipo array e struttura, come segue:
typedef char string[20];
typedef struct {... } persona;
Ciò significa che non bisogna definire per esteso ogni volta che si definisce una nuova variabile come:
string s1, s2; // due stringhe di 20
caratteripersona p1, p2; // due strutture "persona"
09 - Le Librerie Standard
Generalità
La libreria standard del C è in realtà un insieme di librerie. Per usare una libreria bisognaincludere il file header (.h) con #include
#include <libreria.h>
Le Librerie più conosciute
----------------------------------------------------------------------------
#include <assert.h>
Contiene la macro assert, utilizzata per indentificare errori logici edaltri tipi di bug nelle versioni di debug di un programma.
----------------------------------------------------------------------------
#include <limits.h>
Contiene delle costanti definite che indicano le proprietà specifichedell'implementazione dei tipi interi, come l'intervallo dei numerirappresentabili (_MIN, _MAX).
----------------------------------------------------------------------------
#include <math.h>
Per le funzioni matematiche
comuni.
#include <stdio.h>
Fornisce le funzionalità basilari di input/output del C. Questo file include il prototipo della venerabile funzione printf.
#include <stdlib.h>
Per eseguire un gran numero di operazioni, tra cui conversioni, numeri pseudocasuali, allocazione di memoria, controllo del processo, variabili d'ambiente, segnali, ricerca ed ordinamento.
#include <string.h>
Per manipolare le stringhe.
#include <time.h>
Per convertire tra vari formati di data e ora.
....
La Libreria <stdio.h>
La libreria
Il file stdio.h contiene: - funzioni - Definizione di tipi di dato - Definizione di costanti - Definizione di variabili Le Funzioni in C Variabili Locali all'interno della funzione Al termine dell'esecuzione di una funzione le variabili locali vengono distrutte, quindi nulla è rimasto del lavoro svolto dalla funzione. Per questo motivo si utilizza il passaggio per riferimento. Un array non può essere un parametro formale, ma posso passare solo il puntatore all'array. Cosa significa passaggio per riferimento? Si trasferisce un riferimento ai parametri attuali (cioè i loro indirizzi) Nel trasferimento per riferimento la funzione non dovrebbe mai alterare il valore del puntatore. Per questo motivo se a e b sono puntatori allora si deve scrivere: int scambia(int *a, int *b){ *a = *b; } Esempio di funzione scambia valori per riferimento: #include
7;
scambia(&a , &b);
printf("Valore di A = %d ", a);
printf("Valore di B = %d ", b);
Passaggio di Variabili per Riferimento