webForumDet fria alternativet

Funktion som returnerar referens till för funktionen lokalt objekt?

C/C++

9 svar · 795 visningar · startad av Tinwëlint

Medlem sedan maj 2004451 inlägg
Frågan#1

Hur kan det här fungera? Fick i uppgift att skriva en funktion som returnerade en referens till det minsta elementet i en array. Satt som bäst och hackade runt och försökte skicka pekare till funktionen men testade till slut det här:

#include <iostream>

int & min(int arraycount, int  array[]);

using namespace std;
int main() {

	int array[]={8,-5,7,0,-3};

	min(5, array) = 123;
	for(int i=0;i<5;i++)
		cout<<array[i]<<endl;

return 0;

}

int & min(int arc, int arr[]){

	for(int i=1,min=arr[0],minindex;i<arc;i++){
		
		if (arr[i]<min){
			min=arr[i];
			minindex=i;
		}

	}

	int & rMin = arr[minindex];
	return rMin;
}

Har jag missat något eller? arr[] ska ju vara en array som kopieras till stacken och endast existerar med funktionen min. En referens till ett element i den borde ju inte rimligtvis vara en referens till ett element i den array som kopierats till funktionen. Men likväl är den det.

Medlem sedan juni 200010 432 inlägg
#2

array[] = * array, dvs det du gör är att skicka en pekare till första elementet i din array, inte lägga en kopia på den lokala stacken. Hade det varit en vanlig variabel så javisst, men det är annorlunda med arrays. Sen manipulerar du den referens du får tillbaka som inte heller den är i den lokala stacken av samma orsak.

Medlem sedan juli 2002581 inlägg
#3

Dessutom är det tur för dig att den är det, för du får inte returnera en referens till ett lokalt objekt och tro att något förutsägbart kommer att hända.

Medlem sedan maj 2004451 inlägg
#4

OK. Tänkte väl att det var nåt sånt. Javisst är det en ful och ganska dålig metod att bara testa lite olika sätt och se vilket som fungerar.
Men då har jag en följdfråga. Vad är skillnaden:

int & min(int * arr[])

int & min(int arr[])

int & min(int & arr[])

Den första borde väl innebära att man ska skicka en pekare (som då ska peka på arrayens första element?) i anropet. Enligt mitt test är den ogiltig och borde ha kanske ha en bestämd längd på arrayen.

Den andra innebär alltså att man, hur man ska säga, transparent skickar en pekare till arrayens första element. Den måste i vilket fall vara det smidigaste sättet när det sen kommer till att anropa funktionen.

Den sista då. Den fungerade inte så bra. Men den är väl kanske också ogiltig och arrayen måste ha en bestämd längd lika med längden av arrayen som skickas med anropet. Korrekt?

Medlem sedan juni 200010 432 inlägg
#5

Den första innebär en pekare till en array som har pekare som element, eller adresser om du så vill.
Den andra som pekare till första elementet
Den tredje som en referens till en array

Arrays kan skrivas på olika sätt men ändå betyda detsamma:
array = i[array] = *(array+i)
Det gemensamma är att endast namnet alltid pekar på första adressen (till första elementet) samt en indexering mot resten.

Medlem sedan maj 2004451 inlägg
#6

Jag funderade på varför det inte fungerar att returnera en pekare till ett element i arrayen som refereras genom anropet i alternativ tre.

Medlem sedan maj 20018 027 inlägg
#7

Om du vill returnera en pekare till något element i arrayen, varför inte pröva följande:

int * min(int *array)

Sedan returnerar du med:

return array[minindex];

Medlem sedan maj 2004451 inlägg
#8

Ojdå, jo det är klart.
Men jag skrev visst fel. Jag menade:
Jag funderade på varför det inte fungerar att returnera en referens till ett element i arrayen som refereras genom anropet i alternativ tre.

Medlem sedan juni 200010 432 inlägg
#9

Men du returnerar ju en referens till ett element redan. Annars hade inte "min(5, array) = 123;" fungerat.

Medlem sedan maj 2004451 inlägg
#10

Jo jag vet. Men jag gör det genom att använda:

int & min(int arr[])

som gör att en pekare till arrayens första element skickas till funktionen.

Jag undrar bara varför det inte fungerar att skicka en referens till arrayen till funktionen:

int & min(int & arr[])

och sedan returnera en referens till ett av elementen i den refererade arrayen.

277 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
150 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)