William Sandqvist Funktion som byter plats på två variabler /* swap1.c first attempt at a swaping function */ /* from Stephen Prata, C Primer Plus ISBN */ #include void interchange(int u, int v); int main(void) { int x = 5, y = 10; printf("Orginally x = %d and y = %d\n", x, y); interchange(x, y); printf("Now x = %d and y = %d\n", x, y); system("PAUSE"); return 0; } void interchange(int u, int v) { int temp; temp = u; u = v; v = temp; }
William Sandqvist Funktionen fungerar ej Funktionen void interchange( int u, int v) får ju bara kopior av x och y och kan därför inte påverka orginalen talen x och y i main. För att byta plats på två tal krävs två returvärden, och C- funktioner har som mest ett returvärde.
William Sandqvist pekare * adress & och avreferering * int b; Deklaration av heltalsvariabeln b. Plats reserveras. b = 18; Definition av variabeln b. Nu innehåller den talet 18. &b Adressoperatorn. Adressen till variabeln b. int * c; Deklaration av int-pekarvariabeln c. c = &b; Nu pekar c på b. *c Avrefereringsoperatorn. Det som c pekar på. *c = 19; Talet 19 lagras på den plats som c pekar ut. Nu innehåller b = ( ) 18 ( ) 19 ( ) Mer om detta senare i kursen, men det behövs redan nu …
William Sandqvist Funktion som byter plats på två variabler /* swap3.c pointers to make a swapping function work */ /* from Stephen Prata, C Primer Plus ISBN */ #include void interchange(int *, int *); int main(void) { int x = 5, y = 10; printf("Orginally x = %d and y = %d\n", x, y); interchange(&x, &y); printf("Now x = %d and y = %d\n", x, y); system("PAUSE"); return 0; } void interchange(int * u, int * v) { int temp; temp = *u; *u =*v; *v = temp; }
William Sandqvist Nu fungerar det! Funktionens parametrar, u och v är nu ”kopior” av adresserna till variablerna x och y (&x, &y). Med hjälp av de medskickade adresserna kan funktionen returnera värden till x och y. temp = *u; *u = *v; *v = temp; Förutom en C-funktions returvärde kan funktionen även ge retur till adresser som angivits i parameterlistan!
( Kan man klara sig utan mellanvariabeln? ) William Sandqvist XOR får Du lära dig nästa gång! … Cliff-hanger!
( utan mellanvariabel ) William Sandqvist Nördvarning! XOR swap algorithm void interchange(int * u, int * v) { *u ^= *v; *v ^= *u; *u ^= *v; } ?
William Sandqvist ( Funktion som byter på två variabler ) /* swap4.c pointers to make a swapping function work */ /* from Stephen Prata, C Primer Plus ISBN */ #include void interchange(int *, int *); int main(void) { int x = 5, y = 10; printf("Orginally x = %d and y = %d\n", x, y); interchange(&x, &y); printf("Now x = %d and y = %d\n", x, y); system("PAUSE"); return 0; } void interchange(int * u, int * v) { *u ^= *v; *v ^= *u; *u ^= *v; }
( Mind swap? ) William Sandqvist Var mellanlagrar man medvetandet? Hur löser Hollywood-filmerna egentligen mellanlagringen av medvetandet …. XOR-swap?