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
statictenen à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
statictenen 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 dega 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
counti 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
