Thema indholdsfortegnelse -- Tastaturgenvej: 'u'  Forrige tema i denne lektion -- Tastaturgenvej: 'p'  Næste slide i denne lektion -- Tastaturgenvej: 'n'Pointers og Arrays
22.  Pointers

I dette kapitel diskuterer vi pointere i C.

22.1 Introduktion til pointere22.3 Pointer variable
22.2 Pointerbegrebet i C22.4 Addresse og dereferencing operatorerne
 

22.1.  Introduktion til pointere
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Herunder viser vi, at pointere kan bruges som alternative adgangsveje til variable. Vi viser også, at pointere kan bruges som adgangsvej til dataområder, som er placeret uden for variablene. Dette er pointerne til de grønne områder i figur 22.1. De grønne dataområder i figuren vil typisk være frembragt med dynamisk allokering med malloc eller calloc. Mere om dette i afsnit 26.2.

Pointere er uløseligt knyttet til programmering i C

Figur 22.1    En illustration af to pointer variable. pvar indeholder en pointer til en integer, som peger på adressen af var. pobj indeholder en anden pointer, der peger på et objekt obj1,som ikke er indeholdt i nogen variabel. Fra obj1 peges der på et andet objekt obj2, som 'cyklisk' peger tilbage på obj1.

Den normale måde at tilgå data er gennem navngivne variable.

Pointere udgør en alternativ og fleksibel tilgangsvej til data.

 

22.2.  Pointerbegrebet i C
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Inden vi ser på eksempler beskriver vi aspekter af pointere i nedenstående punkter.

En pointer er en værdi som betegner en adresse på et lagret dataobjekt

  • Værdier af variable kan tilgås via pointere til variablenes indhold

    • Adresseoperatoren & giver os adressen på variablen - hvilket er en pointer til indholdet i variablen

  • Pointere til andre pladser i lageret returneres af de primitiver, der allokerer lager dynamisk

    • calloc og malloc

  • Vi visualiserer ofte en pointer som en pil, som udpeger på en værdi

    • Angivelse af lageradresser ville udgøre en mere maskinnær visualisering

  • Pointere har typer, alt efter hvilke typer af værdier de peger på

    • Pointere til integers, pointere til chars, ...

    • Pointer til void er en generisk pointer type i C

  • Dataobjekter, som ikke er indeholdt i nogen variabel, tilgås via pointere

  • Pointere, som ikke peger på noget dataobjekt, skal have værdien NULL

 

22.3.  Pointer variable
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Variable der indeholder pointere til dataobjekter af typen T skal erklæres af typen T *

I program 22.1 erklærer vi variablene i, ptr_i, j, ptr_j, c og ptr_c. Alle på nær j og ptr_j initialiseres sammen med erklæringerne.

Hvis der står en * foran en variabel i en erklæring betyder det at variablen skal indeholder en pointer. Konkret i program 22.1 skal ptr_i og ptr_j være pointers til heltal (int). ptr_c skal være en pointer til en char.

Assignmentet ptr_j = &j lægger adressen af j ind i ptr_j.

Assignmentet ptr_i = ptr_j lægger (kopierer) den pointer, som ptr_j indeholder, over i ptr_i. I figur 22.2 viser vi situationen efter at program 22.1 er kørt til ende.

Bemærk at pointere visualiseres som pile, men reelt er en pointer en lagreradresse.

1
2
3
4
5
6
  int i = 5, *ptr_i = &i, j = 7, *ptr_j;
  char c = 'a', *ptr_c = &c;

  ptr_j = &j;

  ptr_i = ptr_j;
Program 22.1    Erklæring og initialisering af et antal variable, hvoraf nogle er pointer variable.

Figur 22.2    Grafisk illustration af variablene i, j, c og deres tilsvarende pointervariable. Læg mærke til værdien af ptr_i, som er sat til at pege på samme værdi som ptr_j, altså variablen j.

Vi viser i program 22.2 et helt C program, som indeholder fragmentet fra program 22.1. Outputtet fra programmet ses i program 22.3. Vær sikker på at du kan relatere outputtet fra program 22.2 med situationen i figur 22.2.

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

int main(void) {
  int i = 5, *ptr_i = &i, j = 7, *ptr_j;
  char c = 'a', *ptr_c = &c;

  ptr_j = &j;

  ptr_i = ptr_j;

  printf("i=%d, ptr_i=%p, *ptr_i = %i\n", i, ptr_i,  *ptr_i); 
  printf("j=%d, ptr_j=%p, *ptr_j = %i\n", j, ptr_j,  *ptr_j);  
  printf("c=%c, ptr_c=%p, *ptr_c = %c\n", c, ptr_c,  *ptr_c);   
  
  return 0;
}
Program 22.2    Hele programmet inklusive udskrivning af variablenes værdier.

1
2
3
i=5, ptr_i=ffbef534, *ptr_i = 7
j=7, ptr_j=ffbef534, *ptr_j = 7
c=a, ptr_c=ffbef52f, *ptr_c = a
Program 22.3    Output fra programmet.

Bemærk i udskriften ovenfor, at pointere, udskrevet med konverteringstegnet %p i program 22.2, er vist i hexadecimal notation. Vi studerende hexadecimale tal i afsnit 16.5.

 

22.4.  Addresse og dereferencing operatorerne
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Vi sætter i dette afsnit fokus på to nye operatorer, som knytter sig til pointere, nemlig adresse operatoren & og dereferencing operatoren *.

Udtrykket &var beregnes til adressen af variablen var.

Udtrykket *ptrValue beregner den værdi, som ptrValue peger på.

Operatorerne * og & er unære prefix operatorer med høj prioritet

Dereferencing operatoren følger pointeren, og tilgår dermed det som pilen peger på.

I programmet herunder, som er helt identisk med program 22.2, viser de blå steder anvendelser af dereferencing operatoren, og de brune steder anvendelser af adresse operatoren.

1
2
3
4
5
6
7
8
9
10
  int i = 5, *ptr_i = &i, j = 7, *ptr_j;
  char c = 'a', *ptr_c = &c;

  ptr_j = &j;

  ptr_i = ptr_j;

  printf("i=%d, ptr_i=%p, *ptr_i = %i\n", i, ptr_i,  *ptr_i); 
  printf("j=%d, ptr_j=%p, *ptr_j = %i\n", j, ptr_j,  *ptr_j);  
  printf("c=%c, ptr_c=%p, *ptr_c = %c\n", c, ptr_c,  *ptr_c);
Program 22.4    Fremhævelse af adresse og dereferencing udtryk programmet fra forrige side.

Oparatoren * kaldes også for indirection operatoren

For alle variable v gælder at udtrykket *&v er ækvivalent med udtrykket v

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'