Vad är en pekare? Varför använder vi pekare? Hur används pekare? Hur deklarerar vi pekare i C? Hur kommer vi åt pekarvärdet? DAVA07/08 JE,MG,MG,PS 2 DAVA07/08 JE,MG,MG,PS Vad är en pekare? En pekare är en variabel som innehåller adressen till en annan variabel. Varför använder vi pekare? Används i programmering bl.a. för att: länka ihop datastrukturer (se senare om poster) föra över parametervärden kunna referera olika minnesplatser dynamiskt, dvs. under körning av ett program pekare har en nära koppling till strängar 3 DAVA07/08 JE,MG,MG,PS 4 DAVA07/08 JE,MG,MG,PS Alla variabler i ditt program har en adress i minnet. Denna adress kallas pekarvärde I C kan du få reda på värdet för en minnesadress med hjälp av minnesoperatorn & Deklaration/initiering av pekare Ex. int *ip, *ip2, i3, i4; i3 = 78; ip = &i3; &i3 ip i3 78 5 DAVA07/08 JE,MG,MG,PS 6 DAVA07/08 JE,MG,MG,PS, 1
Minnesrepresentation Minnesadress 2028 2032 2036 2040 2088 2092 78 2040 Variabel i4 i3 *ip *ip2 Användande av pekare ip2 = ip; i4 = 70; &i3 ip i3 78 ip2 i4 70 7 DAVA07/08 JE,MG,MG,PS 8 DAVA07/08 JE,MG,MG,PS Forts. Ex ip = &i4; Användande av pekare i3 ip 78 ip2 i4 70 Vad är skillnaden mellan byt_1 och byt_2? void byt_1(int *px, int *py) int temp; temp = *px; *px = *py; *py = temp; 9 DAVA07/08 JE,MG,MG,PS 10 DAVA07/08 JE,MG,MG,PS void byt_2(int x, int y) int temp; temp = x; x = y; y = temp; 11 DAVA07/08 JE,MG,MG,PS int i, p; p = 8; i = 5; byt_1(&i,&p); cout << i = << i << p = << p << endl; byt_2(i,p); cout << i = << i << p = << p << endl; 12 DAVA07/08 JE,MG,MG,PS, 2
px: i byt_1() px: i main() p: i: som inte används bör peka på 0 varför? vilka risker finns med pekare? py: 13 DAVA07/08 JE,MG,MG,PS 14 DAVA07/08 JE,MG,MG,PS Hur kommer vi åt pekarvärdet? Exempel: int *p1; int i = 7, g = 19; p1= &i; g = *p1; cout << Värdet är << g << endl; Vektorer/Strängar 15 DAVA07/08 JE,MG,MG,PS DAVA07/08 JE,MG,MG,PS Vektorer I minnet hos datorn ligger elementen i vektorn i sekvens, dvs. efter varandra Samtliga element i vektorn måste vara av samma typ OBS! Första positionen i vektorn är position 0 Ex. Vektorer int my_vektor[6]=3,7,19,-3,44,9; my_vektor int 3 7 19-3 44 9 position 0 1 2 3 4 5 17 DAVA07/08 JE,MG,MG,PS 18 DAVA07/08 JE,MG,MG,PS, 3
Vektorer Viktigt Se till att du har tillräcklig storlek på din vektor! int my_vektor[6]=3,7,19,-3,44,9,321,2; Vektorer/strängar En sträng är en vektor som kan lagra tecken OBS! Reservera plats för \0 (strängslut) char my_vektor[6]= O, l, l, e, \0 ; my_vektor? Strängslut int 3 7 19-3 44 9 321 2 char O l l e \0 position 0 1 2 3 4 5 position 0 1 2 3 4 5 19 DAVA07/08 JE,MG,MG,PS 20 DAVA07/08 JE,MG,MG,PS Vektorer/strängar Initiering av strängar Ex: char namn[7] = B, e, n, g, t, \0 ; enklare char namn[7] = Bengt ; och vektorer/strängar Vad har pekare och vektorer gemensamt? När vill man använda en vektor? Hur skapar man en sträng? char B e n g t \0 position 0 1 2 3 4 5 6 21 DAVA07/08 JE,MG,MG,PS 22 DAVA07/08 JE,MG,MG,PS och vektorer char *p; resp. char p[5]; Är detta samma sak, eller vad skiljer? vektorer Exempel: Vad blir utskriften av nedanstående? int test[3], i ; /* dekl. en vektor och en var */ test[1] = 5; test[2]= 77; for( i = 0; i < 3; i++) cout << På plats << i << ligger värdet << test[i]) << endl; return 0; 23 DAVA07/08 JE,MG,MG,PS 24 DAVA07/08 JE,MG,MG,PS, 4
Matriser En vektor går i en dimension Det går att skapa strukturer i flera dimensioner, matriser I princip går det också att skapa strukturer i ännu fler dimensioner, men det blir svårare att tänka sig Strängar/Matriser Ex. resultat i en tävling med flera omgångar int result[3][6]; Tävlande Omgång 7 19 3 10 2 6 5 4 31 2 6 9 2 1 4 6 8 2 25 DAVA07/08 JE,MG,MG,PS 26 DAVA07/08 JE,MG,MG,PS Strängar Hur jämför du två strängar? Ex.. Hur lägger du ihop två strängar? Ex.. Strängfunktioner #include <string.h> strcpy(x,y) strcmp(x,y) strcat(x,y) strlen(str) Hur kopierar du en sträng? Ex.. 27 DAVA07/08 JE,MG,MG,PS 28 DAVA07/08 JE,MG,MG,PS Strängfunktioner char * strcpy(char * s1, const char s2); /* resultatet är att s2 har kopierats till s1*/ int strcmp(char * s1, char * s2); /* jämför s1 och s2 om de är lika*/ char * strcat(char * s1, char * s2); /* slår ihop s1 och s2 så att s1 blir en sammnaslagen sträng med s1- >s2*/ int strlen(char * str); /* returnerar antal tecken i str, men strängslutsteckenet räknas ej */ Allokering Allokera: tilldela och anvisa plats Allokering innebär att göra en minnesplats tillgänglig för användning Allokering sker för enkla datatyper automatiskt ex. int i; 29 DAVA07/08 JE,MG,MG,PS 30 DAVA07/08 JE,MG,MG,PS, 5
new char *duplicera(char *s) char *p; p = new char[strlen(s)+1]; if(p!=null) strcpy(p,s); return p; Avallokering Deallokering innebär motsatsen till allokering, dvs. att lämna tillbaka den minnesplats man tidigare tog i anspråk till systemet. delete [] p; int * q = new int; delete q; q = NULL; 31 DAVA07/08 JE,MG,MG,PS 32 DAVA07/08 JE,MG,MG,PS Allokering kopplat till pekare och arrayer char *p; resp. char p[10]; char p[10] innebär att ett minnesutrymme för 10 tecken är allokerat char *p innebär att en pekare är deklarerad, men inget användbart minnesutrymme är allokerat. Allokering/ och vektorer Exempel: char test[7]; char *p char a b a f P g \0 position 0 1 2 3 4 5 6 p? I detta fall är minnesutrymmet för vektorn allokerat Det här är en pekare till första pos för en ännu ej allokerad sträng Strängslut 33 DAVA07/08 JE,MG,MG,PS 34 DAVA07/08 JE,MG,MG,PS som parametrar int sum(const int * arr, int storl) int i, s = 0; for(i = 0; i < storl; i++) s += arr[i]; return s; int i = 5 ; summa; int v1[i]=1,2,3,4,5; summa =sum(v1,i); cout << Summan är << summa << endl; return 0; 35 DAVA07/08 JE,MG,MG,PS, 6