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:
-
À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í
- Les variables declarades dins d'una funció o bloc
-
À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é }
-
À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í // }
- Les variables globals declarades amb la paraula clau
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:
-
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ó }
-
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() }
- Les variables declarades amb la paraula clau
-
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 }
-
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 }
- Les variables creades amb funcions de gestió de memòria (
Exercicis Pràctics
Exercici 1: Àmbit Local i Global
- Declara una variable global
int g = 5;
. - Declara una funció
void printGlobal()
que imprimeixi el valor deg
. - Declara una funció
void modifyGlobal()
que modifiqui el valor deg
a 10. - Crida a
printGlobal()
abans i després de cridar amodifyGlobal()
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
- Declara una funció
void staticCounter()
que utilitzi una variable estàticastatic int count = 0;
. - Incrementa
count
i imprimeix el seu valor cada vegada que es crida la funció. - 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
- Introducció a la Programació
- Configuració de l'Entorn de Desenvolupament
- Programa Hello World
- Sintaxi i Estructura Bàsiques
Mòdul 2: Tipus de Dades i Variables
Mòdul 3: Flux de Control
Mòdul 4: Funcions
- Introducció a les Funcions
- Arguments de Funció i Valors de Retorn
- Àmbit i Durada de les Variables
- Funcions Recursives
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
- Introducció a la Gestió d'Arxius
- Lectura i Escriptura d'Arxius
- Posicionament d'Arxius
- Gestió d'Errors en Operacions d'Arxius
Mòdul 10: Temes Avançats
- Directives del Preprocessador
- Arguments de Línia de Comandes
- Llistes d'Arguments Variables
- Multifil en C
Mòdul 11: Millors Pràctiques i Optimització
- Llegibilitat del Codi i Documentació
- Tècniques de Depuració
- Optimització del Rendiment
- Consideracions de Seguretat