„Bendir“: Munur á milli breytinga

Efni eytt Efni bætt við
mEkkert breytingarágrip
Ekkert breytingarágrip
Lína 1:
:''Hér er fjallað um hugtak í tölvunarfræði. Einnig er til hljóðfærið [[Bendir (hljóðfæri)|bendir]].''
 
'''Bendar''' eru, í [[forritun]], sérstakar [[breyta|breytur]] sem vísa í tiltekin [[minnishólf]] í tölvunni, frekar en að innihalda eitthvað tiltekið gildi sjálfar. Þegar aðgerð er gerð á bendi er í raun verið að gera aðgerð á minnishólfiðgögnin í minnishólfinu sem bendirinn bendir á. Þó er það svo að bendirinn inniheldur raunverulega gildi - þ.e., raðtölu þess minnishólfs sem það bendir á.
 
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 Bendla. T.d. er ekki hægt að skilgreina þá beint í nýrri forritunarmálum (eins og [[C_Sharp |C#]]). C# notar hinsvegar bendla 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æribreytur]]. En ef skoðað er dæmi hér fyrir neðan, sem lýsir því hvernig bendill er sendur í fall, þá ætti mikilvægi bendla að vera ljós.
 
== Dæmi ==
Fyrst skilgreinum við venjulega heiltölubreytu:
<pre>
int breyta = 04;
</pre>
 
Lína 20 ⟶ 22:
pBreyta = &breyta;
</pre>
 
Ef við viljum prenta út eða nota stakið í bendlinum þ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.
int summa2 = 5 + pBreyta; // hér á [[Þýðandi (tölvunarfræði)| þýðandinn]] að gefa villu.
</pre>
 
Bendir sendur í fall á móti því að senda breytu í fall
<pre>
// Byrjum á því að skilgreina tvær breytur
int breyta = 8;
int *pBreyta;
*pBreyta = 8;
 
// Skilgreinum nú tvö föll sem geta tekið á móti þessum breytum.
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; // 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
tvofalda( breyta );
tvofaldaMedBendli( pBreyta );
 
// Prentum svo út gildin í breytunum
cout << breyta << endl; // hér prentast út 8
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 tvofaldar það fall innihald þessa minnishólfs fyrir okkur.
 
Það sem skiptir líka máli hér er að þegar kallað er í fyrra fallið er gert afrit af tölunni 8 og hún er send inn í fallið. En þegar kallað er í seinna fallið eru ekki gerð afrit af gögnunum heldur er bara staðsetningin á minnissvæðið send í fallið. Bendar geta því skipt miklu máli uppá minnisnotkun/hraða forrits, og þá sérstaklega ef verið er að vinna með stórt safn (t.d. senda stórann [[Klasi (forritun)| klasa]] yfir í fall, eða renna í gegnum langann lista og hvert stak er sent í fall)
 
 
[[Flokkur:Forritun]]