În acest laborator veţi învăţa să:
Atunci când declaraţi o variablilă, compilatorul va fi informat despre 2 lucruri: numele variabilei si tipul ei. De exemplu: int n. Astfel, compilatorul va rezerva o zonă de memorie pentru aceasta variabilă (4 octeţi pentru o arhitectură pe 32 biţi).
Atunci când se face o atribuire (ex: n = 7), la zona de memorie rezervată variabilei n va fi scrisă noua valoare.
Pentru ca o funcţie să poată modifica valoarea variabilei n, ea va avea nevoie de adresa la care se află. De exemplu, pentru a citi variabila am scrie:
scanf("%d", &n);
Atunci când declaraţi un vector, de exemplu int v[100], variabila v va reţine adresa primului element al vectorului, deci începutul zonei de memorie care a fost rezervată. Adresa celui de-al i-lea element va fi &v[i], lucru care poate fi scris şi ca v + i.
Dacă vrem să modificăm elementele din v în interiorul unei funcţii va trebui să trimitem ca parametru adresa sa de început, deci chiar v.
Să luăm ca exemplu o funcţie care adaugă un întreg x tuturor elementelor din vectorul v, de n elemente.
void add(int v[], int n, int x) { int i; for (i = 0; i < n; i++) v[i] = v[i] + x; }
Rulaţi următorul program şi încercaţi să înţelegeţi de ce afişează respectivele valori. Este important să întrebaţi dacă nu înţelegeţi ceva.
#include <stdio.h> int main() { int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; unsigned long int adr0, adr1, adr2; int *p1, *p2; printf("a = %p\na + 1 = %p\na + 3 = %p\n\n", a, a + 1, a + 3); printf("sizeof(a) = %d\n", sizeof(a)); printf("sizeof(a + 1) = %d\n", sizeof(a + 1)); printf("sizeof(a + 3) = %d\n\n", sizeof(a + 3)); adr0 = (unsigned long int) a; adr1 = (unsigned long int) (a + 1); adr2 = (unsigned long int) a + 1; printf("adr0 = %lu\nadr1 = %lu\nadr2 = %lu\n\n", adr0, adr1, adr2); p1 = a + 4; p2 = &(a[4]); printf("p1 = %p \t *p1 = %d\n", p1, *p1); printf("p2 = %p \t *p2 = %d\n", p2, *p2); printf("a + 4 = %p \t a[4] = %d\n", a + 4, a[4]); *p1 = *p1 + 1; printf("\na[4] = %d\n", a[4]); return 0; }