T & r;
void incr(int & v) {
v += 1;
}
int a = 4;
incr(a);
// ora "a" vale 5
Il puntatore p deve essere inizializzato all'atto della sua definizione e non può essere modificato.
Come qualunque altra variabile un puntatore può essere scambiato per valore. Ad esempio:
void f(T*,...);
void f(const T*,...);
Come qualunque altra variabile un puntatore può essere scambiato per riferimento o per indirizzo. Ad esempio:
void f(T* &,...);
void f(const T* &);
void f(T**,...);
void f(const T**);
Una funzione può ritornare un puntatore a tipo T:
T* f(…);
Attraverso un puntatore può essere ritornato sia un dato atomico che strutturato.
Bisogna però fare attenzione alla classe di memorizzazione dell’entità cui il puntatore si riferisce, è un errore logico grave tentare di restituire attraverso un puntatore una variabile automatica (quindi locale ad un blocco e memorizzata nell’area stack).
Funzioni che ritornano puntatori sono spesso funzioni che operano su stringhe.
Esempio di funzione di libreria:
char* strcat(char* str1, const char* str2);
concatena la stringa str2 alla stringa str1 e restituisce il risultato sia nella stessa str1 che come valore di ritorno.
Notare che in questo caso non c’è pericolo di errore, purchè lo spazio di memoria per str1 sia stato adeguatamente allocato nel programma chiamante.
Perché strcat restituisce il risultato della
concatenazione anche,
come valore di ritorno?
strcat è un esempio di funzione del tipo:
T* f(...,T*,...);
strcat(strcat(a,b),c);
T& f(…, T&, …);
In C++ e’ possibile fornire argomenti ad un programma principale:
int main(int argc, char *argv[])
{
.....
system("PAUSE");
return 0;
}
Questo meccanismo consente di attivare un programma fornendogli dei parametri a linea di comando (S.O. Unix, MS-DOS/Windows)
La variabile argc contiene il numero di parametri che compongono la linea di comando con la quale il programma è stato lanciato (compreso il nome del programma).
L’array argv è un array di puntatori a variabili di tipo char che può anche essere visto come un array di stringhe, ognuna corrispondente ad una delle parole che compongono la linea di comando con cui viene invocato il programma (compreso il nome del programma).
Per convenzione gli argomenti passati a linea di comoando devono essere separati da spazi bianchi
Se ad esempio si vuole specificare da linea di comando il nome di due file su cui opera il programma eseguibile “copia”, il programma può essere lanciato digitando:
copia nomefile1 nomefile2
In questo caso:
Un puntatore è “legato” al tipo del dato a cui punta.
Non è possibile assegnare ad un puntatore l’indirizzo di un dato di tipo diverso.
Questa è una limitazione se il tipo del dato non è noto o può variare in alcune circostanze.
Per abilitare un puntatore a contenere solo un indirizzo, in modo che il tipo di dato non venga (momentaneamente) preso in considerazione è possibile definire un puntatore a tipo void.
Un puntatore a void è detto anche puntatore generico proprio per la sua capacità di puntare a dati di qualsiasi tipo.
Definizione di un puntatore a void:
void * ptr;
Non si può operare sul dato puntato dal un puntatore a void!
Si può solo memorizzarne l’indirizzo e confrontarlo con un altro indirizzo.
Un puntatore a void quindi non può essere de-referenziato direttamente (non si hanno indicazioni su come interpretare il contenuto di quella locazione di memoria!).
Per poter operare sull’oggetto puntato in C++ è necessario esplicitamente convertire il puntatore a void in un puntatore ad un tipo specifico.
Scrivere una funzione che effettui la divisione intera o la divisione reale sulla base del tipo dei dati puntati dai puntatori forniti in ingresso.
Scrivere un programma che definisce dinamicamente due variabili di tipo intero o di tipo reale a seconda della scelta effettuata da un utente e passi tali parametri alla funzione che effettua la divisione.
1. Strutture e typedef. Record in C/C++: Concetti Base
4. Puntatori a tipi di dato strutturati. Allocazione Dinamica
5. Puntatori: aspetti avanzati
7. Asserzioni
8. Gestione delle eccezioni. Concetti base
9. Programmazione modulare: concetti base
10. Programmazione Modulare: Meccanismi e Strumenti a supporto in C/C++
12. Esercitazione: Strutture Dati Pila e Coda
13. Esercitazione. Strutture Dati: Lista Concatenata
14. Meccanismi di Incapsulamento in C++ Namespaces
15. Programmazione orientata agli oggetti. Introduzione
Da C++ a UML
Capitolo 9, da par. 9.1 a 9.5
puntatori per accesso alla linea di comando: esempio 9.3
Funzioni che ritornano puntatori: par. 9.4, 9.5
Puntatori a void: par. 9.6
Puntatori a funzioni: par.9.7, 9.8, 9.9