9 svar
98 visningar
mekatronik är nöjd med hjälpen
mekatronik 614
Postad: 17 aug 2022 20:27

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!

Fermatrix 7841 – Fd. Medlem
Postad: 17 aug 2022 20:43 Redigerad: 17 aug 2022 20:44

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. :)

Laguna Online 28470
Postad: 17 aug 2022 20:47

Menar du att du är osäker på vad * och ++ gör?

mekatronik 614
Postad: 17 aug 2022 20:59
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å

Laguna Online 28470
Postad: 17 aug 2022 21:10

do_it inkrementerar sitt andra argument och returnerar det, och p3 sätts till det.

Fermatrix 7841 – Fd. Medlem
Postad: 17 aug 2022 21:15 Redigerad: 17 aug 2022 21:15

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!

mekatronik 614
Postad: 17 aug 2022 21:19
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?

anders_k Online 234
Postad: 18 aug 2022 09:04
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.

mekatronik 614
Postad: 18 aug 2022 09:24
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 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.

Tack så mycket, du visade väldigt klart och tydligt!

Laguna Online 28470
Postad: 18 aug 2022 09:54

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.

Svara Avbryt
Close