Föreläsning 10. Pekare (Pointers)

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

*Pekarvärden *Pekarvariabler & *

Funktioner och programstruktur. Föreläsning 5

Att använda pekare i. C-kod

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

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

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

Planering Programmering grundkurs HI1024 HT 2014

Funktioner och programstruktur. Föreläsning 5

Planering Programmering grundkurs HI1024 HT TIDAA

Introduktion C-programmering

Repetition C-programmering

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

TDDC76 - Programmering och Datastrukturer

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

Planering Programmering grundkurs HI1024 HT data

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

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

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

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

TDDC76 - Programmering och Datastrukturer

TDDC77 Objektorienterad Programmering

Uttryck och villkor. Föreläsning 2

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

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

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

Tommy Färnqvist, IDA, Linköpings universitet

TDIU01 - Programmering i C++, grundkurs

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

Arrays (indicerade variabler) Föreläsning 6

En kort text om programmering i C.

Arrays (indicerade variabler) Föreläsning 4

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Tentamen Grundläggande programmering

Klassdeklaration. Metoddeklaration. Parameteröverföring

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

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

Parameteröverföring. Exempel. Exempel. Metodkropp

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

Programmeringsteknik med C och Matlab

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

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

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

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

2 Pekare och dynamiska variabler.

2.1 Variabler. 2.2 Regler för namngivning i C. Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Föreläsning 2

F5: Högnivåprogrammering

F5: Högnivåprogrammering

Föreläsning 5: Introduktion av pekare

Mål. Datorteknik. Innehåll. Innehåll (forts) Hur ser ett program ut? Hur skapas maskinkoden?

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

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

Uttryck och villkor. Föreläsning 2

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

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

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

Föreläsning 13. In- och utmatning

Föreläsning 5-6 Innehåll

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

Funk%oner. Vad är det och hur definierar vi en Top- down- programmering lokala globala variabler void och flera inparametrar

Programmering Grundkurs (HI1900) Teoridel

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

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Övningar Dag 2 En första klass

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

Föreläsning 9. struct

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

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

Poster ( structar ) Postdeklarationer

Java, klasser, objekt (Skansholm: Kapitel 2)

4 Sammansatta datatyper

Föreläsning 12. struct

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

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 3. Assembler, stack och subrutiner, programmeringskonventionen. Institutionen för elektro- och informationsteknologi, LTH

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

Vad är det och hur definierar vi en Biblioteksfunktioner (math) Top-down-programmering lokala globala variabler Arrays som in-parametrar

Loopar och datatyper. Föreläsning 3

Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp().

Programmering B med Visual C

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

TDDD78 Objektorientering: Lagring och livstid

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Deklarera en struct som kan användas för att representera en rät linje

PC-teknik, 5 p LABORATION ASSEMBLERINTRODUKTION

Skizz till en enkel databas

TDIU01 - Programmering i C++, grundkurs

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

Pekare och arrayer. Indexering och avreferering

Transkript:

Föreläsning 10 Pekare (Pointers)

Dagens kluringar int a=5; int f(int b) a--; b++; return b; int main() int a=3; printf("%d,",f(a)); printf("%d",a); return 0;

int f(int a) if(a==1) return a; else return a+f(a-1); int main() printf("%d",f(4)); return 0;

Pekare Vad är det och hur deklarerar vi en Adressoperatorn och värdeoperatorn Användning Array som parameter

Vad är en pekare? Minnet i en dator är uppdelat i bytes. En byte består av 8 bitar. En bit kan vara antingen 1 eller 0. Varje byte har en unik minnes-adress En variabel sparas i en eller flera efterföljande byte En pekarvariabel är en variabel som kan innehålla minnesadressen till en variabel, vi säger att den pekar på variabeln Adress Innehåll 0 00000000 1 01001011 2 00000000 3 00000101 4 01001111

Ett exempel int a=5; int *p; //p deklareras som en pekare, dvs en variabel som kan //innehålla adressen till en variabel (här int-variabel) p=&a; //vi lagrar a s adress i p Vid en körning av programmet reserveras byte med adress 2 och 3 för variabeln a. Pekaren p får nu värdet 2 Adress Innehåll 0 00000000 1 01001011 2 00000000 3 00000101 4 01001111

Deklaration En pekare kan endast peka på en viss sorts variabel och deklareras enligt: int *p; float *q; char *r,*s; Och kan då endast peka på (innehålla adressen till) en variabel av typen int, float, char och char. Observera att * måste stå vid varje pekare när flera deklareras på samma rad

Adressoperatorn Med hjälp av adressoperatorn, &, kan vi komma åt en variabels minnesadress: int a=5; int *p,*q; p=&a;//p pekar på a q=p; //båda innehåller nu samma minnesadress (pekar på //a)

Värdeoperatorn (dereference or indirection operator) När vi väl har en pekare vill vi kunna komma åt variabeln den pekar på och det gör vi med värdeoperatorn * int a=5; int *p,*q; p=&a; q=p; printf( %d,*p);//a s värde, dvs 5 skrivs ut *p=8;//a s värde har nu ändrats till 8 printf( %d,%d,%d,*p,*q,a);//a s värde, dvs 8 skrivs ut 3ggr Vad betyder *&a?

Tilldelning int a=5,b=6; int *p=&a,*q=&b; Givet koden vad händer om vi gör: q=p; eller om vi istället gör *q=*p; Vad blir resultatet i de två fallen om fortsättningen är: *p=8; printf( %d,*q);

p q 5 a 6 b q=p; *q=*p; p 5 a p 5 a q 6 b q 5 b *p=8; *p=8; p 8 a p 8 a q 6 b q 5 b

Användning av pekare Då vet ni vad pekare är och att det är lite krångligt att använda dem men vad i hela ska man ha dem till. Faktum är att pekare är användbara på en mängd olika sätt. Arrays i C är implementerade med pekare och man kan ibland vinna på att hantera dem som pekare. Vi kommer inte att använda oss direkt av detta i denna kurs men det kommer att märkas då och då. Pekare är också nödvändiga om vi vill kunna allokera minne dynamiskt efter behov medans ett program kör. Inte heller detta hinner vi med i denna kurs. Vi ska använda pekare för ett syfte endast i denna kurs: för att kunna ändra en variabels värde i en funktion. Däremot kommer de tillbaka i senare kurser så det är viktigt att ni får en första förståelse.

Variabler kopieras i funktionsanrop! (passed by value) När vi skickar med en variabel till en funktion skickar vi värdet på variabel, dvs variabeln kopieras till minnesplatsen för funktionens parameter på stacken. Ändrar vi parameterns värde i funktionen påverkas inte variabeln i huvudprogrammet void dubbla(int tal) tal=tal*2; int main() int a=5; dubbla(a); printf("%d",a);//skriver ut 5 return 0; Oftast är det helt ok eller till och med bra men hur gör vi om vi vill ändra variabeln i huvudprogrammet?

Pekare som parameter Lösningen är att vi skickar en pekare till variabeln. Nu kan vi komma åt variabelns värde. Pekaren som vi skickar kopieras men en kopierad minnesadress pekar ju fortfarande på samma variabel! void dubbla(int *pnumber) (*pnumber) =(*pnumber)*2; int main() int a=5; dubbla(&a); printf("%d",a);//skriver ut 10 return 0; Parentesen runt *pnumber behövs egentligen inte just här men det blir tydligare och är man osäker på prioritetsordningen är det alltid bättre att vara på den säkra sidan. Vi kan nu förstå varför vi har skrivit: scanf( %d,&number) scanf behöver en pekare till number för att kunna ändra värdet på number.

Array som parameter När vi skickar en array som parameter skickas faktiskt egentligen en pekare till första elementet. Detta gör att vi kan ändra i en array i en funktion utan att göra något speciellt. void dubbla(int v[], int length) int i; for(i=0;i<length;i++) v[i]=v[i]*2; int main() int a[]=1,2,3,4; dubbla(a,4); int i; for(i=0;i<4;i++) printf("%d,",a[i]); return 0;

Hålla tungan rätt i mun Som ni har sätt är principen för pekare enkel men det gäller att vara ordentlig och tänka rätt. Vad händer t.ex om man vill att en funktion ska ändra vad en pekare pekar på? Jo det stämmer, vi måste skicka en pekare till en pekare. Förhoppningen är att ni inte ska behöva detta i denna kurs då det är något som kan få även erfarna programmerare lite snurriga. Däremot kommer ni när ni jobbar med lab 3 att behöva skicka en pekare till en funktion och i denna funktion behöva skicka pekaren vidare. Låt oss därför titta på ett exempel

Ett exempel void add(int *pnrofelements) (*pnrofelements)++; void meny(int *pnrofelements) add(??????); int main() int nrofelements=5; meny(&nrofelements); printf("%d", nrofelements); return 0;