Variabili locali in linguaggio C

In questa lezione vedremo come dichiarare le variabili locali in linguaggio C. Una variabile locale è una variabile dichiarata all'interno del corpo di una funzione.

Una variabile locale è visibile solo all'interno della funzione in cui è dichiarata. Questo significa che una variabile locale non può essere utilizzata all'esterno della funzione stessa.

Variabili locali

Quando dichiariamo una variabile nel corpo di una funzione, tale variabile prende il nome di variabile locale della funzione.

Ad esempio, supponiamo di voler realizzare una funzione somma che restituisce la somma dei primi n numeri interi positivi. La funzione somma avrà un parametro n che indica il numero di numeri interi positivi da sommare. La funzione somma potrebbe essere implementata come segue:

int somma(int n) {
    int i;
    int somma = 0;
    for (i = 1; i <= n; i++) {
        somma += i;
    }
    return somma;
}

In questo esempio, le variabili i e somma sono variabili locali della funzione somma. Queste variabili sono visibili solo all'interno della funzione e non possono essere utilizzate all'esterno di essa.

Infatti, se provassimo ad utilizzare la variabile i all'esterno della funzione somma, il compilatore ci segnalerebbe un errore:

int main() {
    int n = 10;
    int s = somma(n);
    printf("La somma dei primi %d numeri interi positivi è %d\n", n, s);
    printf("La variabile i vale %d\n", i);
    return 0;
}

Provando a compilare il programma con il comando gcc variabili-locali.c -o variabili-locali otterremo il seguente errore:

variabili-locali.c: In function ‘main’:
variabili-locali.c:7:49: error: ‘i’ undeclared (first use in this function)
     printf("La variabile i vale %d\n", i);
                                        ^
variabili-locali.c:7:49: note: each undeclared identifier is reported only once for each function it appears in 
Definizione

Variabili locali

Una Variabile locale in linguaggio C è una qualunque variabile definita all'interno del corpo di una funzione. Le variabili locali sono visibili solo all'interno della funzione in cui sono dichiarate e non possono essere utilizzate all'esterno di essa.

Spesso queste variabili sono chiamate anche Variabili automatiche.

Proprietà delle variabili locali

Le variabili locali hanno alcune proprietà:

Definizione

Durata di vita automatica

La durata di vita di una variabile, in inglese Storage duration è la porzione di esecuzione del programma durante la quale la memoria (storage) della variabile esiste ed è valida.

Una variabile locale ha una durata di vita automatica nel senso che la memoria per la variabile viene allocata quando la funzione viene chiamata e viene liberata quando la funzione termina. Da ciò deriva il fatto che tali variabili sono note anche con il nome di Variabili automatiche.

Questo concetto della durata di vita automatica sarà più chiaro quando studieremo, nelle prossime lezioni, il concetto di Stack di Chiamata delle Funzioni.

Definizione

Visibilità limitata

La visibilità, in inglese Scope, di una variabile è quella porzione di programma nel quale la variabile può essere acceduta.

Nel caso di una variabile locale la visibilità è limitata al corpo della funzione in cui è dichiarata. Questo significa che una variabile locale non può essere utilizzata all'esterno della funzione in cui è dichiarata. Essa risulterà visibile a partire dal punto in cui è dichiarata fino alla fine del corpo della funzione stessa.

Variabili locali e C99

Poiché nello standard C99 è possibile dichiarare una variabile anche dopo l'inizio della funzione in cui è dichiarata, è possibile dichiarare una variabile locale anche dopo aver eseguito altre istruzioni.

Ad esempio, potremmo voler implementare una funzione che esegue la somma dei primi n numeri interi positivi e calcola il quadrato di questo valore. La funzione potrebbe essere implementata come segue:

int somma_quadrato(int n) {
    int i;
    int somma = 0;
    for (i = 1; i <= n; i++) {
        somma += i;
    }
    int quadrato = somma * somma;
    return quadrato;
}

In questa funzione abbiamo dichiarato la variabile quadrato dopo aver eseguito il ciclo for. Lo scope o visibilità della variabile quadrato è limitato alle due ultime istruzioni della funzione somma_quadrato.

Variabili locali statiche

Le variabili locali statiche sono variabili locali che mantengono il loro valore anche dopo la terminazione della funzione in cui sono dichiarate. Questo significa che la memoria per la variabile locale statica viene allocata una sola volta e viene liberata solo alla fine dell'esecuzione del programma.

Le variabili locali statiche sono utili quando si vuole mantenere il valore di una variabile locale anche dopo la terminazione della funzione in cui è dichiarata.

Ad esempio, supponiamo di voler implementare una funzione conta che conta il numero di volte che viene chiamata. La funzione conta potrebbe essere implementata come segue:

int conta() {
    static int contatore = 0;
    contatore++;
    return contatore;
}

In questa funzione abbiamo dichiarato la variabile contatore come variabile locale statica. Questa variabile viene inizializzata alla prima chiamata della funzione conta e viene incrementata ogni volta che la funzione conta viene chiamata. Questo significa che la variabile contatore mantiene il suo valore anche dopo la terminazione della funzione conta. Per farlo abbiamo usato la parola chiave static prima della dichiarazione della variabile contatore.

Se proviamo ad usare la funzione conta come segue:

int main() {
    int i;
    for (i = 0; i < 10; i++) {
        printf("La funzione conta è stata chiamata %d volte\n", conta());
    }
    return 0;
}

Otterremo il seguente output:

La funzione conta è stata chiamata 1 volte
La funzione conta è stata chiamata 2 volte
La funzione conta è stata chiamata 3 volte
La funzione conta è stata chiamata 4 volte
La funzione conta è stata chiamata 5 volte
La funzione conta è stata chiamata 6 volte
La funzione conta è stata chiamata 7 volte
La funzione conta è stata chiamata 8 volte
La funzione conta è stata chiamata 9 volte
La funzione conta è stata chiamata 10 volte

A differenza delle variabili locali normali, una variabile locale statica ha una durata di vita statica. Questo significa che la memoria per la variabile locale statica viene allocata una sola volta e viene liberata solo alla fine dell'esecuzione del programma.

Tuttavia, la visibilità di una variabile locale statica è sempre limitata al corpo della funzione in cui è dichiarata. Quindi, come una variabile locale normale, una variabile locale statica non può essere utilizzata all'esterno della funzione in cui è dichiarata.

Definizione

Variabili locali statiche

Le variabili locali statiche sono variabili locali che mantengono il loro valore anche dopo la terminazione della funzione in cui sono dichiarate.

Per dichiarare una variabile locale statica si usa la parola chiave static prima della dichiarazione della variabile stessa:

static tipo nome_variabile;

La visibilità di una variabile locale statica è limitata al corpo della funzione in cui è dichiarata e non può essere acceduta dall'esterno.

Variabili locali e parametri

I parametri di una funzione hanno le stesse identiche proprietà delle variabili locali. In particolare, i parametri di una funzione hanno una durata di vita automatica e una visibilità limitata.

Infatti, l'unica differenza tra i parametri di una funzione e le variabili locali è che i parametri di una funzione sono dichiarati nella lista dei parametri della funzione e sono inizializzati a partire dagli argomenti passati alla funzione quando viene chiamata.

Definizione

Parametri e variabili locali

Un parametro di una funzione è a tutti gli effetti una variabile locale della funzione stessa. I parametri di una funzione hanno le stesse proprietà delle variabili locali:

  • Durata di vita automatica: la memoria per i parametri di una funzione viene allocata quando la funzione viene chiamata e viene liberata quando la funzione termina.
  • Visibilità limitata: la visibilità dei parametri di una funzione è limitata al corpo della funzione in cui sono dichiarati.

In Sintesi

In questo capitolo abbiamo imparato:

  • Che le variabili locali sono variabili dichiarate all'interno del corpo di una funzione.
  • Che le variabili locali hanno una durata di vita automatica e una visibilità limitata.
  • Che le variabili locali statiche sono variabili locali che mantengono il loro valore anche dopo la terminazione della funzione in cui sono dichiarate.
  • Che i parametri di una funzione hanno le stesse proprietà delle variabili locali.

Nella prossima lezione introdurremo il concetto di Variabili Esterne o spesso chiamate Variabili Globali.