180 likes | 284 Views
Pointere, referencer, struct’s mv. Erklæringer. Eksempel på erklæringer int i, *ip, f ( ), *fip( ), (*pfi) ( ); Erklærer en integer, en pointer til en integer, en funktion, der returnerer en integer en pointer til en funktion der returnerer en integer. Erklæringer.
E N D
Erklæringer Eksempel på erklæringer • int i, *ip, f ( ), *fip( ), (*pfi) ( ); Erklærer en integer, en pointer til en integer, en funktion, der returnerer en integer en pointer til en funktion der returnerer en integer
Erklæringer static: variablen deallokeres ikke når funktionen forlades extern: funktionen eller variablen er erklæret i et andet program C-strenge ender med et ’\0’ tegn C-strenge printes med et %s i printf
SWAP Call by reference void swap(int *px, int *py) { int temp; temp = *px; *px = *py; *py = temp; } kaldes swap (&a, &b);
SWAP Call by value void swap(int x, int y) { /* virker ikke */ int temp; temp = x; x = y; y = temp; }
Pointere http://www.lysator.liu.se/c/bwk-tutor.html#pointers char *y; char x[100]; y is of type pointer to character (although it doesn't yet point anywhere). We can make y point to an element of x by either of y = &x[0]; y = x; Since x is the address of x[0] this is legal and consistent. Now `*y' gives x[0]. More importantly, *(y+1) gives x[1] *(y+i) gives x[i] and the sequence y = &x[0]; y++; leaves y pointing at x[1].
Finde længden på et char array Uden pointere: length(char s[ ]) { int n; for( n=0; s[n] != '\0'; ) n++; return(n); }
Finde længden på et char array Med pointere length(char *s) { int n; for( n=0; *s != '\0'; s++ ) n++; return(n); }
Sammenligning af strenge Returnerer 0 hvis strengene er ens ellers returneres > 0 int strcompare(char *s, char *t, int lng) { while(*t++ == *s++ && lng-- > 0); return lng; }
Visning af argumenter fra kommandolinjen int main(int argc, char *argv[]) { int i; char *arg1; char arg2[30]; for (i = 0; i < argc; i++) { printf("argument %d = %s\n", i, argv[i]); arg1 = argv[i]; printf("argument %d = %s\n", i, arg1); strcpy(arg2, argv[i]); printf("argument %d = %s\n", i, arg2); } }
argc argv prog [-abc] arg1 arg2 main(int argc; char **argv) { int aflag = bflag = cflag = 0; if( argc > 1 && argv[1][0] == '-' ) { for( i=1; (c=argv[1][i]) != '\0'; i++ ) if( c=='a' ) aflag++; else if( c=='b' ) bflag++; else if( c=='c' ) cflag++; else printf("%c?\n", c); --argc; ++argv; }
Malloc og free Allokering af lager #include <stdlib.h> void *malloc(size_t size); Frigivelse af lager #include <stdlib.h> void free(void *ptr);
Struct (1) I c har man mulighed for at samle data i en struktur struct point { int x; int y; } // definere en struct, men erklærer intet struct point pt1, pt2; // erklærer to struct af typen point
Struct (2) struct { char navn[20]; int alder; } p1, p2; //definerer og erklærer p1 og p2 Der refereres til de enkelte medlem som følger: strukturnavn.medlem struct person p3 ={”Ole”, 5}; // erklærer og initierer
Struct (3) struct’s kan bruges som alle andre variable inclusiv i arrays Størrelse af en struktur sizeof p1 // sizeof element sizeof(person) // sizeof(typenavn)
Struct (4) Pointere til strukturer struct person *p3; // erklæring af en pointer til person strukturen Reference til et medlem (*p3).alder eller p3->alder. *p3.alder = *(p3.alder) og dette er ikke legalt da alder ikke er en pointer. *(p3->navn) er 1. tegn i navn
Typedef (1) typedef int Length // Length er synonym for int typedef char* String // String er synonym for char* Length bredde; // det samme som int bredde; String p; // det samme som char* p;
Typedef (2) typedef struct tnode *Treeprt; typedef struct tnode { int vaerdi; Treeprt left; Treeprt right; } Treenode; int main() { Treenode t; Treeprt head; }