![]() ![]() ![]() | Pointers og Arrays |
I dette kapitel diskuterer vi pointere i C.
|
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.
|
|
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; | |||
|
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; } | |||
|
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 | |||
|
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); | |||
|
Oparatoren * kaldes også for indirection operatoren For alle variable v gælder at udtrykket *&v er ækvivalent med udtrykket v |