„Bendir“: Munur á milli breytinga

Efni eytt Efni bætt við
Ekkert breytingarágrip
Ekkert breytingarágrip
Lína 5:
Bendar eru til staðar með einum eða öðrum hætti í flestum [[forritunarmál]]um, svo [[C (forritunarmál)|C]], [[C++]], [[Pascal]] og [[FORTRAN]]. Notast verður við forritunarmálið [[C (forritunarmál)|C]] í dæmum í þessari grein.
 
Eitt af því sem margir eiga í erfiðleikum að skilja er notagildi Bendlabenda. T.d. er ekki hægt að skilgreina þá beint í nýrri forritunarmálum (eins og [[C_Sharp |C#]]). [[C_Sharp |C#]] notar hinsvegar bendlabenda mjög mikið en gerir það fyrir mann á "bak við tjöldin". Og er maður íÍ raun að gera svipaða hluti með því að nota [[Tilvísunarfæribreyta| Tilvísunarfæribreyturtilvísunarfæribreytur]]. En ef skoðað er dæmi hér fyrir neðan, sem lýsir því hvernig bendillbendir er sendur í fall, þá ætti mikilvægi bendlabenda að vera ljós.
 
== Dæmi ==
Lína 13:
</pre>
 
Í [[C (forritunarmál)|C]] eru bendar táknaðar með "*" tákni framan við nafn breytunnar í skilgreiningunni:
<pre>
int *pBreyta;
</pre>
 
Svo gefum við bendinum gildi með því að láta hanahann vísa í minnishólf upphaflegu breytunnar. "&" táknið er [[einundaraðgerð]] (unary operator) sem skilar minnishólfi breytunnar sem á eftir henni fylgir.
<pre>
pBreyta = &breyta;
</pre>
 
Ef við viljum prenta út eða nota stakið í bendlinumbendinum þurfum við að afvísa hann. Það er gert með því að setja "*" táknið fyrir framan breytuna.
<pre>
int summa = 5 + *pBreyta; // hér inniheldur summa töluna 9.
Lína 29:
</pre>
 
Hér er dæmi sem sýnir hvernig bendar og breytur eru sendar í föll.
Bendir sendur í fall á móti því að senda breytu í fall
<pre>
// Byrjum á því að skilgreina tvær breytur
Lína 39:
void tvofalda( int x )
{
x *= 2; // ( hægt væri að skrifa sömu línu sem x = x * 2; )
}
void tvofaldaMedBendli( int* x )
{
(*x) *= 2;
(*x) *= 2; // Munið að með því að setja stjörnuna fyrir framan x erum við að fá aðgang að gögnunum sem eru í minnishólfinu
}
// Köllum nú á föllin með breytunum
Lína 53 ⟶ 54:
cout << *pBreyta << endl; // hér prentast út 16
</pre>
Ástæðan fyrir því að fyrri breytan inniheldur enn töluna 8 er sú að breyta sjálf var ekki send inní fallið heldu bara gildið á henni (þ.e. talan 8).
En þegar bendirinn sjálfur var sendur inn í fallið tekur fallið "tvofaldaMedBendli" ekki við tölunni 8 heldur staðsetningu minnishólfsins sem inniheldur töluna 8.
Svo tvofaldartvöfaldar það fall innihald þessaþess minnishólfs fyrir okkur.
 
Það sem skiptir líka máli hér er að þegar kallað er í fyrra fallið er gerttekið afrit af tölunni 8 og hún er send inn í fallið. En þegar kallað er í seinna fallið eru ekki gerðtekið afrit af gögnunum heldur er bara staðsetningin á minnissvæðið send í fallið. Bendar geta því skipt miklu máli uppávarðandi minnisnotkun/hraða forrits, og þá sérstaklega ef verið er að vinna með stórt safn (t.d. senda stórannstóran [[Klasi (forritun)| klasa]] yfir í fall, eða renna í gegnum langannlangan lista og hvert stak hans er sent í fall).