C Cheat Sheet
Ultimo aggiornamento
Hello World e struttura del programma
Ogni programma C parte da main e restituisce un int.
| Elemento | Codice |
|---|---|
| Includere un header | #include <stdio.h> |
| Punto di ingresso | int main(void) { ... } |
| Con argomenti da riga di comando | int main(int argc, char *argv[]) { ... } |
| Stampare una riga | printf("Hello, World!\n"); |
| Restituire successo | return 0; |
| Commento su una riga | // comment |
| Commento a blocco | /* comment */ |
Tipi di dati
Le dimensioni dipendono dalla piattaforma; i minimi qui sotto sono garantiti dallo standard.
| Tipo | Descrizione |
|---|---|
int | Intero, almeno 16 bit (di solito 32) |
unsigned int | Intero non negativo |
long / long long | Interi più ampi (almeno 32 / 64 bit) |
float / double | Virgola mobile a precisione singola / doppia |
char | Un singolo byte, usato anche per i caratteri |
_Bool (bool tramite <stdbool.h>) | true o false |
size_t | Tipo senza segno per dimensioni e indici |
void | Nessun tipo: usato per funzioni e puntatori generici |
Specificatori di formato di printf e scanf
Segnaposto che corrispondono al tipo di ciascun argomento.
| Specificatore | Corrisponde a |
|---|---|
%d / %i | int con segno |
%u | int senza segno |
%ld / %lld | long / long long |
%f | double (e float in printf) |
%.2f | double con 2 cifre decimali |
%c | Un singolo char |
%s | Stringa (char *) |
%p | Indirizzo di un puntatore |
%x | int senza segno in esadecimale |
%zu | size_t |
Operatori
| Operatore | Significato |
|---|---|
+ - * / % | Aritmetici (% è il resto intero) |
== != | Uguale / diverso |
< > <= >= | Confronto |
&& || ! | And / or / not logici |
& | ^ ~ << >> | And, or, xor, not bit a bit e shift |
++ -- | Incremento / decremento |
+= -= *= /= | Assegnazione composta |
cond ? a : b | Condizionale ternario |
sizeof(x) | Dimensione in byte di un tipo o di una variabile |
Controllo del flusso
| Istruzione | Sintassi |
|---|---|
| If / else | if (x > 0) { ... } else { ... } |
| Else if | else if (x == 0) { ... } |
| Switch | switch (n) { case 1: ...; break; default: ...; } |
| Ciclo while | while (i < n) { ... } |
| Ciclo do-while | do { ... } while (i < n); |
| Ciclo for | for (int i = 0; i < n; i++) { ... } |
| Break / continue | break; esce da un ciclo, continue; passa all'iterazione successiva |
| Goto (raro) | goto label; ... label: |
Funzioni
Dichiarale prima di usarle oppure aggiungi un prototipo in cima al file.
| Operazione | Sintassi |
|---|---|
| Definire una funzione | int add(int a, int b) { return a + b; } |
| Prototipo (dichiarazione) | int add(int a, int b); |
| Nessun valore di ritorno | void greet(void) { ... } |
| Nessun parametro | int rand_seed(void) { ... } |
| Passaggio per puntatore (per modificare) | void inc(int *p) { (*p)++; } |
| Passare un array | int sum(int arr[], int n) { ... } |
| Static (locale al file) | static int helper(void) { ... } |
Puntatori e memoria
Un puntatore contiene un indirizzo. La memoria dell'heap va liberata a mano.
| Operazione | Sintassi |
|---|---|
| Dichiarare un puntatore | int *p; |
| Indirizzo di | p = &x; |
| Dereferenziare (lettura/scrittura) | int y = *p; / *p = 10; |
| Puntatore nullo | int *p = NULL; |
| Allocare sull'heap | int *a = malloc(n * sizeof(int)); |
| Allocare e azzerare | int *a = calloc(n, sizeof(int)); |
| Ridimensionare un'allocazione | a = realloc(a, newSize); |
| Liberare memoria dell'heap | free(a); |
| Aritmetica dei puntatori | *(a + i) equivale a a[i] |
Array e stringhe
In C le stringhe sono array di char terminati da \0.
| Operazione | Sintassi |
|---|---|
| Dichiarare un array | int nums[5]; |
| Inizializzare un array | int nums[] = {1, 2, 3}; |
| Accedere a un elemento | nums[0] = 10; |
| Lunghezza dell'array (array sullo stack) | sizeof(nums) / sizeof(nums[0]) |
| Letterale stringa | char s[] = "hello"; |
| Lunghezza di una stringa | strlen(s) (escluso \0) |
| Copiare una stringa | strcpy(dst, src); |
| Confrontare stringhe | strcmp(a, b) == 0 significa uguali |
| Concatenare stringhe | strcat(dst, src); |
Struct e libreria standard più usata
| Operazione | Sintassi |
|---|---|
| Definire una struct | struct Point { int x; int y; }; |
| Dichiarare e accedere | struct Point p; p.x = 1; |
| Accesso tramite puntatore | p->x = 1; (come (*p).x) |
| Alias di tipo | typedef struct Point Point; |
| Leggere l'input | scanf("%d", &n); |
| Convertire una stringa in int | int n = atoi("42"); |
| Valore assoluto / potenza | abs(x) (int), pow(x, y) da <math.h> |
| Ordinare un array | qsort(arr, n, sizeof(int), cmp); |
La sintassi, gli specificatori di formato e gli schemi con i puntatori di C che usi di più, in una sola pagina. Questa cheat sheet di C è un riferimento rapido per scrivere in C: tipi di dati, specificatori di printf/scanf, operatori, controllo del flusso e le operazioni su puntatori e memoria che mettono in difficoltà.
Tutto quello che trovi qui è C standard (C99/C11) e si compila con gcc o clang. Copia quello che ti serve oppure prova qualsiasi frammento dal vivo nel playground C, senza installare nessun compilatore. Stai imparando il C? Il corso interattivo gratuito di C di Coddy ti fa mettere le mani su puntatori, memoria e libreria standard.
Domande frequenti sulla cheat sheet di C
Questa cheat sheet di C è gratuita?
Qual è la differenza tra stack e heap in C?
malloc o calloc, resta in vita finché non chiami free e si usa quando ti serve memoria che sopravviva alla funzione corrente o la cui dimensione è nota solo a runtime. Dimenticare di chiamare free sulla memoria dell'heap provoca un memory leak.Perché scanf richiede la e commerciale (&) e printf no?
scanf scrive il valore nella tua variabile, quindi le serve l'indirizzo della variabile, ed è proprio quello che le dà &x. printf legge soltanto il valore, quindi le passi il valore stesso. L'eccezione sono le stringhe: un array di char decade già in un puntatore, quindi scrivi scanf("%s", name) senza &.