*Pekarvärden *Pekarvariabler & *

Relevanta dokument
Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

2 Pekare och dynamiska variabler.

Föreläsning 10. Pekare (Pointers)

Övning från förra gången: readword

struct egendefinierad typ struct LECTURE_TYPE { char teacher[99]; float lengthinminutes; char type; /* L = lecture, E = exercise */ };

Programmeringsteknik med C och Matlab

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Att använda pekare i. C-kod

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Föreläsning 6 pekare och pekare tillsammans med arrayer

C++ Lektion Tecken och teckenfält

TDDC76 - Programmering och Datastrukturer

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Föreläsning 5: Introduktion av pekare

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

#include <stdio.h> #include <string.h>

TDDC77 Objektorienterad Programmering

Poster ( structar ) Postdeklarationer

Hantering av textsträngar och talsträngar. William Sandqvist

Funktioner och programstruktur. Föreläsning 5

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera

Pekare och arrayer. Indexering och avreferering

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

Övningsuppgifter kapitel 8

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Programmering i C, 7,5 hp

Funktioner och programstruktur. Föreläsning 5

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

En kort text om programmering i C.

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

TDIU01 - Programmering i C++, grundkurs

Övningsuppgifter till föreläsning 2 Variabler och uttryck

Typkonvertering. Java versus C

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

TDIU01 - Programmering i C++, grundkurs

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera

Föreläsning 5-6 Innehåll

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

6.1 Kompilering och lite grundläggande information

PROGRAMMERING-Java Omtentamina

TDIU01 - Programmering i C++, grundkurs

Programmering i C. Christer Sandberg, Gunilla Eken, Stefan Bygde Olof Andersson Linus Källberg Caroline Uppsäll Johan Hägg

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Övningar Dag 2 En första klass

Tentamen *:58/ID100V Programmering i C Exempel 3

4 Sammansatta datatyper

SMD 134 Objektorienterad programmering

4. Maskinnära programmering i C. Förberedelser till hemlaboration 1.

C-programmering, föreläsning 2 Jesper Wilhelmsson

Enkla datatyper minne

Funktioner. Jan Erik Moström,

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

TDDC76 - Programmering och Datastrukturer

1 Funktioner och procedurell abstraktion

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

Strängar. Strängar (forts.)

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

Att komma igång. Föreläsning 1

Repetition C-programmering

Uttryck och villkor. Föreläsning 2

Föreläsning 11. Strängar

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Parameteröverföring. Exempel. Exempel. Metodkropp

Funktionens deklaration

Arrays (indicerade variabler) Föreläsning 6

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

Att komma igång. Föreläsning 1

Variabler använder man sig av för att under programkörningen spara data eller information i primärminnet. En variabel har typ, namn och värde.

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Introduktion C-programmering

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Fråga 13. Skriv en loop som fyller arrayen int v[100] med talen

Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

Datastrukturer. Erik Forslin. Rum 1445, plan 4 på Nada

Labora&on 2 Funk&oner, if och loop övningar/uppgi:er

översiktskurs (5DV031)

Tentamen i Programmering grundkurs och Programmering C

C++ Slumptalsfunktioner + switch-satsen

Programmering, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Transkript:

*Pekarvärden *Pekarvariabler & *

Motivering Pekare är ett fundamentalt koncept i C (och C++) Multipla returvärden från funktioner. Arrayer hanteras via pekare Dynamiskt minne (kommer i slutet av kursen) kräver pekare.

Vad är en pekare? Minnet kan lagra tal organiserat i 8-bitarsgrupper (bytes) Alla bytes är organiserade i en lista i datorn Listan numreras från 0 och uppåt, kallas adresser eller pekarvärden Kan lagras i pekarvariabler

Vad är en pekare? Minnet kan lagra tal organiserat i 8-bitarsgrupper (bytes) Alla bytes är organiserade i en lista i datorn Listan numreras från 0 och uppåt, kallas adresser eller pekarvärden Kan lagras i pekarvariabler Minnet Adresser 0 42 43 44 45 46 47

Vanliga variabler Minnet kan lagra tal organiserat i 8-bitarsgrupper (bytes) Alla bytes är organiserade i en lista Listan numreras från 0 och uppåt, kallas adresser eller pekarvärden Först lite om vanliga variabler: Deklaration av en variabel gör att programmet när det kör reserverar tillräckligt med minne för den och sätter en etikett på denna låda int x; Minnet Adresser 0 42 43 44 45 46 47

Vanliga variabler Minnet kan lagra tal organiserat i 8-bitarsgrupper (bytes) Alla bytes är organiserade i en lista Listan numreras från 0 och uppåt, kallas adresser eller pekarvärden Först lite om vanliga variabler: Deklaration av en variabel gör att programmet när det kör reserverar tillräckligt med minne för den och sätter en etikett på denna låda Tilldelning: värdet hamnar i lådan int x; x = 7; Minnet 7 Adresser 0 42 43 44 45 46 47

Vanliga variabler Minnet kan lagra tal organiserat i 8-bitarsgrupper (bytes) Alla bytes är organiserade i en lista Listan numreras från 0 och uppåt, kallas adresser eller pekarvärden Först lite om vanliga variabler: Deklaration av en variabel gör att programmet när det kör reserverar tillräckligt med minne för den och sätter en etikett på denna låda Tilldelning: värdet hamnar i lådan När variabeln används kopieras värdet från lådan int x; x = 7; y = x + 4; Minnet 7 Adresser 0 42 43 44 45 46 47

Åter till pekare Minnet kan lagra tal organiserat i 8-bitarsgrupper (bytes) Alla bytes är organiserade i en lista Listan numreras från 0 och uppåt, kallas adresser eller pekarvärden Kan lagras i pekarvariabler För att skapa ett pekarvärde kan man använda den unära operatorn &. Om man t.ex. skriver ett uttryck &x så får man adressen till x (som i detta fall råkar vara 42) int x; Minnet Adresser 0 42 43 44 45 46 47

Pekarvariabel Minnet kan lagra tal organiserat i 8-bitarsgrupper (bytes) Alla bytes är organiserade i en lista Listan numreras från 0 och uppåt, kallas adresser eller pekarvärden Kan lagras i pekarvariabler För att skapa ett pekarvärde kan man använda den unära operatorn &. Om man t.ex. skriver ett uttryck &x så får man adressen till x Tecknet * används för att deklarera en pekarvariabel int x; int *px; p Minnet Adresser 0 42 43 44 45 46 47 48

Pekarvariabel Minnet kan lagra tal organiserat i 8- bitarsgrupper (bytes) Alla bytes är organiserade i en lista Listan numreras från 0 och uppåt, kallas adresser eller pekarvärden Kan lagras i pekarvariabler För att skapa ett pekarvärde kan man använda den unära operatorn &. Om man t.ex. skriver ett uttryck &x så får man adressen till x Tecknet * används för att deklarera en pekarvariabel - som kan peka på saker: int x; int *px; px = &x; p Minnet Adresser 0 42 43 44 45 46 47 48

Utskrift Pekarvärden kan skrivas ut med printf med %p (i allmänhet inte så värdefullt, men kan vara till hjälp vid besvärlig felsökning). E #include <stdio.h> int main(void) { int x, y; int *p; // p är en pekare till int p = &x; // p sätts att peka på x printf( x finns på adressen %p\n, p); return 0; y: p:

Pekarvariabel Pekarvariabler kan användas för att indirekt komma åt värdet i de utpekade variablerna. E #include <stdio.h> int main(void) { y: int x, y; int *p; // p är en pekare till int p = &x; // p sätts att peka på x p: *p = 7; // Tilldelar det som p pekar på värdet 7 return 0; 7

Pekarvariabel Pekarvariabler kan användas för att indirekt komma åt värdet i de utpekade variablerna. E #include <stdio.h> int main(void) { y: int x, y; int *p; // p är en pekare till int p = &x; // p sätts att peka på x p: *p = 7; // Tilldelar det som p pekar på värdet 7 return 0; OBS! Samma tecken men betyder helt olika saker!! 7

Pekarvariabel Pekarvariabler kan användas för att indirekt komma åt värdet i de utpekade variablerna. E #include <stdio.h> int main(void) { y: int x, y; int *p; // p är en pekare till int p = &x; // p sätts att peka på x p: *p = 7; // Tilldelar det som p pekar på värdet 7 y = *p; // Tilldelar y det som p pekar på return 0; 7 7

I övrigt som vanligt Pekarvariabler Är i övrigt som vanliga variabler de kan tilldelas (pekarvärden) deras värden (pekarvärde) kan användas för att tilldela andra pekarvaribler. #include <stdio.h> int main(void) { int x, y, *a, *b; a = &x; // a sätts att peka på x b = &y; // b sätts att peka på y... a = b;// a sätts att peka på samma som b return 0; y: a: b:

I övrigt som vanligt Pekarvariabler Är i övrigt som vanliga variabler de kan tilldelas (pekarvärden) deras värden (pekarvärde) kan användas för att tilldela andra pekarvaribler. #include <stdio.h> int main(void) { int x, y, *a, *b; a = &x; // a sätts att peka på x b = &y; // b sätts att peka på y... a = b;// a sätts att peka på samma som b return 0; y: a: b: &x

I övrigt som vanligt Pekarvariabler Är i övrigt som vanliga variabler de kan tilldelas (pekarvärden) deras värden (pekarvärde) kan användas för att tilldela andra pekarvaribler. #include <stdio.h> int main(void) { int x, y, *a, *b; a = &x; // a sätts att peka på x b = &y; // b sätts att peka på y... a = b;// a sätts att peka på samma som b return 0; y: a: b: &x &y

I övrigt som vanligt Pekarvariabler Är i övrigt som vanliga variabler de kan tilldelas (pekarvärden) deras värden (pekarvärde) kan användas för att tilldela andra pekarvaribler. #include <stdio.h> int main(void) { int x, y, *a, *b; a = &x; // a sätts att peka på x b = &y; // b sätts att peka på y... a = b;// a sätts att peka på samma som b return 0; y: a: b: &y &y

Övning Koden på föregående sida finns på hemsidan som exempel 8. Lägg till kod (på lämpligt ställe) så att användaren kan skriva in värden som tas emot i variablerna x och y (genom att använda dessa). Skriv nu en tilldelningssats så att x får värdet av summan av de två talen men använd bara pekarvariablerna i tilldelningssatsen inte x eller y. Skriv ut följande både före och efter den sista pekartilldelningen: Värdena i x och y Värdena som pekas ut av a och b Värdena i a och b Ändra nu koden så att a och b används för inläsningen (alltså i den scanf-sats som du har skrivit).

Pekarvariabel och typ En pekarvariabel är begränsad till att kunna peka på en viss typ. Låter man den peka på en annan typ så blir det oftast fel när man kör programmet (kompilatorn varnar): #include <stdio.h> int main(void) { char c; int *y; y = &c; // Blir fel för y och &c har olika typ return 0;

Tillämpning En använding av pekare är som nämnts att returnera fler än ett värde från en funktion E skriv en funktion gör en frekvensanalys : Ta reda på vilket heltal som förekommer flest gånger i en array Håll reda på hur många gånger det förekom Både antalet gånger och vilket tal det är behöver komma anroparen tillgodo Anta att alla talen är små t.ex. mindre än 1000.

Multipla returvärden - fel int analyze_frequences(int arr[], int n) { /* Return the number that is most frequent in the array and the number of occurrences of that number */ return number, occurances; C har inte stöd för multipla int main(void) { returvärden int arr[100]={1,2,3,4,2,2,3; int number, occurances; number, occurances = analyze_frequences(arr, 7); printf( %d %d\n, number, occurances); return 0;

Multipla data returneras - pekare void analyze_frequences(int arr[], int n, int *number, int *occurances) { /* Find the number that is most frequent in the array and the number of occurrences of that number */ int main(void) { int arr[100]={1,2,3,4,2,2,3; int number, occurances; analyze_frequences(arr, 7); // Error! re write it correctly! printf( %d %d\n, number, occurances); return 0;

Övning Koden på förra sidan finns som exempel 9 på hemsidan. Rätta till anropet till funktionen analyze_frequences. Lägg till koden i funktionen analyze_frequences så att den löser sin uppgift (som indikeras av kommentaren).

Vanligt misstag int main(void) { Det är olämpligt att använda värdet av en vanlig variabel om den inte har getts något värde int x; printf( %d\n, x); // Värdet är odefinierat return 0; På samma sätt är det mycket olämplig att använda ett odefinierat pekarvärde int main(void) { int *q; int x; *q = 7; // Pekarvärdet är odefinierat! q = &x; return 0;

Summering Variabler kan vara av typen pekare En * i deklarationen bestämmer att de har typen pekare till någon typ char *v; // v är pekare till char En * intill en pekarvariabel i ett uttryck betyder det som pekarvariabeln pekar på Att tilldela en pekarvariabel utan * betyder att ändra dess pekarvärde (till att peka på något annat) Man skapar ett pekarvärde med &. &m betyder en perkare till m. Om m har typen t så har &m typen t*

Motivering Att kunna returnera fler än ett värde från en funktion Andra motiveringar blir klarare senare i kursen