Vart pekar pekaren på efter funktionen?
Hej, jag skall rita bilder för denna uppgift kring vart pekarna pekar. Vart pekarna initialt pekar vet jag redan, men har lite svårt att förstå vad som händer i funktionen (har ringat in).
Har även ritat vart pekarna pekar innan funktionen (p3 pekar på NULL så har ej ritat något)
Någon som vet hur man skall tyda det som händer i funktionen? Har lite svårt för det!
Prova skriva ut b eller c.
Här gäller det att vi vet hur allokering sker i minnet.
Kom ihåg, att vi i princip kan anse en int array som en int*.
Det blir tydligare om du skriver ut med prinf innan och efter vad som händer och då tror jag du kommer inse något. :)
Menar du att du är osäker på vad * och ++ gör?
Laguna skrev:Menar du att du är osäker på vad * och ++ gör?
Nejdå, jag vet vad de gör men jag är osäker på hur pekarna påverkas. I själva funktionen ändrar den på b(p1) värdet i b och skickar ut det, även c(p3) inkrementeras två gånger.
Dock så förstår jag inte hur det här kan bli resultatet:
Då har a[1] fått värdet 5 och p3 pekar på den? Förstår inte varför den pekar så
do_it inkrementerar sitt andra argument och returnerar det, och p3 sätts till det.
En liten notering. Jag tycker att man ska vara konsekvent med sin syntax.
Du får absolut skriva int* c eller int *c, vilken man väljer är en smaksak. Det jag ogillar är att din lärare blandar. Det gör det jobbigt att läsa. Speciellt om man har mycket kod. Det gör också att man kan misstolka vad det är du gör.
Gör inte som din lärare. Välj ett sätt och håll dig till det sättet. Var konsekvent!
Dracaena skrev:En liten notering. Jag tycker att man ska vara konsekvent med sin syntax.
Du får absolut skriva int* c eller int *c, vilken man väljer är en smaksak. Det jag ogillar är att din lärare blandar. Det gör det jobbigt att läsa. Speciellt om man har mycket kod. Det gör också att man kan misstolka vad det är du gör.
Gör inte som din lärare. Välj ett sätt och håll dig till det sättet. Var konsekvent!
Oj då, jag la inte ens märke till det faktiskt. Jag tror inte det gör någon skillnad ändå, men förstår vad du menar...
Detta gör mig förvirrad: do_it ökar p1 och sedan lägger det i p3, sedan inkrementeras det som finns på index 0 i arrayen. Men i Facit står det att arrayen består av siffrorna 1 och 5?
int a[] = {1,2};
int b[] = {3,4,5};
int* p1 = &a[0];
int* p2 = b;
int* p3 = NULL; // before
p3 = do_it(p3,p1,p2);
p3[0]++; // after
int* do_it(int* a, int* b, int* c) {
b++;
c++;
*b = *c;
return b;
}
legend
'--->' pekar på
{ x,y,z } sekventiellt minne
before
p3 ---> NULL // kommer inte ändras inne i funktionen
p1 ---> {1,2} // pekar på första elementet 1
p2 ---> {3,4,5} // pekar på första elementet 3
do_it: funktionens parametrar mappas -- a på p3, b på p1 och c på p2
b++
b ---> {2} // {1,2} orginal
c++
c ---> {4,5} // {3,4,5}
*b = *c
b ---> {4} // {1,4}
return b
p3 ---> {4} // {1,4}
p3[0]++
After
p3 ---> {5} // {1,5}
Så slutligen pekar p3 på andra elementet i a[]
Håller också med andra om att man skall deklarera konsekvent. Min personliga smak är att jag gillar att samla typen på ett ställe så.
int* p = NULL; // typen är int*
Också märkligt är första parametern till 'do_it', den fyller ingen funktion.
anders_k skrev:int a[] = {1,2}; int b[] = {3,4,5}; int* p1 = &a[0]; int* p2 = b; int* p3 = NULL; // before p3 = do_it(p3,p1,p2); p3[0]++; // after int* do_it(int* a, int* b, int* c) { b++; c++; *b = *c; return b; }
legend
'--->' pekar på
{ x,y,z } sekventiellt minnebefore
p3 ---> NULL // kommer inte ändras inne i funktionen p1 ---> {1,2} // pekar på första elementet 1 p2 ---> {3,4,5} // pekar på första elementet 3
do_it: funktionens parametrar mappas -- a på p3, b på p1 och c på p2
b++ b ---> {2} // {1,2} orginal c++ c ---> {4,5} // {3,4,5} *b = *c b ---> {4} // {1,4} return b p3 ---> {4} // {1,4} p3[0]++
After
p3 ---> {5} // {1,5}
Så slutligen pekar p3 på andra elementet i a[]
Håller också med andra om att man skall deklarera konsekvent. Min personliga smak är att jag gillar att samla typen på ett ställe så.
int* p = NULL; // typen är int*
Också märkligt är första parametern till 'do_it', den fyller ingen funktion.
Tack så mycket, du visade väldigt klart och tydligt!
Hela uppgiften är till för att förvirra, så det är inte så märkligt med p3. Hade det varit ett riktigt program så hade det nog varit fel.