Programexempel från C-föreläsning 8, torsdag 6 december 2012 ============================================================ Idag: Pekare! 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; x = 3.14; scanf("%f", &x); float *pf; pf = &x; /* rita två bilder här: lådor respektive adresser */ *pf = -9.9; x = -9.9; int i; pf = &i; /* Fel! Kompilatorn varnar. Men avbryter inte! */ pf = &x; float y; float *pf2; y = x; pf2 = &y; pf2 = y; /* Fel! Kompileringsfel. */ *pf = *pf2 + 2; y = y + 2; *pf2 = *pf; y = x; pf2 = pf; scanf("%f", &x); scanf("%f", 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 ----------------------- int i; scanf("%d", &i); /* &-tecken */ 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; :::::::::::::: /home/padrone/undervisning/c/2011-2012-p2/webben/2011-2012-p2/forelasningar/fo-10/anteckningar.txt :::::::::::::: Programexempel från C-föreläsning 10, torsdag 10 december 2009 ============================================================== 2. Fortsättning på pekare: pekare, poster och arrayer 3. Funktioner 4. Allegro-biblioteket 5. Om vi hinner: Filhantering med stdio-paketet Programexempel från C-föreläsning 8, torsdag 6 december 2012 1. 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 två bilder här: lådor respektive adresser */ *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; scanf("%f", &x); scanf("%f", 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 ----------------------- int i; scanf("%d", &i); /* &-tecken */ 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'; Kort repetion/sammanfattning av pekare -------------------------------------- int heltalsvariabel; heltalsvariabel = 17; int* pekarvariabel; pekarvariabel = &heltalsvariabel; *pekarvariabel = *pekarvariabel + 1; heltalsvariabel = heltalsvariabel + 1; 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 = &a[0]; mp[1].cyl = 4; mp[1].effekt = 110; Men... mp är ju en pekare och inte ena array? --------------------------------------------- float af[3]; float *pf; pf = &af[0]; pf = af; pf + 2 /* Pekararitmetik */ *(pf + 2) x[y] betyder "egentligen" *(x+y) pf[2] betyder *(pf + 2) af[2] betyder *(af + 2) Överkurs om pekare: 2["hej"] blir 'j' ------------------------------------- a[2] samma som *(a + 2) samma som *(2 + a) samma som 2[a] "hej"[2] samma som *("hej" + 2) samma som *(2 + "hej") samma som 2["hej"]