Pointers. 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; }

Slides:



Advertisements
Liknande presentationer
INTRODUKTION TILL PROGRAMMERING
Advertisements

Array Skriv ett program som frågar följande: ”Hur många tal vill du mata in?” användaren matat in ett tal t.ex n. då frågar programmet n ggr följande.
void hittaMax(int tal[], int antal, int *pmax) { int i; ??=tal[0]; for(i=1;i??) ??=tal[i]; } int main() { int v[]={1,2,3,4,2}; int.
Föreläsning1. • Boken?!?! • Vad är ett program? • Kompilerande-Interpreterande • Programmeringsmiljö • Hello World! • Att programmera och ett enkelt program.
Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
Programstruktur: C för enchipsdatorer
Funktioner och programorganisation
De fundamentala datatyperna
Operatorer.
#include void fun(char s[]) { int i=-1; while(s[++i]!=0) { if('a'
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
C-programmering ID120V William Sandqvist Länkad lista
Polymorfism.
Välkommen Vahid Mosavat
Programmeringsteknik K och Media
Programmeringsteknik för K och Media
Föreläsning 13 Allt om tentan. Sistaminutenhjälp: På fredag 17 december kl 12 sitter Linda i kemi-fiket och svarar på frågor.
Grundläggande programmering
Föreläsning 4 Python: Definiering av egna funktioner Parametrar
Föreläsning 6 Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
Programmering B PHP Lektion 2
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser och instansvariabler -Tabeller av klassobjekt.
Föreläsning 11 Arrayer.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Pekare och speciell programstruktur i inbyggda system
Repetition inför slutprovet
Ali Ghodsi Variabler En variabel är en sorts behållare som man kan placera data i Man måste ange typ och namn för alla variabler.
Föreläsning 4 Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö.
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Deklarera en struct som kan användas för att representera en rät linje Använd den I main för att deklarera en variabel som du initierar så att den representerar.
William Sandqvist C:s minnesmodell.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 4 ( ) INNEHÅLL: -Logiska opertorer -Poster.
Grundläggande programmering
Problemlösning Veckodagsproblemet Gissa talet Siffersumman.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser -Att definiera egna klasser -Klassvariabler -Klassmetoder.
Modulär programutveckling
Anders Sjögren Pekare. Anders Sjögren Skapa ett program som byter plats på två heltal Pekare.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
INTRODUKTION TILL PROGRAMMERING
Programmering i C# 9. Pekare och osäker kod.
Anders Sjögren Bitfält exempel Nu kommer ett förbättrat program. Det är funktions- uppdelat och kan lägga till poster som lagras på fil.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 2 ( ) INNEHÅLL: -Variabler och datatyper -Tilldelning av variabler -Aritmetiska.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 5 ( ) INNEHÅLL: -Metoder.
F4 - Funktioner & parametrar 1 Programmeringsteknik, 4p vt-00 Modularisering ”svarta lådor” Väl definierade arbetsuppgifter Enklare validering Enklare.
William Sandqvist C-programmering ID120V Stack och Kö William Sandqvist
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
F6 - Pekare 1 Programmeringsteknik, 4p vt-00 Pekare & adresser Alla variabler är knutna till en viss adress i minnet int i; adressen till denna fås med.
Anders Sjögren Deklarationsområde och funktioner.
ITM1 Kapitel 8 Datastrukturer Grundläggande datavetenskap, 4p Utgående från boken Computer Science av: J. Glenn Brookshear.
1 Ingenjörsmetodik IT & ME 2007 Föreläsare Dr. Gunnar Malm.
F2 1 Programmeringsteknik, 4p vt-00 Kommentarer Allt mellan /* och */ Varje kommentar byts ut mot en blank av kompilatorn /* Exempel på uttryck, tilldelningsoperatorn.
Programmeringsteknik för K och Media
William Sandqvist Funktionsbibliotek När man utvecklat en funktion så långt att den är "färdigutvecklad" kan man lika gärna spara den på.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: -Exekveringstrådar.
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
1 Föreläsning 2 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Anders Sjögren Enkelt program med funktion /* two_func.c - a program that uses two functions in one file */ /* from Stephen Prata C Primer Plus ISBN
Program indata ? utdata 1/20 Vahid Mosavat, Nada, KTH.
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
Anders Sjögren Operatorer. Anders Sjögren Operand(er)
Anders Sjögren Minnen, variabler, att lagra i primärminnet forts. Den här bilden känner ni igen sedan tidigare. Vi skall fortsätta att prata variabeltyper.
Anders Sjögren Programmering i ANSI-C Ett första program för att se vart vi ska...
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
Anders Sjögren Funktioner något in och något annat ut.
Föreläsning 8: Exempel och problemlösning
Presentationens avskrift:

Pointers

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; }

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

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 AdressInnehåll

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 AdressInnehåll

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

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)

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?

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);

5 ap 6 bq q=p; 5 ap 6 bq *p=8; 8 ap 6 bq *q=*p; 5 ap 5 bq 8 ap 5 bq *p=8;

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.

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?

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 *tal){ *tal=(*tal)*2;} int main(){ int a=5; dubbla(&a); printf("%d",a);//skriver ut 10 return 0;} Parentesen runt *tal behövs egentligen inte men det blir tydligare och är man osäker på prioritetsordningen är det alltid bättre att vara på den säkra sidan. Det är ju därför vi har skrivit: scanf(”%d”,&tal) scanf behöver en pekare till tal för att kunna ändra värdet på tal

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 tal[], int antal) { int i; for(i=0;i<antal;i++) tal[i]=tal[i]*2; } int main() { int v[]={1,2,3,4}; dubbla(v,4); int i; for(i=0;i<4;i++) printf("%d,",v[i]); return 0; }

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

void laggtill(int *antal) { (*antal)++; } void meny(int *antal) { laggtill(??????); } int main() { int antal=5; meny(&antal); printf("%d",antal); return 0; }

Gör K11 E1, E2, E3, E4, E6. Skriv också huvudprogram som testar att dina funktioner fungerar som det är tänkt. Lek gärna lite fritt med pekare. Läs Vi har medvetet skalat ner pekare till ett minimum då det är ett ganska svårt koncept när man är ny programmerare. Om du känner att du är redo är det jättebra att läsa lite mer, bland annat kapitel 12. E-excercises, P-programming projects