This is an old revision of the document!
În acest laborator veţi învăţa să:
Atunci când definiţi o variablilă, compilatorul va fi informat despre 2 lucruri:
De exemplu, în declaraţia:
int n;
compilatorul va rezerva o zonă de memorie pentru această variabilă, de dimensiune sizeof(int) (4 Bytes, pe arhitecturi de 32bit), şi va asocia respectivei zone de memorie numele n.
Atunci când se face o atribuire,
n = 7;
în respectiva zonă de memorie va fi înscrisă noua valoare, 7.
Numele variabilelor în C au sens doar în domeniul în care au fost definite acele variabile. Acest domeniu de definiţie al unei variabile poartă numele de scope. De exemplu, în programul de mai jos, există 4 variabile distincte, toate purtând numele n!
#include <stdio.h> int n; /* Variabila 1 */ int f(int n /* Variabila 2 */) { n = 42; /* Variabila 2 */ } int g() { int n; /* Variabila 3 */ n = 42; /* Variabila 3 */ } int h() { n = 42; /* Variabila 1 */ } int main() { int n; /* Variabila 4 */ n = 42; /* Variabila 4 */ return 0; }
Observăm astfel, că nu putem accesa direct prin nume variabile definite într-o altă funcţie, deoarece numele nu au sens decât în interiorul funcţiei în care au fost declarate. Parametrii formali ai unei funcţii nu sunt altceva decât nişte variabile locale, care în momentul apelului primesc o copie a valorilor cu care a fost apelată funcţia. O funcţie de incrementare scrisă astfel:
void incorrect_increment(int n) { /* Se va incrementa doar o copie a valorii cu care a fost apelată funcţia! */ n++; }
Nu face decât să incrementeze o variaiblă locală funcţiei, efect ce nu poate fi observat din exterior!
Pentru a accesa un obiect definit într-o altă funcţie, îl putem referi, totuşi, folosindu-ne de adresa acestuia în memorie. Adresele în C poartă numele de pointeri.
Pentru a obţine adresa unei variabile, vom folosi operatorul & pus în faţa numelui variabilei, iar pentru a ne referi la valoarea memorată la o anumită adresă, vom folosi operatorul *.