- Totes les variables que es defineixen dins d'una funció (incloent-hi la funció main) són locals a aquella funció. Totes les variables que es defineixen fora de tota funció són globals a totes les funcions. És a dir, es poden accedir des de qualsevol lloc del programa. No cal dir, però, que les variables locals són preferibles a les globals (programació estructurada).
ex 2.9: El fitxer ORDENA_L.C conté un programa que inicialitza un vector amb valors aleatoris, i després l'ordena i l'imprimeix, tot amb variables locals:
#include <stdio.h> #include <stdlib.h> /* funcions randomize() i random() */ #define N_VECT 10 /* número d'elements del vector */ void inirand_t(int n, int t[]) /* inicialitza el vector (per referència) */ { int i; for(i=0; i<n; i++) t[i] = random(80); } void ordena_t(int n, int t[]) /* ordena el vector (per referència) */ { /* n serveix per saber el número d'elements del vector (?) */ int i,j,temp; for(i=0; i<(n-1); i++) /* mètode de la bombolla */ for(j=i+1; j<n; j++) if (t[j]<t[i]) { temp = t[j]; t[j] = t[i]; t[j] = temp; } } void impri_t(int n, int t[]) /* imprimeix el vector */ { int i; for(i=0; i<n; i++) printf("%3d:\t%d\n",i,t[i]); } void main(void) { int vector[N_VECT]; /* vector LOCAL a main */ randomize(); inirand_t(N_VECT,vector); printf("Taula inicial :\n"); impri_t(N_VECT,vector); ordena_t(N_VECT,vector); printf("\nTaula ordenada :\n"); impri_t(N_VECT,vector); }
ex 2.10: El fitxer ORDENA_G.C conté un programa que fa el mateix que ORDENA_L.C, però fent ús de les variables globals. En concret defineix el vector com a global, i totes les funcions hi accedeixen directament:
#include <stdio.h> #include <stdlib.h> #define N_VECT 10 int vector[N_VECT]; /* definició de variable GLOBAL */ void inirand_t(void) { int i; for(i=0; i<N_VECT; i++) vector[i] = random(80); /* accés a variable global */ } void ordena_t(void) { int i,j,temp; for(i=0; i<(N_VECT-1); i++) for(j=i+1; j<N_VECT; j++) /* accés a variable global */ if (vector[j]<vector[i]) { temp = vector[j]; vector[j] = vector[i]; vector[i] = temp; } } void impri_t(void) { int i; /* accés a variable global */ for(i=0; i<N_VECT; i++) printf("%3d:\t%d\n",i,vector[i]); } void main(void) { randomize(); inirand_t(); /* no hi han paràmetres */ printf("Taula inicial :\n"); impri_t(); ordena_t(); printf("\nTaula ordenada :\n"); impri_t(); }
- Tot i que sembla que aquesta versió és més senzilla (no hi han paràmetres), resulta ser molt més difícil de modificar. Per exemple, si algun dia es volen afegir més vectors que puguin ser operats per les funcions impri_t, ordena_t, etc.