4 svar
71 visningar
unicarl behöver inte mer hjälp
unicarl 21
Postad: 15 okt 2022 14:49

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!

Fermatrix 7841 – Fd. Medlem
Postad: 15 okt 2022 15:42 Redigerad: 15 okt 2022 15:43

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?

unicarl 21
Postad: 15 okt 2022 17:51
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

Fermatrix 7841 – Fd. Medlem
Postad: 15 okt 2022 17:57 Redigerad: 15 okt 2022 17:58

är du med på att v1v_1 inte påverkas?

Vi ändrar v2v_2, eftersom vi har fått adressen till v2v_2 säger vi att värdet i minnesadressen för v2v_2 är nu -C-C om vi antar att det ursprunligen var CC där. I detta fallet var det värdet 55, som nu blev -5-5

Nu ska vi summera och returnera v1+v2v_1+v_2, men eftersom v1v_1 är oförändrad är den fortfarande 33. v2v_2 är nu -5-5 varav vi får v1+v2=3+(-5)=3-5=-2v_1+v_2=3+(-5)=3-5=-2

anders_k 237
Postad: 15 okt 2022 20:00 Redigerad: 15 okt 2022 20:05

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)
Svara
Close