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.
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.
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.
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?
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.
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.