Gå til innhold

Anbefalte innlegg

Heia,

 

Jeg har lest litt om pekere i c, og har skjønt hvordan det fungerer, ihvertfall delvis.

At en peker er en variabel som holder på minneadressen til en annen variabel.

Har også fått med meg at en array er en peker til det første arrayelementet,

så ved å legge til bytes på pekeren kan man da få verdien til andre arrayelementer.

 

Greia er at jeg ikke helt skjønner når man skal få bruk for dette,

så er det noen som har litt tid og gidder å gi meg et lite praktisk eksempel på når man vil bruke pekere.

 

Takk.

Endret av -swifty-
Lenke til kommentar
Videoannonse
Annonse

Tenk deg du har en variabel med masse data i, vi kan kalle den masse_data. Det vil ta enormt med tid å kopiere alle disse dataene når man skal sende denne til en funksjon som f.eks. skal regne ut noe ut i fra disse dataene.

 

Tenk deg at masse_data er en liste med tall, og du har en funksjon kallt summer() som finner summen av alle tallene i en liste. Da er det greit å kunne sende en liten peker som peker på masse_data til summer() i stedet for å sende en kopi av alle disse dataene slik at summer() kan finne summen.

 

Så man bruker pekere -- til å peke på data. ..blandt annet..

 

Edit:

Ex:

#include <iostream>
#include <time.h>

using namespace std;


struct MasseData {
int a;
int b;
int c;
int d;
int a1;
int b1;
int c1;
int d1;
std::string blah1;  
std::string blah2;
std::string blah3;
// o.s.v.
}; // MasseData


int summerP(MasseData* masse_data)
{
int sum = masse_data->a 
 + masse_data->b
 + masse_data->c
 + masse_data->d;
return(sum);
} // summerP


int summerR(MasseData& masse_data)
{
int sum = masse_data.a 
 + masse_data.b
 + masse_data.c
 + masse_data.d;
return(sum);
} // summerR


int summerV(MasseData masse_data)
{
int sum = masse_data.a 
 + masse_data.b
 + masse_data.c
 + masse_data.d;
return(sum);
} // summerV


int main()
{
MasseData masse_data;
masse_data.a = 0;
masse_data.b = 1;
masse_data.c = 2;
masse_data.d = 3;

clock_t s;
int sum;
unsigned int loops = 100000000;


s = clock();
for(unsigned int i = 0; i < loops; i++) {
 sum = summerP(&masse_data);
}
cout << sum << endl;
cout << "Passing by pointer, cpu time: " << clock() - s << endl;

s = clock();
for(unsigned int i = 0; i < loops; i++) {
 sum = summerR(masse_data);
}
cout << sum << endl;
cout << "Passing by reference, cpu time: " << clock() - s << endl;

s = clock();
for(unsigned int i = 0; i < loops; i++) {
 sum = summerV(masse_data);
}
cout << sum << endl;
cout << "Passing by value, cpu time: " << clock() - s << endl;

return(0);
} // main

 

6

Passing by pointer, cpu time: 1260000

6

Passing by reference, cpu time: 1250000

6

Passing by value, cpu time: 9630000

 

Det er ikke altid man sparer noe på å passe data v.h.a. pekere/reference; det tar litt tid å dereference dataene også. Detaljer rundt dette finner du i tutorialer på google. Søker du på "mindview" på google finner du en gratis, komplett bok.

Endret av søppel
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...