Thema indholdsfortegnelse -- Tastaturgenvej: 'u'  Forrige tema i denne lektion -- Tastaturgenvej: 'p'  Næste slide i denne lektion -- Tastaturgenvej: 'n'Pointers og Arrays
23.  Call by reference parametre

I dette korte, men vigtige kapitel, introducerer vi en ny måde at bruge parametre på; Nemlig ved at overføre pointere som parametre. Kort sagt er der tale om parametre, som kan bruges til at ændre værdien af eksisterende variable. Det er også tale om en parametermekanisme som ofte er meget økonomisk i både tid og plads.

23.1 Call by reference parametre
 

23.1.  Call by reference parametre
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Ved brug af pointere kan vi realisere call by reference parametre i C

Vi skriver først et program, som ikke udnytter pointere og adresser på variable. Dermed bliver vi motiveret for at bruge pointere som parametre. Vi kan også bruge program 23.1 til at erindre hvordan værdiparametre (call by value parametre), diskuteret i bl.a. afsnit 12.5, virker.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

void swap(int p, int q){
   int   tmp;

   tmp = p;
   p = q;
   q = tmp;
}


int main(void)
{
   int   a = 3, b = 7;

   printf("%d  %d\n", a, b);     /* 3  7 is printed */
   swap(a, b);
   printf("%d  %d\n", a, b);     /* 3  7 is printed */
   return 0;
}
Program 23.1    Et forsøg på ombytning af to variables værdi uden pointere - virker ikke.

I program 23.1 herover ser vi med blåt definitionen af en funktion swap, og med rødt kaldet af swap. Vi overfører de to aktuelle parametre a og b, som modsvarer de to formelle parametre p og q i swap. I swap ombytter vi de to formelle parametres værdier, men der sker ingen ændring af de to aktuelle parametres værdier. Med andre ord, værdierne af a og b ændres ikke i kaldet af swap.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

void swap(int *p, int *q){
   int   tmp;

   tmp = *p;
   *p = *q;
   *q = tmp;
}


int main(void)
{
   int   a = 3, b = 7;

   printf("%d  %d\n", a, b);     /* 3  7 is printed */
   swap(&a, &b);
   printf("%d  %d\n", a, b);     /* 7  3 is printed */
   return 0;
}
Program 23.2    Funktionen swap og et hovedprogram, som kalder swap på to variable.

Programmet herover, program 23.2, er ændret lidt i forhold til program 23.1. I den blå del - funktionsdefinitionen - har vi indført to pointer parametre p og q. Både p og q skal pege på heltal. I den røde del, hvor vi kalder swap, overfører vi adressen på hhv. a og b som aktuelle parametre. Bemærk brugen af adresseoperatoren &.

I kroppen af definitionen af swap (den blå del) lægger vi *p over i temp. Dette indebærer at vi følger pointeren p for at tilgå den værdi, som p peger på. I det konkrete kald er det værdien af a, altså 3 som assignes til tmp. I det andet assignment bliver *q, som konkret er værdien af b, lagt over i temp. I det tredje assignment bliver *q, hvilket er a, assignet til værdien af temp. Altså lægger vi 3 i b. Du kan se outputtet i program 23.3.

Vi ser at vi i denne udgave af programmet opnår en ombytning af værdierne i a og b. Vi har altså skrevet en funktion, som gennem parametrene er i stand til at ændre værdier af variable, som er uden for selve funktionen. Dette er essensen af call by reference parametre.

1
2
3  7
7  3
Program 23.3    Output fra programmet.

Call by reference parametre opnås når pointere overføres som call by value parametre.

Vi har allerede mange gange gjort brug af call by reference parametre i scanf.

Lad os påpege én ekstra ting. I f.eks. assignmentet *p = *q i program 23.2 skelner vi mellem venstre værdien og højre værdien af et udtryk. I den engelske litteratur omtales dette ofte som l-values og r-values. *p optræder som venstreside værdi i assignmentet. Ergo får vi med *p fat i den plads, som pointeren p peger på. *q optræder på højresiden af assignmentet. Her får vi med *q fat i den værdi, som *q peger på.

Bemærk at sondringen mellem venstre værdier og højre værdier ikke blot gælder, når vi arbejder med pointere. I assignmentet i = j (hvor i og j f.eks. er erklæret som ints ) betegner i en plads i lageret (og ikke værdien gemt i denne plads). j betegner derimod værdien, som er gemt i den plads (variabel), der benævnes j.

Genereret: Onsdag 7. Juli 2010, 15:11:52
Thema indholdsfortegnelse -- Tastaturgenvej: 'u'  Forrige tema i denne lektion -- Tastaturgenvej: 'p'  Næste slide i denne lektion -- Tastaturgenvej: 'n'