# C/Blocchi e funzioni/main

C
Copertina Tutti i moduli · Sviluppo
* LinguaggioC/Linguaggio
** PanoramicaC/Linguaggio/Panoramica
** Struttura del linguaggioC/Linguaggio/Struttura del linguaggio
* Variabili, operatori e costantiC/Variabili, operatori e costanti
** VariabiliC/Variabili, operatori e costanti/Variabili
** Operatori aritmeticiC/Variabili, operatori e costanti/Operatori aritmetici
** Operatori sui bitC/Variabili, operatori e costanti/Operatori sui bit
** CostantiC/Variabili, operatori e costanti/Costanti
* Blocchi e funzioniC/Blocchi e funzioni
** Blocchi if e switchC/Blocchi e funzioni/Blocchi if e switch
** Operatori logiciC/Blocchi e funzioni/Operatori logici
** CicliC/Blocchi e funzioni/Cicli
** FunzioniC/Blocchi e funzioni/Funzioni
** mainC/Blocchi e funzioni/main
** LibrerieC/Blocchi e funzioni/Librerie
** RicorsivitàC/Blocchi e funzioni/Ricorsività
* Vettori e puntatoriC/Vettori e puntatori
** VettoriC/Vettori e puntatori/Vettori
** PuntatoriC/Vettori e puntatori/Puntatori
** Interscambiabilità tra puntatori e vettoriC/Vettori e puntatori/Interscambiabilità tra puntatori e vettori
* StringheC/Variabili, operatori e costanti/Stringhe
* Enumerazioni, strutture e unioniC/Enumerazioni, strutture e unioni
** EnumerazioniC/Enumerazioni, strutture e unioni/Enumerazioni
** StruttureC/Enumerazioni, strutture e unioni/Strutture
** UnioniC/Enumerazioni, strutture e unioni/Unioni
* Conversioni di tipoC/Conversioni di tipo
* Lettura e scrittura su fileC/Lettura e scrittura su file
** File di TestoC/Lettura e scrittura su file/File di Testo
** File BinariC/Lettura e scrittura su file/File Binari
* Compilatore e precompilatoreC/Compilatore e precompilatore
** CompilatoreC/Compilatore e precompilatore/Compilatore
** DirettiveC/Compilatore e precompilatore/Direttive
** HeaderC/Compilatore e precompilatore/Header
* VisibilitàC/Visibilità
* Gestione della memoriaC/Gestione della memoria
* Le applicazioni CGIC/Le applicazioni CGI
* Appendice
** Librerie standardC/Appendice/Librerie standard
*** assert.hC/Appendice/Librerie standard/assert.h
*** ctype.hC/Appendice/Librerie standard/ctype.h
*** errno.hC/Appendice/Librerie standard/errno.h
*** float.hC/Appendice/Librerie standard/float.h
*** limits.hC/Appendice/Librerie standard/limits.h
*** locale.hC/Appendice/Librerie standard/locale.h
*** math.hC/Appendice/Librerie standard/math.h
*** setjmp.hC/Appendice/Librerie standard/setjmp.h
*** signal.hC/Appendice/Librerie standard/signal.h
*** stdarg.hC/Appendice/Librerie standard/stdarg.h
*** stddef.hC/Appendice/Librerie standard/stddef.h
*** stdio.hC/Appendice/Librerie standard/stdio.h
*** stdlib.hC/Appendice/Librerie standard/stdlib.h
*** string.hC/Appendice/Librerie standard/string.h
*** time.hC/Appendice/Librerie standard/time.h
** StrumentiC/Appendice/Strumenti
*** InstallerC/Appendice/Strumenti/Installer
** Librerie esterneC/Appendice/Librerie esterne
* Bibliografia
    IndiceC/Indice
Modifica il sommario
La funzione main è la funzione che viene eseguita all'inizio del programma. Essa può avere degli argomenti e deve restituire un valore.
Nessun'altra funzione nel programma deve avere il nome main.

## Restituzione di un valore

Per convenzione si è soliti far ritornare alla funzione main il valore 0 se l'esecuzione si è svolta in modo corretto ed un valore diverso da zero per rappresentare un codice di errore in caso di esecuzione fallita. Lo standard (C99) prevede la possibilità di omettere il valore di ritorno: in tal caso verrà restituito 0 in maniera implicita.
Per esempio:
Questo semplice programma restituirà 1 se il numero casuale a è maggiore di 10, 0 se è minore o uguale a 10. È possibile anche usare la funzione exit(int valore) per restituire un valore:

## Passaggio di parametri

Lo standard definisce 2 dichiarazioni per la funzione main:
* int main (void)
* int main (int argc, char *argv)
la prima è usata quando non interessa la riga di comando, la seconda altrimenti. Per quanto riguarda la seconda dichiarazione, il primo parametro indica il numero di argomenti passati al programma (incluso il nome del programma), il secondo contiene tutti gli argomenti sotto forma di stringhe (il nome del programma corrisponde ad argv[0]).
Talvolta viene anche incluso un terzo argomento (non previsto dallo standard) envp con la stessa sintassi di argv, questo array contiene le variabili di ambiente.
Comunque si possono usare altri nomi per i 2 argomenti di main.
Il passaggio di parametri ad un programma avviene tramite la sua invocazione da linea di comando. Infatti è sufficiente far seguire al nome del programma i valori da passare, separati da uno spazio. Gli argomenti vengono trattati come stringhe, in particolare, alla prima posizione del vettore argv sarà presente una stringa che contiene il nome del programma eseguito. Nel caso in cui sia necessario passare al programma parametri di altri tipi base sarà necessario effettuare una conversione.
Se questo programma si chiama pippo, il comando pippo buongiorno ciao restituirà: