Programexempel från C-föreläsning 8, fredag 22 december 2006 ============================================================ Idag: Pekare ------------ En pekare är adressen till den plats i minnet där något finns lagrat. Men dessutom har pekaren en typ (nämligen pekare till vad-det-nu-är), så det är inte bara en adress, utan man håller reda på vilken typ av data som pekaren kan peka på. Kom ihåg scanf -------------- int i; printf("Värde: %d\n", i); /* Värdet, dvs innehållet i variabeln i, skickas */ scanf("%d", &i); /* Här skickar vi i stället en pekare till variabeln i */ Exempel med pekare ------------------ (Vi ritar upp allt detta, både som lådor och pilar och som minnesadresser!) float x; scanf("%f", &x); float *pf; pf = &x; /* rita bild här */ *pf = -9.9; int i; pf = &i; /* Fel! Kompilatorn varnar. */ float y; float *pf2; y = x; pf2 = &y; pf2 = y; /* Fel! Kompileringsfel. */ *pf = *pf2 + 2; *pf2 = *pf; pf2 = pf; Strängar (och andra arrayer) ---------------------------- Om man skriver namnet på en array-variabel (t ex en char-array = sträng) i ett C-program, så kommer den (för det mesta) att konverteras till en pekare till det första elementet i arrayen. Kom ihåg gets och scanf ----------------------- char s[3+1]; gets(s); /* Inget &-tecken */ scanf("%s", s); /* Inget &-tecken */ Fortsättning ------------ char *cp; cp = &s; /* Fel! Kompilatorn varnar. */ cp = s; s[1] = 'o'; cp[1] = 'o'; Allt på en gång: poster, pekare, arrayer (jfr: Gunnar kap 4 sid 11) ------------------------------------------------------------------- struct Motor { int cyl; double effekt; }; struct Motor m = { 4, 120 }; Pekare till struct (fortsättning) --------------------------------- struct Motor *mp; mp = &m; (*mp).cyl = 6; (*mp).effekt = 160.0; /* Inte: *mp.effekt = 160.0; */ Alternativ: mp->cyl = 6; mp->effekt = 160.0; Array av poster ("vektor av structar) -- jfr "punktuppgifterna" fö 7 -------------------------------------------------------------------- struct Motor a[5]; a[0].cyl = 8; a[0].effekt = 185; struct Motor *mp; mp = a; /* Inte: mp = &a; */ mp[1].cyl = 4; mp[1].effekt = 110;