Færibreyta

: *Þessi grein fjallar um færibreytu í tölvunarfræði en færibreyta getur vísað til [[Stiki (stærðfræði)|stika í stærðfræði]].*

**Stiki** eða **færibreyta** er í forritun breyta sem vísar til gagna sem falli er látið í té, þar sem gögnin sjálf kallast **frumbreytur** eða **óháðar breytur**. Með færibreytum er átt við eins konar "ramma" sem eru fyrir hendi í öllum málum, en fylla má út á mismunandi hátt (gefa mismunandi gildi) í ólíkum málum.

Við skulum taka dæmi um færibreytur með falli skrifað í forritunarmálinu C. 

int summa( *int a*, *int b* )

Í þessu tilfelli eru færibreyturnar heiltölurnar a og b og hegðar fallið sér í samræmi við færibreyturnar.  Mjög líklegt má telja að fallið
myndi skila a +b, enda heitir fallið jú summa.

Færibreyta er í raun ekkert annað en vísir á minnishólf sem við höfum skýrt einhverju nafni okkur til einföldunar. Þegar við sendum færibreytu inn í fall höfum við val um að senda hana á nokkra vegu hvað minnishólfameðhöndlun varðar. Við getum sent inn afritunarfæribreytu eða tilvísunarfæribreytu. Munurinn er sá að þegar afritunarfæribreyta er send inn er gildi innsendu breytunnar afritað í nýtt minnishólf sem eingöngu er aðgengilegt innan fallsins. Þegar breyta er send inn í fall sem tilvísunarfæribreyta er í raun verið að senda inn tilvísun í minnishólf breytunnar. Þannig vísar breytan sem lifir innan fallsins í sama minnishólf og breytan sem send var inn í fallið og hafa því allar breytingar áhrif á báðum stöðum.

Einfaldast er að sýna þetta með stuttum dæmum:

## Afritunarfæribreyta

```
void fall(int a, int b);

int _tmain(int argc, _TCHAR* argv[])
{
	int x,y;
	x = 1; 
	y = 2; 
	fall( x ,y ); 
	cout << "x = " << x << " & y = " << y << endl; 
	
	return 0;
}

void fall(int a, int b)
{
	a = 3;

	b = 4;
}
```

Efst skilgreinum við fallið "fall" sem tekur inn tvær færibreytur með tölulegum gildum. Í aðal forritinu (main) búum við til tvær talnabreytur, x og y sem við gefum svo gildin 1 og 2. Því næst köllum við í fallið "fall" og sendum *x* og *y* inn í fallið sem færibreytur. Við þetta afritast gildi *x* inn í nýtt minnishólf breytunnar *a* og gildi *y* í nýtt minnishólf breytunnar *b*. Í fallinu er breytunni *a* gefið gildið *3* og breytunni *b* gefið gildið *4*. Að keyrslu fallsins loknu heldur keyrsla aðal forritsins áfram og gildi breytanna *x* og *y* er prentað út á skjá. Þar sem *a* og *b* fengu ný minnishólf hefur gildi þeirra engin áhrif á *x* og *y* og því prenatast "x = 1 & y = 2"

## Tilvísunarfæribreyta

```
void fall(int& a, int& b);

int _tmain(int argc, _TCHAR* argv[])
{
	int x,y;
	x = 1; 
	y = 2; 
	fall( x ,y ); 
	cout << "x = " << x << " & y = " << y << endl; 
	
	return 0;
}

void fall(int& a, int& b)
{
	a = 3;

	b = 4;
}
```

Eini munurinn í skilgreiningu fallsins "fall" er að *&* merkinu hefur verið bætt fyrir framan skilgreiningu *a* og *b*. Þegar *x* og *y* eru svo send inn í fallið vísar *a* á sama minnishólf og *x* og **b** á sama minnishólf og **y**. Þegar **a** er síðan gefið gildið **3** vistast það í þetta sameiginlega minnishólf og þegar **b** er gefið gildið **4** vistast það í hólfið sem **b** á sameiginlegt með **y**. Í þessu tilfelli skrifast því út "x = 3 & y = 4" í lokin.

## Tilvísanir


## Heimildir