Anders Sjögren Pekare
Anders Sjögren Skapa ett program som byter plats på två heltal Pekare
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.
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
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
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
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;
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;
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
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
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
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
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
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!
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
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!
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”
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.
Anders Sjögren Slut