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).
2 votes Thanks 3
Danutz98
Mersi pentru explicație! Chiar nu știam cum să pun pointerii.
CinevaFaraNume
Sunt destul de folositi asa ca e bine sa intelegi cum functioneaza.
Danutz98
Da. Eu ar trebui să știu fiindcă materia mea e și din programare dinamică si clase dar nu le-am înțeles bine.
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).