Presentation laddar. Vänta.

Presentation laddar. Vänta.

Anders Sjögren Pekare. Anders Sjögren Skapa ett program som byter plats på två heltal Pekare.

Liknande presentationer


En presentation över ämnet: "Anders Sjögren Pekare. Anders Sjögren Skapa ett program som byter plats på två heltal Pekare."— Presentationens avskrift:

1 Anders Sjögren Pekare

2 Anders Sjögren Skapa ett program som byter plats på två heltal Pekare

3 Anders Sjögren Skapa ett program som byter plats på två heltal Kan detta fungera? int main( void ) { int tal_A=1, tal_B=2 ; SkiftaMinnesinnehall( tal_A, tal_B ); return 0; } tal_A skall tilldelas tal_B:s värde och vice versa. Funktionen skall göra jobbet.

4 Anders Sjögren Vad händer då man definierar ett minne int main( void ) { int tal_A=1, tal_B=2 ; SkiftaMinnesinnehall( tal_A, tal_B ); return 0; } tal_Atal_B 12

5 Anders Sjögren int main( void ) { int tal_A=1, tal_B=2 ; SkiftaMinnesinnehall( tal_A, tal_B ); return 0; } Datorns primärminne main() exekveras Maskinkod programmet Heap Stack Bytes tal_A=1 tal_B=2 main() tid En aktiveringspost för main() skapas på stacken. tal_Atal_B 12 2 1

6 Anders Sjögren Hur måste SkiftaMinnesinnehall() se ut ? intSkiftaMinnesinnehall( int a, int b ) { int x; x = a; a = b; b = x; return a; } int main( void ) { int tal_A=1, tal_B=2 ; SkiftaMinnesinnehall( tal_A, tal_B ); return 0; } int main( void ) { int tal_A=1, tal_B=2 ; SkiftaMinnesinnehall( tal_A, tal_B ); return 0; } a b 12 x 12

7 Anders Sjögren Datorns primärminne SkiftaMinnesinnehall() exekveras Maskinkod programmet Heap Stack Bytes tal_A=1 tal_B=2 tal_A=1 tal_B=2 main() a=1 b=2 tidSkiftaMinnesinnehall() x=? intSkiftaMinnesinnehall( int a, int b ) { int x; intSkiftaMinnesinnehall( int a, int b ) { int x; 12 1221

8 Anders Sjögren Datorns primärminne SkiftaMinnesinnehall() exekveras Maskinkod programmet Heap StackBytes tal_A=1 tal_B=2 tal_A=1 tal_B=2 a=1 b=2 tid tal_A=1 tal_B=2 a=2 b=1 SkiftaMinnesinnehall() main()main() xx=1 x = a; a = b; b = x; x = a; a = b; b = x;

9 Anders Sjögren Datorns primärminne SkiftaMinnesinnehall() dör main() dör - exekvering slut slutresultat ? tid tal_A=1 tal_B=2 main() tal_A=1 tal_B=2 a=2 b=1 SkiftaMinnesinnehall() x=1 main() Maskinkod programmet Heap StackBytes 21

10 Anders Sjögren Datorns primärminne SkiftaMinnesinnehall() dör main() dör - exekvering slut slutresultat ? tid tal_A=1 tal_B=2 main() tal_A=1 tal_B=2 a=2 b=1 SkiftaMinnesinnehall() x=1 main() Maskinkod programmet Heap StackBytes ingenting har förändrats i main(). De bägge variablernas värden är oförändrade. Värdet som returneras tas aldrig om hand 21

11 Anders Sjögren Hur måste SkiftaMinnesinnehall() se ut ? intSkiftaMinnesinnehall( int a, int b ) { int x; x = a; a = b; b = x; return a; } int main( void ) { int tal_A=1, tal_B=2 ; SkiftaMinnesinnehall( tal_A, tal_B ); return; } int main( void ) { int tal_A=1, tal_B=2 ; SkiftaMinnesinnehall( tal_A, tal_B ); return; } a b 12 x 12

12 Anders Sjögren Värdeöverföring Talen 1 och 2 har värdeöverförts, kopierats in i funktionen SkiftaMinnesinnehall() Att förändra kopian ändrar inte på originalet main() tal_A=1 tal_B=2 a=2 b=1 x 1221 SkiftaMinnesinnehall() kopior original

13 Anders Sjögren Referensöverföring det är innehållet i mains minne tal_A och tal_B som skall förändras lösningen är att värdeöverföra minnes- adressen till minne tal_A och tal_B tal_A=1 tal_B=2 a=2 b=1 SkiftaMinnesinnehall() main() x adress 2 adress 1 adress 2 adress 1 1221

14 Anders Sjögren Referensöverföring det är innehållet i mains minne tal_A och tal_B som skall förändras lösningen är att värdeöverföra minnes- adressen till minne tal_A och tal_B tal_A=1 tal_B=2 a=2 b=1 SkiftaMinnesinnehall() main() x adress 2 adress 1 adress 2 adress 1 två pekare har sett dagens ljus!

15 Anders Sjögren tal_A=1 tal_B=2 a=2 b=1 x Programmet som klarar biffen voidSkiftaMinnesinnehall( int *, int *); int main( void ) { int tal_A=1, tal_B=2 ; SkiftaMinnesinnehall( &tal_A, &tal_B ); return 0; } voidSkiftaMinnesinnehall( int *a, int *b ) { int x; x = *a; *a = *b; *b = x; return; } Stacken 12 adresser

16 Anders Sjögren tal_A=1 tal_B=2 a=2 b=1 x Programmet som klarar biffen voidSkiftaMinnesinnehall( int *, int *); int main( void ) { int tal_A=1, tal_B=2 ; SkiftaMinnesinnehall( &tal_A, &tal_B ); return 0; } voidSkiftaMinnesinnehall( int *a, int *b ) { int x; x = *a; *a = *b; *b = x; return; } Stacken här betyder * att man skapar en variabel som lagra en adress till en variabel som lagrar ett heltal, int ! Pekare skapas!

17 Anders Sjögren adresser tal_A=1 tal_B=2 a=2 b=1 x Programmet som klarar biffen voidSkiftaMinnesinnehall( int *, int *); int main( void ) { int tal_A=1, tal_B=2 ; SkiftaMinnesinnehall( &tal_A, &tal_B ); return 0; } voidSkiftaMinnesinnehall( int *a, int *b ) { int x; x = *a; *a = *b; *b = x; return; } Stacken & är adressoperatorn som ger adressen till en variabel.. &tal_A == ” adressen till variabel tal_A”

18 Anders Sjögren tal_A=1 tal_B=2 a=2 b=1 x Programmet som klarar biffen voidSkiftaMinnesinnehall( int *, int *); int main( void ) { int tal_A=1, tal_B=2 ; SkiftaMinnesinnehall( &tal_A, &tal_B ); return 0; } voidSkiftaMinnesinnehall( int *a, int *b ) { int x; x = *a; *a = *b; *b = x; return ; } Stacken observera att * betyder olika vid variabeldefinition (deklaration) och i satser.

19 Anders Sjögren Slut


Ladda ner ppt "Anders Sjögren Pekare. Anders Sjögren Skapa ett program som byter plats på två heltal Pekare."

Liknande presentationer


Google-annonser