Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Pekare.

Postades av 2002-03-25 16:59:58 - Peter Österberg, i forum c++, Tråden har 14 Kommentarer och lästs av 949 personer

Jag har pluggat C++ ganska länge nu men jag har aldrig fattat när man ska använda pekare. Jag vet vad det är för något, men när ska man använda dom och vad är dom bra för? Kan någon ge ett bra exempel?


Svara

Sv: Pekare.

Postades av 2002-03-25 17:12:23 - Thomas Tydal

* När du inte vet i förväg hur mycket minne du behöver till en variabel:

char *DagsAttDeklarera(int nStorlek)
{
  char *str = new char[nStorlek];
  return str;
}


* I C finns ju inte referenser, så där använder man alltid pekare när man skickar variabler mellan funktioner.

* En pekare talar ju om en minnesadress, och det gör ju att det blir smidigare... Så här t.ex.:

char str[] = "test, test, test";
char *pekare = str;
// pekare innehåller nu "test, test, test".
pekare += 5;
// pekare innehåller nu "test, test".


Svara

Sv: Pekare.

Postades av 2002-03-25 18:02:51 - Peter Österberg

Tack för svaret!
Sen undrar jag lite till. Jag kanske är dum nu men titta på följande exempel:
//EXEMPEL1
#include <iostream.h>

int main()
{
int *tal = new int;
return 0;
}

//EXEMPEL2
#include <iostream.h>

int *tal = new int;

int main()
{
return 0;
}
Jag har nämligen läst i en bok att man aldrig ska använda globala variabler, men för att få tal tillgängligt över hela programmet måste man ju lägga den över main() (eller någon annanstans). Det stod att om man deklarerar en variabel på det fria lagringsutrymmet finns den forfarande kvar när man avslutat funktionen. Men om jag inte lägger den ovanför main() så kan jag ju inte använda den överallt i mitt program i alla fall. Så varför inte använda globala variabler? Har det nåt med hastighet att göra? Är det snabbare med variabler på det fria lagringsutrymmet?
Och det här förstod jag inte riktigt:

char str[] = "test, test, test";
char *pekare = str;
// pekare innehåller nu "test, test, test".
pekare += 5;
// pekare innehåller nu "test, test".

Jag antar att jag inte fattar det här med pekare och minneshantering :).


Svara

Sv: Pekare.

Postades av 2002-03-25 18:33:02 - Thomas Tydal

> men för att få tal tillgängligt över hela programmet måste man ju
> lägga den över main() (eller någon annanstans).

Nästan. För att få =variabelnamnet= tillgängligt över hela programmet måste man det, men innehållet har inte den begränsningen.


> Det stod att om man deklarerar en variabel på det fria
> lagringsutrymmet finns den forfarande kvar när man avslutat
> funktionen.

Just. Ett exempel:

int *funktion(void)
{
  int test = 5;
  return &test;
}

int main(void)
{
  int *data = funktion();
  cout << *data;
}

Vad kommer cout i main att visa? Inte så mycket vettigt, för variabeln test skapas ju i "funktion" och när den kommer tillbaka till main finns den inte kvar.

Om vi istället gör så att vi skapar test, fortfarande i "funktion", men på det fria lagringsutrymmet istället så kommer den att finnas kvar när man kommer tillbaka till main.

int *funktion(void)
{
int *test = new int;
  *test = 5;
return test;
}

int main(void)
{
int *data = funktion();
cout << *data;
}

Du kan alltså inte använda variabeln test i main eftersom den inte är global, men du kommer åt dess data, trots att den skapades i en annan funktion om du använder det fria lagringsutrymmet.

Säg till om du inte är med på hur *- och &-tecknen används.


> Så varför inte använda globala variabler?

Det är lätt att göra fel då. Å ena sidan blir det ju "enkelt" eftersom du inte behöver tänka på att skicka värden mellan funktioner eftersom allt är tillgängligt överallt. Men det blir lätt rörigt då, så i slutändan är det inte så enkelt som det verkar.


> Är det snabbare med variabler på det fria lagringsutrymmet?

Variabler på det fria lagringsutrymmet är i synnerhet lämpliga när du inte i förväg vet hur stor variabel du behöver. Säg att du gör ett program som användaren kan öppna filer i. Ibland öppnar användaren en fil som är 253 bytes och ibland en som är 5 megabyte. För att lagra textfilens innehåll måste du skapa en variabel som är anpassad efter den största fil som användaren kan tänkas vilja öppna, och det kanske är 10 megabyte... Så för varje gång du kör programmet reserverar den 10 megabyte minne, oavsett hur stor eller liten fil användaren öppnar.

Och så kan man ju inte ha det, så därför skapar man variabeln på det fria lagringsutrymmet istället, för då kan programmet bestämma hur stor variabeln ska vara i samma ögonblick som den skapas. Programmet kollar då alltså hur stor filen som användaren vill öppna är och skapar sedan en variabel som är precis lika stor.

Så, det är som sagt då det är lämpligt med variabler på det fria lagringsutrymmet. När du bara behöver data tillgängligt i någon annan funktion så skickar du ju över det som ett argument till funktionen.


> Och det här förstod jag inte riktigt:

Var kanske ett lite dåligt exempel. Provar så här istället:

char str[] = "0123456789";
char *pekare = str;
// pekare innehåller nu "0123456789".
pekare += 5;
// pekare innehåller nu "56789".

pekare += 5; gör att minnesadressen ökas med fem, dvs den hoppar fram fem tecken i minnet, så från att tidigare ha pekat på 0123456789 har den därefter hoppat fram till 56789.


Svara

Sv: Pekare.

Postades av 2002-03-25 19:20:58 - Dan Persson

Jag har en fråga som jag tror har med detta att göra...

Först frågar jag användaren hur många tal som han vill mata in. Sen ska jag skapa en array, och då skulle det ju vara bra om den arrayen (ursäkta svengelskan) innehåller lika många element som han matade in. Ex:

int main()
{
int antal;
cout << "Mata in antal tal: ";
cin >> antal;
int arr[antal];
//mer kod
}

hur gör jag för att det ska fungera?

MvH Dan "DaPe" Persson


Svara

Sv: Pekare.

Postades av 2002-03-25 19:53:35 - Peter Österberg

Tack för det fylliga svaret! =) Nu förstår jag det sista exemplet med char str[] = "0123456789"; i alla fall. Det var bra!
Sen när man ska använda variabler på det fria lagringsutrymmet börjar också klarna!
Men sen undrar jag lite igen. Ska de två exemplen du gav ovan visa samma sak, alltså skriva ut 5 och sen avslutas? Bara att den finns kvar när man avslutat funktionen? Fattar liksom inte, men jag ska prova att göra nåt liknande program och testa lite.
Sen det DaPe skrev kan också vara kul att veta. Ska man då göra som du skrev i första svaret, i dagsattdeklarera-funktionen?


Svara

Sv: Pekare.

Postades av 2002-03-25 19:59:25 - Thomas Tydal

> hur gör jag för att det ska fungera?

Så här:

int main()
{
  int antal;
  cout << "Ange antal tal: ";
  cin >> antal;
  int *arr = new int[antal];
  // Mer kod.
  delete [] arr; // När du är klar med arrayen.
}

Det du måste komma ihåg är att med den här metoden försvinner inte variabeln när funktionen är slut, så du måste själv ta bort den med delete.


Svara

Sv: Pekare.

Postades av 2002-03-25 20:01:34 - Thomas Tydal

> Ska de två exemplen du gav ovan visa samma sak, alltså skriva ut 5
> och sen avslutas?

Nej, det är det bara det andra exemplet som gör. I det första så skapas ju variabeln test på vanligt vis, och då finns det ju bara i den funktionen där den skapas och main kommer inte åt den.

Men i det andra exemplet kommer main åt den eftersom den skapas på det fria lagringsutrymmet.


Svara

Sv: Pekare.

Postades av 2002-03-25 20:24:11 - Peter Österberg

Jag trodde också att det första programmet inte skulle skriva ut någonting, men det gjorde det när jag provade... De två olika exemplen fungerar precis lika för mig. Mystiskt?


Svara

Sv: Pekare.

Postades av 2002-03-25 21:09:01 - Thomas Tydal

> De två olika exemplen fungerar precis lika för mig. Mystiskt?

Egentligen inte, för när en variabel tas bort i C++ tas inte värdet bort, utan minnesområdet som variabeln använder markeras bara som ledigt. Så, värdet ligger ju kvar, ända tills nån annan variabel får det minnesområdet tilldelat och gör något med det, vilket alltså är fullt möjligt, och det är därför man inte ska göra så. Visst kan det, som du såg, fungera ibland, men man får verkligen inte lita på det.


Svara

Sv: Pekare.

Postades av 2002-03-26 14:21:21 - Niklas Jansson

Tomas har utan tvekan fått med det mesta, men en mycket viktig del saknas tyvärr.

>* När du inte vet i förväg hur mycket minne du behöver till en variabel

>* I C finns ju inte referenser, så där använder man alltid pekare när man skickar variabler mellan funktioner.

>* En pekare talar ju om en minnesadress, och det gör ju att det blir smidigare... Så här t.ex.:

Det som saknas är det viktiga fallet när man använder klasser och behöver representera den objektorienterade relationen "känner till". Utan pekare hade detta varit oerhört tidskrävande.
Detta är inte (vilket det kan tyckas vara) identiskt med fallet när man skickar pekare mellan funktioner.

Dessutom finns fallet när man måste kontrollera tilldelning till sig själv i ett objekt. Man har alltså skapat en klass som kräver en speciell form av tilldelning (vanligt exempel är en array).
Detta innebär att man måste kontrollera att man inte förstör arrayen om man skriver saker som:

Array a(20);
a=a;

/Niklas Jansson


Svara

Sv: Pekare.

Postades av 2002-03-26 14:42:11 - Thomas Tydal

> Tomas har utan tvekan fått med det mesta, men en mycket viktig del
> saknas tyvärr.

Inte så konstigt med tanke på att det är C jag programmerar i :-)


Svara

Sv: Pekare.

Postades av 2002-03-26 15:00:03 - Niklas Jansson

Ok. Det var inte meningen att klanka ner på dig eller något. :)

Men om du använder C använder du väl trots allt strukturer och pekare i och till dessa? Det är ju trots allt ganska mycket samma sak.

/Niklas Jansson


Svara

Sv: Pekare.

Postades av 2002-03-26 18:05:22 - Peter Österberg

Okej. Ska prova lite mer nu. Tack så mycket för svaren! Ni har varit väldigt hjälpsamma!


Svara

Sv: Pekare.

Postades av 2002-03-27 13:43:20 - Peter Larsson

Om du ska skriva t.ex. en länkad list så är pekare ett måste.


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 615
27 953
271 709
5 514
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies