Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avEbba Lindström
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
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.