En aquest tema, explorarem dos conceptes fonamentals en la programació en C: l'àmbit (scope) i la durada (lifetime) de les variables. Aquests conceptes determinen on es pot accedir a una variable i quant de temps roman en memòria.

Àmbit de les Variables

L'àmbit d'una variable es refereix a la regió del codi on la variable és accessible. En C, hi ha diversos tipus d'àmbit:

  1. Àmbit de Bloc (Local):

    • Les variables declarades dins d'una funció o bloc {} tenen àmbit local.
    • Només són accessibles dins del bloc on es declaren.
    void func() {
        int x = 10; // Variable local
        printf("%d\n", x); // Accessible aquí
    }
    // printf("%d\n", x); // Error: x no és accessible aquí
    
  2. Àmbit de Funció (Global):

    • Les variables declarades fora de qualsevol funció tenen àmbit global.
    • Són accessibles des de qualsevol funció dins del mateix fitxer.
    int x = 10; // Variable global
    
    void func1() {
        printf("%d\n", x); // Accessible aquí
    }
    
    void func2() {
        printf("%d\n", x); // Accessible aquí també
    }
    
  3. Àmbit de Fitxer (Estàtic):

    • Les variables globals declarades amb la paraula clau static tenen àmbit de fitxer.
    • Només són accessibles dins del fitxer on es declaren.
    static int x = 10; // Variable de fitxer
    
    void func1() {
        printf("%d\n", x); // Accessible aquí
    }
    
    // En un altre fitxer
    // extern void func1();
    // void func2() {
    //     printf("%d\n", x); // Error: x no és accessible aquí
    // }
    

Durada de les Variables

La durada d'una variable es refereix a quant de temps la variable roman en memòria. En C, hi ha quatre tipus principals de durada:

  1. Automàtica:

    • Les variables locals tenen durada automàtica per defecte.
    • Són creades quan s'entra al bloc i destruïdes quan se'n surt.
    void func() {
        int x = 10; // Durada automàtica
        // x és destruïda quan s'acaba la funció
    }
    
  2. Estàtica:

    • Les variables declarades amb la paraula clau static tenen durada estàtica.
    • Són creades quan el programa comença i destruïdes quan el programa acaba.
    void func() {
        static int x = 10; // Durada estàtica
        x++;
        printf("%d\n", x); // x manté el seu valor entre crides a func()
    }
    
  3. Global:

    • Les variables globals tenen durada estàtica per defecte.
    • Són creades quan el programa comença i destruïdes quan el programa acaba.
    int x = 10; // Durada global
    
    void func() {
        printf("%d\n", x); // x és accessible i manté el seu valor
    }
    
  4. Dinàmica:

    • Les variables creades amb funcions de gestió de memòria (malloc, calloc, realloc) tenen durada dinàmica.
    • Són creades i destruïdes manualment pel programador.
    void func() {
        int *x = (int *)malloc(sizeof(int)); // Durada dinàmica
        *x = 10;
        printf("%d\n", *x);
        free(x); // x ha de ser alliberada manualment
    }
    

Exercicis Pràctics

Exercici 1: Àmbit Local i Global

  1. Declara una variable global int g = 5;.
  2. Declara una funció void printGlobal() que imprimeixi el valor de g.
  3. Declara una funció void modifyGlobal() que modifiqui el valor de g a 10.
  4. Crida a printGlobal() abans i després de cridar a modifyGlobal() des de la funció main().

Solució:

#include <stdio.h>

int g = 5; // Variable global

void printGlobal() {
    printf("g = %d\n", g);
}

void modifyGlobal() {
    g = 10;
}

int main() {
    printGlobal(); // g = 5
    modifyGlobal();
    printGlobal(); // g = 10
    return 0;
}

Exercici 2: Durada Estàtica

  1. Declara una funció void staticCounter() que utilitzi una variable estàtica static int count = 0;.
  2. Incrementa count i imprimeix el seu valor cada vegada que es crida la funció.
  3. Crida a staticCounter() tres vegades des de la funció main().

Solució:

#include <stdio.h>

void staticCounter() {
    static int count = 0; // Variable estàtica
    count++;
    printf("count = %d\n", count);
}

int main() {
    staticCounter(); // count = 1
    staticCounter(); // count = 2
    staticCounter(); // count = 3
    return 0;
}

Resum

En aquest tema, hem après sobre l'àmbit i la durada de les variables en C. L'àmbit determina on es pot accedir a una variable, mentre que la durada determina quant de temps roman en memòria. Hem vist exemples pràctics de variables locals, globals, estàtiques i dinàmiques, i hem practicat amb exercicis per reforçar aquests conceptes. En el proper tema, explorarem les funcions recursives i com utilitzar-les de manera efectiva.

Curs de Programació en C

Mòdul 1: Introducció al C

Mòdul 2: Tipus de Dades i Variables

Mòdul 3: Flux de Control

Mòdul 4: Funcions

Mòdul 5: Arrays i Strings

Mòdul 6: Punteres

Mòdul 7: Estructures i Unions

Mòdul 8: Assignació Dinàmica de Memòria

Mòdul 9: Gestió d'Arxius

Mòdul 10: Temes Avançats

Mòdul 11: Millors Pràctiques i Optimització

Mòdul 12: Projecte i Avaluació Final

© Copyright 2024. Tots els drets reservats