Răspuns :
Cand se apeleaza o functie cu parametri, acestia vor fi copiati inainte de apel in stack, se va face apelul la functie(care va folosi COPIILE, nu structurile originale, pe care le poate modifica dupa nevoie) si dupa apelul la functie toata memoria pentru parametri va fi eliberata. In C++ se pot folosi referinte, care modifica si structurile originale, dar in C poti doar sa folosesti pointeri sau sa declari instanta intr-un loc accesibil functiei si sa nu mai fie transmisa ca parametru.
Pentru varianta cu pointeri:
#include < stdio.h >
#include < stdlib.h >
struct nrComplex
{
float Re, Im;
};
void conjugaComplex (struct nrComplex *x)// declarat ca pointer
{
x->Re = x->Re;// pentru pointeri x->Re inseamna (*x).Re, si * in cazul asta e operatorul de dereferentiere
x->Im = (-1)*x->Im;// si x->Im inseamna (*x).Im
}
int main()
{
struct nrComplex z1 = {2,3};
conjugaComplex(&z1);//aici se transmite adresa obiectului z1 (& - operator de referentiere)
printf("%f, %f", z1.Re, z1.Im);
return 0;
}
Acum parametrul trasmis este o adresa, nu o structura, asa ca acum functia primeste o copie a adresei(care se poate modifica dar nu este recomandat, poate corupe memoria), dar nu o copie a structurii, asa ca acum poate modifica structura pentru ca stie unde se afla in memorie.
In cazul in care ai cunostiinte despre asamblatorul GAS(Gnu AS) si sintaxa pe care o foloseste, poti vedea codul assembly generat din cod c cu optiunea -S (gcc -S cod.c si vei avea un fisier nou numit cod.s in care vor fi instructiunile assembly respective).
Vă mulțumim că ați ales să vizitați platforma noastră dedicată Informatică. Sperăm că informațiile disponibile v-au fost utile. Dacă aveți întrebări suplimentare sau aveți nevoie de sprijin, nu ezitați să ne contactați. Vă așteptăm cu drag și data viitoare! Nu uitați să adăugați site-ul nostru la favorite pentru acces rapid.