F6 - Pekare 1 Programmeringsteknik, 4p vt-00 Pekare & adresser Alla variabler är knutna till en viss adress i minnet int i; adressen till denna fås med &i Pekarvariabelns värde är en adress int *p; /* pekare till ett heltal */ ”icke”-värdet för pekare är NULL Möjligt att nå andra adresser via p p+1 är den efterföljande adressen *(p+1) är värdet i denna adress
F6 - Pekare 2 Programmeringsteknik, 4p vt-00 Pekare som parametrar Aktuell parameters värde kopieras till den formella parametern. Gäller även för pekare, dvs. adressen kopieras två identifierare pekar ut samma minnesutrymme. T.ex. låt två variabler byta värden void byt(int *a, int *b) { int t; /* temporär variabel */ t = *a; *a = *b; *b = t; } int v1,v2; byt(&v1,&v2); Anrop
F6 - Pekare 3 Programmeringsteknik, 4p vt-00 Fält & pekare Fältnamnet är i sig en pekare till första elementet i fältet int lista[25]; nu är lista &lista[0] och lista[0] *lista vilket ger lista[3] *(lista+3) …men fältnamnet kan inte byta värde!! Dvs. kan inte sättas att peka någon annanstans
F6 - Pekare 4 Programmeringsteknik, 4p vt-00 exempel2 - igen void exempel2(void) { char str1[] = "Första strängen"; char str2[] = "Andra!"; char str3[25]; printf(" exempel \n\n"); str3 = strcat(str1,str2)); printf("-->%s<--\n",strcat(str1,str2)); printf(" konkatenering \n\n"); }/* exempel2 */
F6 - Pekare 5 Programmeringsteknik, 4p vt-00 Dynamisk minnesallokering calloc Funktionerna malloc() och calloc() (i stdlib.h ) Används för att reservera minne dynamiskt, dvs. under körning. Interaktivt eller på annat sätt kan information fås och användas för att bestämma ”storleken” på fält och mer komplexa datastrukturer. calloc(antal, storlek)returnerar en pekare till ett utrymme med plats för n element med storleken angiven i bytes. sizeof() gör att man slipper veta antalet bytes explicit
F6 - Pekare 6 Programmeringsteknik, 4p vt-00 …och malloc malloc(antal bytes)returnerar en pekare till ett utrymme med plats för n element med storleken angiven i bytes. sizeof() gör att man slipper veta antalet bytes explicit
F6 - Pekare 7 Programmeringsteknik, 4p vt-00...och exempel2 void exempel2(void) { char str1[25] = "Första strängen"; char str2[25] = "Andra!"; char *str3; str3 = calloc(25,sizeof(char)); printf(" exempel \n\n"); printf("-->%s<--\n",str1); str3 = strcat(str2,str1); printf("-->%s<--\n",str3); printf("\n konkatenering \n\n"); }/* exempel2 */
F6 - Pekare 8 Programmeringsteknik, 4p vt-00 körning exempel >Första strängen<-- -->Andra!Första strängen< konkatenering
F6 - Pekare 9 Programmeringsteknik, 4p vt-00 Frigöra minne free Funktion : free(pekare ) Återlämnar minnesutrymme När en funktion exekverat färdigt sker ingen automatisk återlämning av allokerat minnet (ingen garbage collection )
F6 - Pekare 10 Programmeringsteknik, 4p vt-00 Strängfunktionerna igen char *strcat(char *s1, const char *s2) konkatenerar s1 och s2, resultatet i s1 och en pekare till s1 returneras int strcmp(const char *s1, const char *s2) jämförelse, ”logiskt” värde returneras (-,0,+) om s1 är lexikografiskt s2 char *strcpy(char *s1, const char *s2) kopierar tecknen i s2 till s1 tills \0 flyttats, pekaren s1 returneras size_t strlen(const char *s) antalet tecken före \0 returneras (s.273)
F6 - Pekare 11 Programmeringsteknik, 4p vt-00 bubbel igen void bubbel(int lista[],int n) { int i,sist; int bytt; /* logisk */ sist = n-1; /* sista index i listan */ do { bytt = 0; /* logiskt false */ for (i=0;i <= sist-1; i++) { if (lista[i] > lista[i+1]) { byt(&lista[i],&lista[i+1]); bytt = 1; /* logiskt true */ } sist = sist - 1; }while (bytt && sist!=1); } /* bubbel */
F6 - Pekare 12 Programmeringsteknik, 4p vt-00 I sorteringsexemplet Jämförelserna : if (lista[i] > lista[i+1]) if (*(lista+i) > *(lista+i+1)) Anropen : byt(&lista[i],&lista[i+1]); byt(lista+i,lista+i+1);
F6 - Pekare 13 Programmeringsteknik, 4p vt-00 Flerdimensionella fält Fältnamnet är i sig en pekare till första elementet i fältet int a[3][3]; nu är a &a[0] en pekare till ett fält med 3 heltal och basadressen är &a[0][0] vilket ger a[i][j] *(a+i*3+j) Med början i basadressen allokeras 9 heltalsutrymmen Antal värden/rad Antal rader
F6 - Pekare 14 Programmeringsteknik, 4p vt-00 I bilder a a[0] a[1] a[2] [0][1][2]
F6 - Pekare 15 Programmeringsteknik, 4p vt-00 Matrisexempel void skrivMatris(double **matris, int m, int n) { int i,j; printf(" Matris exempel \n\n"); for (i=0;i<m;i++) { for (j=0;j<n;j++) printf("%7.1lf",matris[i][j]); putchar('\n'); }; printf("\n * * * * * * \n\n"); }/* skrivMatris */
F6 - Pekare 16 Programmeringsteknik, 4p vt main int main(void) { double **a; int i,j; a = calloc(4,sizeof(double *)); for (i=0;i<4;i++) a[i] = calloc(3,sizeof(double)); srand(time(NULL)); /* slumptalsfrö */ for (i=0;i<4;i++) for (j=0;j<3;j++) a[i][j] = rand()% ; skrivMatris(a,4,3); return 0; }/* main */
F6 - Pekare 17 Programmeringsteknik, 4p vt-00 körning Matris exempel * * * * * * * * *