180 likes | 293 Vues
Dive deep into C programming concepts such as pointers, structures, and function declarations. Learn about integer, function pointers, and static vs. extern declarations. We cover examples including the SWAP function through call by reference and by value, as well as manipulating character arrays and calculating their lengths with and without pointers. Explore string comparison functions and command-line arguments handling. Additionally, you will discover how to allocate memory with malloc and free it, along with defining and using structures effectively for data management.
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; }