Uppgift om pekare och adress-operator
Jag håller med uppgiften som finns bifogad nedan. Jag fattar dock inte alls hur jag ska tänka och blir sjukt förvirrad av pekaren och adress-operatorn . Enligt facit ska anropet retunera värdet -2. Skulle verkligen uppskatta om någon kan förklara vad det är som händer!
Hur långt hänger du med?
Vad har v1 för värde efter f1?
Vad har v2 för värde efter f1?
Dracaena skrev:Hur långt hänger du med?
Vad har v1 för värde efter f1?
Vad har v2 för värde efter f1?
De rör v2s värde i f1 som jag inte förstår hur det förändras
är du med på att inte påverkas?
Vi ändrar , eftersom vi har fått adressen till säger vi att värdet i minnesadressen för är nu om vi antar att det ursprunligen var där. I detta fallet var det värdet , som nu blev .
Nu ska vi summera och returnera , men eftersom är oförändrad är den fortfarande . är nu varav vi får
Jag antar att övningen är till för att visa att parametrar som skickas in till en funktion är kopierade men att man kan ändå ändra innehållet om man skickar in adressen av en variabel, då kan man ändra vad variabeln pekar på dvs innehållet.
Vid anropet
f2(2,5)
Kopieras 2 och 5 till f2 genom parametrarna v1 och v2
int f2(int v1, int v2) {
// v1 har en kopia av 2
// v2 har en kopia av 5
f1(v1,&v2); // variabeln v1 kopieras, adressen av v2 kopieras
return v1+v2; // v1 är fortfarande 2, v2 har fått ett nytt värde -5
}
void f1(int v1, int* v2) {
// v1 är en kopia av förra funktionens v1,
// det är inte samma variabel men innehållet är samma.
// v2 är pekare dvs den innehåller adressen v2 i f2,
// på så vis kan man ändra innehåller på vad pekaren pekar på
v1 = *v2 - 3; // eg. gör detta ingenting eftersom v1 är en lokal variabel som försvinner vid funktionsretur
*v2 = -*v2; // det som v2 pekar på, dvs 5 får nytt värde -5
}
Det är viktigt att komma ihåg i C kopieras alltid parametrar. Om man vill ändra något m.h.a. en funktion måste man skicka in adressen på den minnesarea på det man vill ändra, i fallet ovan variabeln adressen
Om man vill ändra en pekare då, så att den pekar på något annat? Då måste man skicka in adressen av pekaren
foo(int** p)