Pekare ( )

Relevanta dokument
Övning från förra gången: readword

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

TDIU01 - Programmering i C++, grundkurs

Programmeringsteknik med C och Matlab

Dagens föreläsning. Specialtecken. Mer om printf. Formateringssträngar. Mer om scanf. Programmeringsteknik för Ingenjörer VT05

Exempel ( )

*Pekarvärden *Pekarvariabler & *

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Pekare och arrayer. Indexering och avreferering

TDIU01 - Programmering i C++, grundkurs

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Symboliska konstanter const

Tentamen *:58/ID100V Programmering i C Exempel 3

Programmering i C, 7,5 hp

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

6.1 Kompilering och lite grundläggande information

TDDC76 - Programmering och Datastrukturer

Föreläsning 13. In- och utmatning

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Repetition C-programmering

#include <stdio.h> #include <string.h>

Föreläsning 3: Booleans, if, switch

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Variabler och konstanter

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Introduktion C-programmering

Användning av stack: evaluera uttryck i RPN

Enkla datatyper minne

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

2 Pekare och dynamiska variabler.

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Programmeringsteknik med C och Matlab

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Det finns många flaggor till g++,

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Föreläsning 10. Pekare (Pointers)

Föreläsning 6: Introduktion av listor

Uppgifter till praktiska tentan, del A. (7 / 27)

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

Deklarera en struct som kan användas för att representera en rät linje

Föreläsning 11. Strängar

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Avancerad SSL-programmering II

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

TDIU01 - Programmering i C++, grundkurs

En kort text om programmering i C.

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Loopar och datatyper. Föreläsning 3

Poster ( structar ) Postdeklarationer

Arrays (indicerade variabler) Föreläsning 6

Typkonvertering. Java versus C

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

TDDC76 - Programmering och Datastrukturer

C++-programmets beståndsdelar

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Planering Programmering grundkurs HI1024 HT TIDAA

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

Planering Programmering grundkurs HI1024 HT data

Innehåll. Pekare Exempel

Föreläsning 6 pekare och pekare tillsammans med arrayer

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Innehåll. Pekare Exempel

Vad har vi lärt oss så här långt Vad är en sträng? Strängkonstanter. Att skriva ut och läsa in strängar. Att arbeta med strängar.

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

grundläggande C++, funktioner m.m.

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Loopar och datatyper. Föreläsning 3

C-programmering. Målsättning Introducera programmering i C för de som inte har någon erfarenhet av C eller C++. Litteratur

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl

Hantering av textsträngar och talsträngar. William Sandqvist

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera

4 Sammansatta datatyper

C-programmering, föreläsning 2 Jesper Wilhelmsson

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

public boolean containskey(string key) { return search(key, head)!= null; }

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Programsystemkonstruktion med C++

Strängar. Strängar (forts.)

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Tommy Färnqvist, IDA, Linköpings universitet

Objektorienterad Programmering (TDDC77)

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Transkript:

Pekare Varje variabel har en adress En variabels adress ges av den unära adressoperatorn & Adresser hanteras kan lagras i variabler (pekarvariabel) Den unära avrefereringsoperatorn * används dels vid deklaration av pekarvariabler och dels för att komma åt det som pekaren refererar Det går att utföra aritmetik med pekare Pekarkonstant NULL (som alltid är 0) (2008-09-03 3.1 )

Pekare som parametrar void swap( int *x, int *y ) { int temp = *x; *x = *y; *y = temp; Anrop: int a, b;... swap( &a, &b); (2008-09-03 3.2 )

Exempel: int x = 1, y = 2; int a[] = {4, 3, 2, 1; int *ip, *jp; ip = &x; // ip pekar till x y = *ip; // som y = x *ip = 3; // som x = 3 jp = ip; // jp pekar också till x *jp = *jp + 5; // som x = x + 5 (*ip)++; // som x++ jp = NULL; // nullreferens. Samma som jp = 0 *jp = 2; // illegalt! ip = &a[0]; // pekar till första elementet i a jp = ip + 1; // pekar till andra elementet i a *jp = 0; // som a[1] = 0 *(ip+3) = *(ip+1) + 2; // som a[3] = a[1] + 2 ip = a; // som ip = &a[0] (2008-09-03 3.3 )

Arrayer som parametrar int strlen( char *s ) { int n=0; while ( *s!= '\0' ) { s++; n++; return n; Alternativ: int strlen( char *s ) { char *p = s; while ( *p!= '\0' ) p++; return p - s; OBS 1: Anropas på samma sätt som tidigare! OBS 2: Talar INTE om hur stor arrayen är! (2008-09-03 3.4 )

Fyra versioner av strängkopiering void strcpy( char *s, char *t ) { int i = 0; while ((s[i] = t[i])!= '\0') i++; void strcpy( char *s, char *t ) { while ((*s = *t)!= '\0') { s++; t++; void strcpy( char *s, char *t ) { while ((*s++ = *t++)!= '\0') ; void strcpy( char *s, char *t ) { while (*s++ = *t++) ; (2008-09-03 3.5 )

Arrayer med pekare int main( int argc, char *argv[] ) { int i; for ( i = 1; i < argc; i++ ) printf( "%s%s", argv[i], (i < argc-1)? "_" : "" ); printf( "\n" ); return 0; (Notera villkorsuttrycket u 1? u 2 : u 3 ) Om programmet sparas på en l med namnet eka så kan en testkörning se ut som $ eka My God, it is full of stars! eka_my_god,_it_is_full_of_stars! (2008-09-03 3.6 )

Pekare som funktionsvärde char *findblank(char *s) { /* Letar första blanktecken i en sträng Pre: s - första tecken i en '\0'-terminerad sträng Returns: adressen till första blanka tecken eller NULL om strängen inte innehåller blanka. */ while ( *s!= ' ' && *s!= '\0' ) s++; if ( *s == '\0' ) return NULL; else return s; Vad får p för värde efter nedanstående kod? char a[] = {'a', 'b', 'c'; char *p = findblank(a); (2008-09-03 3.7 )

Varningar Felaktig av pekare är en mycket vanlig orsak till svårupptäckta fel! Några vanliga fel: Försök att följa NULL-pekaren Användning av odenerade pekare Användning av pekare till utrymme som är återlämnat Flera pekare som oavsiktligt refererar samma objekt (2008-09-03 3.8 )

Deniera egna typer: typedef Exempel typedef float Real; typedef unsigned char Digit; typedef char String[100]; typedef int * IntPointer; Real x; String name, adress; IntPointer ip, jp; Colour c; typedef denierar en egen datatyp Syntaxen är exakt som en variabeldeklaration Ger möjlighet att lätt byta datatyp Använd typedef! (2008-09-03 3.9 )

Sammansatta datatyper: struct Exempel struct Point { double x, y; ; // Observer semikolon! typedef struct Point Point; typedef struct Triangle {// Kan göras direkt Point a, b, c; Triangle; Point p1 = {0, 0; Point p2; Triangle t; p2.x = 1.; p2.y = 0.; t.a = p1; t.b = p2; t.c.x = p1.x + 2; t.c.y = t.a.x + 1; (2008-09-03 3.10 )

Dynamiska variabler: malloc och free Exempel #include <stdlib.h> #include <stdio.h> int i, n, *buffer; printf( "Hur många tal vill " "du kunna behandla:"); scanf( "%d", &n ); buffer = (int *) malloc( sizeof(int)*n ); for ( i = 0; i < n; i++ ) { buffer[i] = i*i;... free(buffer); (2008-09-03 3.11 )

Observera Operatorn sizeof som returnerar storleken i bytes av en godtycklig typ malloc returnerar NULL om det inte fanns tillräckligt med minne Typkastningen (int *) malloc returnerar typen void * Minne återlämnas med free ingen automatisk GBC Arraynotationen Alla möjligheter att göra fel... (2008-09-03 3.12 )

Länkade strukturer: lista med heltal #include <stdio.h> #include <stdlib.h> struct listelem { int item; struct listelem *next; ; typedef struct listelem listelem; typedef struct listelem *link; (2008-09-03 3.13 )

link cons( int it, link nx ) { /* Skapar en listnod Pre: it - godtyckligt int nx - pekare till en listnod eller NULL Return: pekare till nya noden eller NULL om allokeringen misslyckades */ link l = (link) malloc( sizeof(listelem) ); if (l==null) { return NULL; else { l->item = it; l->next = nx; return l; Obs: Ny operatorn ->. Uttrycket x->y är liktydigt med uttrycket (*x).y (2008-09-03 3.14 )

int head( link l ) { /* Returnerar det lagrade talet Pre: l - pekare till en listod */ return l->item; link tail( link l ) { /* Returnerar pekare till första noden i resten av listan Pre: l - pekare till en listod */ return l->next; (2008-09-03 3.15 )

void print( link l ) { /* Skriver listan på standard output Pre: l - pekare till första noden i listan eller NULL */ printf("["); while (l) { printf( "%d", l->item ); if ( l->next ) printf( ", " ); l = l->next; printf("]"); int main() { int i; link list=null; for ( i = 10; i >0; i-- ) list = cons( i, list ); print(list); printf("\n"); return 0; (2008-09-03 3.16 )

Preprocessorn Preprocessorn utför vissa textsubstitutioner som ett försteg till kompilatorn. Filinkludering #include "lnamn" #include <lnamn> Kan vara nästlade. Macrofacilitet #define namn utbytestext Exempel: #define Euler 0.57721566 #define TRUE 1 #define FALSE 0 #define begin { #define end #define debug 1 Obs: Inget semikolon på slutet av raden! (2008-09-03 3.17 )

Macron kan ha parametrar #define sqr(x) (x)*(x) #define max(x,y) ((x) > (y)? (x) : (y)) Obs: Parenteserna viktiga! (2008-09-03 3.18 )

Proprocessor fortsättning Villkorlig inkludering #if debug == 1 printf("nu är vi här\n"); #endif Mycket använt för deklarationsler (s.k. headerler): #ifndef _stack_ #define _stack_... #endif (2008-09-03 3.19 )

Kompileringsenheter och deklarationsler Program av någon storlek delas normalt upp på era källkodsler Kompilatorn behandlar en källkodsl i taget Ingen information om om funktioner, datatyper etc. förs över automatiskt mellan ler utan allt som skall användas i en l måste deklareras där (däremot behöver de inte denieras där Begrepp (funktioner, variabler, typer) denierade på översta nivån i en l är globala Nyckelordet static kan användas för att förbjuda extern access (dvs access från andra ler) Deklarationer samlas ofta på särskilda headerler (.h-ler) som inkluderas av de ler som vill referera dessa saker. (2008-09-03 3.20 )

Exempel: Sorterade listor av heltal på era ler /* list.h - Deklarationsfil för listor av heltal */ #ifndef list #define list typedef struct listelem { int item; struct listelem *next; listelem; typedef listelem *link; link insert(int it, link l ); /* Lägger in en nytt tal i en sorterad lista Pre: it - godtyckligt int l - pekare till första noden i en sorterad lista Post: Listan är fortfarande sorterad Return: Pekare till första noden i den modifierade strukturen */ link cons( int it, link nx ); void print( link l ); #endif (2008-09-03 3.21 )

/* list.c - Implementationsfil för heltalslistor */ #include <stdio.h> #include <stdlib.h> #include "list.h" link insert( int it, link l) { if (l==null it < l->item) return cons(it, l); else { l->next = insert(it, l->next); return l; link cons( int it, link nx ) { link l = malloc( sizeof(listelem) ); l->item = it; l->next = nx; return l; (2008-09-03 3.22 )

void print( link l ) { printf("["); while (l) { printf( "%d", l->item ); if ( l->next ) printf( ", " ); l = l->next; printf("]"); (2008-09-03 3.23 )

/* listtest.c - Testprogram för heltalslistor */ #include <stdio.h> #include <stlib.h> #include "list.h" int main() { int i; link list=null; for ( i = 0; i<10; i++ ) { list = insert( rand()%10, list ); print(list); printf("\n"); return 0; (2008-09-03 3.24 )

Filhantering stdio.h deklarerar en datatyp FILE samt funktionerna fopen, fclose, fprintf, fscan, feof m.. Exempel FILE *inf = fopen("indata.txt", "r"); FILE *utf = fopen("utdata.txt", "w"); int tal; if ( inf==null ) { printf("gick ej att öppna\n"); return 1; while ( fscanf( inf, "%d", &tal )==1 ) { if ( tal > 0 ) fprintf( utf, "%d\n", tal ); fclose(inf); fclose(utf); (2008-09-03 3.25 )

Observera att följande kod in fungerar helt korrekt sista talet kommer att skrivas två gånger while (!feof( inf ) ) { fscanf( inf, "%d", &tal ); if ( tal >0 ) fprintf( utf, "%d\n", tal ); (2008-09-03 3.26 )

Exempel: inläsning av ord #include <stdio.h> int readword(char *s, FILE *f); /* Läser ett ord (obruten sekvens av engelska bokstäver) Pre : s - en area tillräckligt stor för att rymma det längsta ordet f - en öppen indataström Post: s innehåller nästa ord Returvärde: radnumret för ordet */ // Testprogram int main() { char buffer[100]; int nr; while((nr=readword(buffer, stdin))!=-1) { printf("%2d %s\n", nr, buffer); (2008-09-03 3.27 )

int readword(char *s, FILE *f) { static linenumber = 1; int c; while (!isalpha(c=getc(f))) { if (c==eof) return -1; else if(c=='\n') linenumber++; // Leta upp nästa ord. // Hantera EOF // och radbyten while (isalpha(c)) { // Samla bokstäverna *(s++) = c; c = getc(f); *s = '\0'; // Terminera strängen ungetc(c,f); return linenumber; // Lägg tillbaka icke-bokstaven (2008-09-03 3.28 )

Exempel /* xor-kryptering Användning: xor nyckel [infil [utfil]] Programmet läser en fil och skriver en ny, krypterad, fil. Tecknen i den nya filen bildas genom ett bitvis 'exclusiv or' mellan ett tecken i nyckel och ett tecken i indatafilen. När alla tecken i nyckeln använts börjar man om med nyckelns första tecken. Exemplifierar Hantering av argument, IO mot filer samt bitoperationer */ #include <stdio.h> (2008-09-03 3.29 )

int main(int argc, char *argv[]) { char infilename[256]; char outfilename[256]; unsigned char key[256]; unsigned char cut; int c, i; FILE *infile = stdin, // default input *outfile = stdout; // default output (2008-09-03 3.30 )

if (argc<2 argc>4) { printf("xor: Wrong number of arguments\n"); printf("usage: xor key [file] [file]\n" ); return 1; strcpy(key, argv[1]); if (argc>=3) { // input file given strcpy(infilename,argv[2]); infile = fopen(infilename, "r"); if ( infile==null ) { printf("could not open: %s\n", infilename); return 2; if (argc==4) { // output file given strcpy(outfilename,argv[3]); outfile = fopen(outfilename, "w"); (2008-09-03 3.31 )

i = 0; while ( (c=getc(infile))!=eof ) { cut = (unsigned char)(((unsigned char)c) ^ key[i++]); putc(cut, outfile); if ( i==strlen(key) ) i = 0; return 0; /* Exempel kursa$ xor apa xor.c xor hej xor apa xor hej>temp kursa$ diff xor.c temp kursa$ */ (2008-09-03 3.32 )

En villkorssats till: switch int daysinmonth(int month) { int days; switch(month) { case 11: // november case 4: // april case 6: // juni case 9: // och september days = 30; // 30 dar har break; case 2; days = 28; // februari 28 allen break; default: days = 31; // alla övriga 31 return days; Glöm inte break (när den skall vara med)! (2008-09-03 3.33 )

En iterationssats till: do while int readint() { /* Läser och returnerar ett heltal från standarinput Upprepar läsning tills ett legalt heltal kommer */ int tal; int err; do { err = scanf("%d", &tal); if (err!=1) { printf("not an integer! Try again: "); while (getchar()!='\n') // Skippa reste av raden ; while (err!=1); return tal; Anm 1: Skrivs snyggare med en while-sats! Anm 2: Ej säker! Varför inte? (2008-09-03 3.34 )

forts... Testprogram som läser och summerar tal tills 0 lästs: int main() { int sum = 0; int tal; printf("tal att summera (avbryt med 0): "); do { sum +=tal; tal = readint(); while (tal!=0); printf("summan är %d\n", sum); Anm: Också lite udda - bygger på att det är OK att lägga till sista. (2008-09-03 3.35 )