Breviar 06 - Funcții cu vectori

În acest laborator veţi învăţa să:

  • Definiţi funcţii care primesc ca argumente vectori.

Vectori

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;
}

Problema rezolvata


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;
}
programare-cc/breviar-6.txt · Last modified: 2020/11/17 10:57 by bogdan.nutu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0